Compare commits

..

5 Commits

Author SHA1 Message Date
LFE 91168f6431 lfe
4 weeks ago
LFE 7743b2f150 lfe
4 weeks ago
LFE 33b73603ff lfe
4 weeks ago
LFE df7b5a641e lfe
4 weeks ago
LFE 2e4f4cd1e4 lfe
4 weeks ago

@ -13,93 +13,128 @@ import java.util.Map;
*
*/
public class Cart {
// 注释掉的代码表示之前可能考虑过直接存储总数和总价,但在此实现中,选择动态计算这些值
//private Integer totalCount;
//private BigDecimal totalPrice;
/**
*
*/
public Integer getTotalCount() {
Integer totalCount = 0;
// 初始化总数量为0
for (Map.Entry<Integer,CartItem>entry : items.entrySet()) {
// 遍历购物车中的每一项
totalCount += entry.getValue().getCount();
// 累加每一项的数量
}
return totalCount;
// 返回总数量
}
/**
*
*/
public BigDecimal getTotalPrice() {
BigDecimal totalPrice = new BigDecimal(0);
// 初始化总价格为0
for (Map.Entry<Integer,CartItem>entry : items.entrySet()) {
// 遍历购物车中的每一项
totalPrice = totalPrice.add(entry.getValue().getTotalPrice());
// 累加每一项的总价格
}
return totalPrice;
// 返回总价格
}
/**
*
*/
public Map<Integer, CartItem> getItems() {
return items;
// 返回购物车中的商品项
}
/**
*
*/
public void setItems(Map<Integer, CartItem> items) {
this.items = items;
// 设置购物车中的商品项
}
/**
* keyvalue
* Mapkeyvalue使LinkedHashMap
*/
private Map<Integer,CartItem> items = new LinkedHashMap<Integer, CartItem>();
/**
* toString
*/
@Override
public String toString() {
return "Cart{" +
"totalCount=" + getTotalCount() +
// 总数量
", totalPrice=" + getTotalPrice() +
// 总价格
", items=" + items +
// 商品项
'}';
}
/**
*
* @param cartItem
*
* @param cartItem
*/
public void addItem(CartItem cartItem) {
//先查看购物车中是否包含次商品,如果有的话,数量更新,总金额更新;如果没有,直接放到集合中即可
// 先查看购物车中是否包含此商品
CartItem item = items.get(cartItem.getId());
if(item == null) {
//之前没有添加过此商品
// 之前没有添加过此商品,直接添加到购物车中
items.put(cartItem.getId(),cartItem);
} else {
item.setCount(item.getCount() + 1);//数量累计
item.setTotalPrice(item.getPrice().multiply(new BigDecimal(item.getCount())));//更新总金额
// 购物车中已有此商品数量加1并更新总金额
item.setCount(item.getCount() + 1);
// 数量累计
item.setTotalPrice(item.getPrice().multiply(new BigDecimal(item.getCount())));
// 更新总金额
}
}
/**
*
* @param id
*
* @param id
*/
public void deleteItem(Integer id) {
items.remove(id);
// 从购物车中删除指定编号的商品项
}
/**
*
*
*/
public void clear() {
items.clear();
// 清空购物车
}
/**
*
* @param id
* @param count
*
* @param id
* @param count
*/
public void updateCount(Integer id,Integer count) {
//先查看购物车中是否包含次商品,如果有的话,数量更新,总金额更新;
// 先查看购物车中是否包含此商品项
CartItem cartItem = items.get(id);
if(cartItem != null) {
cartItem.setCount(count);
cartItem.setTotalPrice(cartItem.getPrice().multiply(new BigDecimal(cartItem.getCount())));
if(cartItem != null) {
// 购物车中已有此商品项,修改数量并更新总金额
cartItem.setCount(count);
// 修改数量
cartItem.setTotalPrice(cartItem.getPrice().multiply(new BigDecimal(cartItem.getCount())));
// 更新总金额
}
}
}
}

@ -10,72 +10,101 @@ import java.math.BigDecimal;
/**
*
*/
// 定义一个名为CartItem的类代表购物车中的一个商品项
public class CartItem {
// 定义一个私有变量id用于存储商品的唯一标识符
private Integer id;
// 定义一个私有变量name用于存储商品的名称
private String name;
// 定义一个私有变量count用于存储商品的数量
private Integer count;
// 定义一个私有变量price用于存储商品的单价使用BigDecimal类型以支持精确的小数计算
private BigDecimal price;
// 定义一个私有变量totalPrice用于存储商品的总价单价乘以数量同样使用BigDecimal类型
private BigDecimal totalPrice;
// 定义一个公开的getter方法用于获取商品的id
public Integer getId() {
return id;
}
// 定义一个公开的setter方法用于设置商品的id
public void setId(Integer id) {
this.id = id;
}
// 定义一个公开的getter方法用于获取商品的名称
public String getName() {
return name;
}
// 定义一个公开的setter方法用于设置商品的名称
public void setName(String name) {
this.name = name;
}
// 定义一个公开的getter方法用于获取商品的数量
public Integer getCount() {
return count;
}
// 定义一个公开的setter方法用于设置商品的数量
public void setCount(Integer count) {
this.count = count;
}
// 定义一个公开的getter方法用于获取商品的单价
public BigDecimal getPrice() {
return price;
}
// 定义一个公开的setter方法用于设置商品的单价
public void setPrice(BigDecimal price) {
this.price = price;
}
// 定义一个公开的getter方法用于获取商品的总价
public BigDecimal getTotalPrice() {
return totalPrice;
}
// 定义一个公开的setter方法用于设置商品的总价
public void setTotalPrice(BigDecimal totalPrice) {
this.totalPrice = totalPrice;
}
// 定义一个公开的构造方法用于创建CartItem对象并初始化其所有属性
public CartItem(Integer id, String name, Integer count, BigDecimal price, BigDecimal totalPrice) {
// 使用this关键字将传入的id参数赋值给当前对象的id属性
this.id = id;
// 设置商品的唯一标识符
// 使用this关键字将传入的name参数赋值给当前对象的name属性
this.name = name;
// 设置商品的名称
// 使用this关键字将传入的count参数赋值给当前对象的count属性
this.count = count;
// 设置商品的数量
// 使用this关键字将传入的price参数赋值给当前对象的price属性
this.price = price;
// 设置商品的单价使用BigDecimal类型以支持精确的小数计算
// 使用this关键字将传入的totalPrice参数赋值给当前对象的totalPrice属性
this.totalPrice = totalPrice;
// 设置商品的总价单价乘以数量同样使用BigDecimal类型
}
// 定义一个无参构造方法用于创建CartItem对象时不初始化任何属性
public CartItem() {
}
// 重写toString方法用于返回CartItem对象的字符串表示形式
@Override
public String toString() {
// 返回的字符串包含CartItem对象的所有属性信息
return "Cart{" +
"id=" + id +
// 显示商品的id
", name='" + name + '\'' +
// 显示商品的名称
", count=" + count +
// 显示商品的数量
", price=" + price +
// 显示商品的单价
", totalPrice=" + totalPrice +
// 显示商品的总价
'}';
}
}

