【SpringBoot+VUE+ELEMENT 】前后端分离的管理系统的实现——基础功能(记录向)

news2024/12/24 7:38:40

一个前后端分离的实现。后端使用SpringBoot,前端使用Vue,后端标准的四层结构,前端是用的Element。

一、环境准备

1.安装node.js

Node.js 是一个开源的、跨平台的 JavaScript 运行时环境。

成功后cmd中运行 node -v npm -v 出现 对应的版本号
安装成功

2.安装Vue脚手架

Vue脚手架指的是vue-cli,它是一个快速构建**单页面应用程序(SPA)**环境配置的工具,cli是(command-line-interface )命令行界面。

成功后cmd中运行 vue -V 出现 对应的版本号
在这里插入图片描述

3.安装webpack前端打包工具

webpack是现代javascript应用程序的静态模块打包器,当 webpack 处理应用程序时,它会递归地构建一个依赖关系图(dependency graph),其中包含应用程序需要的每个模块,然后将所有这些模块打包成一个或多个 bundle

成功后cmd中运行 webpack -V 出现 对应的版本号
在这里插入图片描述

二、创建项目

一.创建Vue项目

因为在IDEA中创建项目,不会自动的创建出所需要的router文件,所以我个人感觉还是在命令行界面里创建比较好一点,因为这个会自动加进入我们需要的router,不需要我们再手动创建了(尤其是手动创建在某些时候还会报错)

  1. 在我们要创建的目录下打开cmd,输入命令 vue int webpack 项目名
    在这里插入图片描述

  2. 一些初始化配置
    在这里插入图片描述

  3. 根据命令运行项目
    在这里插入图片描述

  4. 成功界面
    会出现一个链接。然后在浏览器里打开这个链接,出现初始化页面,表示已经创建成功
    在这里插入图片描述
    在这里插入图片描述

二.创建SpringBoot项目

1.在Idea里使用Spring初始化快速建立一个空的项目。注意语言要使用java,类型要选择Maven, JDK和 java版本要对应。
在这里插入图片描述
2.创建成功后的默认目录
在这里插入图片描述
3.在main里面创建controller、pojo、mapper、service,以及service下的impl实现层,以及resorces下的mapper
在这里插入图片描述

三.数据库中创建表

  1. 设计
    在这里插入图片描述
  2. 内容
    在这里插入图片描述

恭喜!到目前为止我们已经把程序在电脑运行的环境搭建好了,并且创建了前后端和数据库的项目,下一步就是在项目里进行配置,并且写代码和调试了。

三、项目里面的环境配置

后端

Springboot中修改pom.xml 和 applicatiom.yml

在这里插入图片描述

  1. pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.demo</groupId>
    <artifactId>test</artifactId>
    <version>1.0-SNAPSHOT</version>

    <!--设置spring boot的parent,这样当前的项目就是Spring Boot项目了,使用它之后,常用的包依赖可以省去version标签-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.5.RELEASE</version>
    </parent>
    <!-- 设置项目编码格式及声明JDK版本 -->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <!--依赖-->
    <dependencies>
        <!--对全栈web开发的支持, 包括Tomcat和spring-webmvc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 对Thymeleaf模板引擎的支持,包括和Spring的集成 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!--引入mybatis-plus,MyBatis的增强工具-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>

        <!--引入mysql数据库驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>

        <!--引入thymeleaf页面模板-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!--比较喜欢这个,创建bean的时候不用写getter/setter/toString-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <!-- 引入fastjson,JSON转换时使用 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.9</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <!--Spring boot的插件,导出成jar、war包时需要-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

  1. applicatiom.yml
#服务器配置
server:
  #默认端口号
  port: 8088
  #tomcat服务器传输参数时的字符编码,不注意的话会导致中文乱码
  tomcat.uri-encoding: UTF-8

