会员数量折线图
需求分析
会员信息是体检机构的核心数据,其会员数量和增长数量可以反映出机构的部分运营情况。通过折线图可以直观的反映出会员数量的增长趋势。本章节我们需要展示过去一年时间内每个月的会员总数据量。展示效果如下图:
完善页面
会员数量折线图对应的页面为/pages/report_member.html。
导入ECharts库
第一步:将echarts.js文件复制到health_backend工程的plugins目录下
第二步:在report_member.html页面引入echarts.js文件
<script src="../plugins/echarts/echarts.js"></script>
参照官方实例导入折线图
<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":"获取会员统计数据成功" }
后台代码
Controller
在health_backend工程中创建ReportController并提供getMemberReport方法
package com.itheima.controller; import com.alibaba.dubbo.config.annotation.Reference; import com.itheima.constant.MessageConstant; import com.itheima.entity.Result; import com.itheima.pojo.Setmeal; import com.itheima.service.MemberService; import com.itheima.service.ReportService; import com.itheima.service.SetmealService; import com.itheima.utils.DateUtils; 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") 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); } }
服务接口
在MemberService服务接口中扩展方法findMemberCountByMonth
public List<Integer> findMemberCountByMonth(List<String> month);
服务实现类
在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; }
Dao接口
在MemberDao接口中扩展方法findMemberCountBeforeDate
public Integer findMemberCountBeforeDate(String date);
Mapper映射文件
在MemberDao.xml映射文件中提供SQL语句
<!--根据日期统计会员数,统计指定日期之前的会员数--> <select id="findMemberCountBeforeDate" parameterType="string" resultType="int"> select count(id) from t_member where regTime <= #{value} </select>