简单的SSM项目(门店维修管理系统)

第一个ssm项目

结束spring,springMVC,mybatis的学习之后,将期末的java项目通过ssm框架进行复写,本章内容是基于ssm框架的门店维修管理系统,实现数据的增删改查。

目标:用ssm框架将原来的java项目进行复写,保证项目的正常运行,巩固学习

目标效果:

        

 

 

 开发环境:

        idea:2023

        jdk:1.8

        mysql:8

        tomcat:9

        maven:3.9

数据库代码:(数据库的名称自建)

CREATE TABLE tb_task(

task_id INT PRIMARY KEY AUTO_INCREMENT,

task_no VARCHAR(20) UNIQUE,

task_item VARCHAR(20),

cus_name VARCHAR(20),

cus_phone VARCHAR(20),

task_status INT

)

CREATE TABLE tb_fit(

fit_id INT PRIMARY KEY AUTO_INCREMENT,

fit_no VARCHAR(20) COMMENT '编号',

fit_name VARCHAR(20) COMMENT '名称',

fit_qty INT COMMENT '数量',

fit_city VARCHAR(20) COMMENT '产地'

)

基本环境搭建

项目结构:

项目搭建:

1.新建一个maven工程,然后添加以下依赖

<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.9</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.1</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.4</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>

2.在main目录下新建目录webapp 和 资源目录resources

在项目结构里部署web.xml

修改部署路径  (添加src\main\webapp)

 

 3.在web.xml里面进行配置

<!--配置spring的编码过滤器-->
    <filter>
        <filter-name>characterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>characterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--配置处理请求方法的过滤器-->
    <filter>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>hiddenHttpMethodFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!--配置springmvc的前端控制器-->
    <servlet>
        <servlet-name>dispatcherServlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:springMVC.xml</param-value>
        </init-param>
        <!--将DispatcherServlet的初始化时间提前到服务器启动时-->
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>dispatcherServlet</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

    <!--spring的监听器 在服务器启动时加载spring的配置文件-->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!--设置spring配置文件自定义的位置和名称-->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring.xml</param-value>
    </context-param>

        

4.在resources目录下新建spring,springmvc,mybatis,数据库连接的配置文件

springMVC.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
    <!--扫描控制层组件-->
    <context:component-scan base-package="com.wbu.ssm.mvc.controller"></context:component-scan>

    <!--视图解析器-->
    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                        <!-- 视图前缀 -->
                        <property name="prefix" value="/WEB-INF/templates/"/>
                        <!-- 视图后缀 -->
                        <property name="suffix" value=".html"/>
                        <property name="templateMode" value="HTML5"/>
                        <property name="characterEncoding" value="UTF-8"/>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
    <!--默认的Servlet处理静态资源-->
    <mvc:default-servlet-handler></mvc:default-servlet-handler>

    <!--开启mvc的注解驱动-->
    <mvc:annotation-driven/>
    <!--视图控制器-->
    <mvc:view-controller path="/" view-name="index"></mvc:view-controller>
<!--    <mvc:view-controller path="custom_view" view-name="custom_view"></mvc:view-controller>-->

    <!--文件上传视图解析器-->
    <bean class="org.springframework.web.multipart.commons.CommonsMultipartResolver" id="multipartResolver"/>

    <!--异常处理-->
</beans>

spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
    <context:component-scan base-package="com.wbu.ssm.mvc"></context:component-scan>
</beans>

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>


    <properties resource="jdbc.properties"/>
    <!--    environments:配置多个连接数据库的环境
        属性:
            default:设置默认使用的环境的id
-->

    <!--    类型别名 不区分大小写
        typeAliases:设置某个类型的别名
            属性:
                type:设置需要设置别名的类型
                alias:设置某个类型的别名
