第一次冲刺
网上购书系统:第一次冲刺
引言
本篇博客旨在完成网上购书系统的最小可用产品。
第一次冲刺的目标是构建一个最小可用系统,涵盖以下高优先级功能:
- 用户功能:
- 用户注册和登录。
- 书籍浏览和搜索。
- 购物车管理(添加、查看、更新、删除)。
 
- 管理员功能:
- 添加和删除书籍。
 
这些功能的实现确保了系统能够满足基本的在线购书需求,同时为未来扩展提供了基础。
架构设计
系统采用单体架构,将前端、后端和数据库整合到一个应用中。该种架构简化了开发和部署过程。
技术栈
- 前端:使用 JSP构建动态网页,提供用户友好的界面。
- 后端:使用 Servlet 处理业务逻辑,响应前端请求。
- 数据库:MySQL 用于存储用户、书籍、购物车和订单数据。
- 服务器:Tomcat8.0 作为部署服务器,运行整个应用。
- 会话管理:通过 HTTP 会话(session)或 cookie 管理用户状态。
- 支付功能:在 MVP 中,支付功能简化为模拟订单生成
数据库设计
系统使用 MySQL 数据库,设计了以下主要表:
| 表名 | 字段 | 描述 | 
|---|---|---|
| t_user | uid, loginname, loginpass, email, status, activationCode | 存储用户信息 | 
| t_category | cid, name, pid, desc, orderBy | 存储书籍分类信息 | 
| t_admin | adminId, adminname, adminpwd | 存储管理员用户信息 | 
| t_orderitem | orderitemId, subtotal, bid, bname, currPrice, image_b, oid | 存储订单中的书籍详情 | 
| t_order | oid, ordertime, total, status, uid | 存储订单信息 | 
| t_cartitem | cartitemId, quantity, bid, uid, orderBy | 存储购物车中的书籍 | 
| t_book | bid, bname, author, price, currPrice, discount, press, publishtime, edition, pageNum, wordNum, printtime, booksize, cid, image_w, image_b, orderBy | 存储书籍信息 | 

实现
在第一次冲刺中,我们实现了以下关键组件
用户管理
- 功能:
- 注册:用户可以通过输入用户名、邮箱和密码创建账户。
- 登录:用户使用凭证登录系统,系统通过会话(session)或 cookie 管理用户状态。
 
java
public class AdminServlet extends BaseServlet {
    private AdminService adminService = new AdminService();
    
