├── .gitignore ├── AutoCmdb ├── __init__.py ├── settings.py ├── urls.py └── wsgi.py ├── README.md ├── ansible_client └── monitor │ ├── cpu.py │ └── memory.py ├── api ├── __init__.py ├── admin.py ├── api_urls.py ├── apps.py ├── models.py ├── serializers │ ├── ansible.py │ ├── disk.py │ ├── host.py │ ├── hostinfo.py │ └── network.py ├── tests.py ├── utils │ ├── __init__.py │ ├── ansible │ │ ├── __init__.py │ │ ├── check_ip.py │ │ ├── exec_ansible.py │ │ ├── extract_setup.py │ │ ├── hosts_fm.py │ │ ├── login_host.py │ │ └── remotExect.sh │ ├── auth.py │ ├── response.py │ └── serialization_general.py └── views │ ├── ansible.py │ ├── disk.py │ ├── host.py │ ├── hostinfo.py │ ├── monit │ ├── cpu.py │ └── memory.py │ └── network.py ├── cron └── test_orm.py ├── db.sqlite3 ├── manage.py ├── repository ├── __init__.py ├── admin.py ├── apps.py ├── models.py ├── tests.py └── views.py ├── requirements.txt ├── web ├── __init__.py ├── admin.py ├── apps.py ├── models.py ├── static │ ├── css │ │ ├── index.css │ │ └── skins │ │ │ └── _all-skins.css │ ├── img │ │ ├── ajax-loader.gif │ │ ├── avatar.png │ │ ├── avatar04.png │ │ ├── avatar2.png │ │ ├── avatar3.png │ │ ├── avatar5.png │ │ ├── favicon.ico │ │ ├── photo1.png │ │ ├── photo2.png │ │ ├── photo3.jpg │ │ ├── photo4.jpg │ │ ├── user1-128x128.jpg │ │ ├── user2-160x160.jpg │ │ ├── user3-128x128.jpg │ │ ├── user4-128x128.jpg │ │ ├── user5-128x128.jpg │ │ ├── user6-128x128.jpg │ │ ├── user7-128x128.jpg │ │ └── user8-128x128.jpg │ ├── js │ │ ├── index.js │ │ └── jquery │ │ │ └── jQuery-2.2.0.min.js │ └── plugins │ │ ├── Highcharts-6.1.2 │ │ ├── code │ │ │ ├── css │ │ │ │ ├── highcharts.css │ │ │ │ ├── highcharts.scss │ │ │ │ ├── js │ │ │ │ │ ├── highcharts-3d.js │ │ │ │ │ ├── highcharts-3d.src.js │ │ │ │ │ ├── highcharts-more.js │ │ │ │ │ ├── highcharts-more.src.js │ │ │ │ │ ├── highcharts.js │ │ │ │ │ ├── highcharts.src.js │ │ │ │ │ ├── modules │ │ │ │ │ │ ├── accessibility.js │ │ │ │ │ │ ├── accessibility.src.js │ │ │ │ │ │ ├── annotations.js │ │ │ │ │ │ ├── annotations.src.js │ │ │ │ │ │ ├── boost-canvas.js │ │ │ │ │ │ ├── boost-canvas.src.js │ │ │ │ │ │ ├── boost.js │ │ │ │ │ │ ├── boost.src.js │ │ │ │ │ │ ├── broken-axis.js │ │ │ │ │ │ ├── broken-axis.src.js │ │ │ │ │ │ ├── bullet.js │ │ │ │ │ │ ├── bullet.src.js │ │ │ │ │ │ ├── data.js │ │ │ │ │ │ ├── data.src.js │ │ │ │ │ │ ├── drag-panes.js │ │ │ │ │ │ ├── drag-panes.src.js │ │ │ │ │ │ ├── drilldown.js │ │ │ │ │ │ ├── drilldown.src.js │ │ │ │ │ │ ├── export-data.js │ │ │ │ │ │ ├── export-data.src.js │ │ │ │ │ │ ├── exporting.js │ │ │ │ │ │ ├── exporting.src.js │ │ │ │ │ │ ├── funnel.js │ │ │ │ │ │ ├── funnel.src.js │ │ │ │ │ │ ├── gantt.js │ │ │ │ │ │ ├── gantt.src.js │ │ │ │ │ │ ├── grid-axis.js │ │ │ │ │ │ ├── grid-axis.src.js │ │ │ │ │ │ ├── heatmap.js │ │ │ │ │ │ ├── heatmap.src.js │ │ │ │ │ │ ├── histogram-bellcurve.js │ │ │ │ │ │ ├── histogram-bellcurve.src.js │ │ │ │ │ │ ├── item-series.js │ │ │ │ │ │ ├── item-series.src.js │ │ │ │ │ │ ├── no-data-to-display.js │ │ │ │ │ │ ├── no-data-to-display.src.js │ │ │ │ │ │ ├── offline-exporting.js │ │ │ │ │ │ ├── offline-exporting.src.js │ │ │ │ │ │ ├── oldie.js │ │ │ │ │ │ ├── oldie.src.js │ │ │ │ │ │ ├── overlapping-datalabels.js │ │ │ │ │ │ ├── overlapping-datalabels.src.js │ │ │ │ │ │ ├── parallel-coordinates.js │ │ │ │ │ │ ├── parallel-coordinates.src.js │ │ │ │ │ │ ├── pareto.js │ │ │ │ │ │ ├── pareto.src.js │ │ │ │ │ │ ├── pattern-fill.js │ │ │ │ │ │ ├── pattern-fill.src.js │ │ │ │ │ │ ├── sankey.js │ │ │ │ │ │ ├── sankey.src.js │ │ │ │ │ │ ├── series-label.js │ │ │ │ │ │ ├── series-label.src.js │ │ │ │ │ │ ├── solid-gauge.js │ │ │ │ │ │ ├── solid-gauge.src.js │ │ │ │ │ │ ├── static-scale.js │ │ │ │ │ │ ├── static-scale.src.js │ │ │ │ │ │ ├── stock.js │ │ │ │ │ │ ├── stock.src.js │ │ │ │ │ │ ├── streamgraph.js │ │ │ │ │ │ ├── streamgraph.src.js │ │ │ │ │ │ ├── sunburst.js │ │ │ │ │ │ ├── sunburst.src.js │ │ │ │ │ │ ├── tilemap.js │ │ │ │ │ │ ├── tilemap.src.js │ │ │ │ │ │ ├── treemap.js │ │ │ │ │ │ ├── treemap.src.js │ │ │ │ │ │ ├── variable-pie.js │ │ │ │ │ │ ├── variable-pie.src.js │ │ │ │ │ │ ├── variwide.js │ │ │ │ │ │ ├── variwide.src.js │ │ │ │ │ │ ├── vector.js │ │ │ │ │ │ ├── vector.src.js │ │ │ │ │ │ ├── windbarb.js │ │ │ │ │ │ ├── windbarb.src.js │ │ │ │ │ │ ├── wordcloud.js │ │ │ │ │ │ ├── wordcloud.src.js │ │ │ │ │ │ ├── xrange.js │ │ │ │ │ │ └── xrange.src.js │ │ │ │ │ └── themes │ │ │ │ │ │ ├── avocado.js │ │ │ │ │ │ ├── avocado.src.js │ │ │ │ │ │ ├── dark-blue.js │ │ │ │ │ │ ├── dark-blue.src.js │ │ │ │ │ │ ├── dark-green.js │ │ │ │ │ │ ├── dark-green.src.js │ │ │ │ │ │ ├── dark-unica.js │ │ │ │ │ │ ├── dark-unica.src.js │ │ │ │ │ │ ├── gray.js │ │ │ │ │ │ ├── gray.src.js │ │ │ │ │ │ ├── grid-light.js │ │ │ │ │ │ ├── grid-light.src.js │ │ │ │ │ │ ├── grid.js │ │ │ │ │ │ ├── grid.src.js │ │ │ │ │ │ ├── sand-signika.js │ │ │ │ │ │ ├── sand-signika.src.js │ │ │ │ │ │ ├── skies.js │ │ │ │ │ │ ├── skies.src.js │ │ │ │ │ │ ├── sunset.js │ │ │ │ │ │ └── sunset.src.js │ │ │ │ └── themes │ │ │ │ │ ├── dark-unica.css │ │ │ │ │ ├── grid-light.css │ │ │ │ │ └── sand-signika.css │ │ │ ├── highcharts-3d.js │ │ │ ├── highcharts-3d.src.js │ │ │ ├── highcharts-more.js │ │ │ ├── highcharts-more.src.js │ │ │ ├── highcharts.js │ │ │ ├── highcharts.src.js │ │ │ ├── modules │ │ │ │ ├── accessibility.js │ │ │ │ ├── accessibility.src.js │ │ │ │ ├── annotations.js │ │ │ │ ├── annotations.src.js │ │ │ │ ├── boost-canvas.js │ │ │ │ ├── boost-canvas.src.js │ │ │ │ ├── boost.js │ │ │ │ ├── boost.src.js │ │ │ │ ├── broken-axis.js │ │ │ │ ├── broken-axis.src.js │ │ │ │ ├── bullet.js │ │ │ │ ├── bullet.src.js │ │ │ │ ├── data.js │ │ │ │ ├── data.src.js │ │ │ │ ├── drag-panes.js │ │ │ │ ├── drag-panes.src.js │ │ │ │ ├── drilldown.js │ │ │ │ ├── drilldown.src.js │ │ │ │ ├── export-data.js │ │ │ │ ├── export-data.src.js │ │ │ │ ├── exporting.js │ │ │ │ ├── exporting.src.js │ │ │ │ ├── funnel.js │ │ │ │ ├── funnel.src.js │ │ │ │ ├── gantt.js │ │ │ │ ├── gantt.src.js │ │ │ │ ├── grid-axis.js │ │ │ │ ├── grid-axis.src.js │ │ │ │ ├── heatmap.js │ │ │ │ ├── heatmap.src.js │ │ │ │ ├── histogram-bellcurve.js │ │ │ │ ├── histogram-bellcurve.src.js │ │ │ │ ├── item-series.js │ │ │ │ ├── item-series.src.js │ │ │ │ ├── no-data-to-display.js │ │ │ │ ├── no-data-to-display.src.js │ │ │ │ ├── offline-exporting.js │ │ │ │ ├── offline-exporting.src.js │ │ │ │ ├── oldie.js │ │ │ │ ├── oldie.src.js │ │ │ │ ├── overlapping-datalabels.js │ │ │ │ ├── overlapping-datalabels.src.js │ │ │ │ ├── parallel-coordinates.js │ │ │ │ ├── parallel-coordinates.src.js │ │ │ │ ├── pareto.js │ │ │ │ ├── pareto.src.js │ │ │ │ ├── pattern-fill.js │ │ │ │ ├── pattern-fill.src.js │ │ │ │ ├── sankey.js │ │ │ │ ├── sankey.src.js │ │ │ │ ├── series-label.js │ │ │ │ ├── series-label.src.js │ │ │ │ ├── solid-gauge.js │ │ │ │ ├── solid-gauge.src.js │ │ │ │ ├── static-scale.js │ │ │ │ ├── static-scale.src.js │ │ │ │ ├── stock.js │ │ │ │ ├── stock.src.js │ │ │ │ ├── streamgraph.js │ │ │ │ ├── streamgraph.src.js │ │ │ │ ├── sunburst.js │ │ │ │ ├── sunburst.src.js │ │ │ │ ├── tilemap.js │ │ │ │ ├── tilemap.src.js │ │ │ │ ├── treemap.js │ │ │ │ ├── treemap.src.js │ │ │ │ ├── variable-pie.js │ │ │ │ ├── variable-pie.src.js │ │ │ │ ├── variwide.js │ │ │ │ ├── variwide.src.js │ │ │ │ ├── vector.js │ │ │ │ ├── vector.src.js │ │ │ │ ├── windbarb.js │ │ │ │ ├── windbarb.src.js │ │ │ │ ├── wordcloud.js │ │ │ │ ├── wordcloud.src.js │ │ │ │ ├── xrange.js │ │ │ │ └── xrange.src.js │ │ │ ├── readme.txt │ │ │ └── themes │ │ │ │ ├── avocado.js │ │ │ │ ├── avocado.src.js │ │ │ │ ├── dark-blue.js │ │ │ │ ├── dark-blue.src.js │ │ │ │ ├── dark-green.js │ │ │ │ ├── dark-green.src.js │ │ │ │ ├── dark-unica.js │ │ │ │ ├── dark-unica.src.js │ │ │ │ ├── gray.js │ │ │ │ ├── gray.src.js │ │ │ │ ├── grid-light.js │ │ │ │ ├── grid-light.src.js │ │ │ │ ├── grid.js │ │ │ │ ├── grid.src.js │ │ │ │ ├── sand-signika.js │ │ │ │ ├── sand-signika.src.js │ │ │ │ ├── skies.js │ │ │ │ ├── skies.src.js │ │ │ │ ├── sunset.js │ │ │ │ └── sunset.src.js │ │ ├── examples │ │ │ ├── 3d-column-interactive │ │ │ │ └── index.htm │ │ │ ├── 3d-column-null-values │ │ │ │ └── index.htm │ │ │ ├── 3d-column-stacking-grouping │ │ │ │ └── index.htm │ │ │ ├── 3d-pie-donut │ │ │ │ └── index.htm │ │ │ ├── 3d-pie │ │ │ │ └── index.htm │ │ │ ├── 3d-scatter-draggable │ │ │ │ └── index.htm │ │ │ ├── annotations │ │ │ │ └── index.htm │ │ │ ├── area-basic │ │ │ │ └── index.htm │ │ │ ├── area-inverted │ │ │ │ └── index.htm │ │ │ ├── area-missing │ │ │ │ └── index.htm │ │ │ ├── area-negative │ │ │ │ └── index.htm │ │ │ ├── area-stacked-percent │ │ │ │ └── index.htm │ │ │ ├── area-stacked │ │ │ │ └── index.htm │ │ │ ├── arearange-line │ │ │ │ └── index.htm │ │ │ ├── arearange │ │ │ │ └── index.htm │ │ │ ├── areaspline │ │ │ │ └── index.htm │ │ │ ├── bar-basic │ │ │ │ └── index.htm │ │ │ ├── bar-negative-stack │ │ │ │ └── index.htm │ │ │ ├── bar-stacked │ │ │ │ └── index.htm │ │ │ ├── bellcurve │ │ │ │ └── index.htm │ │ │ ├── box-plot │ │ │ │ └── index.htm │ │ │ ├── bubble-3d │ │ │ │ └── index.htm │ │ │ ├── bubble │ │ │ │ └── index.htm │ │ │ ├── bullet-graph │ │ │ │ └── index.htm │ │ │ ├── chart-update │ │ │ │ └── index.htm │ │ │ ├── column-basic │ │ │ │ └── index.htm │ │ │ ├── column-drilldown │ │ │ │ └── index.htm │ │ │ ├── column-negative │ │ │ │ └── index.htm │ │ │ ├── column-parsed │ │ │ │ └── index.htm │ │ │ ├── column-placement │ │ │ │ └── index.htm │ │ │ ├── column-rotated-labels │ │ │ │ └── index.htm │ │ │ ├── column-stacked-and-grouped │ │ │ │ └── index.htm │ │ │ ├── column-stacked-percent │ │ │ │ └── index.htm │ │ │ ├── column-stacked │ │ │ │ └── index.htm │ │ │ ├── columnrange │ │ │ │ └── index.htm │ │ │ ├── combo-dual-axes │ │ │ │ └── index.htm │ │ │ ├── combo-meteogram │ │ │ │ └── index.htm │ │ │ ├── combo-multi-axes │ │ │ │ └── index.htm │ │ │ ├── combo-regression │ │ │ │ └── index.htm │ │ │ ├── combo-timeline │ │ │ │ └── index.htm │ │ │ ├── combo │ │ │ │ └── index.htm │ │ │ ├── dynamic-click-to-add │ │ │ │ └── index.htm │ │ │ ├── dynamic-master-detail │ │ │ │ └── index.htm │ │ │ ├── dynamic-update │ │ │ │ └── index.htm │ │ │ ├── error-bar │ │ │ │ └── index.htm │ │ │ ├── funnel │ │ │ │ └── index.htm │ │ │ ├── gauge-activity │ │ │ │ └── index.htm │ │ │ ├── gauge-clock │ │ │ │ └── index.htm │ │ │ ├── gauge-dual │ │ │ │ └── index.htm │ │ │ ├── gauge-solid │ │ │ │ └── index.htm │ │ │ ├── gauge-speedometer │ │ │ │ └── index.htm │ │ │ ├── gauge-vu-meter │ │ │ │ └── index.htm │ │ │ ├── heatmap-canvas │ │ │ │ └── index.htm │ │ │ ├── heatmap │ │ │ │ └── index.htm │ │ │ ├── histogram │ │ │ │ └── index.htm │ │ │ ├── honeycomb-usa │ │ │ │ └── index.htm │ │ │ ├── line-ajax │ │ │ │ └── index.htm │ │ │ ├── line-basic │ │ │ │ └── index.htm │ │ │ ├── line-boost │ │ │ │ └── index.htm │ │ │ ├── line-labels │ │ │ │ └── index.htm │ │ │ ├── line-log-axis │ │ │ │ └── index.htm │ │ │ ├── line-time-series │ │ │ │ └── index.htm │ │ │ ├── live-data │ │ │ │ └── index.htm │ │ │ ├── parallel-coordinates │ │ │ │ └── index.htm │ │ │ ├── pareto │ │ │ │ └── index.htm │ │ │ ├── pie-basic │ │ │ │ └── index.htm │ │ │ ├── pie-donut │ │ │ │ └── index.htm │ │ │ ├── pie-drilldown │ │ │ │ └── index.htm │ │ │ ├── pie-gradient │ │ │ │ └── index.htm │ │ │ ├── pie-legend │ │ │ │ └── index.htm │ │ │ ├── pie-monochrome │ │ │ │ └── index.htm │ │ │ ├── pie-semi-circle │ │ │ │ └── index.htm │ │ │ ├── polar-spider │ │ │ │ └── index.htm │ │ │ ├── polar-wind-rose │ │ │ │ └── index.htm │ │ │ ├── polar │ │ │ │ └── index.htm │ │ │ ├── polygon │ │ │ │ └── index.htm │ │ │ ├── pyramid │ │ │ │ └── index.htm │ │ │ ├── renderer │ │ │ │ └── index.htm │ │ │ ├── responsive │ │ │ │ └── index.htm │ │ │ ├── sankey-diagram │ │ │ │ └── index.htm │ │ │ ├── scatter-boost │ │ │ │ └── index.htm │ │ │ ├── scatter │ │ │ │ └── index.htm │ │ │ ├── sparkline │ │ │ │ └── index.htm │ │ │ ├── spline-inverted │ │ │ │ └── index.htm │ │ │ ├── spline-irregular-time │ │ │ │ └── index.htm │ │ │ ├── spline-plot-bands │ │ │ │ └── index.htm │ │ │ ├── spline-symbols │ │ │ │ └── index.htm │ │ │ ├── streamgraph │ │ │ │ └── index.htm │ │ │ ├── styled-mode-column │ │ │ │ └── index.htm │ │ │ ├── styled-mode-pie │ │ │ │ └── index.htm │ │ │ ├── sunburst │ │ │ │ └── index.htm │ │ │ ├── synchronized-charts │ │ │ │ └── index.htm │ │ │ ├── treemap-coloraxis │ │ │ │ └── index.htm │ │ │ ├── treemap-large-dataset │ │ │ │ └── index.htm │ │ │ ├── treemap-with-levels │ │ │ │ └── index.htm │ │ │ ├── variable-radius-pie │ │ │ │ └── index.htm │ │ │ ├── variwide │ │ │ │ └── index.htm │ │ │ ├── vector-plot │ │ │ │ └── index.htm │ │ │ ├── waterfall │ │ │ │ └── index.htm │ │ │ ├── windbarb-series │ │ │ │ └── index.htm │ │ │ ├── wordcloud │ │ │ │ └── index.htm │ │ │ └── x-range │ │ │ │ └── index.htm │ │ ├── gfx │ │ │ └── vml-radial-gradient.png │ │ ├── graphics │ │ │ ├── arrow.svg │ │ │ ├── circle.svg │ │ │ ├── cursor.svg │ │ │ ├── earth.svg │ │ │ ├── feature.svg │ │ │ ├── fibonacci.svg │ │ │ ├── flag-circlepin.svg │ │ │ ├── flag-diamondpin.svg │ │ │ ├── flag-flag.svg │ │ │ ├── flag-squarepin.svg │ │ │ ├── flag.svg │ │ │ ├── line.svg │ │ │ ├── rect.svg │ │ │ ├── reset.svg │ │ │ ├── save.svg │ │ │ ├── search.png │ │ │ ├── skies.jpg │ │ │ ├── snow.png │ │ │ ├── sun.png │ │ │ ├── text.svg │ │ │ └── tunnel.svg │ │ ├── index.htm │ │ ├── license.pdf │ │ ├── readme.txt │ │ └── 使用说明.pdf │ │ ├── bootstrap-3.3.7 │ │ ├── css │ │ │ ├── bootstrap-theme.css │ │ │ ├── bootstrap-theme.css.map │ │ │ ├── bootstrap-theme.min.css │ │ │ ├── bootstrap-theme.min.css.map │ │ │ ├── bootstrap.css │ │ │ ├── bootstrap.css.map │ │ │ ├── bootstrap.min.css │ │ │ └── bootstrap.min.css.map │ │ ├── fonts │ │ │ ├── glyphicons-halflings-regular.eot │ │ │ ├── glyphicons-halflings-regular.svg │ │ │ ├── glyphicons-halflings-regular.ttf │ │ │ ├── glyphicons-halflings-regular.woff │ │ │ └── glyphicons-halflings-regular.woff2 │ │ └── js │ │ │ ├── bootstrap.js │ │ │ ├── bootstrap.min.js │ │ │ └── npm.js │ │ ├── font-awesome-4.7.0 │ │ ├── HELP-US-OUT.txt │ │ ├── css │ │ │ ├── font-awesome.css │ │ │ └── font-awesome.min.css │ │ ├── fonts │ │ │ ├── FontAwesome.otf │ │ │ ├── fontawesome-webfont.eot │ │ │ ├── fontawesome-webfont.svg │ │ │ ├── fontawesome-webfont.ttf │ │ │ ├── fontawesome-webfont.woff │ │ │ └── fontawesome-webfont.woff2 │ │ ├── less │ │ │ ├── animated.less │ │ │ ├── bordered-pulled.less │ │ │ ├── core.less │ │ │ ├── fixed-width.less │ │ │ ├── font-awesome.less │ │ │ ├── icons.less │ │ │ ├── larger.less │ │ │ ├── list.less │ │ │ ├── mixins.less │ │ │ ├── path.less │ │ │ ├── rotated-flipped.less │ │ │ ├── screen-reader.less │ │ │ ├── stacked.less │ │ │ └── variables.less │ │ └── scss │ │ │ ├── _animated.scss │ │ │ ├── _bordered-pulled.scss │ │ │ ├── _core.scss │ │ │ ├── _fixed-width.scss │ │ │ ├── _icons.scss │ │ │ ├── _larger.scss │ │ │ ├── _list.scss │ │ │ ├── _mixins.scss │ │ │ ├── _path.scss │ │ │ ├── _rotated-flipped.scss │ │ │ ├── _screen-reader.scss │ │ │ ├── _stacked.scss │ │ │ ├── _variables.scss │ │ │ └── font-awesome.scss │ │ └── sweetalert │ │ ├── jquery-3.3.1.min.js │ │ ├── sweetalert-dev.js │ │ └── sweetalert.css ├── templates │ ├── ansible_add.html │ ├── ansible_add_host.html │ ├── ansible_list.html │ ├── area.html │ ├── base.html │ ├── default.html │ ├── host_add.html │ ├── host_info.html │ ├── host_list.html │ ├── index.html │ └── monitor │ │ ├── cpu.html │ │ └── memory.html ├── tests.py ├── views │ ├── ansible.py │ ├── host.py │ └── index.py └── web_urls.py └── 效果图 ├── ansible主机.png ├── ansible管理.png ├── 主机详情.png └── 首页.png /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | .idea 3 | __pycache__/ 4 | __pycache__ 5 | *.py[cod] 6 | *$py.class 7 | *.pyc 8 | 9 | migrations 10 | 11 | # C extensions 12 | *.so 13 | 14 | # Distribution / packaging 15 | .Python 16 | build/ 17 | develop-eggs/ 18 | dist/ 19 | downloads/ 20 | eggs/ 21 | .eggs/ 22 | lib/ 23 | lib64/ 24 | parts/ 25 | sdist/ 26 | var/ 27 | wheels/ 28 | *.egg-info/ 29 | .installed.cfg 30 | *.egg 31 | MANIFEST 32 | 33 | # PyInstaller 34 | # Usually these files are written by a python script from a template 35 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 36 | *.manifest 37 | *.spec 38 | 39 | # Installer logs 40 | pip-log.txt 41 | pip-delete-this-directory.txt 42 | 43 | # Unit test / coverage reports 44 | htmlcov/ 45 | .tox/ 46 | .coverage 47 | .coverage.* 48 | .cache 49 | nosetests.xml 50 | coverage.xml 51 | *.cover 52 | .hypothesis/ 53 | .pytest_cache/ 54 | 55 | # Translations 56 | *.mo 57 | *.pot 58 | 59 | # Django stuff: 60 | *.log 61 | local_settings.py 62 | #db.sqlite3 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # pyenv 81 | .python-version 82 | 83 | # celery beat schedule file 84 | celerybeat-schedule 85 | 86 | # SageMath parsed files 87 | *.sage.py 88 | 89 | # Environments 90 | .env 91 | .venv 92 | env/ 93 | venv/ 94 | ENV/ 95 | env.bak/ 96 | venv.bak/ 97 | 98 | # Spyder project settings 99 | .spyderproject 100 | .spyproject 101 | 102 | # Rope project settings 103 | .ropeproject 104 | 105 | # mkdocs documentation 106 | /site 107 | 108 | # mypy 109 | .mypy_cache/ 110 | -------------------------------------------------------------------------------- /AutoCmdb/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/AutoCmdb/__init__.py -------------------------------------------------------------------------------- /AutoCmdb/urls.py: -------------------------------------------------------------------------------- 1 | """AutoCmdb URL Configuration 2 | 3 | The `urlpatterns` list routes URLs to views. For more information please see: 4 | https://docs.djangoproject.com/en/1.11/topics/http/urls/ 5 | Examples: 6 | Function views 7 | 1. Add an import: from my_app import views 8 | 2. Add a URL to urlpatterns: url(r'^$', views.home, name='home') 9 | Class-based views 10 | 1. Add an import: from other_app.views import Home 11 | 2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home') 12 | Including another URLconf 13 | 1. Import the include() function: from django.conf.urls import url, include 14 | 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) 15 | """ 16 | from django.conf.urls import url,include 17 | from django.contrib import admin 18 | from api import api_urls 19 | from web import web_urls 20 | 21 | urlpatterns = [ 22 | url(r'^admin/', admin.site.urls), 23 | # api 24 | url(r'^api/', include(api_urls,namespace="api")), 25 | # 前端页面 26 | url(r'^web/', include(web_urls,namespace="web")), 27 | ] 28 | -------------------------------------------------------------------------------- /AutoCmdb/wsgi.py: -------------------------------------------------------------------------------- 1 | """ 2 | WSGI config for AutoCmdb project. 3 | 4 | It exposes the WSGI callable as a module-level variable named ``application``. 5 | 6 | For more information on this file, see 7 | https://docs.djangoproject.com/en/1.11/howto/deployment/wsgi/ 8 | """ 9 | 10 | import os 11 | 12 | from django.core.wsgi import get_wsgi_application 13 | 14 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "AutoCmdb.settings") 15 | 16 | application = get_wsgi_application() 17 | -------------------------------------------------------------------------------- /ansible_client/monitor/cpu.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | import time 5 | import json 6 | import psutil 7 | import socket 8 | import requests 9 | 10 | 11 | class CpuMonitor(object): 12 | def __init__(self): 13 | self.data = {} 14 | 15 | def getCPUstate(self): # 监控cpu 16 | interval = 1 17 | cpu = psutil.cpu_percent(interval) # cpu使用率 18 | struct_time = time.localtime() 19 | create_time = time.strftime("%Y-%m-%d %H:%M:%S", struct_time) # 转换为标准时间 20 | t = time.time() # 当前时间戳 21 | time_stamp = int(round(t * 1000)) # 转换为毫秒的时间戳 22 | 23 | self.data['cpu'] = cpu 24 | self.data['create_time'] = create_time 25 | self.data['time_stamp'] = time_stamp 26 | 27 | return self.data 28 | 29 | def get_host_ip(self): 30 | """ 31 | 查询本机ip地址 32 | :return: ip 33 | """ 34 | try: 35 | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 36 | s.connect(('8.8.8.8', 80)) 37 | ip = s.getsockname()[0] 38 | finally: 39 | s.close() 40 | return ip 41 | 42 | def send(self): # 发送给后端服务器 43 | ip = self.get_host_ip() 44 | data = self.getCPUstate() # type:dict 45 | data['ip'] = ip 46 | 47 | response = requests.post('http://192.168.142.128:8000/api/cpu/add/', data=data) 48 | return response.content 49 | 50 | 51 | res = CpuMonitor().send() 52 | result = json.loads(res.decode("utf-8")) # type:dict 53 | 54 | if result.get("error"): 55 | print("发送失败!", result.get("error")) 56 | else: 57 | print("发送成功!") 58 | -------------------------------------------------------------------------------- /ansible_client/monitor/memory.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python3 2 | # -*- coding: utf-8 -*- 3 | 4 | import time 5 | import json 6 | import psutil 7 | import socket 8 | import requests 9 | 10 | 11 | class MemoryMonitor(object): 12 | def __init__(self): 13 | self.data = {} 14 | 15 | def getMemorystate(self): # 监控内存 16 | phymem = psutil.virtual_memory() 17 | 18 | mem_all = int(phymem.total / 1024 / 1024) # 总内存,转换为MB单位 19 | mem_free = int(phymem.free / 1024 / 1024) # 剩余内存 20 | 21 | cur_mem = mem_all - mem_free # 当前使用内存 22 | 23 | mem_rate = round((cur_mem/mem_all),2)*100 # 内存使用率,保留2位小数点 24 | # print(mem_rate) 25 | 26 | struct_time = time.localtime() 27 | create_time = time.strftime("%Y-%m-%d %H:%M:%S", struct_time) # 转换为标准时间 28 | t = time.time() # 当前时间戳 29 | time_stamp = int(round(t * 1000)) # 转换为毫秒的时间戳 30 | 31 | self.data['cur_mem'] = cur_mem 32 | self.data['mem_rate'] = mem_rate 33 | self.data['mem_all'] = mem_all 34 | self.data['create_time'] = create_time 35 | self.data['time_stamp'] = time_stamp 36 | 37 | return self.data 38 | 39 | def get_host_ip(self): 40 | """ 41 | 查询本机ip地址 42 | :return: ip 43 | """ 44 | try: 45 | s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 46 | s.connect(('8.8.8.8', 80)) 47 | ip = s.getsockname()[0] 48 | finally: 49 | s.close() 50 | return ip 51 | 52 | def send(self): 53 | ip = self.get_host_ip() 54 | data = self.getMemorystate() # type:dict 55 | data['ip'] = ip 56 | 57 | # 发送post请求 58 | response = requests.post('http://192.168.142.128:8000/api/memory/add/', data=data) 59 | return response.content 60 | 61 | 62 | res = MemoryMonitor().send() 63 | result = json.loads(res.decode("utf-8")) # type:dict 64 | 65 | if result.get("error"): 66 | print("发送失败!", result.get("error")) 67 | else: 68 | print("发送成功!") 69 | -------------------------------------------------------------------------------- /api/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/api/__init__.py -------------------------------------------------------------------------------- /api/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /api/api_urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls import url,include 2 | from api.views import host,hostinfo,disk,network,ansible 3 | from api.views.monit import cpu,memory 4 | app_name = 'api' 5 | 6 | urlpatterns = [ 7 | url(r'host/(?P\d+)/$',host.HostView.as_view({'get':'get_msg'}),name='host'), 8 | url(r'host/list/$',host.HostView.as_view({'post':'list'}),name='list'), 9 | 10 | url(r'host/hostinfo/(?P\d+)/$',hostinfo.HostInfoView.as_view({'get':'get_msg'}),name='info'), 11 | url(r'host/disk/(?P\d+)/$',disk.DiskView.as_view({'get':'get_msg'}),name='disk'), 12 | url(r'host/network/(?P\d+)/$',network.NetworkView.as_view({'get':'get_msg'}),name='network'), 13 | url(r'host/add/$',host.HostView.as_view({'post':'add'}),name='add'), 14 | url(r'host/delete/(?P\d+)/$',host.HostView.as_view({'delete':'delete'}),name='delete'), 15 | 16 | url(r'cpu/add/$',cpu.CpuView.as_view({'post':'add'}),name='cpu'), 17 | url(r'memory/add/$',memory.MemoryView.as_view({'post':'add'}),name='memory'), 18 | 19 | url(r'cpu/chart_json/(?P\d+)/$',cpu.CpuView.as_view({'get':'chart_json'}),name='chart_cpu'), 20 | url(r'memory/chart_json/(?P\d+)/$',memory.MemoryView.as_view({'get':'chart_json'}),name='chart_memory'), 21 | 22 | url(r'ansible/add/$',ansible.AnsibleView.as_view({'post':'add'}),name='ansible_add'), 23 | url(r'ansible/list/$',ansible.AnsibleView.as_view({'post':'list'}),name='ansible_list'), 24 | url(r'ansible/add_host/$',ansible.AnsibleView.as_view({'post':'add_host'}),name='ansible_add_host'), 25 | url(r'ansible/delete/(?P\d+)/$',ansible.AnsibleView.as_view({'delete':'delete'}),name='ansible_delete'), 26 | ] -------------------------------------------------------------------------------- /api/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class ApiConfig(AppConfig): 5 | name = 'api' 6 | -------------------------------------------------------------------------------- /api/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /api/serializers/ansible.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from repository import models 3 | 4 | class AnsibleSerializer(serializers.ModelSerializer): 5 | host = serializers.SerializerMethodField() 6 | 7 | class Meta: 8 | model = models.AnsibleGroup 9 | # fields = '__all__' 10 | fields = ['id', 'name', 'host'] 11 | 12 | def get_host(self, row): 13 | host_list = row.ansiblehost_set.all() 14 | return [{'ip': item.ip} for item in host_list] -------------------------------------------------------------------------------- /api/serializers/disk.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from repository import models 3 | 4 | 5 | class DiskSerializer(serializers.ModelSerializer): 6 | class Meta: 7 | model = models.Disk 8 | fields = '__all__' -------------------------------------------------------------------------------- /api/serializers/host.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from repository import models 3 | 4 | 5 | class HostSerializer(serializers.ModelSerializer): 6 | class Meta: 7 | model = models.Host 8 | fields = '__all__' 9 | 10 | 11 | class HostListSerializer(serializers.ModelSerializer): 12 | ipaddr = serializers.SerializerMethodField() 13 | 14 | class Meta: 15 | model = models.Host 16 | # fields = '__all__' 17 | fields = ['id', 'hostname', 'cpu', 'memory', 'os', 'status', 'ipaddr'] 18 | 19 | def get_ipaddr(self, row): 20 | ipaddr_list = row.network_set.all() 21 | return [{'ipaddr': item.ipaddr} for item in ipaddr_list] 22 | -------------------------------------------------------------------------------- /api/serializers/hostinfo.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from repository import models 3 | 4 | 5 | class HostInfoSerializer(serializers.ModelSerializer): 6 | class Meta: 7 | model = models.HostInfo 8 | fields = '__all__' 9 | # fields = ['cpu_info'] -------------------------------------------------------------------------------- /api/serializers/network.py: -------------------------------------------------------------------------------- 1 | from rest_framework import serializers 2 | from repository import models 3 | 4 | 5 | class NetworkSerializer(serializers.ModelSerializer): 6 | class Meta: 7 | model = models.Network 8 | fields = '__all__' -------------------------------------------------------------------------------- /api/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /api/utils/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- -------------------------------------------------------------------------------- /api/utils/ansible/__init__.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- -------------------------------------------------------------------------------- /api/utils/ansible/hosts_fm.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | """ 4 | /etc/ansible/hosts 文件管理 5 | 数据库有变动时,查询目前的数据库记录。 6 | 将查询的结果转换为字典,重写/etc/ansible/hosts 7 | """ 8 | # from configparser import ConfigParser 9 | from api.utils.response import BaseResponse 10 | 11 | 12 | class FM(object): # 文件管理 13 | def __init__(self,queryset): 14 | self.queryset = queryset 15 | self.hosts = '/etc/ansible/hosts' 16 | self.res = BaseResponse() 17 | 18 | # def dict_result(self): 19 | # """ 20 | # 将ansible的主机配置文件转换为字典 21 | # :return: dict 22 | # {'web': ['192.168.142.129', '192.168.142.131']} 23 | # """ 24 | # dict_result = {} 25 | # cf = ConfigParser(allow_no_value=True) 26 | # cf.read(self.hosts) 27 | # secs = cf.sections() 28 | # for sec in secs: 29 | # dict_result[sec] = cf.options(sec) 30 | # 31 | # # print(json.dumps(dict_result)) 32 | # # print(dict_result) 33 | # return dict_result 34 | 35 | 36 | def queryset_dict(self): 37 | # queryset = models.AnsibleGroup.objects.all() 38 | # {'web': ['192.168.142.129', '192.168.142.131']} 39 | # li = [] # 总列表 40 | dic = {} 41 | for i in self.queryset: 42 | dic[i.name] = [] # 定义空列表,比如: {'web':[]} 43 | for j in i.ansiblehost_set.all(): 44 | dic[i.name].append(j.ip) # 将ip写入到列表中 45 | 46 | # li.append(dic) # 将字典写入到总列表中 47 | return dic 48 | 49 | def write(self): 50 | """ 51 | 将数据库的记录重新写入ansible的主机配置文件 52 | 是直接覆盖 53 | :return: 54 | """ 55 | # dic = {'app': ['192.168.10.129', '192.168.10.131'], 'web': ['192.168.142.129', '192.168.142.131']} 56 | dic = self.queryset_dict() 57 | 58 | try: 59 | # 写入配置文件 60 | with open(self.hosts, 'w', encoding="utf-8") as f: 61 | for group in dic: 62 | # 写入组名,比如[web] 63 | f.write('[{}]'.format(group) + "\n") 64 | for ip in dic[group]: 65 | # 写入ip,比如192.168.10.129 66 | f.write(ip + "\n") 67 | 68 | f.write("\n") # 末尾再加一个换行符 69 | 70 | return self.res.__dict__ 71 | 72 | except Exception as e: 73 | print(e) 74 | self.res.code = 500 75 | self.res.error = "写入/etc/ansible/hosts失败" 76 | return self.res.__dict__ -------------------------------------------------------------------------------- /api/utils/ansible/remotExect.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/expect -f 2 | 3 | set timeout 1 4 | set port [lindex $argv 0] 5 | set username [lindex $argv 1] 6 | set password [lindex $argv 2] 7 | set hostname [lindex $argv 3] 8 | 9 | 10 | spawn ssh-copy-id -p $port $username@$hostname 11 | expect { 12 | "password:" { send "$password\r" } 13 | } 14 | expect "#" 15 | send -- "\r" 16 | expect eof 17 | -------------------------------------------------------------------------------- /api/utils/auth.py: -------------------------------------------------------------------------------- 1 | from rest_framework.authentication import BaseAuthentication 2 | from rest_framework.exceptions import AuthenticationFailed 3 | 4 | from api import models 5 | 6 | 7 | 8 | class Authentication(BaseAuthentication): 9 | 10 | def authenticate(self, request): 11 | """ 12 | 用户认证 13 | :param request: 14 | :return: 15 | """ 16 | # print(request.method) 17 | # 判断请求方式 18 | if request.method == "GET": 19 | token = request.query_params.get('token') 20 | else: 21 | token = request.data.get('token') 22 | 23 | # print('auth',token) 24 | token_obj = models.Token.objects.filter(token=token).first() 25 | if not token_obj: 26 | # 认证失败 27 | raise AuthenticationFailed({'code':1008,'error':'认证失败'}) 28 | # 认证成功 29 | # return (token_obj.user,token_obj) 30 | return (token_obj.user,token_obj) -------------------------------------------------------------------------------- /api/utils/response.py: -------------------------------------------------------------------------------- 1 | 2 | class BaseResponse(object): 3 | 4 | def __init__(self): 5 | self.code = 200 6 | self.data = None 7 | self.error = None 8 | 9 | @property 10 | def dict(self): 11 | return self.__dict__ 12 | 13 | ''' 14 | response = BaseResponse() # 默认状态 15 | object 16 | code:200 # 前端代码判断 17 | data:None # 前端渲染页面 18 | error:None # 前端错误展示 19 | 20 | {'code':1000,'data':None,'error':None} 21 | 22 | ''' -------------------------------------------------------------------------------- /api/utils/serialization_general.py: -------------------------------------------------------------------------------- 1 | from api.utils.response import BaseResponse 2 | from rest_framework.pagination import PageNumberPagination 3 | 4 | class SerializedData(object): # 序列化通用格式数据 5 | def __init__(self,request,queryset,serializer_class): 6 | self.request = request 7 | self.queryset = queryset 8 | self.serializer_class = serializer_class 9 | 10 | 11 | def get_data(self): 12 | ret = BaseResponse() 13 | try: 14 | # 从数据库获取数据 15 | queryset = self.queryset.order_by('id') 16 | 17 | # 分页 18 | page = PageNumberPagination() 19 | course_list = page.paginate_queryset(queryset, self.request, self) 20 | 21 | # 分页之后的结果执行序列化 22 | ser = self.serializer_class(instance=course_list, many=True) 23 | # print(ser.data) 24 | 25 | if not ser.data: 26 | ret.code = 500 27 | ret.error = '数据为空' 28 | else: 29 | ret.data = ser.data 30 | 31 | except Exception as e: 32 | print(e) 33 | ret.code = 500 34 | ret.error = '获取数据失败' 35 | 36 | return ret.dict -------------------------------------------------------------------------------- /api/views/disk.py: -------------------------------------------------------------------------------- 1 | from rest_framework.response import Response 2 | from django.shortcuts import HttpResponse 3 | from rest_framework.views import APIView 4 | from rest_framework.viewsets import ViewSetMixin 5 | from repository import models 6 | from api.utils.response import BaseResponse 7 | 8 | 9 | from api.serializers.disk import DiskSerializer 10 | from api.utils.serialization_general import SerializedData 11 | from api.utils.auth import Authentication 12 | import json 13 | 14 | 15 | class DiskView(ViewSetMixin, APIView): 16 | def get_msg(self, request,pk, *args, **kwargs): 17 | """ 18 | 磁盘信息 19 | :param request: 20 | :param args: 21 | :param kwargs: 22 | :return: 23 | """ 24 | 25 | queryset = models.Disk.objects.filter(host_id=pk) 26 | # print(queryset.values()) 27 | serializer_class = DiskSerializer 28 | data = SerializedData(request, queryset, serializer_class).get_data() 29 | # print(data) 30 | # if not data: 31 | 32 | return HttpResponse(json.dumps(data)) 33 | # return Response(data) -------------------------------------------------------------------------------- /api/views/hostinfo.py: -------------------------------------------------------------------------------- 1 | from rest_framework.response import Response 2 | from django.shortcuts import HttpResponse 3 | from rest_framework.views import APIView 4 | from rest_framework.viewsets import ViewSetMixin 5 | from repository import models 6 | from api.utils.response import BaseResponse 7 | 8 | 9 | from api.serializers.hostinfo import HostInfoSerializer 10 | from api.utils.serialization_general import SerializedData 11 | from api.utils.auth import Authentication 12 | import json 13 | 14 | 15 | class HostInfoView(ViewSetMixin, APIView): 16 | def get_msg(self, request,pk, *args, **kwargs): 17 | """ 18 | 主机详情 19 | :param request: 20 | :param args: 21 | :param kwargs: 22 | :return: 23 | """ 24 | 25 | queryset = models.HostInfo.objects.filter(host_id=pk) 26 | # print(queryset.values()) 27 | serializer_class = HostInfoSerializer 28 | data = SerializedData(request, queryset, serializer_class).get_data() 29 | 30 | return HttpResponse(json.dumps(data)) 31 | # return Response(data) -------------------------------------------------------------------------------- /api/views/network.py: -------------------------------------------------------------------------------- 1 | from rest_framework.response import Response 2 | from django.shortcuts import HttpResponse 3 | from rest_framework.views import APIView 4 | from rest_framework.viewsets import ViewSetMixin 5 | from repository import models 6 | from api.utils.response import BaseResponse 7 | 8 | 9 | from api.serializers.network import NetworkSerializer 10 | from api.utils.serialization_general import SerializedData 11 | from api.utils.auth import Authentication 12 | import json 13 | 14 | 15 | class NetworkView(ViewSetMixin, APIView): 16 | def get_msg(self, request,pk, *args, **kwargs): 17 | """ 18 | 主机详情 19 | :param request: 20 | :param args: 21 | :param kwargs: 22 | :return: 23 | """ 24 | 25 | queryset = models.Network.objects.filter(host_id=pk) 26 | # print(queryset.values()) 27 | serializer_class = NetworkSerializer 28 | data = SerializedData(request, queryset, serializer_class).get_data() 29 | # print(data) 30 | return HttpResponse(json.dumps(data)) 31 | # return Response(data) -------------------------------------------------------------------------------- /cron/test_orm.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # -*- coding: utf-8 -*- 3 | import os 4 | import time 5 | import sys 6 | import subprocess 7 | import json 8 | 9 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 项目根目录 10 | sys.path.append(BASE_DIR) 11 | 12 | if __name__ == "__main__": 13 | # from AutoCmdb.settings import BASE_DIR 14 | # print(BASE_DIR) 15 | # exit() 16 | # 设置django环境 17 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "AutoCmdb.settings") 18 | import django 19 | django.setup() 20 | 21 | from repository import models 22 | 23 | queryset = models.AnsibleGroup.objects.all() 24 | print(queryset) 25 | -------------------------------------------------------------------------------- /db.sqlite3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/db.sqlite3 -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | import os 3 | import sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "AutoCmdb.settings") 7 | try: 8 | from django.core.management import execute_from_command_line 9 | except ImportError: 10 | # The above import may fail for some other reason. Ensure that the 11 | # issue is really that Django is missing to avoid masking other 12 | # exceptions on Python 2. 13 | try: 14 | import django 15 | except ImportError: 16 | raise ImportError( 17 | "Couldn't import Django. Are you sure it's installed and " 18 | "available on your PYTHONPATH environment variable? Did you " 19 | "forget to activate a virtual environment?" 20 | ) 21 | raise 22 | execute_from_command_line(sys.argv) 23 | -------------------------------------------------------------------------------- /repository/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/repository/__init__.py -------------------------------------------------------------------------------- /repository/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /repository/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class RepositoryConfig(AppConfig): 5 | name = 'repository' 6 | -------------------------------------------------------------------------------- /repository/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | 5 | -------------------------------------------------------------------------------- /repository/views.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | # Create your views here. 4 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | ansible==2.7.0 2 | asn1crypto==0.24.0 3 | bcrypt==3.1.4 4 | cffi==1.11.5 5 | cryptography==2.3.1 6 | Django==1.11.15 7 | djangorestframework==3.8.2 8 | idna==2.7 9 | Jinja2==2.10 10 | MarkupSafe==1.0 11 | paramiko==2.4.2 12 | pyasn1==0.4.4 13 | pycparser==2.19 14 | PyNaCl==1.3.0 15 | pytz==2018.5 16 | PyYAML==3.13 17 | six==1.11.0 18 | -------------------------------------------------------------------------------- /web/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/__init__.py -------------------------------------------------------------------------------- /web/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | 3 | # Register your models here. 4 | -------------------------------------------------------------------------------- /web/apps.py: -------------------------------------------------------------------------------- 1 | from django.apps import AppConfig 2 | 3 | 4 | class WebConfig(AppConfig): 5 | name = 'web' 6 | -------------------------------------------------------------------------------- /web/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | # Create your models here. 4 | -------------------------------------------------------------------------------- /web/static/img/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/ajax-loader.gif -------------------------------------------------------------------------------- /web/static/img/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/avatar.png -------------------------------------------------------------------------------- /web/static/img/avatar04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/avatar04.png -------------------------------------------------------------------------------- /web/static/img/avatar2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/avatar2.png -------------------------------------------------------------------------------- /web/static/img/avatar3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/avatar3.png -------------------------------------------------------------------------------- /web/static/img/avatar5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/avatar5.png -------------------------------------------------------------------------------- /web/static/img/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/favicon.ico -------------------------------------------------------------------------------- /web/static/img/photo1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/photo1.png -------------------------------------------------------------------------------- /web/static/img/photo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/photo2.png -------------------------------------------------------------------------------- /web/static/img/photo3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/photo3.jpg -------------------------------------------------------------------------------- /web/static/img/photo4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/photo4.jpg -------------------------------------------------------------------------------- /web/static/img/user1-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/user1-128x128.jpg -------------------------------------------------------------------------------- /web/static/img/user2-160x160.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/user2-160x160.jpg -------------------------------------------------------------------------------- /web/static/img/user3-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/user3-128x128.jpg -------------------------------------------------------------------------------- /web/static/img/user4-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/user4-128x128.jpg -------------------------------------------------------------------------------- /web/static/img/user5-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/user5-128x128.jpg -------------------------------------------------------------------------------- /web/static/img/user6-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/user6-128x128.jpg -------------------------------------------------------------------------------- /web/static/img/user7-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/user7-128x128.jpg -------------------------------------------------------------------------------- /web/static/img/user8-128x128.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/img/user8-128x128.jpg -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/modules/bullet.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | Bullet graph series type for Highcharts 5 | 6 | (c) 2010-2017 Kacper Madej 7 | 8 | License: www.highcharts.com/license 9 | */ 10 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){(function(c){var a=c.each,l=c.isNumber,r=c.relativeLength,m=c.seriesType,d=c.seriesTypes.column.prototype;m("bullet","column",{targetOptions:{width:"140%",height:3},tooltip:{pointFormat:'\x3cspan class\x3d"highcharts-color-{point.colorIndex}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cspan class\x3d"highcharts-strong"\x3e{point.y}\x3c/span\x3e. Target: \x3cspan class\x3d"highcharts-strong"\x3e{point.target}\x3c/span\x3e\x3cbr/\x3e'}}, 11 | {pointArrayMap:["y","target"],parallelArrays:["x","y","target"],drawPoints:function(){var h=this,g=h.chart,n=h.options,m=n.animationLimit||250;d.drawPoints.apply(this);a(h.points,function(b){var f=b.options,e=b.targetGraphic,a=b.target,d=b.y,p,q,k;l(a)&&null!==a?(k=c.merge(n.targetOptions,f.targetOptions),q=k.height,f=b.shapeArgs,p=r(k.width,f.width),a=h.yAxis.translate(a,!1,!0,!1,!0)-k.height/2-.5,f=h.crispCol.apply({chart:g,borderWidth:k.borderWidth,options:{crisp:n.crisp}},[f.x+f.width/2-p/2,a, 12 | p,q]),e?(e[g.pointCounty||l===F?x:x+(D-x)*(1-(b-a)/(l-F))};this.getX=function(b,a,d){return g+(a?-1:1)*(w(c?2*r-b:b)/2+d.labelDistance)};this.center=[g,r,l];this.centerX=g;I(d,function(b){v&&!1===b.visible|| 11 | (a+=b.y)});I(d,function(b){n=null;B=a?b.y/a:0;m=r-l/2+q*l;h=m+B*l;k=w(m);C=g-k/2;G=C+k;k=w(h);u=g-k/2;z=u+k;m>y?(C=u=g-x/2,G=z=g+x/2):h>y&&(n=h,k=w(y),u=g-k/2,z=u+k,h=y);c&&(m=2*r-m,h=2*r-h,null!==n&&(n=2*r-n));A=["M",C,m,"L",G,m,z,h];null!==n&&A.push(z,n,u,n);A.push(u,h,"Z");b.shapeType="path";b.shapeArgs={d:A};b.percentage=100*B;b.plotX=g;b.plotY=(m+(n||h))/2;b.tooltipPos=[g,b.plotY];b.slice=H;b.half=E;v&&!1===b.visible||(q+=B)})},sortByAngle:function(a){a.sort(function(a,d){return a.plotY-d.plotY})}, 12 | drawDataLabels:function(){var a=this.data,p=this.options.dataLabels.distance,f,e,c,v=a.length,t,q;for(this.center[2]-=2*p;v--;)c=a[v],e=(f=c.half)?1:-1,q=c.plotY,c.labelDistance=E(c.options.dataLabels&&c.options.dataLabels.distance,p),this.maxLabelDistance=Math.max(c.labelDistance,this.maxLabelDistance||0),t=this.getX(q,f,c),c.labelPos=[0,q,t+(c.labelDistance-5)*e,q,t+c.labelDistance*e,q,f?"right":"left",0];D.pie.prototype.drawDataLabels.call(this)}});p("pyramid","funnel",{neckWidth:"0%",neckHeight:"0%", 13 | reversed:!0})})(a)}); 14 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/modules/item-series.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | Item series type for Highcharts 5 | 6 | (c) 2010-2017 Torstein Honsi 7 | 8 | License: www.highcharts.com/license 9 | */ 10 | (function(b){"object"===typeof module&&module.exports?module.exports=b:"function"===typeof define&&define.amd?define(function(){return b}):b(Highcharts)})(function(b){(function(d){var b=d.each,x=d.extend,u=d.pick,q=d.seriesType;q("item","column",{itemPadding:.2,marker:{symbol:"circle",states:{hover:{},select:{}}}},{drawPoints:function(){var c=this,h=c.chart.renderer,k=this.options.marker,l=this.yAxis.transA*c.options.itemPadding,m=this.borderWidth%2?.5:1;b(this.points,function(a){var b,e,f,g,r;b= 11 | a.marker||{};var v=b.symbol||k.symbol,q=u(b.radius,k.radius),n,t,w="rect"!==v,p;a.graphics=f=a.graphics||{};r=a.pointAttr?a.pointAttr[a.selected?"selected":""]||c.pointAttr[""]:c.pointAttribs(a,a.selected&&"select");delete r.r;if(null!==a.y)for(a.graphic||(a.graphic=h.g("point").add(c.group)),g=a.y,t=u(a.stackY,a.y),n=Math.min(a.pointWidth,c.yAxis.transA-l),b=t;b>t-a.y;b--)e=a.barX+(w?a.pointWidth/2-n/2:0),p=c.yAxis.toPixels(b,!0)+l/2,c.options.crisp&&(e=Math.round(e)-m,p=Math.round(p)+m),e={x:e, 12 | y:p,width:Math.round(w?n:a.pointWidth),height:Math.round(n),r:q},f[g]?f[g].animate(e):f[g]=h.symbol(v).attr(x(e,r)).add(a.graphic),f[g].isActive=!0,g--;d.objectEach(f,function(a,b){a.isActive?a.isActive=!1:(a.destroy(),delete a[b])})})}});d.SVGRenderer.prototype.symbols.rect=function(b,h,k,l,m){return d.SVGRenderer.prototype.symbols.callout(b,h,k,l,m)}})(b)}); 13 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/modules/no-data-to-display.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | Plugin for displaying a message when there is no data visible in chart. 4 | 5 | (c) 2010-2017 Highsoft AS 6 | Author: Oystein Moseng 7 | 8 | License: www.highcharts.com/license 9 | */ 10 | (function(c){"object"===typeof module&&module.exports?module.exports=c:"function"===typeof define&&define.amd?define(function(){return c}):c(Highcharts)})(function(c){(function(d){var c=d.seriesTypes,e=d.Chart.prototype,f=d.getOptions(),g=d.extend,h=d.each;g(f.lang,{noData:"No data to display"});f.noData={position:{x:0,y:0,align:"center",verticalAlign:"middle"}};h("bubble gauge heatmap pie sankey treemap waterfall".split(" "),function(b){c[b]&&(c[b].prototype.hasData=function(){return!!this.points.length})}); 11 | d.Series.prototype.hasData=function(){return this.visible&&void 0!==this.dataMax&&void 0!==this.dataMin};e.showNoData=function(b){var a=this.options;b=b||a&&a.lang.noData;a=a&&a.noData;!this.noDataLabel&&this.renderer&&(this.noDataLabel=this.renderer.label(b,0,0,null,null,null,a.useHTML,null,"no-data"),this.noDataLabel.add(),this.noDataLabel.align(g(this.noDataLabel.getBBox(),a.position),!1,"plotBox"))};e.hideNoData=function(){this.noDataLabel&&(this.noDataLabel=this.noDataLabel.destroy())};e.hasData= 12 | function(){for(var b=this.series||[],a=b.length;a--;)if(b[a].hasData()&&!b[a].options.isInternal)return!0;return this.loadingShown};d.addEvent(d.Chart,"render",function(){this.hasData()?this.hideNoData():this.showNoData()})})(c)}); 13 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/modules/overlapping-datalabels.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | (c) 2009-2017 Torstein Honsi 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){}); 9 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/modules/overlapping-datalabels.src.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license Highcharts JS v6.1.2 (2018-08-31) 3 | * 4 | * (c) 2009-2017 Torstein Honsi 5 | * 6 | * License: www.highcharts.com/license 7 | */ 8 | 'use strict'; 9 | (function (factory) { 10 | if (typeof module === 'object' && module.exports) { 11 | module.exports = factory; 12 | } else if (typeof define === 'function' && define.amd) { 13 | define(function () { 14 | return factory; 15 | }); 16 | } else { 17 | factory(Highcharts); 18 | } 19 | }(function (Highcharts) { 20 | 21 | })); 22 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/modules/pareto.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | Pareto series type for Highcharts 5 | 6 | (c) 2010-2017 Sebastian Bochan 7 | 8 | License: www.highcharts.com/license 9 | */ 10 | (function(c){"object"===typeof module&&module.exports?module.exports=c:"function"===typeof define&&define.amd?define(function(){return c}):c(Highcharts)})(function(c){var m=function(b){var c=b.each,e=b.Series,f=b.addEvent;return{init:function(){e.prototype.init.apply(this,arguments);this.initialised=!1;this.baseSeries=null;this.eventRemovers=[];this.addEvents()},setDerivedData:b.noop,setBaseSeries:function(){var a=this.chart,d=this.options.baseSeries;this.baseSeries=d&&(a.series[d]||a.get(d))||null}, 11 | addEvents:function(){var a=this,d;d=f(this.chart,"afterLinkSeries",function(){a.setBaseSeries();a.baseSeries&&!a.initialised&&(a.setDerivedData(),a.addBaseSeriesEvents(),a.initialised=!0)});this.eventRemovers.push(d)},addBaseSeriesEvents:function(){var a=this,d,b;d=f(a.baseSeries,"updatedData",function(){a.setDerivedData()});b=f(a.baseSeries,"destroy",function(){a.baseSeries=null;a.initialised=!1});a.eventRemovers.push(d,b)},destroy:function(){c(this.eventRemovers,function(a){a()});e.prototype.destroy.apply(this, 12 | arguments)}}}(c);(function(b,c){var e=b.each,f=b.correctFloat,a=b.seriesType;b=b.merge;a("pareto","line",{zIndex:3},b(c,{setDerivedData:function(){if(1= 1) { 57 | chart.plotHeight = height; 58 | chart.setSize(null, chart.chartHeight + diff, animate); 59 | } 60 | } 61 | 62 | }); 63 | this.initiatedScale = true; 64 | }; 65 | H.addEvent(Chart, 'render', Chart.prototype.adjustHeight); 66 | 67 | }(Highcharts)); 68 | return (function () { 69 | 70 | 71 | }()); 72 | })); 73 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/modules/streamgraph.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | Streamgraph module 4 | 5 | (c) 2010-2017 Torstein Honsi 6 | 7 | License: www.highcharts.com/license 8 | */ 9 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){(function(a){a=a.seriesType;a("streamgraph","areaspline",{fillOpacity:1,lineWidth:0,marker:{enabled:!1},stacking:"stream"},{negStacks:!1,streamStacker:function(a,b,c){a[0]-=b.total/2;a[1]-=b.total/2;this.stackedYData[c]=a}})})(a)}); 10 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/modules/vector.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | Vector plot series module 4 | 5 | (c) 2010-2017 Torstein Honsi 6 | 7 | License: www.highcharts.com/license 8 | */ 9 | (function(d){"object"===typeof module&&module.exports?module.exports=d:"function"===typeof define&&define.amd?define(function(){return d}):d(Highcharts)})(function(d){(function(c){var d=c.each,e=c.seriesType;e("vector","scatter",{lineWidth:2,marker:null,rotationOrigin:"center",states:{hover:{lineWidthPlus:1}},tooltip:{pointFormat:"\x3cb\x3e[{point.x}, {point.y}]\x3c/b\x3e\x3cbr/\x3eLength: \x3cb\x3e{point.length}\x3c/b\x3e\x3cbr/\x3eDirection: \x3cb\x3e{point.direction}\u00b0\x3c/b\x3e\x3cbr/\x3e"}, 10 | vectorLength:20},{pointArrayMap:["y","length","direction"],parallelArrays:["x","y","length","direction"],pointAttribs:function(a,b){var c=this.options;a=a.color||this.color;var d=this.options.lineWidth;b&&(a=c.states[b].color||a,d=(c.states[b].lineWidth||d)+(c.states[b].lineWidthPlus||0));return{stroke:a,"stroke-width":d}},markerAttribs:c.noop,getSymbol:c.noop,arrow:function(a){a=a.length/this.lengthMax*this.options.vectorLength/20;var b={start:10*a,center:0,end:-10*a}[this.options.rotationOrigin]|| 11 | 0;return["M",0,7*a+b,"L",-1.5*a,7*a+b,0,10*a+b,1.5*a,7*a+b,0,7*a+b,0,-10*a+b]},translate:function(){c.Series.prototype.translate.call(this);this.lengthMax=c.arrayMax(this.lengthData)},drawPoints:function(){var a=this.chart;d(this.points,function(b){var c=b.plotX,d=b.plotY;a.isInsidePlot(c,d,a.inverted)?(b.graphic||(b.graphic=this.chart.renderer.path().add(this.markerGroup)),b.graphic.attr({d:this.arrow(b),translateX:c,translateY:d,rotation:b.direction}).attr(this.pointAttribs(b))):b.graphic&&(b.graphic= 12 | b.graphic.destroy())},this)},drawGraph:c.noop,animate:function(a){a?this.markerGroup.attr({opacity:.01}):(this.markerGroup.animate({opacity:1},c.animObject(this.options.animation)),this.animate=null)}})})(d)}); 13 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/themes/avocado.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | (c) 2009-2017 Highsoft AS 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){a.theme={colors:["#F3E796","#95C471","#35729E","#251735"],colorAxis:{maxColor:"#05426E",minColor:"#F3E796"},plotOptions:{map:{nullColor:"#fcfefe"}},navigator:{maskFill:"rgba(170, 205, 170, 0.5)",series:{color:"#95C471",lineColor:"#35729E"}}};a.setOptions(a.theme)}); 9 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/themes/avocado.src.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license Highcharts JS v6.1.2 (2018-08-31) 3 | * 4 | * (c) 2009-2017 Highsoft AS 5 | * 6 | * License: www.highcharts.com/license 7 | */ 8 | 'use strict'; 9 | (function (factory) { 10 | if (typeof module === 'object' && module.exports) { 11 | module.exports = factory; 12 | } else if (typeof define === 'function' && define.amd) { 13 | define(function () { 14 | return factory; 15 | }); 16 | } else { 17 | factory(Highcharts); 18 | } 19 | }(function (Highcharts) { 20 | (function (Highcharts) { 21 | /** 22 | * (c) 2010-2017 Highsoft AS 23 | * 24 | * License: www.highcharts.com/license 25 | * 26 | * Accessible high-contrast theme for Highcharts. Considers colorblindness and 27 | * monochrome rendering. 28 | * @author Øystein Moseng 29 | */ 30 | 31 | Highcharts.theme = { 32 | colors: ['#F3E796', '#95C471', '#35729E', '#251735'], 33 | 34 | colorAxis: { 35 | maxColor: '#05426E', 36 | minColor: '#F3E796' 37 | }, 38 | 39 | plotOptions: { 40 | map: { 41 | nullColor: '#fcfefe' 42 | } 43 | }, 44 | 45 | navigator: { 46 | maskFill: 'rgba(170, 205, 170, 0.5)', 47 | series: { 48 | color: '#95C471', 49 | lineColor: '#35729E' 50 | } 51 | } 52 | }; 53 | 54 | // Apply the theme 55 | Highcharts.setOptions(Highcharts.theme); 56 | 57 | }(Highcharts)); 58 | return (function () { 59 | 60 | 61 | }()); 62 | })); 63 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/themes/grid-light.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | (c) 2009-2017 Torstein Honsi 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){a.createElement("link",{href:"https://fonts.googleapis.com/css?family\x3dDosis:400,600",rel:"stylesheet",type:"text/css"},null,document.getElementsByTagName("head")[0]);a.theme={colors:"#7cb5ec #f7a35c #90ee7e #7798BF #aaeeee #ff0066 #eeaaee #55BF3B #DF5353 #7798BF #aaeeee".split(" "),chart:{backgroundColor:null,style:{fontFamily:"Dosis, sans-serif"}}, 9 | title:{style:{fontSize:"16px",fontWeight:"bold",textTransform:"uppercase"}},tooltip:{borderWidth:0,backgroundColor:"rgba(219,219,216,0.8)",shadow:!1},legend:{itemStyle:{fontWeight:"bold",fontSize:"13px"}},xAxis:{gridLineWidth:1,labels:{style:{fontSize:"12px"}}},yAxis:{minorTickInterval:"auto",title:{style:{textTransform:"uppercase"}},labels:{style:{fontSize:"12px"}}},plotOptions:{candlestick:{lineColor:"#404048"}},background2:"#F0F0EA"};a.setOptions(a.theme)}); 10 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/themes/grid.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | (c) 2009-2017 Torstein Honsi 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){a.theme={colors:"#058DC7 #50B432 #ED561B #DDDF00 #24CBE5 #64E572 #FF9655 #FFF263 #6AF9C4".split(" "),chart:{backgroundColor:{linearGradient:{x1:0,y1:0,x2:1,y2:1},stops:[[0,"rgb(255, 255, 255)"],[1,"rgb(240, 240, 255)"]]},borderWidth:2,plotBackgroundColor:"rgba(255, 255, 255, .9)",plotShadow:!0,plotBorderWidth:1},title:{style:{color:"#000", 9 | font:'bold 16px "Trebuchet MS", Verdana, sans-serif'}},subtitle:{style:{color:"#666666",font:'bold 12px "Trebuchet MS", Verdana, sans-serif'}},xAxis:{gridLineWidth:1,lineColor:"#000",tickColor:"#000",labels:{style:{color:"#000",font:"11px Trebuchet MS, Verdana, sans-serif"}},title:{style:{color:"#333",fontWeight:"bold",fontSize:"12px",fontFamily:"Trebuchet MS, Verdana, sans-serif"}}},yAxis:{minorTickInterval:"auto",lineColor:"#000",lineWidth:1,tickWidth:1,tickColor:"#000",labels:{style:{color:"#000", 10 | font:"11px Trebuchet MS, Verdana, sans-serif"}},title:{style:{color:"#333",fontWeight:"bold",fontSize:"12px",fontFamily:"Trebuchet MS, Verdana, sans-serif"}}},legend:{itemStyle:{font:"9pt Trebuchet MS, Verdana, sans-serif",color:"black"},itemHoverStyle:{color:"#039"},itemHiddenStyle:{color:"gray"}},labels:{style:{color:"#99b"}},navigation:{buttonOptions:{theme:{stroke:"#CCCCCC"}}}};a.setOptions(a.theme)}); 11 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/themes/sand-signika.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | (c) 2009-2017 Torstein Honsi 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(b){"object"===typeof module&&module.exports?module.exports=b:"function"===typeof define&&define.amd?define(function(){return b}):b(Highcharts)})(function(b){(function(a){a.createElement("link",{href:"https://fonts.googleapis.com/css?family\x3dSignika:400,700",rel:"stylesheet",type:"text/css"},null,document.getElementsByTagName("head")[0]);a.wrap(a.Chart.prototype,"getContainer",function(a){a.call(this);this.container.style.background="url(https://www.highcharts.com/samples/graphics/sand.png)"}); 9 | a.theme={colors:"#f45b5b #8085e9 #8d4654 #7798BF #aaeeee #ff0066 #eeaaee #55BF3B #DF5353 #7798BF #aaeeee".split(" "),chart:{backgroundColor:null,style:{fontFamily:"Signika, serif"}},title:{style:{color:"black",fontSize:"16px",fontWeight:"bold"}},subtitle:{style:{color:"black"}},tooltip:{borderWidth:0},legend:{itemStyle:{fontWeight:"bold",fontSize:"13px"}},xAxis:{labels:{style:{color:"#6e6e70"}}},yAxis:{labels:{style:{color:"#6e6e70"}}},plotOptions:{series:{shadow:!0},candlestick:{lineColor:"#404048"}, 10 | map:{shadow:!1}},navigator:{xAxis:{gridLineColor:"#D0D0D8"}},rangeSelector:{buttonTheme:{fill:"white",stroke:"#C0C0C8","stroke-width":1,states:{select:{fill:"#D0D0D8"}}}},scrollbar:{trackBorderColor:"#C0C0C8"},background2:"#E0E0E8"};a.setOptions(a.theme)})(b)}); 11 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/themes/skies.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | (c) 2009-2017 Torstein Honsi 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){a.theme={colors:"#514F78 #42A07B #9B5E4A #72727F #1F949A #82914E #86777F #42A07B".split(" "),chart:{className:"skies",borderWidth:0,plotShadow:!0,plotBackgroundImage:"https://www.highcharts.com/demo/gfx/skies.jpg",plotBackgroundColor:{linearGradient:[0,0,250,500],stops:[[0,"rgba(255, 255, 255, 1)"],[1,"rgba(255, 255, 255, 0)"]]},plotBorderWidth:1}, 9 | title:{style:{color:"#3E576F",font:"16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif"}},subtitle:{style:{color:"#6D869F",font:"12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif"}},xAxis:{gridLineWidth:0,lineColor:"#C0D0E0",tickColor:"#C0D0E0",labels:{style:{color:"#666",fontWeight:"bold"}},title:{style:{color:"#666",font:"12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif"}}},yAxis:{alternateGridColor:"rgba(255, 255, 255, .5)", 10 | lineColor:"#C0D0E0",tickColor:"#C0D0E0",tickWidth:1,labels:{style:{color:"#666",fontWeight:"bold"}},title:{style:{color:"#666",font:"12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif"}}},legend:{itemStyle:{font:"9pt Trebuchet MS, Verdana, sans-serif",color:"#3E576F"},itemHoverStyle:{color:"black"},itemHiddenStyle:{color:"silver"}},labels:{style:{color:"#3E576F"}}};a.setOptions(a.theme)}); 11 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/themes/sunset.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | (c) 2009-2017 Highsoft AS 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){a.theme={colors:["#FDD089","#FF7F79","#A0446E","#251535"],colorAxis:{maxColor:"#60042E",minColor:"#FDD089"},plotOptions:{map:{nullColor:"#fefefc"}},navigator:{series:{color:"#FF7F79",lineColor:"#A0446E"}}};a.setOptions(a.theme)}); 9 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/css/js/themes/sunset.src.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license Highcharts JS v6.1.2 (2018-08-31) 3 | * 4 | * (c) 2009-2017 Highsoft AS 5 | * 6 | * License: www.highcharts.com/license 7 | */ 8 | 'use strict'; 9 | (function (factory) { 10 | if (typeof module === 'object' && module.exports) { 11 | module.exports = factory; 12 | } else if (typeof define === 'function' && define.amd) { 13 | define(function () { 14 | return factory; 15 | }); 16 | } else { 17 | factory(Highcharts); 18 | } 19 | }(function (Highcharts) { 20 | (function (Highcharts) { 21 | /** 22 | * (c) 2010-2017 Highsoft AS 23 | * 24 | * License: www.highcharts.com/license 25 | * 26 | * Accessible high-contrast theme for Highcharts. Considers colorblindness and 27 | * monochrome rendering. 28 | * @author Øystein Moseng 29 | */ 30 | 31 | Highcharts.theme = { 32 | colors: ['#FDD089', '#FF7F79', '#A0446E', '#251535'], 33 | 34 | colorAxis: { 35 | maxColor: '#60042E', 36 | minColor: '#FDD089' 37 | }, 38 | 39 | plotOptions: { 40 | map: { 41 | nullColor: '#fefefc' 42 | } 43 | }, 44 | 45 | navigator: { 46 | series: { 47 | color: '#FF7F79', 48 | lineColor: '#A0446E' 49 | } 50 | } 51 | }; 52 | 53 | // Apply the theme 54 | Highcharts.setOptions(Highcharts.theme); 55 | 56 | }(Highcharts)); 57 | return (function () { 58 | 59 | 60 | }()); 61 | })); 62 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/modules/bullet.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | Bullet graph series type for Highcharts 5 | 6 | (c) 2010-2017 Kacper Madej 7 | 8 | License: www.highcharts.com/license 9 | */ 10 | (function(b){"object"===typeof module&&module.exports?module.exports=b:"function"===typeof define&&define.amd?define(function(){return b}):b(Highcharts)})(function(b){(function(d){var b=d.each,r=d.pick,l=d.isNumber,v=d.relativeLength,m=d.seriesType,f=d.seriesTypes.column.prototype;m("bullet","column",{targetOptions:{width:"140%",height:3,borderWidth:0},tooltip:{pointFormat:'\x3cspan style\x3d"color:{series.color}"\x3e\u25cf\x3c/span\x3e {series.name}: \x3cb\x3e{point.y}\x3c/b\x3e. Target: \x3cb\x3e{point.target}\x3c/b\x3e\x3cbr/\x3e'}}, 11 | {pointArrayMap:["y","target"],parallelArrays:["x","y","target"],drawPoints:function(){var a=this,n=a.chart,p=a.options,m=p.animationLimit||250;f.drawPoints.apply(this);b(a.points,function(c){var b=c.options,h,e=c.targetGraphic,f=c.target,k=c.y,q,t,g,u;l(f)&&null!==f?(g=d.merge(p.targetOptions,b.targetOptions),t=g.height,h=c.shapeArgs,q=v(g.width,h.width),u=a.yAxis.translate(f,!1,!0,!1,!0)-g.height/2-.5,h=a.crispCol.apply({chart:n,borderWidth:g.borderWidth,options:{crisp:p.crisp}},[h.x+h.width/2-q/ 12 | 2,u,q,t]),e?(e[n.pointCounty||l===F?x:x+(D-x)*(1-(b-a)/(l-F))};this.getX=function(b,a,d){return g+(a?-1:1)*(w(c?2*r-b:b)/2+d.labelDistance)}; 11 | this.center=[g,r,l];this.centerX=g;I(d,function(b){v&&!1===b.visible||(a+=b.y)});I(d,function(b){n=null;B=a?b.y/a:0;m=r-l/2+q*l;h=m+B*l;k=w(m);C=g-k/2;G=C+k;k=w(h);u=g-k/2;z=u+k;m>y?(C=u=g-x/2,G=z=g+x/2):h>y&&(n=h,k=w(y),u=g-k/2,z=u+k,h=y);c&&(m=2*r-m,h=2*r-h,null!==n&&(n=2*r-n));A=["M",C,m,"L",G,m,z,h];null!==n&&A.push(z,n,u,n);A.push(u,h,"Z");b.shapeType="path";b.shapeArgs={d:A};b.percentage=100*B;b.plotX=g;b.plotY=(m+(n||h))/2;b.tooltipPos=[g,b.plotY];b.slice=H;b.half=E;v&&!1===b.visible||(q+= 12 | B)})},sortByAngle:function(a){a.sort(function(a,d){return a.plotY-d.plotY})},drawDataLabels:function(){var a=this.data,p=this.options.dataLabels.distance,f,e,c,v=a.length,t,q;for(this.center[2]-=2*p;v--;)c=a[v],e=(f=c.half)?1:-1,q=c.plotY,c.labelDistance=E(c.options.dataLabels&&c.options.dataLabels.distance,p),this.maxLabelDistance=Math.max(c.labelDistance,this.maxLabelDistance||0),t=this.getX(q,f,c),c.labelPos=[0,q,t+(c.labelDistance-5)*e,q,t+c.labelDistance*e,q,f?"right":"left",0];D.pie.prototype.drawDataLabels.call(this)}}); 13 | p("pyramid","funnel",{neckWidth:"0%",neckHeight:"0%",reversed:!0})})(a)}); 14 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/modules/item-series.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | Item series type for Highcharts 5 | 6 | (c) 2010-2017 Torstein Honsi 7 | 8 | License: www.highcharts.com/license 9 | */ 10 | (function(b){"object"===typeof module&&module.exports?module.exports=b:"function"===typeof define&&define.amd?define(function(){return b}):b(Highcharts)})(function(b){(function(d){var b=d.each,x=d.extend,u=d.pick,q=d.seriesType;q("item","column",{itemPadding:.2,marker:{symbol:"circle",states:{hover:{},select:{}}}},{drawPoints:function(){var c=this,h=c.chart.renderer,k=this.options.marker,l=this.yAxis.transA*c.options.itemPadding,m=this.borderWidth%2?.5:1;b(this.points,function(a){var b,e,f,g,r;b= 11 | a.marker||{};var v=b.symbol||k.symbol,q=u(b.radius,k.radius),n,t,w="rect"!==v,p;a.graphics=f=a.graphics||{};r=a.pointAttr?a.pointAttr[a.selected?"selected":""]||c.pointAttr[""]:c.pointAttribs(a,a.selected&&"select");delete r.r;if(null!==a.y)for(a.graphic||(a.graphic=h.g("point").add(c.group)),g=a.y,t=u(a.stackY,a.y),n=Math.min(a.pointWidth,c.yAxis.transA-l),b=t;b>t-a.y;b--)e=a.barX+(w?a.pointWidth/2-n/2:0),p=c.yAxis.toPixels(b,!0)+l/2,c.options.crisp&&(e=Math.round(e)-m,p=Math.round(p)+m),e={x:e, 12 | y:p,width:Math.round(w?n:a.pointWidth),height:Math.round(n),r:q},f[g]?f[g].animate(e):f[g]=h.symbol(v).attr(x(e,r)).add(a.graphic),f[g].isActive=!0,g--;d.objectEach(f,function(a,b){a.isActive?a.isActive=!1:(a.destroy(),delete a[b])})})}});d.SVGRenderer.prototype.symbols.rect=function(b,h,k,l,m){return d.SVGRenderer.prototype.symbols.callout(b,h,k,l,m)}})(b)}); 13 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/modules/no-data-to-display.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | Plugin for displaying a message when there is no data visible in chart. 4 | 5 | (c) 2010-2017 Highsoft AS 6 | Author: Oystein Moseng 7 | 8 | License: www.highcharts.com/license 9 | */ 10 | (function(c){"object"===typeof module&&module.exports?module.exports=c:"function"===typeof define&&define.amd?define(function(){return c}):c(Highcharts)})(function(c){(function(d){var c=d.seriesTypes,e=d.Chart.prototype,f=d.getOptions(),g=d.extend,h=d.each;g(f.lang,{noData:"No data to display"});f.noData={position:{x:0,y:0,align:"center",verticalAlign:"middle"}};f.noData.style={fontWeight:"bold",fontSize:"12px",color:"#666666"};h("bubble gauge heatmap pie sankey treemap waterfall".split(" "),function(b){c[b]&& 11 | (c[b].prototype.hasData=function(){return!!this.points.length})});d.Series.prototype.hasData=function(){return this.visible&&void 0!==this.dataMax&&void 0!==this.dataMin};e.showNoData=function(b){var a=this.options;b=b||a&&a.lang.noData;a=a&&a.noData;!this.noDataLabel&&this.renderer&&(this.noDataLabel=this.renderer.label(b,0,0,null,null,null,a.useHTML,null,"no-data"),this.noDataLabel.attr(a.attr).css(a.style),this.noDataLabel.add(),this.noDataLabel.align(g(this.noDataLabel.getBBox(),a.position),!1, 12 | "plotBox"))};e.hideNoData=function(){this.noDataLabel&&(this.noDataLabel=this.noDataLabel.destroy())};e.hasData=function(){for(var b=this.series||[],a=b.length;a--;)if(b[a].hasData()&&!b[a].options.isInternal)return!0;return this.loadingShown};d.addEvent(d.Chart,"render",function(){this.hasData()?this.hideNoData():this.showNoData()})})(c)}); 13 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/modules/overlapping-datalabels.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | (c) 2009-2017 Torstein Honsi 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){}); 9 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/modules/overlapping-datalabels.src.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license Highcharts JS v6.1.2 (2018-08-31) 3 | * 4 | * (c) 2009-2017 Torstein Honsi 5 | * 6 | * License: www.highcharts.com/license 7 | */ 8 | 'use strict'; 9 | (function (factory) { 10 | if (typeof module === 'object' && module.exports) { 11 | module.exports = factory; 12 | } else if (typeof define === 'function' && define.amd) { 13 | define(function () { 14 | return factory; 15 | }); 16 | } else { 17 | factory(Highcharts); 18 | } 19 | }(function (Highcharts) { 20 | 21 | })); 22 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/modules/pareto.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | Pareto series type for Highcharts 5 | 6 | (c) 2010-2017 Sebastian Bochan 7 | 8 | License: www.highcharts.com/license 9 | */ 10 | (function(c){"object"===typeof module&&module.exports?module.exports=c:"function"===typeof define&&define.amd?define(function(){return c}):c(Highcharts)})(function(c){var m=function(b){var c=b.each,e=b.Series,f=b.addEvent;return{init:function(){e.prototype.init.apply(this,arguments);this.initialised=!1;this.baseSeries=null;this.eventRemovers=[];this.addEvents()},setDerivedData:b.noop,setBaseSeries:function(){var a=this.chart,d=this.options.baseSeries;this.baseSeries=d&&(a.series[d]||a.get(d))||null}, 11 | addEvents:function(){var a=this,d;d=f(this.chart,"afterLinkSeries",function(){a.setBaseSeries();a.baseSeries&&!a.initialised&&(a.setDerivedData(),a.addBaseSeriesEvents(),a.initialised=!0)});this.eventRemovers.push(d)},addBaseSeriesEvents:function(){var a=this,d,b;d=f(a.baseSeries,"updatedData",function(){a.setDerivedData()});b=f(a.baseSeries,"destroy",function(){a.baseSeries=null;a.initialised=!1});a.eventRemovers.push(d,b)},destroy:function(){c(this.eventRemovers,function(a){a()});e.prototype.destroy.apply(this, 12 | arguments)}}}(c);(function(b,c){var e=b.each,f=b.correctFloat,a=b.seriesType;b=b.merge;a("pareto","line",{zIndex:3},b(c,{setDerivedData:function(){if(1= 1) { 57 | chart.plotHeight = height; 58 | chart.setSize(null, chart.chartHeight + diff, animate); 59 | } 60 | } 61 | 62 | }); 63 | this.initiatedScale = true; 64 | }; 65 | H.addEvent(Chart, 'render', Chart.prototype.adjustHeight); 66 | 67 | }(Highcharts)); 68 | return (function () { 69 | 70 | 71 | }()); 72 | })); 73 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/modules/streamgraph.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | Streamgraph module 4 | 5 | (c) 2010-2017 Torstein Honsi 6 | 7 | License: www.highcharts.com/license 8 | */ 9 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){(function(a){a=a.seriesType;a("streamgraph","areaspline",{fillOpacity:1,lineWidth:0,marker:{enabled:!1},stacking:"stream"},{negStacks:!1,streamStacker:function(a,b,c){a[0]-=b.total/2;a[1]-=b.total/2;this.stackedYData[c]=a}})})(a)}); 10 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/modules/vector.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | Vector plot series module 4 | 5 | (c) 2010-2017 Torstein Honsi 6 | 7 | License: www.highcharts.com/license 8 | */ 9 | (function(d){"object"===typeof module&&module.exports?module.exports=d:"function"===typeof define&&define.amd?define(function(){return d}):d(Highcharts)})(function(d){(function(c){var d=c.each,e=c.seriesType;e("vector","scatter",{lineWidth:2,marker:null,rotationOrigin:"center",states:{hover:{lineWidthPlus:1}},tooltip:{pointFormat:"\x3cb\x3e[{point.x}, {point.y}]\x3c/b\x3e\x3cbr/\x3eLength: \x3cb\x3e{point.length}\x3c/b\x3e\x3cbr/\x3eDirection: \x3cb\x3e{point.direction}\u00b0\x3c/b\x3e\x3cbr/\x3e"}, 10 | vectorLength:20},{pointArrayMap:["y","length","direction"],parallelArrays:["x","y","length","direction"],pointAttribs:function(a,b){var c=this.options;a=a.color||this.color;var d=this.options.lineWidth;b&&(a=c.states[b].color||a,d=(c.states[b].lineWidth||d)+(c.states[b].lineWidthPlus||0));return{stroke:a,"stroke-width":d}},markerAttribs:c.noop,getSymbol:c.noop,arrow:function(a){a=a.length/this.lengthMax*this.options.vectorLength/20;var b={start:10*a,center:0,end:-10*a}[this.options.rotationOrigin]|| 11 | 0;return["M",0,7*a+b,"L",-1.5*a,7*a+b,0,10*a+b,1.5*a,7*a+b,0,7*a+b,0,-10*a+b]},translate:function(){c.Series.prototype.translate.call(this);this.lengthMax=c.arrayMax(this.lengthData)},drawPoints:function(){var a=this.chart;d(this.points,function(b){var c=b.plotX,d=b.plotY;a.isInsidePlot(c,d,a.inverted)?(b.graphic||(b.graphic=this.chart.renderer.path().add(this.markerGroup)),b.graphic.attr({d:this.arrow(b),translateX:c,translateY:d,rotation:b.direction}).attr(this.pointAttribs(b))):b.graphic&&(b.graphic= 12 | b.graphic.destroy())},this)},drawGraph:c.noop,animate:function(a){a?this.markerGroup.attr({opacity:.01}):(this.markerGroup.animate({opacity:1},c.animObject(this.options.animation)),this.animate=null)}})})(d)}); 13 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/readme.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/Highcharts-6.1.2/code/readme.txt -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/themes/avocado.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | (c) 2009-2017 Highsoft AS 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){a.theme={colors:["#F3E796","#95C471","#35729E","#251735"],colorAxis:{maxColor:"#05426E",minColor:"#F3E796"},plotOptions:{map:{nullColor:"#fcfefe"}},navigator:{maskFill:"rgba(170, 205, 170, 0.5)",series:{color:"#95C471",lineColor:"#35729E"}}};a.setOptions(a.theme)}); 9 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/themes/avocado.src.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license Highcharts JS v6.1.2 (2018-08-31) 3 | * 4 | * (c) 2009-2017 Highsoft AS 5 | * 6 | * License: www.highcharts.com/license 7 | */ 8 | 'use strict'; 9 | (function (factory) { 10 | if (typeof module === 'object' && module.exports) { 11 | module.exports = factory; 12 | } else if (typeof define === 'function' && define.amd) { 13 | define(function () { 14 | return factory; 15 | }); 16 | } else { 17 | factory(Highcharts); 18 | } 19 | }(function (Highcharts) { 20 | (function (Highcharts) { 21 | /** 22 | * (c) 2010-2017 Highsoft AS 23 | * 24 | * License: www.highcharts.com/license 25 | * 26 | * Accessible high-contrast theme for Highcharts. Considers colorblindness and 27 | * monochrome rendering. 28 | * @author Øystein Moseng 29 | */ 30 | 31 | Highcharts.theme = { 32 | colors: ['#F3E796', '#95C471', '#35729E', '#251735'], 33 | 34 | colorAxis: { 35 | maxColor: '#05426E', 36 | minColor: '#F3E796' 37 | }, 38 | 39 | plotOptions: { 40 | map: { 41 | nullColor: '#fcfefe' 42 | } 43 | }, 44 | 45 | navigator: { 46 | maskFill: 'rgba(170, 205, 170, 0.5)', 47 | series: { 48 | color: '#95C471', 49 | lineColor: '#35729E' 50 | } 51 | } 52 | }; 53 | 54 | // Apply the theme 55 | Highcharts.setOptions(Highcharts.theme); 56 | 57 | }(Highcharts)); 58 | return (function () { 59 | 60 | 61 | }()); 62 | })); 63 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/themes/grid-light.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | (c) 2009-2017 Torstein Honsi 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){a.createElement("link",{href:"https://fonts.googleapis.com/css?family\x3dDosis:400,600",rel:"stylesheet",type:"text/css"},null,document.getElementsByTagName("head")[0]);a.theme={colors:"#7cb5ec #f7a35c #90ee7e #7798BF #aaeeee #ff0066 #eeaaee #55BF3B #DF5353 #7798BF #aaeeee".split(" "),chart:{backgroundColor:null,style:{fontFamily:"Dosis, sans-serif"}}, 9 | title:{style:{fontSize:"16px",fontWeight:"bold",textTransform:"uppercase"}},tooltip:{borderWidth:0,backgroundColor:"rgba(219,219,216,0.8)",shadow:!1},legend:{itemStyle:{fontWeight:"bold",fontSize:"13px"}},xAxis:{gridLineWidth:1,labels:{style:{fontSize:"12px"}}},yAxis:{minorTickInterval:"auto",title:{style:{textTransform:"uppercase"}},labels:{style:{fontSize:"12px"}}},plotOptions:{candlestick:{lineColor:"#404048"}},background2:"#F0F0EA"};a.setOptions(a.theme)}); 10 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/themes/grid.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | (c) 2009-2017 Torstein Honsi 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){a.theme={colors:"#058DC7 #50B432 #ED561B #DDDF00 #24CBE5 #64E572 #FF9655 #FFF263 #6AF9C4".split(" "),chart:{backgroundColor:{linearGradient:{x1:0,y1:0,x2:1,y2:1},stops:[[0,"rgb(255, 255, 255)"],[1,"rgb(240, 240, 255)"]]},borderWidth:2,plotBackgroundColor:"rgba(255, 255, 255, .9)",plotShadow:!0,plotBorderWidth:1},title:{style:{color:"#000", 9 | font:'bold 16px "Trebuchet MS", Verdana, sans-serif'}},subtitle:{style:{color:"#666666",font:'bold 12px "Trebuchet MS", Verdana, sans-serif'}},xAxis:{gridLineWidth:1,lineColor:"#000",tickColor:"#000",labels:{style:{color:"#000",font:"11px Trebuchet MS, Verdana, sans-serif"}},title:{style:{color:"#333",fontWeight:"bold",fontSize:"12px",fontFamily:"Trebuchet MS, Verdana, sans-serif"}}},yAxis:{minorTickInterval:"auto",lineColor:"#000",lineWidth:1,tickWidth:1,tickColor:"#000",labels:{style:{color:"#000", 10 | font:"11px Trebuchet MS, Verdana, sans-serif"}},title:{style:{color:"#333",fontWeight:"bold",fontSize:"12px",fontFamily:"Trebuchet MS, Verdana, sans-serif"}}},legend:{itemStyle:{font:"9pt Trebuchet MS, Verdana, sans-serif",color:"black"},itemHoverStyle:{color:"#039"},itemHiddenStyle:{color:"gray"}},labels:{style:{color:"#99b"}},navigation:{buttonOptions:{theme:{stroke:"#CCCCCC"}}}};a.setOptions(a.theme)}); 11 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/themes/sand-signika.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | (c) 2009-2017 Torstein Honsi 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(b){"object"===typeof module&&module.exports?module.exports=b:"function"===typeof define&&define.amd?define(function(){return b}):b(Highcharts)})(function(b){(function(a){a.createElement("link",{href:"https://fonts.googleapis.com/css?family\x3dSignika:400,700",rel:"stylesheet",type:"text/css"},null,document.getElementsByTagName("head")[0]);a.wrap(a.Chart.prototype,"getContainer",function(a){a.call(this);this.container.style.background="url(https://www.highcharts.com/samples/graphics/sand.png)"}); 9 | a.theme={colors:"#f45b5b #8085e9 #8d4654 #7798BF #aaeeee #ff0066 #eeaaee #55BF3B #DF5353 #7798BF #aaeeee".split(" "),chart:{backgroundColor:null,style:{fontFamily:"Signika, serif"}},title:{style:{color:"black",fontSize:"16px",fontWeight:"bold"}},subtitle:{style:{color:"black"}},tooltip:{borderWidth:0},legend:{itemStyle:{fontWeight:"bold",fontSize:"13px"}},xAxis:{labels:{style:{color:"#6e6e70"}}},yAxis:{labels:{style:{color:"#6e6e70"}}},plotOptions:{series:{shadow:!0},candlestick:{lineColor:"#404048"}, 10 | map:{shadow:!1}},navigator:{xAxis:{gridLineColor:"#D0D0D8"}},rangeSelector:{buttonTheme:{fill:"white",stroke:"#C0C0C8","stroke-width":1,states:{select:{fill:"#D0D0D8"}}}},scrollbar:{trackBorderColor:"#C0C0C8"},background2:"#E0E0E8"};a.setOptions(a.theme)})(b)}); 11 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/themes/skies.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | (c) 2009-2017 Torstein Honsi 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){a.theme={colors:"#514F78 #42A07B #9B5E4A #72727F #1F949A #82914E #86777F #42A07B".split(" "),chart:{className:"skies",borderWidth:0,plotShadow:!0,plotBackgroundImage:"https://www.highcharts.com/demo/gfx/skies.jpg",plotBackgroundColor:{linearGradient:[0,0,250,500],stops:[[0,"rgba(255, 255, 255, 1)"],[1,"rgba(255, 255, 255, 0)"]]},plotBorderWidth:1}, 9 | title:{style:{color:"#3E576F",font:"16px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif"}},subtitle:{style:{color:"#6D869F",font:"12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif"}},xAxis:{gridLineWidth:0,lineColor:"#C0D0E0",tickColor:"#C0D0E0",labels:{style:{color:"#666",fontWeight:"bold"}},title:{style:{color:"#666",font:"12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif"}}},yAxis:{alternateGridColor:"rgba(255, 255, 255, .5)", 10 | lineColor:"#C0D0E0",tickColor:"#C0D0E0",tickWidth:1,labels:{style:{color:"#666",fontWeight:"bold"}},title:{style:{color:"#666",font:"12px Lucida Grande, Lucida Sans Unicode, Verdana, Arial, Helvetica, sans-serif"}}},legend:{itemStyle:{font:"9pt Trebuchet MS, Verdana, sans-serif",color:"#3E576F"},itemHoverStyle:{color:"black"},itemHiddenStyle:{color:"silver"}},labels:{style:{color:"#3E576F"}}};a.setOptions(a.theme)}); 11 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/themes/sunset.js: -------------------------------------------------------------------------------- 1 | /* 2 | Highcharts JS v6.1.2 (2018-08-31) 3 | 4 | (c) 2009-2017 Highsoft AS 5 | 6 | License: www.highcharts.com/license 7 | */ 8 | (function(a){"object"===typeof module&&module.exports?module.exports=a:"function"===typeof define&&define.amd?define(function(){return a}):a(Highcharts)})(function(a){a.theme={colors:["#FDD089","#FF7F79","#A0446E","#251535"],colorAxis:{maxColor:"#60042E",minColor:"#FDD089"},plotOptions:{map:{nullColor:"#fefefc"}},navigator:{series:{color:"#FF7F79",lineColor:"#A0446E"}}};a.setOptions(a.theme)}); 9 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/code/themes/sunset.src.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license Highcharts JS v6.1.2 (2018-08-31) 3 | * 4 | * (c) 2009-2017 Highsoft AS 5 | * 6 | * License: www.highcharts.com/license 7 | */ 8 | 'use strict'; 9 | (function (factory) { 10 | if (typeof module === 'object' && module.exports) { 11 | module.exports = factory; 12 | } else if (typeof define === 'function' && define.amd) { 13 | define(function () { 14 | return factory; 15 | }); 16 | } else { 17 | factory(Highcharts); 18 | } 19 | }(function (Highcharts) { 20 | (function (Highcharts) { 21 | /** 22 | * (c) 2010-2017 Highsoft AS 23 | * 24 | * License: www.highcharts.com/license 25 | * 26 | * Accessible high-contrast theme for Highcharts. Considers colorblindness and 27 | * monochrome rendering. 28 | * @author Øystein Moseng 29 | */ 30 | 31 | Highcharts.theme = { 32 | colors: ['#FDD089', '#FF7F79', '#A0446E', '#251535'], 33 | 34 | colorAxis: { 35 | maxColor: '#60042E', 36 | minColor: '#FDD089' 37 | }, 38 | 39 | plotOptions: { 40 | map: { 41 | nullColor: '#fefefc' 42 | } 43 | }, 44 | 45 | navigator: { 46 | series: { 47 | color: '#FF7F79', 48 | lineColor: '#A0446E' 49 | } 50 | } 51 | }; 52 | 53 | // Apply the theme 54 | Highcharts.setOptions(Highcharts.theme); 55 | 56 | }(Highcharts)); 57 | return (function () { 58 | 59 | 60 | }()); 61 | })); 62 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/3d-column-null-values/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/3d-pie-donut/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/3d-pie/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 69 | 70 | 71 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/area-inverted/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/area-missing/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/area-negative/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/area-stacked-percent/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/area-stacked/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/arearange/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 74 | 75 | 76 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/areaspline/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/bar-basic/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 88 | 89 | 90 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/bar-stacked/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 59 | 60 | 61 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/bellcurve/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 80 | 81 | 82 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/chart-update/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 91 | 92 | 93 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/column-negative/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/column-parsed/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 |
JaneJohn
Apples34
Pears20
Plums511
Bananas11
Oranges24
56 | 57 | 58 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/column-stacked-and-grouped/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/column-stacked-percent/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/column-stacked/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/columnrange/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 89 | 90 | 91 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/combo-regression/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 56 | 57 | 58 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/funnel/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 61 | 62 | 63 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/histogram/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/line-boost/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/line-labels/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/line-log-axis/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 49 | 50 | 51 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/live-data/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 26 | 27 | 28 | 29 | 30 | 31 |
32 | 33 |
34 | 37 | 38 |
39 |
40 | 43 | 44 |
45 |
46 | 49 | 50 |
51 | 52 | 53 | 54 | 55 | 56 | 92 | 93 | 94 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/pareto/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/pie-basic/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 85 | 86 | 87 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/pie-legend/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 75 | 76 | 77 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/pie-semi-circle/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/polar-spider/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/polar/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/pyramid/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 60 | 61 | 62 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/scatter-boost/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 98 | 99 | 100 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/spline-inverted/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 76 | 77 | 78 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/styled-mode-column/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 45 | 46 | 47 | 48 | 49 | 50 |
51 | 52 | 53 | 93 | 94 | 95 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/styled-mode-pie/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 27 | 28 | 29 | 30 | 31 | 32 |
33 | 34 | 35 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/treemap-coloraxis/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/variable-radius-pie/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/wordcloud/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/examples/x-range/index.htm: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Highcharts Example 7 | 8 | 16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/gfx/vml-radial-gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/Highcharts-6.1.2/gfx/vml-radial-gradient.png -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/arrow.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/circle.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/cursor.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/feature.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/fibonacci.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/flag-circlepin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/flag-diamondpin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/flag-flag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/flag-squarepin.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/flag.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/line.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/rect.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/reset.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/save.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/Highcharts-6.1.2/graphics/search.png -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/skies.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/Highcharts-6.1.2/graphics/skies.jpg -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/snow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/Highcharts-6.1.2/graphics/snow.png -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/sun.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/Highcharts-6.1.2/graphics/sun.png -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/text.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/graphics/tunnel.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/license.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/Highcharts-6.1.2/license.pdf -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/readme.txt: -------------------------------------------------------------------------------- 1 | Highcharts JS v6.1.2(2018-09-03) 2 | 3 | 4 | 5 | 使用协议:https://www.highcharts.com.cn/license 6 | 7 | 更新日志:https://www.hcharts.cn/docs/changelog/highcharts 8 | 在线实例:https://www.hcharts.cn/demos/highcharts 9 | 使用教程: https://www.hcharts.cn/docs 10 | 11 | API 文档: https://api.hcharts.cn/highcharts 12 | 13 | Copyright @ 2016 Highsoft AS (http://highsoft.com) 14 | 中国地区由 15 | 杭州简数科技有限公司提供服务(https://jianshukeji.com) -------------------------------------------------------------------------------- /web/static/plugins/Highcharts-6.1.2/使用说明.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/Highcharts-6.1.2/使用说明.pdf -------------------------------------------------------------------------------- /web/static/plugins/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /web/static/plugins/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /web/static/plugins/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /web/static/plugins/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/bootstrap-3.3.7/fonts/glyphicons-halflings-regular.woff2 -------------------------------------------------------------------------------- /web/static/plugins/bootstrap-3.3.7/js/npm.js: -------------------------------------------------------------------------------- 1 | // This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. 2 | require('../../js/transition.js') 3 | require('../../js/alert.js') 4 | require('../../js/button.js') 5 | require('../../js/carousel.js') 6 | require('../../js/collapse.js') 7 | require('../../js/dropdown.js') 8 | require('../../js/modal.js') 9 | require('../../js/tooltip.js') 10 | require('../../js/popover.js') 11 | require('../../js/scrollspy.js') 12 | require('../../js/tab.js') 13 | require('../../js/affix.js') -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/HELP-US-OUT.txt: -------------------------------------------------------------------------------- 1 | I hope you love Font Awesome. If you've found it useful, please do me a favor and check out my latest project, 2 | Fort Awesome (https://fortawesome.com). It makes it easy to put the perfect icons on your website. Choose from our awesome, 3 | comprehensive icon sets or copy and paste your own. 4 | 5 | Please. Check it out. 6 | 7 | -Dave Gandy 8 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/fonts/FontAwesome.otf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/font-awesome-4.7.0/fonts/FontAwesome.otf -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/font-awesome-4.7.0/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/font-awesome-4.7.0/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/font-awesome-4.7.0/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/web/static/plugins/font-awesome-4.7.0/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/less/animated.less: -------------------------------------------------------------------------------- 1 | // Animated Icons 2 | // -------------------------- 3 | 4 | .@{fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .@{fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/less/bordered-pulled.less: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em @fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .@{fa-css-prefix}-pull-left { float: left; } 11 | .@{fa-css-prefix}-pull-right { float: right; } 12 | 13 | .@{fa-css-prefix} { 14 | &.@{fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.@{fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .@{fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/less/core.less: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/less/fixed-width.less: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .@{fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/less/font-awesome.less: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables.less"; 7 | @import "mixins.less"; 8 | @import "path.less"; 9 | @import "core.less"; 10 | @import "larger.less"; 11 | @import "fixed-width.less"; 12 | @import "list.less"; 13 | @import "bordered-pulled.less"; 14 | @import "animated.less"; 15 | @import "rotated-flipped.less"; 16 | @import "stacked.less"; 17 | @import "icons.less"; 18 | @import "screen-reader.less"; 19 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/less/larger.less: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .@{fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .@{fa-css-prefix}-2x { font-size: 2em; } 11 | .@{fa-css-prefix}-3x { font-size: 3em; } 12 | .@{fa-css-prefix}-4x { font-size: 4em; } 13 | .@{fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/less/list.less: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: @fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .@{fa-css-prefix}-li { 11 | position: absolute; 12 | left: -@fa-li-width; 13 | width: @fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.@{fa-css-prefix}-lg { 17 | left: (-@fa-li-width + (4em / 14)); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/less/mixins.less: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | .fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal @fa-font-size-base/@fa-line-height-base FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | .fa-icon-rotate(@degrees, @rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation})"; 16 | -webkit-transform: rotate(@degrees); 17 | -ms-transform: rotate(@degrees); 18 | transform: rotate(@degrees); 19 | } 20 | 21 | .fa-icon-flip(@horiz, @vert, @rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=@{rotation}, mirror=1)"; 23 | -webkit-transform: scale(@horiz, @vert); 24 | -ms-transform: scale(@horiz, @vert); 25 | transform: scale(@horiz, @vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | .sr-only() { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | .sr-only-focusable() { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/less/path.less: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('@{fa-font-path}/fontawesome-webfont.eot?v=@{fa-version}'); 7 | src: url('@{fa-font-path}/fontawesome-webfont.eot?#iefix&v=@{fa-version}') format('embedded-opentype'), 8 | url('@{fa-font-path}/fontawesome-webfont.woff2?v=@{fa-version}') format('woff2'), 9 | url('@{fa-font-path}/fontawesome-webfont.woff?v=@{fa-version}') format('woff'), 10 | url('@{fa-font-path}/fontawesome-webfont.ttf?v=@{fa-version}') format('truetype'), 11 | url('@{fa-font-path}/fontawesome-webfont.svg?v=@{fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('@{fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/less/rotated-flipped.less: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-rotate-90 { .fa-icon-rotate(90deg, 1); } 5 | .@{fa-css-prefix}-rotate-180 { .fa-icon-rotate(180deg, 2); } 6 | .@{fa-css-prefix}-rotate-270 { .fa-icon-rotate(270deg, 3); } 7 | 8 | .@{fa-css-prefix}-flip-horizontal { .fa-icon-flip(-1, 1, 0); } 9 | .@{fa-css-prefix}-flip-vertical { .fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .@{fa-css-prefix}-rotate-90, 15 | :root .@{fa-css-prefix}-rotate-180, 16 | :root .@{fa-css-prefix}-rotate-270, 17 | :root .@{fa-css-prefix}-flip-horizontal, 18 | :root .@{fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/less/screen-reader.less: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { .sr-only(); } 5 | .sr-only-focusable { .sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/less/stacked.less: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .@{fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .@{fa-css-prefix}-stack-1x, .@{fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .@{fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .@{fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .@{fa-css-prefix}-inverse { color: @fa-inverse; } 21 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/scss/_animated.scss: -------------------------------------------------------------------------------- 1 | // Spinning Icons 2 | // -------------------------- 3 | 4 | .#{$fa-css-prefix}-spin { 5 | -webkit-animation: fa-spin 2s infinite linear; 6 | animation: fa-spin 2s infinite linear; 7 | } 8 | 9 | .#{$fa-css-prefix}-pulse { 10 | -webkit-animation: fa-spin 1s infinite steps(8); 11 | animation: fa-spin 1s infinite steps(8); 12 | } 13 | 14 | @-webkit-keyframes fa-spin { 15 | 0% { 16 | -webkit-transform: rotate(0deg); 17 | transform: rotate(0deg); 18 | } 19 | 100% { 20 | -webkit-transform: rotate(359deg); 21 | transform: rotate(359deg); 22 | } 23 | } 24 | 25 | @keyframes fa-spin { 26 | 0% { 27 | -webkit-transform: rotate(0deg); 28 | transform: rotate(0deg); 29 | } 30 | 100% { 31 | -webkit-transform: rotate(359deg); 32 | transform: rotate(359deg); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/scss/_bordered-pulled.scss: -------------------------------------------------------------------------------- 1 | // Bordered & Pulled 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-border { 5 | padding: .2em .25em .15em; 6 | border: solid .08em $fa-border-color; 7 | border-radius: .1em; 8 | } 9 | 10 | .#{$fa-css-prefix}-pull-left { float: left; } 11 | .#{$fa-css-prefix}-pull-right { float: right; } 12 | 13 | .#{$fa-css-prefix} { 14 | &.#{$fa-css-prefix}-pull-left { margin-right: .3em; } 15 | &.#{$fa-css-prefix}-pull-right { margin-left: .3em; } 16 | } 17 | 18 | /* Deprecated as of 4.4.0 */ 19 | .pull-right { float: right; } 20 | .pull-left { float: left; } 21 | 22 | .#{$fa-css-prefix} { 23 | &.pull-left { margin-right: .3em; } 24 | &.pull-right { margin-left: .3em; } 25 | } 26 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/scss/_core.scss: -------------------------------------------------------------------------------- 1 | // Base Class Definition 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix} { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/scss/_fixed-width.scss: -------------------------------------------------------------------------------- 1 | // Fixed Width Icons 2 | // ------------------------- 3 | .#{$fa-css-prefix}-fw { 4 | width: (18em / 14); 5 | text-align: center; 6 | } 7 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/scss/_larger.scss: -------------------------------------------------------------------------------- 1 | // Icon Sizes 2 | // ------------------------- 3 | 4 | /* makes the font 33% larger relative to the icon container */ 5 | .#{$fa-css-prefix}-lg { 6 | font-size: (4em / 3); 7 | line-height: (3em / 4); 8 | vertical-align: -15%; 9 | } 10 | .#{$fa-css-prefix}-2x { font-size: 2em; } 11 | .#{$fa-css-prefix}-3x { font-size: 3em; } 12 | .#{$fa-css-prefix}-4x { font-size: 4em; } 13 | .#{$fa-css-prefix}-5x { font-size: 5em; } 14 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/scss/_list.scss: -------------------------------------------------------------------------------- 1 | // List Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-ul { 5 | padding-left: 0; 6 | margin-left: $fa-li-width; 7 | list-style-type: none; 8 | > li { position: relative; } 9 | } 10 | .#{$fa-css-prefix}-li { 11 | position: absolute; 12 | left: -$fa-li-width; 13 | width: $fa-li-width; 14 | top: (2em / 14); 15 | text-align: center; 16 | &.#{$fa-css-prefix}-lg { 17 | left: -$fa-li-width + (4em / 14); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/scss/_mixins.scss: -------------------------------------------------------------------------------- 1 | // Mixins 2 | // -------------------------- 3 | 4 | @mixin fa-icon() { 5 | display: inline-block; 6 | font: normal normal normal #{$fa-font-size-base}/#{$fa-line-height-base} FontAwesome; // shortening font declaration 7 | font-size: inherit; // can't have font-size inherit on line above, so need to override 8 | text-rendering: auto; // optimizelegibility throws things off #1094 9 | -webkit-font-smoothing: antialiased; 10 | -moz-osx-font-smoothing: grayscale; 11 | 12 | } 13 | 14 | @mixin fa-icon-rotate($degrees, $rotation) { 15 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation})"; 16 | -webkit-transform: rotate($degrees); 17 | -ms-transform: rotate($degrees); 18 | transform: rotate($degrees); 19 | } 20 | 21 | @mixin fa-icon-flip($horiz, $vert, $rotation) { 22 | -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=#{$rotation}, mirror=1)"; 23 | -webkit-transform: scale($horiz, $vert); 24 | -ms-transform: scale($horiz, $vert); 25 | transform: scale($horiz, $vert); 26 | } 27 | 28 | 29 | // Only display content to screen readers. A la Bootstrap 4. 30 | // 31 | // See: http://a11yproject.com/posts/how-to-hide-content/ 32 | 33 | @mixin sr-only { 34 | position: absolute; 35 | width: 1px; 36 | height: 1px; 37 | padding: 0; 38 | margin: -1px; 39 | overflow: hidden; 40 | clip: rect(0,0,0,0); 41 | border: 0; 42 | } 43 | 44 | // Use in conjunction with .sr-only to only display content when it's focused. 45 | // 46 | // Useful for "Skip to main content" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1 47 | // 48 | // Credit: HTML5 Boilerplate 49 | 50 | @mixin sr-only-focusable { 51 | &:active, 52 | &:focus { 53 | position: static; 54 | width: auto; 55 | height: auto; 56 | margin: 0; 57 | overflow: visible; 58 | clip: auto; 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/scss/_path.scss: -------------------------------------------------------------------------------- 1 | /* FONT PATH 2 | * -------------------------- */ 3 | 4 | @font-face { 5 | font-family: 'FontAwesome'; 6 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?v=#{$fa-version}'); 7 | src: url('#{$fa-font-path}/fontawesome-webfont.eot?#iefix&v=#{$fa-version}') format('embedded-opentype'), 8 | url('#{$fa-font-path}/fontawesome-webfont.woff2?v=#{$fa-version}') format('woff2'), 9 | url('#{$fa-font-path}/fontawesome-webfont.woff?v=#{$fa-version}') format('woff'), 10 | url('#{$fa-font-path}/fontawesome-webfont.ttf?v=#{$fa-version}') format('truetype'), 11 | url('#{$fa-font-path}/fontawesome-webfont.svg?v=#{$fa-version}#fontawesomeregular') format('svg'); 12 | // src: url('#{$fa-font-path}/FontAwesome.otf') format('opentype'); // used when developing fonts 13 | font-weight: normal; 14 | font-style: normal; 15 | } 16 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/scss/_rotated-flipped.scss: -------------------------------------------------------------------------------- 1 | // Rotated & Flipped Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-rotate-90 { @include fa-icon-rotate(90deg, 1); } 5 | .#{$fa-css-prefix}-rotate-180 { @include fa-icon-rotate(180deg, 2); } 6 | .#{$fa-css-prefix}-rotate-270 { @include fa-icon-rotate(270deg, 3); } 7 | 8 | .#{$fa-css-prefix}-flip-horizontal { @include fa-icon-flip(-1, 1, 0); } 9 | .#{$fa-css-prefix}-flip-vertical { @include fa-icon-flip(1, -1, 2); } 10 | 11 | // Hook for IE8-9 12 | // ------------------------- 13 | 14 | :root .#{$fa-css-prefix}-rotate-90, 15 | :root .#{$fa-css-prefix}-rotate-180, 16 | :root .#{$fa-css-prefix}-rotate-270, 17 | :root .#{$fa-css-prefix}-flip-horizontal, 18 | :root .#{$fa-css-prefix}-flip-vertical { 19 | filter: none; 20 | } 21 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/scss/_screen-reader.scss: -------------------------------------------------------------------------------- 1 | // Screen Readers 2 | // ------------------------- 3 | 4 | .sr-only { @include sr-only(); } 5 | .sr-only-focusable { @include sr-only-focusable(); } 6 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/scss/_stacked.scss: -------------------------------------------------------------------------------- 1 | // Stacked Icons 2 | // ------------------------- 3 | 4 | .#{$fa-css-prefix}-stack { 5 | position: relative; 6 | display: inline-block; 7 | width: 2em; 8 | height: 2em; 9 | line-height: 2em; 10 | vertical-align: middle; 11 | } 12 | .#{$fa-css-prefix}-stack-1x, .#{$fa-css-prefix}-stack-2x { 13 | position: absolute; 14 | left: 0; 15 | width: 100%; 16 | text-align: center; 17 | } 18 | .#{$fa-css-prefix}-stack-1x { line-height: inherit; } 19 | .#{$fa-css-prefix}-stack-2x { font-size: 2em; } 20 | .#{$fa-css-prefix}-inverse { color: $fa-inverse; } 21 | -------------------------------------------------------------------------------- /web/static/plugins/font-awesome-4.7.0/scss/font-awesome.scss: -------------------------------------------------------------------------------- 1 | /*! 2 | * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome 3 | * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) 4 | */ 5 | 6 | @import "variables"; 7 | @import "mixins"; 8 | @import "path"; 9 | @import "core"; 10 | @import "larger"; 11 | @import "fixed-width"; 12 | @import "list"; 13 | @import "bordered-pulled"; 14 | @import "animated"; 15 | @import "rotated-flipped"; 16 | @import "stacked"; 17 | @import "icons"; 18 | @import "screen-reader"; 19 | -------------------------------------------------------------------------------- /web/templates/ansible_add.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | 4 | {% block content %} 5 |
6 | 7 |