-->
    <typeAliases>
        <package name="com.wbu.ssm.mvc.bean"/>
    </typeAliases>

    <environments default="development">
        <!--    environment:配置某个具体的环境
            属性:
                id:表示连接数据库的环境的唯一标识,不能重复
                -->
        <environment id="development">
            <!--    transactionManager: 设置事务管理方式
        属性:
            type="JDBC||MANAGED"
            JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式,事务的提交或回滚需要手动处理
            MANAGED:被管理,例如Spring
            -->
            <transactionManager type="JDBC"/>
            <!--            DataSource:配置数据源
                属性:
                    type:设置数据源的类型
                    type="POOLED|UNPOOLED|JNDI"
                    POOLED:表示使用数据库连接池缓存数据库连接
                    UNPOOLED:表示不适用数据库连接池
                    JNDI:表示使用上下文中的数据源
                -->
            <dataSource type="POOLED">
                <!--                JDBC 驱动-->
                <property name="driver" value="${jdbc.driver}"/>
                <!--                url数据库的 JDBC URL地址。-->
                <property name="url" value="${jdbc.url}"/>
                <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>


    <mappers>
        <!--引入映射文件-->
        <package name="com.wbu.ssm.mvc.mapper"/>
    </mappers>

</configuration>

jdbc.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=
jdbc.username=
jdbc.password=

5.在webapp目录下新建静态资源目录存放js和css文件

6.前端代码

index.html

 

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
    <script th:src="@{/static/jquery-3.6.4.js}"></script>
    <script th:src="@{/static/bootstrap.js}"></script>
    <script th:src="@{/static/vue2.js}"></script>
    <script th:src="@{/static/axios.js}"></script>
    <link rel="stylesheet" th:href="@{/static/bootstrap.css}">
    <link rel="shortcut icon" th:href="@{/static/favicon.ico}">
    <style>
        button{
            margin-left:5px;
        }
    </style>
<body>
<div class="container" id="app">
    <div class="row">
        <div class="col-md-3" style="margin-top: 50px;">
            <div class="list-group">
                <a href="#" class="list-group-item active">华为门店维修接待管理系统</a>
                <a href="#" @click="show_manager(1)" class="list-group-item">客户接待</a>
                <a href="#" @click="show_manager(2)" class="list-group-item">维修管理</a>
                <a href="#" @click="show_manager(3)" class="list-group-item">配件查询</a>
            </div>
        </div>
        <div class="col-md-9" style="margin-top:50px ;">
            <div v-if="cus_view" class="panel panel-primary">
                <div class="panel-heading">客户办理业务信息列表</div>
                <div class="panel-body">
                    <p>
                    <form class="form-inline">
                        <div class="form-group">
                            &nbsp;<label>客户名</label>&nbsp;
                            <input type="text" style="width:80px" class="form-control" id="cus_name" placeholder="请输入姓名">
                        </div>

                        <div class="form-group">
                            &nbsp;<label>客户电话</label>&nbsp;
                            <input type="number" class="form-control" id="cus_phone" placeholder="请输入电话号码">
                        </div>

                        <div class="form-group">
                            &nbsp;<label>维修项目</label>&nbsp;
                            <select class="form-control" id="task_item">
                                <option>电池</option>
                                <option>外屏</option>
                                <option>内屏</option>
                                <option>摄像头</option>
                                <option>主板</option>
                            </select>
                        </div>
                        &nbsp;<button type="button" @click="save_task()" class="btn btn-danger">接待客户</button>
                    </form>
                    </p>
                </div>
                <table class="table table-bordered table-striped table-hover">
                    <thead>
                    <tr align="center" style="font-weight: bold;">
                        <td>任务编号</td>
                        <td>姓名</td>
                        <td>联系电话</td>
                        <td>业务项目</td>
                        <td>状态</td>
                        <td>操作</td>
                    </tr>
                    </thead>
                    <tbody align="center" class="ttr">
                    <tr v-for="task in task_list">
                        <td>{{task.task_no}}</td>
                        <td>{{task.cus_name}}</td>
                        <td>{{task.cus_phone}}</td>
                        <td>{{task.task_item}}</td>
                        <td>{{task.task_status==0?"录单完成":task.task_status==1?"维修中":"取机"}}</td>
                        <td>
                            <button class="btn btn-warning">查看</button>
                            <button class="btn btn-primary" @click="removeTask(task.task_no)">删除</button>
                        </td>
                    </tr>
                    </tbody>
                </table>
            </div>

            <div class="panel panel-primary" v-if="service_view">
                <div class="panel-heading">维修信息列表</div>
                <table class="table table-bordered table-striped table-hover">
                    <thead>
                    <tr align="center" style="font-weight: bold;">
                        <td>任务编号</td>
                        <td>姓名</td>
                        <td>联系电话</td>
                        <td>业务项目</td>
                        <td>状态</td>
                        <td>操作</td>
                    </tr>
                    </thead>
                    <tbody class="ttr" align="center">
                    <tr v-for="service in service_list">
                        <td>{{service.task_no}}</td>
                        <td>{{service.cus_name}}</td>
                        <td>{{service.cus_phone}}</td>
                        <td>{{service.task_item}}</td>
                        <td>{{service.task_status==0?"录单完成":service.task_status==1?"维修中":"取机"}}</td>
                        <td>
                            <button v-if="service.task_status==0" @click="change_status(service.task_no,'',1)" class="btn btn-warning">开始维修</button>
                            <button v-if="service.task_status==1" @click="change_status(service.task_no,service.task_item,2)"class="btn btn-primary">完成维修</button>
                        </td>
                    </tr>
                    </tbody>
                </table>
            </div>
            <div v-if="fit_view" class="panel panel-primary">
                <div class="panel-heading">库存配件信息列表</div>
                <div class="panel-body">
                    <table class="table table-bordered table-striped table-hover">
                        <thead>
                        <tr align="center" style="font-weight: bold;">
                            <td>配件编号</td>
                            <td>配件名称</td>
                            <td>库存数量</td>
                            <td>产地</td>
                        </tr>
                        </thead>
                        <tbody class="ttr" align="center">
                        <tr v-for="fit in fit_list">
                            <td>{{fit.fit_no}}</td>
                            <td>{{fit.fit_name}}</td>
                            <td>{{fit.fit_qty}}</td>
                            <td>{{fit.fit_city}}</td>
                        </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
    <div>
        <a th:href="@{/custom_view}" target="_blank">点这里</a>
    </div>
