Java web 2022跟学尚硅谷(九)书城项目

news2024/11/24 5:45:55

Java web 2022跟学尚硅谷九书城项目

  • 需求分析
  • 数据库设计ER图
  • 书城1.0简单部署项目
    • 类图
    • 相关代码
      • UserController
      • UserDAOImpl
      • UserDAO
      • Book
      • CartItem
      • Order
      • OrderItem
      • User
      • UserServiceImpl
      • UserService
      • applicationContext.xml
    • 书城1.1
      • 实现功能
        • 1. 用户登录
        • 2. 首页图书列表展示
        • 3. 首页价格筛选
        • 4. 添加购物车
        • 5.购物车中加减物品数量
        • 6.购物车结算创建订单
        • 7.添加过滤器,过滤未登录用户
          • SessionFilter
  • 总结

需求分析

  1. 需求分析
  2. 数据库设计
    1) 实体分析
  • 图书 Book
  • 用户 User
  • 订单 OrderBean
  • 订单详情 OrderItem
  • 购物车项 CartItem
    2) 实体属性分析
  • 图书 : 书名、作者、价格、销量、库存、封面、状态
  • 用户 : 用户名、密码、邮箱
  • 订单 : 订单编号、订单日期、订单金额、订单数量、订单状态、用户
  • 订单详情 : 图书、数量、所属订单
  • 购物车项 : 图书、数量、所属用户

数据库设计ER图

数据库设计-ER图

书城1.0简单部署项目

类图

类图

相关代码

UserController

package com.atguigu.book.controller;

import com.atguigu.book.pojo.User;
import com.atguigu.book.service.UserService;
import com.atguigu.book.service.impl.UserServiceImpl;

/**
 * @ClassName: UserController
 * @Description:
 * @Author: wty
 * @Date: 2022/12/12
 */

public class UserController {
    private UserService userService;

    public String login(String uname, String pwd) {
        User user = userService.login(uname, pwd);
        System.out.println("user = " + user);
        return "index";
    }
}

UserDAOImpl

package com.atguigu.book.dao.impl;

import com.atguigu.book.dao.UserDAO;
import com.atguigu.book.pojo.User;
import com.atguigu.myssm.basedao.BaseDAO;

/**
 * @ClassName: UserDAOImpl
 * @Description:
 * @Author: wty
 * @Date: 2022/12/12
 */

public class UserDAOImpl extends BaseDAO<User> implements UserDAO {
    /**
     * @param
     * @return com.atguigu.book.pojo.User
     * @description //验证用户登录
     * @param: uname
     * @param: pwd
     * @date 2022/12/12 19:37
     * @author wty
     **/
    @Override
    public User getUser(String uname, String pwd) {
        String sqlStr = "SELECT * FROM bookdb.`t_user` a WHERE a.`uname` = ? AND a.`pwd` = ?";
        return load(sqlStr, uname, pwd);
    }
}

UserDAO

package com.atguigu.book.dao;

import com.atguigu.book.pojo.User;

/**
 * @InterfaceName: UserDAO
 * @Description:
 * @Author: wty
 * @Date: 2022/12/12
 */

public interface UserDAO {
    /**
     * @description //验证用户登录
     *
     * @param
     * @param: uname
     * @param: pwd
     * @return com.atguigu.book.pojo.User
     * @date 2022/12/12 19:37
     * @author wty
     **/
    public User getUser(String uname,String pwd);
}

Book

package com.atguigu.book.pojo;

/**
 * @ClassName: Book
 * @Description:
 * @Author: wty
 * @Date: 2022/12/12
 */

public class Book {
    private Integer id;
    private String bookImg;
    private String bookName;
    private Double price;
    private String author;
    private Integer saleCount;
    private Integer bookCount;
    private Integer bookStatus = 0;

    public Book() {

    }

    public Book(Integer id) {
        this.id = id;
    }

    public Integer getBookStatus() {
        return bookStatus;
    }