    /**
     * 登录功能
     */
    public String login(HttpServletRequest req, HttpServletResponse resp)
          throws ServletException, IOException {
       Admin form = CommonUtils.toBean(req.getParameterMap(), Admin.class);
       Admin admin = adminService.login(form);
       if(admin == null) {
          req.setAttribute("msg", "用户名或密码错误!");
          return "/adminjsps/login.jsp";
       }
       req.getSession().setAttribute("admin", admin);
       return "r:/adminjsps/admin/index.jsp";
    }
}
/**
	 * 注册功能
	 * @param user
	 */
	public void regist(User user) {
		user.setUid(CommonUtils.uuid());
		user.setStatus(false);
		user.setActivationCode(CommonUtils.uuid() + CommonUtils.uuid());
		try {
			userDao.add(user);
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
		Properties prop = new Properties();
		try {
			prop.load(this.getClass().getClassLoader().getResourceAsStream("email_template.properties"));
		} catch (IOException e1) {
			throw new RuntimeException(e1);
		}
		String host = prop.getProperty("host");//服务器主机名
		String name = prop.getProperty("username");//登录名
		String pass = prop.getProperty("password");//登录密码
		Session session = MailUtils.createSession(host, name, pass);
		String from = prop.getProperty("from");
		String to = user.getEmail();
		String subject = prop.getProperty("subject");
		String content = MessageFormat.format(prop.getProperty("content"), user.getActivationCode());
		Mail mail = new Mail(from, to, subject, content);
		try {
			MailUtils.send(session, mail);
		} catch (MessagingException e) {
			throw new RuntimeException(e);
		} catch (IOException e) {
			throw new RuntimeException(e);
		}
	}
书籍管理
- 功能:
- 
浏览:支持分页显示书籍列表。 
- 
搜索:用户可以通过关键词搜索书籍,。 
- 
详情:每个书籍都有显示标题、作者、价格和描述。 javapublic class BookServlet extends BaseServlet { private BookService bookService = new BookService(); /** * 获取当前页码 */ private int getPc(HttpServletRequest req) { int pc = 1; String param = req.getParameter("pc"); if(param != null && !param.trim().isEmpty()) { try { pc = Integer.parseInt(param); } catch(RuntimeException e) {} } return pc; } /** * 按bid查询 */ public String load(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String bid = req.getParameter("bid");//获取链接的参数bid Book book = bookService.load(bid);//通过bid得到book对象 req.setAttribute("book", book);//保存到req中 return "f:/jsps/book/desc.jsp";//转发到desc.jsp } /** * 按分类查 */ public String findByCategory(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int pc = getPc(req); String url = getUrl(req); String cid = req.getParameter("cid"); PageBean<Book> pb = bookService.findByCategory(cid, pc); pb.setUrl(url); req.setAttribute("pb", pb); return "f:/jsps/book/list.jsp"; } /** * 按作者查 */ public String findByAuthor(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int pc = getPc(req); String url = getUrl(req); String author = req.getParameter("author"); PageBean<Book> pb = bookService.findByAuthor(author, pc); pb.setUrl(url); req.setAttribute("pb", pb); return "f:/jsps/book/list.jsp"; } /** * 按出版社查询 */ public String findByPress(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int pc = getPc(req); String url = getUrl(req); String press = req.getParameter("press"); PageBean<Book> pb = bookService.findByPress(press, pc); pb.setUrl(url); req.setAttribute("pb", pb); return "f:/jsps/book/list.jsp"; } /** * 按图名查 */ public String findByBname(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { int pc = getPc(req); String url = getUrl(req); String bname = req.getParameter("bname"); PageBean<Book> pb = bookService.findByBname(bname, pc); pb.setUrl(url); req.setAttribute("pb", pb); return "f:/jsps/book/list.jsp"; } }
 
- 
购物车管理
- 
功能 - 添加到购物车:用户可以将书籍添加到购物车。
- 查看购物车:显示购物车中的书籍及其数量。
- 更新购物车:用户可以调整书籍数量或删除书籍。
 javapublic class CartItemServlet extends BaseServlet { private CartItemService cartItemService = new CartItemService(); /** * 加载多个CartItem */ public String loadCartItems(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String cartItemIds = req.getParameter("cartItemIds"); double total = Double.parseDouble(req.getParameter("total")); List<CartItem> cartItemList = cartItemService.loadCartItems(cartItemIds); req.setAttribute("cartItemList", cartItemList); req.setAttribute("total", total); req.setAttribute("cartItemIds", cartItemIds); return "f:/jsps/cart/showitem.jsp"; } /** *更新 */ public String updateQuantity(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String cartItemId = req.getParameter("cartItemId"); int quantity = Integer.parseInt(req.getParameter("quantity")); CartItem cartItem = cartItemService.updateQuantity(cartItemId, quantity); StringBuilder sb = new StringBuilder("{"); sb.append("\"quantity\"").append(":").append(cartItem.getQuantity()); sb.append(","); sb.append("\"subtotal\"").append(":").append(cartItem.getSubtotal()); sb.append("}"); resp.getWriter().print(sb); return null; } /** * 批量删除功能 */ public String batchDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String cartItemIds = req.getParameter("cartItemIds"); cartItemService.batchDelete(cartItemIds); return myCart(req, resp); } /** * 添加购物车条目 */ public String add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Map map = req.getParameterMap(); CartItem cartItem = CommonUtils.toBean(map, CartItem.class); Book book = CommonUtils.toBean(map, Book.class); User user = (User)req.getSession().getAttribute("sessionUser"); cartItem.setBook(book); cartItem.setUser(user); cartItemService.add(cartItem); return myCart(req, resp); } /** * 我的购物车 */ public String myCart(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { User user = (User)req.getSession().getAttribute("sessionUser"); String uid = user.getUid(); List<CartItem> cartItemLIst = cartItemService.myCart(uid); req.setAttribute("cartItemList", cartItemLIst); return "f:/jsps/cart/list.jsp"; } }
管理员功能
- 
功能: - 添加删除书籍:管理员可以输入书籍信息并保存和删除。
 javapublic class AdminBookServlet extends BaseServlet { private BookService bookService = new BookService(); private CategoryService categoryService = new CategoryService(); /** * 删除图书 */ public String delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String bid = req.getParameter("bid"); /** * 修改图书 */ public String edit(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { Map map = req.getParameterMap(); Book book = CommonUtils.toBean(map, Book.class); Category category = CommonUtils.toBean(map, Category.class); book.setCategory(category); bookService.edit(book); req.setAttribute("msg", "修改图书成功!"); return "f:/adminjsps/msg.jsp"; } /** * 加载图书 */ public String load(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String bid = req.getParameter("bid"); Book book = bookService.load(bid); req.setAttribute("book", book); req.setAttribute("parents", categoryService.findParents()); String pid = book.getCategory().getParent().getCid(); req.setAttribute("children", categoryService.findChildren(pid)); return "f:/adminjsps/admin/book/desc.jsp"; } /** * 添加图书 */ public String addPre(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List<Category> parents = categoryService.findParents(); req.setAttribute("parents", parents); return "f:/adminjsps/admin/book/add.jsp"; } }
总结
第一次冲刺成功地为网上购书系统建立了坚实的基础。我们实现了核心功能,包括用户注册、登录、书籍浏览、购物车管理、以及基本的管理员功能。但仍有许多改进和扩展的空间。
 
                    
                
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号