</div>
<script type="text/javascript">
    Vue.config.productionTip=false
    new Vue({
        el:'#app',
        data(){
            return{
                task_list:[],
                service_list:[],
                fit_list:[],
                cus_view:true,
                service_view:false,
                fit_view:false
            }
        },
        mounted(){//当Vue加载时执行
            this.query_all()
        },
        methods:{
          query_all:function (){
              var that = this
              $.post("http://localhost:8080/ssm/index?name=query_all",function (data){
                  that.task_list=data
              })
          },
            query_all_service:function (){
              var that = this
              $.post("http://localhost:8080/ssm/index?name=query_all",function (data){
                  that.service_list=data
                })
            },
            query_all_fit:function(){
                var that = this;
                $.post("http://localhost:8080/ssm/index?name=query_all_fit",function(data){
                    that.fit_list=data;
                });
            },
            change_status:function(task_no,task_item,task_status){
                var that = this;
                if(confirm("确认修改["+task_no+"]?")){
                    $.post("http://localhost:8080/ssm/index?name=edit_status",{
                        "task_no":task_no,
                        "task_item":task_item,
                        "task_status":task_status
                    },function(data){
                        that.query_all_service();
                    });
                }
            },
            removeTask:function(task_no){
                var that = this;
                // this.task_no=task_no;
                if(confirm("确认删除["+task_no+"]?")){
                    $.post("http://localhost:8080/ssm/index?name=remove_task",{
                        "task_no":task_no
                    },function(data){
                        that.query_all();
                    });
                }
            },
            show_manager:function(flag){
                if(flag==1){
                    this.cus_view=true;
                    this.service_view=false;
                    this.fit_view=false;
                    // this.query_all;
                }else if(flag==2){
                    this.cus_view=false;
                    this.service_view=true;
                    this.fit_view=false;
                    this.query_all_service();
                }else if(flag==3){
                    this.cus_view=false;
                    this.service_view=false;
                    this.fit_view=true;
                    this.query_all_fit();
                }
            },
            save_task:function(){
                var cus_name = $("#cus_name").val();
                var cus_phone = $("#cus_phone").val();
                var task_item = $("#task_item").val();
                var that = this;
                $.post("http://localhost:8080/ssm/index?name=save_task",{
                    "cus_name":cus_name,
                    "cus_phone":cus_phone,
                    "task_item":task_item
                },function(data){
                    that.query_all();
                    $("#cus_name").val("");
                    $("#cus_phone").val("");
                    $("#task_item").val("");
                });
            }
        }
    })
