init commit

This commit is contained in:
r0n1n7an 2024-05-01 23:52:26 +08:00
commit 1b1ee673bb
426 changed files with 1647 additions and 0 deletions

BIN
LineChart.exe Normal file

Binary file not shown.

340
LineChart.go Normal file
View File

@ -0,0 +1,340 @@
package main
import (
"database/sql"
"flag"
"fmt"
"log"
"net/http"
"os"
"strings"
"text/template"
"time"
"github.com/go-echarts/go-echarts/v2/charts"
"github.com/go-echarts/go-echarts/v2/opts"
_ "github.com/go-sql-driver/mysql"
ini "gopkg.in/ini.v1"
)
var verb bool = false
var file string = ""
var cfg *ini.File
type DataSet struct {
Alias string
Item string
Result string
UpdateTime string
}
func main() {
flag.BoolVar(&verb, "v", false, "Show Verbose Debug Messages")
flag.StringVar(&file, "f", "", "Config File Path")
flag.Parse()
log.SetOutput(os.Stdout)
log.SetFlags(log.Ldate | log.Ltime | log.Lmicroseconds)
if file == "" {
file = strings.TrimSuffix(os.Args[0], ".exe") + ".ini"
}
var err error
cfg, err = ini.Load(file)
if err != nil {
log.Printf("[ERR] %v\r\n", err)
os.Exit(1)
}
addr := cfg.Section("HTTP").Key("ListenIP").String()
port := cfg.Section("HTTP").Key("ListenPort").String()
http.HandleFunc("/", handleIndex)
http.HandleFunc("/echart/", eChart)
http.Handle("/assets/", http.StripPrefix("/assets/", http.FileServer(http.Dir("./assets"))))
http.ListenAndServe(addr+":"+port, nil)
}
func handleIndex(w http.ResponseWriter, r *http.Request) {
if r.RequestURI == "/favicon.ico" {
return
}
log.Printf("[MSG] Received Request: %s, %s\r\n", r.RemoteAddr, r.RequestURI)
defer r.Body.Close()
type Data struct {
Title string
Host string
}
data := Data{
Title: cfg.Section("HTTP").Key("Title").String(),
Host: cfg.Section("HTTP").Key("Host").String(),
}
tpl, err := template.ParseFiles("root.html")
if err != nil {
log.Printf("[ERR] %v\r\n", err)
return
}
err = tpl.Execute(w, data)
if err != nil {
log.Printf("[ERR] %v\r\n", err)
return
}
}
func eChart(w http.ResponseWriter, r *http.Request) {
if r.RequestURI == "/favicon.ico" {
return
}
log.Printf("[MSG] Received Request: %s, %s\r\n", r.RemoteAddr, r.RequestURI)
defer r.Body.Close()
if err := r.ParseForm(); err != nil {
log.Printf("[ERR] %v\r\n", err)
}
type Params struct {
Range string ""
Alias string ""
Class string ""
Scope string ""
}
var params Params
params.Range = r.Form.Get("range")
params.Scope = r.Form.Get("scope")
params.Alias = r.Form.Get("alias")
params.Class = r.Form.Get("class")
log.Printf("[MSG] Request Params: %#v\r\n", params)
timeAxis := make([]string, 0)
endTime := time.Now()
beginTime := endTime.AddDate(0, 0, -7)
bt := beginTime
for i := 1; i <= 60*24*7; i++ {
bt = bt.Add(time.Minute)
timeAxis = append(timeAxis, bt.Format("01-02 15:04"))
}
// Parsing Config - Database
cfg.Reload()
dbHost := cfg.Section("Database").Key("Host").MustString("127.0.0.1")
dbPort := cfg.Section("Database").Key("Port").MustString("3306")
dbSchema := cfg.Section("Database").Key("Database").MustString("monitoring")
dbTable := cfg.Section("Database").Key("Table").MustString("server")
dbColumns := cfg.Section("Database").Key("Columns").MustString("alias,item,result,update_time")
dbUsername := cfg.Section("Database").Key("Username").String()
dbPassword := cfg.Section("Database").Key("Password").String()
if dbUsername == "" || dbPassword == "" {
log.Println("[ERR] Invalid Database Configuration.")
return
}
qry := fmt.Sprintf(
"SELECT %s FROM %s WHERE alias='%s' AND item='%s' AND update_stmp>=%d ORDER BY seqid ASC;",
dbColumns,
dbTable,
params.Alias,
params.Class,
beginTime.Unix(),
)
log.Printf("[MSG] Query SQL: \r\n%s\r\n", qry)
dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s", dbUsername, dbPassword, dbHost, dbPort, dbSchema)
conn, err := sql.Open("mysql", dsn)
if err != nil {
log.Printf("[ERR] %v\r\n", err)
return
}
defer conn.Close()
if err := conn.Ping(); err != nil {
log.Printf("[ERR] %v\r\n", err)
return
}
defer conn.Close()
rows, err := conn.Query(qry)
if err != nil {
log.Printf("[ERR] %v\r\n", err)
return
}
defer rows.Close()
log.Println("[MSG] Query Successed.")
baseData := make(map[string]string, 0)
for rows.Next() {
var data DataSet
err := rows.Scan(&data.Alias, &data.Item, &data.Result, &data.UpdateTime)
if err != nil {
log.Printf("[ERR] %v\r\n", err)
return
}
baseData[data.UpdateTime] = data.Result
}
log.Printf("[MSG] Total Scanned: %d\r\n", len(baseData))
var dots []opts.LineData = make([]opts.LineData, 0)
for _, t := range timeAxis {
tmp, ok := baseData[t]
if ok {
dots = append(dots, opts.LineData{Value: tmp})
} else {
dots = append(dots, opts.LineData{Value: "null"})
}
}
log.Println("[MSG] Finished Sort Metadata.")
// Parsing Config - Chart Titles
chartTitle := cfg.Section("Chart").Key("Title").String()
chartSubtitle := cfg.Section("Chart").Key("Subtitle").String()
chartSeries := cfg.Section("Chart").Key("Series").String()
assetsURL := cfg.Section("Chart").Key("AssetsURL").String()
var xPercent float32 = 75
if params.Range == "all" {
xPercent = 0
}
if params.Range == "half" {
xPercent = 50
}
if params.Range == "quarter" {
xPercent = 75
}
if params.Range == "octant" {
xPercent = 87.5
}
if params.Alias != "" {
chartSubtitle = params.Alias
}
if params.Class != "" {
chartTitle = params.Class
}
chart := charts.NewLine()
// lang := make([]string, 0)
// lang = append(lang, "data view")
// lang = append(lang, "turn off")
// lang = append(lang, "refresh")
chart.SetGlobalOptions(
charts.WithTitleOpts(
opts.Title{
Left: "center",
Top: "0",
Title: chartTitle,
TitleStyle: &opts.TextStyle{
Color: "#000000",
FontSize: 18,
FontFamily: "Calibri",
},
Subtitle: chartSubtitle,
SubtitleStyle: &opts.TextStyle{
Color: "#222222",
FontSize: 16,
FontFamily: "Calibri",
},
},
),
charts.WithInitializationOpts(
opts.Initialization{
PageTitle: "eChart",
BackgroundColor: "#FFFFFF",
Width: "800px",
Height: "600px",
AssetsHost: assetsURL,
},
),
charts.WithDataZoomOpts(
opts.DataZoom{
Type: "inside",
Start: xPercent,
End: 100,
},
),
charts.WithXAxisOpts(
opts.XAxis{
Min: "dataMin",
Max: "dataMax",
AxisLabel: &opts.AxisLabel{
ShowMinLabel: true,
ShowMaxLabel: true,
Rotate: 45,
FontSize: "14",
FontWeight: "600",
FontFamily: "Calibri",
LineHeight: "200",
},
},
),
charts.WithTooltipOpts(
opts.Tooltip{
Show: true,
Trigger: "axis",
},
),
charts.WithToolboxOpts(
opts.Toolbox{
Show: true,
Feature: &opts.ToolBoxFeature{
SaveAsImage: &opts.ToolBoxFeatureSaveAsImage{
Show: true,
Type: "png",
},
DataView: &opts.ToolBoxFeatureDataView{
Show: true,
},
Restore: &opts.ToolBoxFeatureRestore{
Show: true,
},
},
},
),
// charts.WithLegendOpts(
// opts.Legend{
// Show: true,
// },
// ),
)
chart.SetXAxis(timeAxis).AddSeries(chartSeries, dots).
SetSeriesOptions(
charts.WithLineChartOpts(
opts.LineChart{
ConnectNulls: true,
},
),
charts.WithMarkPointNameTypeItemOpts(
opts.MarkPointNameTypeItem{
Name: "Max",
Type: "max",
},
opts.MarkPointNameTypeItem{
Name: "Min",
Type: "min",
},
),
charts.WithMarkPointStyleOpts(
opts.MarkPointStyle{
SymbolSize: 50,
Label: &opts.Label{
Show: true,
Position: "inside",
},
},
),
charts.WithMarkLineNameTypeItemOpts(
opts.MarkLineNameTypeItem{
Name: "Avrg",
Type: "average",
},
),
// charts.WithLabelOpts(
// opts.Label{
// Show: true,
// Position: "top",
// },
// ),
)
chart.Render(w)
}

