基于SSH框架实现的驾校管理系统

本系统使用Struts2+Spring+Hibernate架构,数据库使用MySQL,连接池使用c3p0。广泛用于驾校管理,包含学员管理、车辆管理、教练员工管理、用车管理、考试管理、成绩缴费管理等功能,除了管理员能控制修改这些信息以外,教练也可对其下学员的约车信息和考试管理信息进行增删改查。

开发环境

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

所用技术

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

项目架构

项目架构.png

项目截图

  • 登录


    登录.png
  • 学员列表


    学员列表.png
  • 教练列表


    教练列表.png
  • 新增缴费信息


    新增缴费信息.png
  • 教练后台-考试管理


    教练后台-考试管理.png
  • 教练后台-约车管理


    教练后台-约车管理.png

数据库配置

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">false</prop>
            <prop key="hibernate.format_sql">false</prop>
            <prop key="hibernate.connection.provider_class">com.jolbox.bonecp.provider.BoneCPConnectionProvider</prop>
            <prop key="hibernate.connection.driver_class">com.mysql.jdbc.Driver</prop>
            <prop key="hibernate.connection.url"> <![CDATA[jdbc:mysql://localhost:3306/driverschool?useUnicode=true&characterEncoding=utf8]]></prop>
            <prop key="hibernate.connection.username">root</prop>
            <prop key="hibernate.connection.password">root123</prop>
            <prop key="bonecp.partitionCount">1</prop>
            <prop key="bonecp.maxConnectionsPerPartition">10</prop>
            <prop key="bonecp.minConnectionsPerPartition">5</prop>
            <prop key="bonecp.acquireIncrement">1</prop><!-- #每次新增连接的数量 -->
            <prop key="bonecp.connectionTimeout">3000</prop><!-- #连接超时时间阀值,获取连接时,超出阀值时间,则获取失败,毫秒为单位 -->
            <prop key="bonecp.poolAvailabilityThreshold">20</prop><!-- #连接池阀值,当 可用连接/最大连接 < 连接阀值 时,创建新的连接 -->
            <prop key="bonecp.idleConnectionTestPeriod">30</prop><!-- 测试连接有效性的间隔时间,单位分钟 -->
            <prop key="bonecp.idleMaxAge">240</prop><!-- 连接的空闲存活时间,当连接空闲时间大于该阀值时,清除该连接 -->
            <prop key="bonecp.statementsCacheSize">5</prop><!-- 语句缓存个数 -->
            <prop key="hibernate.query.factory_class">org.hibernate.hql.classic.ClassicQueryTranslatorFactory</prop>
            <prop key="hibernate.connection.release_mode">auto</prop>
            <prop key="hibernate.autoReconnect">true</prop>
            <prop key="hibernate.connection.autocommit">true</prop>
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
            <prop key="hibernate.cache.use_query_cache">true</prop>
            <prop key="hibernate.cache.use_second_level_cache">true</prop>
        </props>
    </property>
    <property name="mappingResources">
        <list>
            <value>com/driverSchool/entity/Bookcar.hbm.xml</value>
            <value>com/driverSchool/entity/Car.hbm.xml</value>
            <value>com/driverSchool/entity/Pay.hbm.xml</value>
            <value>com/driverSchool/entity/Student.hbm.xml</value>
            <value>com/driverSchool/entity/Test.hbm.xml</value>
            <value>com/driverSchool/entity/User.hbm.xml</value>
        </list>
    </property>
</bean>

struts.xml 配置

<struts>
    <constant name="struts.i18n.encoding" value="UTF-8" />
    <constant name="struts.locale" value="zh_CN" />
    <constant name="struts.objectFactory" value="spring" />
    <package name="default" extends="struts-default">

        <interceptors>
            <!-- 安全信息过滤,用户session为空则强制退出 -->
            <interceptor name="sessionCheck" class="com.driverSchool.util.SessionCheck">
                <!-- 不需要拦截的方法 -->
                <param name="excludeMethods">
                    login
                </param>
            </interceptor>
            <!-- 拦截器栈,包含SESSION拦截和默认拦截器 -->
            <interceptor-stack name="authInterceptor1">
                <interceptor-ref name="sessionCheck" />
                <interceptor-ref name="defaultStack" />
            </interceptor-stack>
        </interceptors>
        <default-interceptor-ref name="authInterceptor1"></default-interceptor-ref>

        <!-- 注意global-results必须在global-exception-mappings前面 -->
        <global-results>
            <result name="reLogin">/login.jsp</result>
            <result name="to_index">/index.jsp</result>
        </global-results>
        <global-exception-mappings> <!-- 此处定义的result对应于上面的global-results内 捕获所有异常  -->
            <exception-mapping result="error" exception="java.lang.Exception"> </exception-mapping> 
            <exception-mapping result="errorSql" exception="java.sql.SQLException"> </exception-mapping> 
        </global-exception-mappings>
        
        <action name="userAction_*" class="userAction" method="{1}">
            <result name="to_info">/info.jsp</result>
            <result name="to_user_list">/user_list.jsp</result>
            <result name="to_addOrEditUser">/user_addAndEdit.jsp</result>
            <result name="to_user_listAction" type="redirectAction">userAction_findUserAll</result>
        </action>
        
        <action name="bookcarAction_*" class="bookcarAction" method="{1}">
            <result name="to_bookcar_list">/bookcar_list.jsp</result>
            <result name="to_addOrEditBookcar">/bookcar_addAndEdit.jsp</result>
            <result name="to_bookcar_listAction" type="redirectAction">bookcarAction_findBookcarAll</result>
        </action>
        
        <action name="carAction_*" class="carAction" method="{1}">
            <result name="to_car_list">/car_list.jsp</result>
            <result name="to_addOrEditCar">/car_addAndEdit.jsp</result>
            <result name="to_car_listAction" type="redirectAction">carAction_findCarAll</result>
        </action>
        
        <action name="payAction_*" class="payAction" method="{1}">
            <result name="to_pay_list">/pay_list.jsp</result>
            <result name="to_addOrEditPay">/pay_addAndEdit.jsp</result>
            <result name="to_pay_listAction" type="redirectAction">payAction_findPayAll</result>
        </action>
        
        <action name="studentAction_*" class="studentAction" method="{1}">
            <result name="to_student_list">/student_list.jsp</result>
            <result name="to_addOrEditStudent">/student_addAndEdit.jsp</result>
            <result name="to_student_listAction" type="redirectAction">studentAction_findStudentAll</result>
        </action>
        
        <action name="testAction_*" class="testAction" method="{1}">
            <result name="to_test_list">/test_list.jsp</result>
            <result name="to_addOrEditTest">/test_addAndEdit.jsp</result>
            <result name="to_test_listAction" type="redirectAction">testAction_findTestAll</result>
        </action>
    </package>
</struts>   
  1. applicationContext.xml
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
    <import resource="datebase.xml" />

    <bean id="userDao" class="com.driverSchool.dao.UserDao">
        <property name="ht" ref="hibernatetemplate"></property>
    </bean>
    <bean id="userService" class="com.driverSchool.service.impl.UserServiceImpl">
        <property name="dao" ref="userDao"></property>
    </bean>
    <bean id="userAction" class="com.driverSchool.action.UserAction">
        <property name="biz" ref="userService"></property>
    </bean>
    
    <bean id="bookcarDao" class="com.driverSchool.dao.BookcarDao">
        <property name="ht" ref="hibernatetemplate"></property>
    </bean>
    <bean id="bookcarService" class="com.driverSchool.service.impl.BookcarServiceImpl">
        <property name="dao" ref="bookcarDao"></property>
    </bean>
    <bean id="bookcarAction" class="com.driverSchool.action.BookcarAction">
        <property name="biz" ref="bookcarService"></property>
        <property name="sbiz" ref="studentService"></property>
        <property name="cbiz" ref="carService"></property>
    </bean>
    
    <bean id="carDao" class="com.driverSchool.dao.CarDao">
        <property name="ht" ref="hibernatetemplate"></property>
    </bean>
    <bean id="carService" class="com.driverSchool.service.impl.CarServiceImpl">
        <property name="dao" ref="carDao"></property>
    </bean>
    <bean id="carAction" class="com.driverSchool.action.CarAction">
        <property name="biz" ref="carService"></property>
    </bean>
    
    <bean id="payDao" class="com.driverSchool.dao.PayDao">
        <property name="ht" ref="hibernatetemplate"></property>
    </bean>
    <bean id="payService" class="com.driverSchool.service.impl.PayServiceImpl">
        <property name="dao" ref="payDao"></property>
    </bean>
    <bean id="payAction" class="com.driverSchool.action.PayAction">
        <property name="biz" ref="payService"></property>
        <property name="sbiz" ref="studentService"></property>
    </bean>
    
    <bean id="studentDao" class="com.driverSchool.dao.StudentDao">
        <property name="ht" ref="hibernatetemplate"></property>
    </bean>
    <bean id="studentService" class="com.driverSchool.service.impl.StudentServiceImpl">
        <property name="dao" ref="studentDao"></property>
    </bean>
    <bean id="studentAction" class="com.driverSchool.action.StudentAction">
        <property name="biz" ref="studentService"></property>
    </bean>
    
    <bean id="testDao" class="com.driverSchool.dao.TestDao">
        <property name="ht" ref="hibernatetemplate"></property>
    </bean>
    <bean id="testService" class="com.driverSchool.service.impl.TestServiceImpl">
        <property name="dao" ref="testDao"></property>
    </bean>
    <bean id="testAction" class="com.driverSchool.action.TestAction">
        <property name="biz" ref="testService"></property>
        <property name="sbiz" ref="studentService"></property>
    </bean>
</beans>

登录

//controller
public String login() {
    User user = biz.findUserByUsernameAndPwd(username, pwd);
    if (user == null) {
        ActionContext.getContext().put("msg", "该用户不存在,请重新登录!");
        return "reLogin";
    } else {
        ActionContext.getContext().getSession().put("user", user);
        ActionContext.getContext().getSession().put("uname", username);
        ActionContext.getContext().getSession().put("uid", user.getId());
        ActionContext.getContext().getSession().put("role", user.getRole());
        ActionContext.getContext().put("msg", "");
        return "to_index";
    }
}
//jsp
<div class="container">
    <div class="line bouncein">
        <div class="xs6 xm4 xs3-move xm4-move">
            <div style="height:150px;"></div>
            <div class="media media-y margin-big-bottom"></div>
            <form action="<%=basePath%>userAction_login.action" method="post">
                <div class="panel loginbox">
                    <div class="text-center margin-big padding-big-top">
                        <h1>驾校信息管理平台</h1>
                    </div>
                    <div class="panel-body" style="padding:30px; padding-bottom:10px; padding-top:10px;">
                        <div class="form-group">
                            <div class="field field-icon-right">
                                <input type="text" class="input input-big" name="username" placeholder="登录账号" data-validate="required:请填写账号" />
                                <span class="icon icon-user margin-small"></span>
                            </div>
                        </div>
                        <div class="form-group">
                            <div class="field field-icon-right">
                                <input type="password" class="input input-big" name="pwd" placeholder="登录密码" data-validate="required:请填写密码" />
                                <span class="icon icon-key margin-small"></span>
                            </div>
                        </div>
                    </div>
                    <div style="padding:30px;">
                        <input type="submit" class="button button-block bg-main text-big input-big" value="登录">
                    </div>
                </div>
            </form>
        </div>
    </div>
</div>

项目后续

其他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

推荐阅读更多精彩内容