member i18n
This commit is contained in:
@ -4,6 +4,7 @@ import (
|
||||
"github.com/leanote/leanote/app/info"
|
||||
. "github.com/leanote/leanote/app/lea"
|
||||
"github.com/revel/revel"
|
||||
"strings"
|
||||
// "strconv"
|
||||
)
|
||||
|
||||
@ -127,6 +128,8 @@ func (c Auth) DoRegister(email, pwd, iu string) revel.Result {
|
||||
return c.RenderRe(re)
|
||||
}
|
||||
|
||||
email = strings.ToLower(email)
|
||||
|
||||
// 注册
|
||||
re.Ok, re.Msg = authService.Register(email, pwd, iu)
|
||||
|
||||
@ -141,6 +144,7 @@ func (c Auth) DoRegister(email, pwd, iu string) revel.Result {
|
||||
//--------
|
||||
// 找回密码
|
||||
func (c Auth) FindPassword() revel.Result {
|
||||
c.SetLocale()
|
||||
c.RenderArgs["title"] = c.Message("findPassword")
|
||||
c.RenderArgs["subTitle"] = c.Message("findPassword")
|
||||
return c.RenderTemplate("home/find_password.html")
|
||||
@ -154,6 +158,7 @@ func (c Auth) DoFindPassword(email string) revel.Result {
|
||||
|
||||
// 点击链接后, 先验证之
|
||||
func (c Auth) FindPassword2(token string) revel.Result {
|
||||
c.SetLocale()
|
||||
c.RenderArgs["title"] = c.Message("findPassword")
|
||||
c.RenderArgs["subTitle"] = c.Message("findPassword")
|
||||
if token == "" {
|
||||
|
@ -335,11 +335,11 @@ func (c Note) ToPdf(noteId, appKey string) revel.Result {
|
||||
// 虽然传了cookie但是这里还是不能得到userId, 所以还是通过appKey来验证之
|
||||
appKeyTrue, _ := revel.Config.String("app.secret")
|
||||
if appKeyTrue != appKey {
|
||||
return c.RenderText("error")
|
||||
return c.RenderText("auth error")
|
||||
}
|
||||
note := noteService.GetNoteById(noteId)
|
||||
if note.NoteId == "" {
|
||||
return c.RenderText("error")
|
||||
return c.RenderText("no note")
|
||||
}
|
||||
|
||||
noteUserId := note.UserId.Hex()
|
||||
@ -428,7 +428,7 @@ func (c Note) ExportPdf(noteId string) revel.Result {
|
||||
// 是否是有权限协作的
|
||||
if !note.IsBlog && !shareService.HasReadPerm(noteUserId, userId, noteId) {
|
||||
re.Msg = "No Perm"
|
||||
return c.RenderText("error")
|
||||
return c.RenderText("No Perm")
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -23,7 +23,7 @@ type Preview struct {
|
||||
// 得到要预览的主题绝对路径
|
||||
func (c Preview) getPreviewThemeAbsolutePath(themeId string) bool {
|
||||
if themeId != "" {
|
||||
c.Session["themeId"] = themeId // 存到session中, 下次的url就不能带了
|
||||
c.Session["themeId"] = themeId // 存到session中, 下次的url就不能带了, 待优化, 有时会取不到
|
||||
} else {
|
||||
themeId = c.Session["themeId"] // 直接从session中获取
|
||||
}
|
||||
|
@ -540,7 +540,6 @@ func (c ApiNote) GetHistories(noteId string) revel.Result {
|
||||
|
||||
// 0.2 新增
|
||||
// 导出成PDF
|
||||
// test localhost:9000/api/note/exportPdf?noteId=554f07bf05fcd15fa9000000&token=562211dc99c37ba6a7000001
|
||||
func (c ApiNote) ExportPdf(noteId string) revel.Result {
|
||||
re := info.NewApiRe()
|
||||
userId := c.getUserId()
|
||||
|
@ -74,7 +74,7 @@ func (c MemberBlog) Index(sorter, keywords string) revel.Result {
|
||||
userInfo := userService.GetUserInfo(userId)
|
||||
c.RenderArgs["userInfo"] = userInfo
|
||||
|
||||
c.RenderArgs["title"] = "Posts"
|
||||
c.RenderArgs["title"] = c.Message("Posts")
|
||||
pageNumber := c.GetPage()
|
||||
sorterField, isAsc := c.getSorter("CreatedTime", false, []string{"title", "urlTitle", "updatedTime", "publicTime", "createdTime"})
|
||||
pageInfo, blogs := blogService.ListAllBlogs(c.GetUserId(), "", keywords, false, pageNumber, userPageSize, sorterField, isAsc)
|
||||
@ -85,6 +85,8 @@ func (c MemberBlog) Index(sorter, keywords string) revel.Result {
|
||||
userAndBlog := userService.GetUserAndBlog(c.GetUserId())
|
||||
c.RenderArgs["userAndBlog"] = userAndBlog
|
||||
|
||||
c.common()
|
||||
|
||||
return c.RenderTemplate("member/blog/list.html")
|
||||
}
|
||||
|
||||
@ -97,7 +99,8 @@ func (c MemberBlog) UpdateBlogUrlTitle(noteId, urlTitle string) revel.Result {
|
||||
|
||||
// 修改笔记的urlTitle
|
||||
func (c MemberBlog) UpdateBlogAbstract(noteId string) revel.Result {
|
||||
c.RenderArgs["title"] = "Update Post Abstract"
|
||||
c.common()
|
||||
c.RenderArgs["title"] = c.Message("Update Post Abstract")
|
||||
note := noteService.GetNoteAndContent(noteId, c.GetUserId())
|
||||
if !note.Note.IsBlog {
|
||||
return c.E404()
|
||||
@ -107,7 +110,6 @@ func (c MemberBlog) UpdateBlogAbstract(noteId string) revel.Result {
|
||||
return c.RenderTemplate("member/blog/update_abstract.html")
|
||||
}
|
||||
func (c MemberBlog) DoUpdateBlogAbstract(noteId, imgSrc, desc, abstract string) revel.Result {
|
||||
|
||||
re := info.NewRe()
|
||||
re.Ok = blogService.UpateBlogAbstract(c.GetUserId(), noteId, imgSrc, desc, abstract)
|
||||
return c.RenderJson(re)
|
||||
@ -116,24 +118,24 @@ func (c MemberBlog) DoUpdateBlogAbstract(noteId, imgSrc, desc, abstract string)
|
||||
// 基本信息设置
|
||||
func (c MemberBlog) Base() revel.Result {
|
||||
c.common()
|
||||
c.RenderArgs["title"] = "Blog Base Info"
|
||||
c.RenderArgs["title"] = c.Message("Blog Base Info")
|
||||
return c.RenderTemplate("member/blog/base.html")
|
||||
}
|
||||
func (c MemberBlog) Comment() revel.Result {
|
||||
c.common()
|
||||
c.RenderArgs["title"] = "Comment"
|
||||
c.RenderArgs["title"] = c.Message("Comment")
|
||||
return c.RenderTemplate("member/blog/comment.html")
|
||||
}
|
||||
|
||||
func (c MemberBlog) Paging() revel.Result {
|
||||
c.common()
|
||||
c.RenderArgs["title"] = "Paging"
|
||||
c.RenderArgs["title"] = c.Message("Paging")
|
||||
return c.RenderTemplate("member/blog/paging.html")
|
||||
}
|
||||
|
||||
func (c MemberBlog) Cate() revel.Result {
|
||||
userBlog := c.common()
|
||||
c.RenderArgs["title"] = "Cate"
|
||||
c.RenderArgs["title"] = c.Message("Category")
|
||||
|
||||
notebooks := blogService.ListBlogNotebooks(c.GetUserId())
|
||||
notebooksMap := map[string]info.Notebook{}
|
||||
@ -190,10 +192,10 @@ func (c MemberBlog) DoAddOrUpdateSingle(singleId, title, content string) revel.R
|
||||
}
|
||||
func (c MemberBlog) AddOrUpdateSingle(singleId string) revel.Result {
|
||||
c.common()
|
||||
c.RenderArgs["title"] = "Add Single"
|
||||
c.RenderArgs["title"] = c.Message("Add Single")
|
||||
c.RenderArgs["singleId"] = singleId
|
||||
if singleId != "" {
|
||||
c.RenderArgs["title"] = "Update Single"
|
||||
c.RenderArgs["title"] = c.Message("Update Single")
|
||||
c.RenderArgs["single"] = blogService.GetSingle(singleId)
|
||||
}
|
||||
return c.RenderTemplate("member/blog/add_single.html")
|
||||
@ -219,7 +221,7 @@ func (c MemberBlog) UpdateSingleUrlTitle(singleId, urlTitle string) revel.Result
|
||||
|
||||
func (c MemberBlog) Single() revel.Result {
|
||||
c.common()
|
||||
c.RenderArgs["title"] = "Cate"
|
||||
c.RenderArgs["title"] = c.Message("Single")
|
||||
c.RenderArgs["singles"] = blogService.GetSingles(c.GetUserId())
|
||||
|
||||
return c.RenderTemplate("member/blog/single.html")
|
||||
@ -234,7 +236,7 @@ func (c MemberBlog) Theme() revel.Result {
|
||||
|
||||
c.RenderArgs["optionThemes"] = themeService.GetDefaultThemes()
|
||||
|
||||
c.RenderArgs["title"] = "Theme"
|
||||
c.RenderArgs["title"] = c.Message("Theme")
|
||||
return c.RenderTemplate("member/blog/theme.html")
|
||||
}
|
||||
|
||||
@ -251,7 +253,7 @@ func (c MemberBlog) UpdateTheme(themeId string, isNew int) revel.Result {
|
||||
}
|
||||
|
||||
c.common()
|
||||
c.RenderArgs["title"] = "Upate Theme"
|
||||
c.RenderArgs["title"] = c.Message("Update Theme")
|
||||
c.RenderArgs["isNew"] = isNew
|
||||
|
||||
// 先复制之
|
||||
@ -443,8 +445,8 @@ func (c MemberBlog) ImportTheme() revel.Result {
|
||||
if err != nil {
|
||||
re.Msg = fmt.Sprintf("%v", err)
|
||||
return c.RenderJson(re)
|
||||
|
||||
}
|
||||
|
||||
defer file.Close()
|
||||
// 生成上传路径
|
||||
userId := c.GetUserId()
|
||||
|
@ -14,7 +14,7 @@ type MemberGroup struct {
|
||||
func (c MemberGroup) Index() revel.Result {
|
||||
c.SetUserInfo()
|
||||
c.SetLocale()
|
||||
c.RenderArgs["title"] = "My Group"
|
||||
c.RenderArgs["title"] = c.Message("My Group")
|
||||
c.RenderArgs["groups"] = groupService.GetGroupsAndUsers(c.GetUserId())
|
||||
return c.RenderTemplate("member/group/index.html")
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ type MemberIndex struct {
|
||||
// admin 主页
|
||||
func (c MemberIndex) Index() revel.Result {
|
||||
c.SetUserInfo()
|
||||
c.RenderArgs["title"] = "Leanote Member Center"
|
||||
c.RenderArgs["title"] = c.Message("Leanote Member Center")
|
||||
|
||||
c.RenderArgs["countNote"] = noteService.CountNote(c.GetUserId())
|
||||
c.RenderArgs["countBlog"] = noteService.CountBlog(c.GetUserId())
|
||||
|
@ -13,28 +13,28 @@ type MemberUser struct {
|
||||
func (c MemberUser) Username() revel.Result {
|
||||
c.SetUserInfo()
|
||||
c.SetLocale()
|
||||
c.RenderArgs["title"] = "Username"
|
||||
c.RenderArgs["title"] = c.Message("Username")
|
||||
return c.RenderTemplate("member/user/username.html")
|
||||
}
|
||||
|
||||
func (c MemberUser) Email() revel.Result {
|
||||
c.SetUserInfo()
|
||||
c.SetLocale()
|
||||
c.RenderArgs["title"] = "Email"
|
||||
c.RenderArgs["title"] = c.Message("Email")
|
||||
return c.RenderTemplate("member/user/email.html")
|
||||
}
|
||||
|
||||
func (c MemberUser) Password() revel.Result {
|
||||
c.SetUserInfo()
|
||||
c.SetLocale()
|
||||
c.RenderArgs["title"] = "Password"
|
||||
c.RenderArgs["title"] = c.Message("Password")
|
||||
return c.RenderTemplate("member/user/password.html")
|
||||
}
|
||||
|
||||
func (c MemberUser) Avatar() revel.Result {
|
||||
c.SetUserInfo()
|
||||
c.SetLocale()
|
||||
c.RenderArgs["title"] = "Avatar"
|
||||
c.RenderArgs["title"] = c.Message("Avatar")
|
||||
c.RenderArgs["globalConfigs"] = configService.GetGlobalConfigForUser()
|
||||
return c.RenderTemplate("member/user/avatar.html")
|
||||
}
|
||||
|
@ -470,7 +470,8 @@ func (this *ShareService) GetShareNoteContent(noteId, myUserId, sharedUserId str
|
||||
// 或者, 其notebook共享了我
|
||||
// Log(this.HasSharedNote(noteId, myUserId))
|
||||
// Log(this.HasSharedNotebook(noteId, myUserId, sharedUserId))
|
||||
Log(this.HasReadPerm(sharedUserId, myUserId, noteId))
|
||||
// Log(this.HasReadPerm(sharedUserId, myUserId, noteId))
|
||||
|
||||
if this.HasReadPerm(sharedUserId, myUserId, noteId) {
|
||||
// if this.HasSharedNote(noteId, myUserId) || this.HasSharedNotebook(noteId, myUserId, sharedUserId) {
|
||||
db.Get(db.NoteContents, noteId, ¬eContent)
|
||||
|
@ -618,8 +618,6 @@ func (this *ThemeService) hasRound(vector [][]int, size int) (ok bool) {
|
||||
for i := 0; i < size; i++ {
|
||||
visited := make([]int, size)
|
||||
if this.hasRoundEach(vector, i, size, visited) {
|
||||
Log(">>")
|
||||
Log(i)
|
||||
return true
|
||||
}
|
||||
}
|
||||
@ -629,8 +627,6 @@ func (this *ThemeService) hasRound(vector [][]int, size int) (ok bool) {
|
||||
// 从每个节点出发, 判断是否有环
|
||||
func (this *ThemeService) hasRoundEach(vector [][]int, index int, size int, visited []int) (ok bool) {
|
||||
if visited[index] > 0 {
|
||||
Log("<")
|
||||
Log(index)
|
||||
return true
|
||||
}
|
||||
visited[index] = 1
|
||||
|
@ -28,8 +28,10 @@
|
||||
|
||||
<div class="form-group">
|
||||
<label for="content1">{{msg . "content"}}</label>
|
||||
<div id="popularToolbar"></div>
|
||||
<textarea id="content1" name="content">{{.single.Content}}</textarea>
|
||||
<div class="toolbar-content">
|
||||
<div id="popularToolbar" class="tool-bar"></div>
|
||||
<div id="content1" class="content-ctn" name="content">{{if .single}}{{.single.Content|raw}}{{end}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="panel-footer text-right bg-light lter">
|
||||
@ -40,28 +42,16 @@
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<style>
|
||||
.mce-btn.mce-active, .mce-btn.mce-active:hover {
|
||||
background-color: #FFFFFF;
|
||||
}
|
||||
.mce-btn {
|
||||
background-color: #FFFFFF;
|
||||
}
|
||||
</style>
|
||||
{{template "member/footer.html" .}}
|
||||
<script type="text/javascript" src="/tinymce/tinymce.js"></script>
|
||||
<script>
|
||||
var urlPrefix = "{{.siteUrl}}";
|
||||
var LeaAce = {nowIsInAce: function() {return false;}};
|
||||
var LeaAce = null;
|
||||
$(function() {
|
||||
tinymce.init({
|
||||
selector : "#content1",
|
||||
content_css : ["/css/editor/editor.css" ],
|
||||
theme : "leanote",
|
||||
theme: 'leanote',
|
||||
language : "{{.locale}}",
|
||||
height : 300,
|
||||
width : "100%",
|
||||
// skin : "custom",
|
||||
plugins : [
|
||||
"advlist autolink link lists charmap hr ",
|
||||
"searchreplace visualblocks visualchars tabfocus",
|
||||
@ -95,12 +85,12 @@ $(function() {
|
||||
ajaxPost("/member/blog/doAddOrUpdateSingle/", data, function(re) {
|
||||
if(reIsOk(re)) {
|
||||
// 添加成功后, 跳转之
|
||||
art.tips("Success")
|
||||
art.tips(getMsg("Success"));
|
||||
if(!data.pageId) {
|
||||
location.href = "/member/blog/single";
|
||||
}
|
||||
} else {
|
||||
art.alert(re.Msg || "error")
|
||||
art.alert(re.Msg || getMsg("Error"));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -69,7 +69,6 @@
|
||||
|
||||
</div>
|
||||
{{template "member/footer.html" .}}
|
||||
<script type="text/javascript" src="/tinymce/tinymce.min.js"></script>
|
||||
<script>
|
||||
var urlPrefix = "{{.siteUrl}}";
|
||||
$(function() {
|
||||
|
@ -1,5 +1,5 @@
|
||||
{{template "member/top.html" .}}
|
||||
<div class="m-b-md"> <h3 class="m-b-none">{{msg . "cate"}}</h3></div>
|
||||
<div class="m-b-md"> <h3 class="m-b-none">{{msg . "Category"}}</h3></div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-8">
|
||||
@ -46,9 +46,9 @@ $(function() {
|
||||
});
|
||||
ajaxPost("/member/blog/upateCateIds", {cateIds: ids}, function(re){
|
||||
if(reIsOk(re)) {
|
||||
art.tips("Success");
|
||||
art.tips(getMsg("Success"));
|
||||
} else {
|
||||
art.alert(re.Msg || "error");
|
||||
art.alert(re.Msg || getMsg("Error"));
|
||||
}
|
||||
});
|
||||
});
|
||||
@ -61,7 +61,7 @@ $(function() {
|
||||
if(reIsOk(re)) {
|
||||
$t.val(re.Item);
|
||||
} else {
|
||||
art.alert(re.Msg || "error");
|
||||
art.alert(re.Msg || getMsg("Error"));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -1,5 +1,5 @@
|
||||
{{template "member/top.html" .}}
|
||||
<div class="m-b-md"><h3 class="m-b-none">{{msg . "postList"}}</h3></div>
|
||||
<div class="m-b-md"><h3 class="m-b-none">{{msg . "Posts"}}</h3></div>
|
||||
<style>
|
||||
.url-title {
|
||||
width: 260px;
|
||||
@ -15,7 +15,7 @@
|
||||
<div class="input-group search-group">
|
||||
<input type="text" class="input-sm form-control" placeholder="{{msg . "title"}}" id="keywords" value="{{.keywords}}" />
|
||||
<span class="input-group-btn">
|
||||
<button class="btn btn-sm btn-default" type="button" data-url="/member/blog/index">Search</button>
|
||||
<button class="btn btn-sm btn-default" type="button" data-url="/member/blog/index">{{leaMsg $ "Search"}}</button>
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
@ -92,7 +92,7 @@
|
||||
{{end}}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="{{$.userAndBlog.PostUrl}}/{{$.urlTitle}}" class="post" target="_blank">{{.Title|raw}}</a>
|
||||
<a href="{{$.userAndBlog.PostUrl}}/{{$.urlTitle}}" class="post" target="_blank">{{.Title}}</a>
|
||||
</td>
|
||||
|
||||
<td>
|
||||
|
@ -1,5 +1,5 @@
|
||||
{{template "member/top.html" .}}
|
||||
<div class="m-b-md"> <h3 class="m-b-none">{{msg . "single"}}</h3></div>
|
||||
<div class="m-b-md"> <h3 class="m-b-none">{{msg . "Single"}}</h3></div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-8">
|
||||
@ -47,22 +47,22 @@ $(function() {
|
||||
});
|
||||
ajaxPost("/member/blog/sortSingles", {singleIds: ids}, function(re){
|
||||
if(reIsOk(re)) {
|
||||
art.tips("Success");
|
||||
art.tips(getMsg("Success"));
|
||||
} else {
|
||||
art.alert(re.Msg || "error");
|
||||
art.alert(re.Msg || getMsg("Error"));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$(".page-delete").click(function() {
|
||||
var singleId = $(this).data('id');
|
||||
art.confirm("Are you sure ?", function() {
|
||||
art.confirm(getMsg("Are you sure ?"), function() {
|
||||
ajaxPost("/member/blog/deleteSingle", {singleId: singleId}, function(re){
|
||||
if(reIsOk(re)) {
|
||||
art.tips("Success");
|
||||
art.tips(getMsg("Success"));
|
||||
location.reload();
|
||||
} else {
|
||||
art.alert(re.Msg || "error");
|
||||
art.alert(re.Msg || getMsg("Error"));
|
||||
}
|
||||
});
|
||||
});
|
||||
@ -76,7 +76,7 @@ $(function() {
|
||||
if(reIsOk(re)) {
|
||||
$t.val(re.Item);
|
||||
} else {
|
||||
art.alert(re.Msg || "error");
|
||||
art.alert(re.Msg || getMsg("Error"));
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -1,7 +1,7 @@
|
||||
{{template "member/top.html" .}}
|
||||
<div class="m-b-md clearfix">
|
||||
<h3 class="m-b-none">
|
||||
{{msg . "themeSet"}}
|
||||
{{msg . "theme"}}
|
||||
<small>
|
||||
(<a href="http://blog.leanote.com/post/545f1a5c380782565e000000" target="_blank">{{msg . "needHelp"}}</a>
|
||||
<a target="_blank" href="https://github.com/leanote/leanote/wiki/leanote-blog-theme-api">Leanote Blog Theme Api</a>)
|
||||
@ -138,7 +138,7 @@
|
||||
|
||||
</div>
|
||||
{{template "member/footer.html" .}}
|
||||
<script src="/js/require.js"></script>
|
||||
|
||||
<script>
|
||||
var urlPrefix = "{{.siteUrl}}";
|
||||
$(function() {
|
||||
@ -169,7 +169,7 @@ $(".btn-export").click(function() {
|
||||
$(".btn-delete").click(function() {
|
||||
var id = $(this).parent().data('id');
|
||||
var t = $(this);
|
||||
art.confirm("Are you sure ?", function() {
|
||||
art.confirm(getMsg("Are you sure ?"), function() {
|
||||
t.button("loading");
|
||||
ajaxPost("/member/blog/deleteTheme", {themeId: id}, function(re) {
|
||||
t.button("reset");
|
||||
@ -187,15 +187,15 @@ $(".btn-delete").click(function() {
|
||||
$(".btn-install").click(function() {
|
||||
var id = $(this).parent().data('id');
|
||||
var t = $(this);
|
||||
art.confirm("Are you sure ?", function() {
|
||||
art.confirm(getMsg("Are you sure to install it ?"), function() {
|
||||
t.button("loading");
|
||||
ajaxPost("/member/blog/installTheme", {themeId: id}, function(re) {
|
||||
t.button("reset");
|
||||
if(reIsOk(re)) {
|
||||
art.tips("Success");
|
||||
art.tips(getMsg("Success"));
|
||||
location.reload();
|
||||
} else {
|
||||
art.alert("Error");
|
||||
art.alert(getMsg("Error"));
|
||||
}
|
||||
});
|
||||
});
|
||||
@ -206,15 +206,15 @@ $(".btn-install").click(function() {
|
||||
$(".btn-public").click(function() {
|
||||
var id = $(this).parent().data('id');
|
||||
var t = $(this);
|
||||
art.confirm("Are you sure ?", function() {
|
||||
art.confirm(getMsg("Are you sure ?"), function() {
|
||||
t.button("loading");
|
||||
ajaxPost("/member/blog/publicTheme", {themeId: id}, function(re) {
|
||||
t.button("reset");
|
||||
if(reIsOk(re)) {
|
||||
art.tips("Success");
|
||||
art.tips(getMsg("Success"));
|
||||
location.reload();
|
||||
} else {
|
||||
art.alert("Error");
|
||||
art.alert(getMsg("Error"));
|
||||
}
|
||||
});
|
||||
});
|
||||
@ -222,19 +222,17 @@ $(".btn-public").click(function() {
|
||||
{{end}}
|
||||
|
||||
});
|
||||
</script>
|
||||
|
||||
<script src="/js/require.js"></script>
|
||||
<script>
|
||||
// 导入主题
|
||||
require.config({
|
||||
baseUrl: '/public',
|
||||
paths: {
|
||||
'import_theme': 'js/app/import_theme',
|
||||
'jquery.ui.widget': 'tinymce/plugins/leaui_image/public/js/jquery.ui.widget',
|
||||
'fileupload': '/tinymce/plugins/leaui_image/public/js/jquery.fileupload',
|
||||
'iframe-transport': '/tinymce/plugins/leaui_image/public/js/jquery.iframe-transport'
|
||||
'import_theme': 'member/js/import_theme',
|
||||
'fileupload': 'js/plugins/libs-min/fileupload',
|
||||
},
|
||||
shim: {
|
||||
'fileupload': {deps: ['jquery.ui.widget', 'iframe-transport']}
|
||||
}
|
||||
});
|
||||
$(function() {
|
||||
require(['import_theme'], function(import_theme) {});
|
||||
|
@ -7,38 +7,46 @@
|
||||
</style>
|
||||
|
||||
<div class="m-b-md"> <h3 class="m-b-none">
|
||||
{{.note.Title}} - 摘要设置
|
||||
{{.note.Title}} - {{msg $ "setAbstract"}}
|
||||
</h3>
|
||||
</div>
|
||||
|
||||
<link rel="stylesheet" href="/tinymce/skins/custom/skin.min.css" type="text/css">
|
||||
|
||||
<div class="row">
|
||||
<div class="col-sm-10">
|
||||
<form id="formData">
|
||||
<section class="panel panel-default">
|
||||
<div class="panel-body">
|
||||
以下内容设置后, 以后修改笔记时将不自动获取. 若将该文章取消为博客后, 以下内容会自动获取.
|
||||
|
||||
{{leaMsg . "Once the abstract has been updated, it will not set the abstract automatically other than you cancel it."}}
|
||||
|
||||
<hr />
|
||||
<div class="alert alert-danger" id="baseMsg" style="display: none"></div>
|
||||
<div class="form-group">
|
||||
|
||||
<div class="form-group" id="mainImg">
|
||||
<label>
|
||||
主图片
|
||||
<a class="btn btn-default btn-select-img">从笔记中自动获取下一张</a>
|
||||
{{leaMsg $ "Main Image"}}
|
||||
<a class="btn btn-default btn-select-img">
|
||||
{{leaMsg $ "Get next image as main image from content"}}
|
||||
</a>
|
||||
</label>
|
||||
<div>
|
||||
<div style="border: 2px dashed #ccc; padding: 5px;">
|
||||
<img src="{{.note.ImgSrc}}" class="img-src" id="imgSrc"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label>描述</label>
|
||||
<label>{{leaMsg $ "Description" }}</label>
|
||||
<textarea type="text" rows="6" class="form-control" id="desc" name="desc">{{.note.Desc}}</textarea>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="content1">摘要</label>
|
||||
<div id="popularToolbar"></div>
|
||||
<textarea id="content1" name="content">{{.note.Abstract}}</textarea>
|
||||
<label for="content1">{{leaMsg $ "Abstract"}}</label>
|
||||
<div class="toolbar-content">
|
||||
<div id="popularToolbar" class="tool-bar"></div>
|
||||
<div id="content1" class="content-ctn" name="content">{{raw .note.Abstract}}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="panel-footer text-right bg-light lter">
|
||||
@ -47,10 +55,15 @@
|
||||
|
||||
<div class="panel-body">
|
||||
<p>
|
||||
原文:
|
||||
{{leaMsg . "Raw Content"}}:
|
||||
<hr />
|
||||
</p>
|
||||
<div id="rawContent">
|
||||
{{if .note.IsMarkdown}}
|
||||
<pre>{{.note.Content|raw}}</pre>
|
||||
{{else}}
|
||||
{{.note.Content|raw}}
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@ -62,20 +75,18 @@
|
||||
<script type="text/javascript" src="/tinymce/tinymce.js"></script>
|
||||
<script>
|
||||
var UrlPrefix = "{{.siteUrl}}";
|
||||
var LeaAce = null;
|
||||
$(function() {
|
||||
tinymce.init({
|
||||
inline: true,
|
||||
selector : "#content1",
|
||||
content_css : [ "/css/bootstrap.css", "/css/editor/editor.css" ],
|
||||
skin : "custom",
|
||||
theme: 'leanote',
|
||||
language : "{{.locale}}",
|
||||
height : 300,
|
||||
width : "100%",
|
||||
skin : "custom",
|
||||
plugins : [
|
||||
"advlist autolink link leanote_image lists charmap hr ",
|
||||
"advlist autolink link lists charmap hr ",
|
||||
"searchreplace visualblocks visualchars tabfocus",
|
||||
"table contextmenu directionality textcolor paste fullpage textcolor"],
|
||||
toolbar1 : "formatselect |fontselect fontsizeselect| forecolor backcolor | bold italic underline strikethrough | bullist numlist",
|
||||
"table contextmenu directionality textcolor fullpage textcolor"],
|
||||
toolbar1 : "formatselect |fontselect fontsizeselect| forecolor backcolor | bold italic underline strikethrough | bullist numlist |",
|
||||
menubar : false,
|
||||
statusbar : false,
|
||||
font_formats : "Arial=arial,helvetica,sans-serif;"
|
||||
@ -108,19 +119,39 @@ $(function() {
|
||||
});
|
||||
});
|
||||
|
||||
// 选择主图
|
||||
var $imgs = $("#rawContent").find("img");
|
||||
var imgLen = $imgs.length;
|
||||
var imgSeq = 0;
|
||||
var $imgSrc = $("#imgSrc");
|
||||
$(".btn-select-img").click(function() {
|
||||
if(imgLen == 0) {
|
||||
return;
|
||||
var isMarkdown = {{$.note.IsMarkdown}};
|
||||
|
||||
var images = [];
|
||||
if (isMarkdown) {
|
||||
var content = $('#rawContent').html();
|
||||
var reg = /!\[.*?\]\((.*)\)/g;
|
||||
var ret = reg.exec(content);
|
||||
while(ret) {
|
||||
images.push(ret[1]);
|
||||
ret = reg.exec(content);
|
||||
}
|
||||
// console.log(images);
|
||||
}
|
||||
// 选择主图
|
||||
$("#rawContent").find("img").each(function () {
|
||||
if($(this).attr('src')) {
|
||||
images.push($(this).attr('src'));
|
||||
}
|
||||
});;
|
||||
var imgLen = images.length;
|
||||
var imgSeq = 0;
|
||||
$imgSrc = $('#imgSrc');
|
||||
|
||||
if (imgLen) {
|
||||
$(".btn-select-img").click(function() {
|
||||
imgSeq++;
|
||||
imgSeq = imgSeq % imgLen;
|
||||
$imgSrc.attr("src", $imgs.eq(imgSeq).attr("src"));
|
||||
$imgSrc.attr("src", images[imgSeq]);
|
||||
});
|
||||
}
|
||||
else {
|
||||
$(".btn-select-img").hide();
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
|
@ -11,8 +11,8 @@
|
||||
<a class="btn btn-default" href="{{$.siteUrl}}/preview?themeId={{.themeId}}" target="_blank"><span class="fa fa-eye"></span> {{msg . "preview"}}</a>
|
||||
|
||||
<small>
|
||||
(<a href="http://blog.leanote.com/post/545f1a5c380782565e000000" target="_blank">{{msg . "needHelp"}}</a>
|
||||
<a target="_blank" href="https://github.com/leanote/leanote/wiki/leanote-blog-theme-api">Leanote Blog Theme Api</a>)
|
||||
|
||||
<a target="_blank" href="https://github.com/leanote/leanote/wiki/leanote-blog-theme-api">{{msg . "needHelp"}} {{msg . "Leanote Blog Theme Api"}}</a>
|
||||
</small>
|
||||
</h3>
|
||||
</div>
|
||||
@ -49,7 +49,7 @@
|
||||
<header class="panel-heading">
|
||||
{{msg . "tplStyleScript"}}:
|
||||
</header>
|
||||
<div class="panel-body" style="height:430px;overflow: auto;">
|
||||
<div class="panel-body" style="<!--height:430px;-->overflow: auto;">
|
||||
|
||||
<div class="list-group bg-white file-list">
|
||||
{{range .myTpls}}
|
||||
@ -67,6 +67,7 @@
|
||||
</footer>
|
||||
</section>
|
||||
</div>
|
||||
|
||||
<div class="col-sm-8">
|
||||
<section class="panel panel-default">
|
||||
<header class="panel-heading">
|
||||
@ -74,7 +75,7 @@
|
||||
<span id="msg"></span>
|
||||
</header>
|
||||
<div class="panel-body">
|
||||
<div id="tplContent" class="form-control" style="width: 100%; height: 400px;"></div>
|
||||
<div id="tplContent" class="form-control" style="width: 100%; height: 500px;"></div>
|
||||
</div>
|
||||
<footer class="panel-footer text-right bg-light lter">
|
||||
<button type="submit" id="saveBtn" class="btn btn-success">{{msg . "save"}}</button>
|
||||
@ -107,7 +108,7 @@
|
||||
</div>
|
||||
|
||||
{{template "member/footer.html" .}}
|
||||
<script src="/public/libs/ace/ace.js" type="text/javascript"></script>
|
||||
<script src="/public/libs/ace/ace.js"></script>
|
||||
<script>
|
||||
var editor = ace.edit("tplContent");
|
||||
editor.setTheme("ace/theme/tomorrow");
|
||||
@ -118,6 +119,7 @@ var themeId = "{{.themeId}}";
|
||||
var themeBasePath = "/{{$.theme.Path}}";
|
||||
var theme = {
|
||||
cache: {}, // filename => content
|
||||
inited: {}, // filename => bool, 是否已初始化, 防止未加载完就切换到其它
|
||||
curTplO: $("#curTpl"),
|
||||
tplContentO: $("#tplContent"),
|
||||
saveBtnO: $("#saveBtn"),
|
||||
@ -153,10 +155,10 @@ var theme = {
|
||||
e.stopPropagation();
|
||||
var $a = $(this).closest("a");
|
||||
var file = $a.data('file');
|
||||
art.confirm("Are you sure to delete " + file + " ?", function() {
|
||||
art.confirm(getMsg("Are you sure to delete") + ' ' + file + " ?", function() {
|
||||
ajaxPost("/member/blog/deleteTpl", {themeId: themeId, filename: file}, function(re) {
|
||||
// if(reIsOk(re)) {
|
||||
art.tips("Success");
|
||||
art.tips(getMsg("Success"));
|
||||
$a.remove();
|
||||
if(self.curTpl == file) {
|
||||
$(".file-list a").eq(0).trigger("click");
|
||||
@ -173,18 +175,20 @@ var theme = {
|
||||
self.newFileO.click(function() {
|
||||
// 文件是否存在?
|
||||
|
||||
|
||||
art.prompt("Filename", function(file) {
|
||||
art.prompt(getMsg("Filename"), function(file) {
|
||||
if(!file) {
|
||||
return;
|
||||
}
|
||||
if($('[data-filename="' + file + '"]').length > 0) {
|
||||
art.alert('File exists');
|
||||
art.alert(getMsg('File exists'));
|
||||
return;
|
||||
}
|
||||
var t = $('<a href="#" class="list-group-item " data-file="' + file + '"> <i class="fa fa-remove icon-muted remove-file" title="delete file" ></i> <span class="filename" data-filename="' + file + '">' + file + '</span><span class="badge"></span></a>');
|
||||
var t = $('<a href="#" class="list-group-item " data-file="' + file + '"> <i class="fa fa-remove icon-muted remove-file" title="' + getMsg("Delete file") + '" ></i> <span class="filename" data-filename="' + file + '">' + file + '</span><span class="badge"></span></a>');
|
||||
$(".file-list").append(t);
|
||||
|
||||
self.cache[file] = "";
|
||||
self.inited[file] = true;
|
||||
|
||||
// trigger click, 选中之
|
||||
t.click();
|
||||
});
|
||||
@ -221,6 +225,12 @@ var theme = {
|
||||
}
|
||||
// 之前的内容是否有改动
|
||||
if(self.cache[filename] == content) {
|
||||
// console.log('content is same');
|
||||
return;
|
||||
}
|
||||
// 内容都没有加载进来
|
||||
if(!self.inited[filename]) {
|
||||
// console.log('not inited');
|
||||
return;
|
||||
}
|
||||
|
||||
@ -247,7 +257,7 @@ var theme = {
|
||||
renderContent: function(name, content) {
|
||||
var self = this;
|
||||
self.curTplO.html(name);
|
||||
self.curTpl = name; // 这里才设置
|
||||
// self.curTpl = name; // 这里才设置
|
||||
var lang = "html";
|
||||
if(name.indexOf(".js") > 0 || name.indexOf(".json") > 0) {
|
||||
lang = "javascript";
|
||||
@ -264,7 +274,7 @@ var theme = {
|
||||
renderTpl: function(name) {
|
||||
var self = this;
|
||||
var content = "";
|
||||
self.curTpl = ""; // 这里设置为空
|
||||
self.curTpl = name; // 这里设置为空
|
||||
if(self.cache[name] != undefined) {
|
||||
content = self.cache[name];
|
||||
self.renderContent(name, content);
|
||||
@ -273,7 +283,13 @@ var theme = {
|
||||
ajaxGet("/member/blog/getTplContent", {themeId: themeId, filename: name}, function(re){
|
||||
if(reIsOk(re)) {
|
||||
self.cache[name] = re.Item;
|
||||
self.inited[name] = true;
|
||||
// 以防点击过快, 响应不按顺序
|
||||
if (self.curTpl == name) {
|
||||
self.renderContent(name, re.Item);
|
||||
} else {
|
||||
alert(getMsg('Error'));
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
@ -287,10 +303,10 @@ var theme = {
|
||||
self.imageListO.on("click", ".delete-image", function(re) {
|
||||
var file = $(this).data('image');
|
||||
var t = this;
|
||||
art.confirm("Are you sure to delete it " + file + " ?", function() {
|
||||
art.confirm(getMsg("Are you sure to delete") + ' ' + file + " ?", function() {
|
||||
ajaxPost("/member/blog/deleteThemeImage", {themeId: themeId, filename: file}, function(re) {
|
||||
if(reIsOk(re)) {
|
||||
art.tips("Success");
|
||||
art.tips(getMsg("Success"));
|
||||
$(t).closest("li").remove();
|
||||
} else {
|
||||
art.alert(re.Msg);
|
||||
@ -302,7 +318,7 @@ var theme = {
|
||||
renderImages: function(images) {
|
||||
var self = this;
|
||||
if(!images || images.length == 0) {
|
||||
self.imageListO.html("无图片");
|
||||
self.imageListO.html(getMsg("No images"));
|
||||
return;
|
||||
}
|
||||
var html = "";
|
||||
@ -346,7 +362,7 @@ function uploadFinish(ret) {
|
||||
return;
|
||||
}
|
||||
// 上传出错
|
||||
art.alert("error");
|
||||
art.alert(getMsg("Error"));
|
||||
}
|
||||
</script>
|
||||
|
||||
|
@ -23,9 +23,11 @@ $(function() {
|
||||
|
||||
if(fullPath == "/member/index") {
|
||||
fullPath = "/member";
|
||||
} else if (fullPath == '/member/blog/updateTheme') {
|
||||
fullPath = '/member/blog/theme';
|
||||
}
|
||||
|
||||
$("#nav > li").removeClass("active");
|
||||
// alert(fullPath);
|
||||
// 自己
|
||||
var $thisLi = $('#nav a[href="' + fullPath + '"]').parent();
|
||||
$thisLi.addClass("active");
|
||||
|
@ -113,7 +113,7 @@ var group = {
|
||||
addGroupEvent: function() {
|
||||
var self = this;
|
||||
$('.btn-add-group').click(function() {
|
||||
ajaxPost("/member/group/addGroup", {title: "Group Title"}, function(re) {
|
||||
ajaxPost("/member/group/addGroup", {title: getMsg("Group Title")}, function(re) {
|
||||
if(reIsOk(re)) {
|
||||
var group = re.Item;
|
||||
self.groupsO.prepend(self.tGroupO.render(group))
|
||||
@ -136,7 +136,7 @@ var group = {
|
||||
var groupId = $(this).closest(".each-group").data("id");
|
||||
ajaxPost("/member/group/updateGroupTitle", {groupId: groupId, title: val}, function(re) {
|
||||
if(reIsOk(re)) {
|
||||
art.tips("Success")
|
||||
art.tips(getMsg("Success"));
|
||||
t.data('ever', val)
|
||||
}
|
||||
})
|
||||
@ -147,11 +147,11 @@ var group = {
|
||||
var self = this;
|
||||
self.groupsO.on("click", ".delete-group", function() {
|
||||
var t = $(this);
|
||||
art.confirm("Are you sure ?", function() {
|
||||
art.confirm(getMsg("Are you sure ?"), function() {
|
||||
var groupId = t.closest(".each-group").data("id");
|
||||
ajaxPost("/member/group/deleteGroup", {groupId: groupId}, function(re) {
|
||||
if(reIsOk(re)) {
|
||||
art.tips("Success");
|
||||
art.tips(getMsg("Success"));
|
||||
t.closest(".each-group").remove();
|
||||
} else {
|
||||
art.alert(re.Msg);
|
||||
@ -182,7 +182,7 @@ var group = {
|
||||
var p = t.closest("li");
|
||||
ajaxPost("/member/group/addUser", {groupId: groupId, email: email}, function(re) {
|
||||
if(reIsOk(re)) {
|
||||
art.tips("Success");
|
||||
art.tips(getMsg("Success"));
|
||||
var html = self.tUserO.render(re.Item)
|
||||
p.before(html);
|
||||
t.val("");
|
||||
@ -198,12 +198,12 @@ var group = {
|
||||
var self = this;
|
||||
self.groupsO.on("click", ".delete-user", function() {
|
||||
var t = $(this);
|
||||
art.confirm("Are you sure ?", function() {
|
||||
art.confirm(getMsg("Are you sure ?"), function() {
|
||||
var groupId = t.closest(".each-group").data("id");
|
||||
var userId = t.closest("li").data("id");
|
||||
ajaxPost("/member/group/deleteUser", {groupId: groupId, userId: userId}, function(re) {
|
||||
if(reIsOk(re)) {
|
||||
art.tips("Success");
|
||||
art.tips(getMsg("Success"));
|
||||
t.closest("li").remove();
|
||||
} else {
|
||||
art.alert(re.Msg);
|
||||
|
@ -1,4 +1,4 @@
|
||||
<nav class="nav-primary hidden-xs">
|
||||
<nav class="nav-primary">
|
||||
<ul class="nav" id="nav">
|
||||
|
||||
<li class="active">
|
||||
@ -34,7 +34,7 @@
|
||||
<li>
|
||||
<a href="/member/user/avatar">
|
||||
<span>
|
||||
{{msg . "avatar"}}
|
||||
{{msg . "Avatar"}}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
@ -42,7 +42,7 @@
|
||||
<li>
|
||||
<a href="/member/user/username">
|
||||
<span>
|
||||
{{msg . "username"}}
|
||||
{{msg . "Username"}}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
@ -50,14 +50,14 @@
|
||||
<li>
|
||||
<a href="/member/user/email">
|
||||
<span>
|
||||
{{msg . "email"}}
|
||||
{{msg . "Email"}}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/member/user/password">
|
||||
<span>
|
||||
{{msg . "password"}}
|
||||
{{msg . "Password"}}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
@ -85,7 +85,7 @@
|
||||
<li>
|
||||
<a href="/member/blog/index">
|
||||
<span>
|
||||
{{msg . "postList"}}
|
||||
{{msg . "Posts"}}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
@ -100,22 +100,21 @@
|
||||
<li>
|
||||
<a href="/member/blog/comment">
|
||||
<span>
|
||||
{{msg . "comment"}}
|
||||
{{msg . "Comment"}}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="/member/blog/cate">
|
||||
<span>
|
||||
{{msg . "cate"}}
|
||||
{{msg . "Category"}}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/member/blog/single">
|
||||
<span>
|
||||
{{msg . "single"}}
|
||||
{{msg . "Single"}}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
@ -129,7 +128,7 @@
|
||||
<li>
|
||||
<a href="/member/blog/theme">
|
||||
<span>
|
||||
{{msg . "theme"}}
|
||||
{{msg . "Theme"}}
|
||||
</span>
|
||||
</a>
|
||||
</li>
|
||||
|
@ -50,7 +50,7 @@
|
||||
<section>
|
||||
<section class="hbox stretch">
|
||||
<!-- .aside -->
|
||||
<aside class="bg-light lter b-r aside-md hidden-print hidden-xs" id="nav">
|
||||
<aside class="bg-light lter b-r aside-md hidden-print" id="nav">
|
||||
<section class="vbox">
|
||||
<!--
|
||||
<header class="header bg-primary lter text-center clearfix">
|
||||
|
@ -1,6 +1,6 @@
|
||||
{{template "member/top.html" .}}
|
||||
|
||||
<div class="m-b-md"> <h3 class="m-b-none">{{msg . "avatar"}}</h3></div>
|
||||
<div class="m-b-md"> <h3 class="m-b-none">{{msg . "Avatar"}}</h3></div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
{{template "member/top.html" .}}
|
||||
<div class="m-b-md"> <h3 class="m-b-none">{{msg . "email"}}</h3></div>
|
||||
<div class="m-b-md"> <h3 class="m-b-none">{{msg . "Email"}}</h3></div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
{{template "member/top.html" .}}
|
||||
<div class="m-b-md"> <h3 class="m-b-none">{{msg . "password"}}</h3></div>
|
||||
<div class="m-b-md"> <h3 class="m-b-none">{{msg . "Password"}}</h3></div>
|
||||
<div class="row">
|
||||
<div class="col-sm-8">
|
||||
<form id="formData">
|
||||
|
@ -1,5 +1,5 @@
|
||||
{{template "member/top.html" .}}
|
||||
<div class="m-b-md"> <h3 class="m-b-none">{{msg . "username"}}</h3></div>
|
||||
<div class="m-b-md"> <h3 class="m-b-none">{{msg . "Username"}}</h3></div>
|
||||
|
||||
<div class="row">
|
||||
|
||||
@ -9,7 +9,7 @@
|
||||
<div class="panel-body">
|
||||
<div class="alert alert-danger" id="usernameMsg" style="display: none"></div>
|
||||
<div class="form-group">
|
||||
<label>{{msg . "username"}}</label>
|
||||
<!-- <label>{{msg . "Username"}}</label> -->
|
||||
<input type="text" class="form-control" id="username"
|
||||
value="{{.userInfo.Username}}"
|
||||
data-rules='[
|
||||
|
Reference in New Issue
Block a user