Springboot+Vue单页完整版增删改查练习(学校+老师的简单系统)(一步一步详教)

7 篇文章 0 订阅

需求介绍:

  1. 前端要求:Vue单页
  2. 后端要求:SpringBoot+ SSM + RESTFul
  3. 前端项目名字:exam1919
  4. 后端项目名字:exam_project1919

(我这里是做了前后端分离的方式书写,所以搭建了两个项目)

一、需求介绍

需求1:显示首页
在这里插入图片描述
需求2:学校列表+分页显示
在这里插入图片描述

需求3:添加学校
在这里插入图片描述
需求4:修改学校
在这里插入图片描述

需求5:单个删除学校
在这里插入图片描述
需求6:老师列表、多条件查询
在这里插入图片描述
需求7:添加老师
在这里插入图片描述需求8:修改老师
在这里插入图片描述
需求9:批量删除老师
在这里插入图片描述

二、搭建后端环境

1.1 创建项目

exam_project1919的创建

在这里插入图片描述
这里不做选择
在这里插入图片描述
Finish完成就可以了
在这里插入图片描述

1.2 导入Pom文件

我这里导入的是本项目需要的一些jar包,没有仓库的崽崽第一次下载可能会满一点

  <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <!-- jar包版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
        <mybatis.starter.version>1.3.2</mybatis.starter.version>
        <mapper.starter.version>2.0.2</mapper.starter.version>
        <mysql.version>5.1.32</mysql.version>
        <pageHelper.starter.version>1.2.5</pageHelper.starter.version>
        <durid.starter.version>1.1.10</durid.starter.version>
    </properties>

    <!-- 导入需要依赖(坐标/jar包)   -->
    <dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <!-- mybatis启动器 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis.starter.version}</version>
        </dependency>
        <!-- 通用Mapper启动器 -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>${mapper.starter.version}</version>
        </dependency>
        <!-- 分页助手启动器 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>${pageHelper.starter.version}</version>
        </dependency>
        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>
        <!-- Druid连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>${durid.starter.version}</version>
        </dependency>
        <!--swagger2-->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.7.0</version>
        </dependency>
        <dependency>
            <groupId>com.chuusai</groupId>
            <artifactId>shapeless_2.11</artifactId>
            <version>2.3.2</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>RELEASE</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

三、前端项目创建

创建方式和后端相同,创建成功后使用VSCode打开
创建Vue单页项目
ctrl+shift+y打开终端

vue create vue项目名称

创建项目时,会提示我们选择项目中需要使用的组件,我们可以使用默认的配置,也可以自己手动选择需要加载的组件。

【第一步】手动选择组件
在这里插入图片描述
【第二步】勾选需要安装的组件:
在这里插入图片描述
​ babel:将ES6的语法转成浏览器可以执行的低版本js语法

​ Router:(必须)路由

​ Vuex: 可选

【第三步】选择Vue版本
在这里插入图片描述
【第四步】使用路由的 history 模式:
在这里插入图片描述
【第五步】把配置写到 package.json 文件中:
在这里插入图片描述
不保存本次的配置:
在这里插入图片描述
项目创建成功。
安装成功之后,我们可以进行使用以下指令启动项目:

cd 项目名 // 进入项目目录
npm run serve // 启动项目

数据库准备

CREATE TABLE `t_school`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `school_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
);

INSERT INTO `t_school` VALUES (1, '沭阳校区');
INSERT INTO `t_school` VALUES (2, '南京校区');
INSERT INTO `t_school` VALUES (3, '上海校区');
INSERT INTO `t_school` VALUES (4, '北京校区');

CREATE TABLE `t_teacher`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `teacher_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `pwd` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `sex` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  `salary` decimal(10, 2) NULL DEFAULT NULL,
  `type_id` int(11) NULL DEFAULT NULL,
  `school_id` int(11) NULL DEFAULT NULL,
  `hire_date` date NULL DEFAULT NULL,
  `remark` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ;
INSERT INTO `t_teacher` VALUES (1, 'tom', '123', '男', 5000.00, 1, 1, '2020-02-03', 'tom是优秀老师');
INSERT INTO `t_teacher` VALUES (2, 'lucy', '123', '女', 10000.00, 2, 2, '2020-06-09', 'lucy很优秀');


