赞
踩
前端已经开发了删除按钮,后端要有对应的接口实现。
在工作中,所有的删除都应该是逻辑删除,不能用物理硬删除。
mybatis-plus支持逻辑删除的配置,配置步骤如下:
mybatis-plus:
global-config:
db-config:
logic-delete-value: 1
logic-not-delete-value: 0
logic-delete-value: 1
这个配置项定义了当一个记录被逻辑删除时,其逻辑删除字段(通常是一个布尔型或整型字段)的值应该是多少。在这个例子中,如果一个记录的逻辑删除字段值为1,那么框架认为这个记录是被逻辑删除的。
logic-not-delete-value: 0
这个配置项定义了当一个记录未被逻辑删除时,其逻辑删除字段的值应该是多少。在这个例子中,如果一个记录的逻辑删除字段值为0,那么框架认为这个记录是有效的,没有被逻辑删除。
在mybatis-plus3.1.1版本后,无需此步骤,我用的3.2,所以这步可以省略。
商品分类表中用showStatus字段表示记录是否逻辑删除。
所以在对应的实体类CategoryEntity.java中showStatus字段上加上注解。
这里需要说明的是,如果表示逻辑删除的值和全局配置不一致,可以在注解上单独配置。
比如全局配置中1表示已删除
,而三级分类表1表示未删除
,产生了冲突,解决冲突的办法就是在注解上通过val和delVal
字段进行设置。
@RequestMapping("/delete")
public R delete(@RequestBody Long[] catIds){
// categoryService.removeByIds(Arrays.asList(catIds));
categoryService.removeMenuByIds(Arrays.asList(catIds));
return R.ok();
}
removeMenuByIds是新实现的方法,逆向工程生成的方法removeByIds
缺少必要的校验,我们不用这个方法。
@Override
public void removeMenuByIds(List<Long> ids) {
baseMapper.deleteBatchIds(ids);
}
重启product服务,在postman中通过网关调用删除接口。
在category.vue
模块中,remove
方法如下。
remove(node, data) { var ids = [node.catId]; this.$confirm( `确定对[id=${ids.join(",")}]进行[${id ? "删除" : "批量删除"}]操作?`, "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", } ) .then(() => { this.$http({ url: this.$http.adornUrl("/product/category/delete"), method: "post", data: this.$http.adornData(ids, false), }).then(({ data }) => { if (data && data.code === 0) { this.$message({ message: "操作成功", type: "success", duration: 1500, onClose: () => { console.log("删除成功,关闭消息提示"); this.getMenus(); }, }); } else { this.$message.error(data.msg); } }); }) .catch(() => {}); },
在删除前弹窗提示是否确认删除,确认后,调用接口,把要删除的分类Id传递给后端,后端软删除对应分类记录。
后续会频繁使用httpget和httppost请求,为了提高效率,可以配置到模板中。
"http-get 请求": { "prefix": "httpget", "body": [ "this.\\$http({", "url: this.\\$http.adornUrl(''),", "method: 'get',", "params: this.\\$http.adornParams({})", "}).then(({data}) => {", "})" ], "description": "httpGET 请求" }, "http-post 请求": { "prefix": "httppost", "body": [ "this.\\$http({", "url: this.\\$http.adornUrl(''),", "method: 'post',", "data: this.\\$http.adornData(data, false)", "}).then(({ data }) => { });" ], "description": "httpPOST 请求" }
这样只要输入httppost
和httpget
,vscode
就可以给出提示,确认后就可以自动插入模板代码,代替手敲,极大的提高编码效率。
在页面上点击电子书
分类后的delete
按钮,弹出如下提示。
点击确定,提示删除成功。
在后台数据产看cat_id
为165
的数据,show_status=0
说明已经被逻辑删除。
this.getMenus();
重新查询分类数据刷新界面。el-tree
组件的default-expanded-keys
,用来指定需要展开的节点的id。default-expanded-keys="expandedKeys"
。expandedKeys: []
。this.expandedKeys = node.parent.data.catId; // 重置展开节点
。Category.vue完整代码。
<template> <el-tree node-key="catId" :data="menus" :props="defaultProps" :expand-on-click-node="false" show-checkbox default-expanded-keys="expandedKeys" > <span class="custom-tree-node" slot-scope="{ node, data }"> <span>{{ node.label }}</span> <span> <el-button v-if="node.level <= 2" size="mini" @click="() => append(data)" > Append </el-button> <el-button v-if="node.childNodes.length == 0" type="text" size="mini" @click="() => remove(node, data)" > Delete </el-button> </span> </span> </el-tree> </template> <script> export default { components: {}, props: {}, data() { return { menus: [], expandedKeys: [], defaultProps: { children: "children", label: "name", }, }; }, methods: { append(data) { console.log(data); }, remove(node, data) { console.log(node, data); var ids = [node.data.catId]; this.$confirm( `确定对[id=${ids.join(",")}]进行[${ids.length == 1 ? "删除" : "批量删除"}]操作?`, "提示", { confirmButtonText: "确定", cancelButtonText: "取消", type: "warning", } ) .then(() => { this.$http({ url: this.$http.adornUrl("/product/category/delete"), method: "post", data: this.$http.adornData(ids, false), }).then(({ data }) => { if (data && data.code === 0) { this.$message({ message: "操作成功", type: "success", duration: 1500, onClose: () => { console.log("删除成功,关闭消息提示"); this.getMenus(); // 重新获取数据 this.expandedKeys = node.parent.data.catId; // 重置展开节点 }, }); } else { this.$message.error(data.msg); } }); }) .catch(() => {}); }, // 获取分类数据 getMenus() { this.dataListLoading = true; this.$http({ url: this.$http.adornUrl("/product/category/list/tree"), method: "get", }).then(({ data }) => { console.log(data); this.dataListLoading = false; this.menus = data.data; }); }, }, created() { this.getMenus(); // 获取分类数据 }, }; </script> <style scoped> </style>
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。