基于前后端分离技术做增删改查操作(SpringBoot+Mybatis Plus+Vue)

通过SpringBoot后端项目,mybatis plus,和前端Vue来实现前后端分离技术

第一步:

1、准备sql

本项目主要实现两张表的增删改查(老师+专业)+分页

CREATE TABLE `teacher` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` int(255) DEFAULT NULL,
  `hobby` varchar(255) DEFAULT NULL,
  `birthday` date DEFAULT NULL,
  `mid` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8;

CREATE TABLE `major` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

2、sql准备完毕

添加数据即可

第二步:

搭建后端项目

后端项目还是跟我们之前编写的代码一样

1、创建项目

这是之前讲解的使用SpringBoot开发的详细步骤(可以参考)

使用SpringBoot开发(完整项目)_java spring boot 项目开发-CSDN博客

2、加入依赖

你需要什么你就拿什么依赖

 <properties>
        <java.version>8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <mybatis-plus.version>3.5.2</mybatis-plus.version>
        <mysql.version>8.0.30</mysql.version>
        <junit.version>4.12</junit.version>
        <swagger.version>3.0.0</swagger.version>
        <lombok.version>1.18.24</lombok.version>
        <hutool.version>5.8.5</hutool.version>
        <druid.version>1.2.11</druid.version>
        <jackson.version>2.13.4</jackson.version>
        <fastjson2.version>2.0.23</fastjson2.version>
        <commonsio.version>2.11.0</commonsio.version>
        <aspectj-weaver.version>1.9.7</aspectj-weaver.version>
        <commons-fileupload.version>1.3.1</commons-fileupload.version>
        <commons-lang3.version>3.12.0</commons-lang3.version>
        <hibernate-validator.version>6.2.3.Final</hibernate-validator.version>        <pagehelper.version>5.2.0</pagehelper.version>


    </properties>
    <dependencies>

        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>${junit.version}</version>
            <scope>test</scope>
        </dependency>

        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
            <scope>provided</scope>
        </dependency>

        <!--spring-boot-web相关依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--hutool-->
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>${hutool.version}</version>
        </dependency>

        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.version}</version>
        </dependency>

        <!--mybatis-plus-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
        </dependency>

        <!--代码生成器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.4.0</version>
        </dependency>
        <!--mybatis-plus-generator需要此依赖-->
        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity</artifactId>
            <version>1.7</version>
        </dependency>

        <!--fastjson 工具-->
        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
            <version>${fastjson2.version}</version>
        </dependency>

        <!--aop相关-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>${aspectj-weaver.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

        <!--加解密、编码-->
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>${commons-lang3.version}</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>${commonsio.version}</version>
        </dependency>

        <!-- <dependency>
                <groupId>io.springfox</groupId>
                <artifactId>springfox-boot-starter</artifactId>
                <version>${swagger.version}</version>
            </dependency>-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.hibernate.validator</groupId>
            <artifactId>hibernate-validator</artifactId>
            <version>6.2.3.Final</version>
        </dependency>
        <!--pagehelper-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper-spring-boot-starter</artifactId>
            <version>1.4.0</version>
        </dependency>
        <!--阿里云短信-->
        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>tea-openapi</artifactId>
            <version>0.2.5</version>
        </dependency>

        <dependency>
            <groupId>com.aliyun</groupId>
            <artifactId>dysmsapi20170525</artifactId>
            <version>2.0.20</version>
        </dependency>

        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-sdk-oss</artifactId>
            <version>3.15.1</version>
        </dependency>

        <!--文件上传-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>${commons-fileupload.version}</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.14</version>
        </dependency>

        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>
        <!--定时任务-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>
        <!--rabbitmq-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
        <!--热部署-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <!--springboot打包插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

3、创建启动类

package cn.jiyun;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("cn.jiyun.mapper")
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
        System.out.println("启动成功");
    }
}

 之前的博客中也讲到了SpringBootApplication注解的作用

SpringBoot运行原理(超详细!!!面试必考)-CSDN博客

4、添加application.yml配置文件

server:
  port: 82 #端口号
spring:
  mvc:
    pathmatch:
      matching-strategy: ant_path_matcher
  rabbitmq:
    host: 127.0.0.1        #rabbitmq的ip地址
    username: guest        #用户名
    password: guest        #密码
    virtual-host: /        #空间
  redis:
    host: 127.0.0.1
    port: 6379
    # password: 123456
    # 连接超时时间(毫秒)
    timeout: 5000ms
    # 连接池配置
    jedis:
      pool:
        # 连接池最大连接数(使用负值表示没有限制)
        max-active: 8
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: 1ms
        # 连接池中的最大空闲连接
        max-idle: 8
        # 连接池中的最小空闲连接
        min-idle: 0
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver #驱动
    url: jdbc:mysql://127.0.0.1:3306/qizhongb?useSSL=false #数据库地址
    username: root #用户名
    password: aaaa #密码
  # 允许循环依赖
  main:
    allow-circular-references: true

# mybatis-plus配置
mybatis-plus:
  configuration:
    # 打印sql
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  # mapper xml路径
  mapper-locations: classpath:mapper/*.xml

这里面配置了redis,rabbitmq

(注意!!!前后端项目的端口号尽量不一样) 

5、编写controller层,service层,mapper层

1、controller层
package cn.jiyun.controller;

import cn.jiyun.mapper.MajorMapper;
import cn.jiyun.pojo.Major;
import cn.jiyun.pojo.Teacher;
import cn.jiyun.service.TeacherService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.rmi.CORBA.Stub;
import java.util.List;

@RestController
@CrossOrigin
@RequestMapping("teacher")
public class TeacherController {
    @Autowired
    private TeacherService teacherService;
    @Autowired
    private MajorMapper majorMapper;
    @RequestMapping("teacherList")
    public Page<Teacher> teacherList(int current , int size, @RequestBody Teacher teacher){
        System.out.println(teacher.getName());
        return teacherService.teacherList(current,size,teacher);
    }
    @RequestMapping("findById")
    public Teacher findById(Integer id){
        return teacherService.findById(id);

    }
    @RequestMapping("findAll")
    public List<Major> findAll(){
        return majorMapper.selectList(null);
    }
    @RequestMapping("addTeacher")
    public Boolean addTeacher(@RequestBody Teacher teacher){
        return teacherService.addTeacher(teacher);
    }
    @RequestMapping("delById")
    public Boolean delById(Integer id){

        return teacherService.delById(id);
    }
    @RequestMapping("updateTeacher")
    public Boolean updateTeacher(@RequestBody Teacher teacher){
        return teacherService.updateTeacher(teacher);
    }

}
2、service层
1、service接口层
package cn.jiyun.service;

import cn.jiyun.pojo.Teacher;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

public interface TeacherService {
    Page<Teacher> teacherList(int current, int size, Teacher teacher);

    Boolean addTeacher(Teacher teacher);

    Boolean updateTeacher(Teacher teacher);

    Teacher findById(Integer id);

    Boolean delById(Integer id);
}
2、service实现类层
package cn.jiyun.service.impl;

import cn.jiyun.mapper.TeacherMapper;
import cn.jiyun.pojo.Teacher;
import cn.jiyun.service.TeacherService;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.xml.ws.Action;

@Service
public class TeacherServiceImpl implements TeacherService {
    @Autowired
    private TeacherMapper teacherMapper;
    @Override
    public Page<Teacher> teacherList(int current, int size, Teacher teacher) {
        Page<Teacher> page = new Page<>(current, size);
        page=teacherMapper.teacherList(page,teacher);
        return page;
    }

    @Override
    public Boolean addTeacher(Teacher teacher) {
         teacherMapper.insert(teacher);
        return true;
    }

    @Override
    public Boolean updateTeacher(Teacher teacher) {
        teacherMapper.updateById(teacher);
        return true;
    }

    @Override
    public Teacher findById(Integer id) {
        Teacher teacher = teacherMapper.selectById(id);
        return teacher;
    }

    @Override
    public Boolean delById(Integer id) {
        teacherMapper.deleteById(id);
        return true;
    }
}
3、mapper层
package cn.jiyun.mapper;

import cn.jiyun.pojo.Teacher;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;

public interface TeacherMapper extends BaseMapper<Teacher> {
    Page<Teacher> teacherList(Page<Teacher> page,@Param("vo") Teacher teacher);
}

6、编写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="cn.jiyun.mapper.TeacherMapper">
    <select id="teacherList" resultType="cn.jiyun.pojo.Teacher">
        select t.*,m.name mname from teacher t join major m on m.id=t.mid
        <if test="vo.name!=null and vo.name!=''">
            and t.name like '%${vo.name}%'
        </if>
    </select>
</mapper>

7、整体后端项目就是这样的

第三步:

搭建前端项目

前端项目搭建好之后,开始编写代码

1、首先我们要先用两个命令来下载axios和elelementUI

1、npm i element-ui
2、npm i axios

当上面两个命令执行之后,我们看package.json里面的内容(相当于后端项目的maven依赖),有了这两个就证明是下载成功了

3、成功之后我们需要在main.js中添加相应的包
import axios from 'axios'
//Vue对象使用axios
Vue.prototype.axios = axios;
//导入组件库
import ElementUI from 'element-ui'
//导入组件相关样式
import 'element-ui/lib/theme-chalk/index.css'
//配置Vue插件 将El安装到Vue上
Vue.use(ElementUI);

2、接下来我们编写相关的页面(展示所有+分页、添加、修改)

.vue页面中包含的是

<template></template> (前端代码)和 <script></script>(js代码)

我们之前写的普通项目中定义全局变量和方法是通过Vue对象来实现的,现在用了前后端fen'li'ji我们也有一种方式是通过 export default{}来实现

1、展示所有的前端代码
<script>
export default {
  data() {
    return {
      page: {},
      pageParam: {
        current: 1,
        size: 4
      },
      requestParam: {},
      majorList:[],
    }
  },
  methods: {
    initData() {
      axios.post(`http://localhost:82/teacher/teacherList?current=${this.pageParam.current}&size=${this.pageParam.size}`, this.requestParam).then(res => {
        this.page = res.data;
      })
    },
    //当每页最大展示条数发生改变的时候执行-->
    handleSizeChange(val) {
      this.pageParam.size = val;
      this.initData();
    },
    handleCurrentChange(val) {
      this.pageParam.current = val;
      this.initData();
    },
    toAddPage(){
      this.$router.push("/add");
    },
    initMajorData(){
      axios.post(`http://localhost:82/teacher/findAll`).then(res => {
        this.majorList = res.data;
      })
    },
    handleEdit(id){
      this.$router.push({
        path: '/update',
        query:{id:id}
      })
    },
    handleDel(id){
      this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning'
      }).then(() => {
        axios.post("http://localhost:82/teacher/delById?id="+id).then(res=>{
          if(res.data){
            this.$message.success("成功")
            this.initData();
          }
        })
      }).catch(() => {
        this.$message({
          type: 'info',
          message: '已取消删除'
        });
      });

    }

  },
  created() {
    this.initData();
    this.initMajorData();
  }
}
import axios from "axios";
</script>

