Compare commits

..

2 Commits

Author SHA1 Message Date
heyou 11f9269b77 hy2
4 weeks ago
heyou 3d55fed611 hy1
4 weeks ago

@ -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;
}
}
}

@ -5,68 +5,53 @@ package com.yj.bean;
* @create 2020-08-21 10:41
*/
public class User {
// 用户ID使用Integer类型以便于处理数据库中的null值
private Integer id;
// 用户名
private String username;
// 密码
private String password;
// 邮箱地址
private String email;
// 用户地址
private String address;
// 获取用户地址
public String getAddress() {
return address;
}
// 设置用户地址
public void setAddress(String address) {
this.address = address;
}
// 获取用户ID
public Integer getId() {
return id;
}
// 设置用户ID
public void setId(Integer id) {
this.id = id;
}
// 获取用户名
public String getUsername() {
return username;
}
// 设置用户名
public void setUsername(String username) {
this.username = username;
}
// 获取密码
public String getPassword() {
return password;
}
// 设置密码
public void setPassword(String password) {
this.password = password;
}
// 获取邮箱
public String getEmail() {
return email;
}
// 设置邮箱
public void setEmail(String email) {
this.email = email;
}
// 重写toString方法方便输出用户信息
@Override
public String toString() {
return "User{" +
@ -78,11 +63,9 @@ public class User {
'}';
}
// 无参构造函数
public User() {
}
// 带参数的构造函数,用于创建用户对象时初始化属性
public User(Integer id, String username, String password, String email, String address) {
this.id = id;
this.username = username;
@ -91,4 +74,3 @@ public class User {
this.address = address;
}
}

@ -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();
}
}

@ -5,7 +5,6 @@ import com.yj.bean.User;
import java.util.List;
/**
* 访
* @author yj
* @create 2020-08-21 11:57
*/
@ -20,64 +19,30 @@ public interface UserDao {
/**
*
* @param username
* @param password
* @param username
* @param password
* @return null
*/
public User querybyUsernameAndPassword(String username, String password);
public User querybyUsernameAndPassword(String username,String password);
/**
*
* @param user
* @return
* @param user
* @return
*/
public int saveUser(User user);
/**
*
* @param user
* @return
*/
public int addUser(User user);
/**
* ID
* @param i ID
* @return
*/
public int deleteUserById(int i);
/**
*
* @param user
* @return
*/
public int updateUser(User user);
/**
* ID
* @param id ID
* @return null
*/
public User queryUserById(Integer id);
/**
*
* @return
*/
public List<User> queryUsers();
/**
*
* @return
*/
public Integer queryForPageTotalCount();
/**
*
* @param begin
* @param pageSize
* @return
*/
public List<User> queryForPageItems(int begin, int pageSize);
}

@ -10,77 +10,56 @@ import java.util.List;
* @create 2020-08-21 15:04
*/
public class UserDaoImpl extends BaseDao implements UserDao {
// 根据用户名查询用户信息
@Override
public User querybyUsername(String username) {
// SQL 查询语句,选择 t_user 表中的相关字段
String sql = "select `id`,`username`,`password`,`email`,`address` from t_user where username = ?";
// 执行查询并返回单个 User 对象
return queryForOne(User.class, sql, username);
return queryForOne(User.class,sql,username);
}
// 根据用户名和密码查询用户信息
@Override
public User querybyUsernameAndPassword(String username, String password) {
// SQL 查询语句,通过用户名和密码查找用户
String sql = "select * from t_user where username = ? and password = ?";
// 执行查询并返回单个 User 对象
return queryForOne(User.class, sql, username, password);
return queryForOne(User.class,sql,username,password);
}
// 保存用户信息
@Override
public int saveUser(User user) {
// SQL 插入语句,向 t_user 表中插入新的用户数据
String sql = "insert into t_user(`username`,`password`,`email`,`address`) values(?,?,?,?)";
// 执行更新操作,返回受影响的行数
return update(sql, user.getUsername(), user.getPassword(), user.getEmail(), user.getAddress());
return update(sql,user.getUsername(),user.getPassword(),user.getEmail(),user.getAddress());
}
// 添加用户信息(功能与 saveUser 相同)
@Override
public int addUser(User user) {
// SQL 插入语句,向 t_user 表中插入新的用户数据
String sql = "insert into t_user(`username`,`password`,`email`,`address`) values(?,?,?,?)";
// 执行更新操作,返回受影响的行数
return update(sql, user.getUsername(), user.getPassword(), user.getEmail(), user.getAddress());
return update(sql,user.getUsername(),user.getPassword(),user.getEmail(),user.getAddress());
}
// 根据用户 ID 删除用户信息
@Override
public int deleteUserById(int i) {
// SQL 删除语句,根据用户 ID 删除对应的记录
String sql = "delete from t_user where id = ?";
// 执行更新操作,返回受影响的行数
return update(sql, i);
return update(sql,i);
}
// 更新用户信息
@Override
public int updateUser(User user) {
// SQL 更新语句,根据用户 ID 更新用户的各项信息
String sql = "update t_user set `username`=?,`password`=?,`email`=?,`address`=? where id=?";
// 执行更新操作,返回受影响的行数
return update(sql, user.getUsername(), user.getPassword(), user.getEmail(), user.getAddress(), user.getId());
return update(sql,user.getUsername(),user.getPassword(),user.getEmail(),user.getAddress(),user.getId());
}
@Override
public User queryUserById(Integer id) {
// 根据用户ID查询单个用户信息
String sql = "select * from t_user where id=?";
return queryForOne(User.class, sql, id);
return queryForOne(User.class,sql,id);
}
@Override
public List<User> queryUsers() {
// 查询所有用户信息
String sql = "select * from t_user";
return queryForList(User.class, sql);
return queryForList(User.class,sql);
}
@Override
public Integer queryForPageTotalCount() {
// 查询用户表中总记录数,以便进行分页
String sql = "select count(*) from t_user";
Number count = (Number) queryForSingleValue(sql);
return count.intValue();
@ -88,9 +67,7 @@ public class UserDaoImpl extends BaseDao implements UserDao {
@Override
public List<User> queryForPageItems(int begin, int pageSize) {
// 通过指定的偏移量和页面大小查询特定页的用户信息
String sql = "select * from t_user limit ?,?";
return queryForList(User.class, sql, begin, pageSize);
return queryForList(User.class,sql,begin,pageSize);
}
}

@ -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();
}
}