CREATE TABLE `t_type`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `city` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
);

INSERT INTO `t_type` VALUES (1, '辅导员');
INSERT INTO `t_type` VALUES (2, '助理讲师');
INSERT INTO `t_type` VALUES (3, '主讲老师');
INSERT INTO `t_type` VALUES (4, '财务老师');
INSERT INTO `t_type` VALUES (5, '后勤老师');

需求一、显示首页

先添加路径(可以不填,但是每次写url的时候都要写
全了,我懒)
下面那个$http可以随便写 $axios啥的都行,想写啥写啥
在这里插入图片描述

在main.js中添加路由

<router-link to="/school">学校管理</router-link> |
<router-link to="/teacher">老师管理</router-link> |

在这里插入图片描述
去router/index.js中配置路由

{
path: ‘/teacher’,
name: ‘Teacher’,
component: () => import(’…/views/Teacher.vue’)
},
{
path: ‘/school’,
name: ‘School’,
component: () => import(’…/views/School.vue’)
},

在这里插入图片描述
然后根据路径里面写的创建vue页面就好
在这里插入图片描述
这样就两个页面可以来回切换了

需求2:学校列表

前端显示

表格搭建

 <div id="app">
     <table border="1" width="100%">
       <tr>
         <td>ID</td>
         <td>学校名称</td>
         <td>操作</td>
       </tr>
       <tr v-for="(school,index) in schools" :key="index">
         <td>{{school.id}}</td>
         <td>{{school.schoolName}}</td>
         <td>
            <button>修改</button>
           <button >删除</button>
         </td>
       </tr>
     </table>
  </div>

script编写

<script>
export default {
  data() {
    return {
      schools:[]
    }
  },
  methods: {
    init(){
      this.$http.get("/school")
      .then(res => {
       this.schools=res.data
      })
      .catch(err => {
        console.error(err); 
      })
    },
  },
  created() {
    this.init()
  },

}
</script>

后端编写

先搭建整个后端的框架
在这里插入图片描述
application类编写

@SpringBootApplication
public class ExamProject1919Application {
public static void main(String[] args) {
SpringApplication.run(ExamProject1919Application.class, args);
}
}

config类编写

@Configuration
public class GlobalCorsConfig {
@Bean
public CorsFilter corsFilter() {
//1.添加CORS配置信息
CorsConfiguration config = new CorsConfiguration();
//1) 允许的域,不要写*,否则cookie就无法使用了
config.addAllowedOrigin("");
//2) 是否发送Cookie信息
config.setAllowCredentials(false);
//3) 允许的请求方式
config.addAllowedMethod(“OPTIONS”);
config.addAllowedMethod(“HEAD”);
config.addAllowedMethod(“GET”);
config.addAllowedMethod(“PUT”);
config.addAllowedMethod(“POST”);
config.addAllowedMethod(“DELETE”);
config.addAllowedMethod(“PATCH”);
// 4)允许的头信息
config.addAllowedHeader("
");
//2.添加映射路径,我们拦截一切请求
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
//3.返回新的CorsFilter.
return new CorsFilter(configSource);
}
}

domain:
School类编写

@Table(name = “t_school”)
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class School implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = “id”)
private Integer id;
@Column(name = “school_name”)
private String schoolName;
}

mapper:
SchoolMapper编写:

@org.apache.ibatis.annotations.Mapper
public interface SchoolMapper extends Mapper {
}

controller:
SchoolController:

@RestController
@RequestMapping("/school")
public class SchoolController {
@Resource
SchoolService schoolService;
@GetMapping
public ResponseEntity selectAll(){
List schools= schoolService.selectAll();
if (schools!=null){
return new ResponseEntity<>(schools, HttpStatus.OK);
}else {
return new ResponseEntity<>(“失败”, HttpStatus.OK);
}
}
}

service:
SchoolService:

@Service
public class SchoolService {
@Resource
SchoolMapper schoolMapper;
public List selectAll() {
return schoolMapper.selectAll();
}
}

需求3:添加学校

前端编写

在School.vue页面中添加

 <button @click="addSchool()">添加学校</button>
addSchool(){
     this.$router.push("school_add")
   },

在index.js中添加路由