<template>
  <div>
    姓名:
    <el-input v-model="requestParam.name" style="width: 200px" placeholder="请输入内容"></el-input>

    <el-button type="primary" size="mini" @click="initData">搜索</el-button>
    <el-button type="primary" size="mini" @click="toAddPage">添加</el-button>
    <el-table
        :data="page.records"
        stripe
        style="width: 100%">
      <el-table-column
          prop="id"
          label="编号">
      </el-table-column>
      <el-table-column
          prop="name"
          label="姓名">
      </el-table-column>
      <el-table-column
          prop="sex"
          label="性别">
        <!--template:模板 自定义展示内容-->
        <template slot-scope="scope">
          {{ scope.row.sex == 1 ? '男' : '女' }}
        </template>
      </el-table-column>
      <el-table-column
          prop="age"
          label="年龄">
      </el-table-column>
      <el-table-column
          prop="hobby"
          label="爱好">
      </el-table-column>
      <el-table-column
          prop="birthday"
          label="创建日期">
        <template slot-scope="scope">
          {{ scope.row.birthday|format('yyyy-MM-dd') }}
        </template>
      </el-table-column>
      <el-table-column
          prop="mname"
          label="专业">
      </el-table-column>
      <el-table-column label="操作">
        <template slot-scope="scope">
          <el-button
              size="mini"
              @click="handleEdit(scope.row.id)">编辑
          </el-button>
          <el-button
              type="danger"
              size="mini"
              @click="handleDel(scope.row.id)">删除
          </el-button>
        </template>
      </el-table-column>
    </el-table>
    <!--分页-->
    <el-pagination
        @size-change="handleSizeChange"
        @current-change="handleCurrentChange"
        :current-page="page.current"
        :page-sizes="[2, 200, 300, 400]"
        :page-size="page.size"
        layout="total, sizes, prev, pager, next, jumper"
        :total="page.total">
    </el-pagination>
  </div>
