「乱搞」从零搭建一个查询值日生的静态网站
写在前面
成果展示:https://luckyblock233.github.io/。
github 仓库:https://github.com/Luckyblock233/Luckyblock233.github.io。
起因:舍友都是懒狗,逼我用这么赛博朋克的方式催值日。
以下你将看到:基于 github 托管的静态网站,学了不到两个小时的前端,写的稀烂的代码,至少能用的网站,略显曲折的心路历程。
如果您准备详细而系统地学习前端:太好了,您可以直接关闭这篇稀烂的文章,并顺手点一个踩。
如果您只是想稍微实现一点类似这样的小功能,那您可以继续看下去…
创建一个 github 的个人博客
推荐看这篇:📡使用Github做一个完全免费的个人网站(步骤很细) - 知乎
按照这篇做完之后,为了省事,我们将直接在 index.html 上完成我们的功能。
学习一点点前端知识
建议阅读:HTML 教程 _ 菜鸟教程 与 JavaScript 教程 _ 菜鸟教程。
为什么不学 CSS?因为懒。
设计思路
和绝大多数宿舍相同,作者的宿舍实行轮替的值日生制度,不过是每个人干两天然后换下一个人,从制度确立的那一天起开始运作。然后就可以想到一个异常简单的算法:
- 求当前日期与开始日期之间天数之差。
- 天数之差模 8,按照余数输出值日生即可。
核心算法搞定了,之后只需要解决一些小……小问题就行了……吧……
大致框架
随便写写就行。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
//可自定义内容:
names = new Array("瘟疫", "战争", "饥荒", "死亡"); //下标从零开始。
StartDate = '2022-10-09'; //日期格式:YYYY-MM-DD
function Calc() { //计算值日生的算法,参数为开始日期到当前日期的天数:
var mod = undefined;//......
return names[mod];
}
function GetDate() {
//......
}
function getDateBetWeen(startDate, endDate) {
var result = 0;
//......
return result;
}
</script>
</head>
<body>
<center>
<h1>今天的值日生是:</h1>
<script>
document.write(Calc()));
</script>
</center>
</body>
</html>
如何实现日期计算
JS 提供了 Date()
函数能够获取当前日期,但我们没法它的返回类型进行直接处理,于是我去网上抄了一篇并自己瞎几把改了一下:JS - 获取开始日期和结束日期之间的时间段 - 简书。
原理似乎是先将日期中的年月日取出,转换成标准形式的日期表示后扔进字符串,再将两个字符串表示的时间转换成毫秒的形式,再计算差了几天……
函数好吓人,我跑了。
StartDate = '2022-10-09'; //日期格式:YYYY-MM-DD
function GetDate() {
var date = new Date();
var str = "";
var month = date.getMonth() + 1;
var day = date.getDate();
str += date.getFullYear().toString() + "-";
str += month.toString().padStart(2, '0') + "-";
str += day.toString().padStart(2, '0');
return str;
}
function getDateBetWeen(startDate, endDate) {
var startList = startDate.split('-'),
endList = endDate.split('-'),
date1 = new Date(),
date2 = new Date(),
date1Time,
date2Time,
result = 0;
date1.setUTCFullYear(startList[0], startList[1] - 1, startList[2]);
date2.setUTCFullYear(endList[0], endList[1] - 1, endList[2]);
date1Time = date1.getTime();
date2Time = date2.getTime();
for(var time = date1Time; time < date2Time;){
result = result + 1;
time = time + 24 * 60 * 60 * 1000;
}
return result;
}
最终代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
//可自定义内容:
names = new Array("瘟疫", "战争", "饥荒", "死亡"); //下标从零开始。
StartDate = '2022-10-09'; //日期格式:YYYY-MM-DD
function Calc() { //计算值日生的算法,参数为开始日期到当前日期的天数:
mod = Math.floor((getDateBetWeen(StartDate, GetDate()) % 8) / 2);
return names[mod];
}
function GetDate() {
var date = new Date();
var str = "";
var month = date.getMonth() + 1;
var day = date.getDate();
str += date.getFullYear().toString() + "-";
str += month.toString().padStart(2, '0') + "-";
str += day.toString().padStart(2, '0');
return str;
}
function getDateBetWeen(startDate, endDate) {
var startList = startDate.split('-'),
endList = endDate.split('-'),
date1 = new Date(),
date2 = new Date(),
date1Time,
date2Time,
result = 0;
date1.setUTCFullYear(startList[0], startList[1] - 1, startList[2]);
date2.setUTCFullYear(endList[0], endList[1] - 1, endList[2]);
date1Time = date1.getTime();
date2Time = date2.getTime();
for(var time = date1Time; time < date2Time;){
result = result + 1;
time = time + 24 * 60 * 60 * 1000;
}
return result;
}
</script>
</head>
<body>
<center>
<h1>今天的值日生是:</h1>
<script>
document.write(Calc());
</script>
</center>
</body>
</html>
加点装饰
按照个人喜好加了点小装饰还有一点碎碎念,自定义的部分放在了 <head>
的开头。
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<script>
//可自定义内容:
names = new Array("瘟疫", "战争", "饥荒", "死亡"); //下标从零开始。
StartDate = '2022-10-09'; //日期格式:YYYY-MM-DD
function Calc() { //计算值日生的算法,参数为开始日期到当前日期的天数:
var days = getDateBetWeen(StartDate, GetDate()),
mod = Math.floor(days % 8 / 2);
return names[mod];
}
function GetDetails() { //用来写一些碎碎念的地方,懒得再学了,所以用了非常弱智的方法实现,给出了三行的空间。
document.getElementById("Details1").innerHTML = "采用的算法大致如下所示:";
document.getElementById("Details2").innerHTML = "计算当前天数与 2022-10-09 的天数差,天数差对 8 取余,按照取余结果分配值日生。如余数为 0、1 则瘟疫,2、3 则战争,4、5 则饥荒……以此类推。";
document.getElementById("Details3").innerHTML = "本来想做一个能够按照所需跳过假期回家值日计算的程序的,然而买不起服务器,没法上传假期时间……就先这样用着罢";
}
function GetDate() {
var date = new Date();
var str = "";
var month = date.getMonth() + 1;
var day = date.getDate();
str += date.getFullYear().toString() + "-";
str += month.toString().padStart(2, '0') + "-";
str += day.toString().padStart(2, '0');
return str;
}
function getDateBetWeen(startDate, endDate) {
var startList = startDate.split('-'),
endList = endDate.split('-'),
date1 = new Date(),
date2 = new Date(),
date1Time,
date2Time,
result = 0;
date1.setUTCFullYear(startList[0], startList[1] - 1, startList[2]);
date2.setUTCFullYear(endList[0], endList[1] - 1, endList[2]);
date1Time = date1.getTime();
date2Time = date2.getTime();
for(var time = date1Time; time < date2Time;){
result = result + 1;
time = time + 24 * 60 * 60 * 1000;
}
return result;
}
function GetName() {
var truename = Calc();
document.getElementById("MyButtom").innerHTML = truename;
document.getElementById("MyImage").width="250";
document.getElementById("MyImage").height="270";
document.getElementById("MyImage").src = "https://pic1.imgdb.cn/item/634252d116f2c2beb12c4d9f.jpg";
}
</script>
</head>
<body>
<center>
<h1>今天的值日生</h1>
<p>会是谁呢???</p>
<p id = "MyButtom"> <button type="button" onclick = "GetName()"> 一键查询!!</button> </p>
<p><img id = "MyImage"
src="https://pic1.imgdb.cn/item/634252d116f2c2beb12c4da4.jpg"
alt="Happiness...but temporary"></p>
<p id = "Details1"> <button type = "button" onclick = "GetDetails()"> 展开说明 </button> </p>
<p id = "Details2"> </p>
<p id = "Details3"> </p>
</center>
</body>
</html>
写在最后
大哥哥已经是大学生了是吗?!想必生活一定能自理了吧!
哈哈。