当前位置: 首页 > news >正文

第10章:权限控制与图像报表-02-图形报表(全)

2. 图形报表ECharts

2.1 ECharts简介

ECharts缩写来自Enterprise Charts,商业级数据图表,是百度的一个开源的使用JavaScript实现的数据可视化工具,可以流畅的运行在 PC 和移动设备上,兼容当前绝大部分浏览器(IE8/9/10/11,Chrome,Firefox,Safari等),底层依赖轻量级的矢量图形库 ZRender,提供直观、交互丰富、可高度个性化定制的数据可视化图表。

官网:https://echarts.apache.org/zh/index.html

下载地址:https://echarts.apache.org/zh/download.html

下载完成可以得到如下文件:

解压上面的zip文件:

我们只需要将dist目录下的echarts.js文件引入到页面上就可以使用了

2.2 5分钟上手ECharts

我们可以参考官方提供的5分钟上手ECharts文档感受一下ECharts的使用方式,地址如下:

https://echarts.apache.org/handbook/zh/get-started/

第一步:创建html页面并引入echarts.js文件

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <!-- 引入 ECharts 文件 --> <script src="echarts.js"></script> </head> </html>

第二步:在页面中准备一个具备宽高的DOM容器。

<body> <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM --> <div id="main" style="width: 600px;height:400px;"></div> </body>

第三步:通过echarts.init方法初始化一个 echarts 实例并通过setOption方法生成一个简单的柱状图

<script type="text/javascript"> // 基于准备好的dom,初始化echarts实例 var myChart = echarts.init(document.getElementById('main')); // 指定图表的配置项和数据 var option = { title: { text: 'ECharts 入门示例' }, tooltip: {}, legend: { data:['销量'] }, xAxis: { data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"] }, yAxis: {}, series: [{ name: '销量', type: 'bar', data: [5, 20, 36, 10, 10, 20] }] }; // 使用刚指定的配置项和数据显示图表。 myChart.setOption(option); </script>


效果如下:

2.3 查看ECharts官方实例

ECharts提供了很多官方实例,我们可以通过这些官方实例来查看展示效果和使用方法。

官方实例地址:https://echarts.apache.org/examples/zh/index.html

可以点击具体的一个图形会跳转到编辑页面,编辑页面左侧展示源码(js部分源码),右侧展示图表效果,如下:

要查看完整代码可以点击右下角的Download按钮将完整页面下载到本地。

通过官方案例我们可以发现,使用ECharts展示图表效果,关键点在于确定此图表所需的数据格式,然后按照此数据格式提供数据就可以了,我们无须关注效果是如何渲染出来的。

在实际应用中,我们要展示的数据往往存储在数据库中,所以我们可以发送ajax请求获取数据库中的数据并转为图表所需的数据即可。

3. 会员数量折线图

3.1 需求分析

会员信息是体检机构的核心数据,其会员数量和增长数量可以反映出机构的部分运营情况。通过折线图可以直观的反映出会员数量的增长趋势。本章节我们需要展示过去一年时间内每个月的会员总数据量。展示效果如下图:

3.2 完善页面

会员数量折线图对应的页面为/pages/report_member.html。

3.2.1 导入ECharts库

第一步:将echarts.js文件复制到health_backend工程的plugins目录下

第二步:在report_member.html页面引入echarts.js文件

<script src="../plugins/echarts/echarts.js"></script>
3.2.2 参照官方实例导入折线图
<div class="box"> <!-- 为 ECharts 准备一个具备大小(宽高)的 DOM --> <div id="chart1" style="height:600px;"></div> </div>
<script type="text/javascript"> // 基于准备好的dom,初始化echarts实例 var myChart1 = echarts.init(document.getElementById('chart1')); //发送ajax请求获取动态数据 axios.get("/report/getMemberReport.do").then((res)=>{ myChart1.setOption( { title: { text: '会员数量' }, tooltip: {}, legend: { data:['会员数量'] }, xAxis: { data: res.data.data.months }, yAxis: { type:'value' }, series: [{ name: '会员数量', type: 'line', data: res.data.data.memberCount }] }); }); </script>

根据折线图对数据格式的要求,我们发送ajax请求,服务端需要返回如下格式的数据:

{ "data":{ "months":["2019.01","2019.02","2019.03","2019.04"], "memberCount":[3,4,8,10] }, "flag":true, "message":"获取会员统计数据成功" }

3.3 后台代码

3.3.1 Controller

在health_backend工程中创建ReportController并提供getMemberReport方法