18
LineChart.ini Normal file
View File

@ -0,0 +1,18 @@
[HTTP]
ListenIP=0.0.0.0
ListenPort=8081
[Chart]
AssetsURL=http://127.0.0.1:8081/assets/
Title=PXE Loading
Subtitle=DA1/DA2
Series=Value
[Database]
Host=192.168.3.31
Port=3306
Username=root
Password=1qaz@WSX
Database=monitoring
Table=server
Columns=alias,item,result,DATE_FORMAT(update_time, '%m-%d %H:%i')

1
assets/bulma.min.css vendored Normal file

File diff suppressed because one or more lines are too long

1
assets/echarts-gl.min.js vendored Normal file

File diff suppressed because one or more lines are too long

5
assets/echarts-liquidfill.min.js vendored Normal file

File diff suppressed because one or more lines are too long

8
assets/echarts-wordcloud.min.js vendored Normal file

File diff suppressed because one or more lines are too long

21
assets/echarts.min.js vendored Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
assets/maps/anhui.js Normal file

File diff suppressed because one or more lines are too long

2
assets/maps/aomen.js Normal file
View File

@ -0,0 +1,2 @@
!function(e,o){"function"==typeof define&&define.amd?define(["exports","echarts"],o):"object"==typeof exports&&"string"!=typeof exports.nodeName?o(exports,require("echarts")):o({},e.echarts)}(this,function(e,o){var t=function(e){"undefined"!=typeof console&&console&&console.error&&console.error(e)}
return o?o.registerMap?void o.registerMap("澳门",{type:"FeatureCollection",features:[{id:"820001",type:"Feature",geometry:{type:"MultiPolygon",coordinates:[["@@LADC^umZ@DONWE@DALBBF@H@DFBBTC"],["@@P@LC@AGM@OECMBABBTCD@DDH"]],encodeOffsets:[[[116285,22746]],[[116303,22746]]]},properties:{cp:[113.552965,22.207882],name:"花地玛堂区",childNum:2}},{id:"820002",type:"Feature",geometry:{type:"Polygon",coordinates:["@@MK@CA@AAGDEB@NVFJG"],encodeOffsets:[[116281,22734]]},properties:{cp:[113.549052,22.199175],name:"花王堂区",childNum:1}},{id:"820003",type:"Feature",geometry:{type:"Polygon",coordinates:["@@EGOB@DNLHE@C"],encodeOffsets:[[116285,22729]]},properties:{cp:[113.550252,22.193791],name:"望德堂区",childNum:1}},{id:"820004",type:"Feature",geometry:{type:"Polygon",coordinates:["@@ŸYMVAN@BFCBBDAFHDBBFDHIJJEFDPCHHlYJQ"],encodeOffsets:[[116313,22707]]},properties:{cp:[113.55374,22.188119],name:"大堂区",childNum:1}},{id:"820005",type:"Feature",geometry:{type:"Polygon",coordinates:["@@JICGAECACGEBAAEDBFNXB@"],encodeOffsets:[[116266,22728]]},properties:{cp:[113.54167,22.187778],name:"风顺堂区",childNum:1}},{id:"820006",type:"Feature",geometry:{type:"Polygon",coordinates:["@@ ZNWRquZCBCC@AEA@@ADCDCAACEAGBQ@INEL"],encodeOffsets:[[116265,22694]]},properties:{cp:[113.558783,22.154124],name:"嘉模堂区",childNum:1}},{id:"820007",type:"Feature",geometry:{type:"Polygon",coordinates:["@@MOIAIEI@@GE@AAUCBdCFIFR@HAFBBDDBDCBC@@FB@BDDDA\\M"],encodeOffsets:[[116316,22676]]},properties:{cp:[113.56925,22.136546],name:"路凼填海区",childNum:1}},{id:"820008",type:"Feature",geometry:{type:"Polygon",coordinates:["@@DKMMa_GC_COD@dVDBBF@@HJ@JFJBNPZK"],encodeOffsets:[[116329,22670]]},properties:{cp:[113.559954,22.124049],name:"圣方济各堂区",childNum:1}}],UTF8Encoding:!0}):void t("ECharts Map is not loaded"):void t("ECharts is not Loaded")})

