forked from OrgGo/goplot
add bar and pie
This commit is contained in:
parent
531d19f530
commit
7b1af58dbd
|
@ -20,3 +20,5 @@ _cgo_export.*
|
|||
_testmain.go
|
||||
|
||||
*.exe
|
||||
|
||||
goplot
|
||||
|
|
|
@ -0,0 +1,67 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type barDataSetsType struct {
|
||||
FillColor string `json:"fillColor"`
|
||||
StrokeColor string `json:"strokeColor"`
|
||||
Data []int `json:"data"`
|
||||
}
|
||||
|
||||
type barDataType struct {
|
||||
Labels []string `json:"labels"`
|
||||
Datasets []*barDataSetsType `json:"datasets"`
|
||||
}
|
||||
|
||||
type BarChart struct {
|
||||
name string
|
||||
}
|
||||
|
||||
func (b *BarChart) Canvas(name string, height int, width int) string {
|
||||
if height == 0 {
|
||||
height = 300
|
||||
}
|
||||
if width == 0 {
|
||||
width = 400
|
||||
}
|
||||
return fmt.Sprintf("<canvas id=\"%s\" height=\"%d\" width=\"%d\"></canvas>", name, height, width)
|
||||
}
|
||||
|
||||
func (l *BarChart) JsonCode(c *ChartDataType) (string, error) {
|
||||
bars := new(barDataType)
|
||||
|
||||
barNum := c.ValueNum()
|
||||
|
||||
bars.Labels = c.ItemName()
|
||||
bars.Datasets = make([]*barDataSetsType, 0, barNum)
|
||||
|
||||
for i := 0; i < barNum; i++ {
|
||||
bar := &barDataSetsType{}
|
||||
bar.FillColor = GetColorValue(i)
|
||||
bar.StrokeColor = GetColorValue(i)
|
||||
|
||||
bar.Data = c.ItemValue(i)
|
||||
bars.Datasets = append(bars.Datasets, bar)
|
||||
}
|
||||
|
||||
b, err := json.Marshal(bars)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return fmt.Sprintf("var barJsonStr = '%s';", string(b)), nil
|
||||
}
|
||||
|
||||
func (l *BarChart) NewChart(name string) string {
|
||||
return fmt.Sprintf("new Chart(document.getElementById(\"%s\").getContext(\"2d\")).Bar(eval('('+barJsonStr+')'));", name)
|
||||
}
|
||||
|
||||
func init() {
|
||||
bar := new(BarChart)
|
||||
bar.name = "bar"
|
||||
|
||||
ChartHandlers["bar"] = bar
|
||||
}
|
9
data.go
9
data.go
|
@ -174,8 +174,8 @@ func ParseDataFile(file string) ([]*ChartDataType, error) {
|
|||
return charts, nil
|
||||
}
|
||||
|
||||
func LookupCurrentDir(dir string) ([]*ChartDataType, error) {
|
||||
var data []*ChartDataType
|
||||
func LookupCurrentDir(dir string) ([]string, error) {
|
||||
var tmp []string = make([]string, 0, 5)
|
||||
|
||||
err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error {
|
||||
if f == nil {
|
||||
|
@ -190,12 +190,11 @@ func LookupCurrentDir(dir string) ([]*ChartDataType, error) {
|
|||
return err
|
||||
} else if ok {
|
||||
if path == f.Name() {
|
||||
data, err = ParseDataFile(path)
|
||||
return err
|
||||
tmp = append(tmp, path)
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
return data, err
|
||||
return tmp, err
|
||||
}
|
||||
|
|
|
@ -0,0 +1,7 @@
|
|||
===
|
||||
{ "Name" : "bar", "Height" : 300, "Width" : 550 }
|
||||
---
|
||||
aaa 10 13
|
||||
bbb 15 12
|
||||
ccc 23 14
|
||||
ddd 20 24
|
|
@ -0,0 +1,7 @@
|
|||
===
|
||||
{ "Name" : "pie", "Height" : 300, "Width" : 550 }
|
||||
---
|
||||
aaa 10
|
||||
bbb 15
|
||||
ccc 23
|
||||
ddd 20
|
6
main.go
6
main.go
|
@ -1,5 +1,9 @@
|
|||
package main
|
||||
|
||||
const start = `version: 1.0
|
||||
http://localhost:8000`
|
||||
|
||||
func main() {
|
||||
ListenAndServe(":8000")
|
||||
println(start)
|
||||
println(ListenAndServe(":8000").Error())
|
||||
}
|
||||
|
|
57
pie.go
57
pie.go
|
@ -1 +1,58 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
)
|
||||
|
||||
type pieDataSetsType struct {
|
||||
Color string `json:"color"`
|
||||
Value int `json:"value"`
|
||||
}
|
||||
|
||||
type PieChart struct {
|
||||
name string
|
||||
}
|
||||
|
||||
func (b *PieChart) Canvas(name string, height int, width int) string {
|
||||
if height == 0 {
|
||||
height = 300
|
||||
}
|
||||
if width == 0 {
|
||||
width = 400
|
||||
}
|
||||
return fmt.Sprintf("<canvas id=\"%s\" height=\"%d\" width=\"%d\"></canvas>", name, height, width)
|
||||
}
|
||||
|
||||
func (l *PieChart) JsonCode(c *ChartDataType) (string, error) {
|
||||
pieNum := c.ItemNum()
|
||||
items := c.ItemValue(0)
|
||||
|
||||
datasets := make([]*pieDataSetsType, 0, pieNum)
|
||||
|
||||
for i := 0; i < pieNum; i++ {
|
||||
pie := &pieDataSetsType{}
|
||||
pie.Color = GetColorValue(i)
|
||||
pie.Value = items[i]
|
||||
|
||||
datasets = append(datasets, pie)
|
||||
}
|
||||
|
||||
b, err := json.Marshal(datasets)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
return fmt.Sprintf("var pieJsonStr = '%s';", string(b)), nil
|
||||
}
|
||||
|
||||
func (l *PieChart) NewChart(name string) string {
|
||||
return fmt.Sprintf("new Chart(document.getElementById(\"%s\").getContext(\"2d\")).Pie(eval('('+pieJsonStr+')'));", name)
|
||||
}
|
||||
|
||||
func init() {
|
||||
pie := new(PieChart)
|
||||
pie.name = "pie"
|
||||
|
||||
ChartHandlers["pie"] = pie
|
||||
}
|
||||
|
|
43
server.go
43
server.go
|
@ -19,6 +19,9 @@ const html = `{{define "T"}}
|
|||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div style="padding-top:30px;">
|
||||
By <a href="http://www.bigendian123.com/skoo.html" target="_blank">skoo</a>
|
||||
</div>
|
||||
<div style="padding-top:30px;"></div>
|
||||
{{.Canvas}}
|
||||
<script>
|
||||
|
@ -36,10 +39,26 @@ type ChartIf interface {
|
|||
NewChart(string) string
|
||||
}
|
||||
|
||||
var ChartHandlers = make(map[string]ChartIf)
|
||||
var (
|
||||
ChartHandlers = make(map[string]ChartIf)
|
||||
ChartFiles []string
|
||||
Index int
|
||||
)
|
||||
|
||||
func handler(w http.ResponseWriter, r *http.Request) {
|
||||
datas, err := LookupCurrentDir(".")
|
||||
if len(ChartFiles) == 0 {
|
||||
return
|
||||
}
|
||||
var file string
|
||||
if Index < len(ChartFiles) {
|
||||
file = ChartFiles[Index]
|
||||
Index++
|
||||
} else {
|
||||
Index = 0
|
||||
file = ChartFiles[Index]
|
||||
}
|
||||
|
||||
datas, err := ParseDataFile(file)
|
||||
if err != nil {
|
||||
w.Write([]byte(err.Error()))
|
||||
return
|
||||
|
@ -75,21 +94,23 @@ func handler(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
}
|
||||
|
||||
t, err1 := template.New("foo").Parse(html)
|
||||
if err1 != nil {
|
||||
w.Write([]byte(err1.Error()))
|
||||
return
|
||||
}
|
||||
|
||||
err = t.ExecuteTemplate(w, "T", Args)
|
||||
if err != nil {
|
||||
if t, err := template.New("foo").Parse(html); err != nil {
|
||||
w.Write([]byte(err.Error()))
|
||||
return
|
||||
} else {
|
||||
if err = t.ExecuteTemplate(w, "T", Args); err != nil {
|
||||
w.Write([]byte(err.Error()))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func ListenAndServe(addr string) error {
|
||||
http.HandleFunc("/", handler)
|
||||
http.HandleFunc("/favicon.ico", func(w http.ResponseWriter, r *http.Request) {})
|
||||
|
||||
var err error
|
||||
ChartFiles, err = LookupCurrentDir(".")
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
return http.ListenAndServe(addr, nil)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue