diff options
-rw-r--r-- | main.go | 183 | ||||
-rw-r--r-- | tmpl/addstars.html | 84 | ||||
-rw-r--r-- | tmpl/header.html | 11 | ||||
-rw-r--r-- | tmpl/index.html | 24 | ||||
-rw-r--r-- | tmpl/javascript.html | 5 | ||||
-rw-r--r-- | tmpl/nav.html | 20 | ||||
-rw-r--r-- | tmpl/newtree.html | 60 | ||||
-rw-r--r-- | tmpl/overview.html | 49 | ||||
-rw-r--r-- | web/index.html | 41 |
9 files changed, 473 insertions, 4 deletions
diff --git a/main.go b/main.go index 4088fb1..fbf524a 100644 --- a/main.go +++ b/main.go @@ -2,19 +2,194 @@ package main import ( "fmt" + "html/template" "log" "net/http" + "net/url" + "strconv" "github.com/gorilla/mux" ) -func indexHandler(w http.ResponseWriter, r *http.Request) { - _, _ = fmt.Fprintln(w, "Hello World\nThis is the manager managing all the processes") +type Page struct { + NewTree bool + X, Y, W float64 +} + +func overviewHandler(w http.ResponseWriter, r *http.Request) { + t := template.Must(template.ParseFiles( + "tmpl/overview.html", + "tmpl/header.html", + "tmpl/nav.html", + "tmpl/javascript.html", + )) + templateExecuteError := t.ExecuteTemplate(w, "overview", &Page{}) + if templateExecuteError != nil { + log.Println(templateExecuteError) + } +} + +func newtreeHandler(w http.ResponseWriter, r *http.Request) { + log.Println("the new tree handler was accessed") + // if the method used to get the page is GET, simply respond with the tree-creation form + if r.Method == "GET" { + log.Println("using a GET method") + t := template.Must(template.ParseFiles( + "tmpl/newtree.html", + "tmpl/header.html", + "tmpl/nav.html", + "tmpl/javascript.html", + )) + templateExecuteError := t.ExecuteTemplate(w, "newtree", &Page{}) + if templateExecuteError != nil { + log.Println(templateExecuteError) + } + } else { + log.Println("using a POST method") + + // get the values from the form + err := r.ParseForm() + log.Println(err) + log.Println("parsed the form") + + x, _ := strconv.ParseFloat(r.Form["x"][0], 64) // x position of the midpoint of the tree + y, _ := strconv.ParseFloat(r.Form["y"][0], 64) // y position of the midpoint of the tree + width, _ := strconv.ParseFloat(r.Form["w"][0], 64) // width the the tree + dbip := r.Form["db-ip"][0] // ip address of the database + + log.Println("parsed the form arguments") + + // parse the template files + t := template.Must(template.ParseFiles( + "tmpl/newtree.html", + "tmpl/header.html", + "tmpl/nav.html", + "tmpl/javascript.html", + )) + log.Println("parsed the template file") + + // execute the template + templateExecuteError := t.ExecuteTemplate(w, "newtree", &Page{NewTree: true, X: x, Y: y, W: width}) + + log.Println("executed the template") + + // handle potential errors + if templateExecuteError != nil { + log.Println(templateExecuteError) + } + + log.Println("handled potential errors") + + // create the new tree by accessing the api endpoint of the database + postUrl := fmt.Sprintf("http://%s/new", dbip) + + log.Printf("the postURL: %s", postUrl) + log.Println("created the url for the post request") + + // define the data that should be posted + formData := url.Values{ + "x": r.Form["x"], + "y": r.Form["y"], + "w": r.Form["w"], + } + + log.Println("created the form to be sent in the post request") + + // make the http Post request + resp, err := http.PostForm(postUrl, formData) + + log.Println("sent the post request") + + // some debug messages + log.Printf("[ ] POST response: %v", resp) + log.Printf("[ ] POST err: %v", err) + } +} + +func addstarsHandler(w http.ResponseWriter, r *http.Request) { + // if the method used to get the page is GET, simply respond with the add-stars form + if r.Method == "GET" { + log.Println("/addstars was accessed using a GET method") + t := template.Must(template.ParseFiles( + "tmpl/addstars.html", + "tmpl/header.html", + "tmpl/nav.html", + "tmpl/javascript.html", + )) + templateExecuteError := t.ExecuteTemplate(w, "addstars", &Page{}) + if templateExecuteError != nil { + log.Println(templateExecuteError) + } + } else { + log.Println("/addstars was accessed using a POST method") + + // get the values from the form + _ = r.ParseForm() + + log.Println("parsed the form") + + // extract some information from the form + dbip := r.Form["dbip"][0] // ip address of the database + treeindex, _ := strconv.ParseInt(r.Form["tree"][0], 10, 64) // index of the tree + log.Println(dbip) + log.Println(treeindex) + + log.Println("parsed the form arguments") + + t := template.Must(template.ParseFiles( + "tmpl/addstars.html", + "tmpl/header.html", + "tmpl/nav.html", + "tmpl/javascript.html", + )) + + log.Println("parsed the template file") + + templateExecuteError := t.ExecuteTemplate(w, "addstars", &Page{}) + if templateExecuteError != nil { + log.Println(templateExecuteError) + } + + log.Println("executed the template") + + // create the new tree by accessing the api endpoint of the database + postUrl := fmt.Sprintf("http://%s/insert/%d", dbip, treeindex) + + log.Printf("the postURL: %s", postUrl) + log.Println("created the url for the post request") + + // define the data that should be posted + formData := url.Values{ + "x": r.Form["x"], + "y": r.Form["y"], + "vx": r.Form["vx"], + "vy": r.Form["vy"], + "m": r.Form["mass"], + } + + log.Println("created the form to be sent in the post request") + + // make the http Post request + resp, err := http.PostForm(postUrl, formData) + + log.Println("sent the post request") + + // some debug messages + log.Printf("[ ] POST response: %v", resp) + log.Printf("[ ] POST err: %v", err) + } +} + +func drawtreeHandler(w http.ResponseWriter, r *http.Request) { + } func main() { router := mux.NewRouter() - router.HandleFunc("/", indexHandler).Methods("GET") - log.Fatal(http.ListenAndServe(":80", router)) + router.HandleFunc("/", overviewHandler).Methods("GET") + router.HandleFunc("/newtree", newtreeHandler).Methods("GET", "POST") + router.HandleFunc("/addstars", addstarsHandler).Methods("GET", "POST") + router.HandleFunc("/drawtree", drawtreeHandler).Methods("GET") + log.Fatal(http.ListenAndServe(":8429", router)) } diff --git a/tmpl/addstars.html b/tmpl/addstars.html new file mode 100644 index 0000000..cffc31e --- /dev/null +++ b/tmpl/addstars.html @@ -0,0 +1,84 @@ +{{define "addstars"}} + <head> + {{template "header"}} + <style> + .jumbotron{ + margin: 10px; + } + </style> + </head> + <body> + {{template "nav"}} + + <div class="container"> + <div class="tab-content" id="nav-tabContent"> + <div class="tab-pane fade" id="nav-overview" role="tabpanel" aria-labelledby="nav-overview-tab">There will be an overview here!</div> + <div class="tab-pane fade" id="nav-new-tree" role="tabpanel" aria-labelledby="nav-new-tree-tab">add tree</div> + <div class="tab-pane fade" id="nav-add-stars" role="tabpanel" aria-labelledby="nav-add-stars-tab">Add some stars!</div> + <div class="tab-pane fade" id="nav-draw-tree" role="tabpanel" aria-labelledby="nav-draw-tree-tab">Draw one of the galaxies!</div> + </div> + </div> + + <div class="container"> + <div class="jumbotron"> + <h1 class="display-4">Add Stars</h1> + <p class="lead">This is the "Add your star to a tree" page! Fill out the form below for adding one of your stars into one of the trees!</p> + <form action="/addstars" method="post"> + + <hr class="my-4"> + <div class="form-group"> + <input type="text" class="form-control" id="dbip" placeholder="db-ip" name="dbip"> + </div> + <div class="form-group"> + <input type="text" class="form-control" id="tree" placeholder="tree index" name="tree"> + </div> + <hr class="my-4"> + + <div class="form-group"> + <input type="text" class="form-control" id="x" placeholder="x" name="x"> + </div> + <div class="form-group"> + <input type="text" class="form-control" id="y" placeholder="y" name="y"> + </div> + <div class="form-group"> + <input type="text" class="form-control" id="vx" placeholder="vx" name="vx"> + </div> + <div class="form-group"> + <input type="text" class="form-control" id="vy" placeholder="vy" name="vy"> + </div> + <div class="form-group"> + <input type="text" class="form-control" id="m" placeholder="mass" name="mass"> + </div> + <button type="submit" class="btn btn-primary">Submit</button> + </form> + </div> + </div> + + <div class="container"> + <div class="jumbotron"> + <p class="lead">Optionally: select a .csv:</p> + <div class="input-group"> + <div class="input-group-prepend"> + <span class="input-group-text" id="inputGroupFileAddon01">Upload</span> + </div> + <div class="custom-file"> + <input type="file" class="custom-file-input" id="inputGroupFile01" aria-describedby="inputGroupFileAddon01"> + <label class="custom-file-label" for="inputGroupFile01">Choose file</label> + </div> + </div> + </div> + </div> + + <div class="container"> + <div class="jumbotron"> + <form enctype="multipart/form-data" action="http://127.0.0.1:9090/upload" method="post"> + <input type="file" name="uploadfile" /> + <input type="hidden" name="token" value="{{.}}"/> + <input type="submit" value="upload" /> + </form> + </div> + </div> + + {{template "javascript"}} + </body> +{{end}} diff --git a/tmpl/header.html b/tmpl/header.html new file mode 100644 index 0000000..57e749e --- /dev/null +++ b/tmpl/header.html @@ -0,0 +1,11 @@ +{{define "header"}} + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + <title>emile.space</title> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> + <style> + .nav { + margin: 10px; + } + </style> +{{end}} diff --git a/tmpl/index.html b/tmpl/index.html new file mode 100644 index 0000000..1f22908 --- /dev/null +++ b/tmpl/index.html @@ -0,0 +1,24 @@ +{{define "index"}} + <head> + {{template "header"}} + <style> + .jumbotron{ + margin: 10px; + } + </style> + </head> + <body> + {{template "nav"}} + + <div class="container"> + <div class="tab-content" id="nav-tabContent"> + <div class="tab-pane fade" id="nav-overview" role="tabpanel" aria-labelledby="nav-overview-tab">There will be an overview here!</div> + <div class="tab-pane fade" id="nav-new-tree" role="tabpanel" aria-labelledby="nav-new-tree-tab">add tree</div> + <div class="tab-pane fade" id="nav-add-stars" role="tabpanel" aria-labelledby="nav-add-stars-tab">Add some stars!</div> + <div class="tab-pane fade" id="nav-draw-tree" role="tabpanel" aria-labelledby="nav-draw-tree-tab">Draw one of the galaxies!</div> + </div> + </div> + + {{template "javascript"}} + </body> +{{end}} diff --git a/tmpl/javascript.html b/tmpl/javascript.html new file mode 100644 index 0000000..54b2810 --- /dev/null +++ b/tmpl/javascript.html @@ -0,0 +1,5 @@ +{{define "javascript"}} +<script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> +<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> +<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> +{{end}} diff --git a/tmpl/nav.html b/tmpl/nav.html new file mode 100644 index 0000000..9c7a94b --- /dev/null +++ b/tmpl/nav.html @@ -0,0 +1,20 @@ +{{define "nav"}} +<div class="container"> + <nav> + <ul class="nav nav-tabs"> + <li class="nav-item"> + <a class="nav-link" href="/">Overview</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/newtree">New Tree</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/addstars">Add Stars</a> + </li> + <li class="nav-item"> + <a class="nav-link" href="/drawtree">Draw Tree</a> + </li> + </ul> + </nav> +</div> +{{end}} diff --git a/tmpl/newtree.html b/tmpl/newtree.html new file mode 100644 index 0000000..974e45c --- /dev/null +++ b/tmpl/newtree.html @@ -0,0 +1,60 @@ +{{define "newtree"}} + <head> + {{template "header"}} + <style> + .jumbotron{ + margin: 10px; + } + </style> + </head> + <body> + {{template "nav"}} + + <div class="container"> + <div class="tab-content" id="nav-tabContent"> + <div class="tab-pane fade" id="nav-overview" role="tabpanel" aria-labelledby="nav-overview-tab">There will be an overview here!</div> + <div class="tab-pane fade" id="nav-new-tree" role="tabpanel" aria-labelledby="nav-new-tree-tab">add tree</div> + <div class="tab-pane fade" id="nav-add-stars" role="tabpanel" aria-labelledby="nav-add-stars-tab">Add some stars!</div> + <div class="tab-pane fade" id="nav-draw-tree" role="tabpanel" aria-labelledby="nav-draw-tree-tab">Draw one of the galaxies!</div> + </div> + </div> + + <div class="container"> + <div class="jumbotron"> + <h1 class="display-4">New Tree</h1> + <p class="lead">This is the "Create your own tree" page! Fill out the form below to create a new (quad)tree storing a complete galaxy!</p> + <hr class="my-4"> + <form action="/newtree" method="post"> + <div class="form-group"> + <label for="db-ip">The ip of the database</label> + <input type="text" class="form-control" id="x-pos" placeholder="db-ip" name="db-ip"> + </div> + <div class="form-group"> + <label for="x-pos">(Center) X Position</label> + <input type="text" class="form-control" id="x-pos" placeholder="x-pos" name="x"> + </div> + <div class="form-group"> + <label for="y-pos">(Center) Y Position</label> + + <input type="text" class="form-control" id="y-pos" placeholder="y-pos" name="y"> + </div> + <div class="form-group"> + <label for="width">Width</label> + <input type="text" class="form-control" id="width" placeholder="width" name="w"> + </div> + <button type="submit" class="btn btn-primary">Submit</button> + </form> + </div> + {{if .NewTree}} + <div class="alert alert-success alert-dismissible fade show" role="success"> + <strong>Successfully created the tree!</strong> (x:{{.X}}, y:{{.Y}}), width: {{.W}} + <button type="button" class="close" data-dismiss="alert" aria-label="Close"> + <span aria-hidden="true">×</span> + </button> + </div> + {{end}} + </div> + + {{template "javascript"}} + </body> +{{end}} diff --git a/tmpl/overview.html b/tmpl/overview.html new file mode 100644 index 0000000..7f20c2c --- /dev/null +++ b/tmpl/overview.html @@ -0,0 +1,49 @@ +{{define "overview"}} + <head> + {{template "header"}} + </head> + <body> + {{template "nav"}} + <div id="wrap"> + <div class="container"> + <h3>Existing galaxies</h3> + <table cellpadding="0" cellspacing="0" border="0" class="datatable table table-striped table-bordered"> + <thead> + <tr> + <th>Index</th> + <th>Boundary</th> + <th>Amounf of stars</th> + <th>Range</th> + </tr> + </thead> + + <tbody> + <tr class="gradeX"> + <td>1</td> + <td></td> + <td></td> + <td></td> + </tr> + <tr class="gradeX"> + <td>2</td> + <td></td> + <td></td> + <td></td> + </tr> + <tr class="gradeX"> + <td>3</td> + <td></td> + <td></td> + <td></td> + </tr> + </tbody> + + <tfoot> + </tfoot> + </table> + </div> + </div> + + {{template "javascript"}} + </body> +{{end}} \ No newline at end of file diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..51627b0 --- /dev/null +++ b/web/index.html @@ -0,0 +1,41 @@ +<!doctype html> +<html lang="en"> +<head> + <!-- Required meta tags --> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> + + <!-- Bootstrap CSS --> + <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> + + <title>Hello, world!</title> + + <style> + .nav { + margin: 10px; + } + </style> +</head> +<body> + <nav> + <div class="nav nav-tabs" id="nav-tab" role="tablist"> + <a class="nav-item nav-link active" id="nav-overview-tab" data-toggle="tab" href="#nav-overview" role="tab" aria-controls="nav-overview" aria-selected="true">Overview</a> + <a class="nav-item nav-link" id="nav-new-tree-tab" data-toggle="tab" href="#nav-new-tree" role="tab" aria-controls="nav-new-tree" aria-selected="false">New Tree</a> + <a class="nav-item nav-link" id="nav-add-stars-tab" data-toggle="tab" href="#nav-add-stars" role="tab" aria-controls="nav-add-stars" aria-selected="false">Add Stars</a> + <a class="nav-item nav-link" id="nav-draw-tree-tab" data-toggle="tab" href="#nav-draw-tree" role="tab" aria-controls="nav-contact" aria-selected="false">Draw Tree</a> + </div> + </nav> + <div class="tab-content" id="nav-tabContent"> + <div class="tab-pane fade show active" id="nav-overview" role="tabpanel" aria-labelledby="nav-overview-tab">This is the main overview page!</div> + <div class="tab-pane fade" id="nav-new-tree" role="tabpanel" aria-labelledby="nav-new-tree-tab">Create a new tree!</div> + <div class="tab-pane fade" id="nav-add-stars" role="tabpanel" aria-labelledby="nav-add-stars-tab">Add some stars!</div> + <div class="tab-pane fade" id="nav-draw-tree" role="tabpanel" aria-labelledby="nav-draw-tree-tab">Draw one of the galaxies!</div> + </div> + + <!-- Optional JavaScript --> + <!-- jQuery first, then Popper.js, then Bootstrap JS --> + <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> + <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> + <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> +</body> +</html> \ No newline at end of file |