</template>

(另外axios我是在show页面又导了包,所以在上面才能直接使用axios.post(),否则只能通过this.axios.post())

2、添加的前端代码
<script>
import axios from "axios";

export default {
  data() {
    return {
      hobbyArr: [],
      majorList: [],
      form: {},
      formLabelWidth: "200px",
      dialogFormVisible: true,
    }
  },
  methods: {
    addTeacher() {
      this.form.hobby=this.hobbyArr.join(",");
      axios.post(`http://localhost:82/teacher/addTeacher`, this.form).then(res => {
        if (res.data) {
          this.$message.success("成功")
          this.dialogFormVisible = false;
          this.$router.push("/");
        }
      })
    },
    initMajorData() {
      axios.post(`http://localhost:82/teacher/findAll`).then(res => {
        this.majorList = res.data;
      })
    },
    quxiao(){
      this.dialogFormVisible=false;
      this.$router.push("/");
    }
  },
  created() {
    this.initMajorData();
  }
}
</script>

<template>
  <div>
    <el-dialog title="添加" :visible.sync="dialogFormVisible" :show-close="false">
      <el-form :model="form">
        <el-form-item label="姓名" :label-width="formLabelWidth">
          <el-input v-model="form.name" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="年龄" :label-width="formLabelWidth">
          <el-input v-model="form.age" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="性别" :label-width="formLabelWidth">
          <el-radio-group v-model="form.sex">
            <el-radio :label="1">男</el-radio>
            <el-radio :label="2">女</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="爱好" :label-width="formLabelWidth">
          <el-checkbox-group v-model="hobbyArr">
            <el-checkbox label="篮球"></el-checkbox>
            <el-checkbox label="足球"></el-checkbox>
            <el-checkbox label="乒乓球"></el-checkbox>
          </el-checkbox-group>
        </el-form-item>

        <el-form-item label="生日" :label-width="formLabelWidth">
          <el-date-picker
              v-model="form.birthday"
              type="date"
              placeholder="日期">
          </el-date-picker>
        </el-form-item>
        <el-form-item label="专业" :label-width="formLabelWidth">
          <el-select v-model="form.mid" placeholder="请选择">
            <el-option
                v-for="item in majorList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <el-button  @click="quxiao()">取消</el-button>
      <el-button type="primary" @click="addTeacher">确 定</el-button>
    </el-dialog>
  </div>