</script>
</body>
</html>

custom_view.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script th:src="@{/static/jquery-3.6.4.js}"></script>
    <script th:src="@{/static/bootstrap.js}"></script>
    <script th:src="@{/static/vue2.js}"></script>
    <script th:src="@{/static/axios.js}"></script>
    <link rel="stylesheet" th:href="@{/static/bootstrap.css}">
    <link rel="shortcut icon" th:href="@{/static/favicon.ico}">
    <style>
        .ttr tr{
            height: 25px;
            text-align: center;
        }
        .ttr1 tr{
            height: 60px;
            text-align: center;
        }
    </style>

</head>
<body>
<div class="container" style="margin-top: 100px;" id="app">
    <div class="row">
        <div class="col-md-9">
            <div class="panel panel-primary">
                <div class="panel-heading">
                    <h3 class="panel-title">业务处理进度</h3>
                </div>
                <div class="panel-body">
                    <table class="table">
                        <tbody class="ttr1">
                        <tr align="center" v-for="task in service_list">
                            <td>{{task.task_no}}</td>
                            <td style="width: 65%;">
                                <div class="progress">
                                    <div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100"
                                         :style="'width:'+(task.task_status==0?'20':task.task_status==1?'60':'100')+'%'">
                                        {{task.task_status==0?'20':task.task_status==1?'60':'100'}}%
                                    </div>
                                </div>
                            </td>
                            <td>{{task.task_status==0?"录单完成":task.task_status==1?"维修中":"取机"}}</td>
                        </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="panel panel-primary">
                <div class="panel-heading">任务条目</div>
                <table class="table table-bordered table-hover table-striped">
                    <thead>
                    <tr align="center" style="font-weight: bold;">
                        <td>任务编号</td>
                        <td>项目</td>
                    </tr>
                    </thead>
                    <tbody class="ttr warning">
                    <tr :class="task.task_status==2?'info':''" v-for="task in service_list">
                        <td>{{task.task_no}}</td>
                        <td>换{{task.task_item}}</td>
                    </tr>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</div>
<script>
    new Vue({
        el:"#app",
        data(){
            return{
                service_list:[]
            }
        },
        mounted(){
            this.loadData()
            var that = this
            setInterval(function (){
                that.loadData()
            },3000)
        },
        methods:{
            loadData:function (){
                var that = this
                axios({
                    method:'post',
                    url:'http://localhost:8080/ssm/custom_view?name=query_all'
                }).then(function (response){
                    that.service_list=response.data;
                })
                // var that = this
                // $.post("http://localhost:8080/ssm/custom_view?name=query_all",function (data){
                //     that.service_list=data
                // })
            }
        }
    })
</script>

</body>
</html>

7.根据前端代码开始java代码的编写

实体层

Fit.class

package com.wbu.ssm.mvc.bean;

/**
 * @auther aqing
 */

import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;

@Component
@Setter
@Getter
public class Fit {
    private int fit_id;
    private String fit_no;
    private String fit_name;
    private int fit_qty;
    private String fit_city;

    public Fit() {
    }

    public Fit(int fit_id, String fit_no, String fit_name, int fit_qty, String fit_city) {
        this.fit_id = fit_id;
        this.fit_no = fit_no;
        this.fit_name = fit_name;
        this.fit_qty = fit_qty;
        this.fit_city = fit_city;
    }

    @Override
    public String toString() {
        return "Fit{" +
                "fit_id=" + fit_id +
                ", fit_no='" + fit_no + '\'' +
                ", fit_name='" + fit_name + '\'' +
                ", fit_qty=" + fit_qty +
                ", fit_city='" + fit_city + '\'' +
                '}';
    }
}

Task.class

package com.wbu.ssm.mvc.bean;

/**
 * @auther aqing
 */
import lombok.Getter;
import lombok.Setter;
import org.springframework.stereotype.Component;

@Component
@Setter
@Getter
public class Task {
    private int task_id;
    private String task_no;
    private String task_item;
    private String cus_name;
    private String cus_phone;
    private int task_status;
    public Task() {
    }

    public Task(int task_id, String task_no, String task_item, String cus_name, String cus_phone, int task_status) {
        this.task_id = task_id;
        this.task_no = task_no;
        this.task_item = task_item;
        this.cus_name = cus_name;
        this.cus_phone = cus_phone;
        this.task_status = task_status;
    }

