• 网上商城


     

    1.1 前台需求分析:

    1.1.1 用户模块:

    注册:

    1.前台JS校验:

    2.使用AJAX完成对用户名异步校验:

    3.后台校验:

    4.验证码:

    5.发送激活邮件:

    6.将用户信息存入到数据库:

    激活:

    1.点击链接完成激活:

    * 根据激活码,查询数据库中是否有该用户:

    * 如果有:激活.(将激活码字段清空.)

    * 修改用户的状态:

    登录:

    1.输入用户名和密码:(数据校验.)

    2.用户名和密码都正确同时用户状态必须是激活状态:

    退出:e

    1.销毁session:

    1.1.2 一级分类模块:

    查询一级分类:

    1.查询一级分类.

    * 将一级分类存入到session范围.(每个页面中都有一级分类的数据)

    查询某个一级分类:

    1.查询所有一级分类:

    * 同时查询到每个一级分类下所属的二级分类

    1.1.3 商品模块:

    查询热门商品:

    1.查询热门商品:(限制个数10)

    查询最新商品:

    1.查询最新商品:(限制个数10)

    查询某个分类商品:

    1.根据分类的ID进行查询商品:

    查询某个二级分类商品:

    1.根据二级分类的ID进行查询商品:

    查询某个商品信息:

    1.根据商品ID进行查询商品:

    1.1.4 购物模块:

    添加到购物车:

    1.将商品信息添加到购物车中:

    从购物车中移除商品:

    1.将商品信息从购物车中移除:

    清空购物车:

    1.将所有的商品信息从购物车中移除:

    1.1.5 订单模块:

    生成订单:

    1.将购物车中的信息存入到数据库(生成订单).

    * 清空购物车:

    为订单付款:

    1.在线支付功能:

    2.修改订单状态:

    3.修改订单的信息:(收货人,联系方式,送货地址)

    查询我的订单:

    1.根据用户ID查询订单.

    查询某个订单详情:

    1.根据订单ID进行查询:

    1.2 后台需求分析:

    1.2.1 用户模块:

    添加用户:

    添加用户到数据库

    修改用户:

    修改用户到数据库

    删除用户:

    删除用户

    查询用户:

    查询用户(带分页)

    1.2.2 一级分类:

    添加一级分类:

    添加一级分类:

    修改一级分类:

    修改一级分类

    删除一级分类:

    删除一级分类:

    * 级联删除二级分类:

    查询一级分类:

    查询一级分类:

    1.2.3 二级分类:

    添加二级分类:

    二级分类需要有所属一级分类:

    修改二级分类:

    修改二级分类所属的一级分类:

    删除二级分类:

    删除二级分类:

    查询所有二级分类:

    查询二级分类(带分页)

    1.2.4 商品模块:

    添加商品:

    1.添加商品所属二级分类:

    2.上传商品图片:

    修改商品:

    1.修改商品二级分类:

    2.修改商品图片:

    删除商品:

    1.删除商品:

    查询商品:

    1.商品查询:(带分页)

    1.2.5 订单模块:

    查询订单:

    查询所有订单:(带分页)

    * 异步加载订单项:

    1.3 页面设计:

    使用静态页面就OK

    1.4 数据库设计:

    用户表:

    * 用户ID

    * 用户名:

    * 密码:

    * 真实姓名:

    * 邮箱:

    * 地址:

    * 电话:

    * 用户状态: 0未激活  1已经激活

    * 激活码:

     

    一级分类:

    * 一级分类ID

    * 一级分类名称

     

    二级分类:

    * 二级分类ID:

    * 二级分类名称:

    * 一级分类ID(外键指向一级分类主键ID)

     

    商品表:

    * 商品ID:

    * 商品名称:

    * 商品商城价格:

    * 商品市场价格:

    * 商品描述:

    * 商品图片:(路径)

    * 二级分类ID(外键指向二级分类主键ID)

     

    订单表:

    * 订单ID

    * 订单时间:

    * 订单金额:

    * 订单状态:

    * 订单地址:

    * 订单电话:

    * 订单收货人:

    * 用户ID(外键指向用户表的主键ID)

     

    订单项表:(需要参与到业务逻辑中)

    * 主键ID

    * 商品ID

    * 订单ID

    * 数量

    * 小计

     

    后台用户表:

    * 用户名:

    * 密码:

    1.5 编码实现:

    1.5.1 搭建开发环境:

    SSH整合:

    1.创建一个web工程:

    2.引入jar包和配置文件:

    * struts2:

    * jar:

    struts-2.3.15.3appsstruts2-blank.warWEB-INFlib*.jar

    struts-2.3.15.3libstruts2-json-plugin-2.3.15.3.jar

    struts-2.3.15.3libstruts2-spring-plugin-2.3.15.3.jar

    * 配置文件:

    * web.xml

     <!-- 配置Struts2的核心过滤器 -->

     <filter>

      <filter-name>struts2</filter-name>

      <filter-class>

    org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter

    </filter-class>

     </filter>

     

     <filter-mapping>

      <filter-name>struts2</filter-name>

      <url-pattern>/*</url-pattern>

     </filter-mapping>

    * struts.xml

    * Spring:

    * jar:

    Spring3.2 开发最基本jar

    spring-beans-3.2.0.RELEASE.jar

    spring-context-3.2.0.RELEASE.jar

    spring-core-3.2.0.RELEASE.jar

    spring-expression-3.2.0.RELEASE.jar

    com.springsource.org.apache.commons.logging-1.1.1.jar

    com.springsource.org.apache.log4j-1.2.15.jar

    AOP开发

    spring-aop-3.2.0.RELEASE.jar

    spring-aspects-3.2.0.RELEASE.jar

    com.springsource.org.aopalliance-1.0.0.jar

    com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar

    Spring Jdbc开发

    spring-jdbc-3.2.0.RELEASE.jar

    spring-tx-3.2.0.RELEASE.jar

    Spring事务管理

    spring-tx-3.2.0.RELEASE.jar

    Spring整合其他ORM框架

    spring-orm-3.2.0.RELEASE.jar

    Springweb中使用

    spring-web-3.2.0.RELEASE.jar

    Spring整合Junit测试

    spring-test-3.2.0.RELEASE.jar

    * 配置文件:

    * web.xml

     <!-- 配置Spring的核心监听器 -->

     <listener>

      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

     </listener>

     

     <context-param>

      <param-name>contextConfigLocation</param-name>

      <param-value>classpath:applicationContext.xml</param-value>

     </context-param>

    * applicationContext.xml

    * log4j.properties

     

    * Hibernate:

    * jar:

    * hibernate-distribution-3.6.10.Finalhibernate3.jar

    * hibernate-distribution-3.6.10.Finallib equired*.jar

    * hibernate-distribution-3.6.10.Finallibjpa*.jar

    * slf4j-log4j整合的jar:

    * 数据库驱动:

    * 连接池:(c3p0连接池)

    * 配置文件:

    * 没有hibernate的核心配置文件的方式整合:

    * 映射文件:

     

    3.配置基本配置信息:

    * C3P0连接池:

    * 引入外部属性文件:

    * jdbc.properties

    * 配置连接池:

    <!-- 配置连接池: -->

    <!-- 引入外部属性文件 -->

    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 配置C3P0连接池: -->

    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

    <property name="driverClass" value="${jdbc.driver}"/>

    <property name="jdbcUrl" value="${jdbc.url}"/>

    <property name="user" value="${jdbc.user}"/>

    <property name="password" value="${jdbc.password}"/>

    </bean>

     

    * Hibernate相关信息:

    <!-- Hibernate的相关信息 -->

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">

    <!-- 注入连接池 -->

    <property name="dataSource" ref="dataSource"/>

    <!-- 配置Hibernate的其他的属性 -->

    <property name="hibernateProperties">

    <props>

    <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>

    <prop key="hibernate.show_sql">true</prop>

    <prop key="hibernate.format_sql">true</prop>

    <prop key="hibernate.connection.autocommit">false</prop>

    <prop key="hibernate.hbm2ddl.auto">update</prop>

    </props>

    </property>

    <!-- 配置Hibernate的映射文件 -->

     

    </bean>

     

    * 事务管理:

    <!-- 事务管理: -->

    <!-- 事务管理器 -->

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

    <property name="sessionFactory" ref="sessionFactory"/>

    </bean>

     

    <!-- 开启注解事务 -->

    <tx:annotation-driven transaction-manager="transactionManager"/>

    1.5.2 引入页面:

    1.引入静态页面:

    * WEB-INF/jsp/

    * 将静态页面复制到jsp.

    * css/js 放到 WebRoot.

    1.5.3 访问首页:

    建包的格式:

    * cn.itcast.shop.index

    * action

    * cn.itcast.shop.user

    * action

    * service

    * dao

    * vo

    1.编写Action:

    * IndexAction

    2.改造JSP

    * cssimage的相对路径改变成绝对路径 :

    * ./css 替换成 ${pageContext.request.contextPath}/css

    3.配置Action

    * 配置applicationContext.xml

    <!-- 首页访问的Action -->

    <bean id="indexAction" class="cn.itcast.shop.index.action.IndexAction" scope="prototype">

     

    </bean>

    * 配置struts.xml

    <!-- 配置首页访问的Action -->

    <action name="index" class="indexAction">

    <result name="index">/WEB-INF/jsp/index.jsp</result>

    </action>

    1.5.4 用户模块:注册

    跳转到注册页面:

    1.点击注册链接(添加到一个Action,Action中完成页面转向).

    * 修改注册的访问路径:

    ${ pageContext.request.contextPath }/user_registPage.action

    * 编写Action:

    * 配置Action:

    * 配置applicationContext.xml

    <!-- 用户模块的Action -->

    <bean id="userAction" class="cn.itcast.shop.user.action.UserAction" scope="prototype">

     

    </bean>

    * 配置struts.xml

    <!-- 配置用户模块的Action -->

    <action name="user_*" class="userAction" method="{1}">

    <result name="registPage">/WEB-INF/jsp/regist.jsp</result>

    </action>

    * 修改regist.jsp:

    * ./css 替换成 ${pageContext.request.contextPath}/css

    用户注册校验:

    表创建:

    CREATE TABLE `user` (

      `uid` int(11) NOT NULL AUTO_INCREMENT,

      `username` varchar(255) DEFAULT NULL,

      `password` varchar(255) DEFAULT NULL,

      `name` varchar(255) DEFAULT NULL,

      `email` varchar(255) DEFAULT NULL,

      `phone` varchar(255) DEFAULT NULL,

      `addr` varchar(255) DEFAULT NULL,

      `state` int(11) DEFAULT NULL,

      `code` varchar(64) DEFAULT NULL,

      PRIMARY KEY (`uid`)

    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

     

    前台校验:

    * JS校验:

    * 事件触发:onsubmit

    * 校验:

    function checkForm(){

    // 校验用户名:

    // 获得用户名文本框的值:

    var username = document.getElementById("username").value;

    if(username == null || username == ''){

    alert("用户名不能为空!");

    return false;

    }

    // 校验密码:

    // 获得密码框的值:

    var password = document.getElementById("password").value;

    if(password == null || password == ''){

    alert("密码不能为空!");

    return false;

    }

    // 校验确认密码:

    var repassword = document.getElementById("repassword").value;

    if(repassword != password){

    alert("两次密码输入不一致!");

    return false;

    }

    }

     

    使用AJAX完成用户名是否存在异步校验:

    1.事件触发:

    * onblur

    2.编写AJAX代码:

    * Action中提交:传递username参数

    3.编写Action

    * 接收username:模型驱动接收.

    * 编写实体类

    * User

    * User.hbm.xml

    * 配置到Spring.

    4.编写DAO

    * 继承HibernateDaoSupport

    * 在配置中注入sessionFactory

    5.编写Service:

    * 注入UserDao

    * 事务管理:

     

    用户注册:后台数据校验:

    1.Action所在包下创建一个校验的xml.

    * 创建一个与Action类名-validation.xml(针对所有方法进行校验,只需要针对regist方法进行校验)

    * UserAction-user_regist-validation.xml

    <validators>

    <!-- 校验用户名 -->

    <field name="username">

    <field-validator type="requiredstring">

    <message>用户名不能为空!</message>

    </field-validator>

    </field>

     

    <!-- 校验用户名 -->

    <field name="password">

    <field-validator type="requiredstring">

    <message>密码不能为空!</message>

    </field-validator>

    </field>

     

    <!-- 校验邮箱 -->

    <field name="email">

    <field-validator type="email">

    <message>邮箱格式不正确!</message>

    </field-validator>

    </field>

    </validators>

     

    2.配置INPUT逻辑视图:

    用户注册:

    1.将数据保存到数据库 :

    * 完善user对象.

    2.发送激活邮件:

    * 电子邮箱:

    * jt@itcast.cn

    * 邮件服务器:

    * 邮件协议:

    * smtp :发送邮件协议

    * pop :接收邮件协议

    * 邮箱发送全过程:

    * 搭建邮箱服务器:

    * 安装邮箱服务器:

    * 修改域名:

    * 工具---->服务器设置---->shop.com

    * 注册账号:

    * 账号---->新建账号

    * 安装客户端软件:(接收和发送邮件.)

    * outlook foxmail

    * 安装foxmail:

    * 配置:

    * 配置发送邮件服务器:

    * localhost

    * 配置接收邮件服务器:

    * localhost

    * 编码实现发送邮件:

    * 复制mail.jaractivation.jar

    * 删除EE5.0中自带发送邮件jar:

    * windows---->preferences--->lib

    * 编写代码完成发送邮件:

    1.5.5 用户激活:

    1.在邮箱客户端中点击激活链接:

    * 根据传递激活码进行用户查询.

    * 如果用户不为空:

    * 修改用户状态 改为1

    * 如果用户为空:

    * 激活码被篡改了.

    1.5.6 用户登录:

    跳转到登录页面:

    1.修改登录链接:

    * 改为action路径:

    * 编写Action中方法:

    * 转向:

    用户登录:

    1.接收用户名和密码:(模型驱动会自动接收)

    2.调用userService进行查询:

    * 用户名和密码及状态.

    * 查询到:登录成功:

    * 将用户的信息存入到session

    * 跳转到首页

    * 没查询到:登录失败:

    * 跳转回登录页面:

    1.5.7 用户退出:

    点击退出的链接:

    * 提交到Action---销毁session

    * 页面跳转(首页)

    1.5.8 验证码程序:(注册)

    1.编写Action:

    * 验证码Action:

    * 完成配置:

    2.在页面中写<img src=”验证码Action路径”>

    3.编写JS,看不清换一张

    4.提交到Action,Action中进行比较.

    * 如果一致提交成功

    * 如果不一致回到注册页面

    1.5.9 首页上的一级分类的查询:

    1.创建一级分类的表:

    CREATE TABLE `category` (

      `cid` int(11) NOT NULL AUTO_INCREMENT,

      `cname` varchar(255) DEFAULT NULL,

      PRIMARY KEY (`cid`)

    ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

     

    2.建包及相应的类:

    * cn.itcast.shop.category

    * action

    * service

    * CategoryService:业务层对象

    * dao

    * CategoryDao:持久层对象

    * vo

    * Category:实体对象

    * Category.hbm.xml:映射文件

     

    3.ServiceDAO进行配置:

    * DAO中注入sessionFactory

    * Service中注入DAO

     

    4.需要在IndexAction中注入一级分类的Service.

    * Action-----Service------Dao

    * 将一级分类的数据显示到页面:

    * 将一级分类的数据存入到session范围.

    1.5.10 首页上热门商品显示:

    1.建表:

    创建二级分类的表:

    CREATE TABLE `categorysecond` (

      `csid` int(11) NOT NULL AUTO_INCREMENT,

      `csname` varchar(255) DEFAULT NULL,

      `cid` int(11) DEFAULT NULL,

      PRIMARY KEY (`csid`),

      KEY `FK936FCAF21DB1FD15` (`cid`),

      CONSTRAINT `FK936FCAF21DB1FD15` FOREIGN KEY (`cid`) REFERENCES `category` (`cid`)

    ) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8;

    创建商品表:

    CREATE TABLE `product` (

      `pid` int(11) NOT NULL AUTO_INCREMENT,

      `pname` varchar(255) DEFAULT NULL,

      `market_price` double DEFAULT NULL,

      `shop_price` double DEFAULT NULL,

      `image` varchar(255) DEFAULT NULL,

      `num` int(11) DEFAULT NULL,

      `pdesc` varchar(255) DEFAULT NULL,

      `is_hot` int(11) DEFAULT NULL,

      `pdate` datetime DEFAULT NULL,

      `csid` int(11) DEFAULT NULL,

      PRIMARY KEY (`pid`),

      KEY `FKED8DCCEFB9B74E02` (`csid`),

      CONSTRAINT `FKED8DCCEFB9B74E02` FOREIGN KEY (`csid`) REFERENCES `categorysecond` (`csid`)

    ) ENGINE=InnoDB AUTO_INCREMENT=74 DEFAULT CHARSET=utf8;

     

    2.创建包及类

    * cn.itcast.shop.product

    * action

    * ProductAction

    * service

    * ProductService

    * dao

    * ProductDao

    * vo

    * Product

    * Product.hbm.xml

     

    3.ServiceDao完成配置:

    4.Action-----ProductService------>ProductDao

    * 查询热门商品:

    * is_hot: 0 :不是热门  1:是热门.

    * 查询带有个数:

    * 分页查询:

    * 将查询到数据保存到值栈中.

    1.5.11 首页上最新商品显示:

    1.Action-----ProductService------>ProductDao

    * 查询最新商品:

    * 按商品上传日期倒序进行排序 只显示10.

    * 将查询到记录保存到值栈中:

    1.5.12 首页上点击商品显示商品详情:

    1.点击商品链接:

    * 传递商品id.

    2.编写Action:

    * 编写Action,继承ActionSupport实现模型驱动接口.

    * 编写一个执行的方法.

    3.配置Action:

    * applicationContext.xml中配置Action

    * struts.xml中配置Action

    4.Action中调用Service完成根据ID进行查询的方法:

    * 注入ProductService.

    * 完成查询

    5.在页面上显示相应数据 :

    * 页面转向

    * 修改页面

    * 显示数据

    1.5.13 首页上点击一级分类,查询商品列表:(左侧一级分类和二级分类关联查询)

    1.创建二级分类的包及类:

    * cn.itcast.shop.categorysecond

    * action

    * CategoryAction

    * service

    * CategoryService

    * dao

    * CategoryDao

    * vo

    * CategorySecond

    * CategorySecond.hbm.xml

     

    2.配置一级分类和二级分类的关联关系:

    * Category.xml

    <!-- 配置二级分类的集合 -->

    <set name="categorySeconds">

    <key column="cid"/>

    <one-to-many class="cn.itcast.shop.categorysecond.vo.CategorySecond"/>

    </set>

    * CategorySecond.xml

    <many-to-one name="category" class="cn.itcast.shop.category.vo.Category" column="cid"></many-to-one>

     

    3.点击一级分类的链接:

    * 传递一级分类的id.

     

    4.编写Action:

    * 接收cid:

    * 编写一个执行的方法:直接返回字符串(页面)

    * 显示左侧分类

    * 关联查找:(直接session中获得一级分类的数据(需要配置一级分类上二级分类的集合lazy=”false”))

     

    1.5.14 首页上点击一级分类,查询商品列表:(显示商品列表)

    1.查询商品,带有分页显示商品.

    * 回到商品列表页面:

    * 商品集合,当前页数,总页数(总记录数),每页显示记录数.( 将后台 这些数据 带到页面上,首选 值栈. )

    * 将这些数据封装到一个分页类中.(最后将分页类保存到值栈中就OK).

    2.封装一个PageBean.

    3.完成查询:

    * 传递当前页数:

    * 调用Service完成查询.

     

    4.配置二级分类和商品关联关系:

     

    1.5.15 商品分类页面根据二级分类ID查询商品:

    1.点击二级分类链接:

    * 传递csid

    * 传递page=1

    2.编写Action :

    * 接收csid:

    * 接收page

    3.调用Service完成查询:

    * 封装成PageBean

    4.在页面中进行显示:

    1.5.16 将商品添加到购物车:

    1.封装一个购物车对象:

    * Cart:购物车对象:

    * CartItem的集合:(选择Map集合,移除购物车时候比较方便.)

    * total:总计:

    * 功能:

    * 将购物项添加到购物车:

    * 从购物车中移除购物项:

    * 清空购物车:

    public class Cart {

    // 购物车属性

    // 购物项集合:Mapkey就是商品pid,value:购物项

    private Map<Integer, CartItem> map = new LinkedHashMap<Integer, CartItem>();

     

    // Cart对象中有一个叫cartItems属性.

    public Collection<CartItem> getCartItems(){

    return map.values();

    }

     

    // 购物总计:

    private double total;

     

    public void setTotal(double total) {

    this.total = total;

    }

     

    // 购物车的功能:

    // 1.将购物项添加到购物车

    public void addCart(CartItem cartItem) {

    // 判断购物车中是否已经存在该购物项:

    /*

     *  * 如果存在:

     *   * 数量增加

     *   * 总计 = 总计 + 购物项小计

     *  * 如果不存在:

     *   * map中添加购物项

     *   * 总计 = 总计 + 购物项小计

     */

    // 获得商品id.

    Integer pid = cartItem.getProduct().getPid();

    // 判断购物车中是否已经存在该购物项:

    if(map.containsKey(pid)){

    // 存在

    CartItem _cartItem = map.get(pid);// 获得购物车中原来的购物项

    _cartItem.setCount(_cartItem.getCount()+cartItem.getCount());

    }else{

    // 不存在

    map.put(pid, cartItem);

    }

    // 设置总计的值

    total += cartItem.getSubtotal();

    }

     

    // 2.从购物车移除购物项

    public void removeCart(Integer pid) {

    // 将购物项移除购物车:

    CartItem cartItem = map.remove(pid);

    // 总计 = 总计 -移除的购物项小计:

    total -= cartItem.getSubtotal();

    }

     

    // 3.清空购物车

    public void clearCart() {

    // 将所有购物项清空

    map.clear();

    // 将总计设置为0

    total = 0;

    }

    }

     

    * CartItem:购物项对象:

    * Product:商品信息.

    * count:购买某种商品数量:

    * subtotal:购买某种商品的小计:

     

    public class CartItem {

    private Product product; // 购物项中商品信息

    private int count; // 购买某种商品数量

    private double subtotal; // 购买某种商品小计

    public Product getProduct() {

    return product;

    }

    public void setProduct(Product product) {

    this.product = product;

    }

    public int getCount() {

    return count;

    }

    public void setCount(int count) {

    this.count = count;

    }

    // 小计自动计算的.

    public double getSubtotal() {

    return count * product.getShop_price();

    }

    /*public void setSubtotal(double subtotal) {

    this.subtotal = subtotal;

    }

    */

     

    }

    2.跳转到购物车页面:

    * 点击加入购物车链接:

    * 提交表单

    * pid

    * 数量

    * 完成页面转向:

     

    3.添加到购物车:

    * Action:

    * 根据pid查询.

    * 将商品记录封装到CartItem.

    * 获得Cart的方法.

    * 调用CartaddCart(CartItem cartItem);完成添加到购物车操作.

     

    4.清空购物车:

    * Action:

    * 获得购物车

    * 调用购物车中clearCart();方法完成清空.

    * 判断,如果购物车为空不显示.

     

    5.从购物车中移除购物项:

    * 点击购物车页面中删除链接

    * 传递一个pid.

    * Action:

    * 获得购物车

    * 调用购物车中removeCart(Integer pid);

     

    6.点击我的购物车:

    * 跳转到购物车页面:

    1.5.17 前台订单的模块:

    订单模块的准备工作:

    创建表:

    订单表

    CREATE TABLE `orders` (

      `oid` int(11) NOT NULL AUTO_INCREMENT,

      `total` double DEFAULT NULL,

      `ordertime` datetime DEFAULT NULL,

      `state` int(11) DEFAULT NULL,

      `name` varchar(21) DEFAULT NULL,

      `addr` varchar(60) DEFAULT NULL,

      `phone` varchar(20) DEFAULT NULL,

      `uid` int(11) DEFAULT NULL,

      PRIMARY KEY (`oid`),

      KEY `FKC3DF62E5AA3D9C7` (`uid`),

      CONSTRAINT `FKC3DF62E5AA3D9C7` FOREIGN KEY (`uid`) REFERENCES `user` (`uid`)

    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

     

    订单项:(中间表 中间表参与到业务逻辑中)

    CREATE TABLE `orderitem` (

      `itemid` int(11) NOT NULL AUTO_INCREMENT,

      `count` int(11) DEFAULT NULL,

      `subtotal` double DEFAULT NULL,

      `pid` int(11) DEFAULT NULL,

      `oid` int(11) DEFAULT NULL,

      PRIMARY KEY (`itemid`),

      KEY `FKE8B2AB6166C01961` (`oid`),

      KEY `FKE8B2AB6171DB7AE4` (`pid`),

      CONSTRAINT `FKE8B2AB6166C01961` FOREIGN KEY (`oid`) REFERENCES `orders` (`oid`),

      CONSTRAINT `FKE8B2AB6171DB7AE4` FOREIGN KEY (`pid`) REFERENCES `product` (`pid`)

    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

     

    创建包:

    * cn.itcast.shop.order

    * action

    * OrderAction

    * service

    * OrderService

    * dao

    * OrderDao

    * vo

    * Order

    * Order.hbm.xml

    * OrderItem

    * OrderItem.hbm.xml

     

    配置:

    * applicationContext.xml

    * 配置映射

    * ActionServiceDao

    订单模块代码实现:

    1.在购物车页面点击:提交订单 按钮.完成页面跳转!

     

    2.生成订单:

    * 保存订单的数据:

    * 在页面中显示订单数据:

    * 通过模型驱动的对象将数据传递到页面.(值栈)

     

    3.我的订单:

    * 根据用户的id查询当前用户的所有的订单:

     

    4.订单列表上点击:付款

    * 跳转到页面:

    * 根据订单的id查询订单.

    * 在页面中对其进行付款:

     

    5.订单付款的功能:

    * 在线支付的方式:

    * 在线支付:

    * 与第三方支付公司对接:(易宝)

    * 在线支付的流程:

    * 付款功能代码实现:

    * 修改订单数据:(收货人,地址,电话)

    * 完成付款的功能:

     

    1.6 后台管理:

    1.6.1 后台页面的布局:

    采用框架进行布局:

    * 使用dtree.js作为树形结构菜单:

     

    1.6.2 后台登录功能:

    1.引入后台管理页面:

    2.创建表:

    CREATE TABLE `adminuser` (

      `uid` int(11) NOT NULL AUTO_INCREMENT,

      `username` varchar(255) DEFAULT NULL,

      `password` varchar(255) DEFAULT NULL,

      PRIMARY KEY (`uid`)

    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

    3.创建包:

    * cn.itcast.shop.adminuser

    * action

    * AdminUserAction

    * service

    * AdminUserService

    * dao

    * AdminUserDao

    * vo

    * AdminUser

    * AdminUser.hbm.xml

     

    4.登录代码实现:

    * index.jsp----->AdminUserAction----->AdminUserService----->AdminUserDao

     

    1.6.3 后台一级分类管理:

    查询一级分类:

    1.点击左边树形菜单上的一级分类管理:

    * 修改请求路径:

    2.编写后台管理的Action

    * cn.itcast.shop.category

    * adminaction

    * AdminCategoryAction

    3.配置这个Action:

    * applicationContext.xml

    * struts.xml

    添加一级分类:

    1.在一级分类列表页面上点击添加按钮.

    * 跳转到一个添加页面.

    2.在添加页面上,输入一级分类名称.

    * 将一级分类的数据,添加到数据库中.

    删除一级分类:

    1.在一级分类列表页面上点击删除链接.

    * 传递一级分类的id.

    2.Action:

    * 接收一级分类id

    * 调用Service完成删除.

    * 页面跳转.

    修改一级分类:

    1.在一级分类列表页面上点击编辑链接.

    * 根据cid查询一级分类.

    * 将一级分类的数据显示到页面上.

    2.根据页面上显示数据,修改数据.

    1.6.4 后台二级分类管理:

    查询二级分类:

    1.在左边树形菜单中添加一个节点:二级分类.

    2.创建二级分类包:

    * cn.itcast.shop.categorysecond

    * adminaction

    * AdminCategorySecondAction

    3.执行查询:

     

    添加二级分类:

    1.在二级分类列表页面上点击添加按钮,跳转到添加页面.

    * 查询所有的一级分类.

    2.在页面上显示出所有的一级分类下拉列表.

    3.在添加页面上点击确定:

    * 将二级分类的数据保存到数据库.

    删除二级分类:

    1.在二级分类列表页面上点击删除链接.

    * 传递删除二级分类id.

    2.Action中接收二级分类id.

    * 删除二级分类.

    * 先查询在删除.配置cascade属性.

    修改二级分类:

    1.在二级分类的列表页面上点击编辑链接.

    * 传递二级分类的id

    2.根据二级分类id查询二级分类.将二级分类数据显示到页面上.

    * 查询所有一级分类.

    3.跳转到编辑页面.

    4.在编辑页面点击确定按钮:

    * 将数据修改到数据库.

    1.6.5 商品管理:

    查询商品:(带分页)

    1.在左边树形菜单上,添加一个节点:商品管理.

    2.创建包:

    * cn.itcast.shop.product

    * adminaction

    * AdminProductAction

    3.查询:

    * 带分页查询:

    4.配置:

     

    添加商品:(上传商品的图片)

    1.在商品列表页面点击添加按钮:

    * 查询所有的二级分类:

    * 页面跳转:商品添加页面.

    2.在商品的添加页面:

    * 将数据添加到数据库.

    * 完成商品图片上传.

    * struts2框架中文件上传:

    * 文件的条件:

    * 表单提交的方式需要是POST

    * 表单中上传项必须有一个name属性.

    * 表单的enctype属性值需要是multipart/form-data

    删除商品:

    1.在商品列表页面上点击删除链接:

    * 传递商品的id.

    2.删除商品的图片.

    3.页面跳转:

     

    修改商品:(上传商品的图片)

    1.在商品列表页面上点击编辑链接:

    * 传递商品的id.

    2.Action:

    * 根据商品的id查询商品

    * 查询所有的二级分类集合

    * 页面跳转:

    3.在编辑页面:点击确定按钮:

    * 将数据保存到数据库中.

    * 修改上传的图片.

    * 页面跳转:

    1.6.6 后台订单管理:

    查询订单:

    1.在左边树形菜单中添加一个节点:订单管理.

    2.创建包:

    * cn.itcast.shop.order

    * adminaction

    * AdminOrderAction

    3.提交到Action:

    * 传递page参数

    * 分页查询

    4.跳转页面:

    * 显示订单:

    订单详情的查看:

    1.在订单列表页面中点击订单详情按钮:

    * 传递订单id.

    2.使用AJAX异步获取当前这个订单的订单项.

    订单状态修改:

    1.在后台订单列表页面上点击发货链接:

    * 传递订单id

    2.Action

    * 根据订单id查询订单

    * 修改订单状态:

    * 页面转向:

    前台订单状态修改:

    1.在我的订单页面上点击确认收货链接:

    * 传递订单id.

    2.Action:

    * 根据订单id查询订单

    * 修改订单状态

    * 页面转向

    1.6.7 后台权限校验拦截器:

    1.拦截器:可以对Action的访问进行拦截.

    2.编写拦截器:

    * 编写一个类实现Interceptor接口.或者继承Interceptor的子类.

    * 配置拦截器.

     

  • 相关阅读:
    解决Struts中文乱码问题总结
    也谈创业企业CEO该拿多少工资
    Codeforces Round #242 (Div. 2) A. Squats
    设计模式之模板方法模式
    hdu2768Cat vs. Dog (反建法,最大独立集)
    Python
    kvm
    linux bin文件制作
    python
    pytho
  • 原文地址:https://www.cnblogs.com/yunfeioliver/p/9692066.html
Copyright © 2020-2023  润新知