最近发现零零散散多了些重要的日期要标注起来,就像离期末考试、高考、考研还有多少天等等乱七八糟的时间节点要注意,不提前准备还不行,但是时间说短也不算特别短,导致这就需要一个类似于倒数日这样的程序来给我做提醒。
但是我自己又懒得打开这种手机上的app,更何况软件的布局也不算好看。
所以我就需要一个可以部署到cf大善人上面长期稳定跑起来的项目,最好界面美观些,对手机界面的适配不要太离谱。
我觉得github上面应该有相关项目?佬们推荐则个?
24 个赞
我也想知道 等一个答案
用AI写一个,自己想要什么功能就什么功能。现在AI写这种网站应该没难度了。
很适合用 worker+kv 写一个
这种小demo交给AI最好不过了。
// 全功能单文件版本 (ES Module 语法)
export default {
async fetch(request, env) {
const url = new URL(request.url);
const kv = env.COUNTDOWN_KV;
// POST 请求:添加新事件
if (url.pathname === '/add' && request.method === 'POST') {
try {
const data = await request.formData();
const name = data.get('name').trim();
const date = data.get('date');
// 日期格式验证
if (!/^\d{4}-\d{2}-\d{2}$/.test(date)) {
throw new Error('日期格式应为 YYYY-MM-DD');
}
await kv.put(name, date);
return Response.redirect(url.origin, 303); // 防止重复提交
} catch (e) {
return new Response(`错误: ${e.message}`, { status: 400 });
}
}
// GET 请求:显示主界面
const events = [];
const keys = await kv.list();
for (const key of keys.keys) {
const date = await kv.get(key.name);
events.push({ name: key.name, date });
}
events.sort((a, b) => new Date(a.date) - new Date(b.date)); // 按日期排序
// 生成响应 HTML
return new Response(renderHTML(events), {
headers: {
'Content-Type': 'text/html',
'Cache-Control': 'max-age=3600' // 适当缓存
}
});
}
};
// HTML 模板渲染函数
function renderHTML(events) {
return `
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>手机端倒数日</title>
<!-- Pico.css 移动端优先框架 -->
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@picocss/pico@1/css/pico.min.css">
<style>
/* 移动端优化 */
:root { --primary: #2196F3; }
.card { margin: 1rem 0; padding: 1rem; box-shadow: 0 2px 5px rgba(0,0,0,0.1); }
.urgent { background: #FFF3E0; }
form input { font-size: 16px !important; } /* 手机端输入优化 */
@media (max-width: 480px) {
h1 { font-size: 1.5rem; }
.grid { gap: 0.5rem; }
}
</style>
</head>
<body>
<main class="container">
<h1>📱 手机倒数日</h1>
<!-- 添加事件表单 -->
<form action="/add" method="post">
<div class="grid">
<input type="text" name="name" placeholder="事件名称" required
autocapitalize="off" autocorrect="off">
<input type="date" name="date" required>
<button type="submit" class="secondary">添加</button>
</div>
</form>
<!-- 事件列表 -->
<div class="grid">
${events.map(event => `
<article class="card ${isUrgent(event.date) ? 'urgent' : ''}">
<h3>${event.name}</h3>
<p>目标日期: ${formatDate(event.date)}</p>
<p class="days-left">剩余天数: <b>${calculateDays(event.date)}</b></p>
<small>ID: ${event.name}</small>
</article>
`).join('')}
</div>
</main>
<script>
// 动态时间计算
function calculateDays(target) {
const diff = new Date(target) - new Date();
const days = Math.ceil(diff / 864e5);
return days > 0 ? days + ' 天' : '⏰ 时间到!';
}
// 每30分钟自动刷新(适合长期挂载)
setTimeout(() => location.reload(), 1800000);
// 触摸优化:按钮点击效果
document.querySelectorAll('button').forEach(btn => {
btn.addEventListener('touchstart', () => btn.style.opacity = 0.7);
btn.addEventListener('touchend', () => btn.style.opacity = 1);
});
</script>
</body>
</html>
`;
}
// 辅助函数
function isUrgent(dateStr) {
const days = (new Date(dateStr) - Date.now()) / 86400000;
return days <= 7 && days > 0;
}
function formatDate(dateStr) {
const [year, month, day] = dateStr.split('-');
return `${year}年${month}月${day}日`;
}
步骤 1:创建 Worker
- 手机浏览器访问 Cloudflare Dashboard
- 进入 Workers & Pages → 创建应用 → 创建 Worker
- 在代码编辑器中 清空默认内容,粘贴上述完整代码
步骤 2:配置 KV 存储
- 在 Worker 编辑页面,点击 设置 → 变量 → KV 命名空间绑定
- 点击 添加绑定:
- 变量名称:
COUNTDOWN_KV
- 选择现有 KV 命名空间 → 创建新命名空间(名称例如
Countdown_DB
)
- 变量名称:
- 保存设置
佬友后续怎么实现的
自己靠不断给claude 3.7提修改要求手搓了一个,花了两三刀呢,主要是这东西用别人的风格我总是不够满足。
非常感谢!
1 个赞