    @Override
    public String toString() {
        return "Task{" +
                "task_id=" + task_id +
                ", task_no='" + task_no + '\'' +
                ", task_item='" + task_item + '\'' +
                ", cus_name='" + cus_name + '\'' +
                ", cus_phone='" + cus_phone + '\'' +
                ", task_status=" + task_status +
                '}';
    }
}

控制层

IndexController

package com.wbu.ssm.mvc.controller;

/**
 * @auther aqing
 */
import com.wbu.ssm.mvc.bean.Fit;
import com.wbu.ssm.mvc.bean.Task;
import com.wbu.ssm.mvc.dao.TaskDao;
import com.wbu.ssm.mvc.mapper.FitDaoMapper;
import com.wbu.ssm.mvc.mapper.TaskDaoMapper;
import com.wbu.ssm.mvc.utils.CodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class IndexController {

    @Autowired
    private TaskDaoMapper taskDaoMapper;

    @Autowired
    private FitDaoMapper fitDaoMapper;

    @RequestMapping(value = "/index",params = "name=query_all")
    @ResponseBody
    public List<Task> taskList(){
        return taskDaoMapper.queryAllTask();
    }

    @RequestMapping(value = "/index",params = "name=query_all_fit")
    @ResponseBody
    public List<Fit> fitList(){
        return fitDaoMapper.findAllFit();
    }

    @RequestMapping(value = "/index",params = "name=edit_status")
    @ResponseBody
    public int change_status(String task_no,String task_item,int task_status){
        return taskDaoMapper.editTaskStatus(task_no,task_status);
    }

    @RequestMapping(value = "/index",params = "name=remove_task")
    @ResponseBody
    public int remove_task(String task_no){
        return taskDaoMapper.removeTask(task_no);
    }

    @RequestMapping(value = "index",params = "name=save_task")
    @ResponseBody
    public int save_task(String cus_name,String cus_phone,String task_item){
        return taskDaoMapper.saveTask(CodeUtils.getCode(),cus_name,cus_phone,task_item);
    }


}

CustomController

package com.wbu.ssm.mvc.controller;

/**
 * @auther aqing
 */
import com.wbu.ssm.mvc.bean.Task;
import com.wbu.ssm.mvc.mapper.TaskDaoMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.List;

@Controller
public class CustomController {

    @Autowired
    private TaskDaoMapper taskDaoMapper;

    @RequestMapping("/custom_view")
    public String custom(){
        return "custom_view";
    }

    @RequestMapping(value = "/custom_view",params = "name=query_all")
    @ResponseBody
    public List<Task> test(){
        return taskDaoMapper.queryAllTask();
    }
}

dao层

TaskDao.class

package com.wbu.ssm.mvc.dao;

/**
 * @auther aqing
 */
import com.wbu.ssm.mvc.bean.Task;
import com.wbu.ssm.mvc.mapper.TaskDaoMapper;
import com.wbu.ssm.mvc.utils.CodeUtils;
import com.wbu.ssm.mvc.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class TaskDao implements TaskDaoMapper {


    @Test@Override
    public List<Task> queryAllTask() {
        SqlSession sqlSession = SqlSessionUtil.getSession();
        TaskDaoMapper mapper = sqlSession.getMapper(TaskDaoMapper.class);
        List<Task> tasks = mapper.queryAllTask();
        return tasks;
    }

    @Test@Override
    public int saveTask(String task_no, String cus_name, String cus_phone, String task_item) {
        SqlSession sqlSession = SqlSessionUtil.getSession();
        TaskDaoMapper mapper = sqlSession.getMapper(TaskDaoMapper.class);
        int saveTask = mapper.saveTask(CodeUtils.getCode(),cus_name,cus_phone,task_item);
        System.out.println(saveTask);
        return saveTask;
    }

    @Test@Override
    public int removeTask(String task_no) {
        SqlSession sqlSession = SqlSessionUtil.getSession();
        TaskDaoMapper mapper = sqlSession.getMapper(TaskDaoMapper.class);
        int removeTask = mapper.removeTask(task_no);
        System.out.println(removeTask);
        return removeTask;
    }

    @Test@Override
    public int editTaskStatus(String task_no, int status) {
        SqlSession SqlSession = SqlSessionUtil.getSession();
        TaskDaoMapper mapper = SqlSession.getMapper(TaskDaoMapper.class);
        int editTaskStatus = mapper.editTaskStatus(task_no,status);
        System.out.println(editTaskStatus);
        return editTaskStatus;
    }
}