@ -7,68 +7,39 @@ import com.yj.bean.User;
import java.util.List;
/**
*
* @author yj
* @create 2020-08-21 15:29
*/
public interface UserService {
/**
*
* @param user
* @param user
*/
public void registUser(User user);
/**
*
* @param user
* @return null
*
* @param user
* @return
*/
public User login(User user);
/**
*
* @param username
* @param username
* @return truefalse
*/
public boolean existsUsername(String username);
/**
*
* @param user
*/
public void addUser(User user);
/**
* ID
* @param id ID
*/
public void deleteUserById(int id);
public void deleteUserById(int i);
/**
*
* @param user
*/
public void updateUser(User user);
/**
* ID
* @param id ID
* @return null
*/
public User queryUserById(Integer id);
/**
*
* @return
*/
public List<User> queryUsers();
/**
*
* @param pageNo
* @param pageSize
* @return
*/
public Page<User> page(int pageNo, int pageSize);
}

@ -15,124 +15,84 @@ import java.util.List;
*/
public class UserServiceImpl implements UserService {
// 用户数据访问对象使用UserDaoImpl实现
private UserDao userDao = new UserDaoImpl();
/**
*
* @param user
*/
@Override
public void registUser(User user) {
userDao.saveUser(user); // 保存用户信息
userDao.saveUser(user);
}
/**
*
* @param user
* @return null
*/
@Override
public User login(User user) {
return userDao.querybyUsernameAndPassword(user.getUsername(), user.getPassword()); // 验证用户名和密码
return userDao.querybyUsernameAndPassword(user.getUsername(),user.getPassword());
}
/**
*
* @param username
* @return falsetrue
*/
@Override
public boolean existsUsername(String username) {
if (userDao.querybyUsername(username) == null) {
return false; // 用户名不存在
return false;
} else {
return true; // 用户名存在
return true;
}
}
/**
*
* @param user
*/
@Override
public void addUser(User user) {
userDao.addUser(user); // 调用数据访问层添加用户
userDao.addUser(user);
}
/**
* ID
* @param i ID
*/
@Override
public void deleteUserById(int i) {
userDao.deleteUserById(i); // 调用数据访问层删除用户
userDao.deleteUserById(i);
}
/**
*
* @param user
*/
@Override
public void updateUser(User user) {
userDao.updateUser(user); // 调用数据访问层更新用户
userDao.updateUser(user);
}
/**
* ID
* @param id ID
* @return null
*/
@Override
public User queryUserById(Integer id) {
return userDao.queryUserById(id); // 调用数据访问层查询用户
return userDao.queryUserById(id);
}
/**
*
* @return
*/
@Override
public List<User> queryUsers() {
return userDao.queryUsers(); // 调用数据访问层获取所有用户
return userDao.queryUsers();
}
@Override
public Page<User> page(int pageNo, int pageSize) {
Page<User> page = new Page<User>(); // 创建一个新的分页对象
Page<User> page = new Page<User>();
// 设置每页记录数
page.setPageSize(pageSize); // 将每页的记录数设置为方法传入的pageSize
//设置每页记录数
page.setPageSize(pageSize);
// 设置总记录数
Integer pageTotalCount = userDao.queryForPageTotalCount(); // 从数据库中获取总记录数
page.setPageTotalCount(pageTotalCount); // 将总记录数设置到分页对象中
//设置总记录数
Integer pageTotalCount = userDao.queryForPageTotalCount();
page.setPageTotalCount(pageTotalCount);
// 计算总页码
Integer pageTotal = pageTotalCount / pageSize; // 根据总记录数和每页大小计算总页数
if (pageTotalCount % pageSize > 0) { // 如果有剩余记录,则总页数加一
pageTotal += 1;
//总页码
Integer pageTotal = pageTotalCount / pageSize;
if(pageTotalCount % pageSize >0) {
pageTotal+=1;
}
// 设置当前页
if (pageNo > pageTotal) { // 如果请求的当前页码大于总页码,则设置为最后一页
//设置当前页
if(pageNo>pageTotal) {
pageNo = pageTotal;
}
if (pageNo < 1) { // 如果请求的当前页码小于1则设置为第一页
if(pageNo<1) {
pageNo = 1;
}
page.setPageNo(pageNo); // 将最终确定的当前页码设置到分页对象中
page.setPageNo(pageNo);
//设置总页码
page.setPageTotal(pageTotal);
// 设置总页码
page.setPageTotal(pageTotal); // 将计算出来的总页码设置到分页对象中
// 计算当前页的起始记录索引
int begin = (page.getPageNo() - 1) * pageSize; // 计算当前页的开始位置
// 查询当前页的数据项
List<User> items = userDao.queryForPageItems(begin, pageSize); // 从数据库中查询当前页的数据
page.setItems(items); // 将查询到的数据设置到分页对象中
int begin = (page.getPageNo() -1)*pageSize;
List<User> items = userDao.queryForPageItems(begin,pageSize);
page.setItems(items);
return page; // 返回包含分页信息的分页对象
return page;
}
}

@ -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());
}
}

