This commit is contained in:
parent
003354ffe4
commit
5989d0fb7b
53
conf/wide.go
53
conf/wide.go
|
@ -57,13 +57,8 @@ func main() {
|
|||
|
||||
// Configuration.
|
||||
type conf struct {
|
||||
IP string // server ip, ${ip}
|
||||
Port string // server port
|
||||
Context string // server context
|
||||
Server string // server host and port ({IP}:{Port})
|
||||
StaticServer string // static resources server scheme, host and port (http://{IP}:{Port})
|
||||
Server string // server
|
||||
LogLevel string // logging level: trace/debug/info/warn/error
|
||||
Channel string // channel (ws://{IP}:{Port})
|
||||
HTTPSessionMaxAge int // HTTP session max age (in seciond)
|
||||
StaticResourceVersion string // version of static resources
|
||||
MaxProcs int // Go max procs
|
||||
|
@ -93,8 +88,8 @@ var Docker bool
|
|||
const DockerImageGo = "golang"
|
||||
|
||||
// Load loads the Wide configurations from wide.json and users' configurations from users/{userId}.json.
|
||||
func Load(confPath, confUsers, confIP, confPort, confServer, confLogLevel, confStaticServer, confContext, confChannel, confPlayground string, confUsersWorkspaces string) {
|
||||
initWide(confPath, confUsers, confIP, confPort, confServer, confLogLevel, confStaticServer, confContext, confChannel, confPlayground, confUsersWorkspaces)
|
||||
func Load(confPath, confUsers, confServer, confLogLevel, confPlayground string, confUsersWorkspaces string) {
|
||||
initWide(confPath, confUsers, confServer, confLogLevel, confPlayground, confUsersWorkspaces)
|
||||
initUsers()
|
||||
|
||||
cmd := exec.Command("docker", "version")
|
||||
|
@ -168,7 +163,7 @@ func initUsers() {
|
|||
initCustomizedConfs()
|
||||
}
|
||||
|
||||
func initWide(confPath, confUsers, confIP, confPort, confServer, confLogLevel, confStaticServer, confContext, confChannel, confPlayground string, confUsersWorkspaces string) {
|
||||
func initWide(confPath, confUsers, confServer, confLogLevel, confPlayground string, confUsersWorkspaces string) {
|
||||
bytes, err := ioutil.ReadFile(confPath)
|
||||
if nil != err {
|
||||
logger.Error(err)
|
||||
|
@ -236,54 +231,14 @@ func initWide(confPath, confUsers, confIP, confPort, confServer, confLogLevel, c
|
|||
}
|
||||
}
|
||||
|
||||
// IP
|
||||
if "" != confIP {
|
||||
Wide.IP = confIP
|
||||
} else {
|
||||
ip, err := util.Net.LocalIP()
|
||||
if nil != err {
|
||||
logger.Error(err)
|
||||
|
||||
os.Exit(-1)
|
||||
}
|
||||
|
||||
logger.Debugf("${ip} [%s]", ip)
|
||||
Wide.IP = strings.Replace(Wide.IP, "${ip}", ip, 1)
|
||||
}
|
||||
|
||||
if "" != confPort {
|
||||
Wide.Port = confPort
|
||||
}
|
||||
|
||||
// Server
|
||||
Wide.Server = strings.Replace(Wide.Server, "{IP}", Wide.IP, 1)
|
||||
Wide.Server = strings.Replace(Wide.Server, "{Port}", Wide.Port, 1)
|
||||
if "" != confServer {
|
||||
Wide.Server = confServer
|
||||
}
|
||||
|
||||
// Static Server
|
||||
Wide.StaticServer = strings.Replace(Wide.StaticServer, "{IP}", Wide.IP, 1)
|
||||
Wide.StaticServer = strings.Replace(Wide.StaticServer, "{Port}", Wide.Port, 1)
|
||||
if "" != confStaticServer {
|
||||
Wide.StaticServer = confStaticServer
|
||||
}
|
||||
|
||||
// Context
|
||||
if "" != confContext {
|
||||
Wide.Context = confContext
|
||||
}
|
||||
|
||||
time := strconv.FormatInt(time.Now().UnixNano(), 10)
|
||||
logger.Debugf("${time} [%s]", time)
|
||||
Wide.StaticResourceVersion = strings.Replace(Wide.StaticResourceVersion, "${time}", time, 1)
|
||||
|
||||
// Channel
|
||||
Wide.Channel = strings.Replace(Wide.Channel, "{IP}", Wide.IP, 1)
|
||||
Wide.Channel = strings.Replace(Wide.Channel, "{Port}", Wide.Port, 1)
|
||||
if "" != confChannel {
|
||||
Wide.Channel = confChannel
|
||||
}
|
||||
}
|
||||
|
||||
// FixedTimeCheckEnv checks Wide runtime enviorment periodically (7 minutes).
|
||||
|
|
|
@ -1,11 +1,6 @@
|
|||
{
|
||||
"IP": "${ip}",
|
||||
"Port": "7070",
|
||||
"Context": "",
|
||||
"Server": "{IP}:{Port}",
|
||||
"StaticServer": "",
|
||||
"Server": "http://127.0.0.1:7070",
|
||||
"LogLevel": "debug",
|
||||
"Channel": "ws://{IP}:{Port}",
|
||||
"HTTPSessionMaxAge": 86400,
|
||||
"StaticResourceVersion": "${time}",
|
||||
"MaxProcs": 4,
|
||||
|
|
|
@ -41,7 +41,7 @@ var logger = log.NewLogger(os.Stdout)
|
|||
// WSHandler handles request of creating editor channel.
|
||||
// XXX: NOT used at present
|
||||
func WSHandler(w http.ResponseWriter, r *http.Request) {
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
@ -111,7 +111,7 @@ func AutocompleteHandler(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
session, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
session, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if session.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
@ -182,7 +182,7 @@ func GetExprInfoHandler(w http.ResponseWriter, r *http.Request) {
|
|||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
session, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
session, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
uid := session.Values["uid"].(string)
|
||||
|
||||
var args map[string]interface{}
|
||||
|
@ -253,7 +253,7 @@ func FindDeclarationHandler(w http.ResponseWriter, r *http.Request) {
|
|||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
session, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
session, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if session.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
@ -341,7 +341,7 @@ func FindUsagesHandler(w http.ResponseWriter, r *http.Request) {
|
|||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
session, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
session, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if session.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ func GoFmtHandler(w http.ResponseWriter, r *http.Request) {
|
|||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
session, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
session, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if session.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
|
|
@ -74,7 +74,7 @@ func initAPINode() {
|
|||
// The Go API source code package also as a child node,
|
||||
// so that users can easily view the Go API source code in file tree.
|
||||
func GetFilesHandler(w http.ResponseWriter, r *http.Request) {
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
@ -123,7 +123,7 @@ func GetFilesHandler(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
// RefreshDirectoryHandler handles request of refresh a directory of file tree.
|
||||
func RefreshDirectoryHandler(w http.ResponseWriter, r *http.Request) {
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
@ -156,7 +156,7 @@ func RefreshDirectoryHandler(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
// GetFileHandler handles request of opening file by editor.
|
||||
func GetFileHandler(w http.ResponseWriter, r *http.Request) {
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
@ -232,7 +232,7 @@ func GetFileHandler(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
// SaveFileHandler handles request of saving file.
|
||||
func SaveFileHandler(w http.ResponseWriter, r *http.Request) {
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
@ -288,7 +288,7 @@ func SaveFileHandler(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
// NewFileHandler handles request of creating file or directory.
|
||||
func NewFileHandler(w http.ResponseWriter, r *http.Request) {
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
@ -340,7 +340,7 @@ func NewFileHandler(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
// RemoveFileHandler handles request of removing file or directory.
|
||||
func RemoveFileHandler(w http.ResponseWriter, r *http.Request) {
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
@ -386,7 +386,7 @@ func RemoveFileHandler(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
// RenameFileHandler handles request of renaming file or directory.
|
||||
func RenameFileHandler(w http.ResponseWriter, r *http.Request) {
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
@ -451,7 +451,7 @@ func (f foundPaths) Less(i, j int) bool { return f[i].score > f[j].score }
|
|||
|
||||
// FindHandler handles request of find files under the specified directory with the specified filename pattern.
|
||||
func FindHandler(w http.ResponseWriter, r *http.Request) {
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
@ -505,7 +505,7 @@ func FindHandler(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
// SearchTextHandler handles request of searching files under the specified directory with the specified keyword.
|
||||
func SearchTextHandler(w http.ResponseWriter, r *http.Request) {
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
|
150
main.go
150
main.go
|
@ -49,13 +49,8 @@ var logger *log.Logger
|
|||
func init() {
|
||||
confPath := flag.String("conf", "conf/wide.json", "path of wide.json")
|
||||
confUsers := flag.String("users", "conf/users", "path of users")
|
||||
confIP := flag.String("ip", "", "this will overwrite Wide.IP if specified")
|
||||
confPort := flag.String("port", "", "this will overwrite Wide.Port if specified")
|
||||
confServer := flag.String("server", "", "this will overwrite Wide.Server if specified")
|
||||
confLogLevel := flag.String("log_level", "", "this will overwrite Wide.LogLevel if specified")
|
||||
confStaticServer := flag.String("static_server", "", "this will overwrite Wide.StaticServer if specified")
|
||||
confContext := flag.String("context", "", "this will overwrite Wide.Context if specified")
|
||||
confChannel := flag.String("channel", "", "this will overwrite Wide.Channel if specified")
|
||||
confStat := flag.Bool("stat", false, "whether report statistics periodically")
|
||||
confPlayground := flag.String("playground", "", "this will overwrite Wide.Playground if specified")
|
||||
confUsersWorkspaces := flag.String("users_workspaces", "", "this will overwrite Wide.UsersWorkspaces if specified")
|
||||
|
@ -74,7 +69,7 @@ func init() {
|
|||
|
||||
i18n.Load()
|
||||
event.Load()
|
||||
conf.Load(*confPath, *confUsers, *confIP, *confPort, *confServer, *confLogLevel, *confStaticServer, *confContext, *confChannel, *confPlayground, *confUsersWorkspaces)
|
||||
conf.Load(*confPath, *confUsers, *confServer, *confLogLevel, *confPlayground, *confUsersWorkspaces)
|
||||
|
||||
conf.FixedTimeCheckEnv()
|
||||
session.FixedTimeSave()
|
||||
|
@ -95,86 +90,91 @@ func main() {
|
|||
handleSignal()
|
||||
|
||||
// IDE
|
||||
http.HandleFunc(conf.Wide.Context+"/", handlerGzWrapper(indexHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/start", handlerWrapper(startHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/about", handlerWrapper(aboutHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/keyboard_shortcuts", handlerWrapper(keyboardShortcutsHandler))
|
||||
http.HandleFunc("/", handlerGzWrapper(indexHandler))
|
||||
http.HandleFunc("/start", handlerWrapper(startHandler))
|
||||
http.HandleFunc("/about", handlerWrapper(aboutHandler))
|
||||
http.HandleFunc("/keyboard_shortcuts", handlerWrapper(keyboardShortcutsHandler))
|
||||
|
||||
// static resources
|
||||
http.Handle(conf.Wide.Context+"/static/", http.StripPrefix(conf.Wide.Context+"/static/", http.FileServer(http.Dir("static"))))
|
||||
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
|
||||
serveSingle("/favicon.ico", "./static/favicon.ico")
|
||||
|
||||
// oauth
|
||||
http.HandleFunc("/oauth/github", session.RedirectGitHubHandler)
|
||||
http.HandleFunc("/oauth/github/callback", session.GithubCallbackHandler)
|
||||
|
||||
// workspaces
|
||||
for _, user := range conf.Users {
|
||||
http.Handle(conf.Wide.Context+"/workspace/"+user.Name+"/",
|
||||
http.StripPrefix(conf.Wide.Context+"/workspace/"+user.Name+"/", http.FileServer(http.Dir(user.WorkspacePath()))))
|
||||
http.Handle("/workspace/"+user.Name+"/",
|
||||
http.StripPrefix("/workspace/"+user.Name+"/", http.FileServer(http.Dir(user.WorkspacePath()))))
|
||||
}
|
||||
|
||||
// session
|
||||
http.HandleFunc(conf.Wide.Context+"/session/ws", handlerWrapper(session.WSHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/session/save", handlerWrapper(session.SaveContentHandler))
|
||||
http.HandleFunc("/session/ws", handlerWrapper(session.WSHandler))
|
||||
http.HandleFunc("/session/save", handlerWrapper(session.SaveContentHandler))
|
||||
|
||||
// run
|
||||
http.HandleFunc(conf.Wide.Context+"/build", handlerWrapper(output.BuildHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/run", handlerWrapper(output.RunHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/stop", handlerWrapper(output.StopHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/go/test", handlerWrapper(output.GoTestHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/go/vet", handlerWrapper(output.GoVetHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/go/get", handlerWrapper(output.GoGetHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/go/install", handlerWrapper(output.GoInstallHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/output/ws", handlerWrapper(output.WSHandler))
|
||||
http.HandleFunc("/build", handlerWrapper(output.BuildHandler))
|
||||
http.HandleFunc("/run", handlerWrapper(output.RunHandler))
|
||||
http.HandleFunc("/stop", handlerWrapper(output.StopHandler))
|
||||
http.HandleFunc("/go/test", handlerWrapper(output.GoTestHandler))
|
||||
http.HandleFunc("/go/vet", handlerWrapper(output.GoVetHandler))
|
||||
http.HandleFunc("/go/get", handlerWrapper(output.GoGetHandler))
|
||||
http.HandleFunc("/go/install", handlerWrapper(output.GoInstallHandler))
|
||||
http.HandleFunc("/output/ws", handlerWrapper(output.WSHandler))
|
||||
|
||||
// cross-compilation
|
||||
http.HandleFunc(conf.Wide.Context+"/cross", handlerWrapper(output.CrossCompilationHandler))
|
||||
http.HandleFunc("/cross", handlerWrapper(output.CrossCompilationHandler))
|
||||
|
||||
// file tree
|
||||
http.HandleFunc(conf.Wide.Context+"/files", handlerWrapper(file.GetFilesHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/file/refresh", handlerWrapper(file.RefreshDirectoryHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/file", handlerWrapper(file.GetFileHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/file/save", handlerWrapper(file.SaveFileHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/file/new", handlerWrapper(file.NewFileHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/file/remove", handlerWrapper(file.RemoveFileHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/file/rename", handlerWrapper(file.RenameFileHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/file/search/text", handlerWrapper(file.SearchTextHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/file/find/name", handlerWrapper(file.FindHandler))
|
||||
http.HandleFunc("/files", handlerWrapper(file.GetFilesHandler))
|
||||
http.HandleFunc("/file/refresh", handlerWrapper(file.RefreshDirectoryHandler))
|
||||
http.HandleFunc("/file", handlerWrapper(file.GetFileHandler))
|
||||
http.HandleFunc("/file/save", handlerWrapper(file.SaveFileHandler))
|
||||
http.HandleFunc("/file/new", handlerWrapper(file.NewFileHandler))
|
||||
http.HandleFunc("/file/remove", handlerWrapper(file.RemoveFileHandler))
|
||||
http.HandleFunc("/file/rename", handlerWrapper(file.RenameFileHandler))
|
||||
http.HandleFunc("/file/search/text", handlerWrapper(file.SearchTextHandler))
|
||||
http.HandleFunc("/file/find/name", handlerWrapper(file.FindHandler))
|
||||
|
||||
// outline
|
||||
http.HandleFunc(conf.Wide.Context+"/outline", handlerWrapper(file.GetOutlineHandler))
|
||||
http.HandleFunc("/outline", handlerWrapper(file.GetOutlineHandler))
|
||||
|
||||
// file export/import
|
||||
http.HandleFunc(conf.Wide.Context+"/file/zip/new", handlerWrapper(file.CreateZipHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/file/zip", handlerWrapper(file.GetZipHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/file/decompress", handlerWrapper(file.DecompressHandler))
|
||||
http.HandleFunc("/file/zip/new", handlerWrapper(file.CreateZipHandler))
|
||||
http.HandleFunc("/file/zip", handlerWrapper(file.GetZipHandler))
|
||||
http.HandleFunc("/file/decompress", handlerWrapper(file.DecompressHandler))
|
||||
|
||||
// editor
|
||||
http.HandleFunc(conf.Wide.Context+"/editor/ws", handlerWrapper(editor.WSHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/go/fmt", handlerWrapper(editor.GoFmtHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/autocomplete", handlerWrapper(editor.AutocompleteHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/exprinfo", handlerWrapper(editor.GetExprInfoHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/find/decl", handlerWrapper(editor.FindDeclarationHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/find/usages", handlerWrapper(editor.FindUsagesHandler))
|
||||
http.HandleFunc("/editor/ws", handlerWrapper(editor.WSHandler))
|
||||
http.HandleFunc("/go/fmt", handlerWrapper(editor.GoFmtHandler))
|
||||
http.HandleFunc("/autocomplete", handlerWrapper(editor.AutocompleteHandler))
|
||||
http.HandleFunc("/exprinfo", handlerWrapper(editor.GetExprInfoHandler))
|
||||
http.HandleFunc("/find/decl", handlerWrapper(editor.FindDeclarationHandler))
|
||||
http.HandleFunc("/find/usages", handlerWrapper(editor.FindUsagesHandler))
|
||||
|
||||
// notification
|
||||
http.HandleFunc(conf.Wide.Context+"/notification/ws", handlerWrapper(notification.WSHandler))
|
||||
http.HandleFunc("/notification/ws", handlerWrapper(notification.WSHandler))
|
||||
|
||||
// user
|
||||
http.HandleFunc(conf.Wide.Context+"/logout", handlerWrapper(session.LogoutHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/preference", handlerWrapper(session.PreferenceHandler))
|
||||
http.HandleFunc("/logout", handlerWrapper(session.LogoutHandler))
|
||||
http.HandleFunc("/preference", handlerWrapper(session.PreferenceHandler))
|
||||
|
||||
// playground
|
||||
http.HandleFunc(conf.Wide.Context+"/playground", handlerWrapper(playground.IndexHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/playground/", handlerWrapper(playground.IndexHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/playground/ws", handlerWrapper(playground.WSHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/playground/save", handlerWrapper(playground.SaveHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/playground/short-url", handlerWrapper(playground.ShortURLHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/playground/build", handlerWrapper(playground.BuildHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/playground/run", handlerWrapper(playground.RunHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/playground/stop", handlerWrapper(playground.StopHandler))
|
||||
http.HandleFunc(conf.Wide.Context+"/playground/autocomplete", handlerWrapper(playground.AutocompleteHandler))
|
||||
http.HandleFunc("/playground", handlerWrapper(playground.IndexHandler))
|
||||
http.HandleFunc("/playground/", handlerWrapper(playground.IndexHandler))
|
||||
http.HandleFunc("/playground/ws", handlerWrapper(playground.WSHandler))
|
||||
http.HandleFunc("/playground/save", handlerWrapper(playground.SaveHandler))
|
||||
http.HandleFunc("/playground/short-url", handlerWrapper(playground.ShortURLHandler))
|
||||
http.HandleFunc("/playground/build", handlerWrapper(playground.BuildHandler))
|
||||
http.HandleFunc("/playground/run", handlerWrapper(playground.RunHandler))
|
||||
http.HandleFunc("/playground/stop", handlerWrapper(playground.StopHandler))
|
||||
http.HandleFunc("/playground/autocomplete", handlerWrapper(playground.AutocompleteHandler))
|
||||
|
||||
logger.Infof("Wide is running [%s]", conf.Wide.Server+conf.Wide.Context)
|
||||
logger.Infof("Wide is running [%s]", conf.Wide.Server)
|
||||
|
||||
err := http.ListenAndServe(conf.Wide.Server, nil)
|
||||
listen := conf.Wide.Server[strings.Index(conf.Wide.Server, "://")+3:]
|
||||
err := http.ListenAndServe(listen, nil)
|
||||
if err != nil {
|
||||
logger.Error(err)
|
||||
}
|
||||
|
@ -182,37 +182,34 @@ func main() {
|
|||
|
||||
// indexHandler handles request of Wide index.
|
||||
func indexHandler(w http.ResponseWriter, r *http.Request) {
|
||||
if conf.Wide.Context+"/" != r.RequestURI {
|
||||
http.Redirect(w, r, conf.Wide.Context+"/", http.StatusFound)
|
||||
if "/" != r.RequestURI {
|
||||
http.Redirect(w, r, "/", http.StatusFound)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Redirect(w, r, conf.Wide.Context+"/login", http.StatusFound)
|
||||
http.Redirect(w, r, "/start", http.StatusFound)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
uid := httpSession.Values["uid"].(string)
|
||||
if "playground" == uid { // reserved user for Playground
|
||||
http.Redirect(w, r, conf.Wide.Context+"/login", http.StatusFound)
|
||||
http.Redirect(w, r, "/start", http.StatusFound)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
httpSession.Options.MaxAge = conf.Wide.HTTPSessionMaxAge
|
||||
if "" != conf.Wide.Context {
|
||||
httpSession.Options.Path = conf.Wide.Context
|
||||
}
|
||||
httpSession.Save(r, w)
|
||||
|
||||
user := conf.GetUser(uid)
|
||||
if nil == user {
|
||||
logger.Warnf("Not found user [%s]", uid)
|
||||
|
||||
http.Redirect(w, r, conf.Wide.Context+"/login", http.StatusFound)
|
||||
http.Redirect(w, r, "/start", http.StatusFound)
|
||||
|
||||
return
|
||||
}
|
||||
|
@ -264,17 +261,14 @@ func serveSingle(pattern string, filename string) {
|
|||
|
||||
// startHandler handles request of start page.
|
||||
func startHandler(w http.ResponseWriter, r *http.Request) {
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Redirect(w, r, conf.Wide.Context+"/login", http.StatusFound)
|
||||
http.Redirect(w, r, "/login", http.StatusFound)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
httpSession.Options.MaxAge = conf.Wide.HTTPSessionMaxAge
|
||||
if "" != conf.Wide.Context {
|
||||
httpSession.Options.Path = conf.Wide.Context
|
||||
}
|
||||
httpSession.Save(r, w)
|
||||
|
||||
uid := httpSession.Values["uid"].(string)
|
||||
|
@ -304,17 +298,14 @@ func startHandler(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
// keyboardShortcutsHandler handles request of keyboard shortcuts page.
|
||||
func keyboardShortcutsHandler(w http.ResponseWriter, r *http.Request) {
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Redirect(w, r, conf.Wide.Context+"/login", http.StatusFound)
|
||||
http.Redirect(w, r, "/start", http.StatusFound)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
httpSession.Options.MaxAge = conf.Wide.HTTPSessionMaxAge
|
||||
if "" != conf.Wide.Context {
|
||||
httpSession.Options.Path = conf.Wide.Context
|
||||
}
|
||||
httpSession.Save(r, w)
|
||||
|
||||
uid := httpSession.Values["uid"].(string)
|
||||
|
@ -336,17 +327,14 @@ func keyboardShortcutsHandler(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
// aboutHandle handles request of about page.
|
||||
func aboutHandler(w http.ResponseWriter, r *http.Request) {
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Redirect(w, r, conf.Wide.Context+"/login", http.StatusFound)
|
||||
http.Redirect(w, r, "/login", http.StatusFound)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
httpSession.Options.MaxAge = conf.Wide.HTTPSessionMaxAge
|
||||
if "" != conf.Wide.Context {
|
||||
httpSession.Options.Path = conf.Wide.Context
|
||||
}
|
||||
httpSession.Save(r, w)
|
||||
|
||||
uid := httpSession.Values["uid"].(string)
|
||||
|
|
|
@ -62,7 +62,7 @@ func event2Notification(e *event.Event) {
|
|||
return
|
||||
}
|
||||
|
||||
httpSession, _ := session.HTTPSession.Get(wsChannel.Request, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(wsChannel.Request, session.CookieName)
|
||||
uid := httpSession.Values["uid"].(string)
|
||||
locale := conf.GetUser(uid).Locale
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ func BuildHandler(w http.ResponseWriter, r *http.Request) {
|
|||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ func CrossCompilationHandler(w http.ResponseWriter, r *http.Request) {
|
|||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ func GoGetHandler(w http.ResponseWriter, r *http.Request) {
|
|||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ func GoInstallHandler(w http.ResponseWriter, r *http.Request) {
|
|||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ func GoTestHandler(w http.ResponseWriter, r *http.Request) {
|
|||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ func GoVetHandler(w http.ResponseWriter, r *http.Request) {
|
|||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
|
|
@ -37,7 +37,7 @@ func AutocompleteHandler(w http.ResponseWriter, r *http.Request) {
|
|||
return
|
||||
}
|
||||
|
||||
session, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
session, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if session.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
|
|
@ -32,7 +32,7 @@ func BuildHandler(w http.ResponseWriter, r *http.Request) {
|
|||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ func SaveHandler(w http.ResponseWriter, r *http.Request) {
|
|||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
session, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
session, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if session.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
@ -101,7 +101,7 @@ func ShortURLHandler(w http.ResponseWriter, r *http.Request) {
|
|||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
session, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
session, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if session.IsNew {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
|
||||
|
|
|
@ -40,16 +40,13 @@ var logger = log.NewLogger(os.Stdout)
|
|||
// IndexHandler handles request of Playground index.
|
||||
func IndexHandler(w http.ResponseWriter, r *http.Request) {
|
||||
// create a HTTP session
|
||||
httpSession, _ := session.HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := session.HTTPSession.Get(r, session.CookieName)
|
||||
if httpSession.IsNew {
|
||||
httpSession.Values["id"] = strconv.Itoa(rand.Int())
|
||||
httpSession.Values["uid"] = "playground"
|
||||
}
|
||||
|
||||
httpSession.Options.MaxAge = conf.Wide.HTTPSessionMaxAge
|
||||
if "" != conf.Wide.Context {
|
||||
httpSession.Options.Path = conf.Wide.Context
|
||||
}
|
||||
httpSession.Save(r, w)
|
||||
|
||||
uid := httpSession.Values["uid"].(string)
|
||||
|
|
|
@ -16,13 +16,15 @@ package session
|
|||
|
||||
import (
|
||||
"crypto/tls"
|
||||
"github.com/b3log/wide/conf"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"github.com/b3log/wide/conf"
|
||||
"github.com/b3log/wide/util"
|
||||
"github.com/parnurzeal/gorequest"
|
||||
)
|
||||
|
@ -58,6 +60,7 @@ func RedirectGitHubHandler(w http.ResponseWriter, r *http.Request) {
|
|||
if strings.HasSuffix(referer, "/") {
|
||||
referer = referer[:len(referer)-1]
|
||||
}
|
||||
referer += "__1"
|
||||
state := util.Rand.String(16) + referer
|
||||
states[state] = state
|
||||
path := loginAuthURL + "?client_id=" + clientId + "&state=" + state + "&scope=public_repo,read:user,user:follow"
|
||||
|
@ -93,7 +96,7 @@ func GithubCallbackHandler(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
githubId := githubUser["userId"].(string)
|
||||
userName := githubUser["userName"].(string)
|
||||
avatar := githubUser["userAvatar"].(string)
|
||||
avatar := githubUser["userAvatarURL"].(string)
|
||||
|
||||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
@ -110,14 +113,10 @@ func GithubCallbackHandler(w http.ResponseWriter, r *http.Request) {
|
|||
}
|
||||
|
||||
// create a HTTP session
|
||||
httpSession, _ := HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := HTTPSession.Get(r, CookieName)
|
||||
httpSession.Values["uid"] = githubId
|
||||
|
||||
httpSession.Values["id"] = strconv.Itoa(rand.Int())
|
||||
httpSession.Options.MaxAge = conf.Wide.HTTPSessionMaxAge
|
||||
if "" != conf.Wide.Context {
|
||||
httpSession.Options.Path = conf.Wide.Context
|
||||
}
|
||||
httpSession.Save(r, w)
|
||||
|
||||
logger.Debugf("Created a HTTP session [%s] for user [%s]", httpSession.Values["id"].(string), githubId)
|
||||
|
@ -141,3 +140,140 @@ func GitHubUserInfo(accessToken string) (ret map[string]interface{}) {
|
|||
|
||||
return result["data"].(map[string]interface{})
|
||||
}
|
||||
|
||||
// LogoutHandler handles request of user logout (exit).
|
||||
func LogoutHandler(w http.ResponseWriter, r *http.Request) {
|
||||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
httpSession, _ := HTTPSession.Get(r, CookieName)
|
||||
|
||||
httpSession.Options.MaxAge = -1
|
||||
httpSession.Save(r, w)
|
||||
}
|
||||
|
||||
// addUser add a user with the specified user id, username and avatar.
|
||||
//
|
||||
// 1. create the user's 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
|
||||
// 4. serve files of the user's workspace via HTTP
|
||||
//
|
||||
// Note: user [playground] is a reserved mock user
|
||||
func addUser(userId, userName, userAvatar string) string {
|
||||
if !conf.Wide.AllowRegister {
|
||||
return notAllowRegister
|
||||
}
|
||||
|
||||
if "playground" == userId {
|
||||
return userExists
|
||||
}
|
||||
|
||||
addUserMutex.Lock()
|
||||
defer addUserMutex.Unlock()
|
||||
|
||||
for _, user := range conf.Users {
|
||||
if strings.ToLower(user.Id) == strings.ToLower(userId) {
|
||||
return userExists
|
||||
}
|
||||
}
|
||||
|
||||
workspace := filepath.Join(conf.Wide.UsersWorkspaces, userId)
|
||||
newUser := conf.NewUser(userId, userName, userAvatar, workspace)
|
||||
conf.Users = append(conf.Users, newUser)
|
||||
if !newUser.Save() {
|
||||
return userCreateError
|
||||
}
|
||||
|
||||
conf.CreateWorkspaceDir(workspace)
|
||||
helloWorld(workspace)
|
||||
conf.UpdateCustomizedConf(userId)
|
||||
|
||||
http.Handle("/workspace/"+userId+"/",
|
||||
http.StripPrefix("/workspace/"+userId+"/", http.FileServer(http.Dir(newUser.WorkspacePath()))))
|
||||
|
||||
logger.Infof("Created a user [%s]", userId)
|
||||
|
||||
return userCreated
|
||||
}
|
||||
|
||||
// helloWorld generates the 'Hello, 世界' source code.
|
||||
// 1. src/hello/main.go
|
||||
// 2. src/web/main.go
|
||||
func helloWorld(workspace string) {
|
||||
consoleHello(workspace)
|
||||
webHello(workspace)
|
||||
}
|
||||
|
||||
func consoleHello(workspace string) {
|
||||
dir := workspace + conf.PathSeparator + "src" + conf.PathSeparator + "hello"
|
||||
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
|
||||
}
|
||||
|
||||
fout.WriteString(conf.HelloWorld)
|
||||
|
||||
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 https://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()
|
||||
}
|
||||
|
|
|
@ -47,6 +47,8 @@ import (
|
|||
const (
|
||||
sessionStateActive = iota
|
||||
sessionStateClosed // (not used so far)
|
||||
|
||||
CookieName = "wide-sess"
|
||||
)
|
||||
|
||||
// Logger.
|
||||
|
@ -220,7 +222,7 @@ func WSHandler(w http.ResponseWriter, r *http.Request) {
|
|||
|
||||
wSession := WideSessions.Get(sid)
|
||||
if nil == wSession {
|
||||
httpSession, _ := HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := HTTPSession.Get(r, CookieName)
|
||||
|
||||
if httpSession.IsNew {
|
||||
return
|
||||
|
|
145
session/users.go
145
session/users.go
|
@ -17,7 +17,6 @@ package session
|
|||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"strings"
|
||||
|
@ -44,18 +43,15 @@ var addUserMutex sync.Mutex
|
|||
|
||||
// PreferenceHandler handles request of preference page.
|
||||
func PreferenceHandler(w http.ResponseWriter, r *http.Request) {
|
||||
httpSession, _ := HTTPSession.Get(r, "wide-session")
|
||||
httpSession, _ := HTTPSession.Get(r, CookieName)
|
||||
|
||||
if httpSession.IsNew {
|
||||
http.Redirect(w, r, conf.Wide.Context+"/login", http.StatusFound)
|
||||
http.Redirect(w, r, "/start", http.StatusFound)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
httpSession.Options.MaxAge = conf.Wide.HTTPSessionMaxAge
|
||||
if "" != conf.Wide.Context {
|
||||
httpSession.Options.Path = conf.Wide.Context
|
||||
}
|
||||
httpSession.Save(r, w)
|
||||
|
||||
uid := httpSession.Values["uid"].(string)
|
||||
|
@ -154,17 +150,6 @@ func PreferenceHandler(w http.ResponseWriter, r *http.Request) {
|
|||
result.Succ = user.Save()
|
||||
}
|
||||
|
||||
// LogoutHandler handles request of user logout (exit).
|
||||
func LogoutHandler(w http.ResponseWriter, r *http.Request) {
|
||||
result := util.NewResult()
|
||||
defer util.RetResult(w, r, result)
|
||||
|
||||
httpSession, _ := HTTPSession.Get(r, "wide-session")
|
||||
|
||||
httpSession.Options.MaxAge = -1
|
||||
httpSession.Save(r, w)
|
||||
}
|
||||
|
||||
// FixedTimeSave saves online users' configurations periodically (1 minute).
|
||||
//
|
||||
// Main goal of this function is to save user session content, for restoring session content while user open Wide next time.
|
||||
|
@ -230,129 +215,3 @@ func getOnlineUsers() []*conf.User {
|
|||
|
||||
return ret
|
||||
}
|
||||
|
||||
// addUser add a user with the specified user id, username and avatar.
|
||||
//
|
||||
// 1. create the user's 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
|
||||
// 4. serve files of the user's workspace via HTTP
|
||||
//
|
||||
// Note: user [playground] is a reserved mock user
|
||||
func addUser(userId, userName, userAvatar string) string {
|
||||
if !conf.Wide.AllowRegister {
|
||||
return notAllowRegister
|
||||
}
|
||||
|
||||
if "playground" == userId {
|
||||
return userExists
|
||||
}
|
||||
|
||||
addUserMutex.Lock()
|
||||
defer addUserMutex.Unlock()
|
||||
|
||||
for _, user := range conf.Users {
|
||||
if strings.ToLower(user.Id) == strings.ToLower(userId) {
|
||||
return userExists
|
||||
}
|
||||
}
|
||||
|
||||
workspace := filepath.Join(conf.Wide.UsersWorkspaces, userId)
|
||||
newUser := conf.NewUser(userId, userName, userAvatar, workspace)
|
||||
conf.Users = append(conf.Users, newUser)
|
||||
if !newUser.Save() {
|
||||
return userCreateError
|
||||
}
|
||||
|
||||
conf.CreateWorkspaceDir(workspace)
|
||||
helloWorld(workspace)
|
||||
conf.UpdateCustomizedConf(userId)
|
||||
|
||||
http.Handle("/workspace/"+userId+"/",
|
||||
http.StripPrefix("/workspace/"+userId+"/", http.FileServer(http.Dir(newUser.WorkspacePath()))))
|
||||
|
||||
logger.Infof("Created a user [%s]", userId)
|
||||
|
||||
return userCreated
|
||||
}
|
||||
|
||||
// helloWorld generates the 'Hello, 世界' source code.
|
||||
// 1. src/hello/main.go
|
||||
// 2. src/web/main.go
|
||||
func helloWorld(workspace string) {
|
||||
consoleHello(workspace)
|
||||
webHello(workspace)
|
||||
}
|
||||
|
||||
func consoleHello(workspace string) {
|
||||
dir := workspace + conf.PathSeparator + "src" + conf.PathSeparator + "hello"
|
||||
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
|
||||
}
|
||||
|
||||
fout.WriteString(conf.HelloWorld)
|
||||
|
||||
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 https://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()
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<div class="item">
|
||||
<div class="fn-clear">
|
||||
<img class="logo" src="{{.conf.StaticServer}}/static/images/wide-logo.png" alt="wide logi"/>
|
||||
<img class="logo" src="{{.conf.Server}}/static/images/wide-logo.png" alt="wide logi"/>
|
||||
<div class="fn-left">
|
||||
<h2>Hello, 世界</h2>
|
||||
<h3>Coding with Go on the Wide way.</h3>
|
||||
|
|
166
views/index.html
166
views/index.html
|
@ -8,27 +8,27 @@
|
|||
<meta name="author" content="B3log">
|
||||
<meta property="og:description" content="A Web-based IDE for Teams using Golang, do your development anytime, anywhere."/>
|
||||
{{if eq $.conf.RuntimeMode "dev"}}
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/js/lib/jquery-layout/layout-default-latest.css">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/codemirror.css">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/hint/show-hint.css">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/lint/lint.css">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/foldgutter.css">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/dialog/dialog.css">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/js/lib/jquery-layout/layout-default-latest.css">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/codemirror.css">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/hint/show-hint.css">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/lint/lint.css">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/foldgutter.css">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/dialog/dialog.css">
|
||||
{{range $index, $theme := .editorThemes}}
|
||||
<link rel="stylesheet" href="{{$.conf.StaticServer}}/static/js/overwrite/codemirror/theme/{{$theme}}.css">{{end}}
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/dialog.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/base.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/wide.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/side.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/start.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/about.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{$.conf.Server}}/static/js/overwrite/codemirror/theme/{{$theme}}.css">{{end}}
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/dialog.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/base.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/wide.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/side.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/start.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/about.css?{{.conf.StaticResourceVersion}}">
|
||||
{{else}}
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/lib.min.css">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/wide.min.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/lib.min.css">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/wide.min.css?{{.conf.StaticResourceVersion}}">
|
||||
{{end}}
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/js/lib/ztree/zTreeStyle.min.css">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/user/{{.username}}/style.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/themes/{{.user.Theme}}.css?{{.conf.StaticResourceVersion}}" id="themesLink">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/js/lib/ztree/zTreeStyle.min.css">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/user/{{.uid}}/style.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/themes/{{.user.Theme}}.css?{{.conf.StaticResourceVersion}}" id="themesLink">
|
||||
|
||||
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
||||
</head>
|
||||
|
@ -347,7 +347,7 @@
|
|||
|
||||
<div class="fn-right">
|
||||
<img class="gravatar"
|
||||
onerror="this.src='{{.conf.StaticServer}}/static/images/user-thumbnail.png'"
|
||||
onerror="this.src='{{.conf.Server}}/static/images/user-thumbnail.png'"
|
||||
src="https://secure.gravatar.com/avatar/{{.user.Gravatar}}?s=17&d=https://hacpai.com/images/user-thumbnail.png"
|
||||
title="{{.user.Name}}"/>
|
||||
<span class="font-ico ico-share"></span>
|
||||
|
@ -560,7 +560,7 @@
|
|||
<script>
|
||||
var config = {
|
||||
"context": {{.conf.Context}},
|
||||
"staticServer": '{{.conf.StaticServer}}',
|
||||
"staticServer": '{{.conf.Server}}',
|
||||
"pathSeparator": '{{.pathSeparator}}',
|
||||
"label": {{.i18n}},
|
||||
"channel": {{.conf.Channel}},
|
||||
|
@ -581,71 +581,71 @@
|
|||
|
||||
</script>
|
||||
{{if eq $.conf.RuntimeMode "dev"}}
|
||||
<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-ui.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/jquery-layout/jquery.layout-latest.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/Autolinker.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/codemirror.min.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/json-lint.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/selection/active-line.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/overwrite/codemirror/addon/hint/show-hint.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/hint/anyword-hint.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/display/rulers.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/edit/closebrackets.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/edit/matchbrackets.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/edit/closetag.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/search/searchcursor.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/search/search.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/dialog/dialog.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/search/match-highlighter.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/foldcode.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/foldgutter.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/brace-fold.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/xml-fold.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/markdown-fold.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/comment-fold.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/mode/loadmode.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/comment/comment.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/meta.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/go/go.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/clike/clike.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/xml/xml.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/htmlmixed/htmlmixed.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/javascript/javascript.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/markdown/markdown.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/css/css.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/shell/shell.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/sql/sql.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/keymap/vim.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/lint/json-lint.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/lint/go-lint.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/emmet.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/js-beautify-1.5.4/beautify.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/js-beautify-1.5.4/beautify-html.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/js-beautify-1.5.4/beautify-css.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/jquery-file-upload-9.8.0/vendor/jquery.ui.widget.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/jquery-file-upload-9.8.0/jquery.iframe-transport.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/jquery-file-upload-9.8.0/jquery.fileupload.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/jquery-2.1.1.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/jquery-ui.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/jquery-layout/jquery.layout-latest.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/reconnecting-websocket.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/ztree/jquery.ztree.all-3.5.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/Autolinker.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/codemirror.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/lint/lint.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/lint/json-lint.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/selection/active-line.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/overwrite/codemirror/addon/hint/show-hint.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/hint/anyword-hint.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/display/rulers.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/edit/closebrackets.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/edit/matchbrackets.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/edit/closetag.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/search/searchcursor.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/search/search.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/dialog/dialog.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/search/match-highlighter.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/foldcode.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/foldgutter.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/brace-fold.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/xml-fold.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/markdown-fold.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/comment-fold.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/mode/loadmode.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/comment/comment.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/meta.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/go/go.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/clike/clike.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/xml/xml.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/htmlmixed/htmlmixed.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/javascript/javascript.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/markdown/markdown.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/css/css.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/shell/shell.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/sql/sql.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/keymap/vim.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/lint/json-lint.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/lint/go-lint.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/emmet.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/js-beautify-1.5.4/beautify.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/js-beautify-1.5.4/beautify-html.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/js-beautify-1.5.4/beautify-css.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/jquery-file-upload-9.8.0/vendor/jquery.ui.widget.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/jquery-file-upload-9.8.0/jquery.iframe-transport.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/jquery-file-upload-9.8.0/jquery.fileupload.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/tabs.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/dialog.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/editors.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/notification.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/tree.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/wide.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/session.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/menu.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/windows.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/hotkeys.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/bottomGroup.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/tabs.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/dialog.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/editors.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/notification.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/tree.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/wide.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/session.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/menu.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/windows.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/hotkeys.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/bottomGroup.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
{{else}}
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/wide.min.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/wide.min.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
{{end}}
|
||||
<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/zeroclipboard/ZeroClipboard.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/ztree/jquery.ztree.all-3.5.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/zeroclipboard/ZeroClipboard.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -8,20 +8,20 @@
|
|||
<meta name="description" content="A Web-based IDE for Teams using Golang, do your development anytime, anywhere."/>
|
||||
<meta name="author" content="B3log">
|
||||
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/codemirror.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/hint/show-hint.css">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/foldgutter.css">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/dialog/dialog.css">
|
||||
<link rel="stylesheet" href="{{$.conf.StaticServer}}/static/js/overwrite/codemirror/theme/wide.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/codemirror.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/hint/show-hint.css">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/foldgutter.css">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/dialog/dialog.css">
|
||||
<link rel="stylesheet" href="{{$.conf.Server}}/static/js/overwrite/codemirror/theme/wide.css?{{.conf.StaticResourceVersion}}">
|
||||
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/dialog.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/base.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/wide.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/about.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/themes/default.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/sign.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/side.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/playground.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/dialog.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/base.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/wide.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/about.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/themes/default.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/sign.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/side.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/playground.css?{{.conf.StaticResourceVersion}}">
|
||||
|
||||
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
||||
</head>
|
||||
|
@ -30,7 +30,7 @@
|
|||
<ul class="fn-left">
|
||||
<li>
|
||||
<a href="/" target="_blank">
|
||||
<img title="Wide, a Web-based IDE for Teams using Golang." src="{{.conf.StaticServer}}/static/images/wide-logo.png"
|
||||
<img title="Wide, a Web-based IDE for Teams using Golang." src="{{.conf.Server}}/static/images/wide-logo.png"
|
||||
class="logo"/></a>
|
||||
</li>
|
||||
<li>
|
||||
|
@ -84,7 +84,7 @@
|
|||
<script>
|
||||
var config = {
|
||||
"context": "{{.conf.Context}}",
|
||||
"staticServer": "{{.conf.StaticServer}}",
|
||||
"staticServer": "{{.conf.Server}}",
|
||||
"channel": "{{.conf.Channel}}",
|
||||
"wideSessionId": "{{.sid}}",
|
||||
"label": {{.i18n}},
|
||||
|
@ -99,32 +99,32 @@
|
|||
|
||||
</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.Server}}/static/js/lib/jquery-2.1.1.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/reconnecting-websocket.js"></script>
|
||||
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/codemirror.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/selection/active-line.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/overwrite/codemirror/addon/hint/show-hint.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/hint/anyword-hint.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/display/rulers.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/edit/closebrackets.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/edit/matchbrackets.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/edit/closetag.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/search/searchcursor.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/search/search.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/dialog/dialog.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/search/match-highlighter.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/foldcode.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/foldgutter.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/brace-fold.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/comment-fold.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/mode/loadmode.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/comment/comment.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/meta.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/go/go.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/codemirror.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/selection/active-line.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/overwrite/codemirror/addon/hint/show-hint.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/hint/anyword-hint.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/display/rulers.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/edit/closebrackets.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/edit/matchbrackets.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/edit/closetag.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/search/searchcursor.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/search/search.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/dialog/dialog.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/search/match-highlighter.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/foldcode.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/foldgutter.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/brace-fold.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/fold/comment-fold.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/mode/loadmode.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/addon/comment/comment.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/meta.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/codemirror-{{.codeMirrorVer}}/mode/go/go.js"></script>
|
||||
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/dialog.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/menu.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/playground.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/dialog.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/menu.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/playground.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -115,7 +115,7 @@
|
|||
<input data-value="{{.user.Password}}" value="{{.user.Password}}" name="password" type="password"/>
|
||||
</label>
|
||||
<label class="fn-clear">
|
||||
<img onerror="this.src='{{.conf.StaticServer}}/static/images/user-thumbnail.png'"
|
||||
<img onerror="this.src='{{.conf.Server}}/static/images/user-thumbnail.png'"
|
||||
src="https://secure.gravatar.com/avatar/{{.user.Gravatar}}?s=48&d=https://hacpai.com/images/user-thumbnail.png"
|
||||
title="{{.user.Name}}" class='gravatar'/>
|
||||
<a href="http://gravatar.com/" target="_blank">{{.i18n.change_avatar}} Gravatar.com</a>
|
||||
|
|
|
@ -1,35 +0,0 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<title>{{.i18n.wide}}</title>
|
||||
|
||||
<meta name="keywords" content="Wide, Golang, IDE, Team, Cloud, B3log, Shell"/>
|
||||
<meta name="description" content="A Web-based IDE for Teams using Golang, do your development anytime, anywhere."/>
|
||||
<meta name="author" content="B3log">
|
||||
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/shell.css?{{.conf.StaticResourceVersion}}">
|
||||
|
||||
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
||||
</head>
|
||||
<body>
|
||||
<input id="shellInput" placeholder="Command..."/>
|
||||
|
||||
<div>
|
||||
<textarea id="shellOutput" rows="40" ></textarea>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
var config = {
|
||||
channel: {
|
||||
shell: '{{.conf.ShellChannel}}'
|
||||
},
|
||||
wideSessionId: {{.sid}}
|
||||
};</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/shell.js?{{.conf.StaticResourceVersion}}"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -8,15 +8,15 @@
|
|||
<meta name="description" content="A Web-based IDE for Teams using Golang, do your development anytime, anywhere."/>
|
||||
<meta name="author" content="B3log">
|
||||
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/base.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.StaticServer}}/static/css/sign.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/base.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="stylesheet" href="{{.conf.Server}}/static/css/sign.css?{{.conf.StaticResourceVersion}}">
|
||||
<link rel="icon" type="image/x-icon" href="/favicon.ico" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="header">
|
||||
<div class="wrapper fn-clear">
|
||||
<a href="/login" rel="login">
|
||||
<img title="Wide, a Web-based IDE for Teams using Golang." src="{{.conf.StaticServer}}/static/images/wide-logo.png"
|
||||
<img title="Wide, a Web-based IDE for Teams using Golang." src="{{.conf.Server}}/static/images/wide-logo.png"
|
||||
class="logo"/></a>
|
||||
<ul class="fn-right">
|
||||
<li><a href="/playground" target="_blank" style="color: #cd504a">Play</a></li>
|
||||
|
@ -56,7 +56,7 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript" src="{{.conf.StaticServer}}/static/js/lib/jquery-2.1.1.min.js"></script>
|
||||
<script type="text/javascript" src="{{.conf.Server}}/static/js/lib/jquery-2.1.1.min.js"></script>
|
||||
<script>
|
||||
(function () {
|
||||
var contentH = $(window).height() - $(".footer").height() - $(".header").height() - 18;
|
||||
|
|
Loading…
Reference in New Issue