FitDao.class

package com.wbu.ssm.mvc.dao;

/**
 * @auther aqing
 */
import com.wbu.ssm.mvc.bean.Fit;
import com.wbu.ssm.mvc.mapper.FitDaoMapper;
import com.wbu.ssm.mvc.utils.SqlSessionUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.jupiter.api.Test;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class FitDao implements FitDaoMapper {
    @Test
    @Override
    public List<Fit> findAllFit() {
        SqlSession sqlSession = SqlSessionUtil.getSession();
        FitDaoMapper mapper = sqlSession.getMapper(FitDaoMapper.class);
        List<Fit> allFit = mapper.findAllFit();
        System.out.println(allFit);
        return allFit;
    }

    @Test@Override
    public int changeQty(String task_item) {
        SqlSession sqlSession = SqlSessionUtil.getSession();
        FitDaoMapper mapper = sqlSession.getMapper(FitDaoMapper.class);
        int changeQty = mapper.changeQty(task_item);
        System.out.println(changeQty);
        return changeQty;
    }
}

工具层

CodeUtils.class (返回的是任务编号)

package com.wbu.ssm.mvc.utils;

/**
 * @auther aqing
 */
import java.text.SimpleDateFormat;
import java.util.Date;

public class CodeUtils {
    public static String getCode(){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss");
//        System.out.println(sdf.format(new Date()));
        return "T-"+sdf.format(new Date())+"\n";
    }
}

SqlSessionUtil.class

package com.wbu.ssm.mvc.utils;

