AI 摘要

本文记录 Spring Boot + Vue.js 构建 EAM 系统的第二阶段:新增 Modify.vue 组件实现资产修改,配置动态路由 /modify/:id,通过 Mock.js 提供 getById、modify、delete 接口,解决下拉框数值类型回显冲突,完成列表页编辑、删除按钮与确认对话框联动,实现资产数据的全流程模拟交互。

开发笔记

新建修改资产视图页面组件(src/views/Modify.vue),编写修改资产的表单组件,整体与新增资产的表单组件类似。

data() {
    return {
    // 定义资产对象
    zichan: {
        type: '',
            status: '',
            name: '',
            usage: '',
            place: '',
        },
        // 定义表单校验规则
    // ...
    }
},
methods: {
    // 定义根据资产id获取资产的方法
    // 资产id:路由跳转时传参
    getById() {
    axios.get('/api/zichan/getById?id=' + this.$route.params.id)
        .then(ret => {
        if(ret.data.code == 200) {
            this.zichan = ret.data.data
                } else {
                    this.$message.error('请求失败')
                }
            })
            .catch(error => {
                this.$message.error('请求失败')
            })
    }
},
created() {
    // 调用根据资产id获取资产的方法
    // 用于获取表单数据回显的数据
    this.getById()
}

修改路由配置文件(src/router/index.js),编写修改资产视图页面组件的路由配置。

{
    path: '/modify/:id',
    component: () => import('@/views/Modify.vue')
}

修改资产列表视图页面组件(src/views/List.vue),为相关按钮添加路由跳转。

<el-button type="primary" size="mini" @click="$router.push('/modify/' + scope.row.id)">编辑</el-button>

修改 Mock.js 配置文件(src/mock/index.js),编写根据资产 id 获取资产的接口,用于实现表单数据回显。

// 根据资产id获取资产
// URL包含资产id,是一个动态的URL,使用正则表达式匹配
Mock.mock(new RegExp('/api/zichan/getById'), 'get', function(options) {
    // 控制台调试输出
    // options中没有包含GET请求参数,只包含完整的URL
    // 获取GET需要自己定义方法
    console.log(options)
})

运行项目,查看效果。

Mock.js 的 mock 方法中,options 中没有包含 GET 请求参数,只包含完整的 URL,需要自己定义方法用于解析 GET 请求参数。

修改 Mock.js 配置文件(src/mock/index.js),编写根据资产 id 获取资产的接口。

// 根据资产id获取资产
// URL包含资产id,是一个动态的URL,使用正则表达式匹配
Mock.mock(new RegExp('/api/zichan/getById'), 'get', function(options) {
    let params = parseUrlParams(options.url)
    let id = params.id

    // 遍历资产列表,找到id匹配的资产
    for(let index in zichanDatabase) {
        if(zichanDatabase[index].id == id) {
            return {
                code: 200,
                message: 'success',
                data: zichanDatabase[index]
            }
        }
    }
})

// URL参数解析方法
const parseUrlParams = urlStr => {
    let query = urlStr.split('?')[1]
    let searchParams = new URLSearchParams(query)

    let json = {};
    for (let [key, value] of searchParams.entries()) {
        json[key] = value;
    }
    return json;
}

运行项目,查看效果。

此时表单数据回显的效果,下拉框组件的回显存在问题。下拉框组件使用 v-model 绑定的数据来自 API 接口,是一个数值类型的数据。而 el-option 中的 value 却是一个 String 类型的数据,数据类型不匹配,下拉框组件的回显绑定失效。

修改资产列表视图页面组件(src/views/List.vue),使用 v-bind 绑定下拉框组件中的选项的 value 属性。

<el-option label="固定资产" :value="0"></el-option>

运行项目,查看效果。

修改 Mock.js 配置文件(src/mock/index.js),编写修改资产的接口。

// 修改资产
Mock.mock('/api/zichan/modify', 'put', function(options) {
    let params = JSON.parse(options.body)

    for(let index in zichanDatabase) {
        if(zichanDatabase[index].id == params.id) {
            // 修改原有的资产数据
            zichanDatabase[index].type = params.type
            zichanDatabase[index].status = params.status
            zichanDatabase[index].name = params.name
            zichanDatabase[index].usage = params.usage
            zichanDatabase[index].place = params.place

            return {
                code: 200,
                message: 'success'
            }
        }
    }

    return {
        code: -1,
        message: 'error'
    }
})

修改修改资产视图页面组件(src/views/Modify.vue),编写发送表单请求的方法。

methods: {
    modify() {
        this.$refs['zichanForm'].validate((valid) => {
            if (valid) {
                // 表单校验通过
                axios.put('/api/zichan/modify', this.zichan)
                    .then(ret => {
                        // code == 200即修改成功
                        if(ret.data.code == 200) {
                            this.$message.success('修改成功')
                            this.$router.push('/')
                        } else {
                            this.$message.error('修改失败')
                        }
                    })
                    .catch(error => {
                        this.$message.error('请求失败')
                    })
            } else {
                return false
            }
        })
    },
    // ...
}

修改修改资产视图页面组件(src/views/Modify.vue),为相关按钮绑定点击事件。

<el-button type="primary" @click="modify">提交</el-button>

运行项目,查看效果。

修改 Mock.js 配置文件(src/mock/index.js),编写删除资产列表的接口。

// 删除资产
Mock.mock(new RegExp('/api/zichan/delete'), 'delete', function(options) {
    let params = parseUrlParams(options.url)
    let id = params.id

    for(let index in zichanDatabase) {
        if(zichanDatabase[index].id == id) {
            // 使用splice删除资产
            // 参数1:删除的起始位置
            // 参数2:删除个数
            zichanDatabase.splice(index, 1)
            return {
                code: 200,
                message: 'success'
            }
        }
    }

    return {
        code: -1,
        message: 'error'
    }
})

修改资产列表视图页面组件(src/views/List.vue),添加删除数据请求的方法。

methods: {
    // ...
    // 定义删除资产的方法
    deleteById(id) {
        this.$confirm('此操作将永久删除该资产, 是否继续?', '提示', {
            confirmButtonText: '确定',
            cancelButtonText: '取消',
            type: 'warning'
        }).then(() => {
            // 点击确定,发送请求
            axios.delete('/api/zichan/deleteById?id=' + id)
                .then(ret => {
                    // code == 200即删除成功
                    if(ret.data.code == 200) {
                        this.$message.success('删除成功')
                        // 重新获取资产列表
                        this.getList()
                    } else {
                        this.$message.error('删除失败')
                    }
                })
                .catch(error => {
                    this.$message.error('请求失败')
                   })
        })
    }
}

修改资产列表视图页面组件(src/views/List.vue),为相关按钮绑定点击事件。

<el-button type="danger" size="mini" @click="deleteById(scope.row.id)">删除</el-button>

运行项目,查看效果。