add http demo

This commit is contained in:
Liang Ding 2014-12-25 23:59:32 +08:00
parent b19ab097e1
commit ea84e1e0a7
6 changed files with 131 additions and 7 deletions

View File

@ -316,7 +316,7 @@ func getOnlineUsers() []*conf.User {
// addUser add a user with the specified username, password and email. // addUser add a user with the specified username, password and email.
// //
// 1. create the user's workspace // 1. create the user's workspace
// 2. generate 'Hello, 世界' demo code in the workspace // 2. generate 'Hello, 世界' demo code in the workspace (a console version and a http version)
// 3. update the user customized configurations, such as style.css // 3. update the user customized configurations, such as style.css
// 4. serve files of the user's workspace via HTTP // 4. serve files of the user's workspace via HTTP
func addUser(username, password, email string) string { func addUser(username, password, email string) string {
@ -356,8 +356,15 @@ func addUser(username, password, email string) string {
return userCreated return userCreated
} }
// helloWorld generates the 'Hello, 世界' source code in workspace/src/hello/main.go. // helloWorld generates the 'Hello, 世界' source code.
// 1. src/hello/main.go
// 2. src/web/main.go
func helloWorld(workspace string) { func helloWorld(workspace string) {
consoleHello(workspace)
webHello(workspace)
}
func consoleHello(workspace string) {
dir := workspace + conf.PathSeparator + "src" + conf.PathSeparator + "hello" dir := workspace + conf.PathSeparator + "src" + conf.PathSeparator + "hello"
if err := os.MkdirAll(dir, 0755); nil != err { if err := os.MkdirAll(dir, 0755); nil != err {
logger.Error(err) logger.Error(err)
@ -369,7 +376,7 @@ func helloWorld(workspace string) {
if nil != err { if nil != err {
logger.Error(err) logger.Error(err)
os.Exit(-1) return
} }
fout.WriteString(`package main fout.WriteString(`package main
@ -383,3 +390,56 @@ func main() {
fout.Close() fout.Close()
} }
func webHello(workspace string) {
dir := workspace + conf.PathSeparator + "src" + conf.PathSeparator + "web"
if err := os.MkdirAll(dir, 0755); nil != err {
logger.Error(err)
return
}
fout, err := os.Create(dir + conf.PathSeparator + "main.go")
if nil != err {
logger.Error(err)
return
}
code := `package main
import (
"fmt"
"math/rand"
"net/http"
"strconv"
"time"
)
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, 世界"))
})
port := getPort()
// you may need to change the address
fmt.Println("Open http://wide.b3log.org:" + port + " in your browser to see the result")
if err := http.ListenAndServe(":"+port, nil); nil != err {
fmt.Println(err)
}
}
func getPort() string {
rand.Seed(time.Now().UnixNano())
return strconv.Itoa(7000 + rand.Intn(8000-7000))
}
`
fout.WriteString(code)
fout.Close()
}

View File

@ -74,7 +74,14 @@ var bottomGroup = {
}, },
fillOutput: function (data) { fillOutput: function (data) {
var $output = $('.bottom-window-group .output'); var $output = $('.bottom-window-group .output');
$output.find("div").html(data.replace(/\n/g, '<br/>'));
data = data.replace(/\n/g, '<br/>');
if (-1 !== data.indexOf("<br/>")) {
data = Autolinker.link(data);
}
$output.find("div").html(data);
$output.parent().scrollTop($output[0].scrollHeight); $output.parent().scrollTop($output[0].scrollHeight);
} }
}; };

10
static/js/lib/Autolinker.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -14,7 +14,10 @@
package util package util
import "math/rand" import (
"math/rand"
"time"
)
type myrand struct{} type myrand struct{}
@ -24,8 +27,11 @@ var Rand = myrand{}
// String returns a random string ['a', 'z'] in the specified length // String returns a random string ['a', 'z'] in the specified length
func (*myrand) String(length int) string { func (*myrand) String(length int) string {
bytes := make([]byte, length) bytes := make([]byte, length)
for i := 0; i < length; i++ { for i := 0; i < length; i++ {
bytes[i] = byte(Rand.Int('a', 'z')) bytes[i] = byte(Rand.Int('a', 'z'))
time.Sleep(100 * time.Nanosecond)
} }
return string(bytes) return string(bytes)
@ -33,5 +39,9 @@ func (*myrand) String(length int) string {
// Int returns a random integer in range [min, max]. // Int returns a random integer in range [min, max].
func (*myrand) Int(min int, max int) int { func (*myrand) Int(min int, max int) int {
rand.Seed(time.Now().UnixNano())
time.Sleep(100 * time.Nanosecond)
return min + rand.Intn(max-min) return min + rand.Intn(max-min)
} }

35
util/rand_test.go Normal file
View File

@ -0,0 +1,35 @@
// Copyright (c) 2014, B3log
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package util
import "testing"
func TestString(t *testing.T) {
r1 := Rand.String(16)
r2 := Rand.String(16)
if r1 == r2 {
t.Fail()
}
}
func TestInt(t *testing.T) {
r1 := Rand.Int(0, 65535)
r2 := Rand.Int(0, 65535)
if r1 == r2 {
t.Fail()
}
}

View File

@ -605,7 +605,9 @@
</script> </script>
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/jquery-2.1.1.min.js"></script> <script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/jquery-2.1.1.min.js"></script>
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/reconnecting-websocket.js"></script> <script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/reconnecting-websocket.js"></script>
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/ztree/jquery.ztree.all-3.5.min.js"></script> <script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/ztree/jquery.ztree.all-3.5.min.js"></script>
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/Autolinker.min.js"></script>
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/codemirror.js"></script> <script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/codemirror.js"></script>
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/lint/lint.js"></script> <script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/lint/lint.js"></script>