#配置spring数据源
spring:
  # 配置连接信息默认连接池
  datasource:
    #数据库连接地址,解释为:JDBC以Mysql的方式进行连接,IP地址为本地,端口号为3306,数据库为test,使用Unicode字符集,字符集编码为utf-8,不进行SSL连接
    url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=false
    #数据库用户名
    username: root
    #数据库用户密码
    password: Admin123@123
    #数据库驱动
    driver-class-name: com.mysql.jdbc.Driver
  #配置hikari连接池
  hikari:
    #从连接池中获取的连接是否默认处于只读模式:否
    read-only: false
    #等待来自连接池的连接的毫秒数为60000,即60秒
    connection-timeout: 60000
    #连接允许在池中闲置的毫秒数为60000,即60秒
    idle-timeout: 60000
    #连接池中最长生命周期
    max-lifetime: 3000
    #指定连接数据库的超时时间
    login-timeout: 500
    #连接池中最大连接数
    maximum-pool-size: 60
    #连接池中维护的最小连接数
    minimum-idle: 10
  # 配置静态资源地址
  resources:
    #静态资源默认目录,此出配置指向resources文件夹
    static-locations: classpath:/
  # 配置模板引擎
  thymeleaf:
      # 指定文件默认目录
      prefix: classpath:/templates/
      # 指定文件尾缀
      suffix: .html
      # 是否开启缓存
      cache: false
      # 字符集编码
      encoding: UTF-8
#mybatis plus映射文件的地址
mybatis-plus:
  #设置扫描.xml文件的存放目录
  mapper-locations: classpath*:/mapper/**/*.xml
  #设置扫描实体bean目录
  typeAliasesPackage: com.test.demo.pojo

四层结构功能

controller 控制层:负责调用 service 层接口
entity实体层:实体类是属性对象,用于供给其他层引用,该层的属性往往和数据库的表结构各个字段相同
mapper 数据层:mapper层所定义的接口要实现对数据的操作
service 业务逻辑层: 负责功能的编写,将所需要的功能都定义在一个 service 层的接口当中

前端

  1. 安装Element 组件库 cnpm i element-ui -S
  2. 在 main.js 中添加语句
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
Vue.use(ElementUI);

在这里插入图片描述

四 编写后端页面

0.跨域问题

