SpringMVC+ElementUl+Vue实现增、删、改、查、多条件搜索、分页功能(前端后端分离)

5 篇文章 1 订阅
1 篇文章 0 订阅

使用vue+element+springMVC来实现增、删、改、查、搜索、分页这几个功能!

										对于今天老师留的作业小张与小红对话:
  • 一班小红同学对二班小张同学说:今天我们班里学了ElementUl组件可是我学没明白,老师还留了个基于vue+ElementUI+SpringMVC实现增删改查的作业可是我不会,明天又老师被挨批了 哭哭哭…。
  • 小张同学摸着小红他头说:没事没事别哭,我把我这一套教给你,以后每次留这类似作业就够你用的了,非常易上手
  • 小红擦拉擦眼泪说:怎么用
  • 小张以说:代码都给你整理好了,直接复制就可以用功能一样不差,你可以去试试
  • 小红说:好,行那我赶紧回家去试试吧!

----------问这次小红的作业能不能写完?能不能不被老师挨批?而且功能一样不差?


1、动态演示(GIF)

在这里插入图片描述

2、项目结构

在这里插入图片描述

3、数据表

CREATE TABLE `rikao_t_goods` (
  `noid` int(11) NOT NULL AUTO_INCREMENT,
  `goods_name` varchar(32) NOT NULL COMMENT '商品名称',
  `price` decimal(10,2) DEFAULT NULL COMMENT '价格',
  `weight` int(11) NOT NULL DEFAULT '0' COMMENT '重量',
  `buy_date` datetime DEFAULT NULL COMMENT '购买时间',
  PRIMARY KEY (`noid`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8mb4

一、前端代码

(一)添加.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <!-- import CSS -->
  <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
  <script src="axios.min.js"></script>
  <script src="vuejs-2.5.16.js"></script>
</head>
<body>
  <h1>新增商品</h1>
  <div id="app">
      <p>
        <el-input placeholder="请输入商品名称"   v-model="gdzc.goods_name"  clearable :style="{width:'400px'}"></el-input>
      </p>
      <p>
        <el-input placeholder="请输入商品名称金额"  v-model="gdzc.price"  clearable :style="{width:'400px'}"></el-input>
      </p>
      <p>
        <el-input placeholder="请输入商品重量"  v-model="gdzc.weight"  clearable :style="{width:'400px'}"></el-input>
      </p>
      <p>
        <!-- <el-date-picker v-model="gdzc.buy_date" align="right" type="Date" placeholder="选择日期"  :picker-options="{pickerOptions}"></el-date-picker> </el-date-picker> -->
        <el-date-picker
        :style="{width:'400px'}"
        v-model="gdzc.buy_date"
            type="datetime"
            format="yyyy-MM-dd hh:mm"
            value-format="yyyy-MM-dd hh:mm"
            placeholder="请选择日期时间">
    </el-date-picker>
    </p>
      <p>
        <el-row>
            <el-button type="primary" @click="tianjia()" plain>添加</el-button>
            <el-button type="info" @click="liebiao()" plain>返回列表</el-button>
        </el-row>
      </p>
   
  </el-input>
  </div>
</body>
  <!-- import Vue before Element -->
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
  <!-- import JavaScript -->
  <script src="https://unpkg.com/element-ui/lib/index.js"></script>
  <script>
    new Vue({
      el: '#app',
      data() {
        return {
            gdzc:{},
          
          pickerOptions: {
            disabledDate(time) {
                return time.getTime() > Date.now();
            },
            shortcuts: [{
                text: '今天',
                onClick(picker) {
                picker.$emit('pick', new Date());
                }
            }, {
                text: '昨天',
                onClick(picker) {
                const date = new Date();
                date.setTime(date.getTime() - 3600 * 1000 * 24);
                picker.$emit('pick', date);
                }
            }, {
                text: '一周前',
                onClick(picker) {
                const date = new Date();
                date.setTime(date.getTime() - 3600 * 1000 * 24 * 7);
                picker.$emit('pick', date);
                }
            }]
            },
        };
      },

      methods:{
        
             //添加
            tianjia:function(){
                let url = "http://localhost:8080/rikao13_goods/addGDZCPost.do";
                let data1 = this.gdzc;
                let option = {Headers:{'Content-type':'application/json'}}
                axios.post(url,data1,option).then((rel)=>{
                    if(rel.data.code==0){
                        this.tishi=rel.data.msg;
                        location.href="listGDZC.html";
                    };

                });
            },

            //返回列表
            liebiao:function(){
                location.href="listGDZC.html"
            }
        }
    })
  </script>
</html>

(二)搜索、列表、修改、分页.html

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <!-- import CSS -->
  <link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
  <script src="axios.min.js"></script>
    <script src="vuejs-2.5.16.js"></script>
</head>
<body>
  <div id="app">

    <el-row style="height:400px;">
        <template>
            
            <el-button type="primary" @click="tianjia()" plain>返回添加</el-button>
            <el-input placeholder="商品名称"   v-model="goods_name"  clearable :style="{width:'200px'}"></el-input>
            <el-button type="primary" icon="el-icon-search" @click="listGDZC1()">搜索</el-button>

            <!-- 列表 -->
            <el-table :data="listGDZC1Show":class="{ 'alt': listGDZC.index%2==1}" style="width: 99%">
                <el-table-column  type="index" label="序号"  width="180"></el-table-column>
                <el-table-column  prop="goods_name" label="商品名称"  width="180"></el-table-column>
                <el-table-column  prop="price" label="商品金额"></el-table-column>
                <el-table-column  prop="weight" label="重量"></el-table-column>
                <el-table-column  prop="buy_date" label="购买时间"></el-table-column>
                <el-table-column  label="操作">
                    <template slot-scope="scope">
                        <!-- 修改按钮 -->
                        <el-button type="text" @click="dialogFormVisible = true">
                            <el-button type="primary"  icon="el-icon-edit" circle  @click="selectNoid(scope.row)"></el-button>
                        </el-button>
                            <el-dialog title="编辑商品" :visible.sync="dialogFormVisible">
                                <el-form :model="form">
                                    <p>
                                        编辑商品名称
                                        <input type="hidden" v-model="gdzc.noid">
                                        <el-input placeholder="请输入商品名称"  v-model="gdzc.goods_name"    clearable :style="{width:'400px'}"></el-input>
                                      </p>
                                      <p>
                                        编辑商品金额
                                        <el-input placeholder="请输入商品金额" v-model="gdzc.price" clearable :style="{width:'400px'}"></el-input>
                                      </p>
                                      <p>
                                        编辑商品重量
                                        <el-input placeholder="请输入重量" v-model="gdzc.weight"  clearable :style="{width:'400px'}"></el-input>
                                      </p>
                                      <p>
                                        编辑商品时间
                                        <el-date-picker
                                        v-model="gdzc.buy_date"
                                            :style="{width:'400px'}"
                                            type="datetime"
                                            format="yyyy-MM-dd hh:mm"
                                            value-format="yyyy-MM-dd hh:mm"
                                            placeholder="请选择日期时间">
                                    </el-date-picker>
                                    </p>
                        
                                </el-form-item></el-form-item>
                                </el-form>
                                <div slot="footer" class="dialog-footer">
                                    <el-button @click="dialogFormVisible = false">取 消</el-button>
                                    <el-button type="primary" @click="dialogFormVisible = false"><a  @click="xiugai()">确 定</a></el-button>
                                </div>
                            </el-dialog>


                        <!-- 删除按钮 -->
                        <el-button @click="deleteGDZD(scope.row)" type="danger" icon="el-icon-delete" circle></el-button>
                    </template>
                </el-table-column>
                
            </el-table>
            
        </template>
        
    </el-row>

    <!-- 分页 -->
    <el-row>
        <el-button-group>
                <a href="#"  @click="prePageFirst">
                    <el-button type="warning">首页</el-button>
                </a>

                <a href="#"  @click="prePage">
                    <el-button type="primary" icon="el-icon-arrow-left">上一页</el-button>
                </a>
                
                <span v-for="(item, index) in pageNum">
                    <a href="#" @click="toPage(index)" :class="{active: currentPage==index}">  
                        <el-button type="primary" >&nbsp; {{ index+1 }}</el-button>
                    </a>
                </span>

                <a href="#" @click="nextPage">
                    <el-button type="primary">下一页<i class="el-icon-arrow-right el-icon--right"></i></el-button>
                </a>

                <a href="#"  @click="prePageLast">
                    <el-button type="warning">末页</el-button>
                </a>
        </el-button-group>
    </el-row>
    <p style="margin-right: 30px;"><span>{{yeshu}}</span>/{{pageNum}}页
        总条数:<span>{{zongtioashu}}</span>条记录
    </p>
        
  </div>
</body>
  <!-- import Vue before Element -->
  <script src="https://unpkg.com/vue/dist/vue.js"></script>
  <!-- import JavaScript -->
  <script src="https://unpkg.com/element-ui/lib/index.js"></script>
  <script>
       QueryString = {
        data: {},
        initial: function () {
            var aPairs, aTmp;
            var queryString = new String(window.location.search);
            queryString = queryString.substr(1, queryString.length); //remove   "?"
            aPairs = queryString.split("&");
            for (var i = 0; i < aPairs.length; i++) {
                aTmp = aPairs[i].split("=");
                this.data[aTmp[0]] = aTmp[1];
            }
        },
        getValue: function (key) {
            return this.data[key];
        }
    }
    QueryString.initial();
    let aVal= QueryString.getValue('noid');

    new Vue({
      el: '#app',
      data() {
        return{
            goods_name:null,
            gdzc:{},
            listGDZC:[],
            pageSize:3,
            currentPage:0,
            dialogTableVisible: false,
            dialogFormVisible: false,
            form: {
                name: '',
                region: '',
                date1: '',
                date2: '',
                delivery: false,
                type: [],
                resource: '',
                desc: ''
            },
            formLabelWidth: '120px'
        }
      },
    
        computed:{
                listGDZC1Show: function(){
                    let start = this.currentPage*this.pageSize;
                    let end = Math.min((this.currentPage+1)*this.pageSize, this.listGDZC.length)
                    return this.listGDZC.slice(start, end)
                },
                pageNum: function(){
                    return Math.ceil(this.listGDZC.length / this.pageSize) || 1 ;
                },
                zongtioashu:function(){
                    return this.listGDZC.length
                },
                yeshu:function(){
                    return this.currentPage+1
                },
            
            },

        mounted(){
            this.listGDZC1();
        },

        
        methods:{

            //列表
            listGDZC1:function (){
                let url = "http://localhost:8080/rikao13_goods/listGDZCPost.do";
                // let data1 = {};
                let data1={"goods_name":this.goods_name};
                let option = {headers: {'Content-Type':'application/json'}};
                axios.post(url,data1,option).then((rel)=>{
                    this.listGDZC = rel.data.data;
                    console.log(this.listGDZC)   
                     
                });
            },


            //分页
            nextPage: function(){//下一页
                var vm = this;
                if (vm.currentPage == vm.pageNum - 1) return;
                vm.currentPage++;
 
            },
            prePage: function(){//上一页
                var vm = this;
                if (vm.currentPage == 0)
                return;
                vm.currentPage--;
 
            },
            prePageFirst:function(){//首页
                var vm = this;
                vm.currentPage=0;
            },
            prePageLast:function(){//末页
                var vm = this;
                vm.currentPage=vm.pageNum-1;
            },
            toPage: function(page){
                var vm = this;
                vm.currentPage = page
            },

            tianjia:function(){
                location.href="addGdzc.html"
            },


            
            //删除
            deleteGDZD(noid){
                if(confirm("确定要删除")){
                    let url = "http://localhost:8080/rikao13_goods/deleteGDZCPost.do";
                    let data1 = noid;
                    let option = {Headers:{'Content-type':'application/json'}};
                    axios.post(url,data1,option).then((rel)=>{
                        for(let i = 0;i<this.listGDZC.length;i++){
                            if(this.listGDZC[i].noid==noid){
                                this.listGDZC.splice(i,1);
                            };
                        };
                        this.listGDZC1();
                    }); 
                }
            },



           //修改
           selectNoid(noid){
                let url = "http://localhost:8080/rikao13_goods/selectGDZCNoidPost.do";
                let data1 = {"noid":noid.noid};
                let option = {Headers:{'Content-type':'application/json'}};
                axios.post(url,data1,option).then((rel)=>{
                    this.gdzc=rel.data.data;
                })
            },

            xiugai:function(){
                let url = "http://localhost:8080/rikao13_goods/alterGDZCPost.do";
                let data1 = this.gdzc;
                console.log(this.gdzc)
                 let option = {Headers:{'Content-type':'application/json'}}
                 axios.post(url,data1,option).then((rel)=>{
                    this.listGDZC1();
                })

            }




        }
    })
  </script>
</html>

二、后端代码

(一)实体类

package com.wanshi.spring.entity;

import lombok.Data;

@Data
public class GDZC {
    private String noid;
    private String goods_name;
    private String price;
    private String weight;
    private String buy_date;
}

package com.wanshi.spring.entity;

import lombok.Data;

@Data
public class JsonResut {
    private Integer code;
    private  String msg;
    private  Object data;
}

(二)Mapper接口层

package com.wanshi.spring.mapper;

import com.wanshi.spring.entity.GDZC;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface GDZCMapper {
    Integer addGDZC(GDZC gdzc);

    List<GDZC> listGDZC();

    Integer deleteGDZC(String noid);

    GDZC seletByNoid(String noid);
    Integer alterGDZC(GDZC gdzc);

    List<GDZC> selectGDZC (@Param("goods_name") String goods_name);
}

(三)Service接口层

package com.wanshi.spring.service;

import com.wanshi.spring.entity.GDZC;
import com.wanshi.spring.entity.JsonResut;

public interface GDZCService {
    JsonResut addGDZC(GDZC gdzc);

    JsonResut listGDZC();

    JsonResut delteGDZC(String noid);

    JsonResut seletByNoid(String noid);
    JsonResut alterGDZC(GDZC gdzc);

    JsonResut selectGDZC(String goods_name);
}

(四)ServiceImpl接口实现层

package com.wanshi.spring.service.impl;

import com.wanshi.spring.entity.GDZC;
import com.wanshi.spring.entity.JsonResut;
import com.wanshi.spring.mapper.GDZCMapper;
import com.wanshi.spring.service.GDZCService;
import lombok.Data;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class GDZCServiceImpl implements GDZCService {
    @Autowired
    private GDZCMapper gdzcMapper;


    @Override
    public JsonResut addGDZC(GDZC gdzc) {
        JsonResut json = new JsonResut();
        gdzcMapper.addGDZC(gdzc);
        json.setMsg("添加成功");
        json.setCode(0);
        return json;
    }

    @Override
    public JsonResut listGDZC() {
        JsonResut json = new JsonResut();
        List<GDZC> listGDZC = gdzcMapper.listGDZC();
        json.setData(listGDZC);
        return json;
    }

    @Override
    public JsonResut delteGDZC(String noid) {
        JsonResut json = new JsonResut();
        gdzcMapper.deleteGDZC(noid);
        json.setCode(2);
        return json;
    }

    @Override
    public JsonResut seletByNoid(String noid) {
        JsonResut json = new JsonResut();
        GDZC selectGDZCNoid = gdzcMapper.seletByNoid(noid);
        json.setData(selectGDZCNoid);
        return json;
    }

    @Override
    public JsonResut alterGDZC(GDZC gdzc) {
        JsonResut json = new JsonResut();
        gdzcMapper.alterGDZC(gdzc);
        json.setCode(3);
        json.setMsg("修改成功");
        return json;
    }

    @Override
    public JsonResut selectGDZC(String goods_name) {
        JsonResut json = new JsonResut();
        List<GDZC> selectGDZC = gdzcMapper.selectGDZC(goods_name);
        json.setData(selectGDZC);
        return json;
    }
}

(五)Controller层

package com.wanshi.controller;
import com.wanshi.spring.entity.GDZC;
import com.wanshi.spring.entity.JsonResut;
import com.wanshi.spring.service.GDZCService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@CrossOrigin
public class AjaxController {
    @Autowired
    private GDZCService gdzcService;

    @RequestMapping("/addGDZCPost.do")
    @ResponseBody
    public JsonResut addGDZCPost(@RequestBody  GDZC gdzc){
        System.out.println("col"+gdzc.toString());
        return gdzcService.addGDZC(gdzc);
    }

    @RequestMapping("/listGDZCPost.do")
    @ResponseBody
    public JsonResut listGDZCPost(@RequestBody GDZC gdzc){
        return gdzcService.selectGDZC(gdzc.getGoods_name());
    }

    @RequestMapping("/deleteGDZCPost.do")
    @ResponseBody
    public JsonResut deleteGDZCPost(@RequestBody GDZC gdzc){
        return gdzcService.delteGDZC(gdzc.getNoid());
    }

    @RequestMapping("/selectGDZCNoidPost.do")
    @ResponseBody
    public JsonResut selectGDZCNoidPost(@RequestBody GDZC gdzc){
        return gdzcService.seletByNoid(gdzc.getNoid());
    }

    @RequestMapping("/alterGDZCPost.do")
    @ResponseBody
    public JsonResut alterGDZCPost(@RequestBody GDZC gdzc){
        return gdzcService.alterGDZC(gdzc);
    }


}


三、sql语句(Mapper.xml文件)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wanshi.spring.mapper.GDZCMapper">
    <insert id="addGDZC" parameterType="com.wanshi.spring.entity.GDZC">
        insert into rikao_t_goods (goods_name,price,weight,buy_date)
         values (#{goods_name},#{price},#{weight},#{buy_date})
    </insert>

    <select id="listGDZC"  resultType="com.wanshi.spring.entity.GDZC">
        select * from rikao_t_goods
    </select>

    <delete id="deleteGDZC" parameterType="String">
        delete  from rikao_t_goods
        <where>
            noid = #{noid}
        </where>
    </delete>

    <select id="seletByNoid"  parameterType="String" resultType="com.wanshi.spring.entity.GDZC">
        select * from rikao_t_goods
        <where>
            noid = #{noid}
        </where>
    </select>

    <update id="alterGDZC" parameterType="com.wanshi.spring.entity.GDZC">
        update rikao_t_goods
        <set>
            goods_name =  #{goods_name},
            price =  #{price},
            weight = #{weight},
            buy_date = #{buy_date}
        </set>
        <where>
            noid = #{noid}
        </where>
    </update>


    <select id="selectGDZC"  parameterType="String" resultType="com.wanshi.spring.entity.GDZC">
        select * from rikao_t_goods
        <where>
            <if test="goods_name != null and goods_name != ''">
                goods_name like concat('%',#{goods_name},'%')
            </if>
        </where>
    </select>
</mapper>
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
Novel是基于SpringBoot的前后端分离权限管理系统,易读易懂、界面简洁美观。 采用SpringBoot+Vue后端分离模式开发,后端主要采用SpringBoot+mysql+mybatis+druid+shiro+redis,前端主要采用vue+TypeScript+Sass+element-ui+vuex+axios。 它可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA等等,当然,您也可以对她进行深度定制,以做出更强系统。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动客户端访问。系统会陆续更新一些实用功能。 Novel内置功能: 1、用户管理:用户是系统操作者,该功能主要完成系统用户配置。 2、部门管理:配置系统组织机构(公司、部门、小组),树结构展现。 3、岗位管理:配置系统用户所属担任职务。 4、菜单管理:配置系统菜单,操作权限,按钮权限标识等。 5、角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 6、操作日志:系统正常操作日志记录和询;系统异常信息日志记录和询。 7、登录日志:系统登录日志记录询包含登录异常。 8、服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 9、在线用户:当前系统中活跃用户状态监控。 10、连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 11、定时任务:在线(添加、修除)任务调度包含执行结果日志。 12、代码生成:前后端代码的生成支持CRUD下载。 13、参数管理:对系统动态配置常用参数。
SpringBoot是一款以简化开发的方式来构建Java应用程序的框架,它提供了许多开箱即用的特性和便捷的配置方式。Thymeleaf是一个用于处理服务器端渲染的模板引擎,可以将动态数据注入到HTML模板中。SSM是指Spring+SpringMVC+MyBatis的组合,是一套经典的Java Web开发框架。Vue.js是一款用于构建用户界面的渐进式框架,可以实现前端的组件化开发和数据驱动视图更新。 要实现简单的功能,可以按照以下步骤进行: 1. 首先,使用SpringBoot创建一个新的项目,并引入Thymeleaf、SSM和Vue.js相关的依赖。 2. 创建一个数据库表,用于存储需要进行操作的数据。可以使用MySQL等关系型数据库。 3. 在SpringBoot的配置文件中配置数据库连接信息,并创建对应的数据源和事务管理器。 4. 创建实体类,在实体类中定义需要操作的属性和对应的数据字段。 5. 创建MyBatis的Mapper接口和对应的XML文件,用于定义数据库操作的SQL语句。 6. 在SpringBoot的配置类中配置MyBatis相关的扫描和注入。 7. 创建控制器类,处理前端请求。 8. 在控制器类中定义的方法,并调用对应的Mapper接口执行数据库操作。 9. 创建前端页面,使用Vue.js实现数据的展示和交互。 10. 在前端页面中绑定相应的事件和请求,通过HTTP请求调用后端控制器的方法。 11. 在页面中显示询的数据,并提供相应的操作按钮,通过绑定事件来实现功能。 12. 启动项目,通过浏览器访问前端页面,即可进行的操作。 以上是一个基本的步骤,具体的实现会涉及到很多细节,需要根据具体的需求和技术选型来进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperProgMan.SYJ

你的鼓励将是我创作更大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值