初探vue+nodejs+echarts展示图表

初探vue+nodejs+echarts展示图表

nodejs服务server.js代码:

 1 var express = require('express')
 2 
 3 var app = express()
 4 
 5 var fs = require('fs')
 6 
 7 var mysql = require('mysql')
 8 
 9 var cors = require('cors')
10 
11 // 设置跨域访问
12 app.all('*', function (req, res, next) {
13   res.header('Access-Control-Allow-Origin', '*')
14   res.header('Access-Control-Allow-Headers', 'X-Requested-With')
15   res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS')
16   res.header('X-Powered-By', ' 3.2.1')
17   res.header('Content-Type', 'application/json;charset=utf-8')
18   next()
19 })
20 
21 app.use(
22   cors({
23     origin: ['http://localhost:3000'],
24     methods: ['get', 'post'],
25     allowedHeaders: ['Content-Type', 'Authorization']
26   })
27 )
28 
29 const db = mysql.createConnection({
30   host: 'localhost',
31   user: 'root',
32   password: '******',
33   port: '3306',
34   database: 'tables'
35 })
36 
37 db.connect(err => {
38   if (err) throw err
39   console.log('连接成功')
40 })
41 
42 app.get('/schoolpm', (req, res) => {
43   let sql = 'SELECT school_name,qk_count FROM school_all ORDER BY qk_count desc LIMIT 5'
44   db.query(sql, (err, result) => {
45     if (err) {
46       console.log(err)
47     } else {
48       res.json(result)
49     }
50   })
51 })
52 
53 var server = app.listen(3000, function () {
54   var host = server.address().address
55   var port = server.address().port
56   console.log(host, port)
57 })

mysql表数据:

运行node服务测试接口:

html代码:

  1 <!DOCTYPE html>
  2 <html lang="en">
  3   <head>
  4     <meta charset="UTF-8" />
  5     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6     <title>123</title>
  7     <script src="https://cdn.jsdelivr.net/npm/vue"></script>
  8     <script src="node_modules/axios/dist/axios.min.js"></script>
  9     <script src="js/echarts.min.js"></script>
 10     <script src="js/main.js"></script>
 11     <style>
 12       .topSchool {
 13         background-color: rgba(0, 0, 59, 1);
 14         color: beige;
 15       }
 16       #topSchool-pie {
 17         height: 400px;
 18         width: 400px;
 19       }
 20     </style>
 21   </head>
 22   <body>
 23     <div id="schPm">
 24       <div class="topSchool">
 25         <h3>高校排名</h3>
 26         <div id="topSchool-pie"></div>
 27       </div>
 28     </div>
 29 
 30     <script>
 31       var highSchoolPM = new Vue({
 32         el: "#schPm",
 33         data: {
 34           pmList: []
 35         },
 36         created() {
 37           this.getData();
 38         },
 39         methods: {
 40           getData() {
 41             axios
 42               .get(`${api}/schoolpm`)
 43               .then(res => {
 44                 var obj = res.data;
 45                 // school_name替换为name,qk_count替换为value
 46                 obj.forEach(e => {
 47                   e.name = e.school_name;
 48                   e.value = e.qk_count;
 49                   delete e.qk_count;
 50                   delete e.school_name;
 51                 });
 52                 console.log(obj);
 53 
 54                 this.pmList = obj;
 55                 this.$nextTick(() => {
 56                   this.draw();
 57                 });
 58               })
 59               .catch(err => {
 60                 console.log(err);
 61               });
 62           },
 63           draw() {
 64             var _this = this;
 65             var myPM = echarts.init(document.getElementById("topSchool-pie"));
 66             var optionPM = {
 67               title: {
 68                 text: "前五名排名",
 69                 left: "center",
 70                 top: 20,
 71                 textStyle: {
 72                   color: "#ccc"
 73                 }
 74               },
 75 
 76               tooltip: {
 77                 trigger: "item",
 78                 formatter: "{a} <br/>{b} : {c} ({d}%)"
 79               },
 80 
 81               color: ["#0072ff", "#843bff", "#e6772d", "#0033ff", "#48dee6"],
 82 
 83               visualMap: {
 84                 show: false,
 85                 min: 80,
 86                 max: 600,
 87                 inRange: {
 88                   // colorLightness: [0, 1]
 89                 }
 90               },
 91               series: [
 92                 {
 93                   name: "高校期刊资源",
 94                   type: "pie",
 95                   radius: "55%",
 96                   center: ["50%", "50%"],
 97                   data: this.pmList.sort(function(a, b) {
 98                     return a.value - b.value;
 99                   }),
100                   roseType: "radius",
101                   labelLine: {
102                     smooth: 0.2,
103                     length: 10,
104                     length2: 20
105                   },
106                   itemStyle: {
107                     // color: '#c23531',
108                     shadowBlur: 200,
109                     shadowColor: "rgba(0, 0, 0, 0.5)"
110                   },
111 
112                   animationType: "scale",
113                   animationEasing: "elasticOut",
114                   animationDelay: function(idx) {
115                     return Math.random() * 200;
116                   }
117                 }
118               ]
119             };
120             myPM.setOption(optionPM);
121           }
122         }
123       });
124     </script>
125   </body>
126 </html>

效果图:

原文地址:https://www.cnblogs.com/zax0927/p/12882568.html