Merge pull request 'heyou' (#3) from feature/hy into develop

pull/6/head
p3rwjms7y 3 weeks ago
commit 4d25a2c372

@ -20,62 +20,87 @@ INSERT INTO t_user(username,`password`,email,address) VALUES('admin','admin','ad
## 查询表
SELECT * FROM t_user;
-- 创建名为t_book的表
CREATE TABLE t_book(
`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(100),
`price` DECIMAL(11,2),
`author` VARCHAR(100),
`classification` VARCHAR(20),
`sales` INT,
`stock` INT,
`imgpath` VARCHAR(200)
-- 定义名为id的字段数据类型为INT整数类型将其设置为主键并且设置为自增AUTO_INCREMENT这样每插入一条新记录时该字段的值会自动按顺序递增用于为每本图书生成唯一的标识符
`id` INT PRIMARY KEY AUTO_INCREMENT,
-- 定义名为name的字段数据类型为VARCHAR可变长度字符串长度为100用于存储图书的书名信息
`name` VARCHAR(100),
-- 定义名为price的字段数据类型为DECIMAL精确数值类型总长度为11位其中小数部分占2位用于存储图书的价格信息
`price` DECIMAL(11,2),
-- 定义名为author的字段数据类型为VARCHAR长度为100用来记录图书的作者姓名
`author` VARCHAR(100),
-- 定义名为classification的字段数据类型为VARCHAR长度为20可用于存储图书的分类信息例如文学、科技等类别
`classification` VARCHAR(20),
-- 定义名为sales的字段数据类型为INT用于记录图书的销量情况
`sales` INT,
-- 定义名为stock的字段数据类型为INT用于表示图书的库存数量
`stock` INT,
-- 定义名为imgpath的字段数据类型为VARCHAR长度为200可用于存储图书封面图片的路径信息方便在应用中展示图书封面图片
`imgpath` VARCHAR(200)
);
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('解忧杂货店','东野圭吾','文学',27.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('边城','沈从文','文学',23.00,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('中国哲学史','冯友兰','文学',44.5,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('苏东坡传','林语堂','文学',19.30,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('百年孤独','马尔克斯','文学',29.50,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('扶桑','严歌苓','文学',19.8,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('给孩子的诗','北岛','文学',22.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('为奴十二年','所罗门','文学',16.5,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('平凡的世界','路遥','文学',55.00,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('悟空传','今何在','文学',14.00,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('硬派健身','斌卡','文学',31.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('从晚清到民国','唐德刚','文学',39.90,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('三体','刘慈欣','文学',56.5,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('看见','柴静','文学',19.50,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('活着','余华','文学',11.00,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('小王子','安托万','文学',19.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('我们仨','杨绛','文学',11.30,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification,price, sales , stock , imgpath) VALUES('生命不息,折腾不止','罗永浩','文学',25.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification,price, sales , stock , imgpath) VALUES('皮囊','蔡崇达','文学',23.90,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('恰到好处的幸福','毕淑敏','文学',16.40,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('大数据预测','埃里克','文学',37.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('人月神话','布鲁克斯','文学',55.90,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('C语言入门经典','霍尔顿','文学',45.00,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('数学之美','吴军','文学',29.90,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('Java编程思想','埃史尔','文学',70.50,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('设计模式之禅','秦小波','文学',20.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('图解机器学习','杉山将','文学',33.80,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('艾伦图灵传','安德鲁','文学',47.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales , stock , imgpath) VALUES('教父','马里奥普佐','文学',29.00,100,100,'static/img/default.jpg');
-- 向t_book表中插入一条图书数据记录指定要插入值的字段为name, author, classification, price, sales, stock, imgpath并对应给出具体的值分别为图书的书名、作者、分类、价格、销量、库存以及封面图片路径
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('解忧杂货店','东野圭吾','文学',27.20,100,100,'static/img/default.jpg');
-- 同样是向t_book表中插入图书数据记录以下每条INSERT语句的结构和作用与上面类似只是对应不同的图书信息
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('边城','沈从文','文学',23.00,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('中国哲学史','冯友兰','文学',44.5,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('苏东坡传','林语堂','文学',19.30,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('百年孤独','马尔克斯','文学',29.50,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('扶桑','严歌苓','文学',19.8,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('给孩子的诗','北岛','文学',22.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('为奴十二年','所罗门','文学',16.5,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('平凡的世界','路遥','文学',55.00,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('悟空传','今何在','文学',14.00,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('硬派健身','斌卡','文学',31.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('从晚清到民国','唐德刚','文学',39.90,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('三体','刘慈欣','文学',56.5,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('看见','柴静','文学',19.50,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('活着','余华','文学',11.00,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('小王子','安托万','文学',19.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('我们仨','杨绛','文学',11.30,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification,price, sales, stock, imgpath) VALUES('生命不息,折腾不止','罗永浩','文学',25.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification,price, sales, stock, imgpath) VALUES('皮囊','蔡崇达','文学',23.90,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('恰到好处的幸福','毕淑敏','文学',16.40,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('大数据预测','埃里克','文学',37.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('人月神话','布鲁克斯','文学',55.90,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('C语言入门经典','霍尔顿','文学',45.00,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('数学之美','吴军','文学',29.90,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('Java编程思想','埃史尔','文学',70.50,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('设计模式之禅','秦小波','文学',20.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('图解机器学习','杉山将','文学',33.80,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('艾伦图灵传','安德鲁','文学',47.20,100,100,'static/img/default.jpg');
INSERT INTO t_book (name, author, classification, price, sales, stock, imgpath) VALUES('教父','马里奥普佐','文学',29.00,100,100,'static/img/default.jpg');
-- 创建名为t_order的表
CREATE TABLE t_order(
`order_id` VARCHAR(50) PRIMARY KEY,
`create_time` DATETIME,
`price` DECIMAL(11,2),
`status` INT,
`user_id` INT,
FOREIGN KEY(`user_id`) REFERENCES t_user(`id`)
-- 定义名为order_id的字段数据类型为VARCHAR可变长度字符串长度为50并且将该字段设置为主键用于唯一标识每条订单记录
`order_id` VARCHAR(50) PRIMARY KEY,
-- 定义名为create_time的字段数据类型为DATETIME用于存储日期和时间信息用来记录订单创建的时间
`create_time` DATETIME,
-- 定义名为price的字段数据类型为DECIMAL精确数值类型总长度为11位其中小数部分占2位用于存储订单的价格信息
`price` DECIMAL(11,2),
-- 定义名为status的字段数据类型为INT整数类型可能用于表示订单的状态比如不同的数值对应不同的订单处理阶段等情况
`status` INT,
-- 定义名为user_id的字段数据类型为INT该字段将作为外键与另一个表t_user中的id字段建立关联关系
`user_id` INT,
-- 使用FOREIGN KEY关键字为user_id字段添加外键约束指定它参照t_user表中的id字段意味着t_order表中的user_id值必须在t_user表的id字段值中存在以此建立起两张表之间的关联通常表示订单所属的用户
FOREIGN KEY(`user_id`) REFERENCES t_user(`id`)
);
-- 创建名为t_order_item的表
CREATE TABLE t_order_item(
`id` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(100),
`count` INT,
`price` DECIMAL(11,2),
`total_price` DECIMAL(11,2),
`order_id` VARCHAR(50),
FOREIGN KEY(`order_id`) REFERENCES t_order(`order_id`)
-- 定义名为id的字段数据类型为INT整数类型并将该字段设置为主键同时设置为自增AUTO_INCREMENT这样每当插入一条新记录时该字段的值会自动按顺序递增常用于为每条记录生成唯一的标识符
`id` INT PRIMARY KEY AUTO_INCREMENT,
-- 定义名为name的字段数据类型为VARCHAR长度为100可用于存储商品名称等相关信息比如订单中具体商品的名字
`name` VARCHAR(100),
-- 定义名为count的字段数据类型为INT用于记录商品的数量比如某个商品在该订单中的购买数量
`count` INT,
-- 定义名为price的字段数据类型为DECIMAL总长度11位小数部分占2位可能用于存储单个商品的价格信息
`price` DECIMAL(11,2),
-- 定义名为total_price的字段数据类型为DECIMAL总长度11位小数部分占2位用于存储该商品的总价可能是通过商品单价乘以数量计算得出
`total_price` DECIMAL(11,2),
-- 定义名为order_id的字段数据类型为VARCHAR长度为50该字段将作为外键与t_order表中的order_id字段建立关联关系
`order_id` VARCHAR(50),
-- 使用FOREIGN KEY关键字为order_id字段添加外键约束指定它参照t_order表中的order_id字段意味着t_order_item表中的order_id值必须在t_order表的order_id字段值中存在以此建立起两张表之间的关联表明该订单项所属的订单
FOREIGN KEY(`order_id`) REFERENCES t_order(`order_id`)
);

@ -5,88 +5,176 @@ import java.math.BigDecimal;
/**
* @author yj
* @create 2020-10-02 19:51
*
* BookID
*/
public class Book {
private Integer id;//id
private String name;//姓名
private String author;//作者
// 书籍的唯一标识符
private Integer id;
// 书籍的名称
private String name;
// 书籍的作者
private String author;
// 书籍的价格使用BigDecimal类型以确保精度
private BigDecimal price;
// 书籍的销量
private Integer sales;
// 书籍的库存数量
private Integer stock;
// 书籍的分类
private String classification;
private String imgPath="static/img/default.jpg";
// 书籍的图片路径,默认值为"static/img/default.jpg"
private String imgPath = "static/img/default.jpg";
/**
*
* @return
*/
public String getClassification() {
return classification;
}
/**
*
* @param classification
*/
public void setClassification(String classification) {
this.classification = classification;
}
/**
* ID
* @return ID
*/
public Integer getId() {
return id;
}
/**
* ID
* @param id ID
*/
public void setId(Integer id) {
this.id = id;
}
/**
*
* @return
*/
public String getName() {
return name;
}
/**
*
* @param name
*/
public void setName(String name) {
this.name = name;
}
/**
*
* @return
*/
public String getAuthor() {
return author;
}
/**
*
* @param author
*/
public void setAuthor(String author) {
this.author = author;
}
/**
*
* @return
*/
public BigDecimal getPrice() {
return price;
}
/**
*
* @param price
*/
public void setPrice(BigDecimal price) {
this.price = price;
}
/**
*
* @return
*/
public Integer getSales() {
return sales;
}
/**
*
* @param sales
*/
public void setSales(Integer sales) {
this.sales = sales;
}
/**
*
* 00
* @return
*/
public Integer getStock() {
if(stock<0) stock=0;return stock;
if (stock < 0) stock = 0;
return stock;
}
/**
*
* 00
* @param stock
*/
public void setStock(Integer stock) {
if(stock<0) stock=0;
if (stock < 0) stock = 0;
this.stock = stock;
}
/**
*
* @return
*/
public String getImgPath() {
return imgPath;
}
/**
*
* null使"static/img/default.jpg"
* @param imgPath
*/
public void setImgPath(String imgPath) {
if(imgPath==null||"".equals(imgPath)) {
if (imgPath == null || "".equals(imgPath)) {
this.imgPath = "static/img/default.jpg";
} else {
this.imgPath = imgPath;
}
}
/**
* toString
* @return
*/
@Override
public String toString() {
return "Book{" +
@ -101,9 +189,23 @@ public class Book {
'}';
}
/**
*
*/
public Book() {
}
/**
*
* @param id ID
* @param name
* @param author
* @param price
* @param sales
* @param stock
* @param classification
* @param imgPath
*/
public Book(Integer id, String name, String author, BigDecimal price, Integer sales, Integer stock, String classification, String imgPath) {
this.id = id;
this.name = name;
@ -114,4 +216,4 @@ public class Book {
this.classification = classification;
this.imgPath = imgPath;
}
}
}

@ -8,34 +8,108 @@ import java.util.List;
/**
* @author yj
* @create 2020-08-23 21:08
*
* BookDao
*/
public interface BookDao {
/**
*
* @param book
* @return 10
*/
public int addBook(Book book);
/**
* ID
* @param id ID
* @return 10
*/
public int deleteBookById(Integer id);
/**
*
* @param book
* @return 10
*/
public int updateBook(Book book);
/**
* ID
* @param id ID
* @return null
*/
public Book queryBookById(Integer id);
/**
*
* @return
*/
public List<Book> queryBooks();
/**
*
* @return
*/
Integer queryForPageTotalCount();
/**
*
* @param begin
* @param pageSize
* @return
*/
List<Book> queryForPageItems(int begin, int pageSize);
/**
*
* @param min
* @param max
* @return
*/
Integer queryForPageTotalCountByPrice(int min, int max);
/**
*
* @param begin
* @param pageSize
* @param min
* @param max
* @return
*/
List<Book> queryForPageItemsByPrice(int begin, int pageSize, int min, int max);
/**
*
* @param nameorauthor
* @return
*/
Integer queryForPageTotalCountByNameOrAuthor(String nameorauthor);
/**
*
* @param begin
* @param pageSize
* @param nameorauthor
* @return
*/
List<Book> queryForPageItemsByNameOrAuthor(int begin, int pageSize, String nameorauthor);
/**
*
* @return
*/
List<Book> queryForPageItemsOrder();
/**
*
* @return
*/
BigDecimal queryTotalMoney();
/**
*
* @return
*/
public Integer queryBooknums();
}
}

@ -9,28 +9,84 @@ import java.util.List;
/**
* @author yj
* @create 2020-08-24 14:40
*
* BookService
*/
public interface BookService {
/**
*
* @param book
*/
public void addBook(Book book);
/**
*
* @param book
*/
public void updateBook(Book book);
/**
* ID
* @param id ID
*/
public void deleteBookById(Integer id);
/**
* ID
* @param id ID
* @return null
*/
public Book queryBookById(Integer id);
/**
*
* @return
*/
public List<Book> queryBooks();
/**
*
* @param pageNo
* @param pageSize
* @return
*/
Page<Book> page(int pageNo, int pageSize);
/**
*
* @param pageNo
* @param pageSize
* @param min
* @param max
* @return
*/
Page<Book> pageByPrice(int pageNo, int pageSize, int min, int max);
/**
*
* @param pageNo
* @param pageSize
* @param nameOrAuthor
* @return
*/
Page<Book> pageByNameOrAuthor(int pageNo, int pageSize, String nameOrAuthor);
/**
*
* @return
*/
Page<Book> pageOrder();
/**
*
* @return
*/
public Integer queryTotalBooks();
/**
*
* @return
*/
BigDecimal queryTotalMoney();
}
}

@ -10,59 +10,102 @@ import java.math.BigDecimal;
/**
* @author yj
* @create 2020-08-24 11:01
*
* BookDaoTestBookDaoBookDaoImpl
* JUnit
*/
public class BookDaoTest {
// 创建BookDao接口的实现类BookDaoImpl对象
BookDao bookDao = new BookDaoImpl();
/**
*
*/
@Test
public void addBook() {
//`name`,`author`,`classification`,`price`,`sales`,`stock`,`img_path`
//Integer id, String name, String author, BigDecimal price, Integer sales, Integer stock, String classification, String imgPath)
bookDao.addBook(new Book(null,"舌的中国","yjjj",new BigDecimal("5"),100,23,"",""));
// 创建一个新的Book对象并调用addBook方法将其添加到数据库中
bookDao.addBook(new Book(null, "舌的中国", "yjjj", new BigDecimal("5"), 100, 23, "", ""));
}
/**
*
*/
@Test
public void deleteBook() {
// 调用deleteBookById方法删除ID为3的书籍
bookDao.deleteBookById(3);
}
/**
* ID
*/
@Test
public void queryById() {
// 调用queryBookById方法查询ID为64的书籍并打印结果
System.out.println(bookDao.queryBookById(64));
}
/**
*
*/
@Test
public void update() {
bookDao.updateBook(new Book(35,"舌尖的中国","yj",new BigDecimal("5"),100,23,"文学",""));
// 创建一个新的Book对象并调用updateBook方法更新ID为35的书籍信息
bookDao.updateBook(new Book(35, "舌尖的中国", "yj", new BigDecimal("5"), 100, 23, "文学", ""));
}
/**
*
*/
@Test
public void queryList() {
// 调用queryBooks方法查询所有书籍并打印结果
System.out.println(bookDao.queryBooks());
}
/**
*
*/
@Test
public void queryForPageTotalCount() {
// 调用queryForPageTotalCount方法查询所有书籍的总记录数并打印结果
System.out.println(bookDao.queryForPageTotalCount());
}
/**
*
*/
@Test
public void queryForPageItems() {
System.out.println(bookDao.queryForPageItems(1,4));
// 调用queryForPageItems方法分页查询书籍并打印结果
System.out.println(bookDao.queryForPageItems(1, 4));
}
/**
*
*/
@Test
public void queryForPageTotalCountByPrice() {
System.out.println(bookDao.queryForPageTotalCountByPrice(10,50));
// 调用queryForPageTotalCountByPrice方法查询价格在10到50之间的书籍总记录数并打印结果
System.out.println(bookDao.queryForPageTotalCountByPrice(10, 50));
}
/**
*
*/
@Test
public void queryForPageItemsByPrice() {
System.out.println(bookDao.queryForPageItemsByPrice(1,4,10,50));
// 调用queryForPageItemsByPrice方法根据价格范围分页查询书籍并打印结果
System.out.println(bookDao.queryForPageItemsByPrice(1, 4, 10, 50));
}
/**
*
*/
@Test
public void queryBooknums() {
// 调用queryBooknums方法查询书籍的总数量并打印结果
System.out.println(bookDao.queryBooknums());
}
}
}

@ -12,43 +12,78 @@ import java.math.BigDecimal;
/**
* @author yj
* @create 2020-08-24 14:57
*
* BookServiceTestBookServiceBookServiceImpl
* JUnit
*/
public class BookServiceTest {
// 创建BookDao接口的实现类BookDaoImpl对象
private BookDao bookDao = new BookDaoImpl();
// 创建BookService接口的实现类BookServiceImpl对象
private BookService bookService = new BookServiceImpl();
/**
*
*/
@Test
public void addBook() {
bookDao.addBook(new Book(null,"舌尖上的中国","yj",new BigDecimal("5"),100,23,"文学",""));
// 创建一个新的Book对象并调用addBook方法将其添加到数据库中
bookDao.addBook(new Book(null, "舌尖上的中国", "yj", new BigDecimal("5"), 100, 23, "文学", ""));
}
/**
*
*/
@Test
public void updateBook() {
bookDao.updateBook(new Book(null,"舌尖上的中国","yj",new BigDecimal("5"),100,23,"文学",""));
// 创建一个新的Book对象并调用updateBook方法更新书籍信息
bookDao.updateBook(new Book(null, "舌尖上的中国", "yj", new BigDecimal("5"), 100, 23, "文学", ""));
}
/**
* ID
*/
@Test
public void deleteBookById() {
// 调用deleteBookById方法删除ID为25的书籍并打印受影响的行数
System.out.println(bookDao.deleteBookById(25));
}
/**
* ID
*/
@Test
public void queryBookById() {
// 调用queryBookById方法查询ID为23的书籍并打印结果
System.out.println(bookDao.queryBookById(23));
}
/**
*
*/
@Test
public void queryBooks() {
// 调用queryBooks方法查询所有书籍并打印结果
System.out.println(bookDao.queryBooks());
}
/**
*
*/
@Test
public void page() {
// 调用queryForPageTotalCount方法查询所有书籍的总记录数并打印结果
System.out.println(bookDao.queryForPageTotalCount());
}
/**
*
*/
@Test
public void queryTotalMoney() {
// 调用queryTotalMoney方法查询所有书籍的总金额并打印结果
System.out.println(bookDao.queryTotalMoney());
}
}

@ -10,26 +10,54 @@ import java.lang.reflect.Method;
/**
* @author yj
* @create 2020-08-23 16:51
*
* BaseServletServletServlet
* ServletdoGetdoPost
*/
public abstract class BaseServlet extends HttpServlet {
/**
* GETdoPost
* @param req HttpServletRequest
* @param resp HttpServletResponse
* @throws ServletException
* @throws IOException
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
doPost(req, resp);
}
/**
* POST
* @param req HttpServletRequest
* @param resp HttpServletResponse
* @throws ServletException
* @throws IOException
*/
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决post请求中文乱码
// 解决POST请求中文乱码问题
req.setCharacterEncoding("utf-8");
//解决相应的中文乱码
// 解决响应的中文乱码问题
resp.setContentType("text/html;charset=UTF-8");
// 获取请求参数action该参数用于指定要调用的方法名
String action = req.getParameter("action");
try {
Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class,HttpServletResponse.class);
method.invoke(this,req,resp);
// 通过反射获取当前类中指定名称的方法
Method method = this.getClass().getDeclaredMethod(action, HttpServletRequest.class, HttpServletResponse.class);
// 调用方法,传入请求和响应对象
method.invoke(this, req, resp);
} catch (Exception e) {
// 捕获异常并打印堆栈信息
e.printStackTrace();
// 将异常包装为运行时异常抛出,便于上层处理
throw new RuntimeException(e);
}
}
}
}

@ -15,72 +15,137 @@ import java.util.List;
/**
* @author yj
* @create 2020-08-24 15:25
*
* BookServletBaseServlet
* BookServiceBookServiceImpl
*/
public class BookServlet extends BaseServlet {
// 创建BookService接口的实现类BookServiceImpl对象
private BookService bookService = new BookServiceImpl();
/**
*
* @param req HttpServletRequest
* @param resp HttpServletResponse
* @throws ServletException
* @throws IOException
*/
protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int pageNo = WebUtils.parseInt(req.getParameter("pageNo"),0);
pageNo+=1;
Book book = (Book) WebUtils.copyParamToBean(req.getParameterMap(),new Book());
// 获取当前页码默认从0开始
int pageNo = WebUtils.parseInt(req.getParameter("pageNo"), 0);
// 页码加1表示添加书籍后跳转到下一页
pageNo += 1;
// 将请求参数封装到Book对象中
Book book = (Book) WebUtils.copyParamToBean(req.getParameterMap(), new Book());
// 调用BookService的addBook方法添加书籍
bookService.addBook(book);
//req.getRequestDispatcher("/manager/bookServlet?action=list").forward(req,resp);
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNo="+pageNo);
}
// 重定向到书籍管理页面,并跳转到添加书籍后的页码
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNo=" + pageNo);
}
/**
*
* @param req HttpServletRequest
* @param resp HttpServletResponse
* @throws ServletException
* @throws IOException
*/
protected void delete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String id = req.getParameter("id");
int i = Integer.parseInt(id);
bookService.deleteBookById(i);
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNo="+req.getParameter("pageNo"));
}
// 获取要删除的书籍ID
String id = req.getParameter("id");
int i = Integer.parseInt(id);
// 调用BookService的deleteBookById方法删除书籍
bookService.deleteBookById(i);
// 重定向到书籍管理页面,并保持当前页码
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNo=" + req.getParameter("pageNo"));
}
/**
*
* @param req HttpServletRequest
* @param resp HttpServletResponse
* @throws ServletException
* @throws IOException
*/
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Book book = (Book) WebUtils.copyParamToBean(req.getParameterMap(),new Book());
// 将请求参数封装到Book对象中
Book book = (Book) WebUtils.copyParamToBean(req.getParameterMap(), new Book());
// 调用BookService的updateBook方法更新书籍
bookService.updateBook(book);
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNo="+req.getParameter("pageNo"));
// 重定向到书籍管理页面,并保持当前页码
resp.sendRedirect(req.getContextPath() + "/manager/bookServlet?action=page&pageNo=" + req.getParameter("pageNo"));
}
/**
*
* @param req
* @param resp
*
* @param req HttpServletRequest
* @param resp HttpServletResponse
* @throws ServletException
* @throws IOException
*/
protected void getBook(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取要查询的书籍ID
String id = req.getParameter("id");
int i = Integer.parseInt(id);
// 调用BookService的queryBookById方法查询书籍
Book book = bookService.queryBookById(i);
req.setAttribute("book",book);
req.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(req,resp);
}
// 将查询到的书籍信息保存到request域中
req.setAttribute("book", book);
// 请求转发到书籍编辑页面
req.getRequestDispatcher("/pages/manager/book_edit.jsp").forward(req, resp);
}
/**
*
* @param req HttpServletRequest
* @param resp HttpServletResponse
* @throws ServletException
* @throws IOException
*/
protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、通过BookService查询数据
List<Book>books = bookService.queryBooks();
//2、将数据保存在request域中
req.setAttribute("books",books);
//3、请求转发到pages/manager/book_manager.jsp
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
// 调用BookService的queryBooks方法查询所有书籍
List<Book> books = bookService.queryBooks();
// 将查询到的书籍列表保存到request域中
req.setAttribute("books", books);
// 请求转发到书籍管理页面
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req, resp);
}
/**
*
* @param req HttpServletRequest
* @param resp HttpServletResponse
* @throws ServletException
* @throws IOException
*/
protected void page(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1、获取请求的参数pageNo和pageSize
int pageNo = WebUtils.parseInt(req.getParameter("pageNo"),1);
// 获取请求参数pageNo和pageSize
int pageNo = WebUtils.parseInt(req.getParameter("pageNo"), 1);
int pageSize = WebUtils.parseInt(req.getParameter("pageSize"), Page.PAGE_SIZE);
//2、调用BookService.page(pageNo,pageSize)方法返回page对象
Page<Book> page = bookService.page(pageNo,pageSize);
// 调用BookService的page方法进行分页查询
Page<Book> page = bookService.page(pageNo, pageSize);
// 设置分页请求的URL
page.setUrl("manager/bookServlet?action=page");
//3、保存Page对象到request域中
req.setAttribute("page",page);
//4、请求转发到page/manager/book_manager.jsp页面
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req,resp);
// 将分页对象保存到request域中
req.setAttribute("page", page);
// 请求转发到书籍管理页面
req.getRequestDispatcher("/pages/manager/book_manager.jsp").forward(req, resp);
}
}
}

@ -1,11 +1,6 @@
<%--
Created by IntelliJ IDEA.
User: jhu
Date: 2020/10/5
Time: 15:44
To change this template use File | Settings | File Templates.
此文件的创建信息注释,表明是由 IntelliJ IDEA 创建,作者是 jhu创建日期是 2020 年 10 月 5 日,时间是 15 时 44 分,并且提示修改此模板的相关设置路径。
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
@ -13,21 +8,25 @@
<head>
<meta charset="UTF-8">
<title>书城首页</title>
<%-- 包含公共的头部页面header.jsp可能包含一些通用的样式、脚本或者页面头部结构相关的内容方便复用。 --%>
<%@include file="/pages/common/header.jsp"%>
<script type="text/javascript">
// 当页面 DOM 加载完成后执行以下函数(这是 jQuery 的 $(function() {}) 语法的作用,相当于 DOMContentLoaded 事件的简写形式)
$(function () {
//给加入购物车绑定单击事件
// 给所有 class 为 addToCart 的 button 元素绑定单击事件(通过 jQuery 的 click 方法实现事件绑定)
$("button.addToCart").click(function () {
// 获取当前被点击按钮的 bookId 属性值(通过 jQuery 的 attr 方法获取元素的自定义属性值),这个 bookId 应该是对应书籍的唯一标识,用于后续操作。
var bookId = $(this).attr("bookId");
//发ajax请求添加商品到购物车
// 使用 jQuery 的 $.getJSON 方法发送一个 AJAX 请求,请求的 URL 是 "http://localhost:8080/Book/cartServlet",同时传递了参数 "action=ajaxAddItem&id=" 加上获取到的 bookId期望服务器返回 JSON 格式的数据。
// 并且在请求成功后的回调函数中处理返回的数据(这里回调函数接收一个 data 参数,就是服务器返回的 JSON 数据解析后的对象)。
$.getJSON("http://localhost:8080/Book/cartServlet", "action=ajaxAddItem&id=" + bookId, function (data) {
// 更新购物车商品总数的显示内容,通过 jQuery 的 text 方法将指定元素id 为 cartTotalCount 的元素的文本内容更新为包含服务器返回的商品总数data.totalCount的提示信息。
$("#cartTotalCount").text("您的购物车中有" + data.totalCount + "件商品");
// 更新购物车中最新添加的商品名称的显示内容,通过 jQuery 的 html 方法将指定元素id 为 cartLastName 的元素)的 HTML 内容更新为包含服务器返回的最新添加商品名称data.lastName的提示信息这里使用双引号包裹文本所以里面的文本可以包含 HTML 标签(如果有的话)。
$("#cartLastName").html("您刚刚将【" + data.lastName + "】加入到了购物车中");
});
});
});
</script>
</head>
<body>
@ -35,35 +34,40 @@
<img class="logo_img" alt="" src="static/img/logo1.jpg" >
<span class="wel_word">Bookstore</span>
<div>
<!-- 使用 JSTL 的 c:if 标签判断 sessionScope 中 user 对象是否为空以此来区分用户是否登录empty 关键字用于判断是否为空值(比如 null、空字符串等。 -->
<c:if test="${empty sessionScope.user}">
<!-- 如果 user 对象为空,说明用户未登录,显示登录和注册链接,以及热榜链接,方便用户进行相应操作。 -->
<a href="pages/user/login.jsp">登录</a> |
<a href="pages/user/regist.jsp">注册</a> &nbsp;&nbsp;
<a href="client/bookServlet?action=pageOrder">热榜</a>
</c:if>
<c:if test="${not empty sessionScope.user}">
<!-- 如果 user 对象不为空,说明用户已登录,显示欢迎语以及包含用户用户名的个性化欢迎信息,同时提供我的订单、个人信息、注销等相关操作链接。 -->
<span>欢迎<span class="um_span">${sessionScope.user.username}</span>光临书城</span>
<a href="client/orderServlet?action=myOrders">我的订单</a>
<a href="pages/user/userinfo.jsp">个人信息</a>
<a href="userServlet?action=logout">注销</a>&nbsp;&nbsp;
</c:if>
<!-- 始终显示购物车和后台管理的链接,方便用户进入购物车页面查看商品或者进入后台管理页面(可能需要相应权限)。 -->
<a href="pages/cart/cart.jsp">购物车</a>
<a href="pages/manager/manager.jsp">后台管理</a>
</div>
</div>
<div id="main">
<!-- 图书搜索功能区域 -->
<div class="book_check">
<form action="client/bookServlet" method="get">
<!-- 隐藏域,用于传递特定的参数 action其值为 pageByNameOrAuthor用于告知服务器此次请求是按照书名或作者名进行页面查询相关操作。 -->
<input type="hidden" name="action" value="pageByNameOrAuthor">
图书搜索<input id="nameorauthor" type="text" placeholder="请输入书名或作者名" name="nameorauthor" value="${param.nameorauthor}">
<input type="submit" value="查询" />
</form>
</div>
<div id="book">
<!-- 价格区间筛选功能区域 -->
<div class="book_cond">
<form action="client/bookServlet" method="get">
<!-- 同样是隐藏域,传递 action 参数,值为 pageByPrice用于告知服务器此次请求是按照价格区间进行页面查询相关操作。 -->
<input type="hidden" name="action" value="pageByPrice">
价格:<input id="min" type="text" name="min" value="${param.min}"> 元 -
<input id="max" type="text" name="max" value="${param.max}"> 元
@ -71,6 +75,7 @@
</form>
</div>
<div style="text-align: center">
<!-- 再次使用 JSTL 的 c:if 标签判断 sessionScope 中 cart 对象的 items 属性是否为空,以此来判断购物车是否为空。 -->
<c:if test="${empty sessionScope.cart.items}">
<span id="cartTotalCount"></span>
<div>
@ -78,13 +83,16 @@
</div>
</c:if>
<c:if test="${not empty sessionScope.cart.items}">
<!-- 如果购物车不为空,显示购物车商品总数,通过 EL 表达式(${sessionScope.cart.totalCount})获取购物车中商品的总数并展示出来。 -->
<span id="cartTotalCount">您的购物车中有${sessionScope.cart.totalCount}件商品</span>
<div>
<!-- 显示最新加入购物车的商品名称,同样通过 EL 表达式获取最新加入商品的名称并展示,这里还设置了颜色为红色,用于突出显示。 -->
您刚刚将<span style="color: red" id="cartLastName">${sessionScope.lastName}</span>加入到了购物车中
</div>
</c:if>
</div>
<!-- 使用 JSTL 的 c:forEach 标签遍历 requestScope 中 page 对象的 items 属性(这里的 items 应该是一个集合,可能是书籍信息的列表),每次遍历将当前元素赋值给变量 book然后在循环体中进行相应的页面展示操作。 -->
<c:forEach items="${requestScope.page.items}" var="book">
<div class="b_list">
<div class="img_div">
@ -112,6 +120,7 @@
<span class="sp2">${book.stock}</span>
</div>
<div class="book_add">
<!-- 加入购物车按钮,设置了自定义属性 bookId其值为当前遍历的书籍的 id方便前面的 JavaScript 代码获取并发送对应的添加到购物车的请求。 -->
<button bookId=${book.id} class="addToCart">加入购物车</button>
</div>
</div>
@ -120,10 +129,12 @@
</div>
<!-- 包含公共的分页导航页面page_nav.jsp可能包含分页相关的链接、页码显示等功能方便复用。 -->
<%@include file="/pages/common/page_nav.jsp"%>
</div>
<!-- 包含公共的页脚页面footer.jsp可能包含版权信息、联系方式等页面底部相关的通用内容方便复用。 -->
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>
</html>

@ -1,9 +1,5 @@
<%--
Created by IntelliJ IDEA.
User: jhu
Date: 2020/10/19
Time: 22:56
To change this template use File | Settings | File Templates.
此部分为文件的创建相关注释,表明该文件是通过 IntelliJ IDEA 创建的,创建者是 jhu创建时间为 2020 年 10 月 19 日 22 时 56 分,同时说明了修改该模板的相关设置操作的路径信息。
--%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
@ -12,11 +8,10 @@
<head>
<meta charset="UTF-8">
<title>图书热销榜单</title>
<%-- 包含公共的头部页面header.jsp这里面通常会放置页面通用的样式表引入、脚本引入或者一些页面头部布局相关的内容以实现代码复用。 --%>
<%@include file="/pages/common/header.jsp"%>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="static/img/logo1.jpg" >
<span class="wel_word">图书热销榜单</span>
@ -35,6 +30,7 @@
<td>作者</td>
<td style="color: red">销量</td>
</tr>
<%-- 在 JSP 页面中嵌入 Java 代码片段,定义一个整型变量 i 并初始化为 1这个变量将用于记录图书的排名。 --%>
<%int i=1;%>
<c:forEach items="${requestScope.page.items}" var="book">
<tr>
@ -44,10 +40,9 @@
<td>${book.author}</td>
<td style="color: red">${book.sales}</td>
</tr>
<%-- 使用 JSTL 的 c:forEach 标签来遍历 requestScope 中 page 对象的 items 属性(通常这里是一个包含图书信息的集合),每次循环将集合中的一个元素赋值给变量 book然后在表格行tr中展示对应图书的各项信息包括通过表达式输出的排名通过 Java 代码片段中的 i 变量来展示,并且每次循环自增 1以及图书的名称、价格、作者和销量通过 EL 表达式 ${book.name} 等获取相应属性值进行展示)。 --%>
</c:forEach>
<tr>
<td></td>
<td></td>
@ -61,4 +56,4 @@
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>
</html>

@ -7,17 +7,27 @@
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
String basePath = request.getScheme()
+"://"
+request.getServerName()
+":"
+request.getServerPort()
+request.getContextPath()
+"/";
pageContext.setAttribute("bastPath",basePath);
// 获取当前请求的协议如http或https
String scheme = request.getScheme();
// 获取服务器的主机名或IP地址
String serverName = request.getServerName();
// 获取服务器的端口号
int serverPort = request.getServerPort();
// 获取当前应用的上下文路径
String contextPath = request.getContextPath();
// 拼接basePath用于构建项目的根路径
String basePath = scheme + "://" + serverName + ":" + serverPort + contextPath + "/";
// 将basePath存储到pageContext中方便在页面中使用
pageContext.setAttribute("basePath", basePath);
%>
<!-- 写base标签永远固定相对路径跳转的结果 -->
<base href=<%=basePath%>>
<link type="text/css" rel="stylesheet" href="static/css/style.css" >
<script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>
<base href="<%=basePath%>">
<!-- 引入外部的CSS样式文件 -->
<link type="text/css" rel="stylesheet" href="static/css/style.css">
<!-- 引入外部的jQuery库 -->
<script type="text/javascript" src="static/script/jquery-1.7.2.js"></script>

@ -8,71 +8,82 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<div id="page_nav">
<!-- 首页链接 -->
<a href="${requestScope.page.url}&pageNo=1">首页</a>
<c:if test="${requestScope.page.pageNo>1}">
<a href="${requestScope.page.url}&pageNo=${requestScope.page.pageNo-1}">上一页</a>
<!-- 上一页链接 -->
<c:if test="${requestScope.page.pageNo > 1}">
<a href="${requestScope.page.url}&pageNo=${requestScope.page.pageNo - 1}">上一页</a>
</c:if>
<!-- 分页逻辑 -->
<c:choose>
<%-- 当总页码小于等于5的情况 --%>
<c:when test="${ requestScope.page.pageTotal <= 5 }">
<c:when test="${requestScope.page.pageTotal <= 5}">
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="${ requestScope.page.pageTotal }"></c:set>
<c:set var="end" value="${requestScope.page.pageTotal}"></c:set>
</c:when>
<c:otherwise>
<%-- 当总页码大于5的情况 --%>
<c:choose>
<%-- 当前页码是前三 --%>
<c:when test="${ requestScope.page.pageNo <= 3 }">
<c:when test="${requestScope.page.pageNo <= 3}">
<c:set var="begin" value="1"></c:set>
<c:set var="end" value="5"></c:set>
</c:when>
<%-- 当前页码是后三 --%>
<c:when test="${ requestScope.page.pageNo >= requestScope.page.pageTotal - 2 }">
<c:set var="begin" value="${ requestScope.page.pageTotal - 4 }"></c:set>
<c:set var="end" value="${ requestScope.page.pageTotal }"></c:set>
<c:when test="${requestScope.page.pageNo >= requestScope.page.pageTotal - 2}">
<c:set var="begin" value="${requestScope.page.pageTotal - 4}"></c:set>
<c:set var="end" value="${requestScope.page.pageTotal}"></c:set>
</c:when>
<c:otherwise>
<c:set var="begin" value="${ requestScope.page.pageNo - 2 }"></c:set>
<c:set var="end" value="${ requestScope.page.pageNo + 2 }"></c:set>
<%-- 当前页码在中间 --%>
<c:set var="begin" value="${requestScope.page.pageNo - 2}"></c:set>
<c:set var="end" value="${requestScope.page.pageNo + 2}"></c:set>
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
<c:forEach begin="${ begin }" end="${ end }" var="i">
<c:if test="${ i == requestScope.page.pageNo }">【${ i }】</c:if>
<c:if test="${ i != requestScope.page.pageNo }"><a href="${requestScope.page.url}&pageNo=${i}">${i}</a></c:if>
<!-- 显示页码 -->
<c:forEach begin="${begin}" end="${end}" var="i">
<c:if test="${i == requestScope.page.pageNo}">【${i}】</c:if>
<c:if test="${i != requestScope.page.pageNo}">
<a href="${requestScope.page.url}&pageNo=${i}">${i}</a>
</c:if>
</c:forEach>
<c:if test="${requestScope.page.pageNo<requestScope.page.pageTotal}">
<a href="${requestScope.page.url}&pageNo=${requestScope.page.pageNo+1}">下一页</a>
<!-- 下一页链接 -->
<c:if test="${requestScope.page.pageNo < requestScope.page.pageTotal}">
<a href="${requestScope.page.url}&pageNo=${requestScope.page.pageNo + 1}">下一页</a>
</c:if>
<!-- 末页链接 -->
<a href="${requestScope.page.url}&pageNo=${requestScope.page.pageTotal}">末页</a>
<!-- 显示总页数和总记录数 -->
共${requestScope.page.pageTotal}页,${requestScope.page.pageTotalCount}条记录
<!-- 跳转页码输入框 -->
到第<input value="${param.pageNo}" name="pn" id="pn_input"/>页
<input id="searchPageBtn" type="button" value="确定">
<!-- 跳转页码的JavaScript脚本 -->
<script type="text/javascript">
$(function () {
// 点击“确定”按钮时触发跳转
$("#searchPageBtn").click(function () {
var pageNo = $("#pn_input").val()
var pageTotal = ${requestScope.page.pageTotal}
if(pageNo<1) pageNo=1
if(pageNo>pageTotal) pageNo=pageTotal
location.href="${requestScope.basePath}${requestScope.page.url}&pageNo="+pageNo;
// 获取用户输入的页码
var pageNo = $("#pn_input").val();
// 获取总页数
var pageTotal = ${requestScope.page.pageTotal};
// 校验页码范围
if (pageNo < 1) pageNo = 1;
if (pageNo > pageTotal) pageNo = pageTotal;
// 跳转到指定页码
location.href = "${requestScope.basePath}${requestScope.page.url}&pageNo=" + pageNo;
});
});
</script>

@ -1,37 +1,35 @@
<%--
Created by IntelliJ IDEA.
User: jhu
Date: 2020/10/5
Time: 22:17
To change this template use File | Settings | File Templates.
此部分为文件的创建相关注释,说明该文件是由 IntelliJ IDEA 创建的,创建用户是 jhu创建时间为2020年10月5日22时17分同时告知若要修改此模板可通过文件设置里的文件模板相关功能来操作。
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>404</title>
<%-- 引入公共的头部页面header.jsp一般这个头部页面中会包含诸如页面通用的样式文件引入、脚本文件引入或者一些页面头部通用布局结构等内容方便在多个页面间复用代码。 --%>
<%@include file="/pages/common/header.jsp"%>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="static/img/logo.gif" >
<span class="wel_word">404error</span>
</div>
<div id="main">
<table>
<tr>
<td style="width: 300px">亲,您访问的页面不存在或已被删除!</td>
<%-- 在表格的第一行的单元格中,显示提示信息,告知用户所访问的页面出现了不存在或者已被删除的情况。 --%>
</tr>
<tr>
<td>
<a href="index.jsp" style="size: 300px;color: red">返回首页</a>
<%-- 在表格的第二行单元格中设置一个超链接链接到“index.jsp”页面并且设置了链接文字的样式包括字号原代码中“size”属性写法有误正确的是“font-size”这里是按原代码注释和颜色引导用户点击返回首页。 --%>
</td>
</tr>
</table>
</div>
<!-- 这是页脚的引入 -->
<%@ include file="/pages/common/footer.jsp" %>
<%-- 通过此指令引入公共的页脚页面footer.jsp该页脚页面通常包含页面底部的一些通用信息比如版权声明、联系方式等内容同样是为了实现代码复用。 --%>
</body>
</html>

@ -1,37 +1,36 @@
<%--
Created by IntelliJ IDEA.
User: jhu
Date: 2020/10/5
Time: 22:17
To change this template use File | Settings | File Templates.
这部分是文件创建相关的注释信息表明该文件是由IntelliJ IDEA创建的创建者是“jhu”创建时间是2020年10月5日22时17分同时提示若要修改这个模板文件可以通过“File | Settings | File Templates”这个路径去操作。
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>500</title>
<%-- 通过JSP的指令引入公共的头部页面header.jsp通常在这个公共头部页面里会包含页面通用的样式表链接、JavaScript脚本引入或者一些通用的页面头部布局相关的代码等目的是实现代码复用让多个页面能共享这些公共部分的设置。 --%>
<%@include file="/pages/common/header.jsp"%>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="static/img/logo.gif" >
<span class="wel_word">500error</span>
<%-- 在“header”这个div区域中展示了一个logo图片虽然图片的替代文本为空可适当补充使其更友好以及显示“500error”字样用于提示当前页面出现的是500相关错误情况。 --%>
</div>
<div id="main">
<table>
<tr>
<td style="width: 300px">HTTP状态 500 - 内部服务器错误</td>
<%-- 在表格的第一行单元格里明确给出提示信息告知用户当前出现了HTTP状态码为500的内部服务器错误让用户知晓页面无法正常显示的原因所在。 --%>
</tr>
<tr>
<td>
<a href="index.jsp" style="size: 300px;color: red">返回首页</a>
<%-- 在表格的第二行单元格里创建了一个超链接链接指向“index.jsp”页面同时设置了这个链接文字的样式原代码中“size”属性写法不符合规范正确的是“font-size”用于设置字号这里按原代码注释颜色设置为红色引导用户点击该链接返回首页去尝试其他操作。 --%>
</td>
</tr>
</table>
</div>
<!-- 这是页脚的引入 -->
<%@ include file="/pages/common/footer.jsp" %>
<%-- 此处使用JSP的指令引入公共的页脚页面footer.jsp一般在页脚页面里会放置诸如版权信息、联系方式、网站相关声明等页面底部通用的内容同样是为了复用代码保持网站各页面底部信息的一致性。 --%>
</body>
</html>
</html>

@ -1,38 +1,38 @@
<%--
Created by IntelliJ IDEA.
User: jhu
Date: 2020/10/5
Time: 10:45
To change this template use File | Settings | File Templates.
这部分是关于该文件创建的相关注释内容说明了此文件是通过IntelliJ IDEA创建的创建者是“jhu”创建时间为2020年10月5日10时45分并且告知若要对这个模板文件进行修改可以在文件设置里找到文件模板相关功能来操作。
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>404</title>
<%-- 通过JSP的指令引入公共的头部页面header.jsp通常这个公共头部页面包含了页面通用的一些元素比如样式表的链接、脚本文件的引入或者是页面头部通用的布局结构代码等这样做是为了实现代码复用多个页面可以共用这些设置减少重复编写代码的工作量。 --%>
<%@include file="/pages/common/header.jsp"%>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="static/img/logo.gif" >
<span class="wel_word">错误提示</span>
<%-- 在“header”这个div区域中展示了一个图片其替代文本为空最好能补充合适的替代文本方便屏幕阅读器等识别同时显示“错误提示”字样用于给用户一个直观的页面提示信息的开头部分告知用户当前页面是用于提示出现错误情况的。 --%>
</div>
<div id="main">
<table>
<tr>
<td style="width: 300px">亲,你没有管理员权限哦!</td>
<%-- 在表格的第一行单元格中,明确给出提示信息,告知用户当前操作因为没有管理员权限而无法进行,让用户清楚知晓出现此页面的原因。 --%>
</tr>
<tr>
<td>
<a href="pages/user/login.jsp" style="size: 300px;color: red">管理员登录</a>
<%-- 创建一个超链接链接指向“pages/user/login.jsp”页面也就是引导用户去进行管理员登录操作同时设置了链接文字的样式不过原代码中“size”属性的写法不符合规范正确的应该是“font-size”用于设置字号这里按原代码注释颜色设置为红色使其更醒目方便用户看到并点击操作。 --%>
<a href="index.jsp" style="size: 300px;color: red">返回首页</a>
<%-- 再创建一个超链接指向“index.jsp”页面用于引导用户返回首页同样设置了字号原代码中写法有误和颜色样式给用户提供另一种操作选择方便用户离开当前提示页面。 --%>
</td>
</tr>
</table>
</div>
<!-- 这是页脚的引入 -->
<%@ include file="/pages/common/footer.jsp" %>
<%-- 使用JSP指令引入公共的页脚页面footer.jsp一般来说页脚页面里会放置像版权信息、网站的联系方式、相关声明等页面底部通用的内容通过这种引入方式实现代码复用保证整个网站各个页面的页脚部分信息呈现的一致性。 --%>
</body>
</html>
</html>

@ -2,59 +2,74 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>编辑图书</title>
<meta charset="UTF-8">
<title>编辑图书</title>
<%@include file="/pages/common/header.jsp"%>
<style type="text/css">
h1 {
text-align: center;
margin-top: 200px;
}
h1 a {
color:red;
}
input {
text-align: center;
}
</style>
<style type="text/css">
h1 {
text-align: center;
margin-top: 200px;
}
h1 a {
color:red;
}
input {
text-align: center;
}
</style>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="static/img/logo1.jpg" >
<span class="wel_word">编辑图书</span>
<%@include file="/pages/common/manager_menu.jsp"%>
</div>
<div id="main">
<form action="manager/bookServlet" method="post">
<input type="hidden" name="pageNo" value="${param.pageNo}">
<input type="hidden" name="action" value="${empty param.id ? "add":"update"}"/>
<input type="hidden" name="id" value="${requestScope.book.id}"/>
<table>
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<tr>
<td><input name="name" type="text" value="${requestScope.book.name}"/></td>
<td><input name="price" type="text" value="${requestScope.book.price}"/></td>
<td><input name="author" type="text" value="${requestScope.book.author}"/></td>
<td><input name="sales" type="text" value="${requestScope.book.sales}"/></td>
<td><input name="stock" type="text" value="${requestScope.book.stock}"/></td>
<td><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
</div>
<%@include file="/pages/common/footer.jsp"%>
<div id="header">
<img class="logo_img" alt="" src="static/img/logo1.jpg" >
<span class="wel_word">编辑图书</span>
<%@include file="/pages/common/manager_menu.jsp"%>
</div>
<div id="main">
<form action="manager/bookServlet" method="post">
<!-- 隐藏域,用于传递当前页码 -->
<input type="hidden" name="pageNo" value="${param.pageNo}">
<!-- 隐藏域,用于判断是添加还是更新操作 -->
<input type="hidden" name="action" value="${empty param.id ? "add":"update"}"/>
<!-- 隐藏域用于传递图书ID -->
<input type="hidden" name="id" value="${requestScope.book.id}"/>
<table>
<tr>
<td>名称</td>
<td>价格</td>
<td>作者</td>
<td>销量</td>
<td>库存</td>
<td colspan="2">操作</td>
</tr>
<tr>
<!-- 图书名称输入框 -->
<td><input name="name" type="text" value="${requestScope.book.name}"/></td>
<!-- 图书价格输入框 -->
<td><input name="price" type="text" value="${requestScope.book.price}"/></td>
<!-- 图书作者输入框 -->
<td><input name="author" type="text" value="${requestScope.book.author}"/></td>
<!-- 图书销量输入框 -->
<td><input name="sales" type="text" value="${requestScope.book.sales}"/></td>
<!-- 图书库存输入框 -->
<td><input name="stock" type="text" value="${requestScope.book.stock}"/></td>
<!-- 提交按钮 -->
<td><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
</div>
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save