待办清单项目14:实现待办事项的增删改查
5/16/2025
160 阅读

实现查询待办的功能
1.打开IDEA后端代码,找到SysTodoService
文件,把代码改成下面这样
package com.youngshu.todolist.service;
import com.youngshu.todolist.pojo.SysTodo;
import java.util.List;
/**
* 定义系统待办事项的业务逻辑接口
*/
public interface SysTodoService {
List<SysTodo> findByUserId(int uid);
}
2.找到SysTodoServiceImpl
文件,把代码改成下面这样
package com.youngshu.todolist.service.impl;
import com.youngshu.todolist.dao.SysTodoDao;
import com.youngshu.todolist.dao.impl.SysTodoDaoImpl;
import com.youngshu.todolist.pojo.SysTodo;
import com.youngshu.todolist.service.SysTodoService;
import java.util.List;
/**
* 实现待办事项接口
*/
public class SysTodoServiceImpl implements SysTodoService {
private SysTodoDao todoDao = new SysTodoDaoImpl();
@Override
public List<SysTodo> findByUserId(int uid) {
return todoDao.findByUserId(uid);
}
}
3.找到SysTodoController
文件,把代码改成下面这样
package com.youngshu.todolist.controller;
import com.youngshu.todolist.common.Result;
import com.youngshu.todolist.pojo.SysTodo;
import com.youngshu.todolist.utils.WebUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import com.youngshu.todolist.service.SysTodoService;
import com.youngshu.todolist.service.impl.SysTodoServiceImpl;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
// 处理与待办事项相关的HTTP请求
@WebServlet("/todo/*")
public class SysTodoController extends BaseController {
private SysTodoService sysTodoService = new SysTodoServiceImpl();
// 添加新的待办事项
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("add todo");
}
// 删除指定的待办事项
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("delete todo");
}
// 编辑指定的待办事项
protected void edit(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("edit todo");
}
// 列出用户的所有的待办事项
protected void findByUserId(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 接收请求中的uid参数
int uid =Integer.parseInt(req.getParameter("uid"));
// 查询用户的所有日程
List<SysTodo> itemList =sysTodoService.findByUserId(uid);
// 将用户的所有日程放入一个Result对象
Map data =new HashMap();
data.put("itemList",itemList);
Result result = Result.ok(data);
// 将Result对象转换为json响应给客户端
WebUtils.writeJson(resp,result);
}
}
4.找到LoginFilter文件,把该文件删除,或者把里面的代码全部注释掉!
5.启动Tomcat服务器
6.打开vscode,把ShowTodoList.vue文件的代码改成下面这样
<script setup>
import { ref, computed, onMounted } from 'vue'
import { defineUser } from '../store/userStore.js'
import { defineTodoList } from '../store/todoStore.js'
import request from '../utils/request'
let sysUser = defineUser()
let todoList = defineTodoList()
// 新增待办输入
const newTodoTitle = ref('')
// 只显示当前用户的事项
const userTodos = computed(() => {
if (!sysUser.uid) return []
return todoList.list.filter(item => item.uid === sysUser.uid)
})
// 挂载时拉取数据
onMounted(async () => {
let { data } = await request.get("TodoList/todo/findByUserId", { params: { "uid": sysUser.uid } })
todoList.list = data.data.itemList
})
// 新增待办
async function addTodo() {
const title = newTodoTitle.value.trim()
if (!title) return
// 发送请求新增
let { data } = await request.post("TodoList/todo/add", {
uid: sysUser.uid,
title,
completed: 0
})
if (data.code === 200) {
// 新增成功后刷新
todoList.list.push({
sid: data.data.sid,
uid: sysUser.uid,
title,
completed: 0
})
newTodoTitle.value = ''
} else {
alert('添加失败')
}
}
// 切换完成状态
async function toggleCompleted(todo) {
let { data } = await request.post("TodoList/todo/update", todo)
if (data.code === 200) {
todo.completed = todo.completed==1 ? 0 : 1
} else {
alert('更新失败')
}
}
// 删除事项
async function removeTodo(sid) {
//根据sid在todoList.list中查找出对应的todo对象
let todo = todoList.list.find(item => item.sid === sid)
let { data } = await request.post("TodoList/todo/delete", todo)
if (data.code === 200) {
todoList.list = todoList.list.filter(item => item.sid !== sid)
} else {
alert('删除失败')
}
}
</script>
<template>
<div class="todolist-wrapper">
<div class="todolist-card">
<div class="todolist-header">
<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="#4361ee" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="5" width="18" height="14" rx="2"/><path d="M16 3v4"/><path d="M8 3v4"/></svg>
<h2>我的待办事项</h2>
<p>管理你的每日任务,保持高效!</p>
</div>
<form class="add-todo-form" @submit.prevent="addTodo">
<input
v-model="newTodoTitle"
type="text"
placeholder="请输入新的待办事项"
class="input-todo"
/>
<button type="submit" class="btn-add">添加</button>
</form>
<div v-if="userTodos.length > 0" class="todo-list">
<div v-for="todo in userTodos" :key="todo.sid" class="todo-item" :class="{completed: todo.completed}">
<label>
<input type="checkbox" :checked="todo.completed" @change="toggleCompleted(todo)" />
<span class="todo-title">{{ todo.title }}</span>
</label>
<button class="btn-delete" @click="removeTodo(todo.sid)">删除</button>
</div>
</div>
<div v-else class="empty-tip">
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="none" stroke="#ccc" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-inbox"><rect x="2" y="7" width="20" height="14" rx="2"/><path d="M16 3v4"/><path d="M8 3v4"/></svg>
<p>暂无待办事项,快去添加吧!</p>
</div>
</div>
</div>
</template>
<style scoped>
.todolist-wrapper {
flex-grow: 1;
display: flex;
justify-content: center;
align-items: center;
padding: 2rem;
}
.todolist-card {
background: white;
padding: 2.5rem 3rem;
border-radius: 12px;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
width: 100%;
max-width: 420px;
text-align: center;
transition: transform 0.3s ease, box-shadow 0.3s ease;
}
.todolist-header {
margin-bottom: 1.5rem;
}
.todolist-header h2 {
margin: 0.5rem 0 0.2rem;
font-size: 1.4rem;
color: #4361ee;
}
.todolist-header p {
margin: 0;
font-size: 0.95rem;
color: #666;
}
.add-todo-form {
display: flex;
gap: 0.5rem;
margin-bottom: 1.2rem;
}
.input-todo {
flex: 1;
padding: 0.6rem 1rem;
border: 1px solid #ddd;
border-radius: 6px;
font-size: 1rem;
transition: border-color 0.3s;
}
.input-todo:focus {
outline: none;
border-color: #4361ee;
}
.btn-add {
background: linear-gradient(90deg, #4361ee 0%, #3a53c0 100%);
color: white;
border: none;
border-radius: 6px;
padding: 0.6rem 1.2rem;
font-size: 1rem;
font-weight: 600;
cursor: pointer;
transition: background 0.2s;
}
.btn-add:hover {
background: #4361ee;
}
.todo-list {
display: flex;
flex-direction: column;
gap: 1rem;
}
.todo-item {
display: flex;
align-items: center;
justify-content: space-between;
background: #f8f9fa;
border-radius: 6px;
padding: 0.7rem 1rem;
transition: background 0.2s;
}
.todo-item.completed .todo-title {
text-decoration: line-through;
color: #aaa;
}
.todo-title {
font-size: 1rem;
margin-left: 0.5rem;
}
.btn-delete {
background: #ef476f;
color: #fff;
border: none;
border-radius: 4px;
padding: 0.3rem 0.8rem;
cursor: pointer;
font-size: 0.9rem;
transition: background 0.2s;
}
.btn-delete:hover {
background: #d90429;
}
.empty-tip {
color: #aaa;
margin-top: 2rem;
display: flex;
flex-direction: column;
align-items: center;
}
.empty-tip p {
margin-top: 0.5rem;
font-size: 1rem;
}
</style>
7.打开数据库的sys_user表格,查看上一次课自己创建的用户名的uid,记在心里
8.按下图所示的步骤手动添加一些数据(注意uid要设置成上一步你的uid,添加完数据后点向上的箭头更新数据表)
9.启动前端服务器,访问前端页面,登录之后,可以看到你的待办事项
实现添加、删除和更新的功能
1.找到ResultCodeEnum
文件,把代码改成下面这样
package com.youngshu.todolist.common;
// 定义一个枚举类型 ResultCodeEnum,用于表示操作结果的不同状态码及其对应的描述信息。
public enum ResultCodeEnum {
// 表示操作成功,状态码为 200,描述信息为 "success"。
SUCCESS(200, "success"),
// 表示用户名错误,状态码为 501,描述信息为 "usernameError"。
USERNAEM_ERROR(501, "usernameError"), // 注意:这里拼写错误,应该是 USERNAME_ERROR
// 表示密码错误,状态码为 503,描述信息为 "passwordError"。
PASSWORD_ERROR(503, "passwordError"),
// 表示用户未登录,状态码为 504,描述信息为 "notlogin"。
NOTLOGIN(504, "notlogin"),
// 表示用户名已被使用,状态码为 505,描述信息为 "usernameUsed"。
USERNAME_USED(505, "usernameUsed"), INSERT_ERROR(506, "insertError"), UPDATE_ERROR(507, "updateError"), DELETE_ERROR(508, "deleteError"), SELECT_ERROR(509, "selectError"), OTHER_ERROR(510, "otherError");
// 私有成员变量 code,用于存储状态码。
private Integer code;
// 私有成员变量 message,用于存储描述信息。
private String message;
// 私有构造方法 ResultCodeEnum,用于初始化枚举实例的状态码和描述信息。
private ResultCodeEnum(Integer code, String message) {
this.code = code;
this.message = message;
}
// 公共方法 getCode,用于获取枚举实例的状态码。
public Integer getCode() {
return code;
}
// 公共方法 getMessage,用于获取枚举实例的描述信息。
public String getMessage() {
return message;
}
}
2.找到SysTodoDao
文件,把代码改成下面这样
package com.youngshu.todolist.dao;
import com.youngshu.todolist.pojo.SysTodo;
import java.util.List;
/**
* 待办事项数据访问接口
* 该接口定义了对待办事项(sys_todo表)的基本CRUD操作
*
* @author youngshu
* @version 1.0
* @since 2024-04-10
*/
public interface SysTodoDao {
/**
* 添加新的待办事项
*
* @param sysTodo 待添加的待办事项对象,不能为null
* @return 影响的行数,插入成功返回1,失败返回0
*/
int insert(SysTodo sysTodo);
/**
* 更新待办事项信息
*
* @param sysTodo 待更新的待办事项对象,必须包含sid,不能为null
* @return 影响的行数,更新成功返回1,失败返回0
*/
int update(SysTodo sysTodo);
/**
* 根据ID删除待办事项
*
* @param sid 待办事项ID
* @return 影响的行数,删除成功返回1,失败返回0
*/
int delete(int sid);
/**
* 根据ID查找待办事项
*
* @param sid 待办事项ID
* @return 查找到的待办事项对象,如果不存在返回null
*/
SysTodo findById(int sid);
/**
* 查找指定用户的所有待办事项
*
* @param uid 用户ID
* @return 该用户的所有待办事项列表,如果没有则返回空列表
*/
List<SysTodo> findByUserId(int uid);
/**
* 查找所有待办事项
*
* @return 所有待办事项的列表,如果没有则返回空列表
*/
List<SysTodo> findAll();
/**
* 更新待办事项的完成状态
*
* @param sid 待办事项ID
* @param completed 完成状态:0-未完成,1-已完成
* @return 影响的行数,更新成功返回1,失败返回0
*/
int updateCompleted(int sid, int completed);
}
3.找到SysTodoDaoImpl
文件,把代码改成下面这样
package com.youngshu.todolist.dao.impl;
import com.youngshu.todolist.dao.SysTodoDao;
import com.youngshu.todolist.pojo.SysTodo;
import com.youngshu.todolist.utils.JDBCUtils;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
/**
* 实现SysTodoDao接口的类,用于对sys_todo表进行数据库操作
*/
public class SysTodoDaoImpl implements SysTodoDao {
/**
* 插入新的待办事项到数据库
* @param sysTodo 待办事项对象
* @return 插入成功返回1,失败返回0
*/
@Override
public int insert(SysTodo sysTodo) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
String sql = "INSERT INTO sys_todo (uid, title, completed) VALUES (?, ?, ?)";
ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
ps.setInt(1, sysTodo.getUid());
ps.setString(2, sysTodo.getTitle());
ps.setInt(3, sysTodo.getCompleted());
int affectedRows = ps.executeUpdate();
if (affectedRows == 0) {
return -1;
}
rs = ps.getGeneratedKeys();
if (rs.next()) {
return rs.getInt(1); // 返回主键sid
} else {
return -1;
}
} catch (SQLException e) {
e.printStackTrace();
return -1;
} finally {
JDBCUtils.closeResource(conn, ps, rs);
}
}
/**
* 更新指定待办事项的信息
* @param sysTodo 待办事项对象,包含更新后的信息
* @return 更新成功返回1,失败返回0
*/
@Override
public int update(SysTodo sysTodo) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtils.getConnection();
String sql = "UPDATE sys_todo SET title = ?, completed = ? WHERE sid = ?";
ps = conn.prepareStatement(sql);
ps.setString(1, sysTodo.getTitle());
ps.setInt(2, sysTodo.getCompleted());
ps.setInt(3, sysTodo.getSid());
return ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
return 0;
} finally {
JDBCUtils.closeResource(conn, ps, null);
}
}
/**
* 根据待办事项ID删除待办事项
* @param sid 待办事项ID
* @return 删除成功返回1,失败返回0
*/
@Override
public int delete(int sid) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtils.getConnection();
String sql = "DELETE FROM sys_todo WHERE sid = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, sid);
return ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
return 0;
} finally {
JDBCUtils.closeResource(conn, ps, null);
}
}
/**
* 根据待办事项ID查找待办事项
* @param sid 待办事项ID
* @return 找到的待办事项对象,未找到返回null
*/
@Override
public SysTodo findById(int sid) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = JDBCUtils.getConnection();
String sql = "SELECT * FROM sys_todo WHERE sid = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, sid);
rs = ps.executeQuery();
if (rs.next()) {
return new SysTodo(
rs.getInt("sid"),
rs.getInt("uid"),
rs.getString("title"),
rs.getInt("completed")
);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn, ps, rs);
}
return null;
}
/**
* 根据用户ID查找该用户的所有待办事项
* @param uid 用户ID
* @return 该用户的所有待办事项列表
*/
@Override
public List<SysTodo> findByUserId(int uid) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<SysTodo> todoList = new ArrayList<>();
try {
conn = JDBCUtils.getConnection();
String sql = "SELECT * FROM sys_todo WHERE uid = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, uid);
rs = ps.executeQuery();
while (rs.next()) {
todoList.add(new SysTodo(
rs.getInt("sid"),
rs.getInt("uid"),
rs.getString("title"),
rs.getInt("completed")
));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn, ps, rs);
}
return todoList;
}
/**
* 查找数据库中所有的待办事项
* @return 所有待办事项列表
*/
@Override
public List<SysTodo> findAll() {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
List<SysTodo> todoList = new ArrayList<>();
try {
conn = JDBCUtils.getConnection();
String sql = "SELECT * FROM sys_todo";
ps = conn.prepareStatement(sql);
rs = ps.executeQuery();
while (rs.next()) {
todoList.add(new SysTodo(
rs.getInt("sid"),
rs.getInt("uid"),
rs.getString("title"),
rs.getInt("completed")
));
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
JDBCUtils.closeResource(conn, ps, rs);
}
return todoList;
}
/**
* 更新指定待办事项的完成状态
* @param sid 待办事项ID
* @param completed 完成状态,1表示已完成,0表示未完成
* @return 更新成功返回1,失败返回0
*/
@Override
public int updateCompleted(int sid, int completed) {
Connection conn = null;
PreparedStatement ps = null;
try {
conn = JDBCUtils.getConnection();
String sql = "UPDATE sys_todo SET completed = ? WHERE sid = ?";
ps = conn.prepareStatement(sql);
ps.setInt(1, completed);
ps.setInt(2, sid);
return ps.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
return 0;
} finally {
JDBCUtils.closeResource(conn, ps, null);
}
}
}
4.找到SysTodoService
文件,把代码改写如下
package com.youngshu.todolist.service;
import com.youngshu.todolist.pojo.SysTodo;
import java.util.List;
/**
* 定义系统待办事项的业务逻辑接口
*/
public interface SysTodoService {
List<SysTodo> findByUserId(int uid);
int insert(SysTodo todo);
int delete(int id);
int update(SysTodo todo);
}
5.找到SysTodoServiceImpl
文件,把代码改下如下
package com.youngshu.todolist.service.impl;
import com.youngshu.todolist.dao.SysTodoDao;
import com.youngshu.todolist.dao.impl.SysTodoDaoImpl;
import com.youngshu.todolist.pojo.SysTodo;
import com.youngshu.todolist.service.SysTodoService;
import java.util.List;
/**
* 实现待办事项接口
*/
public class SysTodoServiceImpl implements SysTodoService {
private SysTodoDao todoDao = new SysTodoDaoImpl();
@Override
public List<SysTodo> findByUserId(int uid) {
return todoDao.findByUserId(uid);
}
@Override
public int insert(SysTodo todo) {
return todoDao.insert(todo);
}
@Override
public int delete(int id) {
return todoDao.delete(id);
}
@Override
public int update(SysTodo todo) {
return todoDao.update(todo);
}
}
6.找到SysTodoController
文件,把代码改写如下
package com.youngshu.todolist.controller;
import com.youngshu.todolist.common.Result;
import com.youngshu.todolist.common.ResultCodeEnum;
import com.youngshu.todolist.pojo.SysTodo;
import com.youngshu.todolist.pojo.SysUser;
import com.youngshu.todolist.utils.WebUtils;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import com.youngshu.todolist.service.SysTodoService;
import com.youngshu.todolist.service.impl.SysTodoServiceImpl;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
// 处理与待办事项相关的HTTP请求
@WebServlet("/todo/*")
public class SysTodoController extends BaseController {
private SysTodoService sysTodoService = new SysTodoServiceImpl();
// 添加新的待办事项
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1 接收客户端提交的json参数,并转换为SysTodo对象对象,获取信息
SysTodo todo = WebUtils.readJson(req, SysTodo.class);
// 2. 调用 service 保存
int sid = sysTodoService.insert(todo);
// 3. 返回结果
//如果sid为0,说明插入失败
Result result = Result.ok(null);
if(sid < 0){
result = Result.build(null,ResultCodeEnum.INSERT_ERROR);
}
Map<String, Object> data = new HashMap<>();
data.put("sid", sid);
result = Result.ok(data);
WebUtils.writeJson(resp, result);
}
// 删除指定的待办事项
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1 接收客户端提交的json参数,并转换为SysTodo对象对象,获取信息
SysTodo todo = WebUtils.readJson(req, SysTodo.class);
// 2. 调用 service 删除
int rows = sysTodoService.delete(todo.getSid());
// 3. 返回结果
Result result = Result.ok(null);
if(rows < 0){
result = Result.build(null,ResultCodeEnum.DELETE_ERROR);
}
WebUtils.writeJson(resp, result);
}
// 更新指定的待办事项
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1 接收客户端提交的json参数,并转换为SysTodo对象对象,获取信息
SysTodo todo = WebUtils.readJson(req, SysTodo.class);
int completed = todo.getCompleted();
todo.setCompleted(completed == 1 ? 0 : 1);
// 2. 调用 service 更新
int rows = sysTodoService.update(todo);
// 3. 返回结果
Result result = Result.ok(null);
if(rows < 0){
result = Result.build(null,ResultCodeEnum.UPDATE_ERROR);
}
WebUtils.writeJson(resp, result);
}
// 列出用户的所有的待办事项
protected void findByUserId(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 接收请求中的uid参数
int uid =Integer.parseInt(req.getParameter("uid"));
// 查询用户的所有日程
List<SysTodo> itemList =sysTodoService.findByUserId(uid);
// 将用户的所有日程放入一个Result对象
Map data =new HashMap();
data.put("itemList",itemList);
Result result = Result.ok(data);
// 将Result对象转换为json响应给客户端
WebUtils.writeJson(resp,result);
}
}
删除多余文件
1.找到LoginFilter
文件,将其删除
2.删除如下图所示的后端所有html代码
3.打开Tomcat里面的编辑配置,取消勾选在启动后打开浏览器。
测试
至此,我们已经完成整个待办事项管理系统项目,接下来,重新启动Tomcat服务器,重启前端服务器,测试所有功能是否可用
作业
1.通过看代码,打断点调试等操作学习项目代码
2.给项目代码补充更加规范和详细的代码注释,写出并理解每个函数的逻辑!
评论 (0)
暂无评论,来发表第一条评论吧!