</template>
3、修改的前端代码
<script>
import axios from "axios";
export default {
  data() {
    return {
      hobbyArr: [],
      majorList: [],
      form: {},
      formLabelWidth: "200px",
      dialogFormVisible: true,
    }
  },
  methods: {
    addTeacher() {
      this.form.hobby=this.hobbyArr.join(",");
      axios.post(`http://localhost:82/teacher/updateTeacher`, this.form).then(res => {
        if (res.data) {
          this.$message.success("成功")
          this.dialogFormVisible = false;
          this.$router.push("/");
        }
      })
    },
    quxiao(){
      this.dialogFormVisible=false;
      this.$router.push("/");
    },
    initMajorData() {
      axios.post(`http://localhost:82/teacher/findAll`).then(res => {
        this.majorList = res.data;
      })
    },
    findById(id) {
      this.form.hobby=this.hobbyArr.join(",");
      axios.post(`http://localhost:82/teacher/findById?id=`+id).then(res => {

        this.form = res.data;
        this.hobbyArr=this.form.hobby.split(",");
      })
    }
  },
  created() {
    // this.initData();
    var id = this.$route.query.id;
    this.initMajorData();
    this.findById(id);
  }
}
</script>
<template>
  <div>
    <el-dialog title="修改" :visible.sync="dialogFormVisible" :show-close="false">
      <el-form :model="form">
        <el-form-item label="姓名" :label-width="formLabelWidth">
          <el-input v-model="form.name" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="年龄" :label-width="formLabelWidth">
          <el-input v-model="form.age" autocomplete="off"></el-input>
        </el-form-item>
        <el-form-item label="性别" :label-width="formLabelWidth">
          <el-radio-group v-model="form.sex">
            <el-radio :label="1">男</el-radio>
            <el-radio :label="2">女</el-radio>
          </el-radio-group>
        </el-form-item>
        <el-form-item label="爱好" :label-width="formLabelWidth">
          <el-checkbox-group v-model="hobbyArr">
            <el-checkbox label="篮球"></el-checkbox>
            <el-checkbox label="足球"></el-checkbox>
            <el-checkbox label="乒乓球"></el-checkbox>
          </el-checkbox-group>
        </el-form-item>
        <el-form-item label="生日" :label-width="formLabelWidth">
          <el-date-picker
              v-model="form.birthday"
              type="date"
              placeholder="日期">
          </el-date-picker>
        </el-form-item>
        <el-form-item label="专业" :label-width="formLabelWidth">
          <el-select v-model="form.mid" placeholder="请选择">
            <el-option
                v-for="item in majorList"
                :key="item.id"
                :label="item.name"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
      </el-form>
      <el-button @click="quxiao">取消</el-button>
      <el-button type="primary" @click="addTeacher">确 定</el-button>
    </el-dialog>
  </div>

