這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
示範地址 http://gblog-revel.herokuapp.com/
1.首頁
好,我用revel new GBlog 建了我們的項目。
在設計之前(為什麼總是設計,沒有結果沒有動力啊),我們先來做點東西。將public/css/bootstrap.css刪了換成bootstrap3(因為它給我們產生的是2,我喜歡用3,不能說喜歡,而是正在用3,你也可以繼續使用2哦!可能樣式有點不一樣而已。),在public/css/建立一個我們的樣式:style.css,,新增內容:
body{margin: 0 auto;padding: 0;background: url('../img/section_bg.png');font: 14px "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;line-height: 20px;letter-spacing: 0.02em;color: #666;background-attachment:fixed;}a{color: #1abc9c;text-decoration: none;-webkit-transition: 0.25s;-moz-transition: 0.25s;-o-transition: 0.25s;transition: 0.25s;-webkit-backface-visibility: hidden;}.main-nav{margin: 0 auto;width: 692px;padding:0;}.top-bar{width:100%;background: #34495e;border-bottom-right-radius: 6px;border-bottom-left-radius: 6px;box-shadow: 0 2px rgba(0,0,0,0.075),0 0 6px #7aba7b;-webkit-box-shadow:0 2px rgba(0,0,0,0.075),0 0 6px #7aba7b;-moz-box-shadow:0 2px rgba(0,0,0,0.075),0 0 6px #7aba7b;margin-bottom:28px;}.top-bar-inner{min-height: 48px;padding:0 4px;}.ul-nav{position: relative;left: 0;display: block;float: left;margin: 0 10px 0 0;list-style: none;font-size: 18px;padding:0;}.ul-nav>li {position: relative;float: left;line-height: 20px;}.ul-nav>li>a{padding: 14px 24px 17px;text-decoration: none;display: block;color: white;text-shadow: 0 -1px 0 rgba(0,0,0,0.25);}.ul-nav>li>a:hover,.ul-nav>li>a:focus{color: #1abc9c;}.navbar-news {background-color: #e74c3c;border-radius: 30px;color: white;display: block;font-size: 12px;font-weight: 500;line-height: 18px;min-width: 8px;padding: 0 5px;position: absolute;right: -7px;text-align: center;text-shadow: none;top: 8px;z-index: 10;}.ul-nav .active > a, .ul-nav .active > a:hover, .ul-nav .active > a:focus { background-color: transparent; color: #1abc9c; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; }.cell{background-color:#1bc6a5;color: #cff3ec;font-size: 15px;border-radius: 4px;-webkit-border-radius: 4px;-moz-border-radius: 4px;-o-border-radius: 4px;-khtml-border-radius: 4px;padding: 18px 20px 0px 20px; margin-bottom: 30px;box-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);}.cell-subject{margin: 0;}.cell-subject-title{color: #34495e;font-size: 24px;font-weight: 700;text-decoration: none;}a.cell-subject-title:hover{text-decoration: underline;}.subject-infor{color:#34495e;line-height: 19px;padding: 2px 0;font-size: 13px;margin:2px 0;}.cell-text{padding: 4px 0;word-break: break-all;}.comment-num{float:right;border: 5px solid #d7dce0;border-radius: 50px;font-size: 14px;line-height: 16px;padding: 0 4px;-webkit-transition: background 0.2s ease-out, border-color 0s ease-out, color 0.2s ease-out;-moz-transition: background 0.2s ease-out, border-color 0s ease-out, color 0.2s ease-out;-o-transition: background 0.2s ease-out, border-color 0s ease-out, color 0.2s ease-out;transition: background 0.2s ease-out, border-color 0s ease-out, color 0.2s ease-out;-webkit-backface-visibility: hidden;background-color: white;border-color: white;border-width: 2px;color: #BBB6B6;}
恩其中的背景圖片,太小了,上傳上來也看不清除,大家自己找一個或者不用也行。關於css這種東西,不會寫,我們就copy,這種東西,只能說你喜歡就認真去做,不喜歡,就隨便高高。
好,開啟app/views/header.html,添加進去:
<link rel="stylesheet" type="text/css" href="/public/css/styles.css">
等一下,我們先來看看header.html裡面的內容:
<!DOCTYPE html><html> <head> <title>{{.title}}</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="stylesheet" type="text/css" href="/public/css/bootstrap.min.css"> <link rel="stylesheet" type="text/css" href="/public/css/styles.css"> <link rel="shortcut icon" type="image/png" href="/public/img/favicon.png"> <script src="/public/js/jquery-1.9.1.min.js" type="text/javascript" charset="utf-8"></script> {{range .moreStyles}} <link rel="stylesheet" type="text/css" href="/public/{{.}}"> {{end}} {{range .moreScripts}} <script src="/public/{{.}}" type="text/javascript" charset="utf-8"></script> {{end}} </head> <body>
{{.title}}這是一個變數我們後面會看到,css與js的引入到沒什麼區別,不過icon這個不錯,居然支援png等格式。{{range .moreStyles}}和{{range .moreScripts}}這兩個是迴圈,也就是說我們如果不同的頁面需要不同的css檔案或者js檔案,我們可以在那個頁面上採用
{{append . "moreScripts" "js/jquery-ui-1.7.2.custom.min.js"}}這種凡是把我們需要的東西載入進去。由於,我們目前東西比較少,這兩個迴圈可以去掉。
那麼在header.html的body之後加入下面代碼:
<div class="container main-nav"> <div class="top-bar"> <div class="top-bar-inner"> <ul class="ul-nav "> <li class="{{.home}}"> <a href="/" >Home</a> <span class="navbar-news " title="最近1小時有1個更新">1</span> </li> <li class="{{.write}}"> <a href="/write" title="Put up your blogs">投稿</a> </li> <li class="{{.mess}}"> <a href="/message" title="Message Boards">留言</a> </li> <li class="{{.history}}"> <a href="/history" title="History blogs">歸檔</a> </li> <li class="{{.about}}"> <a href="/about" title="About Me">About Me</a> </li> <li class="{{.ema}}"> <a href="/email" title="The emails of the blog's author">Email</a> </li> <li> <a href="#" title="">RSS</a> </li> </ul> </div> </div>
最後不要忘了在footer.html加入</div>,好我們來看一下效果:
恩,看起來還是不錯的,雖然有點挫。
好,我們開啟views/App/Index.html(話說,大小寫很重要的哦,它是根據你方法的名稱來載入對於view下的頁面),把裡面的東西全部替換:
{{set . "title" "Home - GBlog" }}{{set . "home" "active" }}{{template "header.html" .}}<div class="content"> <div class="cell"> <div class="cell-subject"> <div> <a href="#" class="cell-subject-title" ><strang>Test size=45</strang></a> <a href="#" class="comment-num" title="Comments">10</a> </div> <div class="subject-infor"> <span class="label label-success">Author</span> <span>jov123@163.com</span> <span class="label label-default">Date</span> 2014-04-15 12:25 <span class="label label-info">Read</span> 0 </div> </div> <div class="cell-text"> <pre><code>怎麼說呢,稍微有點迷茫,不管是id</code></pre> </div> </div></div>{{template "footer.html" .}}
恩,看到了嗎,set . title這中東西很有作用把,template也不用我多說什麼把。再次重新整理看一下效果:
呀~~,是不是更挫了。好把。首頁就這樣完成了設計,下面我們先做投稿的設計,沒有投稿哪有資料啊,是不是?
2.投稿
在view/App/下建立WBlog.html,內容如下:
{{set . "title" "投稿 - GBlog"}}{{set . "write" "active" }}{{template "header.html" .}}<div class="content"> <div class="write-nav"> <form action="/putblog" method="post" > <div class="form-group" > <label style="font-weight: bold;">Title</label> {{with $field := field "blog.Title" .}} <input type="text" id="{{$field.Id}}" name="{{$field.Name}}" class="form-control" style="width:98%;min-height:28px;" required value="{{if $field.Flash}}{{$field.Flash}}{{else}}{{$field.Value}}{{end}}"> <span class="help-inline erro">{{$field.Error}}</span> {{end}} </div> <div class="form-group" > <label style="font-weight: bold;">Author</label> {{with $field := field "blog.Email" .}} <input type="email" id="{{$field.Id}}" name="{{$field.Name}}" class="form-control" style="width:98%;min-height:28px;" placeholder="Enter your email" required value="{{if $field.Flash}}{{$field.Flash}}{{else}}{{$field.Value}}{{end}}"> <span class="help-inline erro">{{$field.Error}}</span> {{end}} </div> <div class="form-group" > <label style="font-weight: bold;">Subject</label> {{with $field := field "blog.Subject" .}} <textarea class="form-control" id="{{$field.Id}}" name="{{$field.Name}}" style="width:98%;line-height: 22px;height: 350px;resize: vertical;" required >{{if $field.Flash}}{{$field.Flash}}{{else}}{{$field.Value}}{{end}}</textarea> <span class="help-inline erro">{{$field.Error}}</span> {{end}} </div> <button type="submit" class="btn btn-success">Submit</button> </form> </div></div>{{template "footer.html" .}}
這裡面我先把後面要降到的的東西放了出來,先不用管,後面會講到。
那麼怎麼看效果呢,先在app/controllers/app.go 裡面加入一個方法:
func (c App) WBlog() revel.Result {return c.Render()}
來看這個方法,他的接收者是App,就是這個檔案上面的struct,它裡面放的是revel.Controller對象,這個我們不用管它,而c.Render(),相當與forward跳轉。在conf/routes裡面加入一個路由控制:
GET /write App.WBlog
當然我們也是可以通過http://localhost:9000/App/WBlog這樣的方式直接 訪問的,但是我不喜歡這種大寫的名稱(在go中你需要時刻注意大小寫,因為大寫相當於public的是可以被外部存取的),說明一下為什麼可以用這種方式訪問,看到conf/routes裡面的:
* /:controller/:action :controller.:action
它已經給我們配置好了。
ok,我們刷一下頁面,點投稿看看效果:
有了這兩個基本的東西我們可以來實現它了。
內容比較多,我們在下一章來做實現。