因为前后端使用的端口号不同,涉及到跨域。
需要使用注解符号@CrossOrigin(origins = “http://localhost:8080”)
在这里插入图片描述

1. 代码编写

文件的位置

  1. TUser.java
package com.test.demo.pojo;

import lombok.Data;

/**
 * t_user表使用了lombok的插件,而导致序列化出现错误
 */
@Data
public class TUser {
    private static final long serialVersionUID = 1L;

    public TUser() {
    }

    /**
     * ID序号
     */
    private Integer id;
    /**
     * 用户名
     */
    private String name;
    /**
     * 性别0男1女
     */
    private String gender;
    /**
     * 年龄
     */
    private Integer age;


    private String email;

}

  1. TUserMapper.java
package com.test.demo.mapper;

import com.test.demo.pojo.TUser;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;
import java.util.Map;

/**
 * TUser的Dao层
 * 加入Mapper注解后,Mybatis的拦截器会把其的接口生成动态代理类,让spring对mapper接口的bean进行管理,
 * 也可通过注解将需要使用的sql写在这
 */
@Mapper
public interface TUserMapper {
    //根据实体bean返回集合
    List<TUser> getAllBeanInfo();

    TUser selectTUserById(Integer id);

    int insertTUser(TUser tUser);

    int deleteTuserById(Integer id);

    int updateTUser(TUser tUser);


}

  1. TUserMapper.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.test.demo.mapper.TUserMapper">

    <select id="getAllBeanInfo" resultType="TUser">
        select * from t_user
    </select>

    <select id="selectTUserById" resultType="TUser">
        select * from t_user  where `id` = #{id};
    </select>

    <insert id="insertTUser" parameterType="TUser">
        insert into t_user(id,name,age,gender,email) values (#{id}, #{name}, #{age},#{gender}, #{email});
    </insert>

    <delete id="deleteTuserById" parameterType="integer">
            delete from t_user where `id` = #{id}
    </delete>

    <update id="updateTUser" parameterType="TUser">
        update t_user set name = #{name},age = #{age},gender = #{gender},email = #{email}
        where id = #{id}
    </update>


</mapper>

  1. TUserService
package com.test.demo.service;

import com.test.demo.mapper.TUserMapper;
import com.test.demo.pojo.TUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * TUser逻辑层
 * Service注解是声明这个类是业务层,用来写复杂逻辑的
 */

public interface TUserService {
    //根据实体bean返回集合
    List<TUser> getAllBeanInfo();

    TUser selectTUserById(Integer id);

    int insertTUser(TUser tUser);

    int deleteTuserById(Integer id);

    int updateTUser(TUser tUser);
}

  1. TUserServiceImpl
package com.test.demo.service.Impl;

import com.test.demo.mapper.TUserMapper;
import com.test.demo.pojo.TUser;
import com.test.demo.service.TUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


@Service
public class  TUserServiceImpl implements TUserService {

    /**
     * Autowired是当Spring发现该注解时,将动在代码上下文中找到与其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方去。简称自动注入.
     */
    @Autowired
    TUserMapper userMapper;


    @Override
    public List<TUser> getAllBeanInfo() {
        return userMapper.getAllBeanInfo();
    }

    @Override
    public TUser selectTUserById(Integer id) {
        return userMapper.selectTUserById(id);
    }

    @Override
    public int insertTUser(TUser tuser) {
        return userMapper.insertTUser(tuser);
    }

    @Override
    public int deleteTuserById(Integer id) {
        return userMapper.deleteTuserById(id);
    }

    @Override
    public int updateTUser(TUser tUser) {
        return userMapper.updateTUser(tUser);
    }
}

2. 前端展示

出现这种页面表示接口没有问题
在这里插入图片描述
在这里插入图片描述

五 编写前端页面

1.登录页面

  1. 新创建一个login.vue,增加一个登录页面
<template>
  <div class="login-container">
    <el-form :model="ruleForm2" :rules="rules2"
             status-icon
             ref="ruleForm2"
             label-position="left"
             label-width="0px"
             class="demo-ruleForm login-page">
      <h3 class="title">系统登录</h3>
      <el-form-item prop="username">
        <el-input type="text"
                  v-model="ruleForm2.username"
                  auto-complete="off"
                  placeholder="用户名"
        ></el-input>
      </el-form-item>
      <el-form-item prop="password">
        <el-input type="password"
                  v-model="ruleForm2.password"
                  auto-complete="off"
                  placeholder="密码"
        ></el-input>
      </el-form-item>
      <el-checkbox
        v-model="checked"
        class="rememberme"
      >记住密码
      </el-checkbox>
      <el-form-item style="width:100%;">
        <el-button type="primary" style="width:100%;" @click="handleSubmit" :loading="logining">登录</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
export default {
  name: "login",
  data(){
    return {
      logining: false,
      ruleForm2: {
        username: 'admin',
        password: '123456',
      },
      rules2: {
        username: [{required: true, message: 'please enter your account', trigger: 'blur'}],
        password: [{required: true, message: 'enter your password', trigger: 'blur'}]
      },
      checked: false
    }
  },
  methods: {
    handleSubmit(event){
      this.$refs.ruleForm2.validate((valid) => {
        if(valid){
          this.logining = true;
          if(this.ruleForm2.username === 'admin' &&
            this.ruleForm2.password === '123456'){
            this.logining = false;
            sessionStorage.setItem('user', this.ruleForm2.username);
            this.$router.push({path: '/home'});
          }else{
            this.logining = false;
            this.$alert('username or password wrong!', 'info', {
              confirmButtonText: 'ok'
            })
          }
        }else{
          console.log('error submit!');
          return false;
        }
      })
    }
  }
}
</script>

<style scoped>

.login-container {
  width: 100%;
  height: 100%;
}
.login-page {
  -webkit-border-radius: 5px;
  border-radius: 5px;
  width: 350px;
  padding: 35px 35px 15px;
  background: #fff;
  border: 1px solid #eaeaea;
  box-shadow: 0 0 25px #cac6c6;
  margin: 0;
  position: relative;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}

label.el-checkbox.rememberme {
  margin: 0px 0px 15px;
  text-align: left;
}

.title{
  text-align: center;
}
</style>


  1. 在 router 目录下 index.js 文件中添加 login 路径
    在这里插入图片描述
  2. npm run dev ,前端运行页面如图所示
    在这里插入图片描述

2.(跳转)后台页面

  1. 创建一个登陆后跳转的页面 index.vue,引入 element 布局容器 和 element 侧边栏
<template>
  <el-container>
    <!-- width的宽度跟collapse一样动态控制 -->
    <el-aside width="collapse">
      <div class="logo" v-show="open"><h3><i class="el-icon-eleme"></i>xxx管理系统</h3></div>
      <div class="logo" v-show="close"><h3><i class="el-icon-eleme"></i></h3></div>
      <!-- :collapse="isCollapse"  class="el-menu-vertical" 动态控制导航菜单的收起与展开  router:让index作为 path 进行路由跳转 -->
      <el-menu default-active="$route.path"
               router
               :default-openeds="openeds"
               :collapse="isCollapse"
               class="el-menu-vertical">
        <el-submenu index="1">
          <!-- 一级标题 -->
          <template slot="title">
            <i class="el-icon-s-tools"></i>
            <span slot="title">后台管理</span>
          </template>
          <!--  二级标题 -->
          <el-menu-item index="/console">
            <i class="el-icon-setting"></i>
            <span slot="title">控制台</span>
          </el-menu-item>
          <el-menu-item index="/student">
            <i class="el-icon-setting"></i>
            <span slot="title">学生管理</span>
          </el-menu-item>
        </el-submenu>
      </el-menu>

    </el-aside>
    <el-container>
      <el-header>
        <div class="trigger" @click="isShow">
          <!-- 点击展开收起导航和切换对应图标 -->
          <i class="el-icon-s-fold" v-show="open"></i>
          <i class="el-icon-s-unfold" v-show="close"></i>
        </div>
      </el-header>
      <el-main>
        <router-view></router-view>
      </el-main>
      <el-footer>Footer</el-footer>
    </el-container>
  </el-container>
</template>

<script>
export default {
  name: "index",
  data() {
    return {
      openeds: ["1"],
      isCollapse: false, //导航栏默认为展开
      close: false, //第二个图标默认隐藏
      open: true, //默认显示第一个图标
    }
  },
  methods: {
    isShow() {
      this.isCollapse = !this.isCollapse;
      this.open = !this.open;
      this.close = !this.close;
    },
  }
}
</script>

<style scoped>
.el-header, .el-footer {
  background-color: #B3C0D1;
  color: #333;
  line-height: 60px;
  height: 100%;
  padding: 0 !important;
}

.el-aside {
  background-color: #D3DCE6;
  color: #333;
  height: 100vh;
}

.el-main {
  background-color: #E9EEF3;
  color: #333;
}

body > .el-container {
  margin-bottom: 40px;
}

.logo {
  height: 60px;
  line-height: 60px;
  background-color: antiquewhite;
  text-align: center;
}

.logo h3 {
  margin: 0;
  height: 60px;
}

.el-menu {
  border-right-width: 0;
}

.el-menu-vertical:not(.el-menu--collapse) {
  width: 240px;
}

.trigger {
  height: 60px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
  width: 54px;
}

.trigger i {
  font-size: 20px;
}

.trigger:hover {
  background-color: rgb(203, 215, 230);
}
</style>


页面如下图所示
main部分添加,表示一会要将控制台和学生管理里的内容显示在main部分。(起到一个占位符的作用)

  1. index.js 中添加新的import,并在routes下的home里添加children
    index.js
import Vue from 'vue'
import Router from 'vue-router'
import HelloWorld from '@/components/HelloWorld'

import login from '@/views/login'
import home from '@/views/home'

import console from '@/views/console'
import student from '@/views/student'


Vue.use(Router)

export default new Router({
  routes: [
    {
      path: '/',
      name: 'HelloWorld',
      component: HelloWorld
    },{
      path: '/login',
      name: 'login',
      component: login
    },{
      path: '/home',
      name: 'home',
      component: home,
      children:[
        {
          path: '/console',
          name: 'console',
          component: console
        }, {
          path: '/student',
          name: 'student',
          component: student
        }
      ]
    }
  ]
})

  • 页面
    在这里插入图片描述
    在这里插入图片描述

  • 成功后的页面
    渲染成功页面

3.挂载页面

  • 修改 student 页面,引入 element 表格
  • 对话框控件 要考虑如何跟后台做交互,vue 推荐的是 axios。

axios是什么:axios是基于promise(诺言)用于 node.js 和浏览器中。
axios的作用:axios用于向后台发起请求,并在请求中做更多的可控功能。

  1. 安装 cnpm install axios --save-dev
  2. 在main.js 完成挂载
main.js

import Vue from 'vue'
import App from './App'
import router from './router'

import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'

import login from '@/views/login.vue'
import home from '@/views/home.vue'

import axios from 'axios'
Vue.prototype.$axios = axios


Vue.config.productionTip = false
Vue.use(ElementUI);
/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  axios,
  components: { App },
  template: '<App/>'
})

