2014-05-07 13:06:24 +08:00
|
|
|
|
package app
|
|
|
|
|
|
|
|
|
|
import (
|
2015-01-08 23:27:13 +08:00
|
|
|
|
"github.com/revel/revel"
|
|
|
|
|
. "github.com/leanote/leanote/app/lea"
|
|
|
|
|
"github.com/leanote/leanote/app/service"
|
|
|
|
|
"github.com/leanote/leanote/app/db"
|
2014-09-22 19:15:28 +08:00
|
|
|
|
"github.com/leanote/leanote/app/controllers"
|
2015-03-31 14:27:26 +08:00
|
|
|
|
"github.com/leanote/leanote/app/controllers/api"
|
2014-09-24 22:24:52 +08:00
|
|
|
|
"github.com/leanote/leanote/app/controllers/admin"
|
2014-11-09 16:24:19 +08:00
|
|
|
|
"github.com/leanote/leanote/app/controllers/member"
|
2014-05-07 13:06:24 +08:00
|
|
|
|
_ "github.com/leanote/leanote/app/lea/binder"
|
2014-10-22 16:20:45 +08:00
|
|
|
|
"github.com/leanote/leanote/app/lea/route"
|
2015-01-08 23:27:13 +08:00
|
|
|
|
"reflect"
|
|
|
|
|
"fmt"
|
2014-05-07 13:06:24 +08:00
|
|
|
|
"html/template"
|
|
|
|
|
"math"
|
2014-12-27 23:46:11 +08:00
|
|
|
|
"strings"
|
2015-01-08 23:27:13 +08:00
|
|
|
|
"strconv"
|
2014-05-07 13:06:24 +08:00
|
|
|
|
"time"
|
2015-01-08 23:27:13 +08:00
|
|
|
|
"encoding/json"
|
|
|
|
|
"net/url"
|
2014-05-07 13:06:24 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
// Filters is the default set of global filters.
|
|
|
|
|
revel.Filters = []revel.Filter{
|
2015-01-08 23:27:13 +08:00
|
|
|
|
revel.PanicFilter, // Recover from panics and display an error page instead.
|
2014-10-22 16:20:45 +08:00
|
|
|
|
route.RouterFilter,
|
2014-09-18 00:28:23 +08:00
|
|
|
|
// revel.RouterFilter, // Use the routing table to select the right Action
|
2014-05-07 13:06:24 +08:00
|
|
|
|
// AuthFilter, // Invoke the action.
|
|
|
|
|
revel.FilterConfiguringFilter, // A hook for adding or removing per-Action filters.
|
|
|
|
|
revel.ParamsFilter, // Parse parameters into Controller.Params.
|
2015-04-20 19:51:20 +08:00
|
|
|
|
revel.SessionFilter, // Restore and write the session cookie.
|
2015-01-08 23:27:13 +08:00
|
|
|
|
|
2014-10-22 16:20:45 +08:00
|
|
|
|
// 使用SessionFilter标准版从cookie中得到sessionID, 然后通过MssessionFilter从Memcache中得到
|
|
|
|
|
// session, 之后MSessionFilter将session只存sessionID然后返回给SessionFilter返回到web
|
2015-04-20 19:51:20 +08:00
|
|
|
|
// session.SessionFilter, // leanote session
|
2015-01-08 23:27:13 +08:00
|
|
|
|
// session.MSessionFilter, // leanote memcache session
|
|
|
|
|
|
|
|
|
|
revel.FlashFilter, // Restore and write the flash cookie.
|
|
|
|
|
revel.ValidationFilter, // Restore kept validation errors and save new ones from cookie.
|
|
|
|
|
revel.I18nFilter, // Resolve the requested language
|
|
|
|
|
revel.InterceptorFilter, // Run interceptors around the action.
|
|
|
|
|
revel.CompressFilter, // Compress the result.
|
|
|
|
|
revel.ActionInvoker, // Invoke the action.
|
2014-05-07 13:06:24 +08:00
|
|
|
|
}
|
2015-01-08 23:27:13 +08:00
|
|
|
|
|
2014-05-07 13:06:24 +08:00
|
|
|
|
revel.TemplateFuncs["raw"] = func(str string) template.HTML {
|
|
|
|
|
return template.HTML(str)
|
|
|
|
|
}
|
2015-06-15 18:01:48 +08:00
|
|
|
|
revel.TemplateFuncs["trim"] = func(str string) string {
|
|
|
|
|
str = strings.Trim(str, " ")
|
|
|
|
|
str = strings.Trim(str, " ")
|
|
|
|
|
|
|
|
|
|
str = strings.Trim(str, "\n")
|
|
|
|
|
str = strings.Trim(str, " ")
|
|
|
|
|
|
|
|
|
|
// 以下两个空格不一样
|
|
|
|
|
str = strings.Trim(str, " ")
|
|
|
|
|
str = strings.Trim(str, " ")
|
|
|
|
|
return str
|
|
|
|
|
}
|
2014-09-24 22:24:52 +08:00
|
|
|
|
revel.TemplateFuncs["add"] = func(i int) string {
|
2015-01-08 23:27:13 +08:00
|
|
|
|
i = i + 1;
|
2014-09-24 22:24:52 +08:00
|
|
|
|
return fmt.Sprintf("%v", i)
|
|
|
|
|
}
|
|
|
|
|
revel.TemplateFuncs["sub"] = func(i int) int {
|
2015-01-08 23:27:13 +08:00
|
|
|
|
i = i - 1;
|
2014-09-24 22:24:52 +08:00
|
|
|
|
return i
|
2014-05-07 13:06:24 +08:00
|
|
|
|
}
|
2014-11-09 16:24:19 +08:00
|
|
|
|
// 增加或减少
|
|
|
|
|
revel.TemplateFuncs["incr"] = func(n, i int) int {
|
2015-01-08 23:27:13 +08:00
|
|
|
|
n = n + i;
|
2014-11-09 16:24:19 +08:00
|
|
|
|
return n
|
|
|
|
|
}
|
2014-10-22 16:20:45 +08:00
|
|
|
|
revel.TemplateFuncs["join"] = func(arr []string) template.HTML {
|
|
|
|
|
if arr == nil {
|
|
|
|
|
return template.HTML("")
|
|
|
|
|
}
|
|
|
|
|
return template.HTML(strings.Join(arr, ","))
|
|
|
|
|
}
|
2014-05-07 13:06:24 +08:00
|
|
|
|
revel.TemplateFuncs["concat"] = func(s1, s2 string) template.HTML {
|
|
|
|
|
return template.HTML(s1 + s2)
|
|
|
|
|
}
|
2014-10-22 16:20:45 +08:00
|
|
|
|
revel.TemplateFuncs["concatStr"] = func(strs ...string) string {
|
|
|
|
|
str := ""
|
|
|
|
|
for _, s := range strs {
|
|
|
|
|
str += s
|
|
|
|
|
}
|
|
|
|
|
return str
|
|
|
|
|
}
|
2014-11-12 17:32:03 +08:00
|
|
|
|
revel.TemplateFuncs["decodeUrlValue"] = func(i string) string {
|
|
|
|
|
v, _ := url.ParseQuery("a=" + i)
|
|
|
|
|
return v.Get("a")
|
|
|
|
|
}
|
2014-10-22 16:20:45 +08:00
|
|
|
|
revel.TemplateFuncs["json"] = func(i interface{}) string {
|
2015-01-08 23:27:13 +08:00
|
|
|
|
b, _ := json.Marshal(i)
|
2014-10-22 16:20:45 +08:00
|
|
|
|
return string(b)
|
|
|
|
|
}
|
2014-11-09 18:00:23 +08:00
|
|
|
|
revel.TemplateFuncs["jsonJs"] = func(i interface{}) template.JS {
|
2015-01-08 23:27:13 +08:00
|
|
|
|
b, _ := json.Marshal(i)
|
2014-11-09 18:00:23 +08:00
|
|
|
|
return template.JS(string(b))
|
|
|
|
|
}
|
2014-05-07 13:06:24 +08:00
|
|
|
|
revel.TemplateFuncs["datetime"] = func(t time.Time) template.HTML {
|
|
|
|
|
return template.HTML(t.Format("2006-01-02 15:04:05"))
|
|
|
|
|
}
|
2014-11-09 16:24:19 +08:00
|
|
|
|
revel.TemplateFuncs["dateFormat"] = func(t time.Time, format string) template.HTML {
|
|
|
|
|
return template.HTML(t.Format(format))
|
|
|
|
|
}
|
2014-10-22 16:20:45 +08:00
|
|
|
|
revel.TemplateFuncs["unixDatetime"] = func(unixSec string) template.HTML {
|
|
|
|
|
sec, _ := strconv.Atoi(unixSec)
|
|
|
|
|
t := time.Unix(int64(sec), 0)
|
|
|
|
|
return template.HTML(t.Format("2006-01-02 15:04:05"))
|
|
|
|
|
}
|
2015-01-08 23:27:13 +08:00
|
|
|
|
|
2014-05-07 13:06:24 +08:00
|
|
|
|
// interface是否有该字段
|
|
|
|
|
revel.TemplateFuncs["has"] = func(i interface{}, key string) bool {
|
2015-01-08 23:27:13 +08:00
|
|
|
|
t := reflect.TypeOf(i)
|
2014-05-07 13:06:24 +08:00
|
|
|
|
_, ok := t.FieldByName(key)
|
|
|
|
|
return ok
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// tags
|
2015-01-08 22:08:09 +08:00
|
|
|
|
// 2014/12/30 标签添加链接
|
2014-10-22 16:20:45 +08:00
|
|
|
|
revel.TemplateFuncs["blogTags"] = func(renderArgs map[string]interface{}, tags []string) template.HTML {
|
|
|
|
|
if tags == nil || len(tags) == 0 {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
locale, _ := renderArgs[revel.CurrentLocaleRenderArg].(string)
|
|
|
|
|
tagStr := ""
|
|
|
|
|
lenTags := len(tags)
|
2015-01-08 22:08:09 +08:00
|
|
|
|
|
|
|
|
|
tagPostUrl, _ := renderArgs["tagPostsUrl"].(string)
|
|
|
|
|
|
2014-10-22 16:20:45 +08:00
|
|
|
|
for i, tag := range tags {
|
|
|
|
|
str := revel.Message(locale, tag)
|
2015-01-08 22:08:09 +08:00
|
|
|
|
var classes = "label"
|
2014-10-22 16:20:45 +08:00
|
|
|
|
if strings.HasPrefix(str, "???") {
|
|
|
|
|
str = tag
|
|
|
|
|
}
|
2015-01-08 22:08:09 +08:00
|
|
|
|
if InArray([]string{"red", "blue", "yellow", "green"}, tag) {
|
|
|
|
|
classes += " label-" + tag
|
|
|
|
|
} else {
|
|
|
|
|
classes += " label-default"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
classes += " label-post"
|
|
|
|
|
var url = tagPostUrl + "/" + url.QueryEscape(tag)
|
|
|
|
|
tagStr += "<a class=\"" + classes + "\" href=\"" + url + "\">" + str + "</a>";
|
2014-10-22 16:20:45 +08:00
|
|
|
|
if i != lenTags - 1 {
|
2015-01-08 22:08:09 +08:00
|
|
|
|
tagStr += " "
|
2014-10-22 16:20:45 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return template.HTML(tagStr)
|
|
|
|
|
}
|
2015-01-08 22:08:09 +08:00
|
|
|
|
|
2015-06-15 18:01:48 +08:00
|
|
|
|
revel.TemplateFuncs["blogTagsForExport"] = func(renderArgs map[string]interface{}, tags []string) template.HTML {
|
|
|
|
|
if tags == nil || len(tags) == 0 {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
tagStr := ""
|
|
|
|
|
lenTags := len(tags)
|
|
|
|
|
|
|
|
|
|
for i, tag := range tags {
|
|
|
|
|
str := tag
|
|
|
|
|
var classes = "label"
|
|
|
|
|
if InArray([]string{"red", "blue", "yellow", "green"}, tag) {
|
|
|
|
|
classes += " label-" + tag
|
|
|
|
|
} else {
|
|
|
|
|
classes += " label-default"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
classes += " label-post"
|
|
|
|
|
tagStr += "<span class=\"" + classes + "\" >" + str + "</span>";
|
|
|
|
|
if i != lenTags - 1 {
|
|
|
|
|
tagStr += " "
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return template.HTML(tagStr)
|
|
|
|
|
}
|
|
|
|
|
|
2015-10-14 18:53:29 +08:00
|
|
|
|
// 不用revel的msg
|
|
|
|
|
revel.TemplateFuncs["leaMsg"] = func(renderArgs map[string]interface{}, key string) template.HTML {
|
|
|
|
|
locale, _ := renderArgs[revel.CurrentLocaleRenderArg].(string)
|
|
|
|
|
str := revel.Message(locale, key)
|
|
|
|
|
if strings.HasPrefix(str, "???") {
|
|
|
|
|
str = key
|
|
|
|
|
}
|
|
|
|
|
return template.HTML(str);
|
|
|
|
|
}
|
|
|
|
|
|
2015-01-08 22:08:09 +08:00
|
|
|
|
// lea++
|
2015-06-15 18:01:48 +08:00
|
|
|
|
revel.TemplateFuncs["blogTagsLea"] = func(renderArgs map[string]interface{}, tags []string, typeStr string) template.HTML {
|
2015-01-08 22:08:09 +08:00
|
|
|
|
if tags == nil || len(tags) == 0 {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
locale, _ := renderArgs[revel.CurrentLocaleRenderArg].(string)
|
|
|
|
|
tagStr := ""
|
|
|
|
|
lenTags := len(tags)
|
|
|
|
|
|
|
|
|
|
tagPostUrl := "http://lea.leanote.com/"
|
2015-06-15 18:01:48 +08:00
|
|
|
|
if typeStr == "recommend" {
|
2015-01-08 22:08:09 +08:00
|
|
|
|
tagPostUrl += "?tag=";
|
2015-06-15 18:01:48 +08:00
|
|
|
|
} else if typeStr == "latest" {
|
2015-01-08 22:08:09 +08:00
|
|
|
|
tagPostUrl += "latest?tag=";
|
2015-06-15 18:01:48 +08:00
|
|
|
|
} else {
|
|
|
|
|
tagPostUrl += "subscription?tag=";
|
2015-01-08 22:08:09 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for i, tag := range tags {
|
|
|
|
|
str := revel.Message(locale, tag)
|
|
|
|
|
var classes = "label"
|
|
|
|
|
if strings.HasPrefix(str, "???") {
|
|
|
|
|
str = tag
|
|
|
|
|
}
|
|
|
|
|
if InArray([]string{"red", "blue", "yellow", "green"}, tag) {
|
|
|
|
|
classes += " label-" + tag
|
|
|
|
|
} else {
|
|
|
|
|
classes += " label-default"
|
|
|
|
|
}
|
|
|
|
|
classes += " label-post"
|
|
|
|
|
var url = tagPostUrl + url.QueryEscape(tag)
|
|
|
|
|
tagStr += "<a class=\"" + classes + "\" href=\"" + url + "\">" + str + "</a>";
|
|
|
|
|
if i != lenTags - 1 {
|
|
|
|
|
tagStr += " "
|
2014-10-22 16:20:45 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return template.HTML(tagStr)
|
|
|
|
|
}
|
2015-01-08 22:08:09 +08:00
|
|
|
|
|
2014-10-22 16:20:45 +08:00
|
|
|
|
/*
|
2015-01-08 23:27:13 +08:00
|
|
|
|
revel.TemplateFuncs["blogTags"] = func(tags []string) template.HTML {
|
|
|
|
|
if tags == nil || len(tags) == 0 {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
// TODO 这里判断语言, 从语言包中拿
|
|
|
|
|
tagMap := map[string]string{"red": "红色", "yellow": "黄色", "blue": "蓝色", "green": "绿色"}
|
|
|
|
|
tagStr := ""
|
|
|
|
|
lenTags := len(tags)
|
|
|
|
|
for i, tag := range tags {
|
|
|
|
|
if text, ok := tagMap[tag]; ok {
|
|
|
|
|
tagStr += text
|
|
|
|
|
} else {
|
|
|
|
|
tagStr += tag
|
2014-05-07 13:06:24 +08:00
|
|
|
|
}
|
2015-01-08 23:27:13 +08:00
|
|
|
|
if i != lenTags - 1 {
|
|
|
|
|
tagStr += ","
|
2014-05-07 13:06:24 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2015-01-08 23:27:13 +08:00
|
|
|
|
return template.HTML(tagStr)
|
|
|
|
|
}
|
2014-10-22 16:20:45 +08:00
|
|
|
|
*/
|
2014-09-24 22:24:52 +08:00
|
|
|
|
revel.TemplateFuncs["li"] = func(a string) string {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
// str连接
|
2015-01-08 23:27:13 +08:00
|
|
|
|
revel.TemplateFuncs["urlConcat"] = func(url string, v... interface{}) string {
|
2014-09-24 22:24:52 +08:00
|
|
|
|
html := ""
|
|
|
|
|
for i := 0; i < len(v); i = i + 2 {
|
|
|
|
|
item := v[i]
|
|
|
|
|
if i+1 == len(v) {
|
2015-01-08 23:27:13 +08:00
|
|
|
|
break;
|
2014-09-24 22:24:52 +08:00
|
|
|
|
}
|
|
|
|
|
value := v[i+1]
|
|
|
|
|
if item != nil && value != nil {
|
2015-01-08 23:27:13 +08:00
|
|
|
|
keyStr, _ := item.(string)
|
|
|
|
|
valueStr, err := value.(string)
|
|
|
|
|
if !err {
|
|
|
|
|
valueInt, _ := value.(int)
|
|
|
|
|
valueStr = strconv.Itoa(valueInt)
|
|
|
|
|
}
|
|
|
|
|
if keyStr != "" && valueStr != "" {
|
|
|
|
|
s := keyStr + "=" + valueStr
|
|
|
|
|
if html != "" {
|
|
|
|
|
html += "&" + s
|
|
|
|
|
} else {
|
|
|
|
|
html += s
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2014-09-24 22:24:52 +08:00
|
|
|
|
}
|
2015-01-08 23:27:13 +08:00
|
|
|
|
|
2014-09-24 22:24:52 +08:00
|
|
|
|
if html != "" {
|
|
|
|
|
if strings.Index(url, "?") >= 0 {
|
|
|
|
|
return url + "&" + html
|
|
|
|
|
} else {
|
|
|
|
|
return url + "?" + html
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return url
|
|
|
|
|
}
|
2015-01-08 23:27:13 +08:00
|
|
|
|
|
2014-09-24 22:24:52 +08:00
|
|
|
|
revel.TemplateFuncs["urlCond"] = func(url string, sorterI, keyords interface{}) template.HTML {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
2015-01-08 23:27:13 +08:00
|
|
|
|
|
2014-10-22 16:20:45 +08:00
|
|
|
|
// http://stackoverflow.com/questions/14226416/go-lang-templates-always-quotes-a-string-and-removes-comments
|
|
|
|
|
revel.TemplateFuncs["rawMsg"] = func(renderArgs map[string]interface{}, message string, args ...interface{}) template.JS {
|
|
|
|
|
str, ok := renderArgs[revel.CurrentLocaleRenderArg].(string)
|
|
|
|
|
if !ok {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
return template.JS(revel.Message(str, message, args...))
|
|
|
|
|
}
|
2015-01-08 23:27:13 +08:00
|
|
|
|
|
2014-09-24 22:24:52 +08:00
|
|
|
|
// 为后台管理sorter th使用
|
|
|
|
|
// 必须要返回HTMLAttr, 返回html, golang 会执行安全检查返回ZgotmplZ
|
|
|
|
|
// sorterI 可能是nil, 所以用interfalce{}来接收
|
|
|
|
|
/*
|
2015-01-08 23:27:13 +08:00
|
|
|
|
data-url="/adminUser/index"
|
|
|
|
|
data-sorter="email"
|
|
|
|
|
class="th-sortable {{if eq .sorter "email-up"}}th-sort-up{{else}}{{if eq .sorter "email-down"}}th-sort-down{{end}}{{end}}"
|
2014-09-24 22:24:52 +08:00
|
|
|
|
*/
|
|
|
|
|
revel.TemplateFuncs["sorterTh"] = func(url, sorterField string, sorterI interface{}) template.HTMLAttr {
|
|
|
|
|
sorter := ""
|
|
|
|
|
if sorterI != nil {
|
|
|
|
|
sorter, _ = sorterI.(string)
|
|
|
|
|
}
|
2015-01-08 23:27:13 +08:00
|
|
|
|
html := "data-url=\"" + url + "\" data-sorter=\"" + sorterField + "\"";
|
|
|
|
|
html += " class=\"th-sortable ";
|
|
|
|
|
if sorter == sorterField + "-up" {
|
|
|
|
|
html += "th-sort-up\"";
|
|
|
|
|
} else if(sorter == sorterField + "-down") {
|
|
|
|
|
html += "th-sort-down";
|
2014-09-24 22:24:52 +08:00
|
|
|
|
}
|
2015-01-08 23:27:13 +08:00
|
|
|
|
html += "\"";
|
2014-09-24 22:24:52 +08:00
|
|
|
|
return template.HTMLAttr(html)
|
|
|
|
|
}
|
2015-01-08 23:27:13 +08:00
|
|
|
|
|
2014-05-07 13:06:24 +08:00
|
|
|
|
// pagination
|
2014-10-22 16:20:45 +08:00
|
|
|
|
revel.TemplateFuncs["page"] = func(urlBase string, page, pageSize, count int) template.HTML {
|
2014-05-07 13:06:24 +08:00
|
|
|
|
if count == 0 {
|
2015-01-08 23:27:13 +08:00
|
|
|
|
return "";
|
2014-05-07 13:06:24 +08:00
|
|
|
|
}
|
2015-01-08 23:27:13 +08:00
|
|
|
|
totalPage := int(math.Ceil(float64(count)/float64(pageSize)))
|
|
|
|
|
|
2014-05-07 13:06:24 +08:00
|
|
|
|
preClass := ""
|
|
|
|
|
prePage := page - 1
|
|
|
|
|
if prePage == 0 {
|
|
|
|
|
prePage = 1
|
|
|
|
|
}
|
|
|
|
|
nextClass := ""
|
|
|
|
|
nextPage := page + 1
|
|
|
|
|
var preUrl, nextUrl string
|
2015-01-08 23:27:13 +08:00
|
|
|
|
|
|
|
|
|
preUrl = urlBase + "?page=" + strconv.Itoa(prePage)
|
2014-05-07 13:06:24 +08:00
|
|
|
|
nextUrl = urlBase + "?page=" + strconv.Itoa(nextPage)
|
2015-01-08 23:27:13 +08:00
|
|
|
|
|
2014-05-07 13:06:24 +08:00
|
|
|
|
// 没有上一页了
|
|
|
|
|
if page == 1 {
|
|
|
|
|
preClass = "disabled"
|
|
|
|
|
preUrl = "#"
|
|
|
|
|
}
|
|
|
|
|
// 没有下一页了
|
|
|
|
|
if totalPage <= page {
|
|
|
|
|
nextClass = "disabled"
|
|
|
|
|
nextUrl = "#"
|
|
|
|
|
}
|
|
|
|
|
return template.HTML("<li class='" + preClass + "'><a href='" + preUrl + "'>Previous</a></li> <li class='" + nextClass + "'><a href='" + nextUrl + "'>Next</a></li>")
|
|
|
|
|
}
|
2014-09-24 22:24:52 +08:00
|
|
|
|
// life
|
|
|
|
|
// https://groups.google.com/forum/#!topic/golang-nuts/OEdSDgEC7js
|
|
|
|
|
// http://play.golang.org/p/snygrVpQva
|
|
|
|
|
// http://grokbase.com/t/gg/golang-nuts/142a6dhfh3/go-nuts-text-template-using-comparison-operators-eq-gt-etc-on-non-existent-variable-causes-the-template-to-stop-outputting-but-with-no-error-correct-behaviour
|
2014-11-09 16:24:19 +08:00
|
|
|
|
/*
|
2015-01-08 23:27:13 +08:00
|
|
|
|
revel.TemplateFuncs["gt"] = func(a1, a2 interface{}) bool {
|
|
|
|
|
switch a1.(type) {
|
|
|
|
|
case string:
|
|
|
|
|
switch a2.(type) {
|
2014-09-24 22:24:52 +08:00
|
|
|
|
case string:
|
2015-01-08 23:27:13 +08:00
|
|
|
|
return reflect.ValueOf(a1).String() > reflect.ValueOf(a2).String()
|
|
|
|
|
}
|
|
|
|
|
case int, int8, int16, int32, int64:
|
|
|
|
|
switch a2.(type) {
|
2014-09-24 22:24:52 +08:00
|
|
|
|
case int, int8, int16, int32, int64:
|
2015-01-08 23:27:13 +08:00
|
|
|
|
return reflect.ValueOf(a1).Int() > reflect.ValueOf(a2).Int()
|
|
|
|
|
}
|
|
|
|
|
case uint, uint8, uint16, uint32, uint64:
|
|
|
|
|
switch a2.(type) {
|
2014-09-24 22:24:52 +08:00
|
|
|
|
case uint, uint8, uint16, uint32, uint64:
|
2015-01-08 23:27:13 +08:00
|
|
|
|
return reflect.ValueOf(a1).Uint() > reflect.ValueOf(a2).Uint()
|
|
|
|
|
}
|
|
|
|
|
case float32, float64:
|
|
|
|
|
switch a2.(type) {
|
2014-09-24 22:24:52 +08:00
|
|
|
|
case float32, float64:
|
2015-01-08 23:27:13 +08:00
|
|
|
|
return reflect.ValueOf(a1).Float() > reflect.ValueOf(a2).Float()
|
2014-09-24 22:24:52 +08:00
|
|
|
|
}
|
|
|
|
|
}
|
2015-01-08 23:27:13 +08:00
|
|
|
|
return false
|
|
|
|
|
}
|
2014-11-09 16:24:19 +08:00
|
|
|
|
*/
|
2015-01-08 23:27:13 +08:00
|
|
|
|
|
2014-09-24 22:24:52 +08:00
|
|
|
|
/*
|
2015-01-08 23:27:13 +08:00
|
|
|
|
{{range $i := N 1 10}}
|
|
|
|
|
<div>{{$i}}</div>
|
|
|
|
|
{{end}}
|
|
|
|
|
*/
|
2014-09-24 22:24:52 +08:00
|
|
|
|
revel.TemplateFuncs["N"] = func(start, end int) (stream chan int) {
|
2015-01-08 23:27:13 +08:00
|
|
|
|
stream = make(chan int)
|
|
|
|
|
go func() {
|
|
|
|
|
for i := start; i <= end; i++ {
|
|
|
|
|
stream <- i
|
|
|
|
|
}
|
|
|
|
|
close(stream)
|
|
|
|
|
}()
|
|
|
|
|
return
|
2014-09-24 22:24:52 +08:00
|
|
|
|
}
|
2015-01-08 23:27:13 +08:00
|
|
|
|
|
2014-05-07 13:06:24 +08:00
|
|
|
|
// init Email
|
|
|
|
|
revel.OnAppStart(func() {
|
2014-10-22 16:20:45 +08:00
|
|
|
|
// 数据库
|
2015-01-08 22:08:09 +08:00
|
|
|
|
db.Init("", "")
|
2014-10-22 16:20:45 +08:00
|
|
|
|
// email配置
|
2014-05-07 13:06:24 +08:00
|
|
|
|
InitEmail()
|
2014-10-22 16:20:45 +08:00
|
|
|
|
InitVd()
|
2015-04-20 19:51:20 +08:00
|
|
|
|
// memcache.InitMemcache() // session服务
|
2014-10-22 16:20:45 +08:00
|
|
|
|
// 其它service
|
2014-09-22 19:15:28 +08:00
|
|
|
|
service.InitService()
|
|
|
|
|
controllers.InitService()
|
2014-09-24 22:24:52 +08:00
|
|
|
|
admin.InitService()
|
2014-11-09 16:24:19 +08:00
|
|
|
|
member.InitService()
|
2014-09-24 22:24:52 +08:00
|
|
|
|
service.ConfigS.InitGlobalConfigs()
|
2015-03-31 14:27:26 +08:00
|
|
|
|
api.InitService()
|
2014-05-07 13:06:24 +08:00
|
|
|
|
})
|
2015-03-31 17:52:18 +08:00
|
|
|
|
}
|