@ -13,102 +13,67 @@ import java.util.List;
* @author yj
* @create 2020-08-21 15:14
*/
import org.junit.Test;
public class UserDaoTest {
// 创建UserDao的实例用于测试
UserDao userDao = new UserDaoImpl();
/**
*
* null
*/
UserDao userDao = new UserDaoImpl();
@Test
public void querybyUsername() {
if (userDao.querybyUsername("yan1gjie") == null) {
if(userDao.querybyUsername("yan1gjie")==null) {
System.out.println("用户名可用");
} else {
System.out.println("用户名已存在!");
}
// System.out.println(userDao.querybyUsername("yangjie"));
//System.out.println(userDao.querybyUsername("yangjie"));
}
/**
*
* null
*/
@Test
public void querybyUsernameAndPassword() {
if (userDao.querybyUsernameAndPassword("yagjie", "yanjie") == null) {
if(userDao.querybyUsernameAndPassword("yagjie","yanjie")==null) {
System.out.println("密码错误或用户名错误");
} else {
}else {
System.out.println("登陆成功");
}
}
/**
*
*
*/
@Test
public void saveUser() {
System.out.println(userDao.saveUser(new User(null, "yangjie2", "yangjie", "wzg168@qq.com", "大河湾")));
System.out.println(userDao.saveUser(new User(null,"yangjie2","yangjie","wzg168@qq.com","大河湾")));
}
/**
*
*
*/
@Test
public void addUser() {
System.out.println(userDao.addUser(new User(null, "舒胡2贤", "123456", "123456@qq.com", "贵州")));
System.out.println(userDao.addUser(new User(null,"舒胡2贤","123456","123456@qq.com","贵州")));
}
/**
* ID
*
*/
@Test
public void deleteUserById() {
System.out.println(userDao.deleteUserById(3));
}
/**
*
*
*/
@Test
public void updateUser() {
System.out.println(userDao.updateUser(new User(3, "舒胡贤", "123456", "123456@qq.com", "贵州")));
System.out.println(userDao.updateUser(new User(3,"舒胡贤","123456","123456@qq.com","贵州")));
}
@Test
public void queryUserById() {
// 根据用户ID查询用户信息
User user = userDao.queryUserById(1);
// 输出查询到的用户信息
System.out.println(user);
}
@Test
public void queryUsers() {
// 查询所有用户的信息
List<User> users = userDao.queryUsers();
// 输出所有用户的信息
System.out.println(users);
}
@Test
public void queryForPageTotalCount() {
// 查询用户总数,用于分页功能
System.out.println(userDao.queryForPageTotalCount());
}
@Test
public void queryForPageItems() {
// 查询指定页码和每页数量的用户信息
// 这里查询第一页的2条用户记录
System.out.println(userDao.queryForPageItems(1, 2));
System.out.println(userDao.queryForPageItems(1,2));
}
}

@ -6,43 +6,35 @@ import com.yj.service.impl.UserServiceImpl;
import org.junit.Test;
/**
*
* @author yj
* @create 2020-08-21 15:38
*/
public class UserServiceImplTest {
// 创建UserService的实例
UserService userService = new UserServiceImpl();
@Test
public void registUser() {
// 测试用户注册功能,创建一个新的用户对象并进行注册
userService.registUser(new User(null, "admin", "admin", "225@qq.com", "大河湾"));
userService.registUser(new User(null,"admin","admin","225@qq.com","大河湾"
));
}
@Test
public void login() {
// 测试用户登录功能
// 创建一个用户对象用于登录验证
if (userService.login(new User(null, "admin123", "admin", null, "大河湾")) == null) {
// 如果登录返回为null则输出登录失败
if(userService.login(new User(null,"admin123","admin",null,"大河湾"))==null) {
System.out.println("登录失败");
} else {
// 登录成功的情况下输出提示
System.out.println("登陆成功");
System.out.println("登陆成功");
}
}
@Test
public void existsUsername() {
// 测试用户名是否存在的方法
if (userService.existsUsername("admin35135") == false) {
// 如果用户名不存在,输出可用提示
if(userService.existsUsername("admin35135")==false) {
System.out.println("用户名可用");
} else {
// 如果用户名已存在,输出提示
System.out.println("用户名已存在");
System.out.println("用户名已存在");
}
}
}
}

@ -8,61 +8,34 @@ import org.junit.Test;
import static org.junit.Assert.*;
/**
* UserService
* @author yj
* @create 2020-10-21 18:50
*/
public class UserServiceTest {
// 创建UserService的实例使用UserServiceImpl实现类
UserService userService = new UserServiceImpl();
/**
*
*/
@Test
public void addUser() {
// 调用addUser方法添加一个新的用户
userService.addUser(new User(null, "舒胡贤2", "kj", "1234@qq.com", "kjk"));
userService.addUser(new User(null,"舒胡贤2","kj","1234@qq.com","kjk"));
}
/**
* ID
*/
@Test
public void deleteUserById() {
// 调用deleteUserById方法根据用户ID删除用户此处示例为删除ID为3的用户
userService.deleteUserById(3);
}
/**
*
*/
@Test
public void updateUser() {
// 该方法尚未实现,用于测试更新用户信息的逻辑
}
/**
* ID
*/
@Test
public void queryUserById() {
// 该方法尚未实现用于测试根据用户ID查询用户的逻辑
}
/**
*
*/
@Test
public void queryUsers() {
// 该方法尚未实现,用于测试查询所有用户的逻辑
}
/**
*
*/
@Test
public void page() {
// 该方法尚未实现,用于测试分页查询用户的逻辑
}
}
}

@ -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);
}
}
}