在这里插入图片描述

4.修改student.vue

<template>
  <el-card class="box-card">
    <!-- Dialog 对话框 弹出新增和修改表单 -->
    <el-row>
      <el-button size="mini" type="primary" @click="add">新增</el-button>
      <el-dialog :title="title" :visible.sync="dialogFormVisible" width="30%">
        <el-form :model="form" :rules="rules" ref="form">
          <el-form-item label="id:" hidden>
            <el-input v-model="form.id"></el-input>
          </el-form-item>
          <el-form-item label="姓名:" prop="name">
            <el-input v-model="form.name" placeholder="请输入姓名" style="width:80%"></el-input>
          </el-form-item>
          <el-form-item label="年龄:" prop="age">
            <el-input v-model.number="form.age" placeholder="请输入年龄" style="width:80%"></el-input>
          </el-form-item>
          <el-form-item label="性别:" prop="gender">
            <el-select v-model="form.gender" placeholder="请选择性别" style="width:80%">
              <el-option label="男" value="男"></el-option>
              <el-option label="女" value="女"></el-option>
            </el-select>
          </el-form-item>
          <el-form-item label="邮箱:" prop="email">
            <el-input v-model="form.email" placeholder="请输入邮箱" style="width:80%"></el-input>
          </el-form-item>
        </el-form>
        <div slot="footer" class="dialog-footer">
          <el-button @click="dialogFormVisible = false">取 消</el-button>
          <el-button type="primary" @click="submit()">提 交</el-button>
        </div>
      </el-dialog>
    </el-row>

    <!-- 表格 -->
    <el-table
      ref="singleTable"
      :data="tableData"
      style="width: 100%">
      <el-table-column
        type="selection"
        width="55">
      </el-table-column>
      <el-table-column
        property="id"
        label="ID"
        width="50"
        align="center">
      </el-table-column>
      <el-table-column
        property="name"
        label="姓名"
        width="120"
        align="center">
      </el-table-column>
      <el-table-column
        property="age"
        label="年龄"
        width="120"
        align="center">
      </el-table-column>
      <el-table-column
        property="gender"
        label="性别"
        width="120"
        align="center">
      </el-table-column>
      <el-table-column
        property="email"
        label="邮箱"
        align="center">
      </el-table-column>
      <el-table-column label="操作" align="center">
        <template slot-scope="scope">
          <el-button
            size="mini"
            @click="edit(scope.$index, scope.row)">编辑
          </el-button>
          <el-button
            size="mini"
            type="danger"
            @click="remove(scope.$index, scope.row)">删除
          </el-button>
        </template>
      </el-table-column>
    </el-table>
  </el-card>
