基于SSH框架实现的鲜花订购系统

本系统使用Struts2+Spring+Hibernate架构,数据库使用MySQL,连接池使用c3p0, 模仿花礼网进行前端设计与开发,实现网站导航、商品分类展示,商品详情、商品检索、购物车等功能, 使用EasyUI实现后台对商品分类、商品信息、用户信息、订单信息的管理,包括增删改查,文件上传等。

开发环境

  1. jdk 8
  2. intellij idea
  3. tomcat 8.5.40
  4. mysql 5.7

所用技术

  1. Struts2+Spring+Hibernate
  2. js+ajax
  3. easyUI

项目架构

项目架构.png

项目截图

  • 注册


    注册.png
  • 首页


    首页.png
  • 商品详情


    商品详情页.png
  • 购物车
购物车.png
  • 管理端-类别管理


    管理端-类别管理.png
  • 管理端-商品管理


    管理端-商品管理.png
  • 管理端-订单管理


    管理端-订单管理.png

数据库配置

<!-- c3p0 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close">
    <property name="driverClass" value="com.mysql.jdbc.Driver" />
    <property name="jdbcUrl"
        value="jdbc:mysql://localhost:3306/db_flower?useUnicode=true&amp;characterEncoding=utf8" />
    <property name="user" value="root" />
    <property name="password" value="root123" />
    <!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
    <property name="initialPoolSize" value="1" />
    <!--连接池中保留的最小连接数。 -->
    <property name="minPoolSize" value="1" />
    <!--连接池中保留的最大连接数。Default: 15 -->
    <property name="maxPoolSize" value="300" />
    <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
    <property name="maxIdleTime" value="60" />
    <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->
    <property name="acquireIncrement" value="5" />
    <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
    <property name="idleConnectionTestPeriod" value="60" />
</bean>

关键代码

  1. 分页对象
public class PageModel<T> {
    // 当前页号
    private int pageNo = 1;
    // 每页记录数
    private int pageSize = 10;
    // 总记录数
    private int recordCount;
    // 总页数
    private int pageCount;
    // 存放分页数据的集合
    private List<T> datas;
}
  1. struts.xml
<struts>
    <!--使用spring创建管理struts2的action操作 -->
    <constant name="struts.objectFactory" value="spring" />
    <!-- 设置struts2的编码为UTF8 -->
    <constant name="struts.i18n.encoding" value="UTF-8"></constant>
    <!-- 不使用浏览器缓存 -->
    <constant name="struts.serve.static.browserCache" value="false"></constant>
    <!-- 每次重新加载xml配置文件 -->
    <constant name="struts.configuration.xml.reload" value="true"></constant>
    <!-- 启用开发者模式 -->
    <constant name="struts.devMode" value="true"></constant>
    <!-- 不使用struts2提供的主题ui -->
    <constant name="struts.ui.theme" value="simple"></constant>
    <!-- 提供对通配符的支持 -->
    <constant name="strutsenableDynamicMethodInvocation" value="true" />

    <!-- 需要拦截未登录用户的包 -->
    <package name="login" namespace="/" extends="struts-default">
        <!-- 配置拦截未登录用户的拦截器 -->
        <interceptors>
            <interceptor name="userInter"
                class="com.flowershopping.tool.UserInterceptor"></interceptor>
            <interceptor-stack name="userStack">
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="userInter"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 需要拦截的action 注销 和 提交订单 -->
        <!-- 设置默认拦截器 -->
        <default-interceptor-ref name="userStack"></default-interceptor-ref>
        <!-- 拦截结果处理 -->
        <global-results>
            <result name="login" type="redirect">/jsp/login/login.jsp</result>
        </global-results>
        <!-- 注销 -->
        <action name="logout" class="userAction" method="logout">
            <result name="success">/jsp/index/index.jsp</result>
        </action>
        <!-- 提交订单 -->
        <action name="addOrder" class="ordersAction" method="addOrder">
            <result name="success">/jsp/shopping/orderAdded.jsp</result>
        </action>
    </package>

    <!-- 需要进行未登录管理员拦截的包 -->

    <package name="admin" namespace="/" extends="struts-default">
        <!-- 配置拦截未登录管理员的拦截器 -->
        <interceptors>
            <interceptor name="adminInter"
                class="com.flowershopping.tool.AdminInterceptor"></interceptor>
            <interceptor-stack name="adminStack">
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="adminInter"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 需要拦截的action 查看所有用户 查看订单 添加商品 -->
        <!-- 设置默认拦截器 -->
        <default-interceptor-ref name="adminStack"></default-interceptor-ref>
        <!-- 拦截结果处理 -->
        <global-results>
            <result name="login" type="redirect">/jsp/login/admin.jsp</result>
        </global-results>
        <!-- 查看所有用户 -->
        <action name="findAllUsers" class="userAction" method="findAllUsers">
            <result name="success">/jsp/admin/manageUsers.jsp</result>
        </action>
        <!-- 查看订单 -->
        <action name="findAllOrders" class="ordersAction" method="findAllOrders">
            <result name="success">/jsp/admin/manageOrders.jsp</result>
        </action>
        <!-- 添加商品 -->
        <action name="addGoods" class="goodsAction" method="addGoods">
        </action>
    </package>
    <!-- 其余包 -->
    <package name="default" namespace="/" extends="struts-default,json-default"
        strict-method-invocation="false">
        <global-results>
            <result name="jsonMap" type="json">
                <param name="root">pageMap</param>
            </result>
            <result name="stream" type="stream">
                <param name="inputName">inputStream</param>
            </result>
        </global-results>
        <!-- 商品分类 -->
        <action name="category_*" class="categoryAction" method="{1}">
            <result name="findCategories_success">/jsp/index/header.jsp</result>
        </action>
        <!-- 商品信息 -->
        <action name="goods_*" class="goodsAction" method="{1}">
            <result name="findGoodsByCategory_success">/jsp/index/contentByCategory.jsp</result>
            <result name="findAllGoods_success">/jsp/index/content.jsp</result>
            <result name="findOne_success">/jsp/shopping/product.jsp</result>
            <result name="findGoodsByKey_success">/jsp/shopping/searchResult.jsp</result>
            <result name="findGoodsByKeys_success">/jsp/shopping/searchResult.jsp</result>
        </action>
        <!-- 用户 -->
        <action name="user_*" class="userAction" method="{1}">
            <result name="checkUser_success">/jsp/index/index.jsp</result>
            <result name="checkUser_error">/jsp/login/login.jsp</result>
            <result name="checkAdmin_success">/jsp/admin/main.jsp</result>
            <result name="checkAdmin_error">/jsp/login/admin.jsp</result>
            <result name="addUser_success">/jsp/index/index.jsp</result>
            <result name="updateUser_success">/jsp/login/userinfocenter.jsp</result>
        </action>
        <!-- 订单 -->
        <action name="orders_*" class="ordersAction" method="{1}">
            <result name="addToCart_success">/jsp/shopping/showCart.jsp</result>
            <result name="myOrder">/jsp/shopping/myOrder.jsp</result>
            <result name="updateCart_error">/jsp/shopping/showCartErro.jsp</result>
            <result name="login" type="redirect">/jsp/login/login.jsp</result>
        </action>
    </package>
</struts>

项目后续

其他ssh,ssm,springboot版本后续迭代更新,持续关注

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,717评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,501评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,311评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,417评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,500评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,538评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,557评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,310评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,759评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,065评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,233评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,909评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,548评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,172评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,420评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,103评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,098评论 2 352

推荐阅读更多精彩内容