</template>

添加和修改没啥区别,修改就是多了一个数据的回显,在show页面将id传递到update页面,然后axios向后台发送请求,返回一个对象,然后赋值给form表单,就完成了回显,需要特别注意的是hobby爱好是复选框,需要单独处理,以上代码中有处理方法

3、页面写好了,但是会不会跳转呢?以及如何解决?

答:不会的,因为我们前端项目主要是靠路由来实现的,我们到目前为止并没有配置路由

解决方案:
1、找到router包下的index.js
2、给文件中添加相应的路径以及改路径会跳转到的页面
import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeView from '../views/HomeView.vue'
import LoginView from '../views/LoginView.vue'
import HelloView from '../views/HelloView.vue'
import ShowView from '../views/ShowView.vue'
import AddView from '../views/AddView.vue'
import UpdateView from '../views/UpdateView.vue'

Vue.use(VueRouter)

const routes = [
  {
    path: '/home',
    name: 'home',
    component: HomeView
  },
  {
    path: '/update',
    name: 'update',
    component: UpdateView
  },
  {
    path: '/add',
    name: 'add',
    component: AddView
  },
  {
    path: '/login',
    name: 'login',
    component: LoginView
  },
  {
    path: '/',
    name: 'show',
    component: ShowView
  },
  {
    path: '/hello',
    name: 'hello',
    component: HelloView
  },
  {
    path: '/about',
    name: 'about',
    // route level code-splitting
    // this generates a separate chunk (about.[hash].js) for this route
    // which is lazy-loaded when the route is visited.
    component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')
  }
]
const router = new VueRouter({
  routes
})

