springboot+vue前后端分离项目-项目搭建13-树形表

news/2024/11/16 12:25:54/文章来源:https://www.cnblogs.com/xiexieyc/p/18305811

效果

一、后端

1. 新建表category

 2.新建entity,com/example/demo/entity/Category.java

3.新建Mapper,com/example/demo/mapper/CategoryMapper.java

 4.新建Controller,com/example/demo/controller/CategoryController.java

主要代码逻辑如下, 封装成List<Category>,前端结合element plus就能显示,这里主要是有一段递归逻辑

package com.example.demo.controller;import com.example.demo.common.Result;
import com.example.demo.entity.Category;
import com.example.demo.mapper.CategoryMapper;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.*;import java.util.ArrayList;
import java.util.List;@RestController
@RequestMapping("/category")
public class CategoryController {//正常Mapper是在Service里引用,Controllerl里引用Service,本案例是为了方便调用,非正规操作
    @ResourceCategoryMapper categoryMapper;@PostMappingpublic Result<?> save(@RequestBody Category category){categoryMapper.insert(category);return Result.success();}@PutMappingpublic Result<?> update(@RequestBody Category category){categoryMapper.updateById(category);return Result.success();}@DeleteMapping("/{id}")public Result<?> delete(@PathVariable Long id){categoryMapper.deleteById(id);return Result.success();}@GetMappingpublic Result<?> getAll(){List<Category> allCategories = categoryMapper.selectList(null);return Result.success(loopQuery(null,allCategories));}private List<Category> loopQuery(Integer pid, List<Category> allCategories) {List<Category> categoryList = new ArrayList<>();for (Category category : allCategories) {if (pid == null){if (category.getPid() == null){categoryList.add(category);category.setChildren(loopQuery(category.getId(), allCategories));}} else if (pid.equals(category.getPid())) {categoryList.add(category);category.setChildren(loopQuery(category.getId(), allCategories));}}return categoryList;}
}

二、前端

1.新建vue/src/views/Category.vue

<template><div style="width: 100%; padding: 10px"><div style="margin: 10px 0"><el-button type="primary" @click="add()" v-if="user.role === 1">新增</el-button><!--管理员才有新增按钮--></div><el-table v-loading="loading" :data="tableData" border stripe style="width: 100%"row-key="id" default-expand-all><el-table-column prop="name" label="名称" /><el-table-column label="操作"><template #default="scope"><el-button link type="primary" size="small" @click="handleEdit(scope.row)" v-if="user.role === 1">编辑</el-button><el-popconfirm title="确认删除吗?" @confirm="handleDelete(scope.row.id)" v-if="user.role === 1"><template #reference><el-button link type="danger" size="small">删除</el-button></template></el-popconfirm></template></el-table-column></el-table><el-dialog v-model="dialogVisible" title="分类编辑" width="30%"><el-form label-width="auto" :model="form" style="width: 600px"><el-form-item label="名称"><el-input v-model="form.name" style="width: 80%"></el-input></el-form-item></el-form><template #footer><div class="dialog-footer"><el-button @click="dialogVisible = false">取 消</el-button><el-button type="primary" @click="save">确 定</el-button></div></template></el-dialog></div>
</template><script>import request from "@/utils/request";export default {name: 'Category',components: {},data() {return {user: {},loading: false,form: {},dialogVisible: false,tableData: []}},created() {let userStr = sessionStorage.getItem("user") || {}this.user = JSON.parse(userStr)// 请求服务器,确认当前登录用户的合法性request.get("/user/" + this.user.id).then(res => {if (res.data === '0'){this.user = res.data}})this.load()},methods: {load() {this.loading = truerequest.get("/category").then(res=>{this.loading = falsethis.tableData = res.data})},add(){this.dialogVisible = truethis.form = {}},save(){if(this.form.id){  //更新request.put("/category", this.form).then(res => {console.log(res)if(res.code === '0'){this.$message({type: "success",message: "更新成功"})}else {this.$message({type: "error",message: "res.msg"})}this.load()      //更新后刷新表格数据this.dialogVisible = false   //关闭弹窗
        })} else {           //新增request.post("/category", this.form).then(res => {console.log(res)if(res.code === '0'){this.$message({type: "success",message: "新增成功"})}else {this.$message({type: "error",message: "res.msg"})}this.load()      //更新后刷新表格数据this.dialogVisible = false   //关闭弹窗
        })}},handleEdit(row) {this.form = JSON.parse(JSON.stringify(row))this.dialogVisible = true},handleDelete(id) {console.log(id)request.delete("/category/" + id).then(res => {if(res.code === '0'){this.$message({type: "success",message: "删除成功"})}else {this.$message({type: "error",message: "res.msg"})}this.load()      //删除后刷新表格数据
      })}}
}</script>

