springboot整合vue2实现简单的新增删除,整合ECharts实现图表渲染

news/2024/7/10 2:06:17 标签: spring boot, windows, vue

先看效果图:

1.后端接口

 //    查询所有商品信息
//    @CrossOrigin(origins = "*")
    @RequestMapping("/list1")
    @ResponseBody
    public List<Goodsinfo> list1(){
        List<Goodsinfo> list = goodsService.list();
        return list;
    }


//    删除
//    @CrossOrigin(origins = "*")
    @RequestMapping("/del")
    @ResponseBody
    public String del(int id){
        try {
            goodsService.removeById(id);
            return "删除成功";
        }catch (Exception e){
            return "删除失败";
        }
    }

//    根据条件查询
    @RequestMapping("/search")
    @ResponseBody
    public List<Goodsinfo> search(String goodsname,String goodsType){
        System.out.println(goodsname+","+goodsType);
        QueryWrapper<Goodsinfo> wrapper = new QueryWrapper<>();
        wrapper.like(StringUtils.isNotBlank(goodsname),"name",goodsname).like(StringUtils.isNotBlank(goodsType),"goods_type",goodsType);
        List<Goodsinfo> list = goodsService.list(wrapper);
        for (Goodsinfo goodsinfo : list) {
            System.out.println(goodsinfo);
        }
        return list;
    }

// 添加数据
    @RequestMapping("/add")
    @ResponseBody
    public String add(@RequestBody Goodsinfo goodsinfo){
        System.out.println(goodsinfo);
        goodsService.save(goodsinfo);
        return "添加成功";
    }

2.前端页面:

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <!-- CSS only -->
    <link
      rel="stylesheet"
      href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css"
    />
    <style>
      .red {
        color: red!important;
      }
      .search {
        width: 300px;
        margin: 20px 0;
      }
      .my-form {
        display: flex;
        margin: 20px 0;
      }
      .my-form input {
        flex: 1;
        margin-right: 20px;
      }
      .table > :not(:first-child) {
        border-top: none;
      }
      .contain {
        display: flex;
        padding: 10px;
      }
      .list-box {
        flex: 1;
        padding: 0 30px;
      }
      .list-box  a {
        text-decoration: none;
      }
      .echarts-box {
        width: 600px;
        height: 400px;
        padding: 30px;
        margin: 0 auto;
        border: 1px solid #ccc;
      }
      tfoot {
        font-weight: bold;
      }
      @media screen and (max-width: 1000px) {
        .contain {
          flex-wrap: wrap;
        }
        .list-box {
          width: 100%;
        }
        .echarts-box {
          margin-top: 30px;
        }
      }
    </style>
  </head>
  <body>
    <div id="app">
      <div class="contain">
        <!-- 左侧列表 -->
        <div class="list-box">

          <!-- 添加资产 -->
          <form class="my-form">
            <input type="text" v-model="goods.name" class="form-control" placeholder="名称" />
            <input type="text" v-model="goods.price" class="form-control" placeholder="价格" />
			<input type="text" v-model="goods.intro" class="form-control" placeholder="简介" />
			<input type="text" v-model="goods.amount" class="form-control" placeholder="库存" />
			<input type="text" v-model="goods.goodsType" class="form-control" placeholder="类别" />
			<input type="text" v-model="goods.remark" class="form-control" placeholder="备注" />
            <button type="button" class="btn btn-primary" @click="add()">添加账单</button>
          </form>

          <table class="table table-hover">
            <thead>
              <tr>
                <th>编号</th>
                <th>名称</th>
                <th>价格</th>
                <th>简介</th>
				<th>库存</th>
				<th>类别</th>
				<th>备注</th>
				<th>操作</th>
              </tr>
            </thead>
            <tbody>
              <tr v-for="(item,index) in list" :key="item.id">
                <td>{{index+1}}</td>
                <<th>{{item.name}}</th>
                <th :class="{red:item.price>1}">{{item.price}}</th>
				<th>{{item.intro}}</th>
				<th>{{item.amount}}</th>
				<th>{{item.goodsType}}</th>
				<th>{{item.remark}}</th>
                <td><a href="javascript:;" @click="del(item.id)">删除</a></td>
              </tr>
             
            </tbody>
            <tfoot>
              <tr>
                <td colspan="4">消费总计: {{totalPrice}}</td>
              </tr>
            </tfoot>
          </table>
        </div>
        
        <!-- 右侧图表 -->
        <div class="echarts-box" id="main"></div>
      </div>
    </div>
    <script src="../echarts.min.js"></script>
    <script src="../vue.js"></script>
    <script src="../axios.js"></script>
    <script>
      /**
       * 接口文档地址:
       * https://www.apifox.cn/apidoc/shared-24459455-ebb1-4fdc-8df8-0aff8dc317a8/api-53371058
       * 
       * 功能需求:
       * 1. 基本渲染
       * 2. 添加功能
       * 3. 删除功能
       * 4. 饼图渲染
       */
      const app = new Vue({
        el: '#app',
        data: {
          list:[],
		  goods:{
			  name:"",
			  price:"",
			  amount:"",
			  intro:"",
			  goodsType:"",
			  remark:""
		  }
		  
        },
		computed: {
		  totalPrice () {
		    return this.list.reduce((sum, item) => sum + item.price, 0)
		  }
		},
		 created() {
			 /* axios.get("http://localhost:8080/list1")
			.then(res=>{
				console.log(res.data);
				this.list=res.data;
			})
			.catch(err=>{
				console.log(err)
			}) */
			this.getlist()
		},
		mounted() {
			this.myChart = echarts.init(document.getElementById("main"));
			this.myChart.setOption(
			{
			  title: {
			    text: '价格结构图',
			    
			    left: 'center'
			  },
			  tooltip: {
			    trigger: 'item'
			  },
			  legend: {
			    orient: 'vertical',
			    left: 'left'
			  },
			  series: [
			    {
			      name: '单价',
			      type: 'pie',
			      radius: '50%',
			      data: [
			        /* { value: 1048, name: 'Search Engine' },
			        { value: 735, name: 'Direct' },
			        { value: 580, name: 'Email' },
			        { value: 484, name: 'Union Ads' },
			        { value: 300, name: 'Video Ads' } */
			      ],
			      emphasis: {
			        itemStyle: {
			          shadowBlur: 10,
			          shadowOffsetX: 0,
			          shadowColor: 'rgba(0, 0, 0, 0.5)'
			        }
			      }
			    }
			  ]
			}
			)
			
		},
		methods:{
			// 查询所有
			getlist(){
				axios.get("http://localhost:8080/list1")
				.then(res=>{
					console.log(res.data);
					this.list=res.data;
					// 更新图表
					this.myChart.setOption({
						series: [
							{
						   /* data: [
						      { value: 1048, name: 'Search Engine' },
						      { value: 735, name: 'Direct' },
						      { value: 580, name: 'Email' },
						      { value: 484, name: 'Union Ads' },
						      { value: 300, name: 'Video Ads' }
						    ] */
							data: this.list.map(item => ({ value: item.price, name: item.name}))
						  }
						  ]
					})
				})
				.catch(err=>{
					console.log(err)
				});
				
				
				
			},
			// 新增
			add(){
				axios.post("http://localhost:8080/add",this.goods)
				.then(res=>{
					console.log(this.goods);
					alert(res.data);
					this.getlist();
					this.goods={};
					/* for(var i in this.goods){
						this.goods[i] = ''
					} */
				})
			},
			// 删除
			del(id){
				if(confirm("确认删除数据?")){
					axios.get("http://localhost:8080/del?id="+id)
					.then(res=>{
						this.getlist();
					})
				}
				
			}
			
		},
		
		
      })
    </script>
  </body>