8 |
9 |
10 |

添加组名

11 |
12 |
13 | 14 | 15 | 16 |
17 |
18 |
19 | 20 | 21 | 60 | 61 | {% endblock %} -------------------------------------------------------------------------------- /web/templates/base.html: -------------------------------------------------------------------------------- 1 | {% load staticfiles %} 2 | 3 | 4 | 5 | 6 | Title 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 |
17 |
18 |
19 | {% block content %} 20 | 21 | {% endblock content %} 22 |
23 |
24 |
25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /web/templates/host_add.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | 4 | {% block content %} 5 |
6 | 8 |

9 |
10 |
11 |

添加主机

12 |
13 |
14 | 15 | 16 | 17 |
18 |
19 |
20 | 21 | 22 | 60 | 61 | {% endblock %} -------------------------------------------------------------------------------- /web/tests.py: -------------------------------------------------------------------------------- 1 | from django.test import TestCase 2 | 3 | # Create your tests here. 4 | -------------------------------------------------------------------------------- /web/views/ansible.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | 4 | # Create your views here. 5 | def list(request): 6 | return render(request,"ansible_list.html") 7 | 8 | def add(request): 9 | return render(request,"ansible_add.html") 10 | 11 | def add_host(request,pk): 12 | return render(request,"ansible_add_host.html",{'pk':pk}) -------------------------------------------------------------------------------- /web/views/host.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render 2 | 3 | 4 | # Create your views here. 5 | def list(request): 6 | return render(request,"host_list.html") 7 | 8 | def info(request,pk): 9 | return render(request,"host_info.html",{'pk':pk}) 10 | 11 | # def add(request): 12 | # return render(request,"host_add.html") 13 | 14 | def cpu(request,pk): 15 | return render(request,"monitor/cpu.html",{'pk':pk}) 16 | 17 | def memory(request,pk): 18 | return render(request,"monitor/memory.html",{'pk':pk}) -------------------------------------------------------------------------------- /web/views/index.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import render,HttpResponse 2 | 3 | def index(request): 4 | return render(request,"index.html") 5 | 6 | def default(request): 7 | return render(request,"default.html") 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /web/web_urls.py: -------------------------------------------------------------------------------- 1 | from django.conf.urls import url,include 2 | from web.views import index,host,ansible 3 | app_name = 'web' 4 | 5 | urlpatterns = [ 6 | url(r'^$', index.index,name="index"), 7 | url(r'^index/', index.index,name="index"), 8 | url(r'^default/', index.default,name="default"), 9 | url(r'^host/list/', host.list,name="list"), 10 | url(r'^host/info/(?P\d+)/$', host.info,name="info"), 11 | # url(r'^host/add/', host.add,name="add"), 12 | 13 | url(r'^host/cpu/monitor/(?P\d+)/$', host.cpu,name="cpu"), 14 | url(r'^host/memory/monitor/(?P\d+)/$', host.memory,name="memory"), 15 | 16 | url(r'^ansible/list/', ansible.list,name="ansible_list"), 17 | url(r'^ansible/add/', ansible.add,name="ansible_add"), 18 | url(r'^ansible/add_host/(?P\d+)/$', ansible.add_host,name="ansible_add_host"), 19 | 20 | ] -------------------------------------------------------------------------------- /效果图/ansible主机.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/效果图/ansible主机.png -------------------------------------------------------------------------------- /效果图/ansible管理.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/效果图/ansible管理.png -------------------------------------------------------------------------------- /效果图/主机详情.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/效果图/主机详情.png -------------------------------------------------------------------------------- /效果图/首页.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/py3study/AutoCmdb/dde2f94bc4ce686cf46494706e841c3f1ea132f5/效果图/首页.png --------------------------------------------------------------------------------