2.改造vue/src/components/Aside.vue 和 vue/src/router/index.js

--以上查询、编辑、删除正常

--新增功能暂时没做关联新增pid

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阶跃星辰启动「繁星计划」开放平台;运动迁移框架 MotionClone 无需训练,一键克隆视频运动丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编辑的个人观点…

[GXYCTF2019]Ping Ping Ping

[GXYCTF2019]Ping Ping Ping (命令执行绕过总结) 题目来源 收录于:BUUCTF  GXYCTF2019 题目描述提示较为明确,get方法传参127.0.0.1后结果如下比较容易想到联合执行命令,先看有哪些文件尝试直接读取flag.php读取失败,对空格进行了过滤。 题解 以下内容参考文章:htt…

Xdown 多功能多线程并发下载工具

下载地址:https://www.mediafire.com/file/942px42bad7exdf/Xdown%25E4%25B8%258B%25E8%25BD%25BD%25E5%25B7%25A5%25E5%2585%25B7.zip/file Xdown是一款超级强大且免费无广告的Torrent(BT)/磁力链/Aria2/HTTP下载工具。Xdown不光如此还支持BT做种,使用 Xdown下载器让我们跟…

MariaDb安装及登录

一、安装 ​ 及客户端 sudo apt install mariadb-server mariadb-client -y二、链接、测试 mysql -u root -p show databases;三、设置安全策略 sudo mysql_secure_installation四、配置、开启其他客户端访问 ​ 1、配置其他访问:修改配置文件 sudo vi /etc/mysql/mariadb.con…

bundletool工具使用(Android aab包安装)

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣 apk再见了,Android全新App安装格式aabhttps://github.com/google/bundletool https://github.com/google/bundletool/releaseshttps://developer.android.com/studio/command-line/bundletool#generate_apksbundletool工…

「杂文」日常 10

20240716 其实大一下早就结束了,但是一直不知道怎么咋给这篇新博开头 直到刚才:于是就得到了一个唐完了的开头 希望这几天的 noi 不会有人把操作数用 char 读,🙏

【Python】pyppeteer简单使用

爬取百度搜索python的第一页标题import sys sys.path.append("/home/user/.local/lib/python3.9/site-packages") #将包的路径添加到环境变量 import asyncio from pyppeteer import launch from pyppeteer_stealth import stealth #反检测模块,隐藏浏览器特征 imp…

[CF1616H] Keep XOR low

last dance.Last dance。 最后一篇文章,就写我两年前就看过但不敢尝试的题目吧。 首先,两数异或 \(\le x\) 的条件看起来是好维护的,显然可以 Trie 树上跑一跑,但我们发现当 \(x\) 某一位是 \(1\) 的时候非常难受,情况变得非常复杂。此时我进行了一些尝试,尝试直接刻画合…

ss

ss ​​

web直播

步骤一:开通腾讯云直播服务 步骤二:获取推流URL 想要简单获取一个推流URL,可以参考文档:快速获得地址 想要了解推流地址和直播间ID的关系,可以参考文档:后台自动拼装 想要了解如果保护自己的推流地址不被盗用,可以参考文档:防盗链签名 步骤三:获取播放URL 步骤四:配置…

通过chrony实现内网自建时间同步服务器

服务端安装chrony服务端yum install -y chrony配置chrony服务端#chrony默认配置文件路径 # yum : 一般为/etc/chrony.conf # apt : 一般为/etc/chrony/chrony.conf #在chrony.conf中加入以下行 server ntp.aliyun.com iburst manual allow 0.0.0.0/0 local stratum 8测试chrony…

【YashanDB知识库】存储过程报错snapshot too old

问题描述 20231127上午客户反馈绩效系统20231125、20231126出现2次YAS-02020 snapshot too old的问题,测试也有类似问题。 该过程是客户新增的存储过程,目的是通过PRO_RUN_JOB作为主控,调度其他存储过程,后续不用其他调度引擎。 原因分析 错误信息收集分析 分析存储过程报错…