</template>

<script>
export default {
  name: "student",
  data() {
    return {
      title: '',
      currentRow: null,
      dialogFormVisible: false,
      form: {},
      tableData: [],
      rules: {
        name: [{required: true, message: '请输入姓名', trigger: 'blur'}],
        age: [{required: true, message: '请输入年龄', trigger: 'blur'},
          {type: 'number', message: '年龄必须为数字值', trigger: 'blur'},
          {pattern: /^(0|[1-9]\d?|200)$/, message: '范围在0-200', trigger: 'blur'}],
        gender: [{required: true, message: '请选择性别', trigger: 'change'}],
        email: [{required: true, message: '请输入邮箱', trigger: 'blur'}]
      }
    }
  },
  methods: {
    // 表单重置初始化
    reset() {
      this.form = {
        id: null,
        name: null,
        age: null,
        gender: null,
        email: null
      }
    },

    // 增
    add() {
      this.reset()
      this.dialogFormVisible = true
      this.title = "新增学生数据"
    },

    // 删
    remove(index, row) {
      console.log(row.id)
      this.$axios({
        method: 'post',
        url: 'http://localhost:8088/user/remove/' + row.id,
      }).then((response) => {
        this.$message({
          message: '删除成功!',
          type: 'success'
        });
        this.getList();
      }).catch((error) => {
      })
    },

    // 改
    edit(index, row) {
      this.reset()
      this.form = JSON.parse(JSON.stringify(row));
      this.dialogFormVisible = true
      this.title = "修改学生数据"
    },

    //查
    getList() {
      this.$axios({
        method: 'get',
        url: 'http://localhost:8088/user/userBean',
      }).then((response) => {
        this.tableData = response.data
      }).catch((error) => {
      })
    },

    //提交按钮
    submit() {
      this.$refs['form'].validate((valid) => {
        if (valid) {
          if (this.form.id == null) {
            this.$axios({
              method: 'post',
              data: this.form,
              url: 'http://localhost:8088/user/add',
            }).then((response) => {
              this.$message({
                message: '新增成功!',
                type: 'success'
              });
              this.dialogFormVisible = false
              this.getList();
            }).catch((error) => {
            })
          } else {
            this.$axios({
              method: 'post',
              data: this.form,
              url: 'http://localhost:8088/user/edit',
            }).then((response) => {
              this.$message({
                message: '修改成功!',
                type: 'success'
              });
              this.getList();
              this.dialogFormVisible = false
            }).catch((error) => {
            })
          }
        } else {
          return false;
        }
      })
    }
  },
  mounted() {
    this.getList();
  }
}
</script>

