springboot(十六)echarts报表的使用

x33g5p2x  于2021-12-17 转载在 Echarts  
字(6.1k)|赞(0)|评价(0)|浏览(1308)

前言:

      在开发过程中少不了对报表的整合,虽然我们后端只提供数据,但是也避免不了自己来实现前端的可能。所以我们也得简单得了解下echarts的使用!

      接下来我们完成查询数据库并让数据生成可视化的报表!

实现:

   数据库:商品表

  1. CREATE TABLE `product` (
  2. `pid` int(11) NOT NULL AUTO_INCREMENT,
  3. `product_name` varchar(20) COLLATE utf8_bin NOT NULL DEFAULT '',
  4. `num` int(11) NOT NULL DEFAULT '0',
  5. `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  6. PRIMARY KEY (`pid`,`product_name`,`num`,`create_time`)
  7. ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

   新建项目sprinboot-echarts,打开pom.xml

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-thymeleaf</artifactId>
  5. </dependency>
  6. <!--springdata jpa-->
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-data-jpa</artifactId>
  10. </dependency>
  11. <!--web-->
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-web</artifactId>
  15. </dependency>
  16. <!--mysql-->
  17. <dependency>
  18. <groupId>mysql</groupId>
  19. <artifactId>mysql-connector-java</artifactId>
  20. <version>5.1.44</version>
  21. </dependency>
  22. <!--druid连接池-->
  23. <dependency>
  24. <groupId>com.alibaba</groupId>
  25. <artifactId>druid-spring-boot-starter</artifactId>
  26. <version>1.1.10</version>
  27. </dependency>
  28. <!--test-->
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-test</artifactId>
  32. <scope>test</scope>
  33. </dependency>
  34. <!--lombok-->
  35. <dependency>
  36. <groupId>org.projectlombok</groupId>
  37. <artifactId>lombok</artifactId>
  38. <version>1.16.22</version>
  39. </dependency>
  40. </dependencies>

  配置application.properties资源文件

  1. #配置静态资源文件路径
  2. spring.mvc.static-path-pattern=/static/**
  3. #数据库配置
  4. spring.datasource.type= com.alibaba.druid.pool.DruidDataSource
  5. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  6. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/springboot2?useUnicode=true&characterEncoding=UTF-8
  7. spring.datasource.username=root
  8. spring.datasource.password=123456
  9. #jpa配置
  10. spring.jpa.database=mysql
  11. #是否显示sql
  12. spring.jpa.show-sql=true
  13. # create 每次运行该程序,没有表会新建表,表内有数据会清空
  14. # create-drop 每次程序结束的时候会清空表
  15. # update 每次运行程序,没有表会新建表,表内有数据不会清空,只会更新
  16. # validate 运行程序会校验数据与数据库的字段类型是否相同,不同会报错
  17. spring.jpa.hibernate.ddl-auto=update
  18. #指定日期格式 yyyy-MM-dd HH:mm:ss
  19. spring.jackson.date-format: yyyy-MM-dd HH:mm:ss
  20. #mvc序列化时候时区选择
  21. spring.jackson.time-zone: GMT+8

  实体对象Product.java

  1. @Data
  2. @Entity
  3. public class Product implements Cloneable{
  4. //id 商品ID
  5. @Id
  6. @GeneratedValue(strategy = GenerationType.AUTO)
  7. private int pid;
  8. //商品名称
  9. private String productName;
  10. //商品数量
  11. private int num;
  12. //创建时间
  13. private Date create_time;
  14. @Override
  15. public Object clone() {
  16. try {
  17. return super.clone();
  18. } catch (CloneNotSupportedException e) {
  19. e.printStackTrace();
  20. return null;
  21. }
  22. }
  23. }

      注:大家可能会疑惑我为什么要实现Cloneable接口,这里是为了后面演示添加数据时复制对象用的。调用clone复制对象

 编写ProductReposity.java

  1. public interface ProductReposity extends JpaRepository<Product,Integer>{
  2. }

 编写ProductService.java

  1. public interface ProductService {
  2. List<Product> findAll();
  3. List<Product> adds(List<Product> list);
  4. }

 编写ProductServiceImpl.java

  1. @Service
  2. public class ProductServiceImpl implements ProductService {
  3. @Resource
  4. private ProductReposity reposity;
  5. @Override
  6. public List<Product> findAll() {
  7. return reposity.findAll();
  8. }
  9. @Override
  10. public List<Product> adds(List<Product> list) {
  11. return reposity.saveAll(list);
  12. }
  13. }

 编写测试类添加数据.java

  1. @RunWith(SpringRunner.class)
  2. @SpringBootTest
  3. public class SpringbootEchartsApplicationTests {
  4. @Resource
  5. private ProductService productService;
  6. @Test
  7. public void add() {
  8. Product p = new Product();
  9. p.setPid(1);
  10. p.setProductName("鞋子");
  11. p.setNum(20);
  12. Product p1 = (Product) p.clone();
  13. p1.setPid(2);
  14. p1.setProductName("袜子");
  15. p1.setNum(30);
  16. Product p2 = (Product) p.clone();
  17. p2.setPid(3);
  18. p2.setProductName("衣服");
  19. p2.setNum(50);
  20. Product p3 = (Product) p.clone();
  21. p3.setPid(4);
  22. p3.setProductName("裤子");
  23. p3.setNum(60);
  24. List<Product> products = Arrays.asList(p, p1, p2, p3);
  25. try {
  26. productService.adds(products);
  27. } catch (Exception e) {
  28. System.out.println(e.getMessage());
  29. }
  30. }
  31. @Test
  32. public void findAll() {
  33. List<Product> all = productService.findAll();
  34. System.out.println(all);
  35. }
  36. }

     注:clone()方法实现完全复制,这也是我们的原型模式中的浅拷贝方式

            原型模式:https://blog.csdn.net/xu12387/article/details/88941419

编写ProductController.java

  1. @Controller
  2. public class ProductController {
  3. @Autowired
  4. private ProductService productService;
  5. @GetMapping("/index")
  6. public String index(){
  7. return "index";
  8. }
  9. @GetMapping("/list")
  10. @ResponseBody
  11. public Map<String,List> findAll(){
  12. List<Product> list = productService.findAll();
  13. List<String> productNameList = list.stream().map(Product::getProductName).collect(Collectors.toList());
  14. List<Integer> numList = list.stream().map(Product::getNum).collect(Collectors.toList());
  15. Map<String,List> map=new HashMap<>();
  16. map.put("productName",productNameList);
  17. map.put("num",numList);
  18. return map;
  19. }
  20. }

  添加js文件resouce/static

 编写index.html

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>ECharts</title>
  6. <script src="/static/echarts.min.js"></script>
  7. <script src="/static/jquery.min.js"></script>
  8. </head>
  9. <body>
  10. <!-- 为ECharts准备一个具备大小(宽高)的Dom -->
  11. <div id="main" style="width: 600px;height:400px;"></div>
  12. <script type="text/javascript">
  13. // 基于准备好的dom,初始化echarts实例
  14. var myChart = echarts.init(document.getElementById('main'));
  15. // 显示标题,图例和空的坐标轴
  16. myChart.setOption({
  17. title: {
  18. text: '商品数量'
  19. },
  20. tooltip: {},
  21. legend: {
  22. data: ['库存量']
  23. },
  24. xAxis: {
  25. data: []
  26. },
  27. yAxis: {},
  28. series: [{
  29. name: '库存量',
  30. type: 'bar',
  31. data: []
  32. }]
  33. });
  34. //加载动画
  35. myChart.showLoading();
  36. // 异步加载数据
  37. $.get('list').done(function(data) {
  38. // 填入数据
  39. myChart.setOption({
  40. xAxis: {
  41. data: data.productName
  42. },
  43. series: [{
  44. //根据名字对应到相应的系列
  45. name: '库存量',
  46. type: 'bar',
  47. data: data.num
  48. }]
  49. });
  50. myChart.hideLoading();
  51. });
  52. </script>
  53. </body>
  54. </html>

       注:更多echarts案例访问官网:https://echarts.baidu.com/examples/

              如果没使用模板,外部调用接口,注意跨域问题哟!

              跨域解决:https://blog.csdn.net/xu12387/article/details/88869749

测试:

  访问localhost:8080/index

源码地址:https://gitee.com/xu0123/springboot2

相关文章