{
path: ‘/school_add’,
name: ‘school_add’,
component: () => import(’…/views/school_add.vue’)
},

创建school_add.vue页面
表格搭建

 <div id="app">
      <table border="1">
          <tr>
              id:<input type="text" v-model="school.id">
          </tr>
          <tr>
              学校名称:<input type="text" v-model="school.schoolName">
          </tr>
          <button @click="addSchool()">添加学校</button>
      </table>
  </div>

script编写(添加成功后,跳转到学校列表页面)

<script>
export default {
    data() {
        return {
            school:{
                id:"",
                schoolName:""
            }
        }
    },
    methods: {
        addSchool(){
            this.$http.put("/school",this.school)
            .then(res => {
               
                    this.$router.push("School")
                
            })
            .catch(err => {
                console.error(err); 
            })
        }
    },

}
</script>

后端编写

controller:
SchoolController

@PutMapping
public ResponseEntity addSchool(@RequestBody School school) {
boolean b=schoolService.addSchool(school);
if (b){
return new ResponseEntity<>(HttpStatus.OK);
}else {
return new ResponseEntity<>(“添加失败”,HttpStatus.OK);
}
}

service:
SchoolService

public boolean addSchool(School school) {
return schoolMapper.insert(school)==1;
}

需求4:修改学校

前端编写

路由动态传参

  <button @click="updataSchool(school.id)">修改</button>

script:

 updataSchool(id) {
     this.$router.push(`/school_updata/${id}`);
   },

编写路由,跳转页面

  {
    path: '/school_updata/:id',
    name: 'school_updata',
    component: () => import('../views/school_updata.vue')
  },

school_updata.vue页面
编写表格:


  <div id="app">
      <table border="1">
          <tr>
              id:<input type="text" v-model="school.id">
          </tr>
          <tr>
              学校名称:<input type="text" v-model="school.schoolName">
          </tr>
          <button @click="updataSchool()">修改学校</button>
      </table>
  </div>
  

script:

<script>
export default {
 data() {
        return {
            id:"",
            school:{
                id:"",
                schoolName:""
            }
        }
    },
    methods: {
        init(){
         this.$http.get(`/school/${this.id}`).then((res) => {
       
          this.school = res.data;
        
      });
        },
        updataSchool(){
             this.$http.post("/school",this.school)
            .then(res => {
               this.$router.push("/school")  
            })
        }

    },
    created() {
        this.id = this.$route.params.id;
        this.init()
    },
}

我们这里是先根据刚刚School传来的id去后台检索获得对应的School对象,并回显到页面中,
之后修改后将School封装传回后台进行修改

后端代码

  1. 根据id获取对象传回前端
    controller
    SchoolController:

@GetMapping("/{id}")
public ResponseEntity selectByIdAll(@PathVariable(“id”) Integer id){
School schools= schoolService.selectByIdAll(id);
if (schools!=null){
return new ResponseEntity<>(schools, HttpStatus.OK);
}else {
return new ResponseEntity<>(“失败”, HttpStatus.OK);
}
}

service
SchoolService:

    public School selectByIdAll(Integer id) {
        return  schoolMapper.selectByPrimaryKey(id);
    }
  1. 修改School
    controller
    SchoolController:
@PostMapping
    public ResponseEntity updateSchool(@RequestBody School school){
        boolean b=schoolService.updateSchool(school);
        System.out.println(school);
        System.out.println(b);
        if (b){
            return new ResponseEntity<>(HttpStatus.OK);
        }else {
            return new ResponseEntity<>("添加失败",HttpStatus.OK);
        }
    }

service
SchoolService:

    public boolean updateSchool(School school) {
        return schoolMapper.updateByPrimaryKey(school)==1;
    }

需求5:单个删除学校

前端编写

<button @click="deletSchool(school.id)">删除</button>

script:

 deletSchool(id){
      this.$http.delete(`/school/${id}`)
      .then(res => {
        this.init()
      })
      .catch(err => {
        console.error(err); 
      })
    },

后端编写

controller
SchoolController:

@DeleteMapping("/{id}")
public ResponseEntity deleteSchool(@PathVariable(“id”) Integer id){
boolean b=schoolService.deleteSchool(id);
if (b){
return new ResponseEntity<>(HttpStatus.OK);
}else {
return new ResponseEntity<>(“删除失败”,HttpStatus.OK);
}
}

