vue+springboot实现echarts数据图统计

①vue项目修改配置

 安装依赖:

npm i echarts -S

修改路由index.js:

import Vue from 'vue'
import VueRouter from 'vue-router'
import Manager from '../views/Manager.vue'
// 解决导航栏或者底部导航tabBar中的vue-router在3.0版本以上频繁点击菜单报错的问题。
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push (location) {return originalPush.call(this, location).catch(err => err)
}
Vue.use(VueRouter)const routes = [{path: '/',name: 'manager',component: Manager,children:[{path:'orders',name:'Orders',meta:{name:'订单管理'},component:()=>import('../views/manager/Orders.vue')},{path:'charts',name:'Charts',meta:{name:'数据统计'},component:()=>import('../views/manager/Charts.vue')},{path:'logs',name:'Logs',meta:{name:'系统日志'},component:()=>import('../views/manager/Logs.vue')},{path:'notice',name:'Notice',meta:{name:'系统公告'},component:()=>import('../views/manager/Notice.vue')},{path:'news',name:'News',meta:{name:'新闻信息'},component:()=>import('../views/manager/News.vue')},{path:'newsDetail',name:'NewsDetail',meta:{name:'新闻详情页'},component:()=>import('../views/manager/NewsDetail.vue')},{path:'home',name:'Home',meta:{ name:'系统首页' },component:()=>import('../views/manager/Home.vue')},{path:'user',name:'User',meta:{ name:'用户信息' },component:()=>import('../views/manager/User.vue')},{path:'403',name:'Auth',meta:{ name:'无权限' },component:()=>import('../views/Auth.vue')},{path:'Person',name:'person',meta:{ name:'个人信息' },component:()=>import('../views/manager/Person.vue')},{path:'Password',name:'password',meta:{ name:'修改密码' },component:()=>import('../views/manager/Password.vue')}],redirect:'/home'},{path: '/about',name: 'about',// route level code-splitting// this generates a separate chunk (about.[hash].js) for this route// which is lazy-loaded when the route is visited.component: () => import(/* webpackChunkName: "about" */ '../views/AboutView.vue')},{path:'/login',name:'login',meta:{ name:'登录' },component: ()=>import('../views/login.vue')},{path:'/register',name:'register',meta:{ name:'注册' },component: ()=>import('../views/register.vue')},{path:'*',name:'404',meta:{ name:'无法访问' },component: ()=>import('../views/404.vue')}
]const router = new VueRouter({mode: 'history',base: process.env.BASE_URL,routes
})
router.beforeEach((to,from,next)=>{let adminPaths=['/user']let user=JSON.parse(localStorage.getItem('honey-user')||'{}')if(user.role !== '管理员' && adminPaths.includes(to.path)){next('/403')}else{next()}
})
export default router

修改Manager.vue:

<template><div><el-container><!--    侧边栏  --><el-aside :width="asideWidth" style="min-height: 100vh; background-color: #001529"><div style="height: 60px; color: white; display: flex; align-items: center; justify-content: center"><img src="@/assets/logo1.png" alt="" style="width: 40px; height: 40px"><span class="logo-title" v-show="!isCollapse">honey2024</span></div><el-menu :default-openeds="['info']" :collapse="isCollapse" :collapse-transition="false" router background-color="#001529" text-color="rgba(255, 255, 255, 0.65)" active-text-color="#fff" style="border: none" :default-active="$route.path"><el-menu-item index="/home"><i class="el-icon-s-home"></i><span slot="title">系统首页</span></el-menu-item><el-submenu index="info" ><template slot="title"><i class="el-icon-menu"></i><span>信息管理</span></template><el-menu-item index="/user" v-if="user.role === '管理员'">用户信息</el-menu-item><el-menu-item index="/news" v-if="user.role === '管理员'">新闻信息</el-menu-item><el-menu-item index="/notice" v-if="user.role === '管理员'">系统公告</el-menu-item><el-menu-item index="/logs" v-if="user.role === '管理员'">系统日志</el-menu-item><el-menu-item index="/charts" v-if="user.role === '管理员'">数据统计</el-menu-item><el-menu-item index="/orders">订单管理</el-menu-item></el-submenu></el-menu></el-aside><el-container><!--        头部区域--><el-header><i :class="collapseIcon" style="font-size: 26px" @click="handleCollapse"></i><el-breadcrumb separator-class="el-icon-arrow-right" style="margin-left: 20px"><el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item><el-breadcrumb-item :to="{ path: $route.path }">{{ $route.meta.name }}</el-breadcrumb-item></el-breadcrumb><div style="flex: 1; width: 0; display: flex; align-items: center; justify-content: flex-end"><i class="el-icon-quanping" style="font-size: 26px" @click="handleFull"></i><el-dropdown placement="bottom"><div style="display: flex; align-items: center; cursor: default"><img :src="user.avatar||'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png'" alt="" style="width: 40px; height: 40px; margin: 0 5px;border-radius: 50%"><span>{{user.name}}</span></div><el-dropdown-menu slot="dropdown"><el-dropdown-item @click.native="$router.push('/person')">个人信息</el-dropdown-item><el-dropdown-item @click.native="$router.push('/password')">修改密码</el-dropdown-item><el-dropdown-item @click.native="logout">退出登录</el-dropdown-item></el-dropdown-menu></el-dropdown></div></el-header><!--        主体区域--><el-main><router-view @update:user="updateUser"></router-view></el-main></el-container></el-container></div>
</template><script>
import axios from "axios";
import request from '@/utils/request'export default {name: 'HomeView',data() {return {isCollapse: false,  // 不收缩asideWidth: '200px',collapseIcon: 'el-icon-s-fold',user:JSON.parse(localStorage.getItem('honey-user')||'{}'),}},mounted() {if(!this.user.id){this.$router.push('/login')}// axios.get('http://localhost:9090/user/selectall').then(res=>{//   console.log(res.data);//   this.users=res.data.data// })// request.get('/user/selectall').then(res => {//   this.users = res.data// })},methods: {updateUser(user){this.user=JSON.parse(JSON.stringify(user))},handleFileUpload(response,file,fileList){this.fileList=fileListconsole.log(response,file,fileList)},logout() {localStorage.removeItem("honey-user")this.$router.push('/login')},handleFull() {document.documentElement.requestFullscreen()},handleCollapse() {this.isCollapse = !this.isCollapsethis.asideWidth = this.isCollapse ? '64px' : '200px'this.collapseIcon = this.isCollapse ? 'el-icon-s-unfold' : 'el-icon-s-fold'}}
}
</script><style>
.el-menu--inline {background-color: #000c17 !important;
}.el-menu--inline .el-menu-item {background-color: #000c17 !important;padding-left: 49px !important;
}.el-menu-item:hover, .el-submenu__title:hover {color: #fff !important;
}.el-submenu__title:hover i {color: #fff !important;
}.el-menu-item:hover i {color: #fff !important;
}.el-menu-item.is-active {background-color: #1890ff !important;border-radius: 5px !important;width: calc(100% - 8px);margin-left: 4px;
}.el-menu-item.is-active i, .el-menu-item.is-active .el-tooltip {margin-left: -4px;
}.el-menu-item {height: 40px !important;line-height: 40px !important;
}.el-submenu__title {height: 40px !important;line-height: 40px !important;
}.el-submenu .el-menu-item {min-width: 0 !important;
}.el-menu--inline .el-menu-item.is-active {padding-left: 45px !important;
}/*.el-submenu__icon-arrow {*/
/*  margin-top: -5px;*/
/*}*/.el-aside {transition: width .3s;box-shadow: 2px 0 6px rgba(0, 21, 41, .35);
}.logo-title {margin-left: 5px;font-size: 20px;transition: all .3s; /* 0.3s */
}.el-header {box-shadow: 2px 0 6px rgba(0, 21, 41, .35);display: flex;align-items: center;
}
</style>

新建Charts.vue:

 

Charts.vue:静态版

<template>
<div><el-row :gutter="10"><el-col :span="12"><el-card><div style="height: 400px;width: 100%" id="line"></div></el-card></el-col><el-col :span="12"><el-card><div style="height: 400px;width: 100%" id="bar"></div></el-card></el-col></el-row><el-row :gutter="10" style="margin: 10px 0"><el-col :span="12"><el-card><div style="height: 400px;width: 100%" id="pie"></div></el-card></el-col></el-row>>
</div>
</template>
<script>
import * as echarts from 'echarts';
const option = {title: {text: '订单金额统计图',left:'center'},legend: {left: 'left'},tooltip: {trigger: 'axis'},xAxis: {type: 'category',data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']},yAxis: {type: 'value'},series: [{name:'金额',data: [150, 230, 224, 218, 135, 147, 260],type: 'line',smooth:true},{name:'库存',data: [15, 20, 22, 21, 110, 160, 225],type: 'line',smooth:true}]
};
const option1 = {title: {text: '订单金额柱状图',left:'center'},legend: {left: 'left'},tooltip: {trigger: 'axis'},xAxis: {type: 'category',data: ['水果', '零食', '奶制品', '饮料', '生活用品']},yAxis: {type: 'value'},series: [{name:'金额',data: [15000, 23000, 224000, 21800, 13500, 14700, 26000],type: 'bar',smooth:true},{name:'销量',data: [1500, 2000, 2200, 2100, 11000, 16000, 22500],type: 'bar',smooth:true}]
};
const option2={title: {text: '订单销售比例图',subtext: '比例图',left: 'center'},tooltip: {trigger: 'item'},legend: {orient: 'vertical',left: 'left'},series: [{name: 'Access From',type: 'pie',center:['50%','60%'],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)'}}}]
};
export default {data(){},mounted() {let lineDom = document.getElementById('line');let lineChart = echarts.init(lineDom);lineChart.setOption(option)let barDom = document.getElementById('bar');let barChart = echarts.init(barDom);barChart.setOption(option1)let pieDom = document.getElementById('pie');let pieChart = echarts.init(pieDom);pieChart.setOption(option2)}
}
</script>
<style scoped></style>

新建Orders.vue:

<template><div><div><el-input style="width: 200px" placeholder="查询名称" v-model="name"></el-input><el-button type="primary" style="margin-left: 10px" @click="load(1)">查询</el-button><el-button type="info" @click="reset">重置</el-button></div><div style="margin: 10px 0"><el-button type="primary" plain @click="handleAdd">新增</el-button><el-button type="danger" plain @click="delBatch">批量删除</el-button></div><el-table :data="tableData" stripe :header-cell-style="{ backgroundColor: 'aliceblue', color: '#666' }" @selection-change="handleSelectionChange"><el-table-column type="selection" width="55" align="center"></el-table-column><el-table-column prop="id" label="序号" width="70" align="center"></el-table-column><el-table-column prop="no" label="编号"></el-table-column><el-table-column prop="name" label="订单名称"></el-table-column><el-table-column prop="money" label="金额" show-overflow-tooltip></el-table-column><el-table-column prop="user" label="用户"></el-table-column><el-table-column prop="date" label="创建时间"></el-table-column><el-table-column label="操作" align="center" width="180"><template v-slot="scope"><el-button size="mini" type="primary" plain @click="handleEdit(scope.row)">编辑</el-button><el-button size="mini" type="danger" plain @click="del(scope.row.id)">删除</el-button></template></el-table-column></el-table><div style="margin: 10px 0"><el-pagination@current-change="handleCurrentChange":current-page="pageNum":page-size="pageSize"layout="total, prev, pager, next":total="total"></el-pagination></div><el-dialog title="公告信息" :visible.sync="fromVisible" width="40%" :close-on-click-modal="false"><el-form :model="form" label-width="80px" style="padding-right: 20px" :rules="rules" ref="formRef"><el-form-item label="订单名称" prop="name"><el-input v-model="form.name" placeholder="名称"></el-input></el-form-item><el-form-item label="订单金额" prop="money"><el-input type="textarea" v-model="form.money" placeholder="金额"></el-input></el-form-item><el-form-item label="订单分类" prop="money"><el-select style="width: 100%" v-model="form.category"><el-option v-for="item in ['水果','蔬菜','零食','饮料','奶制品','糕点']" :key="item" :value="item"></el-option></el-select></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click="fromVisible = false">取 消</el-button><el-button type="primary" @click="save">确 定</el-button></div></el-dialog></div>
</template><script>
export default {name: "Orders",data() {return {tableData: [],  // 所有的数据pageNum: 1,   // 当前的页码pageSize: 5,  // 每页显示的个数username: '',name: '',total: 0,fromVisible: false,form: {},user: JSON.parse(localStorage.getItem('honey-user') || '{}'),rules: {name: [{ required: true, message: '请输入名称', trigger: 'blur' },],money: [{ required: true, message: '请输入金额', trigger: 'blur' },],category: [{ required: true, message: '请输入分类', trigger: 'blur' },],},ids: [],content:'',}},created() {this.load()},methods: {delBatch() {if (!this.ids.length) {this.$message.warning('请选择数据')return}this.$confirm('您确认批量删除这些数据吗?', '确认删除', {type: "warning"}).then(response => {this.$request.delete('/orders/delete/batch', { data: this.ids }).then(res => {if (res.code === '200') {   // 表示操作成功this.$message.success('操作成功')this.load(1)} else {this.$message.error(res.msg)  // 弹出错误的信息}})}).catch(() => {})},handleSelectionChange(rows) {   // 当前选中的所有的行数据this.ids = rows.map(v => v.id)},del(id) {this.$confirm('您确认删除吗?', '确认删除', {type: "warning"}).then(response => {this.$request.delete('/orders/delete/' + id).then(res => {if (res.code === '200') {   // 表示操作成功this.$message.success('操作成功')this.load(1)} else {this.$message.error(res.msg)  // 弹出错误的信息}})}).catch(() => {})},handleEdit(row) {   // 编辑数据this.form = JSON.parse(JSON.stringify(row))  // 给form对象赋值  注意要深拷贝数据this.fromVisible = true   // 打开弹窗},handleAdd() {   // 新增数据this.form = {}  // 新增数据的时候清空数据this.fromVisible = true   // 打开弹窗},save() {// 保存按钮触发的逻辑  它会触发新增或者更新this.$refs.formRef.validate((valid) => {if (valid) {this.sendSaveRequest();}})},sendSaveRequest(){this.$request({url: this.form.id ? '/orders/update': '/orders/add',method: this.form.id ? 'PUT' : 'POST',data: this.form}).then(res => {if (res.code === '200') {  // 表示成功保存this.$message.success('保存成功')this.load(1)this.fromVisible = false} else {this.$message.error(res.msg)  // 弹出错误的信息}})},reset() {this.name = ''this.load()},load(pageNum) {  // 分页查询if (pageNum)  this.pageNum = pageNumthis.$request.get('/orders/selectByPage', {params: {pageNum: this.pageNum,pageSize: this.pageSize,name: this.name}}).then(res => {this.tableData = res.data.recordsthis.total = res.data.total})},handleCurrentChange(pageNum) {this.load(pageNum)},}
}
</script><style>
.el-tooltip__popper{width: 200px !important;
}
</style>

 Charts.vue:动态版

<template>
<div><el-row :gutter="10"><el-col :span="12"><el-card><div style="height: 400px;width: 100%" id="line"></div></el-card></el-col><el-col :span="12"><el-card><div style="height: 400px;width: 100%" id="bar"></div></el-card></el-col></el-row><el-row :gutter="10" style="margin: 10px 0"><el-col :span="12"><el-card><div style="height: 400px;width: 100%" id="pie"></div></el-card></el-col></el-row>>
</div>
</template>
<script>
import * as echarts from 'echarts';
const option = {title: {text: '订单金额统计图',left:'center'},legend: {left: 'left'},tooltip: {trigger: 'axis'},xAxis: {type: 'category',data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']},yAxis: {type: 'value'},series: [{name:'金额',data: [],type: 'line',smooth:true},]
};
const option1 = {title: {text: '订单金额柱状图',left:'center'},legend: {left: 'left'},tooltip: {trigger: 'axis'},xAxis: {type: 'category',data: []},yAxis: {type: 'value'},series: [{name:'金额',data: [],type: 'bar',smooth:true},]
};
const option2={title: {text: '订单销售比例图',subtext: '比例图',left: 'center'},tooltip: {trigger: 'item'},legend: {orient: 'vertical',left: 'left'},series: [{name: '金额',type: 'pie',center:['50%','60%'],radius: '50%',data: [],label:{show:true,formatter(param){return param.name+'('+param.percent+'%)';}},emphasis: {itemStyle: {shadowBlur: 10,shadowOffsetX: 0,shadowColor: 'rgba(0, 0, 0, 0.5)'}}}]
};
export default {data(){},mounted() {let lineDom = document.getElementById('line');let lineChart = echarts.init(lineDom);let barDom = document.getElementById('bar');let barChart = echarts.init(barDom);let pieDom = document.getElementById('pie');let pieChart = echarts.init(pieDom);pieChart.setOption(option2)this.$request.get('/charts').then(res=>{option.xAxis.data=res.data?.line?.map(v=>v.date)||[]option.series[0].data=res.data?.line?.map(v=>v.value)||[]lineChart.setOption(option)option1.xAxis.data=res.data?.bar?.map(v=>v.name)||[]option1.series[0].data=res.data?.bar?.map(v=>v.value)||[]barChart.setOption(option1)option2.series[0].data=res.data?.bar||[]pieChart.setOption(option2)})}
}
</script>
<style scoped></style>

②后端配置

 新建数据库:

CREATE TABLE `orders` (`id` int(11) NOT NULL AUTO_INCREMENT,`no` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单编号',`name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单名称',`money` decimal(10,2) DEFAULT NULL COMMENT '订单金额',`userid` int(11) DEFAULT NULL COMMENT '用户ID',`category` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单分类',`date` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '订单日期',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='订单表';

 springboot项目中创建Orders实体类

package com.example.springboot.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;import java.math.BigDecimal;@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class Orders {@TableId(type = IdType.AUTO)private Integer id;private String no;private String name;private BigDecimal money;private Integer userid;private String category;private String date;@TableField(exist = false)private String user;
}

创建OrdersMapper:

 

package com.example.springboot.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.springboot.entity.Logs;
import com.example.springboot.entity.Orders;public interface OrdersMapper extends BaseMapper<Orders> {}

创建OrdersService:

package com.example.springboot.service;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.springboot.entity.Logs;
import com.example.springboot.entity.Orders;
import com.example.springboot.mapper.LogsMapper;
import com.example.springboot.mapper.OrdersMapper;
import org.springframework.stereotype.Service;@Service
public class OrdersService extends ServiceImpl<OrdersMapper, Orders> {}

创建OrdersController:

 

package com.example.springboot.controller;import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.springboot.common.HoneyLogs;
import com.example.springboot.common.LogType;
import com.example.springboot.common.Result;
import com.example.springboot.entity.Orders;
import com.example.springboot.entity.User;
import com.example.springboot.service.OrdersService;
import com.example.springboot.service.UserService;
import com.example.springboot.utils.TokenUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/orders")
public class OrdersController {@AutowiredOrdersService ordersService;@AutowiredUserService userService;/*** 新增信息*/@HoneyLogs(operation = "订单",type= LogType.ADD)@PostMapping("/add")public Result add(@RequestBody Orders orders) {User currentUser= TokenUtils.getCurrentUser();orders.setUserid(currentUser.getId());orders.setDate(DateUtil.today());orders.setNo(IdUtil.fastSimpleUUID());ordersService.save(orders);return Result.success();}/*** 修改信息*/@HoneyLogs(operation = "订单",type= LogType.UPDATE)@PutMapping("/update")public Result update(@RequestBody Orders orders) {ordersService.updateById(orders);return Result.success();}/*** 删除信息*/@HoneyLogs(operation = "订单",type= LogType.DELETE)@DeleteMapping("/delete/{id}")public Result delete(@PathVariable Integer id) {ordersService.removeById(id);return Result.success();}/*** 批量删除信息*/@HoneyLogs(operation = "订单",type= LogType.BATCH_DELETE)@DeleteMapping("/delete/batch")public Result batchDelete(@RequestBody List<Integer> ids) {ordersService.removeBatchByIds(ids);return Result.success();}/*** 查询全部信息*/@GetMapping("/selectAll")public Result selectAll() {List<Orders> ordersList = ordersService.list(new QueryWrapper<Orders>().orderByDesc("id"));return Result.success(ordersList);}@GetMapping("/selectUserData")public Result selectUserData() {QueryWrapper<Orders> queryWrapper=new QueryWrapper<Orders>().orderByDesc("id");queryWrapper.eq("open",1);List<Orders> userList = ordersService.list(queryWrapper);return Result.success(userList);}/*** 根据ID查询信息*/@GetMapping("/selectById/{id}")public Result selectById(@PathVariable Integer id) {Orders orders = ordersService.getById(id);User user=userService.getById(orders.getUserid());if(user!=null){orders.setUser(user.getName());}return Result.success(orders);}/*** 多条件模糊查询信息* pageNum 当前的页码* pageSize 每页查询的个数*/@GetMapping("/selectByPage")public Result selectByPage(@RequestParam Integer pageNum,@RequestParam Integer pageSize,@RequestParam String name) {QueryWrapper<Orders> queryWrapper = new QueryWrapper<Orders>().orderByDesc("id");  // 默认倒序,让最新的数据在最上面queryWrapper.like(StrUtil.isNotBlank(name), "name", name);Page<Orders> page = ordersService.page(new Page<>(pageNum, pageSize), queryWrapper);List<Orders> records=page.getRecords();
//        List<User> list=userService.list();for(Orders record:records){Integer authorid=record.getUserid();User user=userService.getById(authorid);
//            String author=list.stream().filter(u->u.getId().equals(authorid)).findFirst().map(User::getName).orElse("");if(user!=null){record.setUser(user.getName());}}return Result.success(page);}}

修改WebController:

package com.example.springboot.controller;import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import com.example.springboot.common.AuthAccess;
import com.example.springboot.common.HoneyLogs;
import com.example.springboot.common.LogType;
import com.example.springboot.common.Result;
import com.example.springboot.entity.Orders;
import com.example.springboot.entity.User;
import com.example.springboot.exception.ServiceException;
import com.example.springboot.service.OrdersService;
import com.example.springboot.service.UserService;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;@RestController
public class WebController {@ResourceUserService userService;@ResourceOrdersService ordersService;@AuthAccess@GetMapping("/")public Result hello(){return Result.success("success");}@HoneyLogs(operation = "用户",type = LogType.LOGIN)@PostMapping("/login")public Result login(@RequestBody User user){if(StrUtil.isBlank(user.getUsername())||StrUtil.isBlank(user.getPassword())){return Result.error("数据输入错误");}user=userService.login(user);return Result.success(user);}@HoneyLogs(operation = "用户",type = LogType.REGISTER)@AuthAccess@PostMapping("/register")public Result register(@RequestBody User user){if(StrUtil.isBlank(user.getUsername())||StrUtil.isBlank(user.getPassword())){throw new ServiceException("输入不合法");}if(user.getUsername().length()>10||user.getPassword().length()>20){throw new ServiceException("长度过长");}user=userService.register(user);return Result.success(user);}@HoneyLogs(operation = "用户",type = LogType.UPDATE)@AuthAccess@PutMapping("/password")public Result password(@RequestBody User user){if(StrUtil.isBlank(user.getUsername())||StrUtil.isBlank(user.getPhone())){throw new ServiceException("输入不合法");}userService.resetPassword(user);return Result.success();}@GetMapping("/charts")public Result charts(){List<Orders> list = ordersService.list();Set<String> dates=list.stream().map(Orders::getDate).collect(Collectors.toSet());List<String> dateList=CollUtil.newArrayList(dates);dateList.sort(Comparator.naturalOrder());List<Dict> lineList=new ArrayList<>();for(String date:dates){BigDecimal sum=list.stream().filter(orders -> orders.getDate().equals(date)).map(Orders::getMoney).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);Dict dict=Dict.create();Dict line=dict.set("date",date).set("value",sum);lineList.add(line);}Set<String> categories=list.stream().map(Orders::getCategory).collect(Collectors.toSet());List<Dict> barList=new ArrayList<>();for(String category:categories){BigDecimal sum=list.stream().filter(orders -> orders.getCategory().equals(category)).map(Orders::getMoney).reduce(BigDecimal::add).orElse(BigDecimal.ZERO);Dict dict=Dict.create();Dict bar=dict.set("name",category).set("value",sum);barList.add(bar);}Dict res=Dict.create().set("line",lineList).set("bar",barList);return Result.success(res);}
}

 

 

 

 

 

 

 

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

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

相关文章

00.OpenLayers快速开始

00OpenLayers快速开始 官方文档&#xff1a; 快速开始&#xff1a;https://openlayers.org/doc/quickstart.html 需要node环境 一、设置新项目 npm create ol-app my-app cd my-app npm start第一个命令将创建一个名为 my-app​ 的目录&#xff08;如果您愿意&#xff0c;…

Python筑基之旅-MySQL数据库(一)

目录 一、MySQL数据库 1、简介 2、优点 2-1、开源和免费 2-2、高性能 2-3、可扩展性 2-4、易用性 2-5、灵活性 2-6、安全性和稳定性 2-7、丰富的功能 2-8、结合其他工具和服务 2-9、良好的兼容性和移植性 3、缺点 3-1、对大数据的支持有限 3-2、缺乏全文…

前端面试:项目细节重难点问题分享

面试官提问&#xff1a;我现在给你出一个项目实际遇到的问题&#xff1a;由于后端比较忙&#xff0c;所以我们这边的列表数据排序需要前端最近实现&#xff0c;那你会怎么实现排序呢&#xff1f; 答&#xff1a;我的回答&#xff1a;确实&#xff0c;数据都是由后端实现的&…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-19讲 串口实验UART

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

嵌入式硬件中PCB走线与过孔的电流承载能力分析

简介 使用FR4敷铜板PCBA上各个器件之间的电气连接是通过其各层敷着的铜箔走线和过孔来实现的。 由于不同产品、不同模块电流大小不同,为实现各个功能,设计人员需要知道所设计的走线和过孔能否承载相应的电流,以实现产品的功能,防止过流时产品烧毁。 文中介绍设计和测试FR4敷…

Windows系统安装OpenSSH使用VScode远程连接内网Linux服务器开发

文章目录 &#x1f4a1;推荐 前言1、安装OpenSSH2、VS Code配置ssh3. 局域网测试连接远程服务器4. 公网远程连接4.1 ubuntu安装cpolar内网穿透4.2 创建隧道映射4.3 测试公网远程连接 5. 配置固定TCP端口地址5.1 保留一个固定TCP端口地址5.2 配置固定TCP端口地址5.3 测试固定公网…

Nginx/阿里云/二级域名的配置和使用

阿里云域名解析配置如下&#xff1a; nginx配置如下&#xff1a; 访问地址&#xff1a; zhadmin.iotzzh.com image.png

Hotcoin Research | 市场洞察:2024年5月13日-5月19日

加密货币市场表现 目前&#xff0c;加密货币总市值为1.32万亿&#xff0c;BTC占比54.41%。 本周行情呈现震荡上行的态势&#xff0c;BTC在5月15日-16日&#xff0c;有一波大的拉升&#xff0c;周末为震荡行情。BTC现价为67125美元。 上涨的主要原因&#xff1a;美国4月CPI为3…

深度学习之基于YoloV5钢材微小缺陷检测系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与目标 在钢材生产过程中&#xff0c;由于各种因素&#xff0c;钢材表面可能会出现微小缺陷&#xff…

C# OpenCvSharp 模拟生成车辆运行视频

C# OpenCvSharp 模拟生成车辆运行视频 目录 效果 项目 代码 下载 效果 项目 代码 using OpenCvSharp; using OpenCvSharp.Extensions; using System; using System.Diagnostics; using System.Drawing; using System.Windows.Forms; namespace OpenCvSharp_Demo { p…

海外云手机的运作原理和适用场景

海外云手机是一种基于云计算技术的虚拟手机服务&#xff0c;通过将手机操作系统和应用程序托管在远程服务器上&#xff0c;实现用户可以通过互联网连接来使用和管理手机功能&#xff0c;而无需实际拥有物理手机。以下是有关海外云手机的相关信息&#xff1a; 海外云手机的运作原…

树莓派3B+入门(无外设)

昨日刚到一块树莓派3B&#xff0c;甚是喜爱&#xff0c;然半宿未眠 1、下载 在官网先下载烧录文件https://www.raspberrypi.com/software/ 下载完毕打开&#xff0c;选择&#xff0c;根据自己板子型号定 操作系统用最新的就行&#xff0c;64位不太稳定 储存卡&#xff0c;需…

超声波清洗机哪家好一点?四款超一流超声波清洗机大盘点

在追求极致清洁和维护精密工具、设备及珍贵物品的时代&#xff0c;超声波清洗机显得尤为重要。不仅因其高效、快速的清洁效果&#xff0c;更因其能够触及传统手工清洁所不能及的微小缝隙。无论你是珠宝设计师、机械工程师、还是热爱生活的普通家庭用户&#xff0c;超声波清洗机…

C语言例题43、打印倒立金字塔

#include <stdio.h>void main() {int i, j;for (i 5; i > 0; i--) {for (j 5; j > i; j--) {//输出空格printf(" ");}for (j 2 * i; j > 1; j--) {//输出星号printf("* ");}printf("\n");} }运行结果&#xff1a; 本章C语言…

【高阶数据结构(四)】图的最短路径问题

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:高阶数据结构专栏⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多数据结构   &#x1f51d;&#x1f51d; 高阶数据结构 1. 前言2. 单源最短…

基于springboot实现大学生就业需求分析系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现大学生就业需求分析系统演示 摘要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲…

移动端适配(rem,vw)+响应式布局

1.1视口标签&#xff08;逻辑分辨率和设备匹配&#xff09; 1.2二倍图&#xff08;防止失真&#xff09; 二、适配方案 一、rem 1.1媒体查询 1.2、引入js文件&#xff08;remflexble.js&#xff09; 1.2、less Less 是一种动态样式语言&#xff0c;它扩展了 CSS 的功能&#…

sklearn之线性回归——以上证红利指数为例

文章目录 线性回归概念使用sklearn实现上证中立指数预测内置数据集的加载与处理 外部数据集的加载和处理数据内容数据加载和处理 开始预测分割数据集导入线性回归模型查看线性回归模型的系数绘制预测结果预测效果评估 最终代码 线性回归 线性回归&#xff08;Linear Regressio…

大数据比赛-环境搭建(二)

一、ubuntu安装google 1、下载google的Linux安装版 链接&#xff1a;https://pan.baidu.com/s/1w4Hsa1wbJDfC95fX2vU_1A 提取码&#xff1a;xms6 或者&#xff1a;Google Chrome 64bit Linux版_chrome浏览器,chrome插件,谷歌浏览器下载,谈笑有鸿儒 (chromedownloads.net) …

AI办公自动化:用kimi批量把word转换成txt文本

在Kimichat中输入提示词&#xff1a; 你是一个Python编程专家&#xff0c;要完成一个Python脚本编写的任务&#xff0c;具体步骤如下&#xff1a; 打开文件夹&#xff1a;F:\aword 读取里面docx格式的word文档&#xff0c; 提取word文档中的第一行文字作为txt文本文档的标题…