<style scoped>
</style>

在这里插入图片描述
到此为止,我们的功能应该是都完成了。恭喜

六 功能展示

1.增加
在这里插入图片描述
2.删除
在这里插入图片描述

3.修改
在这里插入图片描述

七 参考资料

SpringBoot + Vue + Element 前后端分离的管理后台项目简单入门

八 总结&踩坑

  1. 创建Vue项目的时候建议还是用cmd创建吧…IDEA创建很方便也很快,但是没有router文件…要手动创建还会报错…直接使用cmd会好很多,虽然他时间长它原始但它好用啊
  2. 在编写前端的student展示页面中,注意url地址 和 后端接口要对应起来才能拿到数据!不然会出现表格,但表格里没有数据,报错:找不到数据
  3. 在前后端连接的时候有一堆功能增删改查的,建议一个一个的连接,就比如展示所有的数据,先把后端那一套连接起来,再连前端,一个个功能的在各种页面里转换,然后换不同的功能再这么走一遍(因为一下子全走完了可能会报错,但很难排查错误出在哪里)。
  4. 前后端跨域问题记得注意一下。
  5. 很不完善的一个小页面,建议大家可以找教程亲自动手试一下,会发现很多看的时候发现不出来的问题。比如可能实际过程没有教程里那么顺利,会出现各种各样奇怪问题,这很正常,先办法解决掉就好。总之搞出来还是有那么一点成就感的
  6. 就到这里,希望这篇过程记录文能给大家一点帮助?非常感谢您能看到这里!希望大家玩得开心~

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

