zoukankan      html  css  js  c++  java
  • (精编版)SSH网上商城项目讲解+源码

    SSH网上商城(  源  码  密码:fnox)

    1.1 前台需求分析:

    1.1.1 用户模块:

    注册:

    1.前台JS校验:

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

    3.后台Struts2校验:

    4.验证码:

    5.发送激活邮件:

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

    激活:

    1.点击链接完成激活:

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

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

    * 修改用户的状态:

    登录:

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

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

    退出:

    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的子类.

    * 配置拦截器.

     

  • 相关阅读:
    android29
    android28
    android27
    android26
    Dynamics CRM2011 MspInstallAction failed when installing an Update Rollup
    Dynamics CRM Import Solution Attribute Display Name description is null or empty
    The service cannot be activated because it does not support ASP.NET compatibility
    IIS部署WCF报 无法读取配置节“protocolMapping”,因为它缺少节声明
    Unable to access the IIS metabase.You do not have sufficient privilege
    LM算法与非线性最小二乘问题
  • 原文地址:https://www.cnblogs.com/zhzJAVA11/p/8783162.html
Copyright © 2011-2022 走看看