帮酷LOGO
0 0 评论
  • 显示原文与译文双语对照的内容
文章标签:Web应用  Basic  WEB  
Basic Web Application in Golang

  • 源代码名称:gowebapp
  • 源代码网址:http://www.github.com/josephspurrier/gowebapp
  • gowebapp源代码文档
  • gowebapp源代码下载
  • Git URL:
    git://www.github.com/josephspurrier/gowebapp.git
  • Git Clone代码到本地:
    git clone http://www.github.com/josephspurrier/gowebapp
  • Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/josephspurrier/gowebapp
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
  • GoWebApp

    Go Report CardGoDoc

    Go中的基本MVC网络应用

    我推荐你使用最新版本的蓝色 Jay: https://github.com/blue-jay/blueprint

    这个项目演示了如何使用go语言构建和构建一个网站,而没有框架。 有一篇博客文章可以在 http://www.josephspurrier.com/go-web-app-example/ 阅读。 有一个完整的应用程序,我在 https://github.com/verifiedninja/webapp的早期版本中构建了这个项目。 这个项目的API版本在 https://github.com/josephspurrier/gowebapi

    要下载,请运行以下命令:

    
    go get github.com/josephspurrier/gowebapp
    
    
    
    

    如果你在 1.5上,则需要将GOVENDOREXPERIMENT设置为 1. 如果你使用的是 1.4或者更早的版本,则代码将无法正常工作,因为它使用了供应商文件夹。

    用螺栓快速启动

    gowebapp.db 文件将在你启动应用程序后创建。

    从 root 目录生成并运行。 打开你的网页浏览器以: http://localhost 插件你应该可以看到欢迎页面。

    导航到登录页,然后转到 register 页。 创建一个新用户,你应该能够登录。 完成。

    使用MongoDB快速启动

    启动 MongoDB。

    打开 config/config。json并编辑数据库部分,以便连接信息 MATCHES 你的MongoDB实例。 同时,将类型从螺栓改为 MongoDB。

    从 root 目录生成并运行。 打开你的网页浏览器以: http://localhost 插件你应该可以看到欢迎页面。

    导航到登录页,然后转到 register 页。 创建一个新用户,你应该能够登录。 完成。

    快速入门 MySQL

    启动MySQL并导入配置/。sql以创建数据库和表。

    打开 config/config。json并编辑数据库部分,以便连接信息 MATCHES 你的MySQL实例。 另外,将类型从螺栓改为 MySQL。

    从 root 目录生成并运行。 打开你的网页浏览器以: http://localhost 插件你应该可以看到欢迎页面。

    导航到登录页,然后转到 register 页。 创建一个新用户,你应该能够登录。 完成。

    概述

    这个网页应用程序有 public 主页。身份验证主页。登录页面。register 页面。关于页面和一个简单的记事本来演示CRUD操作。

    web应用程序的lsn是 gowebapp.go. 文件。启动会话。连接到数据库。设置模板。加载中间件。

    前端使用 Bootstrap 构建,对字体和间距进行了一些小改动。 定制 Flash 消息,以便它们显示在屏幕的右下角。

    所有错误和警告消息都应该显示在用户或者控制台中。 通过 Flash 消息向用户显示信息性消息,这些消息在 4秒后消失。 Flash 消息在 static 文件夹中由JavaScript控制。

    结构

    最近,文件夹结构已经更改。 我在不同的地方查看了所有分支和项目后,决定将go代码移动到的应用程序文件夹 inside vendor文件夹在许多导入中没有 littered path。 我不想使用 relative 路径,所以供应商文件夹似乎是最好的选择。

    项目被组织到以下文件夹中:

    
    config - application settings and database schema
    
    
    static - location of statically served files like CSS and JS
    
    
    template - HTML templates
    
    
    
    vendor/app/controller - page logic organized by HTTP methods (GET, POST)
    
    
    vendor/app/shared - packages for templates, MySQL, cryptography, sessions, and json
    
    
    vendor/app/model - database queries
    
    
    vendor/app/route - route information and middleware
    
    
    
    

    有几个外部软件包:

    
    github.com/gorilla/context - registry for global request variables
    
    
    github.com/gorilla/sessions - cookie and filesystem sessions
    
    
    github.com/go-sql-driver/mysql - MySQL driver
    
    
    github.com/haisum/recaptcha - Google reCAPTCHA support
    
    
    github.com/jmoiron/sqlx - MySQL general purpose extensions
    
    
    github.com/josephspurrier/csrfbanana - CSRF protection for gorilla sessions
    
    
    github.com/julienschmidt/httprouter - high performance HTTP request router
    
    
    github.com/justinas/alice - middleware chaining
    
    
    github.com/mattn/go-sqlite3 - SQLite driver
    
    
    golang.org/x/crypto/bcrypt - password hashing algorithm
    
    
    
    

    模板被组织成模板文件夹下的文件夹:

    
    about/about.tmpl - quick info about the app
    
    
    index/anon.tmpl - public home page
    
    
    index/auth.tmpl - home page once you login
    
    
    login/login.tmpl - login page
    
    
    notepad/create.tmpl - create note
    
    
    notepad/read.tmpl - read a note
    
    
    notepad/update.tmpl - update a note
    
    
    partial/footer.tmpl - footer
    
    
    partial/menu.tmpl - menu at the top of all the pages
    
    
    register/register.tmpl - register page
    
    
    base.tmpl - base template for all the pages
    
    
    
    

    模板

    有一些模板funcs可以用于使模板和 static 文件更易于使用:

    <!-- CSS files with timestamps -->{{CSS"static/css/normalize3.0.0.min.css"}}
    parses to
    <linkrel="stylesheet"type="text/css"href="/static/css/normalize3.0.0.min.css?1435528339"/><!-- JS files with timestamps -->{{JS"static/js/jquery1.11.0.min.js"}}
    parses to
    <scripttype="text/javascript"src="/static/js/jquery1.11.0.min.js?1435528404"></script><!-- Hyperlinks -->{{LINK"register""Create a new account."}}
    parses to
    <ahref="/register">Create a new account.</a><!-- Output an unescaped variable (not a safe idea, but I find it useful when troubleshooting) -->{{.SomeVariable | NOESCAPE}}<!-- Time format -->{{.SomeTime | PRETTYTIME}}
    parses to format
    3:04 PM 01/02/2006

    你还可以在模板中使用几个变量:

    <!-- Use AuthLevel=auth to determine if a user is logged in (if session.Values["id"]!= nil) -->{{if eq. AuthLevel"auth"}}
    You are logged in.
    {{else}}
    You are not logged in.
    {{end}}<!-- Use BaseURI to print the base URL of the web app --><li><ahref="{{.BaseURI}}about">About</a></li><!-- Use token to output the CSRF token in a form --><inputtype="hidden"name="token"value="{{.token}}">

    在结束和标记之前添加模板特定代码也很容易:

    <!-- Code is added before the closing </head> tag -->{{define"head"}}<metaname="robots"content="noindex">{{end}}
    ...<!-- Code is added before the closing </body> tag -->{{define"foot"}}{{JS"//www.google.com/recaptcha/api.js"}}{{end}}

    JavaScript

    你可以使用JavaScript触发 Flash 通知。

    flashError("You must type in a username.");flashSuccess("Record created!");flashNotice("There seems to be a piece missing.");flashWarning("Something does not seem right...");

    控制器

    控制器文件都共享相同的软件包 NAME。 这就减少了映射路由时的包数量。 它还强制你对每个funcs使用一个良好的命名约定,以便你知道每个funcs的位置以及它们各自映射到的HTTP请求的类型。

    这是你可以用控制器做的几个事情。

    访问大猩猩会话:

    // Get the current sessionsess:= session.Instance(r)
    ...// Close the session after you are finished making changessess.Save(r, w)

    触发下一页上的不同类型的Flash 消息的触发器 1:

    sess.AddFlash(view.Flash{"Sorry, no brute force :-)", view.FlashNotice})
    sess.Save(r, w) // Ensure you save the session after making a change to it

    验证表单域不是空的:

    // Ensure a user submitted all the required form fieldsifvalidate, missingField:= view.Validate(r, []string{"email", "password"});!validate {
     sess.AddFlash(view.Flash{"Field missing: " + missingField, view.FlashError})
     sess.Save(r, w)
     LoginGET(w, r)
     return}

    渲染模板:

    // Create a new viewv:= view.New(r)// Set the template namev.Name = "login/login"// Assign a variable that is accessible in the formv.Vars["token"] = csrfbanana.Token(w, r, sess)// Refill any form fields from a POST operationview.Repopulate([]string{"email"}, r.Form, v.Vars)// Render the templatev.Render(w)

    在Ajax请求期间返回 Flash 消息:

    // Get sessionsess:= session.Instance(r)// Set the flash messagesess.AddFlash(view.Flash{"An error occurred on the server. Please try again later.", view.FlashError})
    sess.Save(r, w)// Display the flash messages as JSONv:= view.New(r)
    v.SendFlashes(w)

    处理数据库查询:

    // Get database resultresult, err:= model.UserByEmail(email)if err == sql.ErrNoRows {
     // User does not exist} elseif err!= nil {
     // Display error message} elseif passhash.MatchString(result.Password, password) {
     // Password matches! } else {
     // Password does not match}

    发送电子邮件:

    // Email a usererr:= email.SendEmail(email.ReadConfig().From, "This is the subject", "This is the body!")if err!= nil {
     log.Println(err)
     sess.AddFlash(view.Flash{"An error occurred on the server. Please try again later.", view.FlashError})
     sess.Save(r, w)
     return}

    如果在配置中启用了 Google reCAPTCHA,请验证表单:

    // Validate with Google reCAPTCHAif!recaptcha.Verified(r) {
     sess.AddFlash(view.Flash{"reCAPTCHA invalid!", view.FlashError})
     sess.Save(r, w)
     RegisterGET(w, r)
     return}

    数据库

    这是一个好主意,抽象数据库层,如果需要进行更改,就不必查看业务逻辑。 所有查询都存储在模型文件夹中。

    这里项目支持 BoltDB,MongoDB和 MySQL。 所有查询都存储在相同的文件中,这样你就可以轻松地修改数据库而不修改配置文件。

    user.go 和 note.go 文件位于模型目录的root,并且是每个数据库类型的所有查询的compliation。 模型中有一些黑客可以使结构能够使用所有受支持的数据库。

    连接到数据库(。在应用程序中只需一次):

    // Connect to databasedatabase.Connect(config.Database)

    从数据库中读取:

    result:=User{}err:= database.DB.Get(&result, "SELECT id, password, status_id, first_name FROM user WHERE email =? LIMIT 1", email)return result, err

    向数据库写入:

    _, err:= database.DB.Exec("INSERT INTO user (first_name, last_name, email, password) VALUES (?,?,?,?)", firstName, lastName, email, password)return err

    中间件

    包含了几个中间件。 称为csrfbanana的软件包可以防止交叉站点请求伪造攻击,并防止双重提交。 封装httprouterwrapper提供 helper 功能,使funcs与httprouter兼容。 软件包LogRequest将把针对网站发出的每个请求记录到控制台。 软件包pprofhandler启用 pprof,因此它将与httprouter一起工作。 在 route.go, 中,所有单独的路由都使用alice使链接变得非常容易。

    配置

    要使web应用程序更加灵活,你可以通过 config.json 文件在一个地方对不同的组件进行更改。 如果要添加任何自己的设置,可以将它们添加到 config.json 和更新 gowebapp.go 和单个文件中的结构。 这是 config.json:

    {
     "Database": {
     "Type": "Bolt",
     "Bolt": { 
     "Path": "gowebapp.db" },
     "MongoDB": {
     "URL": "127.0.0.1",
     "Database": "gowebapp" },
     "MySQL": {
     "Username": "root",
     "Password": "",
     "Name": "gowebapp",
     "Hostname": "127.0.0.1",
     "Port": 3306,
     "Parameter": "?parseTime=true" }
     },
     "Email": {
     "Username": "",
     "Password": "",
     "Hostname": "",
     "Port": 25,
     "From": "" },
     "Recaptcha": {
     "Enabled": false,
     "Secret": "",
     "SiteKey": "" },
     "Server": {
     "Hostname": "",
     "UseHTTP": true,
     "UseHTTPS": false,
     "HTTPPort": 80,
     "HTTPSPort": 443,
     "CertFile": "tls/server.crt",
     "KeyFile": "tls/server.key" },
     "Session": {
     "SecretKey": "@r4B?EThaSEh_drudR7P_hub=s#s2Pah",
     "Name": "gosess",
     "Options": {
     "Path": "/",
     "Domain": "",
     "MaxAge": 28800,
     "Secure": false,
     "HttpOnly": true }
     },
     "Template": {
     "Root": "base",
     "Children": [
     "partial/menu",
     "partial/footer" ]
     },
     "View": {
     "BaseURI": "/",
     "Extension": "tmpl",
     "Folder": "template",
     "Name": "blank",
     "Caching": true }
    }

    如果要启用 HTTPS,请将UseHTTPS设置为 true,在 root 中创建一个名为tls的文件夹,然后将证书和密钥文件放在该文件夹中。

    屏幕截图

    public 主页:

    Image of Public Home

    关于:

    Image of About

    register:

    Image of Register

    登录:

    Image of Login

    已经认证的主页:

    Image of Auth Home

    查看备注:

    Image of Notepad View

    添加注释:

    Image of Notepad Add

    编辑注释:

    Image of Notepad Edit

    反馈

    欢迎所有反馈。如果你有任何建议。问题或者批评,请告诉我。 如果有什么不习惯的,请告诉我知道,我们可以让它更好。



    文章标签:WEB  Basic  Web应用  

    Copyright © 2011 HelpLib All rights reserved.    知识分享协议 京ICP备05059198号-3  |  如果智培  |  酷兔英语