export default router

4、前端项目整体

(注意!!!前后端项目的端口号尽量不一样) 

前端项目额端口号默认是8080

第四步

 运行项目

1、运行前端项目

可以在idea上控制台通过npm run -serve,也可以点击package.json里面的

2、运行后端项目

点击启动类的三角

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/450668.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

日常超实用技巧(一)

目录 场景说明 mysql解决 excel解决 vscode插件解决 notepad解决 扩展解决 正则解决 自动录制宏解决 场景说明 平常在开发中有时会遇到一些字符串的规整或者格式化的操作,这点在操作数据库时经常常见,但是有的时候却有这种需求,就是我们的修改条件是某个查询条件的字…

第三方软件测评机构出具软件测试报告的流程简析

第三方软件测评机构是独立于软件开发方和需求方的第三者机构&#xff0c;负责对软件进行全面的评估和测试。独立存在使得出具的测试结果会更客观公正。相比之下&#xff0c;软件开发方进行的测评工作往往存在着主观性和局限性&#xff0c;很难全面评估软件的各个方面。 第三方…

Linux操作系统-06-进程与服务管理

使用ps命令查看进程。包括过滤进程信息 使用systemctl命令管理和运行Linux服务 进程&#xff08;Process&#xff09;&#xff1a;操作系统正在运行的应用程序。任意一个进程&#xff0c;都会消耗CPU和内存资源&#xff0c; 服务&#xff08;Service&#xff09;&#xff1a…

C# Onnx C2PNet 图像去雾 室外场景

目录 介绍 效果 模型信息 项目 代码 下载 C# Onnx C2PNet 图像去雾 室外场景 介绍 github地址&#xff1a;https://github.com/YuZheng9/C2PNet [CVPR 2023] Curricular Contrastive Regularization for Physics-aware Single Image Dehazing 效果 模型信息 Model P…

Docker安装Prometheus监控

环境初始化 关闭防火墙 setenforce 0 vim /etc/selinux/config ##################内部代码################### SELINUXdisabled #关闭防火墙 ############################################ 安装docker #卸载yum源之前的docker安装包 sudo yum remove docker docker-clie…

打算考PMP,需要准备什么?

PMP是什么考试&#xff1f;是PMI设立的项目管理资格认证考试&#xff0c;旨在评估和确认候选人是否具备在各种项目环境中领导和管理项目的能力。 pmp考试不算简单&#xff0c;考前也需要更详细的了解考试情况才能更好的备考。文章不是很长&#xff0c;主要是可以让你快速的了解…

TSINGSEE青犀视频AI方案:数据+算力+算法,人工智能的三大基石

背景分析 随着信息技术的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们生活的各个领域&#xff0c;从智能家居到自动驾驶&#xff0c;从医疗诊断到金融风控&#xff0c;AI的应用正在改变着我们的生活方式。而数据、算法和算力&#xff0c;正是构成…

IntelliJ IDEA Dev 容器

​一、dev 容器 开发容器&#xff08;dev 容器&#xff09;是一个 Docker 容器&#xff0c;配置为用作功能齐全的开发环境。 IntelliJ IDEA 允许您使用此类容器来编辑、构建和运行您的项目。 IntelliJ IDEA 还支持多个容器连接&#xff0c;这些连接可以使用 Docker Compose …

3588板子部署yoloV5

一 &#xff1a;准备 ubuntu linux X86_64系统 a.安装anaconda b.创建虚拟环境 python3.8 二&#xff1a; 下载rknn-toolkit2 传送门 unzip 解压文件夹 三&#xff1a;pt转onnx模型 四&#xff1a;onnx转rknn模型 a:cd到rknn-toolkit2-master/rknn-toolkit2/packag…