@ -1,90 +1,118 @@
package com.yj.bean;
// 定义包名,用于组织相关的类和接口
import java.util.List;
// 导入List接口用于存储数据集合
/**
* @author yj
* @create 2020-08-25 9:27
* @author yj // 类的作者
* @create 2020-08-25 9:27 // 类的创建时间
*/
public class Page <T>{
// 定义一个泛型类PageT表示该Page类可以持有任何类型的对象
public static final Integer PAGE_SIZE = 4;
// 定义一个常量,表示每页显示的数据条数
//当前页
private Integer pageNo;
// 当前页码
//总页码
private Integer pageTotal;
// 总页数
//当前页显示数量
private Integer pageSize = PAGE_SIZE;
// 每页显示的数据条数默认为常量PAGE_SIZE的值
//总的记录数
private Integer pageTotalCount;
// 数据总条数
//当前页数据
private List<T> items;
// 存储当前页的数据
//分页条的请求地址
private String url;
// 分页条请求的URL地址
// 获取分页条请求的URL地址
public String getUrl() {
return url;
}
// 设置分页条请求的URL地址
public void setUrl(String url) {
this.url = url;
}
// 获取当前页码
public Integer getPageNo() {
return pageNo;
}
// 获取总页数
public Integer getPageTotal() {
return pageTotal;
}
// 设置总页数
public void setPageTotal(Integer pageTotal) {
this.pageTotal = pageTotal;
}
// 获取每页显示的数据条数
public Integer getPageSize() {
return pageSize;
}
// 设置每页显示的数据条数
public void setPageSize(Integer pageSize) {
this.pageSize = pageSize;
}
// 获取数据总条数
public Integer getPageTotalCount() {
return pageTotalCount;
}
// 设置数据总条数
public void setPageTotalCount(Integer pageTotalCount) {
this.pageTotalCount = pageTotalCount;
}
// 获取当前页的数据
public List<T> getItems() {
return items;
}
// 设置当前页的数据
public void setItems(List<T> items) {
this.items = items;
}
// 设置当前页码
public void setPageNo(Integer pageNo) {
this.pageNo = pageNo;
}
// 重写toString方法用于打印Page对象的详细信息
@Override
public String toString() {
return "Page{" +
"pageNo=" + pageNo +
// 当前页码
", pageTotal=" + pageTotal +
// 总页数
", pageSize=" + pageSize +
// 每页显示的数据条数
", pageTotalCount=" + pageTotalCount +
// 数据总条数
", items=" + items +
// 当前页的数据
", url='" + url + '\'' +
// 分页条请求的URL地址
'}';
}
}
}

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

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