service:
SchoolService:

public boolean deleteSchool(Integer id) {
return schoolMapper.deleteByPrimaryKey(id)==1;
}

需求6:老师列表、多条件查询

前端编写

表格编写:

<div id="app">
      <button @click="add()">添加</button>
      <table width="100%">
          <tr>
              姓名:<input type="text" v-model="teacherVo.name"><br>
              </tr>
                  <tr>
              学校:<select v-model="teacherVo.sid">
                  <option v-for="(school,index) in schools" :key="index"  :value="school.id">{{school.schoolName}}</option>
              </select><br>
              </tr>
                  <tr>
              薪资:<input type="text" v-model="teacherVo.minsalary">--
              <input type="text" v-model="teacherVo.maxsalary" ><br>
              </tr>
                  <tr>
               入职时间<input type="text" v-model="teacherVo.startHire">--
              <input type="text" v-model="teacherVo.endHire">
          </tr>
          <button @click="ConditionSelect(1)">查询</button>
      </table>
      <table border="1" width="100%">
          <tr>
              <td></td>
              <td>id</td>
              <td>姓名</td>
              <td>密码</td>
              <td>性别</td>
              <td>薪资</td>
              <td>入职时间</td>
              <td>备注</td>
              <td>操作</td>
          </tr>
          <tr v-for="(teacher,index) in teachers.list" :key="index">
               <td>{{teacher.id}}</td>
               <td>{{teacher.teacherName}}</td>
               <td>{{teacher.pwd}}</td>
               <td>{{teacher.sex}}</td>
               <td>{{teacher.salary}}</td>
               <td>{{teacher.hireDate}}</td>
               <td>{{teacher.remark}}</td>
               <td>
                   <button>修改</button>
               </td>
          </tr>
      </table>
      当前是第{{teachers.pageSize}}页,共{{teachers.pageNum}}页
      <a href="" v-for="(num,index) in teachers.pages" :key="index" @click.prevent="ConditionSelect(num)">{{num}}</a>
</div>

script:
这里的多条件中学校需要名称并且是下拉列表展示,所以我们需要先查询所以学校

<script>
export default {
    data() {
        return {
            teacherVo:{},
            schools:{},
            teachers:{
                pageSize:2,
                pageNum:1
            },
            checked:[],
            total:0,
        }
    },
    methods: {
        ConditionSelect(pagenum){
            if(pagenum){
                this.teachers.pageNum=pagenum
            }
           this.$http.post(`/teacher/condition/${this.teachers.pageSize}/${this.teachers.pageNum}`,this.teacherVo)
            .then(res => {
                this.teachers=res.data
                this.$router.push("/teacher")  
            })
            .catch(err => {
                console.error(err); 
            })
        },
        selectSchool(){
            this.$http.get("/school")
      .then(res => {
       this.schools=res.data
      })
      .catch(err => {
        console.error(err); 
      })
        },
       },
    created() {
        this.selectSchool()
        this.ConditionSelect()
    },
}
</script>

后端编写

  1. 查询学校
    同需求二相同,直接调用就可以

  2. 查询老师,并分页展示
    domain:
    Teacher:

@Table(name = “t_teacher”)
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Teacher implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = “id”)
private Integer id;
@Column(name = “teacher_name”)
private String teacherName;
@Column(name = “pwd”)
private String pwd;
@Column(name = “sex”)
private String sex;
@Column(name = “salary”)
private BigDecimal salary;
@Column(name = “type_id”)
private Integer typeId;
@Column(name = “school_id”)
private Integer schoolId;
@Column(name = “hire_date”)
private Date hireDate;
@Column(name = “remark”)
private String remark;
}

mapper:
TeacherMapper:

@org.apache.ibatis.annotations.Mapper
public interface TeacherMapper extends Mapper {
}

因为前端传来的是多条件的字段,我们这里需要单独写一个对应的类封装前端的多条件数据
vo:
TeacherVo

public class TeacherVo {
private String name;
private Integer sid;
private String minsalary;
private String maxsalary;
private String startHire;
private String endHire;
}
自行补充get/set/tostring方法

controller:
TeacherController:

