member i18n

This commit is contained in:
lealife
2015-11-28 15:17:36 +08:00
parent bc0e09f222
commit b1f36dfbf1
26 changed files with 197 additions and 159 deletions

View File

@ -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 == "" {

View File

@ -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")
}
}

View File

@ -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中获取
}

View File

@ -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()

View File

@ -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()

View File

@ -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")
}

View File

@ -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())

View File

@ -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")
}

View File

@ -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, &noteContent)

View File

@ -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

View File

@ -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"));
}
});
});

View File

@ -69,7 +69,6 @@
</div>
{{template "member/footer.html" .}}
<script type="text/javascript" src="/tinymce/tinymce.min.js"></script>
<script>
var urlPrefix = "{{.siteUrl}}";
$(function() {

View File

@ -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"));
}
});
});

View File

@ -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>
@ -166,4 +166,4 @@ $(function() {
});
</script>
{{template "member/end.html" .}}
{{template "member/end.html" .}}

View File

@ -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"));
}
});
});

View File

@ -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,10 +138,10 @@
</div>
{{template "member/footer.html" .}}
<script src="/js/require.js"></script>
<script>
var urlPrefix = "{{.siteUrl}}";
$(function() {
$(function() {
// 使用主题
$(".btn-active").click(function() {
var id = $(this).parent().data('id');
@ -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) {});

View File

@ -7,50 +7,63 @@
</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">
<button type="submit" id="submitBtn" class="btn btn-success">{{msg . "submit"}}</button>
</footer>
<div class="panel-body">
<p>
原文:
{{leaMsg . "Raw Content"}}:
<hr />
</p>
<div id="rawContent">
{{.note.Content|raw}}
{{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);
}
imgSeq++;
imgSeq = imgSeq%imgLen;
$imgSrc.attr("src", $imgs.eq(imgSeq).attr("src"));
});
// 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", images[imgSeq]);
});
}
else {
$(".btn-select-img").hide();
}
});
</script>

View File

@ -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.renderContent(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 = "";
@ -324,7 +340,7 @@ var theme = {
});
},
}
$(function() {
$(function() {
theme.init();
$(window).keydown(function(e) {
if (e.keyCode == 83 && (e.ctrlKey || e.metaKey)) {
@ -346,7 +362,7 @@ function uploadFinish(ret) {
return;
}
// 上传出错
art.alert("error");
art.alert(getMsg("Error"));
}
</script>

View File

@ -23,13 +23,15 @@ $(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");
// 父也active
$thisLi.parent().parent().addClass('active');
});
</script>
</script>

View File

@ -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);

View File

@ -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>
@ -148,4 +147,4 @@
</a>
</li>
</ul>
</nav>
</nav>

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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">

View File

@ -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='[