活动 | 华院计算与数学家一起走进世界轨道交通之都-中国株洲

4月17日&#xff0c;由株洲市人民政府主办、株洲高新区管委会承办&#xff0c;华院计算技术&#xff08;上海&#xff09;股份有限公司&#xff08;以下简称“华院计算”&#xff09;协办的“制造名城、院士同行&#xff0c;数学家走进株洲”活动在湖南株洲举行。 来自中国数学…

匿名函数与gorm中的Transaction事务方法

整理下go中的匿名函数&#xff0c;项目中很多地方都在用。 1、函数类型的变量 Go中&#xff0c;函数也是一种数据类型。定义一个函数&#xff0c;把这个函数赋值给一个变量&#xff0c;这个变量就是函数类型的变量&#xff0c;用这个变量等价于直接调函数&#xff1a; packa…

算法刷题记录2

4.图 4.1.被围绕的区域 思路&#xff1a;图中只有与边界上联通的O才不算是被X包围。因此本题就是从边界上的O开始递归&#xff0c;找与边界O联通的O&#xff0c;并标记为#&#xff08;代表已遍历&#xff09;&#xff0c;最后图中剩下的O就是&#xff1a;被X包围的O。图中所有…

使用LVGL提升交互效率:基于启明智显Model3A方案的7寸智能屏用户界面(UI)设计介绍

项目概述&#xff1a; 【启明智显】&#xff0c;作为一家专注于HMI和AIoT解决方案的公司&#xff0c;我们致力于为用户提供创新、可靠且高效的产品和解决方案。近日我们推出了高性能及高性价比的HMI芯片——Model3A。芯片搭载了强大的2D图形加速引擎&#xff0c;能够提供高达7…

RNN知识体系构筑:详尽阐述其理论基础、技术架构及其在处理序列数据挑战中的创新应用

一、为什么需要RNN 尽管神经网络被视为一种强大且理论上能够近似任何连续函数的模型&#xff0c;尤其当训练数据充足时&#xff0c;它们能够在输入空间中的某个点( x )映射到输出空间的特定值( y )&#xff0c;然而&#xff0c;这并不能完全解释为何在众多应用场景中&#xff…

基于Spring Boot的新生宿舍管理系统设计与开发

基于Spring Boot的新生宿舍管理系统设计与开发 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 报修处理管理界面图&#xff0c;在报修处理管理页面…

QA测试开发工程师面试题满分问答16: 微信输入框如何设计测试用例?

可以涵盖基础功能、用户交互、编辑撤回、权限相关、网络信号、异常、并发性能和安全性等方面的测试用例&#xff1a; 基础功能&#xff1a; 验证输入框是否能够接收用户输入&#xff0c;并显示输入的文字。检查输入框是否支持常见的字符输入&#xff0c;如字母、数字、标点符号…

Unity Shader 流光 边缘光

前言 Unity2021.3.23 一、实现原理 Time控制UV的变化,再采样一张流光贴图.即可实现流光效果。 二、效果及源码展示 1.流光效果 效果描述: 1.边缘光(菲尼尔), 2.从上到下扫描光. 效果图如下: 代码如下&#xff1a; Shader "Unlit/ScanCode" {Properties{_MainTe…

【数据结构】树与二叉树、树与森林部分习题与算法设计例题

目录 【数据结构】树与二叉树部分习题与算法设计例题一、单选题二、算法设计题判断二叉树是否为完全二叉树求二叉树的最小深度 以及 二叉树树高 树与二叉树知识点文章: 【数据结构】树与二叉树&#xff08;递归法先序、中序、后序、层次遍历二叉树、二叉树的建立以及求树高的方…

必看——通配符SSL证书在线免费申请方法!

申请通配符SSL证书&#xff0c;就相当于给你的网站及所有子域名都戴上同一顶加密“帽子”&#xff0c;保护它们的安全通信。以下是三步搞定的方法&#xff1a; 第一步&#xff1a;找权威机构 就像你要找个官方认证的地方办证明一样&#xff0c;先选一家靠谱的证书颁发机构&…

