1. 项目功能模块设计
1. 登录与权限控制:
- 登录后,管理员和用户通过 role 进行权限区分,role 可以是 “admin” 或 “user”。
- 用户和管理员登录成功后分别跳转到不同的界面:
- 管理员:跳转到管理后台,进行图书管理。
- 普通用户:跳转到图书浏览界面,只能进行搜索和查阅。
2. 图书管理功能(仅管理员)
- 图书上架:管理员可以添加新书,包含书名、分类、价格等信息。
- 图书下架:管理员可以删除已上架的图书。
- 图书分类:管理员可以给图书分类,帮助用户进行分类查找。
3. 用户功能(普通用户):
- 搜索功能:普通用户可以通过关键字搜索图书,查看图书信息。
- 查阅功能:用户可以查看图书的详细信息,包括书名、作者、简介等。
2. 数据库设计
在数据库中,我们需要几个表来存储数据:
- users 表:存储用户信息,包括用户名、密码、角色(role)。
- books 表:存储图书信息,包括书名、作者、价格、分类等。
- categories 表:存储图书分类信息。
示例表结构:
- users 表:
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL,
password VARCHAR(50) NOT NULL,
role VARCHAR(20) NOT NULL -- role 为 admin 或 user
);
- books 表:
CREATE TABLE books (
id INT PRIMARY KEY AUTO_INCREMENT,
title VARCHAR(100) NOT NULL,
author VARCHAR(100),
price DECIMAL(10, 2),
category_id INT,
available BOOLEAN DEFAULT TRUE -- true 表示在架,false 表示下架
);
- categories 表:
CREATE TABLE categories (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL
);
创建好后图表结构如图:
3. 具体功能实现步骤
步骤 1:扩展 UserService 来管理角色
在 UserService.java 中,添加对 role 的判断,用来区分用户和管理员。
public String checkLogin(String username, String password) {
User user = userDao.findByUsername(username);
if (user != null && user.getPassword().equals(password)) {
return user.getRole(); // 返回用户角色("admin" 或 "user")
}
return null;
}
步骤 2:修改 LoginServlet 来跳转到不同页面
在 LoginServlet.java 中,判断登录后返回的 role,并跳转到不同的页面。
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private UserService userService = new UserService();
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
// 检查用户名和密码
String role = userService.checkLogin(username, password);
if (role != null) {
HttpSession session = request.getSession();
session.setAttribute("username", username);
session.setAttribute("role", role); // 保存用户角色
if ("admin".equals(role)) {
response.sendRedirect("admin_home.jsp"); // 管理员跳转到管理后台
} else {
response.sendRedirect("user_home.jsp"); // 普通用户跳转到用户首页
}
} else {
response.sendRedirect("fail.jsp");
}
}
}
步骤 3:管理员后台页面(admin_home.jsp)
管理员登录后可以进入 admin_home.jsp 页面,进行图书的增删改查操作。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Admin Home</title>
</head>
<body>
<h2>管理员首页</h2>
<a href="add_book.jsp">添加图书</a>
<a href="manage_books.jsp">管理图书</a>
<a href="logout.jsp">登出</a>
</body>
</html>
步骤 4:用户首页(user_home.jsp)
普通用户登录后,跳转到 user_home.jsp 页面,可以浏览和搜索图书。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>User Home</title>
</head>
<body>
<h2>欢迎,${sessionScope.username}</h2>
<a href="search_books.jsp">搜索图书</a>
<a href="logout.jsp">登出</a>
</body>
</html>
步骤 5:添加图书页面(add_book.jsp)
管理员可以在 add_book.jsp 页面填写图书信息,添加图书到数据库。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.sql.*, com.example.util.JDBCUtils" %> <!-- 导入 JDBC 工具类 -->
<html>
<head>
<title>添加图书</title>
</head>
<body>
<h2>添加图书</h2>
<form action="add_book" method="post">
书名:<input type="text" name="title"><br>
作者:<input type="text" name="author"><br>
价格:<input type="text" name="price"><br>
分类:
<select name="category">
<%
try {
Connection conn = JDBCUtils.getConnection();
String sql = "SELECT * FROM categories"; // 查询所有分类
PreparedStatement stmt = conn.prepareStatement(sql);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
String categoryName = rs.getString("name");
int categoryId = rs.getInt("id");
out.println("<option value='" + categoryId + "'>" + categoryName + "</option>");
}
rs.close();
stmt.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
%>
</select><br>
<input type="submit" value="添加">
</form>
</body>
</html>
步骤 6:图书搜索与浏览页面(search_books.jsp)
普通用户可以在 search_books.jsp 页面输入书名或作者进行图书搜索。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.List, com.example.model.Book" %>
<html>
<head>
<title>搜索图书</title>
</head>
<body>
<h2>搜索结果</h2>
<!-- 搜索框,供用户输入书名或作者 -->
<form action="search_books" method="get">
<input type="text" name="query" placeholder="请输入书名或作者">
<input type="submit" value="搜索">
</form>
<hr>
<!-- 显示搜索结果 -->
<table border="1">
<thead>
<tr>
<th>书名</th>
<th>作者</th>
<th>价格</th>
<th>分类</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<%
List<Book> books = (List<Book>) request.getAttribute("searchResults"); // 获取搜索结果
if (books != null && !books.isEmpty()) {
for (Book book : books) {
%>
<tr>
<td><%= book.getTitle() %></td>
<td><%= book.getAuthor() %></td>
<td><%= book.getPrice() %></td>
<td><%= book.getCategoryId() %></td>
<td>
<a href="view_book?id=<%= book.getId() %>">查看</a>
</td>
</tr>
<%
}
} else {
%>
<tr>
<td colspan="5">没有找到符合条件的图书。</td>
</tr>
<%
}
%>
</tbody>
</table>
<br><br>
<a href="admin_home.jsp">返回管理首页</a> <!-- 管理员才有权限 -->
</body>
</html>
步骤 7: 管理员图书管理页面(manage_books.jsp)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.List, com.example.model.Book" %>
<html>
<head>
<title>图书管理页面</title>
</head>
<body>
<h2>图书管理页面</h2>
<!-- 显示所有图书 -->
<table border="1">
<thead>
<tr>
<th>书名</th>
<th>作者</th>
<th>价格</th>
<th>分类</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<%
List<Book> books = (List<Book>) request.getAttribute("books"); // 获取传递的图书列表
if (books != null && !books.isEmpty()) {
for (Book book : books) {
%>
<tr>
<td><%= book.getTitle() %></td>
<td><%= book.getAuthor() %></td>
<td><%= book.getPrice() %></td>
<td><%= book.getCategoryId() %></td>
<td>
<a href="edit_book.jsp?id=<%= book.getId() %>">编辑</a> |
<a href="delete_book?id=<%= book.getId() %>">删除</a>
</td>
</tr>
<%
}
} else {
%>
<tr>
<td colspan="5">暂无图书信息。</td>
</tr>
<%
}
%>
</tbody>
</table>
<br><br>
<a href="add_book.jsp">添加新图书</a> <!-- 进入添加图书页面 -->
<a href="logout.jsp">登出</a>
</body>
</html>
项目结构如图: