• JS插件:ECharts-数据图表化


     一、官网

    官网: http://www.echartsjs.com/

    上手http://www.echartsjs.com/tutorial.html#5%20%E5%88%86%E9%92%9F%E4%B8%8A%E6%89%8B%20ECharts

    二、例子

    实例:

     

    1. 先引入:echarts.common.min.js /或者: echarts.js

    1 <head>
    2     <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    3     <meta charset="utf-8" />
    4     <script src="/Scripts/jquery-2.js"></script>
    5     <script type="text/javascript" src="/Scripts/echarts.min.js"></script>
    6     <title>EChart图片测试</title>
    7 </head>

    2. 为ECharts准备一个具备大小的DIV容器

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

    3. js:设置参数初始化图表

     1 <script>
     2     window.onload = function () { loadChasrt() };
     3     function loadChasrt() {
     4         var dataX = ["2018-12-14 14:00:21", "2018-12-15 14:00:21", "2018-12-18 11:00:21", "2018-12-18 13:59:58"];
     5         var CrackValue =[2,1,12,11] ;
     6         var TiltAngle  =[12,11,22,11] ;
     7         var Temperature = [16, 11, 12, 15];
     8         var titlename = '长度-角度关系图';
     9         var option = {
    10             title: { text: titlename, x: 'center', y: 'top' },
    11             tooltip: { trigger: 'axis' },
    12             legend: { data: [], x: 'left', y: 'top' },
    13             dataZoom: { show: true, start: 0 },
    14             grid: { left: '3%', right: '4%', bottom: '3%', containLabel: true },
    15             toolbox: { feature: { saveAsImage: {}, dataZoom: {}, restore: {} } },
    16             xAxis: { type: 'category', boundaryGap: false, data: dataX }, 
    17             yAxis: { type: 'value' },
    18             series: []
    19         };
    20         option.legend.data = ["长度", "角度", "温度"];
    21         option.yAxis = [
    22                        { boundaryGap: [0, '50%'], type: 'value', name: '长度', position: 'left', offset: 0, splitNumber: 0, splitLine: { show: true, } },
    23                        { boundaryGap: [0, '50%'], type: 'value', name: '角度', position: 'right', offset: 0, splitNumber: 0, splitLine: { show: true, } },
    24                        { boundaryGap: [0, '50%'], type: 'value', name: '温度', position: 'right', offset: 50, splitNumber: 0, splitLine: { show: true, } },
    25         ]
    26         option.series.push({ name: '长度', type: 'line', stack: '', data: CrackValue, yAxisIndex: 0, symbol: 'none' })
    27         option.series.push({ name: '角度', type: 'line', stack: '', data: TiltAngle, yAxisIndex: 1, symbol: 'none' })
    28         option.series.push({ name: '温度', type: 'line', stack: '', data: Temperature, yAxisIndex: 2, symbol: 'none' })
    29         option.tooltip = {
    30             trigger: 'axis' 
    31            
    32         };
    33         var myChart = echarts.init(document.getElementById('main'));
    34         myChart.setOption(option);
    35          
    36     } 
    37     
    38 
    39 </script>

    三、测试使用

    在官网->实例里面编辑数据参数,查看网页效果

    进入网站:输入以下测试数据

    //折线图:

     1 var nameDevice = '设备',
     2     barName = '水位',
     3     X =  ['周一','周二','周三','周四','周五','周六','周日'],
     4     dataValue = [820, 932, 901, 934, 1290, 1330, 1320];
     5 
     6 option = {
     7     title: {
     8         text: nameDevice,
     9         subtext: barName,
    10         x: 'center',
    11         y: 'top'
    12     },
    13     tooltip: {
    14         trigger: 'axis',
    15         axisPointer: {
    16             type: 'cross',
    17             label: {
    18                 backgroundColor: '#6a7985'
    19             }
    20         }
    21     },
    22     legend: {
    23         data: [barName],
    24         x: 'left',
    25         y: 'top'
    26     },
    27     toolbox: {
    28         feature: {
    29             saveAsImage: {}
    30         }
    31     },
    32     calculable: true,
    33 
    34 
    35     xAxis: {
    36         type: 'category',
    37         boundaryGap: false,
    38         data: X
    39     },
    40     yAxis: {
    41         type: 'value'
    42     },
    43     series: [{
    44         name: barName,
    45          type: 'line',
    46           data: dataValue,
    47         areaStyle: {
    48             normal: {
    49                 color: {
    50                     type: 'linear',
    51                     x: 0,
    52                     y: 0,
    53                     x2: 0,
    54                     y2: 1,
    55                     colorStops: [{
    56                         offset: 0,
    57                         color: 'rgba(88,160,253,1)'
    58                     }, {
    59                         offset: 0.5,
    60                         color: 'rgba(88,160,253,0.7)'
    61                     }, {
    62                         offset: 1,
    63                         color: 'rgba(88,160,253,0)'
    64                     }]
    65                 }
    66             }
    67         },
    68         lineStyle: {
    69             normal: {
    70                 color: 'rgba(88,160,253,1)'
    71             }
    72         },
    73         itemStyle: {
    74             normal: {
    75                 color: 'rgba(88,160,253,1)'
    76             }
    77         }
    78     }]
    79 };
    View Code
     1 var nameDevice = '设备',
     2     barName = '水位',
     3     X = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'],
     4     dataValue = [820, 932, 901, 934, 1290, 1330, 1320];
     5 
     6 option = {
     7     title: {
     8         text: '折线图堆叠'
     9     },
    10     tooltip: {
    11         trigger: 'axis'
    12     },
    13     legend: {
    14         data: ['邮件营销', barName, '视频广告', '直接访问', '搜索引擎']
    15     },
    16     grid: {
    17         left: '3%',
    18         right: '4%',
    19         bottom: '3%',
    20         containLabel: true
    21     },
    22     toolbox: {
    23         feature: {
    24             saveAsImage: {}
    25         }
    26     },
    27     xAxis: {
    28         type: 'category',
    29         boundaryGap: false,
    30         data: ['周一', '周二', '周三', '周四', '周五', '周六', '周日']
    31     },
    32     yAxis: {
    33         type: 'value'
    34     },
    35     series: [{
    36             name: '邮件营销',
    37             type: 'line',
    38             stack: '总量',
    39             data: [120, 132, 101, 134, 90, 230, 210]
    40         },
    41         {
    42             name: barName,
    43             type: 'line',
    44             stack: '总量',
    45             data: dataValue,
    46             areaStyle: {
    47                normal: {
    48                     color: {
    49                         type: 'linear',
    50                         x: 0,
    51                         y: 0,
    52                         x2: 0,
    53                         y2: 1,
    54                         colorStops: [{
    55                             offset: 0,
    56                             color: 'rgba(88,160,253,1)'
    57                         }, {
    58                             offset: 0.5,
    59                             color: 'rgba(88,160,253,0.7)'
    60                         }, {
    61                             offset: 1,
    62                             color: 'rgba(88,160,253,0)'
    63                         }]
    64                     }
    65                 }
    66             },
    67             lineStyle: {
    68                 normal: {
    69                     color: 'rgba(88,160,253,1)'
    70                 }
    71             },
    72             itemStyle: {
    73                 normal: {
    74                     color: 'rgba(88,160,253,1)'
    75                 }
    76             }
    77         },
    78         {
    79             name: '视频广告',
    80             type: 'line',
    81             stack: '总量',
    82             data: [150, 232, 201, 154, 190, 330, 410]
    83         },
    84         {
    85             name: '直接访问',
    86             type: 'line',
    87             stack: '总量',
    88             data: [320, 332, 301, 334, 390, 330, 320]
    89         },
    90         {
    91             name: '搜索引擎',
    92             type: 'line',
    93             stack: '总量',
    94             data: [820, 932, 901, 934, 1290, 1330, 1320]
    95         }
    96     ]
    97 };
    View Code

     //添加bar:柱状图

      1 app.title = '多 Y 轴示例';
      2 var colors = ['#5793f3', '#d14a61', '#675bba'];
      3   // 指定图表的配置项和数据
      4     var nameDevice = '设备', barName = '水位', X = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
      5 dataValue = [820, 932, 901, 934, 1290, 1330, 1320];
      6     var yMax = 1320;
      7     var xMax = 6;
      8     var yMin = 820;
      9     var xMin = 0;
     10 option = {
     11     color: colors,
     12 
     13     tooltip: {
     14         trigger: 'axis',
     15         axisPointer: {
     16             type: 'cross'
     17         }
     18     },
     19     grid: {
     20         right: '20%'
     21     },
     22     toolbox: {
     23         feature: {
     24             dataView: {show: true, readOnly: false},
     25             restore: {show: true},
     26             saveAsImage: {show: true}
     27         }
     28     },
     29     legend: {
     30         data:['蒸发量','降水量','平均温度']
     31     },
     32     xAxis: [
     33         {
     34             type: 'category',
     35             axisTick: {
     36                 alignWithLabel: true
     37             },
     38             data: ['1月','2月','3月','4月','5月','6月','7月' ]
     39         }
     40     ],
     41     yAxis: [
     42         {
     43             type: 'value',
     44             name: '蒸发量',
     45             min: 0,
     46             max: 250,
     47             position: 'right',
     48             axisLine: {
     49                 lineStyle: {
     50                     color: colors[0]
     51                 }
     52             },
     53             axisLabel: {
     54                 formatter: '{value} ml'
     55             }
     56         },
     57         {
     58             type: 'value',
     59             name: barName,
     60             min: 0,
     61             max: 250,
     62             position: 'right',
     63             offset: 80,
     64             axisLine: {
     65                 lineStyle: {
     66                     color: colors[1]
     67                 }
     68             },
     69             axisLabel: {
     70                 formatter: '{value} ml'
     71             }
     72         },
     73         {
     74             type: 'value',
     75             name: '温度',
     76             min: 0,
     77             max: 25,
     78             position: 'left',
     79             axisLine: {
     80                 lineStyle: {
     81                     color: colors[2]
     82                 }
     83             },
     84             axisLabel: {
     85                 formatter: '{value} °C'
     86             }
     87         }
     88     ],
     89     series: [
     90         {
     91             name:'蒸发量',
     92             type:'line',
     93             data:[2.0, 4.9, 17.0, 23.2, 25.6, 76.7, 135.6 ]
     94         },
     95       
     96             
     97         {
     98             name: barName,
     99             
    100              barWidth: 30,
    101                 itemStyle: {
    102                     normal: {
    103                         color: '#3FA7DC',
    104                         barBorderRadius: [6, 6, 0, 0]
    105                     }
    106                 },
    107                 type: 'bar',
    108                  markPoint: {
    109                     data: [
    110                         { name: '最高', value: yMax, xAxis: xMax, yAxis: yMax },
    111                         { name: '最低', value: yMin, xAxis: xMin, yAxis: yMin }
    112                     ]
    113                 }
    114                 ,
    115             yAxisIndex: 1,
    116             data:[2.6, 5.9, 9.0, 26.4, 228.7, 70.7, 175.6 ]
    117         },
    118         {
    119             name:'平均温度',
    120             type:'line',
    121             yAxisIndex: 2,
    122             data:[2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3 ]
    123         }
    124     ]
    125 };
    View Code

     //混合多图:相同X刻度不同y变量类型的多图

      1 var ValueList = [{
      2         "value": ['2010-10-01 19:00', 21]
      3     },
      4     {
      5         "value": ['2010-10-03 19:00', 21]
      6     },
      7     {
      8         "value": ['2010-10-04 19:00', 200]
      9     }, {
     10         "value": ['2010-10-05 11:00', 2]
     11     },
     12     {
     13         "value": ['2010-10-06 12:00', 21]
     14     },
     15     {
     16         "value": ['2010-10-07 18:00', 21]
     17     }, {
     18         "value": ['2010-10-09 09:00', 21]
     19     }
     20 ];
     21 
     22 var aValueList = [{
     23         "value": ['2010-10-01 19:00', 21]
     24     },
     25     {
     26         "value": ['2010-10-03 19:00', 61]
     27     },
     28     {
     29         "value": ['2010-10-04 19:00', 40]
     30     }, {
     31         "value": ['2010-10-05 11:00', 41]
     32     },
     33     {
     34         "value": ['2010-10-06 12:00', 61]
     35     },
     36     {
     37         "value": ['2010-10-07 18:00', 61]
     38     }, {
     39         "value": ['2010-10-09 09:00', 71]
     40     }
     41 ];
     42 
     43 var bValueList = [{
     44         "value": ['2010-10-01 19:00', 91]
     45     },
     46     {
     47         "value": ['2010-10-03 19:00', 81]
     48     },
     49     {
     50         "value": ['2010-10-04 19:00', 80]
     51     }, {
     52         "value": ['2010-10-05 11:00', 1]
     53     },
     54     {
     55         "value": ['2010-10-06 12:00', 51]
     56     },
     57     {
     58         "value": ['2010-10-07 18:00', 11]
     59     }, {
     60         "value": ['2010-10-09 09:00', 71]
     61     }
     62 ];;
     63 var objP = [{}];
     64 var m = 0;
     65 objP[m].yAxisIndex = 0;
     66 var sname = "",
     67     name = "";
     68  var listYaxis = [{
     69     type: "value",
     70     name: "y轴刻度01"
     71 
     72 }, {
     73 
     74     type: "value",
     75     name: "y轴刻度02"
     76 
     77 }, {
     78 
     79     type: "value",
     80     name: "3"
     81 
     82 }];
     83 
     84 
     85 var yMax = 200;
     86 var xMax = 2;
     87 var yMin = 2;
     88 var xMin = 3;
     89 
     90 // xAxis: {  type: 'time' , splitLine: { show: false } },
     91 option = {
     92     title: {
     93         text: name,
     94         x: 'center',
     95         y: 'top'
     96     },
     97     tooltip: {
     98         trigger: 'axis'
     99     },
    100     legend: {
    101         data: [],
    102         x: 'left',
    103         y: 'top',
    104         right: 50,
    105         type: 'scroll'
    106     },
    107     dataZoom: {
    108         show: true,
    109         start: 0
    110     },
    111     calculable: true,
    112     color: ['#3398DB'],
    113 
    114     grid: {
    115         left: '0%',
    116         right: '0%',
    117         bottom: '0%',
    118         containLabel: true
    119     },
    120     toolbox: {
    121         y: 'top',
    122         right: 15,
    123         top: -3,
    124         feature: {
    125             saveAsImage: {}
    126         }
    127     },
    128 
    129     xAxis: {
    130         type: 'category',
    131         itLine: {
    132             show: false
    133         }
    134     },
    135     yAxis: [{
    136         type: 'value'
    137     }],
    138 
    139     series: []
    140 };
    141 
    142 
    143 //加载Y轴,并设定位置
    144 option.yAxis = []
    145 for (var y = 0; y < listYaxis.length; y++) {
    146    option.yAxis.push(listYaxis[y])
    147 }
    148 option.grid.left = 10
    149 if (listYaxis.length > 1) {
    150     option.grid.right = ((option.yAxis.length - 2) * 30)
    151 }
    152  
    153 
    154 option.legend.data.push(sname + "-采集值")
    155 option.series.push({
    156     name: sname + "-采集值",
    157     type: 'line',
    158     stack: '',
    159     data: bValueList,
    160     yAxisIndex: objP[m].yAxisIndex,
    161     symbolSize: 0
    162 })
    163 
    164 
    165 option.legend.data.push(sname + "-水位")
    166 option.series.push({
    167     name: sname + "-水位",
    168     type: 'line',
    169     stack: '',
    170     data: aValueList,
    171     yAxisIndex: objP[m].yAxisIndex,
    172     symbolSize: 0,
    173     areaStyle: {
    174         normal: {
    175             color: {
    176                 type: 'linear',
    177                 x: 0,
    178                 y: 0,
    179                 x2: 0,
    180                 y2: 1,
    181                 colorStops: [{
    182                     offset: 0,
    183                     color: 'rgba(88,160,253,1)'
    184                 }, {
    185                     offset: 0.5,
    186                     color: 'rgba(88,160,253,0.7)'
    187                 }, {
    188                     offset: 1,
    189                     color: 'rgba(88,160,253,0)'
    190                 }]
    191             }
    192         }
    193     },
    194     lineStyle: {
    195         normal: {
    196             color: 'rgba(88,160,253,1)'
    197         }
    198     },
    199     itemStyle: {
    200         normal: {
    201             color: 'rgba(88,160,253,1)'
    202         }
    203     }
    204 })
    205 
    206 
    207 
    208 
    209 option.legend.data.push(sname + "-降雨量");
    210 option.series.push({
    211     name: sname + "-降雨量",
    212     type: 'bar',
    213     itemStyle: {
    214         normal: {
    215             color: '#3FA7DC',
    216             barBorderRadius: [6, 6, 0, 0]
    217         }
    218     },
    219     stack: '',
    220     barWidth: 30,
    221     markPoint: {
    222         data: [{
    223                 name: '最高',
    224                 value: yMax,
    225                 xAxis: xMax,
    226                 yAxis: yMax
    227             },
    228             {
    229                 name: '最低',
    230                 value: yMin,
    231                 xAxis: xMin,
    232                 yAxis: yMin
    233             }
    234         ]
    235     },
    236     data: ValueList,
    237     yAxisIndex: objP[m].yAxisIndex,
    238     symbolSize: 0
    239 
    240 });
    View Code

     // X轴为时间:xAxis: { type: 'time' ...

      1 var ValueList = [{
      2         "value": ['2010-09-29 01:00', 21]
      3     },
      4     {
      5         "value": ['2010-10-03 05:00', 21]
      6     },
      7     {
      8         "value": ['2010-10-04 08:00', 200]
      9     }, {
     10         "value": ['2010-10-05 011:00', 2]
     11     },
     12     {
     13         "value": ['2010-10-06 12:00', 21]
     14     },
     15     {
     16         "value": ['2010-10-07 18:00', 21]
     17     }, {
     18         "value": ['2010-10-09 09:00', 21]
     19     }
     20 ];
     21 
     22 var aValueList = [{
     23         "value": ['2010-10-01 07:00', 21]
     24     },
     25     {
     26         "value": ['2010-10-03 09:00', 61]
     27     },
     28     {
     29         "value": ['2010-10-04 11:00', 40]
     30     }, {
     31         "value": ['2010-10-05 11:00', 41]
     32     },
     33     {
     34         "value": ['2010-10-06 12:00', 61]
     35     },
     36     {
     37         "value": ['2010-10-07 16:00', 61]
     38     }, {
     39         "value": ['2010-10-09 19:00', 71]
     40     }
     41 ];
     42 
     43 var bValueList = [{
     44         "value": ['2010-10-01 06:00', 91]
     45     },
     46     {
     47         "value": ['2010-10-03 09:00', 81]
     48     },
     49     {
     50         "value": ['2010-10-04 09:00', 80]
     51     }, {
     52         "value": ['2010-10-05 11:00', 1]
     53     },
     54     {
     55         "value": ['2010-10-06 12:00', 51]
     56     },
     57     {
     58         "value": ['2010-10-07 13:00', 11]
     59     }, {
     60         "value": ['2010-10-09 16:00', 71]
     61     }
     62 ];
     63 var listYaxis = [];
     64 listYaxis.push({
     65     boundaryGap: [0, '50%'],
     66     axisLine: {
     67         lineStyle: {
     68             color: "#000000"
     69         }
     70     },
     71     type: 'value',
     72     name: "默认",
     73     axisLabel: {
     74         formatter: '{value}',
     75         textStyle: {
     76             color: '#000000'
     77         }
     78     },
     79     position: 'left',
     80     offset: 0,
     81     splitNumber: 0,
     82     splitLine: {
     83         show: true,
     84     },
     85     tooltip: {
     86         show: true,
     87         trigger: 'axis'
     88     },
     89     triggerEvent: true
     90 });
     91 listYaxis.push({
     92     boundaryGap: [0, '50%'],
     93     type: 'value',
     94     name: "默认22"
     95 });
     96 
     97 var objP = [{}],
     98     m = 0;
     99 objP[m].yAxisIndex = 0;
    100 var sname = "",
    101     name = "";
    102 
    103 
    104 var yMax = 200;
    105 var xMax = 2;
    106 var yMin = 21;
    107 var xMin = 3;
    108 
    109 // xAxis: {  type: 'category' , splitLine: { show: false } },
    110 
    111 option = {
    112     title: {
    113         text: name,
    114         x: 'center',
    115         y: 'top'
    116     },
    117     tooltip: {
    118         trigger: 'axis'
    119     },
    120     legend: {
    121         data: [],
    122         x: 'left',
    123         y: 'top',
    124         right: 50,
    125         type: 'scroll'
    126     },
    127     dataZoom: {
    128         show: true,
    129         start: 0
    130     },
    131     calculable: true,
    132     grid: {
    133         left: '0%',
    134         right: '0%',
    135         bottom: '0%',
    136         containLabel: true
    137     },
    138     toolbox: {
    139         y: 'top',
    140         right: 15,
    141         top: -3,
    142         feature: {
    143             saveAsImage: {}
    144         }
    145     },
    146     xAxis: {
    147         type: 'time',
    148         splitLine: {
    149             show: false
    150         }
    151     },
    152     yAxis: {
    153         type: 'value'
    154     },
    155     series: []
    156 };
    157 
    158 
    159 //加载Y轴,并设定位置
    160 option.yAxis = []
    161 for (var y = 0; y < listYaxis.length; y++) {
    162     option.yAxis.push(listYaxis[y])
    163 }
    164 option.grid.left = 10
    165 if (listYaxis.length > 1) {
    166     option.grid.right = ((option.yAxis.length - 2) * 30)
    167 }
    168 
    169 
    170 
    171 option.legend.data.push(sname + "-采集值")
    172 option.series.push({
    173     name: sname + "-采集值",
    174     type: 'line',
    175     stack: '',
    176     data: bValueList,
    177     yAxisIndex: objP[m].yAxisIndex,
    178     symbolSize: 0
    179 })
    180 
    181 
    182 option.legend.data.push(sname + "-水位")
    183 option.series.push({
    184     name: sname + "-水位",
    185     type: 'line',
    186     stack: '',
    187     data: aValueList,
    188     yAxisIndex: objP[m].yAxisIndex,
    189     symbolSize: 0,
    190     areaStyle: {
    191         normal: {
    192             color: {
    193                 type: 'linear',
    194                 x: 0,
    195                 y: 0,
    196                 x2: 0,
    197                 y2: 1,
    198                 colorStops: [{
    199                     offset: 0,
    200                     color: 'rgba(88,160,253,1)'
    201                 }, {
    202                     offset: 0.5,
    203                     color: 'rgba(88,160,253,0.7)'
    204                 }, {
    205                     offset: 1,
    206                     color: 'rgba(88,160,253,0)'
    207                 }]
    208             }
    209         }
    210     },
    211     lineStyle: {
    212         normal: {
    213             color: 'rgba(88,160,253,1)'
    214         }
    215     },
    216     itemStyle: {
    217         normal: {
    218             color: 'rgba(88,160,253,1)'
    219         }
    220     }
    221 })
    222 
    223 
    224 option.legend.data.push(sname + "-降雨量");
    225 option.series.push({
    226     name: sname + "-降雨量",
    227     type: 'bar',
    228     itemStyle: {
    229         normal: {
    230             color: '#3FA7DC',
    231             barBorderRadius: [6, 6, 0, 0]
    232         }
    233     },
    234     stack: '',
    235     barWidth: 30,
    236 //    markPoint: {
    237 //        data: [{     name: '最高',     value: yMax,     xAxis: xMax,     yAxis: yMax
    238 //            },
    239 //            {     name: '最低',     value: yMin,     xAxis: xMin,     yAxis: yMin
    240 //            }
    241 //        ]
    242 //    } ,
    243           markPoint: {
    244                 data: [
    245                     {type: 'max', name: '最大值'},
    246                     {type: 'min', name: '最小值'}
    247                 ]
    248             },
    249     data: ValueList,
    250     yAxisIndex: objP[m].yAxisIndex,
    251     symbolSize: 0
    252 });
    View Code
  • 相关阅读:
    两个python程序搞定NCBI数据搜索并将结果保存到excel里面
    在notepad++上如何配置Python C 以及 java
    初识pandas
    关于搜索全部文件和修改文件名的方法os.walk() 和os.listdir
    C算法--指针与函数参数
    C算法--指针与数组
    C算法--指针1
    C算法--函数
    C算法--string.h头文件
    C算法--字符数组
  • 原文地址:https://www.cnblogs.com/July-/p/9717969.html
Copyright © 2020-2023  润新知