Java实现大乐透历史开奖对比器
众多大乐透爱好者习惯于定期投注,大家会精心挑选几组心仪的号码并持之以恒地参与每期投注。在选定号码后,一个关键问题是如何验证这组号码是否曾在大乐透过往的开奖记录中中过奖。鉴于大乐透历史上已出现两次重复开奖号码的先例,了解这一信息无疑为彩民们提供了宝贵的参考依据,有助于大家做出更加明智的投注决策。
作为开发者兼彩友,决定毫不犹豫的解决一下这个问题,做一个大乐透历史开奖对比器,先上结果: 大乐透历史开奖对比器网站
为了开发大乐透号码分析工具,大乐透历史开奖对比器,我们需要关注以下几个核心步骤:
- 数据收集与更新:全面搜集大乐透历史开奖数据,并实现一个自动化系统,以实时接收并整合每期新增的开奖数据。
- 后端逻辑开发:
设计一个API接口,该接口接受用户输入的大乐透号码,包括单式、复式和胆拖等不同投注方式。
接口将输入号码与历史数据进行详尽对比,以确定用户号码是否中奖,并计算相应的奖金。 - 前端用户界面:
构建一个直观的用户界面,使用户能够方便地输入他们的大乐透号码。
提供一个查询按钮,用户点击后,前端将调用第二步中开发的API接口。
展示查询结果,包括中奖情况和相关细节。
通过这些步骤,提供一个全面、易用的大乐透号码分析工具,帮助彩友快速了解自己的投注的大乐透号码是否中奖。
1. 收集大乐透历史所有数据
示例:
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.BufferedWriter;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
public class LotteryCrawler {
private static final String URL = "http://kaijiang.500.com/dlt.shtml";
public static void main(String[] args) {
try {
crawlLotteryData(URL);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void crawlLotteryData(String url) throws IOException {
try (BufferedWriter writer = Files.newBufferedWriter(Paths.get("大乐透开奖结果.csv"), StandardCharsets.UTF_8)) {
List<String> csvHeader = List.of("期号", "红球1", "红球2", "红球3", "红球4", "红球5", "蓝球1", "蓝球2");
writer.write(String.join(",", csvHeader));
writer.newLine();
Document doc = getDocument(url);
Elements pageLinks = doc.select("div.iSelectList a");
for (Element link : pageLinks) {
String pageUrl = link.attr("href");
String period = link.text();
crawlLotteryPeriodData(writer, pageUrl, period);
}
} catch (Exception e) {
// 更具体的异常处理
e.printStackTrace();
}
}
private static Document getDocument(String url) throws IOException {
return Jsoup.connect(url).get();
}
private static void crawlLotteryPeriodData(BufferedWriter writer, String url, String period) throws IOException {
Document periodDoc = getDocument(url);
Elements balls = periodDoc.select("div.ball_box01 ul li");
List<String> dataRow = new ArrayList<>();
dataRow.add(period);
for (Element ball : balls) {
dataRow.add(ball.text());
}
String dataLine = String.join(",", dataRow);
writer.write(dataLine);
writer.newLine();
System.out.println("第" + period + "期开奖结果录入完成");
}
}
2. 大乐透历史对比器查询接口
编写REST服务接口,示例:
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.util.StringUtils;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
@RequestMapping("/dlt")
public class DltLotteryController {
private final DltLotteryHistoryService dltLotteryHistoryService;
private final Logger logger;
public DltLotteryController(DltLotteryHistoryService dltLotteryHistoryService) {
this.dltLotteryHistoryService = dltLotteryHistoryService;
this.logger = LoggerFactory.getLogger(this.getClass());
}
@RequestMapping(value = "/query", method = RequestMethod.GET)
public List<DltLotteryHistory> getDltLotteriesByList(
@RequestParam(value = "blue") String blue,
@RequestParam(value = "red") String red) {
long startTime = System.currentTimeMillis();
logger.debug("begin query, blue: {}, red: {}", blue, red);
List<Integer> balls = parseAndSortBalls(red);
List<Integer> blues = parseAndSortBalls(blue);
if (balls.size() != 5 || blues.size() != 2) {
throw new IllegalArgumentException("Invalid number of balls provided.");
}
DltLotteryHistory dltLotteryQO = new DltLotteryHistory();
dltLotteryQO.setRed1(balls.get(0));
dltLotteryQO.setRed2(balls.get(1));
// ... set other red balls
dltLotteryQO.setBlue1(Optional.ofNullable(blues.get(0)).orElseThrow(() -> new RuntimeException("Blue ball 1 is missing")));
dltLotteryQO.setBlue2(Optional.ofNullable(blues.get(1)).orElseThrow(() -> new RuntimeException("Blue ball 2 is missing")));
QueryWrapper<DltLotteryHistory> wrapper = new QueryWrapper<>(dltLotteryQO);
List<DltLotteryHistory> dltLotteryHistories = dltLotteryHistoryService.list(wrapper);
logger.info("result size: {}", dltLotteryHistories.size());
String totalTime = DateUtils.getFriendlyTimeDiff(startTime, System.currentTimeMillis());
logger.info("end totalTime: {}", totalTime);
return dltLotteryHistories;
}
private List<Integer> parseAndSortBalls(String ballString) {
if (StringUtils.isEmpty(ballString)) {
throw new IllegalArgumentException("Balls string cannot be empty.");
}
return Arrays.stream(ballString.split(","))
.map(Integer::valueOf)
.sorted()
.collect(Collectors.toList());
}
}
3. Angular前端
<div class="wrapperSidebar">
<!--head begin-->
<header id="uiHead" class="ui-head hide">
<div class="ui-head-in">
<div class="ui-head-l">
<a href="javascript:history.go(-1);"><span class="ui-head-btn1 ">返回</span></a>
</div>
<div class="ui-head-m">
<h2 class="ui-head-tit">大乐透历史开奖对比器</h2>
</div>
<div class="ui-head-r">
<a href="/"><span class="ui-head-btn3">首页</span></a>
</div>
</div>
</header>
<!--head end-->
<!--彩种导航 start-->
<div class="ui-navbox">
<div class="ui-navbox-in" id="ui-navbox-in">
<ul id="ul_nav">
<li ng-click="navClick('query')" >单式中奖查询</li>
<li ng-click="navClick('fs')" class="select" >复式中奖查询</li>
</ul>
</div>
</div>
<!--彩种导航 end-->
<div id="wrap" class="wrapper" style="display: none;">
<div class="ng-show" ng-show="chooseShow">
<div class="chax-qih">
查询输入的大乐透,在历史期数中红球重复n球的纪录
</div>
<div class="dlt_xuan chax-xuan">
<div class="before_area">
<p class="area_tit"><span class="area_name">红球--选择5-12个</span></p>
<div class="area_ball">
<ul>
<li ng-repeat="red in rednums">
<span data="{{red}}" ng-click="ChoiceRedCode(red)" class="ball_icon" ng-class="{'ball_select':isSelected}" ng-bind="red"></span>
</li>
</ul>
</div>
</div>
<div class="after_area">
<p class="area_tit"><span class="area_name">蓝球--选择2-6个</span></p>
<div class="area_ball area_blue">
<ul>
<li ng-repeat="blue in bluenums">
<span class="ball_icon" ng-click="ChoiceBlueCode(blue)" ng-class="{'ball_select':isSelected}" ng-bind="blue"></span>
</li>
</ul>
</div>
</div>
</div>
</div>
<div class="scroller ng-hide" ng-show="resultShow">
<div class="chax-scol">
<div class="chax-shd">
<h4 class="chax-stit">您选择的号码:</h4>
</div>
<div class="chax-sbd">
<div class="chax-sballs">
<i ng-repeat="red in inRed.sort()" class="sball-red ng-scope ng-binding" ng-bind="red">{{red}}</i>
</div>
<div class="chax-sballs">
<i ng-repeat="blue in inBlue.sort()" class="sball-blue ng-scope ng-binding" ng-bind="blue">{{blue}}</i>
</div>
</div>
<div class="chax-shd">
<h4 class="chax-stit">红球重复:</h4>
</div>
<div class="brtdump">
<a ng-click="submitCode('fs',5)" href="javascript:void(0);" class="select">重复 5 球</a>
<a ng-click="submitCode('fs',4)" href="javascript:void(0);">4 球及以上</a>
<a ng-click="submitCode('fs',3)" href="javascript:void(0);">3 球及以上</a>
</div>
</div>
<div class="loading" ng-class="{'hide':loadingHided}">
<i class="icon-loading"></i>
</div>
<div class="chax-hd chax-space ng-hide" ng-show="ZjShow">
<h3 class="chax-title"><i class="chax-kuico-brt"></i><span>共匹配到 {{ result.length }} 条记录</span></h3>
</div>
<div class="chax-hd chax-space ng-hide" ng-show="NoZjShow">
<h3 class="chax-title"><i class="chax-kuico-brt"></i><span>未找到匹配的记录</span></h3>
</div>
<div class="kaij-boxer ng-hide" ng-repeat="kj in result" ng-show="ZjShow">
<a href="/mobile/dlt/info/{{ kj.issue }}"> <h1 class="kaij-tit"><em>第{{ kj.issue }}期</em> <em>{{ kj.lotteryDate }}</em></h1>
<div class="kaij-jg">
<ul>
<li ng-class="{'sball-red-on':inRed.contains(kj.red1)}" class="sball-red">{{ kj.red1 }}</li>
<li ng-class="{'sball-red-on':inRed.contains(kj.red2)}" class="sball-red">{{ kj.red2 }}</li>
<li ng-class="{'sball-red-on':inRed.contains(kj.red3)}" class="sball-red">{{ kj.red3 }}</li>
<li ng-class="{'sball-red-on':inRed.contains(kj.red4)}" class="sball-red">{{ kj.red4 }}</li>
<li ng-class="{'sball-red-on':inRed.contains(kj.red5)}" class="sball-red">{{ kj.red5 }}</li>
<li ng-class="{'sball-blue-on':inBlue.contains(kj.blue1)}" class="sball-blue">{{ kj.blue1 }}</li>
<li ng-class="{'sball-blue-on':inBlue.contains(kj.blue2)}" class="sball-blue">{{ kj.blue2 }}</li>
</ul>
<dl class="lotto-pond">
<dd>
<label>一等奖:</label>
<span>{{ kj.firstCount }} 注</span>
<label> 奖金:</label>
<span>{{ kj.firstMoney/10000 | number:0 }} 万</span>
</dd>
</dl>
</div>
</a>
</div>
</div>
</div>
<!--foot begin-->
<div class="chax-foot">
<span ng-click="submitCode('fs',5)" class="chax-foot-btn ng-show" ng-show="searchBtn">查询</span>
<span ng-click="reSearch()" id="reSearch" style="display: none;" class="chax-foot-btn ng-hide" ng-show="reSearchBtn">重新查询</span>
</div>
<!--foot end-->
</div>
<script type="text/javascript" src="/js/mobile/zepto-1.1.4.min.js?v=2023-05"></script>
<script type="text/javascript" src="/js/mobile/popup.js"></script>
<script type="text/javascript" src="/js/mobile/angular.min.js"></script>
至此,大乐透历史开奖对比器(查询大乐透号码在历史期次中是否中过奖)的功能就开发完了,前往体验: 大乐透历史开奖对比器
最后,希望大家支持中国公益彩票,祝各位早日中得大奖~