@PostMapping("/condition/{pageSize}/{pageNum}")
public ResponseEntity conditionTeacher(
@PathVariable(“pageSize”) Integer pageSize,
@PathVariable(“pageNum”) Integer pageNum,
@RequestBody TeacherVo teacherVo){
PageInfo teachers= teacherService.selectConditionAll(teacherVo,pageSize,pageNum);
if (teachers!=null){
return new ResponseEntity<>(teachers, HttpStatus.OK);
}else {
return new ResponseEntity<>(“失败”, HttpStatus.OK);
}
}

service:
TeacherService:

public PageInfo selectConditionAll(TeacherVo teacherVo,Integer pageSize,Integer pageNum) {
Example example = new Example(Teacher.class);
Example.Criteria criteria = example.createCriteria();
if (teacherVo.getName()!=null&&!teacherVo.getName().equals("")){
criteria.andLike(“teacherName”,"%"+teacherVo.getName()+"%");
}
if (teacherVo.getSid()!=null){
criteria.andEqualTo(“schoolId”,teacherVo.getSid());
}
if (teacherVo.getMinsalary()!=null){
System.out.println(“进来了”);
criteria.andGreaterThanOrEqualTo(“salary”,teacherVo.getMinsalary());
}
if (teacherVo.getMaxsalary()!=null){
criteria.andLessThanOrEqualTo(“salary”,teacherVo.getMaxsalary());
}
if (teacherVo.getStartHire()!=null&&!teacherVo.getStartHire().equals("")){
criteria.andGreaterThanOrEqualTo(“hireDate”,teacherVo.getStartHire());
}
if (teacherVo.getEndHire()!=null&&!teacherVo.getEndHire().equals("")){
criteria.andLessThanOrEqualTo(“hireDate”,teacherVo.getEndHire());
}
PageHelper.startPage(pageNum,pageSize);
List teachers = teacherMapper.selectByExample(example);
PageInfo teacherPageInfo = new PageInfo<>(teachers);
int i = teacherMapper.selectByExample(example).size();
return teacherPageInfo;
}

需求7:添加老师

前端编写

      <button @click="add()">添加</button>
add(){
        this.$router.push("/teacher_add")
    },

路由跳转

  {
    path: '/teacher_add',
    name: 'teacher_add',
    component: () => import('../views/teacher_add.vue')
  },

teacher_add.vue

<div id="app">
      <table border="1">
          <tr>
              id:<input type="text" v-model="school.id">
          </tr>
          <tr>
              学校名称:<input type="text" v-model="school.schoolName">
          </tr>
          <button @click="addSchool()">添加学校</button>
      </table>
  </div>
<script>
export default {
    data() {
        return {
            school:{
                id:"",
                schoolName:""
            }
        }
    },
    methods: {
        addSchool(){
            this.$http.put("/school",this.school)
            .then(res => {
               
                    this.$router.push("School")
                
            })
            .catch(err => {
                console.error(err); 
            })
        }
    },

}
</script>

后端编写

controller:
TeacherController:

@PutMapping
public ResponseEntity addTeacher(@RequestBody Teacher teacher){
boolean b= teacherService.addTeacher(teacher);
if (b){
return new ResponseEntity<>(HttpStatus.OK);
}else {
return new ResponseEntity<>(“添加成功”,HttpStatus.OK);
}
}

service:
TeacherService:

public boolean addTeacher(Teacher teacher) {
return teacherMapper.insert(teacher)==1;
}

需求8:修改老师

前端编写

动态传参

 <button @click="update(teacher.id)">修改</button>
 update(id){
        this.$router.push(`/teacher_updata/${id}`);
   },

路由跳转

  {
   path: '/teacher_updata/:id',
   name: 'teacher_updata',
   component: () => import('../views/teacher_updata.vue')
 },

teacher_updata.vue
这里在选择是需要学校和类型,所以我们要先获取School和Type的全部数据,完成下拉列表显示
根据我们所动态传的id去后台找到对应的Teacher对象回显到前端页面