</html>


http://www.niftyadmin.cn/n/5182800.html

相关文章

python图神经网络,注意力机制、Transformer模型、目标检测算法、强化学习等

近年来&#xff0c;伴随着以卷积神经网络&#xff08;CNN&#xff09;为代表的深度学习的快速发展&#xff0c;人工智能迈入了第三次发展浪潮&#xff0c;AI技术在各个领域中的应用越来越广泛 本文重点为&#xff1a;注意力机制、Transformer模型&#xff08;BERT、GPT-1/2/3/…

2023年人工智能还好找工作吗?

人工智能的就业形势并不严峻&#xff0c;相反&#xff0c;很多岗位都是供不应求的状态&#xff0c;可以看一下下面的官方数据。 脉脉高聘人才智库发布《2023泛人工智能人才洞察》&#xff0c;对23年1-8月的人工智能行业现状进行了分析总结。 人工智能相关岗位数据&#xff1a…

【数据处理】python Matplotlib将图进行局部放大;标出所关注的局部放大子图

前言 在数据可视化中&#xff0c;很多时候需要对某一区间的数据进行局部放大&#xff0c;以获得对比度更高的可视化效果。下面利用 Python 语言的 Matplotlib 库实现一个简单的局部放大图效果。 依赖库 matplotlib&#xff1a;绘图库 numpy&#xff1a;支持大量的维度数组、…

KVM给虚拟Linux加磁盘

添加一块 qcow2的磁盘 virsh attach-disk centos /kvm/vdisks/centos-diskadd.qcow2 vdb --subdriver qcow2这个命令的含义是将一个额外的虚拟磁盘(centos-diskadd.qcow2)连接到名为centos的虚拟机上&#xff0c;并将它作为vdb设备进行挂载。 参数的含义&#xff1a; virsh:…

不懂乐理,也能扒谱,基于openvpi将mp3转换为midi乐谱(Python3.10)

所谓"扒谱"是指通过听歌或观看演奏视频等方式&#xff0c;逐步分析和还原音乐作品的曲谱或乐谱的过程。它是音乐学习和演奏的一种常见方法&#xff0c;通常由音乐爱好者、乐手或学生使用。 在扒谱的过程中&#xff0c;人们会仔细聆听音乐作品&#xff0c;辨别和记录…

ssm823基于ssm的心理预约咨询管理系统的设计与实现+vue

ssm823基于ssm的心理预约咨询管理系统的设计与实现vue 交流学习&#xff1a; 更多项目&#xff1a; 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示&#xff1a; ————————————————

你绝对需要的Facebook养号攻略,教你如何养成耐用号

Facebook 可谓是大家的“老熟人”了&#xff0c;作为全球热门的社交媒体平台&#xff0c;Facebook 一直以来都是社媒营销、跨境电商的重要阵地&#xff0c;但是很多小伙伴们在注册新账号后往往忽略了一个重要的步骤&#xff0c;也是必不可少的一步&#xff0c;那就是养号&#…

德迅云安全为您介绍关于抗D盾的一些事

抗D盾概述&#xff1a; 抗D盾是新一代的智能分布式云接入系统&#xff0c;接入节点采用多机房集群部署模式&#xff0c;隐藏真实服务器IP&#xff0c;类似于网站CDN的节点接入&#xff0c;但是“抗D盾”是比CDN应用范围更广的接入方式&#xff0c;适合任何TCP 端类应用包括&am…