2
assets/maps/beijing.js Normal file

File diff suppressed because one or more lines are too long

1
assets/maps/china.js Normal file

File diff suppressed because one or more lines are too long

3
assets/maps/chongqing.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
assets/maps/fujian.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
!function(B,A){"function"==typeof define&&define.amd?define(["exports","echarts"],A):"object"==typeof exports&&"string"!=typeof exports.nodeName?A(exports,require("echarts")):A({},B.echarts)}(this,function(B,A){var D=function(B){"undefined"!=typeof console&&console&&console.error&&console.error(B)}
return A?A.registerMap?void A.registerMap("嘉峪关",{type:"FeatureCollection",features:[{type:"Feature",id:"620200",properties:{name:"嘉峪关市",cp:[98.289419,39.772554],childNum:2},geometry:{type:"MultiPolygon",coordinates:[["@@HEDADA@ABABA@@@C@C@G@@@ABA@A@C@@@@B@D@BB@A@@BA@I@A@AAAAAAACAAAEEAA@AC@AAA@@AA@AAEECCAAAAAA@AACAC@E@@@A@@AE@ACE@AAC@AAC@AAACEACAAEAGEAAAAABADCDCDAB@BA@C@AAEBC@CBA@@@CBA@IDG@@BGA@B@@A@A@@@AAA@AACA@@C@A@@@A@@@A@AB@@CBA@@BC@CBA@ABABCBEBEBABABA@EFEDABABCB@@A@@BADCBCBA@@BC@@@ABABA@ABABCAC@CAA@ODEBA@@BABAD@DAD@@ABKBCB@@CBC@A@A@A@AB@@@BBBB@@BBF@BBBDDBDBBAB@@A@A@C@CCC@CBWLIDGBM@M@MAI@OCIAECCAMMEGEECE@AAA@EAE@@@@G@wBS@c@ÁB@A‡emWSIIJGFCDAFQVCDCDAB@B@BCDCBEBEBEBC@K@A@C@EDC@ABEAC@C@KDSDGBA@GFCBO@[@C@AB@@DB^RBBFDHDDBBBTLB@DDJDBBBBHDB@NHBBHFB@RLJFJDDDLFPJBBJFHDLFDDDB@@BBBDBDFHBBFLDD@BBBBDBBBDDFBBDBBBHDJDFBDBB@BBBBFBFDFBJDHDBBB@BB@@@@GHADuxORCFMPAB@@@@@BBB@@@BFDDF@@@@B@BDFDJDBBHDDB@@B@@BBB@@BBDBBBHDB@B@DBBBB@DBDBF@@@DDDBFB@@B@@B@@@@AB@@C@AB@@A@@@A@@@@@ABA@ABC@A@CB@@A@ABA@A@CAEBA@@@@@@@@@@@@@A@A@A@@@A@@BA@@@A@A@@@@@A@ABA@A@BBD@BBDBB@@B@@@BC@@@@B@@@B@@BBDBB@B@B@B@B@B@B@@@BB@@@DBBB@@ABB@@B@@@BB@@A@@B@B@B@B@B@@B@@@@B@B@@BB@B@@B@B@DBB@DADBB@B@DBDBB@D@@@BA@@B@DBB@BD@BB@BBD@FBB@B@DA@@B@BB@@BAB@@@BBD@BBB@B@BB@@@@@BA@AB@@@BAB@B@B@B@BAD@@@@@B@@@BA@@B@@BB@BB@B@@B@B@BA@@BBBBDB@@@@B@D@BABAB@DABADADABCDCBAB@B@@@B@BDBDBD@JChINCDAJAFAPETCBAFAD@PCdILCFAZAL@ZAJ@XATAN@LAH@H@D@F@B@FAB@L@RApAPAD@B@D@DB@A@@@@AA@A@A@@@@@AB@@@B@FBJAD@F@B@B@@@@@B@@@B@@AD@BAF@BA@@F@JBJ@J@DBF@D@DAD@BBD@D@B@B@@@@B@@@B@@@@@@B@@@DADAF@BA@BF@BBB@BBDBD@HBDBDBBBBBB@@@BBB@BAFAB@@@D@D@FAB@B@@ADCBAB@HABABAB@BABAB@F@N@J@H@F@BBD@DDDBD@HFJDHBBBB@@B@B@D@@BBF@H@@AB@JGBADE@AFCHEDCDCD@@AD@@A@A@@CA@AA@@ABA@ABCBC@A@A@AAA@AA@@AACAC@A@A@A@ABC@A@EBA@@BC@@@CB@DAB@B@D@HAHA@@@AB@BAB@D@B@BAB@B@@A@@CICEACAA@@JI@@@@KIMKEEEEECIICA@@A@@A@AA@AAAAA@CA@@@@FC@@@A@@@AA@AAAABA@@@AB@BAB@@AB@@AAABABCBADE@A@@@C@@AAAAAAGECACAA@OA@ACA@@A@A@@@AA@AA@@@CAAACACAAA@@A@AAA@EACCA@@@A@EAAAOGE@ECA@CAAAA@UIMECAOEA@GCICUI@@KEEA@@A@@@AAYI@A@@@AA@CA@AA@@ABABG@@BA@ABG@CDABEBCBA@@FCDABADA@AB@DABAD@DCD@DAVGB@BAJE"],["@@HDFBHBB@@@B@@@CAAAAAAAA@@AAC@@ABID@@@@"]],encodeOffsets:[[[100760,40692]],[[100197,40667]]]}}],UTF8Encoding:!0}):void D("ECharts Map is not loaded"):void D("ECharts is not Loaded")})

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
assets/maps/gansu.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
!function(e,o){"function"==typeof define&&define.amd?define(["exports","echarts"],o):"object"==typeof exports&&"string"!=typeof exports.nodeName?o(exports,require("echarts")):o({},e.echarts)}(this,function(e,o){var t=function(e){"undefined"!=typeof console&&console&&console.error&&console.error(e)}
return o?o.registerMap?void o.registerMap("东沙群岛",{type:"FeatureCollection",features:[{type:"Feature",id:"442100",properties:{name:"东沙群岛",cp:[116.887613,20.617825],childNum:4},geometry:{type:"MultiPolygon",coordinates:[["@@N\\`ZrDVBrCf]\\mRmBqWY]OoFyZe^a\\SfA^"],["@@JVZNT@B@TSno\\cB_ES@AWCaAaR]dOfId"],["@@IBGBIBEBID@@AB@BB@@@BBA@BD@@DBDBB@B@B@DAFCFAD@B@DCB@B@@ADGBCA@E@"],["@@tJrHtC^BvGj[JK\\{R§CS]{Ycc_q]‹K{AuLUJSPCJBLFHNF„KŠNlRtn`‚C€MhQJ]BuDUCKCIBIHOFK@[AQAKDCJDHHBFFCN@HDF"]],encodeOffsets:[[[118726,21604]],[[118709,21486]],[[119538,21192]],[[119573,21271]]]}}],UTF8Encoding:!0}):void t("ECharts Map is not loaded"):void t("ECharts is not Loaded")})

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
!function(A,B){"function"==typeof define&&define.amd?define(["exports","echarts"],B):"object"==typeof exports&&"string"!=typeof exports.nodeName?B(exports,require("echarts")):B({},A.echarts)}(this,function(A,B){var C=function(A){"undefined"!=typeof console&&console&&console.error&&console.error(A)}
return B?B.registerMap?void B.registerMap("中山",{type:"FeatureCollection",features:[{type:"Feature",id:"442000",properties:{name:"中山市",cp:[113.39277,22.517585],childNum:1},geometry:{type:"Polygon",coordinates:["@@FCDABABA@AC@GAEACAA@ICCACA@@EA@@A@ACEGEA@@KCCAICEAOE@@CCAAA@G@GBIBCFCDEFOTCDINEFA@A@CAAAA@ADAB@B@@A@EDAAC@ABCBA@SJMJCBCD@@EFCHCDCJCJABCJAFAFADKXITCLAFAF@@@B@@@J@RGLEJMLEH@@@@KN@@QVCDABKLGJEHCBSLAJCJCJAH@H@H@D@N@V@FELCFEH@@EHEL@FADCPEJADGJADKN@B@@@@GLADCFEJKLABMJABQTIHD\\CT@D@DADALADADCFCHABAFABA@@BADCBCDIL@BCJAB@B@@A@@@CD@@@@CDA@FDAD@@@@@D@@@B@B@@AB@@AD@BDHAB@@@@ADDN@DBHDFBF@@@@@@@@BBDAB@B@D@BB@@@H@FC@C@@ACJABC@ADD@@BBBB@D@ADABEFBBDB@@@@@@@@B@BABBBB@@@@BB@@@@BB@B@@B@@@@BB@BABDBAB@A@DDDABCB@@@BABAD@@ADABAB@B@B@B@BBD@D@DB@@D@@@AB@BAD@FFHBBDD@@@B@B@D@HJBHHHHBB@@DDDFBBBFDDDHHLDJBBBNFD@BDBDBB@JABAHEB@HIBEDEFEDCJBBD@@FFFH@@@@HFDBB@N@DAFAJAB@DBD@H@@@FBJBF@JDHB@@BB@@@BAB@@@BA@@B@B@@BB@BBB@@@BB@B@BBB@BBB@BB@@B@BB@@BB@@BBB@@BB@@@@@B@@BB@@@BBB@DB@@BBB@B@BBB@D@BBB@BBDHHHHCHGDAJEDCTK@@@@JEHC@AFCB@DANGJCLCFAL@F@H@DANADAfK@@EM@@@@AANKBA@@HELGBARMNIFABAJELGHELGNIVOAQEAC@C@@A@@@AHMJOFIDELQ@AFKDABCHKFG@AFFHEFFFCBBDEJGDAFCFAB@L@DAPIJELKfVuDKTAjATBo‡‹Gk}ki][I@IBU@A@ODAAODABA@CAA@CAACCAABABC@AAAAAC@AA@CACBEFCDC@ECAACACAGAACBM@GCAC@CCECAE@CBEBCDCDC@@AEBEACAC@A@AD@BABA@EB@@AAA@@@A@EAA@@AAAA@A@CBC@@@AA@@@A@@CBEB@FADAAC@CBAB@DABABAAABCDABA@AACCAOGE@C@@BA@@@A@CBAAA@BA@A@@@@AA@@AAA@A@@@A@AA@@A@A@@B@@@AA@@BCCAACCBA@@B@DCDAAA@@@@BA@@BAB@@BBABBBCBA@@B@JIAAJIBC@@AADC@@@AB@@AB@BA@A@A@@BABABC@@DB@@CE@@B@@@BACADEDABCDB@BB@BBBAFG@@@ABABC@@@@@C@A@@@A@C@@@@@A@@AA@A@@@@@A@CGDAC@ACCEAA@A@A@AA@@C@AAA@A@A@A@@AA@A@@@AAABA@CACAA@CCC@@EBC@A"],encodeOffsets:[[116204,22767]]}}],UTF8Encoding:!0}):void C("ECharts Map is not loaded"):void C("ECharts is not Loaded")})

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
assets/maps/guangdong.js Normal file

File diff suppressed because one or more lines are too long

1
assets/maps/guangxi.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Some files were not shown because too many files have changed in this diff Show More