/**
 * @auther aqing
 */
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class SqlSessionUtil {
    public static SqlSession getSession(){
        SqlSession sqlSession = null;
        try {
            InputStream rs = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
            SqlSessionFactory build = sqlSessionFactoryBuilder.build(rs);
            sqlSession = build.openSession(true);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return sqlSession;
    }
}

mapper 层

FitDaoMapper.class

package com.wbu.ssm.mvc.mapper;

/**
 * @auther aqing
 */
import com.wbu.ssm.mvc.bean.Fit;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;

import java.util.List;
public interface FitDaoMapper {
    @Select("SELECT * FROM tb_fit")
    List<Fit> findAllFit();

    @Update("UPDATE tb_fit SET fit_qty = fit_qty-1 WHERE fit_name = #{task_item}")
    int changeQty(@Param("task_item") String task_item);


}

TaskDaoMapper.class

package com.wbu.ssm.mvc.mapper;

/**
 * @auther aqing
 */
import com.wbu.ssm.mvc.bean.Task;
import org.apache.ibatis.annotations.*;


import java.util.List;

public interface TaskDaoMapper {
    @Select("select * from tb_task")
    List<Task> queryAllTask();
    @Insert("insert into tb_task(task_no,cus_name,cus_phone,task_item,task_status) values(#{task_no},#{cus_name},#{cus_phone},#{task_item},0)")
    int saveTask(@Param("task_no") String task_no, @Param("cus_name") String cus_name, @Param("cus_phone") String cus_phone, @Param("task_item") String task_item);

    @Delete("delete from tb_task where task_no = #{task_no}")
    int removeTask(@Param("task_no") String task_no);

    @Update("update tb_task set task_status = #{status} where task_no = #{task_no}")
    int editTaskStatus(@Param("task_no") String task_no,@Param("status") int status);

}

最后补充一点就是不小心忘了部署Tomcat 

 

 

 

最后点击应用确定

当需要程序跑起来的时候 点击调试Tomcat就可以 也就是将项目部署到tomcat上面,等待程序执行

最后做个总结

        使用ssm框架确实是要比纯Java代码写要更加方便简单,以本项目为例,我们看看不使用框架的时候需要怎么去做

        在main函数里添加端口监听,创建执行上下文,然后实现TestHandler()

HttpServer server = HttpServer.create(new InetSocketAddress(80),0);
		server.createContext("/task",new TestHandler());
		server.start();

然后对之后的数据处理做一些准备

 

public void handle(final HttpExchange exchange) {
			//为了加快处理速度 每来一个请求就新建一个线程来处理
			new Thread(new Runnable() {
				@Override
				public void run() {
					try {
						// 获得查询字符串(get)
						String queryString = exchange.getRequestURI().getQuery();
						Map<String, String> queryStringInfo = formData2Dic(queryString);
						System.out.println(queryStringInfo);
						// 获得表单提交数据(post)
						@SuppressWarnings("deprecation")
						String postString = IOUtils.toString(exchange.getRequestBody());
						System.out.println(postString);
						Map<String, String> postInfo = formData2Dic(postString);
						
						
						//用来处理响应的类型 =========================================json
						exchange.getResponseHeaders().add("Content-Type", "application/json");
						//用来处理跨域==================================================所有人都可以访问
						exchange.getResponseHeaders().add("Access-Control-Allow-Origin", "*");
						//设置响应码 200 OK
						exchange.sendResponseHeaders(200, 0);
						//取得输出流
						OutputStream os = exchange.getResponseBody();
						//业务处理
						String response = "{}";
						//取得浏览器请求过来的方式
						String method = exchange.getRequestMethod();
						if (method.equals("POST") || method.equals("GET")) {
							if (queryStringInfo.get("name").equals("query_all")) {//查询所有的业务
								//调用Dao层查询
								List<Task> taskList=dao.queryAllTask();
								//将集合转成JOSN
								String jsonList=gson.toJson(taskList);
								response = jsonList;
							}if(queryStringInfo.get("name").equals("query_all_fit")) {
								List<Fit> fitList = fitDao.findAllFit();
								String jsonList = gson.toJson(fitList);
								response = jsonList;
							}else if(queryStringInfo.get("name").equals("save_task")) {
								String cus_name = postInfo.get("cus_name");
								String cus_phone = postInfo.get("cus_phone");
								String task_item = postInfo.get("task_item");
//								System.out.println(cus_name);
//								System.out.println(cus_phone);
//								System.out.println(task_item);
								int row = dao.saveTask(cus_name, cus_phone, task_item);
								response=String.valueOf(row);
							}else if(queryStringInfo.get("name").equals("query_one")) {
								response="";
							}else if(queryStringInfo.get("name").equals("remove_task")) {
								String task_no = postInfo.get("task_no");
								int row = dao.removeTask(task_no);
								response=String.valueOf(row);
							}else if(queryStringInfo.get("name").equals("edit_status")) {
								String task_no = postInfo.get("task_no");
								String task_item = postInfo.get("task_item");
								int task_status = Integer.parseInt(postInfo.get("task_status"));
								int row = dao.editTaskStatus(task_no, task_status);
								if(row==1&&task_status==2) {
									fitDao.changeQty(task_item);
								}
								response=String.valueOf(row);
							}else if(queryStringInfo.get("name").equals("Login")) {
								System.out.println("成功登录");
							}
						}
						
						//输出 将内容转成字符数据输出 编码
						os.write(response.getBytes("UTF-8"));
						os.close();

					} catch (IOException ie) {
						ie.printStackTrace();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}).start();
		}

解析网页提交的数据

/**
	 * 专用于解析网页提交过来的数据 转成map类型 
	 * @param formData
	 * @return
	 */
	public static Map<String, String> formData2Dic(String formData) {
		final Map<String, String> result = new HashMap<>();
		if (formData == null || formData.trim().length() == 0) {
			return result;
		}
		final String[] items = formData.split("&");
		//stream终止操作 将一个数组转换成一个流
		Arrays.stream(items).forEach(item -> {
			final String[] keyAndVal = item.split("=");
			if (keyAndVal.length == 2) {
				try {
					final String key = URLDecoder.decode(keyAndVal[0], "utf8");
					final String val = URLDecoder.decode(keyAndVal[1], "utf8");
					result.put(key, val);
				} catch (UnsupportedEncodingException e) {
					e.printStackTrace();
				}
			}
		});
		return result;
	}

在springMVC中通过@RequestMapping注解就可以实现上述的操作,不难看出ssm框架方便我们去写代码,但是一些底层原理还是要掌握的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值