@ -21,71 +21,59 @@ import static com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY;
*/
public class UserServlet extends BaseServlet {
// 创建UserService的实例使用UserServiceImpl实现类
private UserService userService = new UserServiceImpl();
protected void ajaxExistsusername(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取请求参数中的用户名
//获取请求参数
String username = req.getParameter("username");
//调用userService.existsUsername
boolean exitsUsername = userService.existsUsername(username);
//把返回的结果封装为map对象
Map<String,Object> resultMap = new HashMap<>();
resultMap.put("exitsUsername",exitsUsername);
// 调用userService.existsUsername()方法,检查用户名是否存在
boolean existsUsername = userService.existsUsername(username);
// 将返回的结果封装为Map对象
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("existsUsername", existsUsername); // 存在性结果存入Map
// 使用Gson库将Map对象转换为JSON格式的字符串
Gson gson = new Gson();
String json = gson.toJson(resultMap);
// 将JSON字符串写入响应中返回给客户端
resp.getWriter().write(json);
}
/**
*
*
* @param req HttpServletRequest
* @param resp HttpServletResponse
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void login(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、获取请求的参数(用户名和密码)
//1、获取请求的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
// 2、调用userService.login()方法进行登录验证创建User对象传递用户名和密码
User loginUser = userService.login(new User(null, username, password, null, null));
// 3、检查登录结果
if (loginUser == null) {
// 登录失败,设置错误信息并转发到登录页面
req.setAttribute("msg", "用户名或密码错误!"); // 设置错误消息
// req.setAttribute("username", username); // 可选:保存用户名以便回显
req.getRequestDispatcher("/pages/user/login.jsp").forward(req, resp); // 转发请求
User loginUser = userService.login(new User(null, username, password, null,null));
if(loginUser==null)
{
req.setAttribute("msg","用户名或密码错误!");
//req.setAttribute("username",username);
req.getRequestDispatcher("/pages/user/login.jsp").forward(req, resp);
} else {
// 登录成功将用户信息保存到session域中以便后续使用
req.getSession().setAttribute("user", loginUser);
// 转发到登录成功页面
//保存用户登录的信息到session域中
req.getSession().setAttribute("user",loginUser);
req.getRequestDispatcher("/pages/user/login_success.jsp").forward(req, resp);
}
}
/**
*
*
* @param req HttpServletRequest
* @param resp HttpServletResponse
* @throws ServletException
* @throws IOException
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
protected void logout(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 使当前会话失效清除所有用户相关的session数据
req.getSession().invalidate();
// 重定向到应用的根路径,以返回主页或登录页面
req.getSession().invalidate();
resp.sendRedirect(req.getContextPath());
}
@ -97,32 +85,30 @@ public class UserServlet extends BaseServlet {
* @throws IOException
*/
protected void regist(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 获取Session中存储的验证码
//获取Session验证码
String token = (String) req.getSession().getAttribute(KAPTCHA_SESSION_KEY);
// 删除Session中的验证码,以防止重复使用
//删除Session中的验证码
req.getSession().removeAttribute(KAPTCHA_SESSION_KEY);
// 1、获取请求的参数包括用户名、密码、确认密码、邮箱和验证码
//1、获取请求的参数
String username = req.getParameter("username");
String password = req.getParameter("password");
String repwd = req.getParameter("repwd");
String email = req.getParameter("email");
String code = req.getParameter("code");
// 将请求参数复制到User对象中
User user = (User) WebUtils.copyParamToBean(req.getParameterMap(), new User());
// 2、检查验证码是否正确
if (token != null && token.equalsIgnoreCase(code)) {
// 3、检查用户名是否已被注册
User user = (User) WebUtils.copyParamToBean(req.getParameterMap(),new User());
//2、检查验证码是否正确 abcde
if (token!=null&&token.equalsIgnoreCase(code)) {
//3、检查用户名是否可用
if (userService.existsUsername(username)) {
// 如果用户名已存在,设置错误信息并转发回注册页面
req.setAttribute("msg", "用户名已存在!");
req.setAttribute("username", username); // 保留输入的用户名以便于用户填写
req.setAttribute("email", email); // 保留输入的邮箱
//不可用 跳回注册页面
req.setAttribute("msg","用户名已存在!");
req.setAttribute("username",username);
req.setAttribute("email",email);
req.getRequestDispatcher("/pages/user/regist.jsp").forward(req, resp);
} else {
// 如果用户名可用,调用服务层方法将用户信息保存到数据库,并转发到注册成功页面
//可用 调用service保存到数据库 跳到注册成功页面
userService.registUser(user);
req.getRequestDispatcher("/pages/user/regist_success.jsp").forward(req, resp);
}
@ -138,19 +124,10 @@ public class UserServlet extends BaseServlet {
}
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 1、将请求参数复制到User对象中
User user = (User) WebUtils.copyParamToBean(req.getParameterMap(), new User());
// 2、调用服务层方法更新用户信息
User user = (User) WebUtils.copyParamToBean(req.getParameterMap(),new User());
userService.updateUser(user);
// 3、根据用户ID查询更新后的用户信息
User user1 = userService.queryUserById(user.getId());
// 4、将更新后的用户信息存储到Session中以便后续使用
req.getSession().setAttribute("user", user1);
// 5、重定向到用户信息页面展示更新后的信息
req.getSession().setAttribute("user",user1);
resp.sendRedirect(req.getContextPath() + "/pages/user/userinfo.jsp");
}

@ -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>

@ -2,92 +2,96 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录页面</title>
<%@include file="/pages/common/header.jsp"%> <!-- 引入公共头部文件 -->
<script type="text/javascript">
// 页面加载完成后执行
$(function(){
// 给注册按钮添加点击事件
$("#sub_btn").click(function(){
// 获取用户名输入框的值
var usernameValue = $("#username").val();
// 定义正则表达式,验证用户名是否合法 (由字母、数字、下划线组成长度5到15位)
var usernameReg = /^\w{5,15}$/;
// 验证用户名信息
if (!usernameReg.test(usernameValue)) {
// 如果不合法,提示用户
$("span.errorMsg").text("用户名不合法!");
return false; // 阻止表单提交
}
// 获取密码输入框的值
var passwordValue = $("#password").val();
// 定义正则表达式,验证密码是否合法(同样的规则)
var passwordReg = /^\w{5,15}$/;
// 验证密码信息
if (!passwordReg.test(passwordValue)) {
// 如果不合法,提示用户
$("span.errorMsg").text("密码不合法!");
return false; // 阻止表单提交
}
// 如果验证通过,允许表单提交
return true;
});
<meta charset="UTF-8">
<title>登录页面</title>
<%@include file="/pages/common/header.jsp"%>
<script type="text/javascript">
// 页面加载完成之后
$(function(){
// 给注册按钮添加事件
$("#sub_btn").click(function(){
// 获取用户名
var usernameValue = $("#username").val();
// 验证用户名是否合法,规则如下必须由字母数字下划线组成并且长度为5到15位。
var usernameReg = /^\w{5,15}$/;
// 验证用户信息
if (!usernameReg.test(usernameValue)) {
// 提示用户
$("span.errorMsg").text("用户名不合法!");
return false;
}
// 获取密码
var passwordValue = $("#password").val();
// 验证密码是否合法,规则如下必须由字母数字下划线组成并且长度为5到15位。
var passwordReg = /^\w{5,15}$/;
// 验证用户信息
if (!passwordReg.test(passwordValue)) {
// 提示用户
$("span.errorMsg").text("密码不合法!");
return false;
}
// 阻止表单提交
return true;
});
</script>
});
</script>
</head>
<body>
<div id="login_header">
<img class="logo_img" alt="" src="static/img/logo.jpg"> <!-- 显示网站的logo -->
</div>
<div class="login_banner">
<div id="l_content">
<span class="login_word">欢迎登录</span> <!-- 登录页面的欢迎词 -->
</div>
<div id="content">
<div class="login_form">
<div class="login_box">
<div class="tit">
<h1>书城会员</h1> <!-- 登录框标题 -->
<a href="pages/user/regist.jsp">立即注册</a> <!-- 注册链接,点击后跳转到注册页面 -->
<div id="login_header">
<img class="logo_img" alt="" src="static/img/logo.jpg" >
</div>
<div class="login_banner">
<div id="l_content">
<span class="login_word">欢迎登录</span>
</div>
<div class="msg_cont">
<b></b>
<span class="errorMsg">
<div id="content">
<div class="login_form">
<div class="login_box">
<div class="tit">
<h1>书城会员</h1>
<a href="pages/user/regist.jsp">立即注册</a>
</div>
<div class="msg_cont">
<b></b>
<span class="errorMsg">
<%--<%=request.getAttribute("msg")==null?"请输入用户名和密码":request.getAttribute("msg")%>--%>
${empty requestScope.msg ? "请输入用户名和密码":requestScope.msg} <!-- 显示错误信息,若有则显示 -->
${empty requestScope.msg ? "请输入用户名和密码":requestScope.msg}
</span>
</div>
<div class="form">
<form action="userServlet" method="post"> <!-- 表单提交至userServlet处理登录 -->
<input type="hidden" name="action" value="login"> <!-- 隐藏字段,指明操作为登录 -->
<label>用户名称:</label>
<input class="itxt" type="text" placeholder="请输入用户名" autocomplete="off"
tabindex="1" name="username" id="username"
value="${requestScope.username}" /> <!-- 用户名输入框 -->
<br />
<br />
<label>用户密码:</label>
<input class="itxt" type="password" placeholder="请输入密码" autocomplete="off"
tabindex="1" name="password" id="password" /> <!-- 密码输入框 -->
<br />
<br />
<input type="submit" value="登录" id="sub_btn" /> <!-- 登录按钮 -->
</form>
</div>
<div class="form">
<form action="userServlet" method="post">
<input type="hidden" name="action" value="login">
<label>用户名称:</label>
<input class="itxt" type="text" placeholder="请输入用户名" autocomplete="off"
tabindex="1" name="username" id="username"
value="${requestScope.username}"
/>
<br />
<br />
<label>用户密码:</label>
<input class="itxt" type="password" placeholder="请输入密码" autocomplete="off"
tabindex="1" name="password" id="password"
/>
<br />
<br />
<input type="submit" value="登录" id="sub_btn" />
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<%@include file="/pages/common/footer.jsp"%> <!-- 引入公共底部文件 -->
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>
</html>

@ -2,30 +2,32 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"> <!-- 设置字符编码为UTF-8 -->
<title>登录成功页面</title> <!-- 页面标题 -->
<%@include file="/pages/common/header.jsp"%> <!-- 引入公共头部文件 -->
<style type="text/css">
h1 {
text-align: center; <!-- 使h1内容居中对齐 -->
margin-top: 200px; <!-- 顶部外边距设置为200像素 -->
}
h1 a {
color:red; <!-- 超链接颜色设置为红色 -->
}
</style>
<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;
}
</style>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="static/img/logo.jpg" > <!-- 显示网站的logo -->
<%@include file="/pages/common/login_success_menu.jsp"%> <!-- 引入登录成功后的菜单 -->
</div>
<div id="main">
<h1>欢迎回来 <a href="index.jsp">转到主页</a></h1> <!-- 欢迎信息及返回主页的链接 -->
</div>
<div id="header">
<img class="logo_img" alt="" src="static/img/logo.jpg" >
<%@include file="/pages/common/login_success_menu.jsp"%>
</div>
<div id="main">
<h1>欢迎回来 <a href="index.jsp">转到主页</a></h1>
</div>
<%@include file="/pages/common/footer.jsp"%> <!-- 引入公共底部文件 -->
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>
</html>

@ -8,202 +8,151 @@
<script type="text/javascript">
// 页面加载完成之后
$(function(){
// 当用户名输入框失去焦点时触发事件
$("#username").blur(function () {
// 1、获取用户名
//1、获取用户名
var username = this.value;
// 发送一个GET请求检查用户名是否已经存在
$.getJSON("http://localhost:8080/bookstore1/userServlet", "action=ajaxExistsusername&username=" + username, function (data) {
$.getJSON("http://localhost:8080/bookstore1/userServlet","action=ajaxExistsusername&username="+username,function (data) {
if(data.exitsUsername) {
// 如果用户名已存在,显示错误信息
$("span.errorMsg").text("用户名已存在!");
} else {
// 如果用户名可用,显示可用信息
$("span.errorMsg").text("用户名可用!");
}
});
});
// 点击验证码图片时更换其源,以更新验证码
$("#code_img").click(function () {
this.src = "${basePath}kaptcha.jpg?d=" + new Date();
});
// 给注册按钮添加点击事件
// 给注册按钮添加事件
$("#sub_btn").click(function(){
// 获取用户名的值
// 获取用户名
var usernameValue = $("#username").val();
// 验证用户名是否合法,规则如下:必须由字母、数字和下划线组成并且长度为5到15位。
// 验证用户名是否合法,规则如下:必须由字母,数字,下划线组成并且长度为5到15位。
var usernameReg = /^\w{5,15}$/;
// 验证用户信息
if (!usernameReg.test(usernameValue)) {
// 如果验证不通过,提示用户
// 提示用户
$("span.errorMsg").text("用户名不合法!");
return false; // 阻止表单提交
return false;
}
// 获取密码输入框的值
// 获取密码
var passwordValue = $("#password").val();
// 验证密码是否合法,规则如下:必须由字母、数字和下划线组成并且长度为5到15位。
// 验证密码是否合法,规则如下:必须由字母,数字,下划线组成并且长度为5到15位。
var passwordReg = /^\w{5,15}$/;
// 验证用户信息
// 验证用户信息
if (!passwordReg.test(passwordValue)) {
// 如果验证不通过,提示用户
// 提示用户
$("span.errorMsg").text("密码不合法!");
return false; // 阻止表单提交
return false;
}
// 获取确认密码输入框的值
// 获取确认密码
var repwdValue = $("#repwd").val();
// 验证确认密码与密码是否一致
// 验证确认密码和密码一致
if (passwordValue != repwdValue) {
// 如果不一致,提示用户
// 提示用户
$("span.errorMsg").text("确认密码和密码不一致!");
return false; // 阻止表单提交
return false;
}
// 获取电子邮件输入框的值
// 获取用户名
var emailValue = $("#email").val();
// 验证邮件输入是否合法,采用正则表达式
// 验证邮件输入是否合法。
var emailReg = /^([a-z0-9_\.-]+)@([\da-z\.-]+)\.([a-z\.]{2,6})$/;
// 检查电子邮件格式是否符合要求
if (!emailReg.test(emailValue)) {
// 如果验证不通过,提示用户
// 提示用户
$("span.errorMsg").text("邮件输入不合法!");
return false; // 阻止表单提交
return false;
}
// 获取验证码输入框的值
// 获取验证码信息
var codeValue = $("#code").val();
// 验证验证码输入是否为空
// 验证验证码不为空!
if (codeValue == "") {
// 如果为空,提示用户
$("span.errorMsg").text("验证码不能为空!")
return false; // 阻止表单提交
return false;
}
// 如果所有验证通过返回true允许表单提交
return true;
});
});
</script>
<style type="text/css">
/* 定义 .login_form 类的样式 */
.login_form {
/* 设置登录表单的高度为420像素 */
height: 420px;
/* 设置登录表单与顶部的外边距为25像素 */
margin-top: 25px;
}
</style>
<style type="text/css">
.login_form{
height:420px;
margin-top: 25px;
}
</style>
</head>
<body>
<div id="login_header">
<!-- 显示网站或应用程序的logo使用img标签加载图像 -->
<img class="logo_img" alt="" src="static/img/logo.jpg">
</div>
<div class="login_banner">
<!-- 登录横幅区域 -->
<div id="l_content">
<!-- 登录内容部分 -->
<span class="login_word">欢迎注册</span>
<!-- 提示用户进行注册 -->
</div>
<div id="content">
<!-- 内容区域 -->
<div class="login_form">
<!-- 登录表单容器 -->
<div class="login_box">
<!-- 登录框 -->
<div class="tit">
<!-- 标题部分 -->
<h1>注册会员</h1>
<!-- 主标题,显示“注册会员” -->
<span class="errorMsg">
<!-- 错误信息显示区域 -->
<%--<%=request.getAttribute("msg")==null? "" : request.getAttribute("msg")%>--%>
<!-- 注释掉的JSP代码用于获取请求中的消息属性 -->
${requestScope.msg}
<!-- 使用EL表达式获取请求作用域中的消息并显示 -->
</span>
<div id="login_header">
<img class="logo_img" alt="" src="static/img/logo.jpg" >
</div>
<div class="login_banner">
<div id="l_content">
<span class="login_word">欢迎注册</span>
</div>
<div class="form">
<!-- 表单容器 -->
<form action="userServlet" method="post">
<!-- 表单,提交到 userServlet使用 POST 方法 -->
<input type="hidden" name="action" value="regist">
<!-- 隐藏字段,指定表单操作为注册 -->
<label>用户名称:</label>
<!-- 用户名称标签 -->
<input class="itxt" type="text" placeholder="请输入用户名" autocomplete="off" tabindex="1" name="username" id="username"
value="${requestScope.username}"/>
<!-- 输入框,供用户输入用户名 -->
<!-- 使用 EL 表达式填充之前的用户名(如果有的话) -->
<br />
<br />
<label>用户密码:</label>
<!-- 用户密码标签 -->
<input class="itxt" type="password" placeholder="请输入密码" autocomplete="off" tabindex="1" name="password" id="password"
value="${requestScope.password}"/>
<!-- 输入框,供用户输入密码 -->
<!-- 使用 EL 表达式填充之前的密码(如果有的话) -->
<br />
<br />
<label>确认密码:</label>
<!-- 确认密码标签 -->
<input class="itxt" type="password" placeholder="确认密码" autocomplete="off" tabindex="1" name="repwd" id="repwd"
value="${requestScope.repwd}"/>
<!-- 输入框,供用户确认密码 -->
<!-- 使用 EL 表达式填充之前的确认密码(如果有的话) -->
<br />
<br />
<label>电子邮件:</label>
<!-- 电子邮件标签 -->
<input class="itxt" type="text" placeholder="请输入邮箱地址" autocomplete="off" tabindex="1" name="email" id="email"
value="${requestScope.email}"/>
<!-- 输入框,供用户输入电子邮件地址 -->
<!-- 使用 EL 表达式填充之前的邮箱(如果有的话) -->
<br />
<br />
<label>验证码:</label>
<!-- 验证码标签 -->
<input class="itxt" type="text" name="code" style="width: 80px;" id="code"/>
<!-- 输入框,供用户输入验证码 -->
<img id="code_img" alt="" src="kaptcha.jpg" style="float: right; margin-right: 40px;width: 110px;height: 30px">
<!-- 显示验证码图像 -->
<br />
<br />
<input type="submit" value="注册" id="sub_btn" />
<!-- 提交按钮,用户点击后提交表单进行注册 -->
</form>
<div id="content">
<div class="login_form">
<div class="login_box">
<div class="tit">
<h1>注册会员</h1>
<span class="errorMsg">
<%--<%=request.getAttribute("msg")==null? "" : request.getAttribute("msg")%>--%>
${requestScope.msg}
</span>
</div>
<div class="form">
<form action="userServlet" method="post">
<input type="hidden" name="action" value="regist">
<label>用户名称:</label>
<input class="itxt" type="text" placeholder="请输入用户名" autocomplete="off" tabindex="1" name="username" id="username"
value="${requestScope.username}"/>
<br />
<br />
<label>用户密码:</label>
<input class="itxt" type="password" placeholder="请输入密码" autocomplete="off" tabindex="1" name="password" id="password"
value="${requestScope.password}"/>
<br />
<br />
<label>确认密码:</label>
<input class="itxt" type="password" placeholder="确认密码" autocomplete="off" tabindex="1" name="repwd" id="repwd"
value="${requestScope.repwd}"/>
<br />
<br />
<label>电子邮件:</label>
<input class="itxt" type="text" placeholder="请输入邮箱地址" autocomplete="off" tabindex="1" name="email" id="email"
value="${requestScope.email}"/>
<br />
<br />
<label>验证码:</label>
<input class="itxt" type="text" name="code" style="width: 80px;" id="code"/>
<img id="code_img" alt="" src="kaptcha.jpg" style="float: right; margin-right: 40px;width: 110px;height: 30px">
<br />
<br />
<input type="submit" value="注册" id="sub_btn" />
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<%@include file="/pages/common/footer.jsp"%>
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>

@ -1,40 +1,8 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head><%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>注册成功页面</title>
<%@include file="/pages/common/header.jsp"%> <!-- 引入公共头部文件 -->
<style type="text/css">
h1 {
text-align: center; /* 设置标题文本居中对齐 */
margin-top: 200px; /* 顶部外边距设置为200像素 */
}
h1 a {
color:red; /* 设置链接的颜色为红色 */
}
</style>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="static/img/logo.jpg"> <!-- 显示网站Logo -->
<span class="wel_word"></span> <!-- 欢迎词,未赋值 -->
<%@include file="/pages/common/login_success_menu.jsp"%> <!-- 引入登录成功后的菜单 -->
</div>
<div id="main">
<h1>注册成功! <a href="index.jsp">转到主页</a></h1> <!-- 显示注册成功提示,并提供返回主页的链接 -->
</div>
<%@include file="/pages/common/footer.jsp"%> <!-- 引入公共底部文件 -->
</body>
</html>
<meta charset="UTF-8">
<head>
<meta charset="UTF-8">
<title>注册成功页面</title>
<%@include file="/pages/common/header.jsp"%>
<style type="text/css">

@ -9,57 +9,57 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"> <!-- 设置文档字符集为UTF-8 -->
<title>我的个人信息</title> <!-- 设置网页标题 -->
<%@include file="/pages/common/header.jsp"%> <!-- 引入公共头部文件 -->
<meta charset="UTF-8">
<title>我的个人信息</title>
<%@include file="/pages/common/header.jsp"%>
<style type="text/css">
h1 {
text-align: center; /* 设置h1标题文本居中对齐 */
margin-top: 200px; /* 设置h1元素的顶部外边距为200像素 */
text-align: center;
margin-top: 200px;
}
h1 a {
color:red; /* 设置h1中的链接颜色为红色 */
color:red;
}
input {
text-align: center; /* 设置输入框中的文本居中对齐 */
text-align: center;
}
</style>
</head>
<body>
<div id="header"> <!-- 页头部分 -->
<img class="logo_img" alt="" src="static/img/logo1.jpg"> <!-- 网站logo图像 -->
<span class="wel_word">个人信息</span> <!-- 显示欢迎词,标识为"个人信息" -->
<%@include file="/pages/common/login_success_menu.jsp"%> <!-- 引入登录成功后显示的菜单 -->
<div id="header">
<img class="logo_img" alt="" src="static/img/logo1.jpg" >
<span class="wel_word">个人信息</span>
<%@include file="/pages/common/login_success_menu.jsp"%>
</div>
<div id="main"> <!-- 主内容区域 -->
<form action="userServlet" method="post"> <!-- 表单提交到userServlet使用POST方法 -->
<input type="hidden" name="action" value="update"/> <!-- 隐藏字段,用于指示操作类型为"更新" -->
<table> <!-- 使用表格来组织输入字段 -->
<div id="main">
<form action="userServlet" method="post">
<input type="hidden" name="action" value="update"/>
<table>
<tr>
<td>序号</td> <!-- 表头:序号 -->
<td>用户名</td> <!-- 表头:用户名 -->
<td>密码</td> <!-- 表头:密码 -->
<td>电子邮箱</td> <!-- 表头:电子邮箱 -->
<td>收货地址</td> <!-- 表头:收货地址 -->
<td colspan="2">修改</td> <!-- 表头:修改,跨两列 -->
<td>序号</td>
<td>用户名</td>
<td>密码</td>
<td>电子邮箱</td>
<td>收货地址</td>
<td colspan="2">修改</td>
</tr>
<tr>
<td><input name="id" type="text" value="${sessionScope.user.id}"/></td> <!-- 用户ID输入框默认值来自会话 -->
<td><input name="username" type="text" value="${sessionScope.user.username}"/></td> <!-- 用户名输入框,默认值来自会话 -->
<td><input name="password" type="text" value="${sessionScope.user.password}"/></td> <!-- 密码输入框,默认值来自会话 -->
<td><input name="email" type="text" value="${sessionScope.user.email}"/></td> <!-- 电子邮箱输入框,默认值来自会话 -->
<td><input name="address" type="text" value="${sessionScope.user.address}"/></td> <!-- 收货地址输入框,默认值来自会话 -->
<td><input type="submit" value="提交"/></td> <!-- 提交按钮,点击后提交表单 -->
<td><input name="id" type="text" value="${sessionScope.user.id}"/></td>
<td><input name="username" type="text" value="${sessionScope.user.username}"/></td>
<td><input name="password" type="text" value="${sessionScope.user.password}"/></td>
<td><input name="email" type="text" value="${sessionScope.user.email}"/></td>
<td><input name="address" type="text" value="${sessionScope.user.address}"/></td>
<td><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
</div>
<%@include file="/pages/common/footer.jsp"%> <!-- 引入公共页脚文件 -->
<%@include file="/pages/common/footer.jsp"%>
</body>
</html>

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