• vue+springboot 前后分离简单crud的基础流程


    vuedemo

    vue create 项目名

    创建一个空的vue2的项目

    交由git托管

    在文件夹中使用git init 来交给git管理

    然后连接远程仓库

    $ git remote add origin    git@gitee.com:kang369/company-test.git
    
    • 1

    git remote add origin 仓库地址

    git pull 拉取仓库中已经存在的代码

    拉取的时候可能会发生错误可以使用

    $ $git pull origin master --allow-unrelated-histories

    拉取远程仓库中的所有代码

    然后将所有的文件添加到缓存区,

    git add 文件

    然后提交到本地仓库 git commit -m“注释”

    然后将本地仓库中的数据push到远程仓库

    git push -u origin master

    此时就可以在远程仓库中看到提交的代码了

    编写vuedemo

    需要使用的插件

    vuex 用于跨组件信息传递, npm i --save vuex@3 ————放在store文件夹下

    elm插件,前端元素 npm i element-ui -S

    vuerouter,路由跳转 npm i vue-router@3.2.0 ————放在router文件夹下

    数据方面先由自己伪造一些

    axios,跨服务器获取数据 npm install axios

    然后创建各个组件所需要使用的文件夹

    首先配置路由

    //引入vue核心
    import Vue from "vue";
    //引入路由
    import VueRouter from "vue-router";
    //将路由组件添加到vue核心中
    Vue.use(VueRouter)
    
    const router= new VueRouter({
        mode:'history',
        //routes存储的数据对象是一个数组,其中的存储元素类型为对象
        routes:[
            {
            //    
            }
        ]
    })
    
    //暴露
    export default router
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    将编写好的路由配置文件添加到main.js这个核心配置中,

    import Vue from 'vue'
    import App from './App.vue'
    //导入路由的配置文件
    import router from "@/router";
    
    Vue.config.productionTip = false
    
    
    new Vue({
      render: h => h(App),
      //将路由注册到核心配置文件中
      router
    }).$mount('#app')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    配置vuex

    //引入vue核心
    import Vue from "vue";
    //引入vuex
    import vuex from "Vuex";
    
    Vue.use(vuex)
    
    //创建vuex的四大核心
    
    const state={
    //        用于存储数据,类似于数据库
    };
    const actions={
    //    用于调用mutations中的方法,类似于service
    };
    const mutations={
    //    真正操作state中数据的地方,类似于mapper
    };
    const getters={
    //    传递比较复杂的需要计算处理之后的数据
    }
    
    //创建并暴露一个store实例
    new vuex.Store({
        state,
        actions,
        mutations,
        getters
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    安装elmui

    先使用npm安装npm i element-ui -S

    然后在main.js中 进行配置,然后在使用全局引用

    import Vue from 'vue'
    import App from './App.vue'
    import ElementUI from 'element-ui';
    import 'element-ui/lib/theme-chalk/index.css';
    Vue.use(ElementUI);
    Vue.use(Element, { size: 'small', zIndex: 3000 });
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    安装axios

    使用axios进行跨服务器读取数据

    即前端页面和后端数据存储在不同的服务器上,安装之后需要在main.js中,引入axios

    import axios from "axios";
    //设置全局的axios
    Vue.prototype.$axios = axios
    //设置基本路径
    axios.defaults.baseURL='/api'
    
    • 1
    • 2
    • 3
    • 4
    • 5

    然后在vue.config.js中添加代理服务器,即受到以某个开头的链接的时候,就走代理服务器

    devServer: {
      proxy: {
        '/api': {
            // 匹配所有以 '/api1'开头的请求路径
          target: 'http://localhost:8081',// 代理目标的基础路径
          changeOrigin: true, //开启代理服务器
          pathRewrite: {'^/api': ''} //将链接中的/api重写
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    前后端分离的CRUD

    在组件中的使用

    注意这里使用that是为了避免一种加载的异常

    列表的加载

      created() {
            const that=this
            axios.get('/user/list').then(res=>{
                that.tableData1=res.data;
            }).catch(function (error) {
                console.log(error)
            })
        },
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    这样就会将该链接转发到指定的代理服务器,通过then回调,使用进而将后端返回的数据存储在data中的对应数据

    添加

    通过axios发送带有带有参数的请求到后端

    	
    		data(){
                return{
                    user:{
                        email:'',
                        username:'',
                        password:''
                    }
                }
            },
    
    addUser(){
        const that=this;
        this.$axios.post('/user/add',that.user).then(res=>{//这里是直接将user实体作为参数进行传递
            alert(res.data)
            this.$router.push('/')  //点击过弹窗之后,跳转到指定的页面
        }),err=>{
            console.log(err)
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    当输入添加的实体新不包含id的时候,需要注意,

    需要在后端的id上添加一个注解,让其自动的增加,以此来保证数据的完整性

    @TableId(value = "id",type = IdType.AUTO)
    private String id;
    
    • 1
    • 2

    删除

    当前端只传递回来一个值时,如果使用一个实体来接收的话,可能报415错误,这时就需要使用如下接收方式

    //前端
     <template slot-scope="scope">
    <el-button
                 size="mini"
                 type="danger"
                  @click="handleDelete(scope.$index, scope.row)">删除</el-button>
     </el-table-column>
     
          handleDelete(index, row) {
         //这里的index是当前按钮所处记录的索引值,row是获取当前按钮所在的记录的详细数据
                    console.log(index);
                    const userid=row.id;
                    alert(userid)
                        //这里只需要传递一个id返回给后端即可
                    axios.post('/user/delete',userid).then(res=>{
                        alert(res.data)
                        this.$router.push('/')
                    }),err=>{
                        console.log(err)
                    }
                }
    //后端
    
    @PostMapping("/delete")
    public String deleteUser(@RequestBody String id){
        System.out.println("+++++++++++++++++"+id);
        boolean b = userService.removeById(id);
        if (b){
            return new String("删除成功");
        }else {
            return new String("删除失败");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    修改

    需要携带数据,跳转到新的页面,这就涉及到了路由带参跳转

    命名路由
    {
          name: "editCom",
          path: '/edit',
          component: editCom
    }
    
    
    带参的时候可以采用命名路由跳转传参,————params必须搭配命名路由使用
    // 命名的路由   params相当与发送了一次post请求,请求参数则不会显示,并且刷新页面之后参数会消失
    this.$router.push({ name:'Login', params: { id: this.id } )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    通过this.$router.push(参数)

    push的后边可以跟对象,也可以跟字符串,

    //按钮页
    
    
    <el-button
                 type="primary"
                 size="mini"
                 @click="handleEdit(scope.$index, scope.row)">  编辑	</el-button>
    
    methods:{
        
    handleEdit(index, row) {
        console.log(index, row);
        console.log(row)
    	//这里采用push(对象的形式)来传递参数
        this.$router.push({name:'editCom',params:{id:row.id,email:row.email,password:row.password,username:row.username}})
    },
    }
    
    //信息回显——修改页面
    <div>
            id:  <el-input v-model="user.id" placeholder="email"></el-input>
            请输入邮箱:  <el-input v-model="user.email" placeholder="email"></el-input>
            请输入用户名:  <el-input v-model="user.username" placeholder="username"></el-input>
            请输入密码:  <el-input v-model="user.password" placeholder="password"></el-input>
            <el-row>
                <el-button type="primary" @click="edit">更新</el-button>
            </el-row>
        </div>
    		//这里利用钩子,created阶段可以读取操作到data中的数据 利用$route或链接中的参数
    	created() {
                const that=this
                that.user.id=this.$route.params.id
                that.user.email=this.$route.params.email
                that.user.username=this.$route.params.username
                that.user.password=this.$route.params.password
       },
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    查找

    <el-input v-model="searchData" placeholder="请输入id进行查询"></el-input>
    <el-button
            type="primary"
            size="mini"
            @click="searchM(searchData)">查找</el-button>
     data() {
                return {   
                    tableData1: [
                        {
                            id:1,
                            email:'229@qq.com',
                            username:'jk',
                            password:'123'
                        }
                    ]   
                }
            },
    
    searchM(item){   
    	axios.post('/user/search',item).then(res=>{
         //注意后端返回的数据要是一个集合,然后将请求响应的数据赋值给
           this.tableData1=res.data
    	})
    },    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    后端代码

    @PostMapping("/search")
    public List<User> searchUser(@RequestBody String id){
        User user = userService.getById(id);
        LinkedList<User> users = new LinkedList<>();
        if (user!=null){
             users.add(user);
             return users;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    关于VUE报错

    Uncaught (in promise) NavigationDuplicated: Avoided redundant navigation to current location

    :重复点击导航时,控制台出现报错 ,虽然不影响功能使用,但也不能坐视不管。

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s8tSz7Xo-1659409832959)(C:\Users\Lenovo\AppData\Roaming\Typora\typora-user-images\image-20220704105853291.png)]

    解决方案:

    方案一:只需在 router 文件夹下,添加如下代码:

    // src/router/index.js
    Vue.use(Router)
    const router = new Router({
      routes
    })
     
    const VueRouterPush = Router.prototype.push
    Router.prototype.push = function push (to) {
      return VueRouterPush.call(this, to).catch(err => err)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Required request body is missing: public错误

    在后端使用Requestbody时需要使用post提交,不能使用get提交

    如果使用get提交就会出现这个问题,修改为使用post提交即可

    解决方案:

    方案一:只需在 router 文件夹下,添加如下代码:

    // src/router/index.js
    Vue.use(Router)
    const router = new Router({
      routes
    })
     
    const VueRouterPush = Router.prototype.push
    Router.prototype.push = function push (to) {
      return VueRouterPush.call(this, to).catch(err => err)
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    Required request body is missing: public错误

    在后端使用Requestbody时需要使用post提交,不能使用get提交

    如果使用get提交就会出现这个问题,修改为使用post提交即可

  • 相关阅读:
    基于象鼻虫损害优化算法求解单目标无约束问题并可视化分析(Matlab代码实现)
    一、基础知识(3)-共轭函数、次梯度
    Identity Server 4客户端认证控制访问API
    杰理之 DAC详细配置【篇】
    c语言进制转换表
    分享给自媒体人:做自媒体最好的心态
    蓝桥杯2023年-阶乘的和(数学推理,C++)
    SAP 财务月结之 外币评估(TCODE:FAGL_FC_VAL,S4版本用 FAGL_FCV)<转载>
    数据处理:Numpy & Pandas(1)
    英伟达经济学:云服务商在GPU上每花1美元 就能赚7美元
  • 原文地址:https://blog.csdn.net/Lemon_JK/article/details/126118543