@ -1,85 +1,124 @@
package com.yj.dao.impl;
// 定义包名,组织相关的类
import com.yj.utils.JDBCUtils;
// 导入JDBC工具类用于获取数据库连接
import org.apache.commons.dbutils.QueryRunner;
// 导入DbUtils的QueryRunner类用于简化JDBC操作
import org.apache.commons.dbutils.handlers.BeanHandler;
// 导入BeanHandler用于将结果集的第一行数据封装为JavaBean对象
import org.apache.commons.dbutils.handlers.BeanListHandler;
// 导入BeanListHandler用于将结果集的每一行数据封装为JavaBean对象并存储在List集合中
import org.apache.commons.dbutils.handlers.ScalarHandler;
// 导入ScalarHandler用于返回结果集的一行一列数据
import java.sql.Connection;
// 导入Connection接口用于数据库连接
import java.sql.SQLException;
// 导入SQLException类处理SQL异常
import java.util.List;
// 导入List接口用于存储数据集合
/**
* @author yj
* @create 2020-08-21 11:32
* @author yj // 类的作者
* @create 2020-08-21 11:32 // 类的创建时间
*/
public abstract class BaseDao {
//使用DbUtils操作数据库
// 定义一个抽象类BaseDao作为数据访问层的基类
// 使用DbUtils操作数据库
private QueryRunner queryRunner = new QueryRunner();
/*
*update()Insert\Update\Delete
// 初始化QueryRunner对象用于执行SQL语句
/**
* update()Insert\Update\Delete
* @param sql SQL
* @param args SQL
* @return -1
*/
public int update(String sql,Object ... args) {
public int update(String sql, Object ... args) {
Connection connection = JDBCUtils.getConnection();
// 调用JDBCUtils工具类获取数据库连接
try {
return queryRunner.update(connection,sql,args);
// 使用QueryRunner的update方法执行更新操作并返回影响的行数
return queryRunner.update(connection, sql, args);
} catch (SQLException e) {
e.printStackTrace();
// 打印SQL异常堆栈信息
throw new RuntimeException(e);
// 将SQL异常转换为运行时异常抛出
} finally {
// 注意原代码中缺少了关闭连接的逻辑应在此处添加但在实际使用中JDBCUtils的getConnection可能已负责关闭
// JDBCUtils.close(connection); // 关闭数据库连接
}
}
/**
*JavabeanSQL
* JavabeanSQL
* @param type
* @param sql sql
* @param args sql
* @param sql SQL
* @param args SQL
* @param <T>
* @return
* @return JavaBean
*/
public <T> T queryForOne(Class<T> type,String sql,Object ... args) {
public <T> T queryForOne(Class<T> type, String sql, Object ... args) {
Connection connection = JDBCUtils.getConnection();
// 获取数据库连接
try {
return queryRunner.query(connection,sql,new BeanHandler<T>(type),args);
// 使用QueryRunner的query方法执行查询操作并将结果集的第一行数据封装为指定的JavaBean对象
return queryRunner.query(connection, sql, new BeanHandler<T>(type), args);
} catch (SQLException e) {
e.printStackTrace();
// 打印SQL异常堆栈信息
throw new RuntimeException(e);
// 将SQL异常转换为运行时异常抛出
} finally {
// 注意:同样缺少了关闭连接的逻辑,应在实际使用中添加
}
}
/**
*JavabeanSQL
* JavabeanSQL
* @param type
* @param sql sql
* @param args sql
* @param sql SQL
* @param args SQL
* @param <T>
* @return
* @return JavaBean
*/
public <T> List<T> queryForList(Class<T> type, String sql, Object ... args) {
Connection connection = JDBCUtils.getConnection();
// 获取数据库连接
try {
return queryRunner.query(connection,sql,new BeanListHandler<T>(type),args);
// 使用QueryRunner的query方法执行查询操作并将结果集的每一行数据封装为指定的JavaBean对象存储在List集合中返回
return queryRunner.query(connection, sql, new BeanListHandler<T>(type), args);
} catch (SQLException e) {
e.printStackTrace();
// 打印SQL异常堆栈信息
throw new RuntimeException(e);
// 将SQL异常转换为运行时异常抛出
} finally {
// 注意:同样缺少了关闭连接的逻辑,应在实际使用中添加
}
}
/**
* sql
* @param sql sql
* @param args sql
* @return
* SQL
* @param sql SQL
* @param args SQL
* @return
*/
public Object queryForSingleValue(String sql,Object ... args) {
public Object queryForSingleValue(String sql, Object ... args) {
Connection connection = JDBCUtils.getConnection();
// 获取数据库连接
try {
return queryRunner.query(connection,sql,new ScalarHandler(),args);
}catch (SQLException e) {
// 使用QueryRunner的query方法执行查询操作并返回结果集的一行一列数据
return queryRunner.query(connection, sql, new ScalarHandler(), args);
} catch (SQLException e) {
e.printStackTrace();
// 打印SQL异常堆栈信息
throw new RuntimeException(e);
// 将SQL异常转换为运行时异常抛出
} finally {
// 注意同样缺少了关闭连接的逻辑但在实际中JDBCUtils的getConnection可能已负责关闭连接
}
}
}
}

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

@ -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,44 +10,64 @@ import java.math.BigDecimal;
* @author yj
* @create 2020-08-26 20:30
*/
// 定义一个测试类CartTest用于测试Cart类的功能
public class CartTest {
// 使用@Test注解标记的方法表示这是一个测试方法通常与测试框架如JUnit一起使用
@Test
public void addItem() {
// 创建一个新的Cart对象
Cart cart = new Cart();
// 向购物车中添加一个商品项注意这里totalPrice应该是根据price和count计算得出的但此处直接给出
cart.addItem(new CartItem(1,"lkjs",1,new BigDecimal(5),new BigDecimal(66)));
// 再次添加相同的商品项,理论上应该更新数量而不是添加新项(但根据代码,它会添加新项)
cart.addItem(new CartItem(1,"lkjs",1,new BigDecimal(5),new BigDecimal(66)));
// 添加一个不同的商品项
cart.addItem(new CartItem(2,"你妹的",1,new BigDecimal(5),new BigDecimal(66)));
// 打印购物车的内容输出将取决于Cart类的toString方法实现
System.out.println(cart);
}
// 另一个测试方法,用于测试删除商品项的功能
@Test
public void deleteItem() {
// 创建一个新的Cart对象并添加一些商品项
Cart cart = new Cart();
cart.addItem(new CartItem(1,"lkjs",1,new BigDecimal(5),new BigDecimal(66)));
cart.addItem(new CartItem(1,"lkjs",1,new BigDecimal(5),new BigDecimal(66)));
cart.addItem(new CartItem(2,"你妹的",1,new BigDecimal(5),new BigDecimal(66)));
// 根据商品ID删除商品项理论上应该删除所有ID匹配的项
cart.deleteItem(1);
// 打印购物车的内容,查看删除操作的结果
System.out.println(cart);
}
// 测试清空购物车的方法
@Test
public void clear() {
// 创建一个新的Cart对象并添加一些商品项
Cart cart = new Cart();
cart.addItem(new CartItem(1,"lkjs",1,new BigDecimal(5),new BigDecimal(66)));
cart.addItem(new CartItem(1,"lkjs",1,new BigDecimal(5),new BigDecimal(66)));
cart.addItem(new CartItem(2,"你妹的",1,new BigDecimal(5),new BigDecimal(66)));
// 清空购物车中的所有商品项
cart.clear();
// 打印购物车的内容,应该为空
System.out.println(cart);
}
// 测试更新商品数量的方法
@Test
public void updateCount() {
// 创建一个新的Cart对象并添加一些商品项
Cart cart = new Cart();
cart.addItem(new CartItem(1,"lkjs",1,new BigDecimal(5),new BigDecimal(66)));
cart.addItem(new CartItem(1,"lkjs",1,new BigDecimal(5),new BigDecimal(66)));
cart.addItem(new CartItem(2,"你妹的",1,new BigDecimal(5),new BigDecimal(66)));
// 根据商品ID更新商品数量注意这里可能需要根据业务逻辑决定是更新现有项还是添加新项
cart.updateCount(1,5);
// 假设意图是将ID为1的商品数量更新为5
// 打印购物车的内容,查看更新操作的结果
System.out.println(cart);
}
}

@ -1,29 +1,44 @@
package com.yj.test;
// 声明包名,用于组织类
import com.yj.utils.JDBCUtils;
// 导入JDBCUtils工具类用于数据库连接
import org.junit.Test;
// 导入JUnit测试注解
import java.sql.Connection;
// 导入Connection接口用于数据库连接
import java.sql.ResultSet;
// 导入ResultSet接口用于处理查询结果集
import java.sql.Statement;
// 导入Statement接口用于执行SQL语句
/**
* @author yj
* @create 2020-08-21 11:25
*/
public class JDBCUtilsTest {
@Test
public class JDBCUtilsTest { // 定义一个测试类
@Test // 标记此方法为一个测试方法
public void testJdbcUtils() {
// 定义一个测试方法
Connection connection = JDBCUtils.getConnection();
// 通过JDBCUtils工具类获取数据库连接
String sql = "select * from t_book";
// 定义SQL查询语句查询t_book表中的所有记录
try (Statement st = connection.createStatement()) {
// 创建Statement对象用于执行SQL语句使用try-with-resources语法自动关闭资源
ResultSet rs = st.executeQuery(sql);
while(rs.next()){
// 执行查询语句并将结果存储在ResultSet对象中
while(rs.next()){ // 遍历ResultSet对象中的每一条记录
System.out.println(rs.getString("author")+" "
// 从当前记录中获取"author"字段的值,并输出
+rs.getString("name"));
// 从当前记录中获取"name"字段的值,并输出,与"author"字段的值用空格分隔
}
}catch (Exception e) {
// 捕获并处理异常
e.printStackTrace();
// 打印异常堆栈信息
}
}
}
}

@ -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() {
// 该方法尚未实现,用于测试分页查询用户的逻辑
}
}
}

@ -1,79 +1,107 @@
package com.yj.utils;
// 声明包名
import com.alibaba.druid.pool.DruidDataSource;
// 导入Druid连接池的数据源类
import com.alibaba.druid.pool.DruidDataSourceFactory;
// 导入Druid连接池的工厂类
import com.alibaba.druid.util.JdbcUtils;
// 导入Druid的工具类注意此处的JdbcUtils并非JDK自带的而是Druid框架提供的但在此代码中未直接使用
import java.io.InputStream;
// 导入输入流接口
import java.sql.Connection;
// 导入数据库连接接口
import java.sql.SQLException;
// 导入SQL异常类
import java.util.Properties;
// 导入属性类
/**
* @author yj
* @create 2020-08-21 10:48
*/
public class JDBCUtils {
// 定义一个工具类
private static DruidDataSource dataSource;
// 定义一个静态的Druid数据源对象
private static ThreadLocal<Connection> conns = new ThreadLocal<Connection>();
// 定义一个ThreadLocal对象用于存储每个线程的数据库连接
static {
// 静态代码块,用于初始化静态变量
try {
Properties properties = new Properties();
//读取jdbc.properties属性配置文件
InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties" );
//从流中加载数据
// 创建一个属性对象
// 读取jdbc.properties属性配置文件
InputStream inputStream = JdbcUtils.class.getClassLoader().getResourceAsStream("jdbc.properties");
// 从流中加载数据到属性对象中
properties.load(inputStream);
//创建数据库连接池
// 创建数据库连接池
dataSource = (DruidDataSource) DruidDataSourceFactory.createDataSource(properties);
// 使用Druid工厂类创建数据源对象
} catch (Exception e) {
// 捕获异常
e.printStackTrace();
// 打印异常堆栈信息
}
}
/*
@retrun null
/**
*
* @return null
*/
public static Connection getConnection() {
Connection conn = conns.get();
if(conn == null) {
try {
conn = dataSource.getConnection();//从数据库池中获取连接
conns.set(conn);//保存到ThreadLocal对象中供后面的JDBC操作使用
conn.setAutoCommit(false);//设置为手动管理事务
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
return conn;
// 定义一个静态方法,用于获取数据库连接
Connection conn = conns.get();
// 从ThreadLocal对象中获取当前线程的连接
if(conn == null) {
// 如果当前线程没有连接
try {
conn = dataSource.getConnection();
// 从数据库池中获取连接
conns.set(conn);
// 将连接保存到ThreadLocal对象中供后面的JDBC操作使用
conn.setAutoCommit(false);
// 设置为手动管理事务
} catch (SQLException throwables) {
// 捕获SQL异常
throwables.printStackTrace();
// 打印异常堆栈信息
}
}
return conn;
// 返回连接
}
/**
*
*/
public static void commitAndClose() {
// 定义一个静态方法,用于提交事务并关闭连接
Connection connection = conns.get();
// 从ThreadLocal对象中获取连接
if(connection!=null) {
// 如果连接不为空
try {
connection.commit();//提交事务
connection.commit();// 提交事务
} catch (SQLException throwables) {
// 捕获SQL异常
throwables.printStackTrace();
// 打印异常堆栈信息
}finally {
try {
connection.close();//关闭连接释放资源
connection.close();
// 关闭连接释放资源
} catch (SQLException throwables) {
// 捕获SQL异常
throwables.printStackTrace();
// 打印异常堆栈信息
}
}
}
//一定要执行remove操作否则就会出错因为tomcat底层使用了线程池技术
// 移除ThreadLocal对象中的连接防止内存泄漏特别是在使用线程池时
conns.remove();
}
@ -81,35 +109,45 @@ public class JDBCUtils {
*
*/
public static void rollbackAndClose() {
// 定义一个静态方法,用于回滚事务并关闭连接
Connection connection = conns.get();
// 从ThreadLocal对象中获取连接
if(connection!=null) {
// 如果连接不为空
try {
connection.rollback();//回滚事务
connection.rollback();
// 回滚事务
} catch (SQLException throwables) {
// 捕获SQL异常
throwables.printStackTrace();
// 打印异常堆栈信息
}finally {
try {
connection.close();//关闭连接释放资源
connection.close();
// 关闭连接释放资源
} catch (SQLException throwables) {
// 捕获SQL异常
throwables.printStackTrace();
// 打印异常堆栈信息
}
}
}
//一定要执行remove操作否则就会出错因为tomcat底层使用了线程池技术
// 移除ThreadLocal对象中的连接防止内存泄漏特别是在使用线程池时
conns.remove();
}
/*
使
public static void close(Connection conn) {
if(conn != null) {
try {
conn.close();
// 这里实际上并不是将连接关闭,而是将连接归还给连接池(对于连接池而言)
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
}*/
}
}

@ -12,10 +12,11 @@ import java.util.Arrays;
public class PaymentUtil {
// 定义字符编码
private static String encodingCharset = "UTF-8";
/**
* hmac
* hmac
*
* @param p0_Cmd
* @param p1_MerId
@ -31,45 +32,34 @@ public class PaymentUtil {
* @param pd_FrpId
* @param pr_NeedResponse
* @param keyValue
* @return
* @return hmac
*/
public static String buildHmac(String p0_Cmd,String p1_MerId,
String p2_Order, String p3_Amt, String p4_Cur,String p5_Pid, String p6_Pcat,
String p7_Pdesc,String p8_Url, String p9_SAF,String pa_MP,String pd_FrpId,
String pr_NeedResponse,String keyValue) {
public static String buildHmac(String p0_Cmd, String p1_MerId,
String p2_Order, String p3_Amt, String p4_Cur, String p5_Pid, String p6_Pcat,
String p7_Pdesc, String p8_Url, String p9_SAF, String pa_MP, String pd_FrpId,
String pr_NeedResponse, String keyValue) {
StringBuilder sValue = new StringBuilder();
// 业务类型
// 依次追加所有参数到StringBuilder
sValue.append(p0_Cmd);
// 商户编号
sValue.append(p1_MerId);
// 商户订单号
sValue.append(p2_Order);
// 支付金额
sValue.append(p3_Amt);
// 交易币种
sValue.append(p4_Cur);
// 商品名称
sValue.append(p5_Pid);
// 商品种类
sValue.append(p6_Pcat);
// 商品描述
sValue.append(p7_Pdesc);
// 商户接收支付成功数据的地址
sValue.append(p8_Url);
// 送货地址
sValue.append(p9_SAF);
// 商户扩展信息
sValue.append(pa_MP);
// 银行编码
sValue.append(pd_FrpId);
// 应答机制
sValue.append(pr_NeedResponse);
// 调用hmacSign方法生成签名
return PaymentUtil.hmacSign(sValue.toString(), keyValue);
}
/**
* hmac
* hmac
*
* @param hmac
* @param p1_MerId
@ -84,57 +74,54 @@ public class PaymentUtil {
* @param r8_MP
* @param r9_BType
* @param keyValue
* @return
* @return true
*/
public static boolean verifyCallback(String hmac, String p1_MerId,
String r0_Cmd, String r1_Code, String r2_TrxId, String r3_Amt,
String r4_Cur, String r5_Pid, String r6_Order, String r7_Uid,
String r8_MP, String r9_BType, String keyValue) {
StringBuilder sValue = new StringBuilder();
// 商户编号
// 依次追加所有回调参数到StringBuilder
sValue.append(p1_MerId);
// 业务类型
sValue.append(r0_Cmd);
// 支付结果
sValue.append(r1_Code);
// 易宝支付交易流水号
sValue.append(r2_TrxId);
// 支付金额
sValue.append(r3_Amt);
// 交易币种
sValue.append(r4_Cur);
// 商品名称
sValue.append(r5_Pid);
// 商户订单号
sValue.append(r6_Order);
// 易宝支付会员ID
sValue.append(r7_Uid);
// 商户扩展信息
sValue.append(r8_MP);
// 交易结果返回类型
sValue.append(r9_BType);
// 调用hmacSign方法生成签名并与支付网关的签名比较
String sNewString = PaymentUtil.hmacSign(sValue.toString(), keyValue);
return sNewString.equals(hmac);
}
/**
* @param aValue
* @param aKey
* @return
* 使HMAC-MD5
*
* @param aValue
* @param aKey
* @return
*/
public static String hmacSign(String aValue, String aKey) {
// 初始化内部填充字节数组
byte k_ipad[] = new byte[64];
byte k_opad[] = new byte[64];
byte keyb[];
byte value[];
try {
// 使用指定的字符编码获取字节数组
keyb = aKey.getBytes(encodingCharset);
value = aValue.getBytes(encodingCharset);
} catch (UnsupportedEncodingException e) {
// 如果不支持指定的字符编码,则使用默认字符编码
keyb = aKey.getBytes();
value = aValue.getBytes();
}
// 填充k_ipad和k_opad数组
Arrays.fill(k_ipad, keyb.length, 64, (byte) 54);
Arrays.fill(k_opad, keyb.length, 64, (byte) 92);
for (int i = 0; i < keyb.length; i++) {
@ -142,23 +129,32 @@ public class PaymentUtil {
k_opad[i] = (byte) (keyb[i] ^ 0x5c);
}
// 获取MD5算法的MessageDigest实例
MessageDigest md = null;
try {
md = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
// 如果MD5算法不可用则返回null
return null;
}
// 对k_ipad和待签名数据进行更新
md.update(k_ipad);
md.update(value);
byte dg[] = md.digest();
md.reset();
byte dg[] = md.digest(); // 进行第一次摘要
md.reset(); // 重置MessageDigest实例
// 对k_opad和第一次摘要结果进行更新
md.update(k_opad);
md.update(dg, 0, 16);
dg = md.digest();
return toHex(dg);
dg = md.digest(); // 进行第二次摘要,得到最终的签名
return toHex(dg); // 将字节数组转换为十六进制字符串
}
/**
*
*
* @param input
* @return
*/
public static String toHex(byte input[]) {
if (input == null)
return null;
@ -169,15 +165,15 @@ public class PaymentUtil {
output.append("0");
output.append(Integer.toString(current, 16));
}
return output.toString();
}
/**
* HMAC
*
* @param args
* @param key
* @return
* @param args
* @param key
* @return HMAC
*/
public static String getHmac(String[] args, String key) {
if (args == null || args.length == 0) {
@ -191,8 +187,10 @@ public class PaymentUtil {
}
/**
* @param aValue
* @return
* 使SHA
*
* @param aValue
* @return
*/
public static String digest(String aValue) {
aValue = aValue.trim();

@ -1,12 +1,20 @@
// 导入所需的包和类
package com.yj.web;
import com.google.gson.Gson;
// 用于将Java对象转换为JSON字符串
import com.yj.bean.Book;
// 书籍实体类
import com.yj.bean.Cart;
// 购物车实体类
import com.yj.bean.CartItem;
// 购物车商品项实体类
import com.yj.service.BookService;
// 书籍服务接口
import com.yj.service.impl.BookServiceImpl;
// 书籍服务接口的实现类
import com.yj.utils.WebUtils;
// 工具类用于处理Web请求中的常见操作
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
@ -15,100 +23,93 @@ import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
/**
* @author yj
* @create 2020-08-27 9:47
*/
// 定义一个Servlet类用于处理与购物车相关的请求
public class CartServlet extends BaseServlet {
// 创建一个书籍服务实例,用于访问书籍数据
private BookService bookService = new BookServiceImpl();
// 处理通过AJAX方式添加商品到购物车的请求
protected void ajaxAddItem(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int id = WebUtils.parseInt(req.getParameter("id"),0);
// 从请求中获取书籍ID并转换为整数类型默认为0
int id = WebUtils.parseInt(req.getParameter("id"), 0);
// 根据书籍ID查询书籍信息
Book book = bookService.queryBookById(id);
CartItem cartItem = new CartItem(book.getId(),book.getName(),1,book.getPrice(),book.getPrice());
// 创建一个购物车商品项实例数量为1单价和总价均为书籍价格
CartItem cartItem = new CartItem(book.getId(), book.getName(), 1, book.getPrice(), book.getPrice());
// 从会话中获取购物车对象,如果不存在则创建一个新的购物车对象
Cart cart = (Cart) req.getSession().getAttribute("cart");
if(cart==null) {
if (cart == null) {
cart = new Cart();
req.getSession().setAttribute("cart",cart);
req.getSession().setAttribute("cart", cart);
}
// 将商品项添加到购物车中
cart.addItem(cartItem);
req.getSession().setAttribute("lastName",cartItem.getName());
// 在会话中保存最后添加的商品名称(可能用于显示或提示)
req.getSession().setAttribute("lastName", cartItem.getName());
//返回购物车总数量和最后一个商品的名称
Map<String,Object> resultMap = new HashMap<String,Object>();
resultMap.put("totalCount",cart.getTotalCount());
resultMap.put("lastName",cartItem.getName());
// 准备返回给客户端的数据,包括购物车总数量和最后一个商品的名称
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("totalCount", cart.getTotalCount());
resultMap.put("lastName", cartItem.getName());
// 使用Gson将Map对象转换为JSON字符串
Gson gson = new Gson();
String resultMapJsonString = gson.toJson(resultMap);
// 将JSON字符串写入响应中
resp.getWriter().write(resultMapJsonString);
}
/**
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
// 处理添加商品到购物车的请求非AJAX方式
protected void addItem(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int id = WebUtils.parseInt(req.getParameter("id"),0);
Book book = bookService.queryBookById(id);
CartItem cartItem = new CartItem(book.getId(),book.getName(),1,book.getPrice(),book.getPrice());
// 以下代码与ajaxAddItem方法中的代码大致相同只是最后返回的是页面重定向
int id = WebUtils.parseInt(req.getParameter("id"), 0);
Book book = bookService.queryBookById(id);
CartItem cartItem = new CartItem(book.getId(), book.getName(), 1, book.getPrice(), book.getPrice());
Cart cart = (Cart) req.getSession().getAttribute("cart");
if(cart==null) {
if (cart == null) {
cart = new Cart();
req.getSession().setAttribute("cart",cart);
req.getSession().setAttribute("cart", cart);
}
cart.addItem(cartItem);
req.getSession().setAttribute("lastName",cartItem.getName());
req.getSession().setAttribute("lastName", cartItem.getName());
// 重定向到请求来源页面通常是通过Referer头部获取的
resp.sendRedirect(req.getHeader("Referer"));
}
/**
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
// 处理删除购物车中商品项的请求
protected void deleteItem(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int id = WebUtils.parseInt(req.getParameter("id"),0);
// 从请求中获取要删除的商品项ID
int id = WebUtils.parseInt(req.getParameter("id"), 0);
// 从会话中获取购物车对象
Cart cart = (Cart) req.getSession().getAttribute("cart");
if(cart!=null) {
// 如果购物车对象存在则删除指定ID的商品项
if (cart != null) {
cart.deleteItem(id);
resp.sendRedirect(req.getHeader("Referer"));
}
// 重定向到请求来源页面
resp.sendRedirect(req.getHeader("Referer"));
}
/**
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
// 处理清空购物车中所有商品项的请求
protected void clearItem(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().removeAttribute("cart");
// 从会话中移除购物车对象,从而清空购物车
req.getSession().removeAttribute("cart");
// 重定向到请求来源页面
resp.sendRedirect(req.getHeader("Referer"));
}
/**
*
* @param req
* @param resp
* @throws ServletException
* @throws IOException
*/
// 处理修改购物车中商品项数量的请求
protected void updateCount(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
int id = WebUtils.parseInt(req.getParameter("id"),0);
int count = WebUtils.parseInt(req.getParameter("count"),1);
// 从请求中获取要修改的商品项ID和新的数量
int id = WebUtils.parseInt(req.getParameter("id"), 0);
int count = WebUtils.parseInt(req.getParameter("count"), 1);
// 从会话中获取购物车对象
Cart cart = (Cart) req.getSession().getAttribute("cart");
if(cart!=null) {
cart.updateCount(id,count);
resp.sendRedirect(req.getHeader("Referer"));
// 如果购物车对象存在则修改指定ID的商品项数量
if (cart != null) {
cart.updateCount(id, count);
}
// 重定向到请求来源页面
resp.sendRedirect(req.getHeader("Referer"));
}
}
}

@ -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,28 +1,45 @@
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 引入JSTL核心标签库用于简化JSP页面的内容 -->
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- 设置页面内容类型和字符编码 -->
<!DOCTYPE html>
<!-- 声明文档类型为HTML5 -->
<html>
<head>
<meta charset="UTF-8">
<title>购物车</title>
<meta charset="UTF-8">
<!-- 设置页面的字符编码 -->
<title>购物车</title>
<!-- 设置页面标题 -->
<%@include file="/pages/common/header.jsp"%>
<!-- 引入头部文件通常包含CSS和JavaScript的引用 -->
<script type="text/javascript">
$(function () {
// 当文档加载完成后执行的函数
$("a.deleteItem").click(function () {
// 为删除按钮绑定点击事件
return confirm("你确定要删除【"+$(this).parent().parent().find("td:first").text() +"】么?");
// 弹出确认框询问是否删除
});
$("#clearCart").click(function () {
// 为清空购物车按钮绑定点击事件
return confirm("你确定要清空购物车么?");
// 弹出确认框询问是否清空购物车
});
$(".updateCount").change(function () {
// 为数量输入框绑定值改变事件
var name = $(this).parent().parent().find("td:first").text();
// 获取商品名称
var count = this.value;
// 获取输入的新数量
var id = $(this).attr("bookId");
// 获取商品的ID
if(confirm("你确定要修改【"+name+"】数量为"+count+"么?")) {
location.href="http://localhost:8080/Book/cartServlet?action=updateCount&count="+count+"&id="+id;
// 弹出确认框询问是否修改数量
location.href="http://localhost:8080/Book/cartServlet?action=updateCount&count="+count+"&id="+id; // 跳转到更新数量的Servlet
} else {
this.value = this.defaultValue;
// 如果取消,则恢复默认数量
}
})
});
@ -30,58 +47,80 @@
</script>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="static/img/logo.jpg" >
<span class="wel_word">购物车</span>
<%@include file="/pages/common/login_success_menu.jsp"%>
</div>
<div id="main">
<table>
<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">
<!-- 主内容区域 -->
<table>
<!-- 商品列表表格 -->
<tr>
<td>商品名称</td>
<td>数量</td>
<td>单价</td>
<td>金额</td>
<td>操作</td>
</tr>
<c:if test="${empty sessionScope.cart.items}">
<!-- 判断购物车是否为空 -->
<tr>
<td>商品名称</td>
<td>数量</td>
<td>单价</td>
<td>金额</td>
<td>操作</td>
<td colspan="5"><a href="index.jsp">亲,当前购物车为空,快去和小伙伴浏览书籍吧! </a> </td>
<!-- 显示购物车为空的信息 -->
</tr>
</c:if>
<c:if test="${empty sessionScope.cart.items}">
<c:if test="${not empty sessionScope.cart.items}">
<!-- 判断购物车是否不为空 -->
<c:forEach items="${sessionScope.cart.items}" var="entry">
<!-- 遍历购物车中的商品 -->
<tr>
<td colspan="5"><a href="index.jsp">亲,当前购物车为空,快去和小伙伴浏览书籍吧! </a> </td>
<td>${entry.value.name}</td>
<!-- 显示商品名称 -->
<td>
<input class="updateCount" style="width: 70px;" bookId="${entry.value.id}" type="text" value="${entry.value.count}">
<!-- 数量输入框 -->
</td>
<td>${entry.value.price}</td>
<!-- 显示商品单价 -->
<td>${entry.value.totalPrice}</td>
<!-- 显示商品总价 -->
<td><a class="deleteItem" href="cartServlet?action=deleteItem&id=${entry.value.id}">删除</a></td>
<!-- 删除按钮 -->
</tr>
</c:if>
</c:forEach>
</c:if>
<c:if test="${not empty sessionScope.cart.items}">
<c:forEach items="${sessionScope.cart.items}" var="entry">
<tr>
<td>${entry.value.name}</td>
<td>
<input class="updateCount" style="width: 70px;" bookId="${entry.value.id}" type="text" value="${entry.value.count}">
</td>
<td>${entry.value.price}</td>
<td>${entry.value.totalPrice}</td>
<td><a class="deleteItem" href="cartServlet?action=deleteItem&id=${entry.value.id}">删除</a></td>
</tr>
</c:forEach>
</c:if>
</table>
<c:if test="${not empty sessionScope.cart.items}">
</table>
<c:if test="${not empty sessionScope.cart.items}">
<!-- 判断购物车是否不为空 -->
<div class="cart_info">
<!-- 购物车信息区域 -->
<span class="cart_span">购物车中共有<span class="b_count">${sessionScope.cart.totalCount}</span>本书籍</span>
<!-- 显示购物车中商品的总数 -->
<span class="cart_span">总金额<span class="b_price">${sessionScope.cart.totalPrice}</span>元</span>
<!-- 显示购物车中商品的总金额 -->
<span class="cart_span"><a id="clearCart" href="cartServlet?action=clearItem">清空购物车</a></span>
<!-- 清空购物车按钮 -->
<span class="cart_span"><a href="client/orderServlet?action=isLogin">去结账</a></span>
<!-- 去结账按钮 -->
</div>
</c:if>
</c:if>
</div>
</div>
<%@include file="/pages/common/footer.jsp"%>
<%@include file="/pages/common/footer.jsp"%>
<!-- 引入页脚文件 -->
</body>
</html>
</html>

@ -1,32 +1,52 @@
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- 指定页面使用的内容类型为HTML字符集为UTF-8并声明使用Java作为脚本语言 -->
<!DOCTYPE html>
<!-- 声明文档类型为HTML5 -->
<html>
<!-- HTML文档的根元素 -->
<head>
<meta charset="UTF-8">
<title>结算页面</title>
<!-- 头部元素,包含文档的元数据 -->
<meta charset="UTF-8">
<!-- 设置文档的字符编码为UTF-8 -->
<title>结算页面</title>
<!-- 设置网页的标题 -->
<%@include file="/pages/common/header.jsp"%>
<style type="text/css">
<!-- 包含插入一个公共的头部JSP文件通常包含CSS和JavaScript链接 -->
<style type="text/css">
<!-- 定义内嵌的CSS样式 -->
h1 {
<!-- 设置h1标签的样式 -->
text-align: center;
<!-- 文本居中对齐 -->
margin-top: 200px;
<!-- 上边距为200像素 -->
}
</style>
</style>
</head>
<body>
<div id="header">
<img class="logo_img" alt="" src="static/img/logo.jpg" >
<span class="wel_word">结算</span>
<%@include file="/pages/common/login_success_menu.jsp"%>
</div>
<div id="main">
<h1>你的订单已结算,订单号为${sessionScope.orderId},店主很快就会发货啦!</h1>
</div>
<!-- 网页的主体部分 -->
<%@include file="/pages/common/footer.jsp"%>
<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"%>
<!-- 包含登录成功后的菜单JSP文件 -->
</div>
<div id="main">
<!-- 主要内容的容器 -->
<h1>你的订单已结算,订单号为${sessionScope.orderId},店主很快就会发货啦!</h1>
<!-- 显示订单结算成功的消息,${sessionScope.orderId}用于从会话范围获取订单号 -->
</div>
<%@include file="/pages/common/footer.jsp"%>
<!-- 包含页脚的JSP文件通常包含版权信息和链接 -->
</body>
</html>
</html>
<!-- HTML文档的结束 -->

@ -1,78 +1,98 @@
<%--
这是一个JSP注释不会被发送到客户端。它包含了文件的创建信息。
Created by IntelliJ IDEA.
User: jhu
Date: 2020/10/5
Time: 14:50
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!-- 指定页面内容类型、字符集和脚本语言 -->
<html>
<!-- HTML文档的根元素 -->
<head>
<!-- 文档的头部 -->
<title>结算页面</title>
<!-- 设置页面标题 -->
<%@include file="/pages/common/header.jsp"%>
<!-- 包含公共头部文件通常包含CSS、JavaScript链接等 -->
<!-- 下面的div元素应该放在body内而不是head内但这里可能是个错误或复制粘贴时的疏忽 -->
<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元素应该被移除到body标签内 -->
</head>
<body>
<!-- 文档的主体 -->
<div id="main">
<!-- 主要内容容器 -->
<form action="client/orderServlet?action=createOrder" method="post">
<!-- 提交表单到orderServlet的createOrder动作 -->
<input type="hidden">
<!-- 隐藏输入字段此处未指定name属性可能是个占位符 -->
<table width="80%">
<!-- 表格宽度为页面宽度的80% -->
<tr>
<td bgcolor="#F7FEFF" colspan="4">
支付金额:<INPUT id="money" TYPE="text" NAME="money" size="6" value="${sessionScope.cart.totalPrice}">元</td>
<!-- 表格单元格,背景色为#F7FEFF横跨4列 -->
支付金额:<INPUT id="money" TYPE="text" NAME="money" size="6" value="${sessionScope.cart.totalPrice}">元</td> <!-- 显示支付金额,从会话中获取购物车总价 -->
</tr>
<tr>
<td><br />
</td>
<td><br /></td>
<!-- 空行 -->
</tr>
<tr>
<td colspan="4">请您选择在线支付银行</td>
<!-- 提示用户选择支付银行 -->
</tr>
<!-- 下面的几行是银行选择项,每个单选按钮代表一个银行 -->
<tr>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="CMBCHINA-NET">招商银行
</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="CMBCHINA-NET">招商银行</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="ICBC-NET">工商银行</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="ABC-NET">农业银行</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="CCB-NET">建设银行
</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="CCB-NET">建设银行</td>
</tr>
<tr>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="CMBC-NET">中国民生银行总行</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="CEB-NET">光大银行
</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="CEB-NET">光大银行</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="BOCO-NET">交通银行</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="SDB-NET">深圳发展银行</td>
</tr>
<tr>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="BCCB-NET">北京银行</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="CIB-NET">兴业银行
</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="SPDB-NET">上海浦东发展银行
</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="CIB-NET">兴业银行</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="SPDB-NET">上海浦东发展银行</td>
<td><INPUT TYPE="radio" NAME="pd_FrpId" value="ECITIC-NET">中信银行</td>
</tr>
<tr>
<td><br />
</td>
<td><br /></td>
<!-- 空行 -->
</tr>
<tr>
<td colspan="4"><INPUT TYPE="submit" value="确定支付">
</td>
<td colspan="4"><INPUT TYPE="submit" value="确定支付"></td>
<!-- 提交按钮 -->
</tr>
</table>
</form>
</div>
<%@include file="/pages/common/footer.jsp"%>
<!-- 包含公共页脚文件 -->
</body>
</body>
</html>
<!-- 注意:这里有一个多余的</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