    public void setBookStatus(Integer bookStatus) {
        this.bookStatus = bookStatus;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getBookImg() {
        return bookImg;
    }

    public void setBookImg(String bookImg) {
        this.bookImg = bookImg;
    }

    public String getBookName() {
        return bookName;
    }

    public void setBookName(String bookName) {
        this.bookName = bookName;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public Integer getSaleCount() {
        return saleCount;
    }

    public void setSaleCount(Integer saleCount) {
        this.saleCount = saleCount;
    }

    public Integer getBookCount() {
        return bookCount;
    }

    public void setBookCount(Integer bookCount) {
        this.bookCount = bookCount;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", bookImg='" + bookImg + '\'' +
                ", bookName='" + bookName + '\'' +
                ", price=" + price +
                ", author='" + author + '\'' +
                ", saleCount=" + saleCount +
                ", bookCount=" + bookCount +
                '}';
    }
}

CartItem

package com.atguigu.book.pojo;

/**
 * @ClassName: CartItem
 * @Description: 购物车项目 还需要一个Cart类表示购物车实体
 * @Author: wty
 * @Date: 2022/12/12
 */

public class CartItem {
    private Integer id;
    private Book book;
    private Integer buyCount;
    private User userBean;

    public CartItem() {
    }

    public CartItem(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Book getBook() {
        return book;
    }

    public void setBook(Book book) {
        this.book = book;
    }

    public Integer getBuyCount() {
        return buyCount;
    }

    public void setBuyCount(Integer buyCount) {
        this.buyCount = buyCount;
    }

    public User getUserBean() {
        return userBean;
    }

    public void setUserBean(User userBean) {
        this.userBean = userBean;
    }
}

Order

package com.atguigu.book.pojo;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

/**
 * @ClassName: Order
 * @Description:
 * @Author: wty
 * @Date: 2022/12/12
 */

public class Order {
    private Integer id;
    private String orderNo;
    private Date orderDate;
    private User orderUser;
    private Double orderMoney;
    private Integer orderStatus;

    /**
     * 订单 : 订单详情 = 1 : N
     */
    private List<OrderItem> orderItem;

    public Order() {
    }

    public Order(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getOrderNo() {
        return orderNo;
    }

    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }

    public Date getOrderDate() {
        return orderDate;
    }

    public void setOrderDate(Date orderDate) {
        this.orderDate = orderDate;
    }

    public Double getOrderMoney() {
        return orderMoney;
    }

    public void setOrderMoney(Double orderMoney) {
        this.orderMoney = orderMoney;
    }

    public Integer getOrderStatus() {
        return orderStatus;
    }

    public void setOrderStatus(Integer orderStatus) {
        this.orderStatus = orderStatus;
    }
}

OrderItem

package com.atguigu.book.pojo;

/**
 * @ClassName: OrderItem
 * @Description:订单详情
 * @Author: wty
 * @Date: 2022/12/12
 */

public class OrderItem {
    private Integer id;
    private Book book;
    private Order orderBean;
    private Integer buyCount;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Book getBook() {
        return book;
    }

    public void setBook(Book book) {
        this.book = book;
    }

    public Order getOrderBean() {
        return orderBean;
    }

    public void setOrderBean(Order orderBean) {
        this.orderBean = orderBean;
    }

    public Integer getBuyCount() {
        return buyCount;
    }

    public void setBuyCount(Integer buyCount) {
        this.buyCount = buyCount;
    }

    public OrderItem() {
    }

    public OrderItem(Integer id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return "OrderItem{" +
                "id=" + id +
                ", book=" + book +
                ", orderBean=" + orderBean +
                ", buyCount=" + buyCount +
                '}';
    }
}

User

package com.atguigu.book.pojo;

/**
 * @ClassName: User
 * @Description:
 * @Author: wty
 * @Date: 2022/12/12
 */

public class User {
    private Integer id;
    private String uname;
    private String pwd;
    private String email;
    private Integer role;
    public User(){}

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getRole() {
        return role;
    }

    public void setRole(Integer role) {
        this.role = role;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", uname='" + uname + '\'' +
                ", pwd='" + pwd + '\'' +
                ", email='" + email + '\'' +
                ", role=" + role +
                '}';
    }
}

UserServiceImpl

package com.atguigu.book.service.impl;

import com.atguigu.book.dao.UserDAO;
import com.atguigu.book.dao.impl.UserDAOImpl;
import com.atguigu.book.pojo.User;
import com.atguigu.book.service.UserService;

/**
 * @ClassName: UserServiceImpl
 * @Description:
 * @Author: wty
 * @Date: 2022/12/12
 */

public class UserServiceImpl implements UserService {
    private UserDAO userDAO;

    /**
     * @param
     * @return com.atguigu.book.pojo.User
     * @description //用户注册
     * @param: uname
     * @param: pwd
     * @date 2022/12/12 19:52
     * @author wty
     **/
    @Override
    public User login(String uname, String pwd) {
        return userDAO.getUser(uname, pwd);
    }
}

UserService

package com.atguigu.book.service;

import com.atguigu.book.pojo.User;

/**
 * @InterfaceName: UserService
 * @Description:
 * @Author: wty
 * @Date: 2022/12/12
 */

public interface UserService {
    public User login(String uname, String pwd);

}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE beans [
        <!ELEMENT beans (bean*)>
        <!ELEMENT bean (property*)>
        <!ELEMENT property (#PCDATA)>

        <!ATTLIST bean id ID #REQUIRED>
        <!ATTLIST bean class CDATA #IMPLIED>
        <!ATTLIST property name CDATA #IMPLIED>
        <!ATTLIST property ref IDREF #IMPLIED>
        ]>

<beans>
    <!-- DAO -->
    <bean id="userDAO" class="com.atguigu.book.dao.impl.UserDAOImpl"></bean>

    <!-- ServiceImpl -->
    <bean id="userService" class="com.atguigu.book.service.impl.UserServiceImpl">
        <property name="userDAO" ref="userDAO"></property>
    </bean>

    <!-- Controller -->
    <bean id="page" class="com.atguigu.myssm.myspringmvc.PageController"></bean>
    <bean id="user" class="com.atguigu.book.controller.UserController">
        <property name="userService" ref="userService"></property>
    </bean>
</beans>
        <!--
        1.概念
        HTML 超文本标记语言
        XML 可扩展的标记语言
        HTML 是XML的一个自集

        2.XML包含三个部分
        (1)XML声明,而且声明这一行代码必须在XML文件的第一行
        (2)DTD文档类型定义
        (3)XML正文
        -->

书城1.1

实现功能

1. 用户登录

用户登录

2. 首页图书列表展示

3. 首页价格筛选

首页价格筛选

4. 添加购物车

添加购物车

5.购物车中加减物品数量

购物车中加减物品数量

6.购物车结算创建订单

购物车结算创建订单

7.添加过滤器,过滤未登录用户

添加过滤器,过滤未登录用户

SessionFilter
package com.z_book;

import com.atguigu.book.pojo.User;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

/**
 * @ClassName: SessionFilter
 * @Description:
 * @Author: wty
 * @Date: 2022/12/14
 */
@WebFilter(urlPatterns = {"*.do", "*.html"},
        initParams = {
                @WebInitParam(name = "bai", value = "/pro25/page.do?operate=page&page=user/login,/pro25/user.do?")
        })
public class SessionFilter implements Filter {
    /**
     * 白名单
     */
    private List<String> baiList;

    @Override
    public void init(FilterConfig config) throws ServletException {
        String bai = config.getInitParameter("bai");
        String[] baiArr = bai.split(",");
        baiList = Arrays.asList(baiArr);
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        String url = request.getRequestURI();
        System.out.println("url = " + url);
        String queryString = request.getQueryString();
        System.out.println("queryString =" + queryString);

        String str = "";
        if (null != queryString) {
            str = url + "?" + queryString;
        } else {
            str = url + "?";
        }
        /**
         * 符合白名单的页面不用过滤
         */
        if (baiList.contains(str)) {
            filterChain.doFilter(request, response);
        } else {
            HttpSession session = request.getSession();
            User currUser = (User) session.getAttribute("currUser");

            if (null == currUser) {
                response.sendRedirect("page.do?operate=page&page=user/login");
            } else {
                // 放行
                filterChain.doFilter(request, response);
            }
        }

    }

    @Override
    public void destroy() {

    }
}

总结

今日内容:

  1. 显示主页面(index页面)
  • 新建BookDAO 、 BookDAOImpl : getBookList()
  • 新建BookService 、 BookServiceImpl : getBookList()
  • 新建BookController : index()
  • 编辑index.html
  1. 首页上登录成功之后显示欢迎语和购物车数量
  2. 点击具体图书的添加到购物车按钮
  3. 购物车详情
  4. 结账
    1. 订单表添加一条记录
    2. 订单详情表添加7条记录
    3. 购物车项表中需要删除对应的7条记录
  5. 关于订单信息中的订单数量问题
  6. 编辑购物车
  7. 关于金额的精度问题
  8. 过滤器判断是否是合法用户:
    • 解决方法:新建SessionFilter , 用来判断session中是否保存了currUser

    • 如果没有currUser,表明当前不是一个登录合法的用户,应该跳转到登录页面让其登录

    • 现在添加了过滤器之后,出现了如下错误:
      localhost 将您重定向的次数过多。
      尝试清除 Cookie.
      ERR_TOO_MANY_REDIRECTS

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/89732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue3-ElemenPlu,全栈开发后台系统1-1-2-9第一章,第二章前端系统架构设计

Vue3+ElementPlus Lo2+MongoDB 菜单按钮权限,JWT认证,审批流,常规的CRUD,模块化,组件化 技术栈: 架构设计,vue3全家桶,koa2, 权限: Role-Based A

[附源码]Node.js计算机毕业设计辅导员班级量化管理系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

IMX6启动流程

目录 1. 流程图 2. u-boot.imx的构造 1. 流程图 正常情况下&#xff0c;一台IMX6设备的启动路径就是图中自上而下最左边那条路&#xff1a; 启动/复位后先检查CPU的ID(每颗芯片独一无二) ------> 检查复位状态(有没有按下复位键) ------> 检查boot模式(mmc? USB? SPI…

ARM寄存器组织(常见专用寄存器、控制寄存器CPSR)

目录 一、寄存器的概念 1、什么是寄存器&#xff1f; 2、寄存器的分类 3、不同工作模式下使用的寄存器 二、常见专用寄存器 1、R15&#xff08;PC,Program Counter&#xff09; 2、R14&#xff08;LR,Link Register&#xff09; 3、R13&#xff08;SP,Stack Pointer&am…

FineReport大数据分析工具- 统一切换轮播图表接口

1. 概述 1.1 版本 报表服务器版本 功能变动 11.0 - 1.2 预期效果 某些场景下&#xff0c;需要让一张报表内的多个轮播图表同时切换。那么该如何实现呢&#xff1f;效果如下图所示&#xff1a; 1.3 实现思路 按钮添加点击事件&#xff0c;通过 JS 脚本调用接口统一切换轮播…

【模拟电路】431基准电压源

项目简介 概述 431电压基准芯片为3脚稳压集成电路&#xff0c;431基准电压源具有良好的热稳定性能的&#xff0c;三端可调分流&#xff0c;也被称为电压调解器或三端取样集成电路。凭借体积小、重量轻、精度高、稳定可靠、基准电压精密可调、输出电流大&#xff0c;且价格便宜…

LightDock、PatchDock蛋白蛋白对接软件linux端命令行使用

本文实在ubuntu下操作 DDB1-CRBN.pdb 、brd4.pdb 是需要对接的两个pdb蛋白文件 1、PatchDock 网页版&#xff1a;https://bioinfo3d.cs.tau.ac.il/PatchDock/php.php PatchDock有网页版&#xff0c;如下&#xff1b;软件版需要申请获取下载链接 参考&#xff1a;https://bioi…

QT4.8.7 打开Mupdf

一.Win10环境 1.Win10 Visual Studio 2017 安装 这个直接安装了 a.打开mupdf 源码 b.编译源码 参考这几个贴子 在Qt中调用Mupdf库进行pdf显示 mupdf-1.17.0 源代码编译、下载 qt vc pdf阅读器 我用的是mupdf-1.11-source的&#xff0c;用VS2017打开会有这个问题 c.修改配…

移植MQTT-C库(附源码)

Software (mqtt.org)中mqtt客户端的c库里面有一个叫MQTT-C的库&#xff0c;就2个实现文件&#xff0c;算比较简单的了&#xff0c;实现了基本的mqtt客户端功能&#xff0c;移植一下试试。 我的移植代码放在我的资源里面&#xff1a;https://download.csdn.net/download/oushao…

BigInteger类和BigDecimal类

BigInteger类 BigInteger适合保存比较大的整型 当在编程中遇到需要保存一个特别大的数字&#xff0c;比如地球的人口。 这时如果用long类型保存可能都不够了&#xff0c;此时就需要用到BigInteger BigInteger不能直接*/add()加subtract()减multiply()乘divide()除 使用演示&…

推荐系统学习笔记-论文研读--渐进分层抽取的多任务学习模型

研究背景 多任务相关性的复杂性和竞争性&#xff0c;MTL模型往往会出 现性能退化和负迁移跷跷板现象&#xff0c;即一项任务的性能往往会因影响其他任 务的性能而得到提高 研究成果 跷跷板现象的发现&#xff0c;MTL由于复杂的内在关联性而没有优于相应的单任务模型从联合表…

[附源码]Node.js计算机毕业设计仿咸鱼二手物品交易系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

11月CPI超预期放缓,下一步加息基调且看今晚

随着2022年最后一次美国“通胀报告”的公布&#xff0c;美联储未来政策走向决议将迎来关键时刻&#xff01;12月13日晚&#xff0c;美国劳工部公布的报告显示&#xff0c;美国11月CPI同比增长7.1%&#xff0c;超预期放缓&#xff0c;增速低于预期值7.3%和前值 7.7%。美国11月核…

SSM个人饮食管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 个人饮食管理系统 网站前台&#xff1a;关于我们、联系我们、新闻信息、食谱信息、交流信息 管理员功能&#xff1a; 1、…

JavaScript(四):流程控制

流程控制if语句if else 语句&#xff08;双分支语句&#xff09;if -else if语句&#xff08;多分支语句&#xff09;三元表达式switch语句for循环while循环do while 循环continue关键字break关键字if语句 语法结构 if&#xff08;条件表达式&#xff09;{ //条件成立执行的代…

计算摄影——风格迁移

这一章来总结一下图像风格迁移相关的内容&#xff0c;风格迁移的任务是将一幅图作为内容图&#xff0c;从另外一幅画中抽取艺术风格&#xff0c;两者一起合成新的艺术画&#xff0c;要求合成的作品即保持内容图的主要结构和主体&#xff0c;又能够具有风格图的风格&#xff0c;…

精品spring boot+MySQL新冠物资管理系统vue

《spring bootMySQL新冠物资管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术&#xff1a; 操作系统&#xff1a;Windows 10、Windows 7、Windows 8 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&…

人乳铁蛋白:艾美捷Kamiya ELISA试剂盒解决方案

乳铁蛋白是一个分子量为80 kDa的铁结合糖蛋白&#xff0c;属于转铁蛋白家族 [1] 。乳铁蛋白在初乳和牛奶中含量高&#xff0c;在眼泪、唾液、和支气管分泌物、胆汁和胃肠液等粘膜分泌物中的含量较低。此外&#xff0c;乳铁蛋白也是中性粒细胞的组成成分。 1939年Sorensen等人在…

java计算机毕业设计springboot+vue健康体检信息管理系统

项目介绍 随时代变化,中国作为一个经济发展快速,人口基础较为庞大的国家,健康体检产业发展迅速。健康体检也基本上成为了每家每年必须要考虑的事情。在用户群体的规模如此庞大的基础上,以健康体检为主要内容的行业应运而生,并且随着用户数量的不断增加,其规模也随之不断发展。…

java实现延时处理

业务场景: 1、生成订单30分钟未支付,则自动取消,我们该怎么实现呢? 2、生成订单60秒后,给用户发短信 延时任务和定时任务的区别: 定时任务有明确的触发时间,延时任务没有;定时任务有执行周期,而延时任务在某事件触发后一段时间内执行,没有执行周期;定时任务一般执行的…