C++学习笔记:红黑树

红黑树 什么是红黑树红黑树的规则红黑树节点的定义红黑树的插入空树插入非空插入条件判断新插入的节点 cur 不为 root 且 parent->_col 为红就需要调整父节点为左 grandf->left parent当uncle节点为红色时,只需要进行颜色调整,即可当uncle为空 或 者存在但是为黑parent …

cnetos7 清理 journal 日志

journal 日志如果长时间不清理&#xff0c;会占用系统很多空间&#xff0c;所有需要清理占用过多的一些日志。 1、查看journal日志当前使用情况&#xff0c;包括占用的磁盘空间、日志数量 journalctl --disk-usage 2、清除 journal 日志中超过 100MB 大小的内容 journalctl -…

Lord 3DMCV7-AHRS 时间同步硬件触发设置

目的:通过FPGA发送脉冲触发IMU采集数据。FPGA发送脉冲时,IMU才有数据产生。 FPGA与IMU的硬件接线就不讲了,这里主要说明的是IMU的设置以及ROS驱动的config文件更改。 1. WIN上位机设置 通过IMU在WINDOWS的上位机SensorConnect对IMU的GPIO、波特率等基本功能进行设值,具体…

项目解决方案:视频监控接入和录像系统设计方案(下)

目 录 1.概述 2. 建设目标及需求 2.1建设总目标 2.2 需求描述 ​2.3 需求分析 3.设计依据与设计原则 3.1设计依据 3.2 设计原则 4.建设方案设计 4.1系统方案设计 4.2组网说明 5.产品介绍 5.1视频监控综合资源管理平台介绍 5.2视频录像服务器和存储 5.2.…

SpringController返回值和异常自动包装

今天遇到一个需求&#xff0c;在不改动原系统代码的情况下。将Controller的返回值和异常包装到一个统一的返回对象中去。 例如原系统的接口 public String myIp(ApiIgnore HttpServletRequest request);返回的只是一个IP字符串"0:0:0:0:0:0:0:1"&#xff0c;目前接口…

Django入门 整体流程跑通

Django学习笔记 一、Django整体流程跑通 1.1安装 pip install django //安装 import django //在python环境中导入django django.get_version() //获取版本号&#xff0c;如果能获取到&#xff0c;说明安装成功Django目录结构 Python310-Scripts\django-admi…

噬菌体展示文库类型与应用-卡梅德生物

噬菌体展示抗体库构建的途径&#xff1a;目前主要有两种&#xff1a;一是有机合成法&#xff0c;二是基因合成法。前者是直接合成含有各种可能序列的短肽&#xff0c;构建至噬菌体载体。基因工程方法是将目的基因构建至载体&#xff0c;与噬菌体的pⅢ外壳蛋白融合表达。 卡梅德…

数据结构——堆的应用 堆排序详解

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

制造业工厂的设备管理系统

对企业来说&#xff0c;时间就是金钱&#xff0c;所有企业都在极力避免因生产延误而导致的金钱损失。在设备保养、设备维护和设备运行方面更是如此。如果工厂的设备因突发故障处于长时间停机状态&#xff0c;但没能被及时解决&#xff0c;工厂所需支付的成本可能就会螺旋式上升…

11、设计模式之享元模式(Flyweight)

一、什么是享元模式 享元模式是一种结构型的设计模式。它的主要目的是通过共享对象来减少系统种对象的数量&#xff0c;其本质就是缓存共享对象&#xff0c;降低内存消耗。 享元模式将需要重复使用的对象分为两个部分&#xff1a;内部状态和外部状态。 内部状态是不会变化的&…

基于java+springboot+mybatis+laiyu实现学科竞赛管理系统

基于javaspringbootmybatislaiyu实现学科竞赛管理系统 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获…
最新文章