// 后端:Spring Boot 实现赛博塔罗API
// 项目结构:
// - pom.xml
// - src/main/java/com/example/TarotApplication.java
// - src/main/java/com/example/controller/TarotController.java
// - src/main/java/com/example/model/TarotCard.java
// - src/main/resources/application.properties
// 第一步:创建Maven项目,pom.xml内容
/*
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>cyber-tarot</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.1</version> <!-- 2026年主流版本,替换为最新 -->
<relativePath/>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
*/
// TarotCard.java - 塔罗牌模型
package com.example.model;
public class TarotCard {
private String name;
private String description;
private String imageUrl; // 模拟图片URL,实际可替换为真实链接
public TarotCard(String name, String description, String imageUrl) {
this.name = name;
this.description = description;
this.imageUrl = imageUrl;
}
// Getter 和 Setter
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
public String getImageUrl() { return imageUrl; }
public void setImageUrl(String imageUrl) { this.imageUrl = imageUrl; }
}
// TarotController.java - 控制器
package com.example.controller;
import com.example.model.TarotCard;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.*;
@RestController
public class TarotController {
// 模拟塔罗牌库(大阿卡纳22张,简化到10张示例)
private static final List<TarotCard> CARD_LIBRARY = Arrays.asList(
new TarotCard("恋人", "过去:霓虹心跳连接,曾经有暧昧火花。", "https://example.com/lovers.jpg"),
new TarotCard("星星", "现在:深夜消息的微光,目前好感在积累。", "https://example.com/star.jpg"),
new TarotCard("权杖Ace", "未来:主动迈出一步就会有火花,机会不错!", "https://example.com/wands_ace.jpg"),
new TarotCard("隐士", "过去:他比较内向/慢热,不易表露。", "https://example.com/hermit.jpg"),
new TarotCard("月亮", "现在:有点不确定/幻觉,需要更多互动。", "https://example.com/moon.jpg"),
new TarotCard("圣杯骑士", "未来:如果你再主动,他会慢慢靠近。", "https://example.com/cups_knight.jpg"),
new TarotCard("圣杯三", "过去:曾经有很好的氛围,回忆甜蜜。", "https://example.com/cups_three.jpg"),
new TarotCard("塔", "现在:突然冷淡/误会/干扰,需要注意。", "https://example.com/tower.jpg"),
new TarotCard("死神", "未来:需要彻底结束旧模式,才能新生(放手或转变)。", "https://example.com/death.jpg"),
new TarotCard("太阳", "未来:明朗结局,他很可能喜欢你!", "https://example.com/sun.jpg")
);
@GetMapping("/api/tarot/draw")
public Map<String, Object> drawCards() {
// 随机抽3张牌:过去、现在、未来
Random random = new Random();
TarotCard past = CARD_LIBRARY.get(random.nextInt(CARD_LIBRARY.size()));
TarotCard present = CARD_LIBRARY.get(random.nextInt(CARD_LIBRARY.size()));
TarotCard future = CARD_LIBRARY.get(random.nextInt(CARD_LIBRARY.size()));
// 计算随机“喜欢度” (0-100)
int likeScore = random.nextInt(101);
Map<String, Object> result = new HashMap<>();
result.put("past", past);
result.put("present", present);
result.put("future", future);
result.put("likeScore", likeScore);
result.put("advice", getAdvice(likeScore));
return result;
}
private String getAdvice(int score) {
if (score > 80) return "哇塞!塔罗说:他超级喜欢你,赶紧行动吧~";
else if (score > 50) return "嗯嗯,好感度中等偏上,多互动试试水温。";
else return "目前不太乐观,先爱自己多一点吧。塔罗建议:别急,缘分自来。";
}
}
// TarotApplication.java - 主应用
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class TarotApplication {
public static void main(String[] args) {
SpringApplication.run(TarotApplication.class, args);
}
}
// application.properties (src/main/resources)
server.port=8080
spring.application.name=cyber-tarot
// 运行后端:mvn spring-boot:run 或 IDE运行TarotApplication.java
// API测试:访问 http://localhost:8080/api/tarot/draw
<!-- 前端:简单HTML+JS页面(使用Fetch调用后端API) -->
<!-- 保存为 index.html,直接浏览器打开 -->
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>赛博塔罗:他到底喜欢我吗?</title>
<style>
body { background: #000; color: #0ff; font-family: monospace; text-align: center; }
.card { display: inline-block; margin: 10px; padding: 10px; border: 1px solid #0ff; width: 200px; }
img { width: 100%; height: auto; filter: drop-shadow(0 0 10px #0ff); }
button { background: #0ff; color: #000; padding: 10px 20px; border: none; cursor: pointer; }
button:hover { background: #fff; }
</style>
</head>
<body>
<h1>赛博塔罗占卜:他到底喜欢我吗?</h1>
<p>默念问题,点击抽牌~</p>
<button onclick="drawCards()">一键抽牌</button>
<div id="result"></div>
<script>
async function drawCards() {
try {
const response = await fetch('http://localhost:8080/api/tarot/draw');
const data = await response.json();
const resultDiv = document.getElementById('result');
resultDiv.innerHTML = `
<h2>喜欢度:${data.likeScore}%</h2>
<p>${data.advice}</p>
<div class="card">
<h3>过去:${data.past.name}</h3>
<p>${data.past.description}</p>
<img src="${data.past.imageUrl}" alt="${data.past.name}">
</div>
<div class="card">
<h3>现在:${data.present.name}</h3>
<p>${data.present.description}</p>
<img src="${data.present.imageUrl}" alt="${data.present.name}">
</div>
<div class="card">
<h3>未来:${data.future.name}</h3>
<p>${data.future.description}</p>
<img src="${data.future.imageUrl}" alt="${data.future.name}">
</div>
`;
} catch (error) {
console.error('抽牌失败:', error);
alert('连接后端失败,确保后端运行中!');
}
}
</script>
</body>
</html>
运行指南(2026年环境):
- 后端:用Maven构建项目,运行
mvn spring-boot:run。端口8080。 - 前端:保存index.html,双击浏览器打开。点击按钮调用API。
- 注意:图片URL是模拟的,替换为真实赛博风格塔罗图链接(如Unsplash或自建)。跨域问题:本地测试用Chrome –disable-web-security 或后端加CORS。
- 扩展:加更多牌、逆位逻辑、用户输入问题。纯娱乐,勿当真~
如果你运行时有问题,或想加功能,告诉我细节,我帮你调试!😂