Merge branch 'develop'
admin [init ok] lea++ blog platform [ok]
This commit is contained in:
app
controllers
AuthController.goBlogController.goLeaController.go
admin
AdminBaseController.goAdminBlogController.goAdminController.goAdminSettingController.goAdminUserController.goinit.go
init.godb
info
init.goservice
views
public
admin
css
js
admin.jsblack.cssblue.csschrome.cssidialog.cssopera.csss1.pngs2.pngsimple.csstwitter.cssexcanvas.jshtml5shiv.js
artDialog
.svn
all-wcpropsentries
artDialog.jsartDialog.source.jsjquery.artDialog.jslicense.txtprop-base
artDialog.js.svn-baseartDialog.source.js.svn-baseindex.html.svn-basejquery.artDialog.js.svn-basejquery.artDialog.source.js.svn-baselicense.txt.svn-base
text-base
skins
.svn
all-wcpropsentries
aero.cssprop-base
aero.css.svn-baseblack.css.svn-baseblue.css.svn-basechrome.css.svn-basedefault.css.svn-basegreen.css.svn-baseidialog.css.svn-baseopera.css.svn-basesimple.css.svn-basetwitter.css.svn-base
text-base
aero
.svn
aero_s.pngaero_s2.pngie6
.svn
all-wcpropsentries
aui_close.hover.pngaui_close.pngaui_e.pngaui_n.pngaui_ne.pngaui_nw.pngaui_s.pngaui_se.pngaui_sw.pngaui_title_icon.pngaui_w.pngprop-base
aui_close.hover.png.svn-baseaui_close.png.svn-baseaui_e.png.svn-baseaui_n.png.svn-baseaui_ne.png.svn-baseaui_nw.png.svn-baseaui_s.png.svn-baseaui_se.png.svn-baseaui_sw.png.svn-baseaui_title_icon.png.svn-baseaui_w.png.svn-base
text-base
black
.svn
bg.pngbg2.pngbg_css3.pngbg_css3_2.pngie6
blue
.svn
bg.pngbg2.pngbg_css3.pngbg_css3_2.pngie6
chrome
default.cssgreen.cssgreen
.svn
bg.pngbg2.pngbg_css3.pngbg_css3_2.pngcolor_bg.pngie6
icons
.svn
all-wcpropsentries
error.pngface-sad.pngface-smile.pngloading.gifquestion.pngsucceed.pngwarning.pngprop-base
error.png.svn-baseface-sad.png.svn-baseface-smile.png.svn-baseloading.gif.svn-basequestion.png.svn-basesucceed.png.svn-basewarning.png.svn-base
text-base
idialog
.svn
idialog_s.pngidialog_s2.pngie6
.svn
all-wcpropsentries
aui_close.hover.pngaui_close.pngaui_e.pngaui_n.pngaui_ne.pngaui_nw.pngaui_s.pngaui_se.pngaui_sw.pngaui_w.pngprop-base
aui_close.hover.png.svn-baseaui_close.png.svn-baseaui_e.png.svn-baseaui_n.png.svn-baseaui_ne.png.svn-baseaui_nw.png.svn-baseaui_s.png.svn-baseaui_se.png.svn-baseaui_sw.png.svn-baseaui_w.png.svn-base
text-base
opera
.svn
ie6
.svn
all-wcpropsentries
aui_close.hover.pngaui_close.pngaui_e.pngaui_n.pngaui_ne.pngaui_nw.pngaui_s.pngaui_se.pngaui_sw.pngaui_w.pngprop-base
aui_close.hover.png.svn-baseaui_close.png.svn-baseaui_e.png.svn-baseaui_n.png.svn-baseaui_ne.png.svn-baseaui_nw.png.svn-baseaui_s.png.svn-baseaui_se.png.svn-baseaui_sw.png.svn-baseaui_w.png.svn-base
text-base
jquery-validation-1.13.0
respond.min.jscss
images
js
tinymce
plugins
paste
@ -32,6 +32,7 @@ func (c Auth) DoLogin(email, pwd string) revel.Result {
|
||||
c.SetSession(userInfo)
|
||||
// 必须要redirect, 不然用户刷新会重复提交登录信息
|
||||
// return c.Redirect("/")
|
||||
configService.InitUserConfigs(userInfo.UserId.Hex())
|
||||
return c.RenderJson(info.Re{Ok: true})
|
||||
}
|
||||
// return c.RenderTemplate("login.html")
|
||||
|
@ -4,7 +4,7 @@ import (
|
||||
"github.com/revel/revel"
|
||||
// "encoding/json"
|
||||
"gopkg.in/mgo.v2/bson"
|
||||
// . "leanote/app/lea"
|
||||
// . "github.com/leanote/leanote/app/lea"
|
||||
"github.com/leanote/leanote/app/info"
|
||||
// "github.com/leanote/leanote/app/types"
|
||||
// "io/ioutil"
|
||||
@ -45,15 +45,14 @@ func (c Blog) SetNotebook2Blog(notebookId string, isBlog bool) revel.Result {
|
||||
//-----------------------------
|
||||
// 前台
|
||||
|
||||
// 默认是admin用户的博客
|
||||
// 列表
|
||||
// 这里还需要得到其它博客配置信息...
|
||||
// 配置信息可以放在users表中, 或添加一个user_options表(用户配置表)
|
||||
|
||||
// 进入某个用户的博客
|
||||
var blogPageSize = 5
|
||||
var searchBlogPageSize = 30
|
||||
func (c Blog) Index(userId string, notebookId string) revel.Result {
|
||||
// 用户id为空, 转至博客平台
|
||||
if userId == "" {
|
||||
userId = leanoteUserId
|
||||
userId = leanoteUserId;
|
||||
}
|
||||
|
||||
// userId可能是 username, email
|
||||
@ -90,7 +89,7 @@ func (c Blog) Index(userId string, notebookId string) revel.Result {
|
||||
c.RenderArgs["page"] = page
|
||||
c.RenderArgs["pageSize"] = blogPageSize
|
||||
c.RenderArgs["count"] = count
|
||||
|
||||
|
||||
// 当前notebook
|
||||
c.RenderArgs["notebookId"] = notebookId
|
||||
c.RenderArgs["notebook"] = notebook
|
||||
|
52
app/controllers/LeaController.go
Normal file
52
app/controllers/LeaController.go
Normal file
@ -0,0 +1,52 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"github.com/revel/revel"
|
||||
// "encoding/json"
|
||||
. "github.com/leanote/leanote/app/lea"
|
||||
// "github.com/leanote/leanote/app/types"
|
||||
// "io/ioutil"
|
||||
// "math"
|
||||
// "os"
|
||||
// "path"
|
||||
)
|
||||
|
||||
// lea++博客平台
|
||||
type Lea struct {
|
||||
BaseController
|
||||
}
|
||||
|
||||
// 进入某个用户的博客
|
||||
func (c Lea) Index(tag, keywords string) revel.Result {
|
||||
c.RenderArgs["nav"] = "recommend"
|
||||
return c.p(tag, keywords, true)
|
||||
}
|
||||
|
||||
func (c Lea) Latest(tag, keywords string) revel.Result {
|
||||
c.RenderArgs["nav"] = "latest"
|
||||
return c.p(tag, keywords, false);
|
||||
}
|
||||
|
||||
func (c Lea) p(tag, keywords string, recommend bool) revel.Result {
|
||||
var tags = []string{}
|
||||
if recommend {
|
||||
tags = configService.GetGlobalArrayConfig("recommendTags")
|
||||
} else {
|
||||
tags = configService.GetGlobalArrayConfig("newTags")
|
||||
}
|
||||
// 如果不在所在的tag就不能搜索
|
||||
if !InArray(tags, tag) {
|
||||
tag = ""
|
||||
}
|
||||
c.RenderArgs["tag"] = tag
|
||||
|
||||
page := c.GetPage()
|
||||
pageInfo, blogs := blogService.ListAllBlogs(tag, keywords, recommend, page, 10, "UpdatedTime", false)
|
||||
|
||||
c.RenderArgs["pageInfo"] = pageInfo
|
||||
c.RenderArgs["blogs"] = blogs
|
||||
c.RenderArgs["tags"] = tags
|
||||
c.RenderArgs["keywords"] = keywords
|
||||
|
||||
return c.RenderTemplate("lea/index.html");
|
||||
}
|
51
app/controllers/admin/AdminBaseController.go
Normal file
51
app/controllers/admin/AdminBaseController.go
Normal file
@ -0,0 +1,51 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
// "github.com/revel/revel"
|
||||
// "gopkg.in/mgo.v2/bson"
|
||||
// "encoding/json"
|
||||
. "github.com/leanote/leanote/app/lea"
|
||||
"github.com/leanote/leanote/app/controllers"
|
||||
// "io/ioutil"
|
||||
// "fmt"
|
||||
// "math"
|
||||
// "strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// 公用Controller, 其它Controller继承它
|
||||
type AdminBaseController struct {
|
||||
controllers.BaseController // 不能用*BaseController
|
||||
}
|
||||
|
||||
// 得到sorterField 和 isAsc
|
||||
// okSorter = ['email', 'username']
|
||||
func (c AdminBaseController) getSorter(sorterField string, isAsc bool, okSorter []string) (string, bool){
|
||||
sorter := ""
|
||||
c.Params.Bind(&sorter, "sorter")
|
||||
if sorter == "" {
|
||||
return sorterField, isAsc;
|
||||
}
|
||||
|
||||
// sorter形式 email-up, email-down
|
||||
s2 := strings.Split(sorter, "-")
|
||||
if len(s2) != 2 {
|
||||
return sorterField, isAsc;
|
||||
}
|
||||
|
||||
// 必须是可用的sorter
|
||||
if okSorter != nil && len(okSorter) > 0 {
|
||||
if !InArray(okSorter, s2[0]) {
|
||||
return sorterField, isAsc;
|
||||
}
|
||||
}
|
||||
|
||||
sorterField = strings.Title(s2[0])
|
||||
if s2[1] == "up" {
|
||||
isAsc = true
|
||||
} else {
|
||||
isAsc = false
|
||||
}
|
||||
c.RenderArgs["sorter"] = sorter
|
||||
return sorterField, isAsc;
|
||||
}
|
30
app/controllers/admin/AdminBlogController.go
Normal file
30
app/controllers/admin/AdminBlogController.go
Normal file
@ -0,0 +1,30 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"github.com/revel/revel"
|
||||
// . "github.com/leanote/leanote/app/lea"
|
||||
"github.com/leanote/leanote/app/info"
|
||||
)
|
||||
|
||||
// admin 首页
|
||||
|
||||
type AdminBlog struct {
|
||||
AdminBaseController
|
||||
}
|
||||
|
||||
// admin 主页
|
||||
func (c AdminBlog) Index(sorter, keywords string) revel.Result {
|
||||
pageNumber := c.GetPage()
|
||||
sorterField, isAsc := c.getSorter("CreatedTime", false, []string{"title", "userId", "isRecommed", "createdTime"});
|
||||
pageInfo, blogs := blogService.ListAllBlogs("", keywords, false, pageNumber, userPageSize, sorterField, isAsc);
|
||||
c.RenderArgs["pageInfo"] = pageInfo
|
||||
c.RenderArgs["blogs"] = blogs
|
||||
c.RenderArgs["keywords"] = keywords
|
||||
return c.RenderTemplate("admin/blog/list.html");
|
||||
}
|
||||
|
||||
func (c AdminBlog) SetRecommend(noteId string, recommend bool) revel.Result {
|
||||
re := info.NewRe()
|
||||
re.Ok = blogService.SetRecommend(noteId, recommend);
|
||||
return c.RenderJson(re)
|
||||
}
|
25
app/controllers/admin/AdminController.go
Normal file
25
app/controllers/admin/AdminController.go
Normal file
@ -0,0 +1,25 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"github.com/revel/revel"
|
||||
)
|
||||
|
||||
// admin 首页
|
||||
|
||||
type Admin struct {
|
||||
AdminBaseController
|
||||
}
|
||||
|
||||
// admin 主页
|
||||
func (c Admin) Index() revel.Result {
|
||||
c.SetUserInfo()
|
||||
|
||||
c.RenderArgs["title"] = "leanote"
|
||||
c.SetLocale()
|
||||
|
||||
return c.RenderTemplate("admin/index.html");
|
||||
}
|
||||
|
||||
func (c Admin) GetView(view string) revel.Result {
|
||||
return c.RenderTemplate("admin/" + view);
|
||||
}
|
62
app/controllers/admin/AdminSettingController.go
Normal file
62
app/controllers/admin/AdminSettingController.go
Normal file
@ -0,0 +1,62 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"github.com/revel/revel"
|
||||
// . "github.com/leanote/leanote/app/lea"
|
||||
"github.com/leanote/leanote/app/info"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// admin 首页
|
||||
|
||||
type AdminSetting struct {
|
||||
AdminBaseController
|
||||
}
|
||||
|
||||
// email配置
|
||||
func (c AdminSetting) Email() revel.Result {
|
||||
return nil
|
||||
}
|
||||
|
||||
// blog标签设置
|
||||
func (c AdminSetting) Blog() revel.Result {
|
||||
recommendTags := configService.GetGlobalArrayConfig("recommendTags")
|
||||
newTags := configService.GetGlobalArrayConfig("newTags")
|
||||
c.RenderArgs["recommendTags"] = strings.Join(recommendTags, ",")
|
||||
c.RenderArgs["newTags"] = strings.Join(newTags, ",")
|
||||
return c.RenderTemplate("admin/setting/blog.html");
|
||||
}
|
||||
func (c AdminSetting) DoBlogTag(recommendTags, newTags string) revel.Result {
|
||||
re := info.NewRe()
|
||||
|
||||
re.Ok = configService.UpdateUserArrayConfig(c.GetUserId(), "recommendTags", strings.Split(recommendTags, ","))
|
||||
re.Ok = configService.UpdateUserArrayConfig(c.GetUserId(), "newTags", strings.Split(newTags, ","))
|
||||
|
||||
return c.RenderJson(re)
|
||||
}
|
||||
|
||||
// demo
|
||||
// blog标签设置
|
||||
func (c AdminSetting) Demo() revel.Result {
|
||||
c.RenderArgs["demoUsername"] = configService.GetGlobalStringConfig("demoUsername")
|
||||
c.RenderArgs["demoPassword"] = configService.GetGlobalStringConfig("demoPassword")
|
||||
return c.RenderTemplate("admin/setting/demo.html");
|
||||
}
|
||||
func (c AdminSetting) DoDemo(demoUsername, demoPassword string) revel.Result {
|
||||
re := info.NewRe()
|
||||
|
||||
userInfo := authService.Login(demoUsername, demoPassword)
|
||||
if userInfo.UserId == "" {
|
||||
re.Msg = "The User is Not Exists";
|
||||
return c.RenderJson(re)
|
||||
}
|
||||
|
||||
re.Ok = configService.UpdateUserStringConfig(c.GetUserId(), "demoUserId", userInfo.UserId.Hex())
|
||||
re.Ok = configService.UpdateUserStringConfig(c.GetUserId(), "demoUsername", demoUsername)
|
||||
re.Ok = configService.UpdateUserStringConfig(c.GetUserId(), "demoPassword", demoPassword)
|
||||
|
||||
return c.RenderJson(re)
|
||||
}
|
||||
|
||||
|
||||
|
28
app/controllers/admin/AdminUserController.go
Normal file
28
app/controllers/admin/AdminUserController.go
Normal file
@ -0,0 +1,28 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"github.com/revel/revel"
|
||||
// . "github.com/leanote/leanote/app/lea"
|
||||
)
|
||||
|
||||
// admin 首页
|
||||
|
||||
type AdminUser struct {
|
||||
AdminBaseController
|
||||
}
|
||||
|
||||
// admin 主页
|
||||
var userPageSize = 10
|
||||
func (c AdminUser) Index(sorter, keywords string) revel.Result {
|
||||
pageNumber := c.GetPage()
|
||||
sorterField, isAsc := c.getSorter("CreatedTime", false, []string{"email", "username", "verified", "createdTime"});
|
||||
pageInfo, users := userService.ListUsers(pageNumber, userPageSize, sorterField, isAsc, keywords);
|
||||
c.RenderArgs["pageInfo"] = pageInfo
|
||||
c.RenderArgs["users"] = users
|
||||
c.RenderArgs["keywords"] = keywords
|
||||
return c.RenderTemplate("admin/user/list.html");
|
||||
}
|
||||
|
||||
func (c AdminUser) Add() revel.Result {
|
||||
return c.RenderTemplate("admin/user/add.html");
|
||||
}
|
127
app/controllers/admin/init.go
Normal file
127
app/controllers/admin/init.go
Normal file
@ -0,0 +1,127 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"github.com/leanote/leanote/app/service"
|
||||
"github.com/leanote/leanote/app/info"
|
||||
// . "github.com/leanote/leanote/app/lea"
|
||||
"github.com/revel/revel"
|
||||
// "strings"
|
||||
)
|
||||
|
||||
var userService *service.UserService
|
||||
var noteService *service.NoteService
|
||||
var trashService *service.TrashService
|
||||
var notebookService *service.NotebookService
|
||||
var noteContentHistoryService *service.NoteContentHistoryService
|
||||
var authService *service.AuthService
|
||||
var shareService *service.ShareService
|
||||
var blogService *service.BlogService
|
||||
var tagService *service.TagService
|
||||
var pwdService *service.PwdService
|
||||
var tokenService *service.TokenService
|
||||
var suggestionService *service.SuggestionService
|
||||
var albumService *service.AlbumService
|
||||
var noteImageService *service.NoteImageService
|
||||
var fileService *service.FileService
|
||||
var attachService *service.AttachService
|
||||
var configService *service.ConfigService
|
||||
|
||||
var adminUsername = "admin"
|
||||
// 拦截器
|
||||
// 不需要拦截的url
|
||||
// Index 除了Note之外都不需要
|
||||
var commonUrl = map[string]map[string]bool{"Index": map[string]bool{"Index": true,
|
||||
"Login": true,
|
||||
"DoLogin": true,
|
||||
"Logout": true,
|
||||
"Register": true,
|
||||
"DoRegister": true,
|
||||
"FindPasswword": true,
|
||||
"DoFindPassword": true,
|
||||
"FindPassword2": true,
|
||||
"FindPasswordUpdate": true,
|
||||
"Suggestion": true,
|
||||
},
|
||||
"Blog": map[string]bool{"Index": true,
|
||||
"View": true,
|
||||
"AboutMe": true,
|
||||
"SearchBlog": true,
|
||||
},
|
||||
// 用户的激活与修改邮箱都不需要登录, 通过链接地址
|
||||
"User": map[string]bool{"UpdateEmail": true,
|
||||
"ActiveEmail":true,
|
||||
},
|
||||
"Oauth": map[string]bool{"GithubCallback": true},
|
||||
"File": map[string]bool{"OutputImage": true, "OutputFile": true},
|
||||
"Attach": map[string]bool{"Download": true, "DownloadAll": true},
|
||||
}
|
||||
func needValidate(controller, method string) bool {
|
||||
// 在里面
|
||||
if v, ok := commonUrl[controller]; ok {
|
||||
// 在commonUrl里
|
||||
if _, ok2 := v[method]; ok2 {
|
||||
return false
|
||||
}
|
||||
return true
|
||||
} else {
|
||||
// controller不在这里的, 肯定要验证
|
||||
return true;
|
||||
}
|
||||
}
|
||||
func AuthInterceptor(c *revel.Controller) revel.Result {
|
||||
// 全部变成首字大写
|
||||
/*
|
||||
var controller = strings.Title(c.Name)
|
||||
var method = strings.Title(c.MethodName)
|
||||
// 是否需要验证?
|
||||
if !needValidate(controller, method) {
|
||||
return nil
|
||||
}
|
||||
*/
|
||||
|
||||
// 验证是否已登录
|
||||
// 必须是管理员
|
||||
if username, ok := c.Session["Username"]; ok && username == adminUsername {
|
||||
return nil // 已登录
|
||||
}
|
||||
|
||||
// 没有登录, 判断是否是ajax操作
|
||||
if c.Request.Header.Get("X-Requested-With") == "XMLHttpRequest" {
|
||||
re := info.NewRe()
|
||||
re.Msg = "NOTLOGIN"
|
||||
return c.RenderJson(re)
|
||||
}
|
||||
|
||||
return c.Redirect("/login")
|
||||
}
|
||||
|
||||
// 最外层init.go调用
|
||||
// 获取service, 单例
|
||||
func InitService() {
|
||||
notebookService = service.NotebookS
|
||||
noteService = service.NoteS
|
||||
noteContentHistoryService = service.NoteContentHistoryS
|
||||
trashService = service.TrashS
|
||||
shareService = service.ShareS
|
||||
userService = service.UserS
|
||||
tagService = service.TagS
|
||||
blogService = service.BlogS
|
||||
tokenService = service.TokenS
|
||||
noteImageService = service.NoteImageS
|
||||
fileService = service.FileS
|
||||
albumService= service.AlbumS
|
||||
attachService = service.AttachS
|
||||
pwdService = service.PwdS
|
||||
suggestionService = service.SuggestionS
|
||||
authService = service.AuthS
|
||||
configService = service.ConfigS
|
||||
}
|
||||
|
||||
func init() {
|
||||
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Admin{})
|
||||
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &AdminSetting{})
|
||||
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &AdminUser{})
|
||||
revel.OnAppStart(func() {
|
||||
adminUsername, _ = revel.Config.String("adminUsername")
|
||||
})
|
||||
}
|
@ -24,6 +24,7 @@ var albumService *service.AlbumService
|
||||
var noteImageService *service.NoteImageService
|
||||
var fileService *service.FileService
|
||||
var attachService *service.AttachService
|
||||
var configService *service.ConfigService
|
||||
|
||||
var pageSize = 1000
|
||||
var defaultSortField = "UpdatedTime"
|
||||
@ -116,6 +117,7 @@ func InitService() {
|
||||
pwdService = service.PwdS
|
||||
suggestionService = service.SuggestionS
|
||||
authService = service.AuthS
|
||||
configService = service.ConfigS
|
||||
}
|
||||
|
||||
func init() {
|
||||
|
Reference in New Issue
Block a user