软考中级网络工程师-2024上岸宝典

1.软考是什么 简单说就是计算机技术 相关的国家级证书考试&#xff0c;想听专业点给大家截一张官网的图&#xff0c;不想听废话直接往下。 同为国家级证书的&#xff1a;注册会计师、法律职业资格证、一级建筑师&#xff0c;证书的价值是比较高的。 很多人都是在求职前或者大…

产废端实时音视频监控系统在运输车辆驾驶室中的应用

实时音视频监控系统可通过在运输车辆驾驶室安装音视频摄录设备&#xff0c;实现将运输车辆内部及周围环境音视频数据通过移动网络实时回传指挥中心的功能。 前端摄录设备主要负责采集车内外的视音频信息&#xff0c;为了保障车辆及运输人员 的安全&#xff0c;应合理选择摄录设…

探索半导体测试领域:哲讯TCC智能化管理系统的应用与优势

在半导体行业中&#xff0c;封装和测试环节是至关重要的一环。半导体封装测试是指将通过测试的晶圆按照产品型号及功能需求加工得到独立芯片的过程。半导体封测包括封装和测试两个环节&#xff0c;封装是保护芯片免受物理、化学等环境因素造成的损伤&#xff0c;增强芯片的散热…

node.js-模块化

定义&#xff1a;CommonJS模块是为Node.js打包Javascript代码的原始方式。Node.js还支持浏览器和其他Javascript运行时使用的ECMAScript模块标准。 在Node.js中&#xff0c;每个文件都被视为一个单独的模块。 概念&#xff1a;项目是由很多个模块文件组成的 好处&#xff1a…

一文读懂电阻并联电路和串联电路的特性

电阻并联电路是最基本的并联电路&#xff0c;所有的电路都可以转化为电阻串联电路和电阻并联电路来了解其工作原理。并联电路和串联电路具有完全不同的特性。它们是完全不同的电路&#xff0c;不能相互等效&#xff08;电阻并联电路图&#xff09;。 串联电路 特点与特性&…

教你三招,玩转AI通用大模型ChatGPT

工欲善其事必先利其器&#xff0c;想要高效的用好ChatGPT&#xff0c;首先&#xff0c;让我们从如何与它进行有效的对话开始。要知道&#xff0c;ChatGPT并非简单的问答机器&#xff0c;而是一个可以通过交互学习和适应的智能体。那么&#xff0c;如何让ChatGPT来更好地理解我们…

用云手机运营TikTok有什么好处?

在数字化浪潮的推动下&#xff0c;社交媒体平台正重塑商业推广与品牌建设的面貌。TikTok&#xff0c;这款全球热门的短视频应用&#xff0c;已经吸引了亿万用户的瞩目。对于出海电商和品牌推广而言&#xff0c;借助云手机运营TikTok&#xff0c;能够解锁更多潜在可能&#xff0…

短视频素材哪个网站好?8个视频素材下载免费网站

在视频制作的宏大舞台上&#xff0c;寻找恰到好处的素材是每位创作者的日常挑战。高清、无水印的视频素材不仅能够让你的作品焕发光彩&#xff0c;还能在讲述故事时增添无限动力。除了蛙学府&#xff0c;这里汇集了世界各地的视频素材网站&#xff0c;每个都带有独特的魅力&…

数据结构(七)——散列表

7.5.1 散列表的基本概念 散列表&#xff08;哈希表&#xff0c;Hash Table)︰是一种数据结构。特点是∶可以根据数据元素的关键字计算出它在散列表中的存储地址 散列函数&#xff08;哈希函数)︰AddrH(key)建立了“关键字”→“存储地址”的映射关系 冲突&#xff08;碰撞)︰在…

【Linux】地址空间虚拟地址

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. 虚拟地址1.1 虚拟地址引入1.2 虚拟地址理解1.3 虚拟地址细节问题 2. 地址空间2.1 理解地址空间2.2 页表和写时拷贝 3. 进程调度 1. 虚拟地址 1.1 虚拟地址引入 先先来一个测试代码&#xff1a; 1 #include<st…