从零构建全栈待办清单:HTML+CSS+JS+Java技术栈实践
💡 引言
待办清单(Todo List)是检验开发者全栈能力的经典项目。今天我们将融合四大核心技术:
-
HTML:构建骨架
-
CSS:实现玻璃态新拟物设计
-
JavaScript:添加动态交互
-
Java:Spring Boot构建RESTful API
最终效果:响应式界面 + 实时数据同步 + 跨设备持久化存储
一、前端核心技术实现(HTML/CSS/JS)
1. 超语义化HTML结构
<div class="glass-container">
<h1>📝 智能待办清单</h1>
<!-- 输入区域 -->
<div class="input-group">
<input type="text" id="taskInput" placeholder="添加新任务...">
<button onclick="addTask()">➕ 添加</button>
</div>
<!-- 任务列表 -->
<ul id="taskList" class="neumorphic-list">
<!-- JS动态生成 -->
</ul>
<!-- 统计区域 -->
<div class="stats-bar">
<span>已完成: <span id="completedCount">0</span></span>
<button onclick="clearCompleted()">🧹 清除已完成</button>
</div>
</div>
2. 高级CSS技术运用
亮点技术:玻璃态(Glassmorphism) + 新拟物(Neumorphism)混合设计
/* 玻璃态背景 */
.glass-container {
background: rgba(255, 255, 255, 0.2);
backdrop-filter: blur(10px);
border-radius: 20px;
border: 1px solid rgba(255, 255, 255, 0.3);
box-shadow: 0 8px 32px rgba(31, 38, 135, 0.2);
}
/* 新拟态按钮 */
button {
background: linear-gradient(145deg, #e6e6e6, #ffffff);
box-shadow: 5px 5px 10px #d9d9d9,
-5px -5px 10px #ffffff;
transition: all 0.3s ease;
}
button:active {
box-shadow: inset 5px 5px 10px #d9d9d9,
inset -5px -5px 10px #ffffff;
}
/* 任务项悬停动画 */
.task-item:hover {
transform: translateY(-3px);
box-shadow: 0 6px 12px rgba(0,0,0,0.1);
}
3. JavaScript高级特性
核心功能:
-
实时数据验证
-
任务状态切换
-
本地存储缓存
-
动画反馈系统
// 添加任务时的粒子动画 function createParticleAnimation(x, y) { const particles = []; for (let i = 0; i < 15; i++) { const p = document.createElement('div'); p.className = 'particle'; p.style.left = `${x}px`; p.style.top = `${y}px`; document.body.appendChild(p); // 物理运动参数 const angle = Math.random() * Math.PI * 2; const speed = Math.random() * 3 + 2; particles.push({ element: p, x, y, vx: Math.cos(angle) * speed, vy: Math.sin(angle) * speed, life: 30 }); } // 动画循环 function animate() { particles.forEach(p => { p.x += p.vx; p.y += p.vy; p.life--; p.element.style.transform = `translate(${p.x}px, ${p.y}px)`; p.element.style.opacity = p.life / 30; if(p.life <= 0) { p.element.remove(); } }); if(particles.some(p => p.life > 0)) { requestAnimationFrame(animate); } } animate(); }二、Java后端实现(Spring Boot)
1. RESTful API设计
@RestController @RequestMapping("/api/todos") public class TodoController { @Autowired private TodoRepository repository; // 获取所有任务 @GetMapping public List<Todo> getAllTodos() { return repository.findAll(); } // 添加新任务 @PostMapping public Todo addTodo(@RequestBody Todo todo) { todo.setCreatedAt(LocalDateTime.now()); return repository.save(todo); } // 切换完成状态 @PutMapping("/{id}/toggle") public ResponseEntity<Todo> toggleTodo(@PathVariable Long id) { return repository.findById(id) .map(todo -> { todo.setCompleted(!todo.isCompleted()); todo.setCompletedAt(todo.isCompleted() ? LocalDateTime.now() : null); return ResponseEntity.ok(repository.save(todo)); }) .orElseGet(() -> ResponseEntity.notFound().build()); } }2. 数据持久化设计
@Entity public class Todo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private boolean completed; private LocalDateTime createdAt; private LocalDateTime completedAt; // 智能排序规则:未完成 > 新完成 > 旧完成 public static Comparator<Todo> SMART_SORT = (t1, t2) -> { if(!t1.isCompleted() && t2.isCompleted()) return -1; if(t1.isCompleted() && !t2.isCompleted()) return 1; if(t1.isCompleted() && t2.isCompleted()) { return t2.getCompletedAt().compareTo(t1.getCompletedAt()); } return t2.getCreatedAt().compareTo(t1.getCreatedAt()); }; }三、前后端协同关键技术
-
1. Fetch API通信
-
// 获取任务列表 async function loadTasks() { const response = await fetch('/api/todos'); const tasks = await response.json(); // 渲染到界面 taskList.innerHTML = tasks.sort(Todo.SMART_SORT) .map(task => ` <li class="task-item ${task.completed ? 'completed' : ''}" data-id="${task.id}"> <label> <input type="checkbox" ${task.completed ? 'checked' : ''} onchange="toggleTask(${task.id})"> <span>${escapeHTML(task.title)}</span> </label> <button onclick="deleteTask(${task.id})">🗑️</button> </li> `).join(''); }2. 双端数据同步策略
// WebSocket实时更新 @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/todo-websocket").withSockJS(); } } // 任务更新时广播 @Service public class TodoUpdateService { @Autowired private SimpMessagingTemplate messagingTemplate; public void broadcastUpdate(Todo todo) { messagingTemplate.convertAndSend("/topic/todoUpdates", todo); } }2. 双端数据同步策略
// WebSocket实时更新 @Configuration @EnableWebSocketMessageBroker public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); config.setApplicationDestinationPrefixes("/app"); } @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/todo-websocket").withSockJS(); } } // 任务更新时广播 @Service public class TodoUpdateService { @Autowired private SimpMessagingTemplate messagingTemplate; public void broadcastUpdate(Todo todo) { messagingTemplate.convertAndSend("/topic/todoUpdates", todo); } }四、项目亮点总结
-
现代化UI设计
-
玻璃态 + 新拟物混合美学
-
粒子动画反馈系统
-
深色/浅色模式自适应
-
-
智能数据管理
-
自动保存到IndexedDB
-
离线优先策略
-
WebSocket实时同步
-
-
高级Java特性
-
JPA审计(@CreatedDate)
-
自定义Repository查询
-
智能排序算法
-
-
性能优化
-
虚拟滚动(长列表)
-
请求防抖(Debounce)
-
数据分页加载
-
🔎 效果演示
-
(心血来潮随便做的,真的不是因为我的作业是发一篇博客hhh,老师如果你会来看的话,期末一定要给我个高分哦)
-


418

被折叠的 条评论
为什么被折叠?