package com.liusp.controller; import com.alibaba.dubbo.config.annotation.Reference; import com.liusp.constant.MessageConstant; import com.liusp.entity.Result; import com.liusp.service.MemberService; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.*; /** * 统计报表 */ @RestController @RequestMapping("/report") public class ReportController { @Reference private MemberService memberService; /** * 会员数量统计 * @return */ @RequestMapping("/getMemberReport.do") public Result getMemberReport(){ //获得日历对象 Calendar calendar = Calendar.getInstance(); calendar.add(Calendar.MONTH,-12);//获得当前日期之前12个月的日期 List<String> list = new ArrayList<>(); for(int i=0;i<12;i++){ calendar.add(Calendar.MONTH,1); list.add(new SimpleDateFormat("yyyy.MM").format(calendar.getTime())); } Map<String,Object> map = new HashMap<>(); map.put("months",list); List<Integer> memberCount = memberService.findMemberCountByMonth(list); map.put("memberCount",memberCount); return new Result(true, MessageConstant.GET_MEMBER_NUMBER_REPORT_SUCCESS,map); } }
3.3.2 服务接口

在MemberService服务接口中扩展方法findMemberCountByMonth

public List<Integer> findMemberCountByMonth(List<String> month);
3.2.3 服务实现类

在MemberServiceImpl服务实现类中实现findMemberCountByMonth方法

//根据月份统计会员数量 public List<Integer> findMemberCountByMonth(List<String> month) { List<Integer> list = new ArrayList<>(); for(String m : month){ m = m + ".31";//格式:2019.04.31 Integer count = memberDao.findMemberCountBeforeDate(m); list.add(count); } return list; }
3.3.4 Dao接口

在MemberDao接口中扩展方法findMemberCountBeforeDate

public Integer findMemberCountBeforeDate(String date);
3.3.5 Mapper映射文件

在MemberDao.xml映射文件中提供SQL语句

<!--根据日期统计会员数,统计指定日期之前的会员数。&lt;是<号转义字符--> <select id="findMemberCountBeforeDate" parameterType="string" resultType="int"> select count(id) from t_member where regTime &lt;= #{value} </select>

修改main.html 左侧导航,点击会员数量统计跳转到我们的report_member.html页面

{ "path": "5", //菜单项所对应的路由路径 "title": "统计分析", //菜单项名称 "icon":"fa-heartbeat", "children":[//是否有子菜单,若没有,则为[] { "path": "/5-1", "title": "会员数量统计", "linkUrl":"report_member.html", "children":[] } ] }
http://www.jsqmd.com/news/1393821/

相关文章:

  • AI科技热点日报 | 2026年8月14日
  • 从0到1掌握DOM Distiller:Chrome阅读器模式核心技术完全指南
  • SealSui-Auto-Bot开发者指南:贡献代码与功能扩展教程
  • drawsvg与Jupyter完美结合:打造交互式SVG绘图体验的实用指南
  • 市面上正规的超声C扫描系统供应商检测案例,水浸超声C扫描系统/碳纤维超声C扫描系统,超声C扫描系统制造商哪家** - 企业权威推荐大使
  • klogg日志分析终极指南:如何快速检索10GB级日志文件(安装、搜索与实时监控全攻略)
  • 2026年南通海门区GEO服务商代理加盟怎么选?本地服务商与企业的AI获客指南 - 子柔传媒
  • SDT与代码生成:becoming-a-compiler-engineer项目中的语义分析实战
  • 2026年南通启东GEO服务商代理加盟怎么选?GEO城市合伙人模式推荐 - 企业新闻快传
  • 知漫剧分集剧本时长调整教程:短视频适配与节奏优化
  • PyTorch 分布式工具选型,要比较数值与通信路径
  • corvu:SolidJS终极UI原语库——解锁无障碍设计与高度定制化开发新体验
  • Verbalized Sampling CLI工具使用教程:3步完成创意写作与对话模拟
  • FanControl风扇控制终极指南:从安装到进阶,轻松打造个性化PC散热方案
  • PDF补丁丁实战全攻略:8个免费技巧,解决书签、解锁、合并与页面统一难题
  • GEO 培训选哪家:【沐晞甄选】砺学求真 - 松梢月冷
  • ComfyUI-Workflows-ZHO:20类50+中文工作流,从0到1快速出图怎么玩
  • 2026年镇江市丹徒区国内GEO服务商代理加盟靠谱推荐:加盟选型指南与避坑全解析 - 企业新闻快传
  • 知漫剧AI画面修复教程:生成瑕疵排查与手动调整实践
  • Vim-Addon-Manager高级技巧:从新手到专家的完整进阶之路
  • 食品测糖设备租赁哪家专业?订阅式仪器服务选择指南 - 生活动态圈
  • 为什么选择gpt-macro?10个让Rust开发效率倍增的理由
  • Bow Free Monad实战:构建可测试的复杂业务逻辑
  • 从“三个品牌的摄像头吵架“说起:用WVP-GB28181-Pro搭建免费开源视频监控平台的完整手记
  • 成都市民好评如潮!26年坚持“服务好每一个客户”,包包变现首选平台 - 大牌茶话会
  • 抢红包总是慢半拍?微信红包助手开源插件完整上手指南
  • 多智能体协作研究指南:基于hanabi_learning_environment的实验设计
  • 广州 GEO 培训哪家好:【沐晞甄选】德教相彰 - 秋山寄远
  • 禹州恒达滨河府口碑靠谱装修公司推荐 - 猜不透的vv
  • 免费离线语音转文字新选择:Buzz 如何一步到位搞定会议、字幕与翻译