<div id="app">
       <table border="1">
           <input type="hidden" v-model="teacher.id">
          <tr>
              老师名字:<input type="text" v-model="teacher.teacherName">
          </tr>
          <tr>
              老师密码:<input type="text" v-model="teacher.pwd">
          </tr>
          <tr>
              性别:<input type="radio" name="sex" v-model="teacher.sex" value=""><input type="radio" name="sex"  v-model="teacher.sex"  value=""></tr>
          <tr>
              类型:<select v-model="teacher.typeId">
                  <option v-for="(type,index) in types" :key="index" :value="type.id">{{type.city}} </option>
              </select>
          </tr>
          <tr>
                 学校:<select v-model="teacher.schoolId">
                  <option v-for="(school,index) in schools" :key="index"  :value="school.id">{{school.schoolName}}</option>
              </select>
          </tr>
          <tr>
              入职日期:<input type="text" v-model="teacher.hireDate">
          </tr>
          <tr>
               薪资:<input type="text" v-model="teacher.salary">
          </tr>
          <tr>
               备注:<input type="text" v-model="teacher.remark">
          </tr>
          <button @click="updataTeacher()">修改</button>
      </table>
  </div>

<script>
export default {
      data() {
        return {
            id:"",
            teacher:{
                id:"",
                teacherName:"",
                pwd:"",
                sex:"",
                typeId:"",
                schoolId:"",
                 hireDate:"",
                salary:"",
                remark:"",
            },
            types:{},
            schools:{}
        }
    },
    methods: {
    init(){
        this.$http.get(`/teacher/${this.id}`)
      .then(res => {
       this.teacher=res.data
      })
      .catch(err => {
        console.error(err); 
      })
    },
    school(){
            this.$http.get("/school")
      .then(res => {
       this.schools=res.data
      })
      .catch(err => {
        console.error(err); 
      })
    },
    type(){
        this.$http.get("/type")
      .then(res => {
       this.types=res.data
      })
      .catch(err => {
        console.error(err); 
      })
    },
    updataTeacher(){
        this.teacher.id=this.id
        alert(this.teacher.id)
        this.$http.post("/teacher/update",this.teacher)
            .then(res => {
             this.$router.push("/Teacher")
                
            })
            .catch(err => {
                console.error(err); 
            })
    }
    },
    created() {
        this.type()
        this.school()
        this.id = this.$route.params.id;
        this.init()

    },
}

后端编写

  1. 学校的查询与需求二相同,直接调用即可
  2. Type查询
    doamin:
    Type:

@Table(name = “t_type”)
@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class Type implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = “id”)
private Integer id;
@Column(name = “city”)
private String city;
}

mapper:
TypeMapper:

@org.apache.ibatis.annotations.Mapper
public interface TypeMapper extends Mapper {
}

controller:
TypeController

@RestController
@RequestMapping("/type")
public class TypeController {
@Resource
TypeService typeService;

@GetMapping
public ResponseEntity selectType(){
    List<Type> list= typeService.selectAll();
    return new ResponseEntity(list, HttpStatus.OK);
}

}

service:
TypeService :

@Service
public class TypeService {
@Resource
TypeMapper typeMapper;
public List selectAll() {
return typeMapper.selectAll();
}
}

  1. 根据id查询Teacher
    controller:
    TeacherController:

@GetMapping("/{id}")
public ResponseEntity selectByIdAll(@PathVariable(“id”) String id){
Teacher teachers= teacherService.selectByIdAll(id);
if (teachers!=null){
return new ResponseEntity<>(teachers, HttpStatus.OK);
}else {
return new ResponseEntity<>(“失败”, HttpStatus.OK);
}
}

service:
TeacherService:

public Teacher selectByIdAll(String id) {
return teacherMapper.selectByPrimaryKey(id);
}

  1. 更新Teacher
    controller:
    TeacherController:

@PostMapping("/update")
public ResponseEntity updateTeacher(@RequestBody Teacher teacher){
System.out.println(teacher);
boolean b=teacherService.updataTeacher(teacher);
if (b){
return new ResponseEntity<>(HttpStatus.OK);
}else {
return new ResponseEntity<>(“更新失败”,HttpStatus.OK);
}
}

service:
TeacherService:

public boolean updataTeacher(Teacher teacher) {
return teacherMapper.updateByPrimaryKey(teacher)==1;
}

需求9:批量删除老师

前端编写

  <button @click="del">批量删除</button>
<td><input type="checkbox" v-model="checked" :value="teacher.id"/></td>

