liangjq@tarena.com.cn
1.项目需求
电子商务系统(在线购物)
1)用户管理
登录,注册,邮箱确认,注册成功提示,登录检查
2)产品浏览
主界面,类别浏览界面,产品详细界面等
3)购物车
购买,删除,恢复,变更数量,金额统计,列表显示等
4)订单创建
订单确认,填写订单收货地址,创建成功提示
2.技术架构
基于MVC设计,分层结构开发。
1)分层结构:
表现层(V):JSP,js,Ajax(推荐jQuery),EL,Struts2标签
控制层(C):(主)Struts2控制器,Action(分控制器)
业务层(M):JavaBean实现
数据访问(持久层)(M):DAO组件
jQuery+Struts2+JDBC技术
3.数据库设计
1)d_user:用户信息表
2)d_product:产品信息表
3)d_book:图书信息表
4)d_category:产品类别表
5)d_category_product:类别和产品关系表
6)d_order:订单信息表
7)d_item:订单明细表
8)d_receive_address:用户收货地址表
1)-->8)一对多关系
2)-->3)一对一关系
2)-5)->4)多对多关系
6)-->7)一对多关系
hot.jsp 热销图书:
需求:找出8本最热销的书籍:根据销量倒序排序,并且是没有被删除的书籍 HotBookAction类中实现
1. 用到的字段:
1).d_product(表:
定价: fixed_price double
书籍标题: product_name String
当当价格 : dang_price double
是否被删除:has_deleted int
书籍图片: product_pic String
2).d_item(表):
销量 product_num int
2. 数据表格:d_product,d_item
3.sql语句:select * from d_product pro join d_item ite on pro.id=ite.product_id
where pro.has_deleted=0 order by product_num desc limit 8;
4.接口:把找出的书籍村放入一个list集合中;
5.输出list集合中的信息:
6.输入在配置文件中配置参数page.pageSize为8,逻辑无、、、、
recommend.jsp 编辑者推荐:
需求:每次刷新页面都随机两本书籍出来 RecommendAtion类中实现
1.用到的字段:
1).d_product(表:
定价: fixed_price double
书籍标题: product_name String
当当价格 : dang_price double
是否被删除:has_deleted int
书籍图片: product_pic String
2).d_book表:
作者 : author String String
出版时间:publish_time long
出版社: publishing String
简介: catalogue String
2. 表格:d_product,d_book
3.sql语句:select pro.* , book.* from d_product pro join d_book book on pro.id = book.id where pro.has_deleted =0
4.在接口BookDao中,定义:List<Book> findAllBooks() throws Exeception;
5.在实体类中Book类继承Produc类这样可以获得两个类中的信息
6.输入参数: num 在配置文件中 配置<param name="num">2</param> 定义输出: List<Book> books,
7.逻辑:随机取得两本书籍 在BookBookServiceImpl 类中实现逻辑
List<Book> allBooks=bookDao.findAllBooks();
for(int i=0 ;i<num;i++){
books.add(allBooks.remove(new Random().nextInt(allBooks.size())));
}
book_list.jsp 书籍列表;
需求:把指定列别中的书籍显示出来能分页和排序
一.实现分页和书籍列表 BookListAction类中实现 方法:bookList();
1.用到的字段:
1).d_product(表:
定价: fixed_price double
书籍标题: product_name String
当当价格 : dang_price double
是否被删除:has_deleted int
书籍图片: product_pic String
2).d_book表:
作者 : author String String
出版时间:publish_time long
出版社: publishing String
简介: catalogue String
2. 表格:d_product,d_book
3.sql语句:select pro.* , book.* from d_product pro join d_book book on pro.id = book.id join d_category_product
cat on pro.id = cat.product_id where pro.has_deleted = 0
and cat.cat_id = ? limit ?,?;
4.在接口BookDao中,定义:List<Book> findAllBooks(Pagination p) throws Exeception;
5.在实体类中Book类继承Produc类这样可以获得两个类中的信息
6.输入参数
1 ). 在配置文件中配置 page.pageSize,参数为 3
2 ). 定义(Pagination page 封装了分页的信息
7.输出参数: List<Book> books,
8.逻辑无、、、
二 .实现排序 BookServiceImpl 类中
/** 实例化数据库的实现类用于数据访问 */
private BookDao bookDao = new jdbcBookDao();
/**
* 通过 productId查找到符合要求的书籍信息并把它们存进集合里面去 该方法仅在当前类中使用
*
* @param 用户传过来的productId
* 根据它来查询数据库或者向下一个方法传递
* @return List<Book>集合, 保存了所有找到的符合要求书籍, 若没有找到则放回null
* */
private List<Book> findSomeBooks(int productId) throws Exception {
List<Book> currentBooks = bookDao.findSomeBooks(productId);
return currentBooks;
}
/**
* 用Collections 对找出来的书籍通过上架时间进行排序,该方法仅在当前类中使用
*
* @param 用户传过来的productId
* 根据它来查询数据库或者向下一个方法传递
* @return List<Book>集合, 保存了所有找到的符合要求书籍, 若没有找到则放回null
*/
private List<Book> addTimeSort(int productId) throws Exception {
List<Book> sortBooks = findSomeBooks(productId);
Collections.sort(sortBooks, new Comparator<Book>() {
public int compare(Book o1, Book o2) {
long i = o1.getAddTime();
long j = o2.getAddTime();
if (i - j > 0) {
return -1;
} else if (i == j) {
return 0;
}
return 1;
}
});
return sortBooks;
}
/**
* 用Collections 对找出来的书籍通过出版时间进行排序,该方法仅在当前类中使用
*
* @param 用户传过来的productId
* 根据它来查询数据库或者向下一个方法传递
* @return List<Book>集合, 保存了所有找到的符合要求书籍, 若没有找到则放回null
*/
private List<Book> PublishtimeSort(int productId) throws Exception {
List<Book> sortBooks = findSomeBooks(productId);
Collections.sort(sortBooks, new Comparator<Book>() {
public int compare(Book o1, Book o2) {
long i = o1.getPublishTime();
long j = o2.getPublishTime();
if (i - j > 0) {
return -1;
} else if (i == j) {
return 0;
}
return 1;
}