script:

 del(){
         //判断是否有值
      if(this.checked.length!=0){
        let ids = "" 
        for(let i=0;i<this.checked.length;i++){
          ids +=this.checked[i]+","
        }
        ids=ids.substring(0,ids.length-1)
        this.$http.delete("/teacher/del/"+ids)
        .then(res=>{
           this.selectTeacher()
            })
      }else{
        alert("请选择您要批量删除的数据!!")
      }
    },

后端编写

controller:
TeacherController:

@DeleteMapping("/del/{ids}")
public ResponseEntity deletMany(@PathVariable(“ids”) String ids){
String[] split = ids.split(",");
for (String s : split) {
teacherService.delete(s);
}
return new ResponseEntity<>(HttpStatus.OK);
}

调用的还是单个删除的Service方法

就是这个样子,之后这个分页还可以用elementUi写,我之后优化叭~

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: springboot+vue是一种前后端分离的开发模式,其中后端采用springboot框架,前端采用vue框架。该模式下,可以通过接口实现前后端的交互,实现增、删、改、查等功能。在此模式下,后端主要负责对数据进行操作和处理,前端则主要负责界面展示和交互逻辑的实现。 ### 回答2: 前后端分离是现代Web应用程序开发中的热门技术。在这种开发中,前端和后端是独立的应用程序。通过前后端分离,我们可以更好地重视复杂应用程序的可维护性和可扩展性。 SpringBoot是一个基于Spring框架的开发平台,它可以快速创建基于Java的应用程序。Vue是一个现代JavaScript框架,用于创建基于用户界面的Web应用程序。 在SpringBoot Vue前后端分离应用程序中,我们需要将Vuejs前端项目与SpringBoot后端项目连接起来。在Vuejs项目中,我们需要使用Axios来发送HTTP请求,以便与SpringBoot API通信。同时,我们也需要使用Vue Router来进行页面迁移,Vuex来进行数据管理。 对于增删改查操作,我们可以通过SpringBoot来构建API。我们可以使用Spring Data JPA来管理数据库事务,并使用RESTful API路由实现CRUD操作。SpringBoot将全部的RESTful API暴露出来,通过Axios发送HTTP请求到API通过JSON格式来访问数据。 前端Vue可以使用Vue Router进行页面迁移,从而使应用程序的不同部分以单页应用程序的形式出现。此外,我们还可以使用Vuex来管理Vuejs中的状态,并向API发送请求。 综上所述,SpringBootVuejs的结合是一种非常好的技术组合,可以帮助我们创建一个快速开发和可维护的前后端分离应用程序。通过这种方式,我们可以实现更好的可扩展性、可维护性和性能优化。 ### 回答3: SpringBootVue.js是目前非常流行的Web应用程序开发框架和库,而前后端分离是设计Web应用程序的最新趋势。在本文中,我将讨论如何使用SpringBootVue.js实现一个简单的前后端分离增删改查系统。 首先,我们需要创建一个SpringBoot项目。我们可以使用Spring Initializr来创建这个项目。在创建项目时,我们需要添加一些必要的依赖项,例如Spring Web、Spring Data JPA和MySQL Driver等。 接下来,我们将创建一个简单的数据模型,用于存储我们的数据。我们可以使用Hibernate实现这个模型的ORM。这个数据模型将包含一些基本的信息,例如ID、Name、Age和Gender等。 现在,我们需要创建一个RESTful API,用于从前端Vue.js应用程序中接受HTTP请求。我们可以使用Spring MVC框架来开发这个API。这个API将包含一些基本的CRUD操作,例如增加、删除、修改和查询数据等。 完成这个API后,我们需要将Vue.js应用程序与后端API连接起来。我们可以使用Vue.js的Axios库来发送HTTP请求到后端API。我们也可以使用Vue.jsVue Router库来实现前端路由,并在前端应用程序中显示数据。 最后,我们需要编写一些Vue.js组件来实现前端UI操作。这些组件将包含一些基本的表格、表单和按钮等,用于实现增删改查操作。 通过这种方式,我们可以使用SpringBootVue.js实现一个前后端分离的增删改查系统。这个系统将具有优秀的用户体验,高可维护性和可扩展性,使得我们可以轻松地将更多特性添加到系统中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值