release v0.1
This commit is contained in:
1 parent
a17cc19820
commit
298f7bc1d6
977 files changed
+224453
-2
No files matched your search
@@ -16,9 +16,18 @@ To be honest, our inspiration comes from evernote, and we use evenote to manage
|
|||||||
* ......
|
* ......
|
||||||
|
|
||||||
## How to use it
|
## How to use it
|
||||||
Leanote build with golang(revel) and mongodb. so you must install mongodb at first.
|
|
||||||
|
## Download leanote
|
||||||
|
|
||||||
|
Leanote v0.1 has released.
|
||||||
|
|
||||||
|
* linux: https://github.com/leanote/leanote/releases/download/0.1/leanote-linux-v0.1.bin.tar.gz
|
||||||
|
* mac ox: https://github.com/leanote/leanote/releases/download/0.1/leanote-mac-v0.1.tar.gz
|
||||||
|
|
||||||
### Install mongodb
|
### Install mongodb
|
||||||
|
|
||||||
|
Leanote build with golang(revel) and mongodb. so you must install mongodb at first.
|
||||||
|
|
||||||
For more tips please go https://github.com/leanote/leanote/wiki/mongodb-in-leanote
|
For more tips please go https://github.com/leanote/leanote/wiki/mongodb-in-leanote
|
||||||
|
|
||||||
Go http://www.mongodb.org to download and install it.
|
Go http://www.mongodb.org to download and install it.
|
||||||
@@ -40,7 +49,7 @@ user2 username: admin, password: abc123
|
|||||||
|
|
||||||
### Configuration
|
### Configuration
|
||||||
|
|
||||||
Copy path_to_leante/conf/app-default.conf to path_to_leante/conf/app.conf, the options contains:
|
Modify path_to_leanote/conf/app.conf, the configuration options contains:
|
||||||
|
|
||||||
``mongodb`` **required**
|
``mongodb`` **required**
|
||||||
|
|
||||||
@@ -101,6 +110,7 @@ go get github.com/leanote/leanote/app
|
|||||||
|
|
||||||
### Build/Run leanote via revel
|
### Build/Run leanote via revel
|
||||||
|
|
||||||
|
cp conf/app.conf-default to conf/app.conf
|
||||||
cp conf/routes-default to conf/routes
|
cp conf/routes-default to conf/routes
|
||||||
|
|
||||||
Now you can modify leanote source and build/run with revel
|
Now you can modify leanote source and build/run with revel
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{{set . "title" "Home"}}
|
||||||
|
{{template "header.html" .}}
|
||||||
|
|
||||||
|
<header class="hero-unit" style="background-color:#A9F16C">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="hero-text">
|
||||||
|
<h1>It works!</h1>
|
||||||
|
<p></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="span6">
|
||||||
|
{{template "flash.html" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "footer.html" .}}
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
{{template "Blog/header.html" .}}
|
||||||
|
|
||||||
|
<div id="postsContainer">
|
||||||
|
<div id="posts">
|
||||||
|
<div class="each-post">
|
||||||
|
<div class="title">
|
||||||
|
关于我
|
||||||
|
</div>
|
||||||
|
<div class="created-time">
|
||||||
|
</div>
|
||||||
|
<div class="desc">
|
||||||
|
{{.userBlog.AboutMe | raw}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- comment -->
|
||||||
|
{{template "blog/comment.html" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "Blog/footer.html" .}}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{{if .userBlog.CanComment}}
|
||||||
|
<div id="disqus_thread"></div>
|
||||||
|
<!-- comment -->
|
||||||
|
<script type="text/javascript">
|
||||||
|
/* * * CONFIGURATION VARIABLES: EDIT BEFORE PASTING INTO YOUR WEBPAGE * * */
|
||||||
|
var disqus_shortname = '{{.userBlog.DisqusId}}'; // required: replace example with your forum shortname
|
||||||
|
var disqus_identifier = '{{.userBlog.UserId.Hex}}/{{.blog.NoteId.Hex}}/{{.blog.Title}}'; // 博客链接
|
||||||
|
|
||||||
|
/* * * DON'T EDIT BELOW THIS LINE * * */
|
||||||
|
(function() {
|
||||||
|
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
|
||||||
|
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
|
||||||
|
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
|
||||||
|
})();
|
||||||
|
</script>
|
||||||
|
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
|
||||||
|
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
|
||||||
|
{{end}}
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
<div id="footerContainer">
|
||||||
|
{{$userId := .userBlog.UserId.Hex}}
|
||||||
|
<div class="container" id="footer">
|
||||||
|
<div class="col-md-4">
|
||||||
|
<h3>导航</h3>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/blog/{{$userId}}">首页</a></li>
|
||||||
|
{{range .notebooks}}
|
||||||
|
<li>
|
||||||
|
<a href="/blog/{{$userId}}/{{.NotebookId.Hex}}">{{.Title}}</a>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
<li><a href="/blog/aboutMe/{{$userId}}">关于我</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<h3>最近发表</h3>
|
||||||
|
<ul>
|
||||||
|
{{range .recentBlogs}}
|
||||||
|
<li title="{{.Title}}"><a href="/blog/view/{{.NoteId.Hex}}/">{{.Title}}</a></li>
|
||||||
|
{{end}}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<h3>快速链接</h3>
|
||||||
|
<ul>
|
||||||
|
<li><a href="/note">我的笔记</a></li>
|
||||||
|
<li><a href="/login">登录</a></li>
|
||||||
|
<li><a href="http://leanote.com" target="_blank">leanote</a></li>
|
||||||
|
<li><a href="https://github.com/leanote/leanote" target="_blank">leanote github</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src="/js/jquery-1.9.0.min.js"></script>
|
||||||
|
<script src="/js/bootstrap-min.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(function() {
|
||||||
|
/*
|
||||||
|
$("#searchInput").click(function() {
|
||||||
|
$("#search").width("130px");
|
||||||
|
$("#searchInput").width("100px");
|
||||||
|
});
|
||||||
|
$("#searchInput").blur(function() {
|
||||||
|
$("#search").width(0);
|
||||||
|
$("#searchInput").width(0);
|
||||||
|
});
|
||||||
|
*/
|
||||||
|
});
|
||||||
|
// 搜索
|
||||||
|
function search(e) {
|
||||||
|
var key = $("#searchInput").val();
|
||||||
|
if(!key) {
|
||||||
|
location.href = "/blog/" + UserInfo.Username;
|
||||||
|
} else {
|
||||||
|
var tpl = '<form action="/blog/searchBlog/' + UserInfo.Username +'" method="get">';
|
||||||
|
tpl += '<input name="key" value="' + key + '" />';
|
||||||
|
tpl += "</form";
|
||||||
|
$(tpl).submit();
|
||||||
|
}
|
||||||
|
}␍</script>
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="keywords" content="leanote,leanote.com">
|
||||||
|
<meta name="description" content="leanote, your own cloud note!">
|
||||||
|
<meta name="author" content="leanote">
|
||||||
|
|
||||||
|
<title>{{.title}}</title>
|
||||||
|
<!-- Bootstrap core CSS -->
|
||||||
|
<link href="/css/bootstrap.css" rel="stylesheet">
|
||||||
|
<link href="/css/font-awesome-4.0.3/css/font-awesome.css" rel="stylesheet">
|
||||||
|
<link id="styleLink" href="/css/blog/{{if .userBlog.Style}}{{.userBlog.Style}}{{else}}blog_default{{end}}.css" rel="stylesheet">
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function log(o) {
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<style>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="headerAndNav" >
|
||||||
|
<div id="headerContainer" class="container">
|
||||||
|
<!-- 头部可放博客名, 导航 -->
|
||||||
|
<div id="header">
|
||||||
|
{{$userId := .userBlog.UserId.Hex}} <!-- 可不要了 -->
|
||||||
|
{{$username := .userInfo.Username}}
|
||||||
|
<h1>
|
||||||
|
<a href="/blog/{{$username}}" id="logo">
|
||||||
|
{{if .userBlog.Logo}}
|
||||||
|
<img src="{{.userBlog.Logo}}" title="{{.userBlog.Title}}"/>
|
||||||
|
{{else}}
|
||||||
|
{{.userBlog.Title | raw}}
|
||||||
|
{{end}}
|
||||||
|
</a>
|
||||||
|
</h1>
|
||||||
|
<div id="blogDesc">
|
||||||
|
{{.userBlog.SubTitle | raw}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Static navbar -->
|
||||||
|
<div class="navbar navbar-default">
|
||||||
|
<div class="container">
|
||||||
|
<div class="navbar-header">
|
||||||
|
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
|
||||||
|
<span class="sr-only">Toggle navigation</span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
<span class="icon-bar"></span>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="navbar-collapse collapse">
|
||||||
|
<ul class="nav navbar-nav">
|
||||||
|
{{$navNotebookId := .notebookId}}
|
||||||
|
<li class="{{if .index}}active{{end}}"><a href="/blog/{{$username}}">首页</a></li>
|
||||||
|
{{range .notebooks}}
|
||||||
|
{{$notebookId := .NotebookId.Hex}}
|
||||||
|
<li class="{{if eq $navNotebookId $notebookId}}active{{else}}{{end}}">
|
||||||
|
<a href="/blog/{{$username}}/{{$notebookId}}"
|
||||||
|
>{{.Title}}</a>
|
||||||
|
</li>
|
||||||
|
{{end}}
|
||||||
|
<li class="{{if .aboutMe}}active{{end}}"><a href="/blog/aboutMe/{{$username}}">关于我</a></li>
|
||||||
|
{{if .isMe}}
|
||||||
|
<li class="{{if .set}}active{{end}}"><a href="/blog/set" >博客设置</a></li>
|
||||||
|
<li><a href="/note" >{{msg . "myNote"}}</a></li>
|
||||||
|
{{end}}
|
||||||
|
</ul>
|
||||||
|
<form class="navbar-form navbar-right" id="search" onsubmit="search(event);return false;">
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-addon" id="searchIcon" onclick="search(event);"><i class="fa fa-search"></i></span>
|
||||||
|
<input type="text" placeholder="search" id="searchInput" class="form-control" value="{{.key}}">
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div><!--/.nav-collapse -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var UserInfo = {UserId: "{{$userId}}", Email: "{{.userInfo.Email}}", Username: "{{.userInfo.Username}}"};
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
<link href="/public/mdeditor/editor/google-code-prettify/prettify.css" type="text/css" rel="stylesheet">
|
||||||
|
<script src="/public/mdeditor/editor/google-code-prettify/prettify.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$("pre").addClass("prettyprint linenums");
|
||||||
|
prettyPrint();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<script type="text/javascript" src="/js/syntaxhighlighter/scripts/shCore.js"></script>
|
||||||
|
<link href="/js/syntaxhighlighter/styles/shCore.css" rel="stylesheet" type="text/css" />
|
||||||
|
<link href="/js/syntaxhighlighter/styles/shThemeDefault.css" rel="stylesheet" type="text/css" />
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(function () {
|
||||||
|
var pathPrefix = "/js/syntaxhighlighter/scripts/";
|
||||||
|
var map = {
|
||||||
|
"brush: jscript": "shBrushJScript.js",
|
||||||
|
"brush: c#": "shBrushCSharp.js",
|
||||||
|
"brush: css": "shBrushCss.js",
|
||||||
|
"brush: cpp": "shBrushCpp.js",
|
||||||
|
"brush: java": "shBrushJava.js",
|
||||||
|
"brush: xml": "shBrushXml.js",
|
||||||
|
"brush: php": "shBrushPhp.js",
|
||||||
|
"brush: perl": "shBrushPerl.js",
|
||||||
|
"brush: python": "shBrushPython.js",
|
||||||
|
"brush: ruby": "shBrushRuby.js",
|
||||||
|
"brush: sql": "shBrushSql.js"}
|
||||||
|
var needLoadCount = 0;
|
||||||
|
var alreadyLoadCount = 0;
|
||||||
|
$('pre[class]').each(function() {
|
||||||
|
var brush = $(this).attr("class");
|
||||||
|
var js = map[brush]
|
||||||
|
if (js) {
|
||||||
|
needLoadCount++;
|
||||||
|
map[brush] = null; // 不要重复加载
|
||||||
|
loadJS(pathPrefix + js, function () {
|
||||||
|
alreadyLoadCount++;
|
||||||
|
if (alreadyLoadCount == needLoadCount) {
|
||||||
|
//setTimeout(function() {
|
||||||
|
SyntaxHighlighter.highlight();
|
||||||
|
//}, 500);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function loadJS(url, callback) {
|
||||||
|
$.getScript(url, function() {
|
||||||
|
callback();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
function loadJS(url, callback, charset) {
|
||||||
|
var script = document.createElement('script');
|
||||||
|
script.onload = script.onreadystatechange = function () {
|
||||||
|
if (script && script.readyState && /^(?!(?:loaded|complete)$)/.test(script.readyState)) return;
|
||||||
|
script.onload = script.onreadystatechange = null;
|
||||||
|
script.src = '';
|
||||||
|
script.parentNode.removeChild(script);
|
||||||
|
script = null;
|
||||||
|
if (callback) callback();
|
||||||
|
};
|
||||||
|
script.charset = charset || document.charset || document.characterSet;
|
||||||
|
script.src = url;
|
||||||
|
try { document.getElementsByTagName("head")[0].appendChild(script); } catch (e) { }
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
</script>
|
||||||
|
-->
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
{{template "Blog/header.html" .}}
|
||||||
|
|
||||||
|
<div id="postsContainer">
|
||||||
|
<div class="container">
|
||||||
|
{{if .notebookId}}
|
||||||
|
<h2>分类 {{.notebook.Title}}</h2>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
<div id="posts">
|
||||||
|
{{range .blogs}}
|
||||||
|
<div class="each-post">
|
||||||
|
<div class="title">
|
||||||
|
<a href="/blog/view/{{.NoteId.Hex}}" title="全文">
|
||||||
|
{{.Title}}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="created-time">
|
||||||
|
<i class="fa fa-bookmark-o" style="color: #666"></i>
|
||||||
|
{{if .Tags}}
|
||||||
|
{{blogTags .Tags}}
|
||||||
|
{{else}}
|
||||||
|
无
|
||||||
|
{{end}}
|
||||||
|
|
|
||||||
|
<i class="fa fa-calendar" style="color: #666"></i> 更新 {{.UpdatedTime | datetime}} |
|
||||||
|
<i class="fa fa-calendar" style="color: #666"></i> 创建 {{.CreatedTime | datetime}}
|
||||||
|
</div>
|
||||||
|
<div class="desc">
|
||||||
|
{{.Content | raw}}
|
||||||
|
</div>
|
||||||
|
<a class="more" href="/blog/view/{{.NoteId.Hex}}" title="更多">More...</a>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
<!-- 分页 -->
|
||||||
|
<ul class="pager">
|
||||||
|
{{page .userInfo.Username .notebookId .page .pageSize .count}}
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "Blog/footer.html" .}}
|
||||||
|
{{template "Blog/highlight.html"}}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
{{template "Blog/header.html" .}}
|
||||||
|
|
||||||
|
<div id="postsContainer">
|
||||||
|
<div class="container">
|
||||||
|
<h2>搜索 {{.key}} </h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="posts">
|
||||||
|
{{range .blogs}}
|
||||||
|
<div class="each-post">
|
||||||
|
<div class="title">
|
||||||
|
<a href="/blog/view/{{.NoteId.Hex}}" title="全文">
|
||||||
|
{{.Title}}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="created-time">
|
||||||
|
<i class="fa fa-bookmark-o" style="color: #666"></i>
|
||||||
|
{{if .Tags}}
|
||||||
|
{{blogTags .Tags}}
|
||||||
|
{{else}}
|
||||||
|
无
|
||||||
|
{{end}}
|
||||||
|
|
|
||||||
|
<i class="fa fa-calendar" style="color: #666"></i> 更新 {{.UpdatedTime | datetime}} |
|
||||||
|
<i class="fa fa-calendar" style="color: #666"></i> 创建 {{.CreatedTime | datetime}}
|
||||||
|
</div>
|
||||||
|
<div class="desc">
|
||||||
|
{{.Content | raw}}
|
||||||
|
</div>
|
||||||
|
<a class="more" href="/blog/view/{{.NoteId.Hex}}" title="更多">More...</a>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{if not .blogs }}
|
||||||
|
<div class="each-post">
|
||||||
|
无
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "Blog/footer.html" .}}
|
||||||
|
{{template "Blog/highlight.html"}}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,301 @@
|
|||||||
|
{{template "Blog/header.html" .}}
|
||||||
|
|
||||||
|
<!-- -->
|
||||||
|
<link rel="stylesheet" href="/tinymce/skins/custom/skin.min.css"
|
||||||
|
type="text/css">
|
||||||
|
<style>
|
||||||
|
.tab-pane {
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div id="postsContainer">
|
||||||
|
<div id="posts">
|
||||||
|
<ul id="myTab" class="nav nav-tabs">
|
||||||
|
<li class="active"><a href="#baseInfo" data-toggle="tab">基本设置</a></li>
|
||||||
|
<li class=""><a href="#commentInfo" data-toggle="tab">评论设置</a></li>
|
||||||
|
<li class=""><a href="#styleInfo" data-toggle="tab">主题设置</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<!-- Tab panes -->
|
||||||
|
<div class="tab-content">
|
||||||
|
<div class="tab-pane" id="styleInfo">
|
||||||
|
<form class="form-horizontal" role="form">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="Style" class="col-sm-2 control-label">主题</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<label><input type="radio" name="Style"
|
||||||
|
value="blog_default"
|
||||||
|
{{if not .userBlog.Style}}
|
||||||
|
checked="checked"
|
||||||
|
{{else}}
|
||||||
|
{{if eq .userBlog.Style "blog_default"}}
|
||||||
|
checked="checked"
|
||||||
|
{{end}}
|
||||||
|
{{end}}>
|
||||||
|
默认 </label>
|
||||||
|
<label><input type="radio" name="Style"
|
||||||
|
value="blog_daqi"
|
||||||
|
{{if eq .userBlog.Style "blog_daqi"}}checked="checked"{{end}}>
|
||||||
|
大气</label>
|
||||||
|
<label><input type="radio" name="Style"
|
||||||
|
value="blog_left_fixed"
|
||||||
|
{{if eq .userBlog.Style "blog_left_fixed"}}checked="checked"{{end}}>
|
||||||
|
左侧导航固定</label>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="col-sm-offset-2 col-sm-10">
|
||||||
|
<button class="btn btn-success">保存</button>
|
||||||
|
<span class="msg"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane" id="commentInfo">
|
||||||
|
<form class="form-horizontal" role="form">
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="subTitle" class="col-sm-2 control-label">开启评论</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="checkbox" id="CanComment" name="CanComment"
|
||||||
|
{{if .userBlog.CanComment}}checked="checked"{{end}} >
|
||||||
|
<br />
|
||||||
|
leanote采用 <a href="http://disqus.com" target="_blank">Disqus</a>
|
||||||
|
作为评论系统
|
||||||
|
<div id="disqusSet">
|
||||||
|
<label for="DisqusId">Disqus Id</label> <input type="text"
|
||||||
|
class="form-control" style="display: inline; width: 50%"
|
||||||
|
id="DisqusId" name="DisqusId"
|
||||||
|
value="{{if .userBlog.DisqusId}}{{.userBlog.DisqusId}}{{else}}leanote{{end}}">
|
||||||
|
<br /> (请填写您申请的Disqus唯一url前缀, 建议您申请Disqus帐号, 这样可以自己管理评论.
|
||||||
|
或使用leanote的默认Disqus Id. <a target="_blank"
|
||||||
|
href="/blog/view/52db8463e01c530ef8000001">需要帮助?</a>)
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="col-sm-offset-2 col-sm-10">
|
||||||
|
<button class="btn btn-success">保存</button>
|
||||||
|
<span class="msg"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane active" id="baseInfo">
|
||||||
|
<div class="form-horizontal" role="form" id="userBlogForm">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-2 control-label"></label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<div class="alert alert-success" id="msg"
|
||||||
|
style="display: none; margin-bottom: 3px;"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="title" class="col-sm-2 control-label">博客名称</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="text" class="form-control" id="Title" name="Title"
|
||||||
|
placeholder="比如: leanote的博客"
|
||||||
|
value="{{if .userBlog.Title}}{{.userBlog.Title}}{{else}}{{.userInfo.Email}} 的博客{{end}}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="logo" class="col-sm-2 control-label">博客Logo</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="hidden" name="Logo" id="Logo"
|
||||||
|
value="{{.userBlog.Logo}}" />
|
||||||
|
<form id="formLogo" action="/file/uploadBlogLogo" method="post"
|
||||||
|
enctype="multipart/form-data" target="logoTarget"
|
||||||
|
onsubmit="inProgress()">
|
||||||
|
<input type="file" class="form-control" id="logo2" name="file"
|
||||||
|
onChange='$("#formLogo").submit();' /> 上传logo将显示logo(替代博客标题)
|
||||||
|
<div id="logoImg"
|
||||||
|
{{if .userBlog.Logo }}
|
||||||
|
{{else}}
|
||||||
|
style="display: none"{{end}}
|
||||||
|
>
|
||||||
|
<img src="{{.userBlog.Logo}}" style="height: 40px" /> <a
|
||||||
|
href="#" id="deleteLogo">删除</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<iframe id="logoTarget" name="logoTarget" src="#"
|
||||||
|
style="display: none"></iframe>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="subTitle" class="col-sm-2 control-label">博客描述</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<input type="text" class="form-control" id="SubTitle"
|
||||||
|
name="SubTitle" value="{{.userBlog.SubTitle}}"
|
||||||
|
placeholder="比如: leanote, 不只是笔记">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="aboutMe" class="col-sm-2 control-label"></label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<div id="popularToolbar"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="aboutMe" class="col-sm-2 control-label">关于我</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<textarea id="AboutMe" name="AboutMe">{{.userBlog.AboutMe}}</textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="form-group">
|
||||||
|
<div class="col-sm-offset-2 col-sm-10">
|
||||||
|
<button class="btn btn-success">保存</button>
|
||||||
|
<span class="msg"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "Blog/footer.html" .}}
|
||||||
|
|
||||||
|
<script src="/js/common-min.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="/tinymce/tinymce.min.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(function() {
|
||||||
|
tinymce.init({
|
||||||
|
selector : "#AboutMe",
|
||||||
|
content_css : [ "/css/bootstrap.css", "/css/editor.css" ],
|
||||||
|
skin : "custom",
|
||||||
|
language : "zh_CN",
|
||||||
|
height : 300,
|
||||||
|
width : "100%",
|
||||||
|
plugins : [
|
||||||
|
"advlist autolink link image lists charmap hr ",
|
||||||
|
"searchreplace visualblocks visualchars code tabfocus",
|
||||||
|
"table contextmenu directionality textcolor paste fullpage textcolor" ],
|
||||||
|
|
||||||
|
toolbar1 : "formatselect fontselect fontsizeselect | forecolor backcolor | bold italic underline strikethrough | image | bullist numlist | alignleft aligncenter alignright alignjustify",
|
||||||
|
toolbar2 : "outdent indent blockquote | link unlink | table | hr removeformat | subscript superscript | visualchars visualblocks | searchreplace | code",
|
||||||
|
|
||||||
|
menubar : false,
|
||||||
|
toolbar_items_size : 'small',
|
||||||
|
statusbar : false,
|
||||||
|
font_formats : "Arial=arial,helvetica,sans-serif;"
|
||||||
|
+ "Arial Black=arial black,avant garde;"
|
||||||
|
+ "Times New Roman=times new roman,times;"
|
||||||
|
+ "Courier New=courier new,courier;"
|
||||||
|
+ "Tahoma=tahoma,arial,helvetica,sans-serif;"
|
||||||
|
+ "Verdana=verdana,geneva;" + "宋体=SimSun;"
|
||||||
|
+ "新宋体=NSimSun;" + "黑体=SimHei;"
|
||||||
|
+ "微软雅黑=Microsoft YaHei",
|
||||||
|
block_formats : "Header 1=h1;Header 2=h2;Header 3=h3; Header 4=h4;Pre=pre;Paragraph=p"
|
||||||
|
});
|
||||||
|
$("#deleteLogo").click(function() {
|
||||||
|
$("#Logo").val("");
|
||||||
|
$("#logoImg").hide();
|
||||||
|
});
|
||||||
|
|
||||||
|
$("#CanComment").click(function() {
|
||||||
|
if ($(this).is(":checked")) {
|
||||||
|
$("#disqusSet").show();
|
||||||
|
} else {
|
||||||
|
$("#disqusSet").hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
$("#CanComment").trigger("click").trigger("click"); // 恶心的想法
|
||||||
|
|
||||||
|
|
||||||
|
// 基本设置
|
||||||
|
$("#baseInfo .btn-success").click(function() {
|
||||||
|
var data = {
|
||||||
|
Title : $("#Title").val(),
|
||||||
|
SubTitle : $("#SubTitle").val(),
|
||||||
|
Logo : $("#Logo").val(),
|
||||||
|
AboutMe : getEditorContent()
|
||||||
|
}
|
||||||
|
|
||||||
|
post("/blog/setUserBlogBase", data, function(ret) {
|
||||||
|
showMsg2($("#baseInfo .msg"), "保存成功", 2000);
|
||||||
|
$("#blogDesc").html(data.SubTitle);
|
||||||
|
$("#logo").html(data.Title);
|
||||||
|
if(data.Logo) {
|
||||||
|
$("#logo").html(t('<img src="?" />', data.Logo));
|
||||||
|
}
|
||||||
|
}, this);
|
||||||
|
});
|
||||||
|
// 评论
|
||||||
|
$("#commentInfo .btn-success").click(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var data = {
|
||||||
|
CanComment : $("#CanComment").is(":checked"),
|
||||||
|
DisqusId : $("#DisqusId").val(),
|
||||||
|
}
|
||||||
|
post("/blog/setUserBlogComment", data, function(ret) {
|
||||||
|
showMsg2($("#commentInfo .msg"), "保存成功", 2000);
|
||||||
|
}, this);
|
||||||
|
});
|
||||||
|
// 主题
|
||||||
|
$("#styleInfo .btn-success").click(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var data = {
|
||||||
|
Style : $("input[name='Style']:checked").val()
|
||||||
|
}
|
||||||
|
post("/blog/setUserBlogStyle", data, function(ret) {
|
||||||
|
showMsg2($("#styleInfo .msg"), "保存成功", 2000);
|
||||||
|
}, this);
|
||||||
|
});
|
||||||
|
$("input[name='Style']").click(function() {
|
||||||
|
$("#styleLink").attr("href", "/css/blog/" + $(this).val() + ".css");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
function inProgress() {
|
||||||
|
}
|
||||||
|
|
||||||
|
// filename, result, resultCode
|
||||||
|
function uploadFinish(ret) {
|
||||||
|
if (ret) {
|
||||||
|
if (ret.resultCode == '1') {
|
||||||
|
$("#logoImg img").attr("src", ret.filename).parent().show();
|
||||||
|
$("#Logo").val(ret.filename);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
alert(ret.result);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// 上传出错
|
||||||
|
alert("上传出错");
|
||||||
|
}
|
||||||
|
|
||||||
|
function submit() {
|
||||||
|
var tpl = '<form action="/blog/setBlog" method="post"><input name="Title" value="?" />';
|
||||||
|
tpl += '<input name="SubTitle" value="?" />';
|
||||||
|
tpl += '<input name="Logo" value="?" />';
|
||||||
|
tpl += '<input name="CanComment" value="?" />';
|
||||||
|
tpl += '<input name="DisqusId" value="?" />';
|
||||||
|
tpl += '<input name="Style" value="?" />';
|
||||||
|
tpl += '<textarea name="AboutMe">?</textarea>';
|
||||||
|
tpl += "</form";
|
||||||
|
var data = {
|
||||||
|
Title : $("#Title").val(),
|
||||||
|
SubTitle : $("#SubTitle").val(),
|
||||||
|
Logo : $("#Logo").val(),
|
||||||
|
AboutMe : getEditorContent(),
|
||||||
|
CanComment : $("#CanComment").is(":checked"),
|
||||||
|
DisqusId : $("#DisqusId").val(),
|
||||||
|
Style : $("input[name='Style']:checked").val()
|
||||||
|
}
|
||||||
|
if (!data.DisqusId) {
|
||||||
|
data.DisqusId = "leanote";
|
||||||
|
}
|
||||||
|
$(t(tpl, data.Title, data.SubTitle, data.Logo,
|
||||||
|
data.CanComment, data.DisqusId, data.Style,
|
||||||
|
data.AboutMe)).submit();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,139 @@
|
|||||||
|
{{template "Blog/header.html" .}}
|
||||||
|
|
||||||
|
<!-- -->
|
||||||
|
<div id="postsContainer">
|
||||||
|
<div id="posts">
|
||||||
|
<div class="each-post">
|
||||||
|
<div class="title">
|
||||||
|
{{.blog.Title}}
|
||||||
|
</div>
|
||||||
|
<div class="created-time">
|
||||||
|
<i class="fa fa-bookmark-o" style="color: #666"></i>
|
||||||
|
{{if .blog.Tags}}
|
||||||
|
{{blogTags .blog.Tags}}
|
||||||
|
{{else}}
|
||||||
|
无
|
||||||
|
{{end}}
|
||||||
|
|
|
||||||
|
<i class="fa fa-calendar" style="color: #666"></i> 更新 {{.blog.UpdatedTime | datetime}} |
|
||||||
|
<i class="fa fa-calendar" style="color: #666"></i> 创建 {{.blog.CreatedTime | datetime}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="desc" id="content">
|
||||||
|
{{if .blog.IsMarkdown }}
|
||||||
|
<div id="markdownContent" style="display: none">
|
||||||
|
<!-- 用textarea装html, 防止得到的值失真 -->
|
||||||
|
<textarea>
|
||||||
|
{{.blog.Content | raw}}
|
||||||
|
</textarea>
|
||||||
|
</div>
|
||||||
|
<div style="padding: 20px; text-align: center">
|
||||||
|
<img src="/images/loading-32.gif" />
|
||||||
|
</div>
|
||||||
|
{{else}}
|
||||||
|
{{.blog.Content | raw}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- comment -->
|
||||||
|
{{template "blog/comment.html" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
{{template "Blog/footer.html" .}}
|
||||||
|
{{template "Blog/highlight.html"}}
|
||||||
|
|
||||||
|
<!-- Nav -->
|
||||||
|
<style>
|
||||||
|
#blogNav {
|
||||||
|
display: none;
|
||||||
|
background-color: #fff;
|
||||||
|
opacity: 0.7;
|
||||||
|
position: fixed;
|
||||||
|
z-index: 10;
|
||||||
|
padding: 3px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
#blogNavContent {
|
||||||
|
overflow-y: auto;
|
||||||
|
max-height: 250px;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
#blogNavNav {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
#blogNav a {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
#blogNav:hover {
|
||||||
|
opacity: 0.9;
|
||||||
|
}
|
||||||
|
#blogNav a:hover {
|
||||||
|
color: #0fb264;
|
||||||
|
}
|
||||||
|
#blogNav ul {
|
||||||
|
padding-left: 20px;
|
||||||
|
}
|
||||||
|
#blogNav ul .nav-h1 {
|
||||||
|
}
|
||||||
|
#blogNav ul .nav-h2 {
|
||||||
|
margin-left: 20px;
|
||||||
|
}
|
||||||
|
#blogNav ul .nav-h3 {
|
||||||
|
margin-left: 30px;
|
||||||
|
}
|
||||||
|
#blogNav ul .nav-h4 {
|
||||||
|
margin-left: 40px;
|
||||||
|
}
|
||||||
|
#blogNav ul .nav-h5 {
|
||||||
|
margin-left: 50px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<div id="blogNav">
|
||||||
|
<div id="blogNavNav">
|
||||||
|
<i class="fa fa-align-justify" title="文档导航"></i>
|
||||||
|
<span>{{msg . "nav"}}</span>
|
||||||
|
</div>
|
||||||
|
<div id="blogNavContent" style="max-width: 200px">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src="/public/js/app/blog/nav.js"></script>
|
||||||
|
|
||||||
|
{{if .blog.IsMarkdown }}
|
||||||
|
<script src="/public/mdeditor/editor/google-code-prettify/prettify.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/pagedown/Markdown.Converter.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/pagedown/Markdown.Sanitizer.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/pagedown/Markdown.Editor.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/pagedown/local/Markdown.local.zh.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/Markdown.Extra.js"></script>
|
||||||
|
|
||||||
|
<!--mathjax-->
|
||||||
|
<script type="text/x-mathjax-config">
|
||||||
|
MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ["\\(","\\)"]], processEscapes: true }, messageStyle: "none"});
|
||||||
|
</script>
|
||||||
|
<script src="/public/mdeditor/editor/mathJax.js"></script>
|
||||||
|
<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||||
|
<script>
|
||||||
|
var content = $.trim($("#markdownContent textarea").val());
|
||||||
|
|
||||||
|
// $("#markdownContent").html("");
|
||||||
|
var converter = Markdown.getSanitizingConverter();
|
||||||
|
Markdown.Extra.init(converter, {extensions: ["tables", "fenced_code_gfm", "def_list"]});
|
||||||
|
var html = converter.makeHtml(content);
|
||||||
|
$("#content").html(html);
|
||||||
|
$("pre").addClass("prettyprint linenums");
|
||||||
|
prettyPrint();
|
||||||
|
MathJax.Hub.Queue(["Typeset",MathJax.Hub,"wmd-preview"]);
|
||||||
|
|
||||||
|
initNav();
|
||||||
|
</script>
|
||||||
|
{{else}}
|
||||||
|
<script>
|
||||||
|
$(function() {
|
||||||
|
initNav();
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
{{end}}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh">
|
||||||
|
<head>
|
||||||
|
<title>404</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<style type="text/css">
|
||||||
|
html, body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: Helvetica, Arial, Sans;
|
||||||
|
background: #EEEEEE;
|
||||||
|
}
|
||||||
|
.block {
|
||||||
|
padding: 20px;
|
||||||
|
border-bottom: 1px solid #aaa;
|
||||||
|
}
|
||||||
|
#header h1 {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 28px;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
#more {
|
||||||
|
color: #666;
|
||||||
|
font-size: 80%;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
#header {
|
||||||
|
background: #FFFFCC;
|
||||||
|
}
|
||||||
|
#header p {
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
#routes {
|
||||||
|
background: #f6f6f6;
|
||||||
|
}
|
||||||
|
#routes h2 {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 18px;
|
||||||
|
margin: 0 0 10px 0;
|
||||||
|
}
|
||||||
|
#routes ol {
|
||||||
|
|
||||||
|
}
|
||||||
|
#routes li {
|
||||||
|
font-size: 14px;
|
||||||
|
font-family: monospace;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div id="header" class="block">
|
||||||
|
{{with .Error}}
|
||||||
|
<h1>
|
||||||
|
{{.Title}}
|
||||||
|
</h1>
|
||||||
|
<p>
|
||||||
|
{{.Description}}
|
||||||
|
</p>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
<div id="routes" class="block">
|
||||||
|
<h2>These routes have been tried, in this order :</h2>
|
||||||
|
<ol>
|
||||||
|
{{range .Router.Routes}}
|
||||||
|
<li>{{pad .Method 10}}{{pad .Path 50}}{{.Action}}</li>
|
||||||
|
{{end}}
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{{if eq .RunMode "dev"}}
|
||||||
|
{{template "errors/404-dev.html" .}}
|
||||||
|
{{else}}
|
||||||
|
{{template "home/header_box.html" .}}
|
||||||
|
|
||||||
|
<section id="box">
|
||||||
|
<div>
|
||||||
|
<h1>error-404</h1>
|
||||||
|
<form class="form-inline" id="boxForm">
|
||||||
|
This page cann't found.
|
||||||
|
<br />
|
||||||
|
<a href="javascript:history.go(-1)">Back</a>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
{{end}}
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
<style type="text/css">
|
||||||
|
html, body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: Helvetica, Arial, Sans;
|
||||||
|
background: #EEEEEE;
|
||||||
|
}
|
||||||
|
.block {
|
||||||
|
padding: 20px;
|
||||||
|
border-bottom: 1px solid #aaa;
|
||||||
|
}
|
||||||
|
#header h1 {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 28px;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
#more {
|
||||||
|
color: #666;
|
||||||
|
font-size: 80%;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
#header {
|
||||||
|
background: #fcd2da;
|
||||||
|
}
|
||||||
|
#header p {
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
#source {
|
||||||
|
background: #f6f6f6;
|
||||||
|
}
|
||||||
|
#source h2 {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 18px;
|
||||||
|
margin: 0 0 10px 0;
|
||||||
|
}
|
||||||
|
#source .lineNumber {
|
||||||
|
float: left;
|
||||||
|
display: block;
|
||||||
|
width: 40px;
|
||||||
|
text-align: right;
|
||||||
|
margin-right: 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
font-family: monospace;
|
||||||
|
background: #333;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
#source .line {
|
||||||
|
clear: both;
|
||||||
|
color: #333;
|
||||||
|
margin-bottom: 1px;
|
||||||
|
}
|
||||||
|
#source pre {
|
||||||
|
font-size: 14px;
|
||||||
|
margin: 0;
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
#source .error {
|
||||||
|
color: #c00 !important;
|
||||||
|
}
|
||||||
|
#source .error .lineNumber {
|
||||||
|
background: #c00;
|
||||||
|
}
|
||||||
|
#source a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
#source a:hover * {
|
||||||
|
cursor: pointer !important;
|
||||||
|
}
|
||||||
|
#source a:hover pre {
|
||||||
|
background: #FAFFCF !important;
|
||||||
|
}
|
||||||
|
#source em {
|
||||||
|
font-style: normal;
|
||||||
|
text-decoration: underline;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
#source strong {
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{{with .Error}}
|
||||||
|
<div id="header" class="block">
|
||||||
|
<h1>
|
||||||
|
{{.Title}}
|
||||||
|
</h1>
|
||||||
|
<p>
|
||||||
|
{{if .SourceType}}
|
||||||
|
The {{.SourceType}} <strong>{{.Path}}</strong> does not compile: <strong>{{.Description}}</strong>
|
||||||
|
{{else}}
|
||||||
|
{{.Description}}
|
||||||
|
{{end}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{{if .Path}}
|
||||||
|
<div id="source" class="block">
|
||||||
|
<h2>In {{.Path}}
|
||||||
|
{{if .Line}}
|
||||||
|
(around {{if .Line}}line {{.Line}}{{end}}{{if .Column}} column {{.Column}}{{end}})
|
||||||
|
{{end}}
|
||||||
|
</h2>
|
||||||
|
{{range .ContextSource}}
|
||||||
|
<div class="line {{if .IsError}}error{{end}}">
|
||||||
|
<span class="lineNumber">{{.Line}}:</span>
|
||||||
|
<pre>{{.Source}}</pre>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
{{if .MetaError}}
|
||||||
|
<div id="source" class="block">
|
||||||
|
<h2>Additionally, an error occurred while handling this error.</h2>
|
||||||
|
<div class="line error">
|
||||||
|
{{.MetaError}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{{if eq .RunMode "dev"}}
|
||||||
|
{{template "errors/500-dev.html" .}}
|
||||||
|
{{else}}
|
||||||
|
{{template "home/header_box.html" .}}
|
||||||
|
|
||||||
|
<section id="box">
|
||||||
|
<div>
|
||||||
|
<h1>error-500</h1>
|
||||||
|
<form class="form-inline" id="boxForm">
|
||||||
|
Sorry, we got a error.
|
||||||
|
<br />
|
||||||
|
<a href="javascript:history.go(-1)">Back</a>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
{{end}}
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<title>图片上传结果</title>
|
||||||
|
<script language="javascript" type="text/javascript">
|
||||||
|
window.parent.window.uploadFinish({
|
||||||
|
filename:'{{.fileUrlPath}}',
|
||||||
|
result: '{{.resultMsg}}',
|
||||||
|
resultCode: '{{.resultCode}}'
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,14 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh">
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<script type="text/javascript">
|
||||||
|
window.parent.window.leanoteImagesDialog.uploadFinish({
|
||||||
|
filename:'{{.fileUrlPath}}',
|
||||||
|
result: '{{.resultMsg}}',
|
||||||
|
resultCode: '{{.resultCode}}'
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
{{template "home/header_box.html" .}}
|
||||||
|
|
||||||
|
<style>
|
||||||
|
</style>
|
||||||
|
<section id="box">
|
||||||
|
<div>
|
||||||
|
<h1>leanote | {{msg . "findPassword"}}</h1>
|
||||||
|
<form class="form-inline" id="boxForm">
|
||||||
|
<div class="alert alert-danger" id="loginMsg"></div>
|
||||||
|
<table style="width: 100%">
|
||||||
|
<tr>
|
||||||
|
<td style="width: 110px"><label for="email">{{msg . "email"}}</label>
|
||||||
|
<input type="text" class="form-control" id="email" name="email" value="{{.email}}"> </td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<button id="loginBtn" class="btn btn-success" style="width: 100%">{{msg . "findPassword"}}</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
<div id="quickLinks">
|
||||||
|
<a href="/login">{{msg . "login"}}</a>
|
||||||
|
|
||||||
|
<a href="/index">{{msg . "home"}}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<script src="/js/jquery-1.9.0.min.js"></script>
|
||||||
|
<script src="/js/bootstrap.js"></script>
|
||||||
|
<script src="/js/common.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(function() {
|
||||||
|
$("#email").focus();
|
||||||
|
if($("#email").val()) {
|
||||||
|
$("#pwd").focus();
|
||||||
|
}
|
||||||
|
function showMsg(msg, id) {
|
||||||
|
$("#loginMsg").html(msg).show();
|
||||||
|
if(id) {
|
||||||
|
$("#" + id).focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function hideMsg() {
|
||||||
|
$("#loginMsg").hide();
|
||||||
|
}
|
||||||
|
$("#loginBtn").click(function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
var email = $("#email").val();
|
||||||
|
if(!email) {
|
||||||
|
showMsg("{{msg . "inputEmail"}}", "email");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
var myreg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
|
||||||
|
if(!myreg.test(email)) {
|
||||||
|
showMsg("{{msg . "wrongEmail"}}", "email");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#loginBtn").html("{{msg . "ing"}}...").addClass("disabled");
|
||||||
|
// hideMsg();
|
||||||
|
|
||||||
|
$.post("/doFindPassword", {email: email}, function(e) {
|
||||||
|
$("#loginBtn").html("{{msg . "findPassword"}}").removeClass("disabled");
|
||||||
|
if(e.Ok) {
|
||||||
|
var msg = "{{msg . "findPasswordSendEmailOver"}}";
|
||||||
|
var loginAddress = getEmailLoginAddress(email);
|
||||||
|
if(loginAddress) {
|
||||||
|
msg += ' <a target="_blank" href="' + loginAddress + '">{{msg . "checkEmai"}}</a>';
|
||||||
|
}
|
||||||
|
$("#loginMsg").html(msg).show().removeClass("alert-danger").addClass("alert-success");
|
||||||
|
} else {
|
||||||
|
showMsg(e.Msg, "email");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
{{template "home/header_box.html" .}}
|
||||||
|
<section id="box">
|
||||||
|
<div>
|
||||||
|
<h1>leanote | {{msg . "updatePassword"}}</h1>
|
||||||
|
<form class="form-inline" id="boxForm">
|
||||||
|
<div class="form-group">
|
||||||
|
</div>
|
||||||
|
<div class="alert alert-danger" id="loginMsg"> </div>
|
||||||
|
|
||||||
|
<table style="width: 100%">
|
||||||
|
<tr>
|
||||||
|
<td style="width: 350px"><label for="email">{{msg . "email"}}</label>
|
||||||
|
<br />
|
||||||
|
{{.findPwd.Email}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="pwd">{{msg . "password"}}</label>
|
||||||
|
<input type="password" class="form-control" id="pwd" name="pwd">
|
||||||
|
{{msg . "passwordTips"}}
|
||||||
|
</td>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="pwd2">{{msg . "password2"}}</label>
|
||||||
|
<input type="password" class="form-control" id="pwd2" name="pwd2">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<button id="loginBtn" class="btn btn-success" style="width: 100%">{{msg . "updatePassword"}}</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<script src="/js/jquery-1.9.0.min.js"></script>
|
||||||
|
<script src="/js/bootstrap.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
|
||||||
|
$(function() {
|
||||||
|
$("#pwd").focus();
|
||||||
|
function showMsg(msg, id) {
|
||||||
|
$("#loginMsg").html(msg).show();
|
||||||
|
if(id) {
|
||||||
|
$("#" + id).focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function hideMsg() {
|
||||||
|
$("#loginMsg").hide();
|
||||||
|
}
|
||||||
|
$("#loginBtn").click(function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
var pwd = $("#pwd").val();
|
||||||
|
var pwd2 = $("#pwd2").val();
|
||||||
|
|
||||||
|
if(!pwd) {
|
||||||
|
showMsg("{{msg . "inputPassword"}}", "pwd");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if(pwd.length < 6) {
|
||||||
|
showMsg("{{msg . "notGoodPassword"}}", "pwd");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!pwd2) {
|
||||||
|
showMsg("{{msg . "inputPassword2"}}", "pwd2");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if(pwd != pwd2) {
|
||||||
|
showMsg("{{msg . "confirmPassword"}}", "pwd2");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#loginBtn").html("{{msg . "ing"}}...").addClass("disabled");
|
||||||
|
// hideMsg();
|
||||||
|
|
||||||
|
$.post("/findPasswordUpdate", {pwd: pwd, token: "{{.findPwd.Token}}"}, function(e) {
|
||||||
|
$("#loginBtn").html("{{msg . "updatePassword"}}").removeClass("disabled");
|
||||||
|
if(e.Ok) {
|
||||||
|
$("#loginBtn").html("{{msg . "updatePasswordSuccessRedirectToLogin"}}");
|
||||||
|
location.href = "/login?email={{.findPwd.Email}}";
|
||||||
|
} else {
|
||||||
|
showMsg(e.Msg, "pwd");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{{template "home/header_box.html" .}}
|
||||||
|
|
||||||
|
<section id="box">
|
||||||
|
<div>
|
||||||
|
<h1>leanote {{msg . "findPassword"}} - {{msg . "findPasswordTimeout"}}</h1>
|
||||||
|
<form class="form-inline" id="boxForm">
|
||||||
|
<div class="alert alert-danger" id="loginMsg" style="display: block">
|
||||||
|
{{msg . "findPasswordTimeout"}}, <a href="/findPassword">{{msg . "reFindPassword"}}</a>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<div id="quickLinks">
|
||||||
|
<a href="/login">{{msg . "login"}}</a>
|
||||||
|
|
||||||
|
<a href="/index">{{msg . "home"}}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<script src="/js/jquery-1.9.0.min.js"></script>
|
||||||
|
<script src="/js/bootstrap.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<div id="footer">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<i class="fa fa-envelope-o fa-3x icon-muted"></i>
|
||||||
|
<h2>Contact</h2>
|
||||||
|
<a href="http://weibo.com/leanotecom" target="_blank"><i class="fa fa-weibo"></i></a>
|
||||||
|
<br />
|
||||||
|
leanote@leanote.com
|
||||||
|
<div id="beian">
|
||||||
|
<a href="http://www.miibeian.gov.cn" target="_blank">沪ICP备14006011号</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<i class="fa fa-globe fa-3x icon-muted"></i>
|
||||||
|
<h2>Join Us</h2>
|
||||||
|
<a href="https://github.com/leanote/leanote">github leanote</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="keywords" content="leanote,leanote.com">
|
||||||
|
<meta name="description" content="leanote, your own cloud note!">
|
||||||
|
<meta name="author" content="leanote">
|
||||||
|
<title>{{.title}}</title>
|
||||||
|
|
||||||
|
<link href="/css/bootstrap.css" rel="stylesheet">
|
||||||
|
<link href="/css/font-awesome-4.0.3/css/font-awesome.css" rel="stylesheet">
|
||||||
|
<link href="/css/index.css" rel="stylesheet">
|
||||||
|
<style>
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function log(o) {
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<div id="headerContainer" style="background-color:#fff" class="navbar-fixed-top">
|
||||||
|
<div class="container" style="clearfix" id="header">
|
||||||
|
<div class="pull-left">
|
||||||
|
<h1>
|
||||||
|
<a href="/index">
|
||||||
|
<img src="/images/logo.png" id="" style="height: 40px" title="leanote, Your own cloud note!"/>
|
||||||
|
</a>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pull-right" id="loginBtns">
|
||||||
|
{{if .userInfo.Email}}
|
||||||
|
{{msg . "hi"}}, {{.userInfo.Username}}
|
||||||
|
<a href="/note">{{msg . "myNote"}}</a>
|
||||||
|
<a href="/logout">{{msg . "logout"}}</a>
|
||||||
|
{{else}}
|
||||||
|
<a href="/login">{{msg . "login"}}</a>
|
||||||
|
{{if .openRegister}}
|
||||||
|
<a href="/register" class="btn-register">{{msg . "register"}}</a>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul id="blogNav" class="pull-right">
|
||||||
|
<li><a href="/index#" target="body" class="smooth-scroll">{{msg . "home"}}</a></li>
|
||||||
|
<li><a href="/index#aboutLeanote" target="#aboutLeanote" class="smooth-scroll">{{msg . "aboutLeanote"}}</a> </li>
|
||||||
|
<li><a id="leanoteBlog" href="http://leanote.com/blog/leanote" target="_blank" class="">{{msg . "leanoteBlog"}}</a></li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="keywords" content="leanote,leanote.com">
|
||||||
|
<meta name="description" content="leanote, your own cloud note!">
|
||||||
|
<meta name="author" content="leanote">
|
||||||
|
<title>{{.title}}</title>
|
||||||
|
|
||||||
|
<link href="/css/bootstrap.css" rel="stylesheet">
|
||||||
|
<link href="/css/font-awesome-4.0.3/css/font-awesome.css" rel="stylesheet">
|
||||||
|
<link href="/css/index.css" rel="stylesheet">
|
||||||
|
<style>
|
||||||
|
html, body {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
{{template "home/header.html" .}}
|
||||||
|
<style>
|
||||||
|
|
||||||
|
</style>
|
||||||
|
<section>
|
||||||
|
<div class="header">
|
||||||
|
<h2>leanote, Your own cloud note!</h2>
|
||||||
|
<p>Knowledge, Sharing, Cooperation, Blog... all just in leanote</p>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<a class="btn btn-primary" href="https://github.com/leanote/leanote">Fork leanote from Github</a>
|
||||||
|
|
||||||
|
|
||||||
|
<a class="btn btn-default" href="/demo">Try it</a>
|
||||||
|
{{if .openRegister}}
|
||||||
|
|
||||||
|
|
||||||
|
OR
|
||||||
|
|
||||||
|
|
||||||
|
<a class="btn btn-default" href="/register">{{msg . "register"}}</a>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="preview" style="position: relative;">
|
||||||
|
<div>
|
||||||
|
<div class="img-header">
|
||||||
|
<img src="/images/home/mac-btns.png"/>
|
||||||
|
</div>
|
||||||
|
<img src="/images/home/preview2.png" style="width: 750px;" />
|
||||||
|
</div>
|
||||||
|
<div class="mobile">
|
||||||
|
<div class="mobile-header">
|
||||||
|
<img src="/images/home/mac-dot.png" />
|
||||||
|
</div>
|
||||||
|
<img class="mobile-image" src="/images/home/mobile.png" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<div class="container" id="aboutLeanote">
|
||||||
|
<h2>{{msg . "aboutLeanote"}}</h2>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-3">
|
||||||
|
<h3>{{msg . "knowledge"}}</h3>
|
||||||
|
<p>{{msg . "knowledgeInfo"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3">
|
||||||
|
<h3>{{msg . "share"}}</h3>
|
||||||
|
<p>{{msg . "shareInfo"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3">
|
||||||
|
<h3>{{msg . "cooperation"}}</h3>
|
||||||
|
<p>{{msg . "cooperationInfo"}}</p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-3">
|
||||||
|
<h3>{{msg . "blog"}}</h3>
|
||||||
|
<p>{{msg . "blogInfo"}}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "home/footer.html"}}
|
||||||
|
|
||||||
|
<script src="/js/jquery-1.9.0.min.js"></script>
|
||||||
|
<script src="/js/bootstrap.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(function() {
|
||||||
|
/*
|
||||||
|
var u = navigator.userAgent;
|
||||||
|
var isMobile = u.indexOf('Android')>-1 || u.indexOf('Linux')>-1;
|
||||||
|
if(isMobile || $("body").width() < 600) {
|
||||||
|
location.href = "/mobile/index";
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
// 平滑滚动
|
||||||
|
$(".smooth-scroll").click(function(e) {
|
||||||
|
e.preventDefault();
|
||||||
|
var t = $(this).attr("target");
|
||||||
|
var targetOffset = $(t).offset().top - 80;
|
||||||
|
$('html,body').animate({scrollTop: targetOffset}, 300);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
{{template "home/header_box.html" .}}
|
||||||
|
<section id="box">
|
||||||
|
<div>
|
||||||
|
<a class="back" href="javascript:history.go(-1);" tabindex="-1">←Back</a>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h1>leanote | {{msg . "login"}}</h1>
|
||||||
|
<form class="form-inline" id="boxForm" >
|
||||||
|
<div class="alert alert-danger" id="loginMsg"></div>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="email">{{msg . "usernameOrEmail"}}</label>
|
||||||
|
<input type="text" class="form-control" id="email" name="email" value="{{.email}}">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="pwd">{{msg . "password"}}</label>
|
||||||
|
<input type="password" class="form-control" id="pwd" name="pwd">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<button id="loginBtn" class="btn btn-success" style="width: 100%">{{msg . "login"}}</button>
|
||||||
|
<br />
|
||||||
|
<a href="/findPassword">{{msg . "forgetPassword"}}</a>
|
||||||
|
{{if .openRegister}}
|
||||||
|
<br />
|
||||||
|
<a href="/register">{{msg . "register"}}</a>
|
||||||
|
{{msg . "or"}}
|
||||||
|
<a href="/demo">{{msg . "try"}}</a>
|
||||||
|
<div style="border-top: 1px dashed #666;margin:2px 0">
|
||||||
|
{{msg . "3th"}}: <a id="github">github<i class="fa fa-github"></i></a>
|
||||||
|
<span id="thirdLoginLoading" style="display: none"> <img src="/images/loading-a-20-2.gif" />正在登录...</span>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
<div id="quickLinks">
|
||||||
|
<a href="/index">{{msg . "home"}}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<script src="/js/jquery-1.9.0.min.js"></script>
|
||||||
|
<script src="/js/bootstrap.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(function() {
|
||||||
|
$("#email").focus();
|
||||||
|
if($("#email").val()) {
|
||||||
|
$("#pwd").focus();
|
||||||
|
}
|
||||||
|
function showMsg(msg, id) {
|
||||||
|
$("#loginMsg").html(msg).show();
|
||||||
|
if(id) {
|
||||||
|
$("#" + id).focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function hideMsg() {
|
||||||
|
$("#loginMsg").hide();
|
||||||
|
}
|
||||||
|
$("#loginBtn").click(function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
var email = $("#email").val();
|
||||||
|
var pwd = $("#pwd").val();
|
||||||
|
if(!email) {
|
||||||
|
showMsg("{{msg . "inputUsername"}}", "email");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(!pwd) {
|
||||||
|
showMsg("{{msg . "inputPassword"}}", "pwd");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if(pwd.length < 6) {
|
||||||
|
showMsg("{{msg . "wrongPassword"}}", "pwd");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#loginBtn").html("{{msg . "logining"}}...").addClass("disabled");
|
||||||
|
// hideMsg();
|
||||||
|
|
||||||
|
$.post("/doLogin", {email: email, pwd: pwd}, function(e) {
|
||||||
|
$("#loginBtn").html("{{msg . "login"}}").removeClass("disabled");
|
||||||
|
if(e.Ok) {
|
||||||
|
$("#loginBtn").html("{{msg . "loginSuccess"}}...");
|
||||||
|
location.href = '/note';
|
||||||
|
} else {
|
||||||
|
showMsg(e.Msg, "pwd");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// github
|
||||||
|
$("#github").click(function() {
|
||||||
|
$("#thirdLoginLoading").show();
|
||||||
|
location.href="https://github.com/login/oauth/authorize?access_type=&approval_prompt=&client_id=3790fbf1fc14bc6c5d85&redirect_uri=http%3A%2F%2Fleanote.com%2Foauth%2FgithubCallback&response_type=code&scope=user&state=";
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
<div class="modal fade bs-modal-sm" id="leanoteDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" id="modalTitle">操作</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
..................
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
||||||
|
<button type="button" class="btn btn-primary">Save changes</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
{{template "home/header_box.html" .}}
|
||||||
|
<section id="box">
|
||||||
|
<div>
|
||||||
|
<a class="back" href="javascript:history.go(-1);" tabindex="-1">←Back</a>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<h1>leanote | {{msg . "register"}}</h1>
|
||||||
|
<form class="form-inline" id="boxForm">
|
||||||
|
<div class="alert alert-danger" id="loginMsg"></div>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="email">{{msg . "email"}}</label>
|
||||||
|
<input type="text" class="form-control" id="email" name="email">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="pwd">{{msg . "password"}}</label>
|
||||||
|
<input type="password" class="form-control" id="pwd" name="pwd">
|
||||||
|
{{msg . "passwordTips"}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="pwd2">{{msg . "password2"}}</label>
|
||||||
|
<input type="password" class="form-control" id="pwd2" name="pwd2">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<button id="registerBtn" class="btn btn-success" style="width: 100%">{{msg . "register"}}</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
<div id="quickLinks">
|
||||||
|
<a href="/login">{{msg . "login"}}</a>
|
||||||
|
|
||||||
|
<a href="/index">{{msg . "home"}}</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
<script src="/js/jquery-1.9.0.min.js"></script>
|
||||||
|
<script src="/js/bootstrap.js"></script>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(function() {
|
||||||
|
$("#email").focus();
|
||||||
|
|
||||||
|
function showMsg(msg, id) {
|
||||||
|
$("#loginMsg").html(msg).show();
|
||||||
|
if(id) {
|
||||||
|
$("#" + id).focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function hideMsg() {
|
||||||
|
$("#loginMsg").hide();
|
||||||
|
}
|
||||||
|
$("#registerBtn").click(function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
var email = $("#email").val();
|
||||||
|
var pwd = $("#pwd").val();
|
||||||
|
var pwd2 = $("#pwd2").val();
|
||||||
|
if(!email) {
|
||||||
|
showMsg("{{msg . "inputEmail"}}", "email");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
var myreg = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[0-9a-zA-Z]{2,3}$/;
|
||||||
|
if(!myreg.test(email)) {
|
||||||
|
showMsg("{{msg . "wrongEmail"}}", "email");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!pwd) {
|
||||||
|
showMsg("{{msg . "inputPassword"}}", "pwd");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if(pwd.length < 6) {
|
||||||
|
showMsg("{{msg . "notGoodPassword"}}", "pwd");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!pwd2) {
|
||||||
|
showMsg("{{msg . "inputPassword2"}}", "pwd2");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if(pwd != pwd2) {
|
||||||
|
showMsg("{{msg . "confirmPassword"}}", "pwd2");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#registerBtn").html("{{msg . "ing"}}...").addClass("disabled");
|
||||||
|
// hideMsg();
|
||||||
|
|
||||||
|
$.post("/doRegister", {email: email, pwd: pwd}, function(e) {
|
||||||
|
$("#registerBtn").html("{{msg . "register"}}").removeClass("disabled");
|
||||||
|
if(e.Ok) {
|
||||||
|
$("#registerBtn").html("{{msg . "registerSuccessAndRdirectToNote"}}");
|
||||||
|
location.href = '/note';
|
||||||
|
} else {
|
||||||
|
showMsg(e.Msg, "email");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,178 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0"/>
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes"/>
|
||||||
|
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||||
|
<title>leanote</title>
|
||||||
|
<link href="/public/css/font-awesome-4.0.3/css/font-awesome.css" rel="stylesheet">
|
||||||
|
<link href="/public/mobile/css/base.css" rel="stylesheet" type="text/css">
|
||||||
|
<link href="/public/css/bootstrap.css" rel="stylesheet" />
|
||||||
|
<link href="/public/mobile/css/leanote.css" rel="stylesheet" type="text/css">
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function log(o) {
|
||||||
|
// console.log(o);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div id="preloader">
|
||||||
|
<div id="status">
|
||||||
|
<p class="center-text">
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="all-elements" style="height: 100%">
|
||||||
|
<div id="sidebar" class="page-sidebar sidebar-content-background">
|
||||||
|
<div class="page-sidebar-scroll">
|
||||||
|
<div>
|
||||||
|
<div class="sidebar-section">
|
||||||
|
<a href="#" class="sidebar-close"></a>
|
||||||
|
<em>leanote</em>
|
||||||
|
</div>
|
||||||
|
<div class="sidebar-decoration"></div>
|
||||||
|
<div id="userInfo">
|
||||||
|
{{.userInfo.Username}}
|
||||||
|
</div>
|
||||||
|
<div class="sidebar-decoration"></div>
|
||||||
|
|
||||||
|
<div class="sidebar-navigation">
|
||||||
|
<div class="nav-item">
|
||||||
|
<a href="#" class="nav-newest">最新笔记</a>
|
||||||
|
</div>
|
||||||
|
<div class="nav-item">
|
||||||
|
<a href="#" class="nav-myNotebooks">我的笔记本</a>
|
||||||
|
</div>
|
||||||
|
<div class="nav-item">
|
||||||
|
<a href="#" class="nav-myTags">我的标签</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="sidebar-decoration"></div>
|
||||||
|
<div class="sidebar-navigation">
|
||||||
|
<div class="nav-item">
|
||||||
|
<a href="#" class="nav-logout">退出</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="content" class="page-content" style="position: absolute;background-color: #fff;width: 100%;">
|
||||||
|
<!-- notebooks -->
|
||||||
|
<div id="notebooks">
|
||||||
|
<!-- 头部 -->
|
||||||
|
<div class="content-controls clearfix">
|
||||||
|
<div class="pull-left">
|
||||||
|
<i class="fa fa-angle-left back"></i>
|
||||||
|
</div>
|
||||||
|
<div class="pull-left">
|
||||||
|
<span class="g-title">
|
||||||
|
我的笔记本
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<!-- 其它按钮 -->
|
||||||
|
<div class="pull-right btns">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="each-container">
|
||||||
|
<div class="each-content" style="bottom: 0">
|
||||||
|
<ul id="notebookList">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<!--
|
||||||
|
<div class="each-footer">
|
||||||
|
添加笔记本
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- note -->
|
||||||
|
<div id="notes">
|
||||||
|
<!-- 头部 -->
|
||||||
|
<div class="content-controls clearfix">
|
||||||
|
<div class="pull-left">
|
||||||
|
<i class="fa fa-angle-left back"></i>
|
||||||
|
</div>
|
||||||
|
<div class="pull-left">
|
||||||
|
<span class="g-title">
|
||||||
|
XX的笔记
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<!-- 其它按钮 -->
|
||||||
|
<div class="pull-right btns">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="each-container">
|
||||||
|
<div class="each-content" style="bottom:0">
|
||||||
|
<div id="noteItemList">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!--
|
||||||
|
<div class="each-footer">
|
||||||
|
添加笔记
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- view -->
|
||||||
|
<div id="view">
|
||||||
|
<div class="content-controls clearfix">
|
||||||
|
<div class="pull-left">
|
||||||
|
<i class="fa fa-angle-left back"></i>
|
||||||
|
</div>
|
||||||
|
<div class="pull-left">
|
||||||
|
<span class="g-title">
|
||||||
|
笔记标题
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<!-- 其它按钮 -->
|
||||||
|
<div class="pull-right btns">
|
||||||
|
<i class="fa fa-pencil" id="editBtn"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="each-container">
|
||||||
|
<div class="each-content" style="bottom:0">
|
||||||
|
<img id="loading" style="width: 30px; margin: auto; margin-top: 100px; height: 30px; display: none" src="/public/mobile/images/status.gif" />
|
||||||
|
<div id="noteContent"></div>
|
||||||
|
</div>
|
||||||
|
<!--
|
||||||
|
<div class="each-footer">
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src="/js/jquery-1.9.0.min.js"></script>
|
||||||
|
<script src="/public/mobile/js/snap.js"></script>
|
||||||
|
<script src="/public/js/i18n/msg.{{.locale}}.js"></script>
|
||||||
|
<script src="/public/mobile/js/app/mobile-common.js"></script>
|
||||||
|
<script>
|
||||||
|
var UserInfo = json({{.userInfoJson}});
|
||||||
|
var notebooks = json({{.notebooks}});
|
||||||
|
</script>
|
||||||
|
<!--
|
||||||
|
// var shareNotebooks = json({{.shareNotebooks}});
|
||||||
|
// var sharedUserInfos = json({{.sharedUserInfos}});
|
||||||
|
// var tagsJson = json({{.tagsJson}});
|
||||||
|
-->
|
||||||
|
<script src="/public/mobile/js/app/mobile-notebook.js"></script>
|
||||||
|
<script src="/public/mobile/js/app/mobile-tag.js"></script>
|
||||||
|
<script src="/public/mobile/js/app/mobile-note.js"></script>
|
||||||
|
<script src="/public/mobile/js/app/mobile-page.js"></script>
|
||||||
|
<script>
|
||||||
|
Notebook.RenderNotebooks(notebooks);
|
||||||
|
// Share.RenderShareNotebooks(sharedUserInfos, shareNotebooks);
|
||||||
|
// Tag.renderTagNav(tagsJson);
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
<!DOCTYPE HTML>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||||
|
<meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0"/>
|
||||||
|
<meta name="apple-mobile-web-app-capable" content="yes"/>
|
||||||
|
<meta name="apple-mobile-web-app-status-bar-style" content="black">
|
||||||
|
<title>leanote login</title>
|
||||||
|
|
||||||
|
<link href="/public/css/font-awesome-4.0.3/css/font-awesome.css" rel="stylesheet">
|
||||||
|
<link href="/public/mobile/styles/style.css" rel="stylesheet" type="text/css">
|
||||||
|
<link href="/public/mobile/styles/colors/default.css" rel="stylesheet" type="text/css" id="pagestyle">
|
||||||
|
<link href="/public/mobile/styles/framework.css" rel="stylesheet" type="text/css">
|
||||||
|
<link href="/public/css/bootstrap.css" rel="stylesheet" />
|
||||||
|
<link href="/public/mobile/styles/life.css" rel="stylesheet" type="text/css">
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.alert {
|
||||||
|
padding: 10px;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.form-control {
|
||||||
|
border-radius: 0;
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
-webkit-transition: nonoe;
|
||||||
|
transition: none;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
|
||||||
|
<div id="preloader">
|
||||||
|
<div id="status">
|
||||||
|
<p class="center-text">
|
||||||
|
loading...
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="text-align: center">
|
||||||
|
<img src="/public/mobile/images/blog01.jpg" style="width: 100%"/>
|
||||||
|
<form id="loginForm" style="width: 90%; margin: auto;">
|
||||||
|
<div class="form-group">
|
||||||
|
<h2 style="margin-top:10px">leanote 登录</h2>
|
||||||
|
</div>
|
||||||
|
<div class="alert alert-danger" id="loginMsg" style="display: none"></div>
|
||||||
|
<div class="form-group">
|
||||||
|
<input class="form-control" id="email" name="email" placeholder="用户名或Email" value="">
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<input type="password" class="form-control" id="pwd" name="pwd" placeholder="密码">
|
||||||
|
</div>
|
||||||
|
<button id="loginBtn" class="btn btn-success" style="width: 100%">登录</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript" src="/public/mobile/scripts/jquery.js"></script>
|
||||||
|
<script>
|
||||||
|
$(function() {
|
||||||
|
$("#status").fadeOut(); // will first fade out the loading animation
|
||||||
|
$("#preloader").delay(350).fadeOut("slow"); // will fade out the white DIV that covers the website.
|
||||||
|
function showMsg(msg, id) {
|
||||||
|
$("#loginMsg").html(msg).show();
|
||||||
|
if(id) {
|
||||||
|
$("#" + id).focus();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function hideMsg() {
|
||||||
|
$("#loginMsg").hide();
|
||||||
|
}
|
||||||
|
$("#loginBtn").click(function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
var email = $("#email").val();
|
||||||
|
var pwd = $("#pwd").val();
|
||||||
|
if(!email) {
|
||||||
|
showMsg("{{msg . "inputUsername"}}", "email");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if(!pwd) {
|
||||||
|
showMsg("{{msg . "inputPassword"}}", "pwd");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
if(pwd.length < 6) {
|
||||||
|
showMsg("{{msg . "wrongPassword"}}", "pwd");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$("#loginBtn").html("{{msg . "logining"}}...").addClass("disabled");
|
||||||
|
// hideMsg();
|
||||||
|
|
||||||
|
$.post("/doLogin", {email: email, pwd: pwd}, function(e) {
|
||||||
|
$("#loginBtn").html("{{msg . "login"}}").removeClass("disabled");
|
||||||
|
if(e.Ok) {
|
||||||
|
$("#loginBtn").html("{{msg . "loginSuccess"}}...");
|
||||||
|
location.href = '/mobile/index';
|
||||||
|
} else {
|
||||||
|
showMsg(e.Msg, "pwd");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" id="modalTitle">历史记录</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
<div id="shareMsg" class="alert alert-danger" style="display: none; margin: 5px 0 0 0;"></div>
|
||||||
|
<table class="table table-hover" id="shareNotebookTable">
|
||||||
|
<tbody>
|
||||||
|
{{range $i, $v := .histories}}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
{{raw $v.Content}}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
@@ -0,0 +1,955 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="keywords" content="leanote,leanote.com">
|
||||||
|
<meta name="description" content="leanote, your own cloud note">
|
||||||
|
<title>leanote, your own cloud note</title>
|
||||||
|
|
||||||
|
<link href="css/bootstrap.css" rel="stylesheet" />
|
||||||
|
<!-- 先加载, 没有样式, 宽度不定 -->
|
||||||
|
<link rel="stylesheet" href="tinymce/skins/custom/skin.min.css" type="text/css" />
|
||||||
|
<!-- leanote css -->
|
||||||
|
<link rel="stylesheet" href="css/theme/{{if .userInfo.Theme}}{{.userInfo.Theme}}{{else}}default{{end}}.css" type="text/css" id="themeLink" />
|
||||||
|
<link href="css/font-awesome-4.0.3/css/font-awesome.css" rel="stylesheet" />
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function log(o) {
|
||||||
|
console.log(o);
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="page">
|
||||||
|
<div id="pageInner">
|
||||||
|
|
||||||
|
<!-- 头部 -->
|
||||||
|
<!-- <div id="headerContainer"> -->
|
||||||
|
<div id="header">
|
||||||
|
|
||||||
|
<!-- <div id="headerLeft" class="pull-left">
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
<div id="logo" class="pull-left">
|
||||||
|
<span>lea</span>note
|
||||||
|
<!-- <img style="height: 45px;" src="/images/logo.png" title="leanote, 不一样的笔记" alt="leanote">
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
<div id="switcher" class="pull-left">
|
||||||
|
<i class="fa fa-align-justify" id="leftSwitcher" title="{{msg . "leftHidden"}}"></i>
|
||||||
|
<span id="leftSwitcher2" title="{{msg . "leftShow"}}">lea</span>
|
||||||
|
</div>
|
||||||
|
<!-- search -->
|
||||||
|
<div class="pull-left">
|
||||||
|
<form class="navbar-form form-inline col-lg-2 hidden-xs" id="searchNote">
|
||||||
|
<input class="form-control" placeholder="Search" type="text" id="searchNoteInput">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 全局按钮 -->
|
||||||
|
<div class="pull-left" style="line-height: 40px; margin-top: 10px;">
|
||||||
|
|
||||||
|
<!-- 新建笔记 -->
|
||||||
|
<div id="newMyNote">
|
||||||
|
<a id="newNoteBtn" title="{{msg . "newNote"}}">
|
||||||
|
<i class="fa fa-file-o"></i>
|
||||||
|
{{msg . "newNote"}}
|
||||||
|
</a>
|
||||||
|
|
|
||||||
|
<a id="newNoteMarkdownBtn" title="{{msg . "newMarkdown"}}">
|
||||||
|
Markdown
|
||||||
|
</a>
|
||||||
|
- <span id="curNotebookForNewNote" notebookId=""></span>
|
||||||
|
<div class="dropdown" style="display: inline-block">
|
||||||
|
<a class="ios7-a dropdown-toggle"
|
||||||
|
id="dropdownMenu2" data-toggle="dropdown">
|
||||||
|
<i class="fa fa-angle-down"></i>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu2" style="width: 180px;left: -5px;" id="notebookNavForNewNote">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 只为新建别人的笔记 -->
|
||||||
|
<div id="newSharedNote" style="display: none">
|
||||||
|
<a id="newSharedNoteBtn">
|
||||||
|
<i class="fa fa-file-o"></i>
|
||||||
|
{{msg . "newNote"}}
|
||||||
|
</a>
|
||||||
|
|
|
||||||
|
<a id="newShareNoteMarkdownBtn" title="{{msg . "newMarkdown"}}">
|
||||||
|
Markdown
|
||||||
|
</a>
|
||||||
|
- <span id="curNotebookForNewSharedNote" notebookId="" userId=""></span>
|
||||||
|
<div class="dropdown" style="display: inline-block">
|
||||||
|
<a class="ios7-a dropdown-toggle"
|
||||||
|
id="dropdownMenu2" data-toggle="dropdown">
|
||||||
|
<i class="fa fa-angle-down"></i>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu2" style="width: 180px;left: -5px;" id="notebookNavForNewSharedNote">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pull-left" style="line-height: 40px; margin-top: 10px; margin-left: 10px;" id="leanoteMsg">
|
||||||
|
<span id="msg" style="display: inline-block;"></span>
|
||||||
|
<img id="loading" style="visibility: hidden" src="/images/loading-a-20.gif" />
|
||||||
|
|
||||||
|
{{if .openRegister}}
|
||||||
|
{{if eq .userInfo.Email "demo@leanote.com"}}
|
||||||
|
<span>
|
||||||
|
{{msg . "demoRegister"}}
|
||||||
|
</span>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<div class="pull-left alert-warning" style="line-height: 20px; margin-top: 10px; margin-left: 0px; display: none" id="verifyMsg">
|
||||||
|
您还没有验证邮箱, 验证邮件已发送至 {{.userInfo.Email}}.
|
||||||
|
<br />
|
||||||
|
<a class=".nowToActive">现在去验证</a> <a id="reSendActiveEmail">重新发送</a> <a id="wrongEmail">邮箱填错了?</a>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<div class="pull-right" style="margin: 0 10px" id="myProfile">
|
||||||
|
<div class="dropdown">
|
||||||
|
<a class="dropdown-toggle" data-toggle="dropdown" style="line-height: 60px;">
|
||||||
|
<!--
|
||||||
|
<img src="images/avatar.png" style="height: 40px; border: 1px solid #ccc" />
|
||||||
|
-->
|
||||||
|
<span class="username">
|
||||||
|
{{if .userInfo.UsernameRaw}}
|
||||||
|
{{.userInfo.UsernameRaw}}
|
||||||
|
{{else}}
|
||||||
|
{{.userInfo.Username}}
|
||||||
|
{{end}}
|
||||||
|
</span>
|
||||||
|
<i class="fa fa-angle-down"></i>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu li-a" role="menu">
|
||||||
|
<li role="presentation" id="setInfo">
|
||||||
|
<i class="fa fa-info"></i>
|
||||||
|
{{msg . "accountSetting"}}
|
||||||
|
</li>
|
||||||
|
<li role="presentation" id="setTheme">
|
||||||
|
<i class="fa fa-sun-o"></i>
|
||||||
|
{{msg . "themeSetting"}}
|
||||||
|
</li>
|
||||||
|
<!--
|
||||||
|
<li role="presentation" id="yourSuggestions">
|
||||||
|
<i class="fa fa-comment-o"></i>
|
||||||
|
{{msg . "yourSuggestions"}}
|
||||||
|
</li>
|
||||||
|
-->
|
||||||
|
<li role="presentation" onclick="logout()">
|
||||||
|
<i class="fa fa-sign-out"></i>
|
||||||
|
{{msg . "logout"}}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pull-right" style="margin: 0 10px" id="topNav">
|
||||||
|
<a target="_blank" href="/blog/{{.userInfo.Username}}">
|
||||||
|
{{msg . "myBlog"}}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<ul id="setting" class="pull-right">
|
||||||
|
<li class="dropdown messages">
|
||||||
|
<a class="dropdown-toggle" data-toggle="dropdown">
|
||||||
|
<span aria-hidden="true" class="icon se7en-flag"></span>
|
||||||
|
<div class="sr-only">Messages</div>
|
||||||
|
<p class="counter">3</p>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a href="#"> c@c.com 共享了笔记给你 是否接受? </a></li>
|
||||||
|
<li><a href="#"> d@c.com 共享了笔记给你 是否接受? </a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dropdown settings">
|
||||||
|
<a class="dropdown-toggle" data-toggle="dropdown">
|
||||||
|
<span aria-hidden="true" class="icon se7en-gear"></span>
|
||||||
|
<div class="sr-only">Settings</div>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a class="settings-link blue"><span></span>Blue</a></li>
|
||||||
|
<li><a class="settings-link green"><span></span>Green</a></li>
|
||||||
|
<li><a class="settings-link orange"><span></span>Orange</a>
|
||||||
|
</li>
|
||||||
|
<li><a class="settings-link magenta"><span></span>Magenta</a>
|
||||||
|
</li>
|
||||||
|
<li><a class="settings-link gray"><span></span>Gray</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
-->
|
||||||
|
<div style="clear: both"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="mainContainer" class="clearfix">
|
||||||
|
<div id="mainMask">
|
||||||
|
<img src="/images/loading-30.gif" />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
loading...
|
||||||
|
</div>
|
||||||
|
<div id="leftNotebook">
|
||||||
|
<div id="notebook">
|
||||||
|
<div class="folderNote opened" id="myNotebooks">
|
||||||
|
<div class="folderHeader clearfix">
|
||||||
|
<i class="fa fa-book pull-left fa-left"></i>
|
||||||
|
<span class="pull-left">
|
||||||
|
{{msg . "notebook"}}
|
||||||
|
</span>
|
||||||
|
<div class="pull-right" id="addNotebookPlus" title="{{msg . "addNotebook"}}">
|
||||||
|
<i class="fa fa-plus" title="{{msg . "addNotebook"}}"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ul class="folderBody" id="notebookList">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="folderNote closed" id="myTag">
|
||||||
|
<div class="folderHeader">
|
||||||
|
<i class="fa fa-bookmark fa-left"></i>
|
||||||
|
<span>
|
||||||
|
{{msg . "tag"}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="folderBody" id="tagNav">
|
||||||
|
<li><a> <span class="label label-red">{{msg . "red"}}</span></a></li>
|
||||||
|
<li><a> <span class="label label-blue">{{msg . "blue"}}</span></a></li>
|
||||||
|
<li><a> <span class="label label-yellow">{{msg . "yellow"}}</span></a></li>
|
||||||
|
<li><a> <span class="label label-green">{{msg . "green"}}</span></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="folderNote closed" id="">
|
||||||
|
<div class="folderHeader">
|
||||||
|
<i class="fa fa-user fa-left"></i>
|
||||||
|
<span>
|
||||||
|
共享
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="folderBody" id="shareNotebooks">
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 缩小版 -->
|
||||||
|
<div id="notebookMin">
|
||||||
|
<!-- 这里隐藏, 不要 -->
|
||||||
|
<div target="#notebookList" title="{{msg . "notebook"}}" class="minContainer">
|
||||||
|
<i class="fa fa-book"></i>
|
||||||
|
<ul class="dropdown-menu" id="minNotebookList">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div target="#tagNav" title="{{msg . "myTag"}}" class="minContainer">
|
||||||
|
<i class="fa fa-bookmark"></i>
|
||||||
|
<ul class="dropdown-menu" id="minTagNav">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div id="minShareNotebooks">
|
||||||
|
<!--
|
||||||
|
<div class="minContainer" target="" title="">
|
||||||
|
<i class="fa fa-user"></i>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
底下隐藏/展开
|
||||||
|
<div id="notebookBottom">
|
||||||
|
<i class="fa fa-angle-left" id="leftSwitcher"></i>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="noteSplit" id="notebookSplitter"></div>
|
||||||
|
|
||||||
|
<div id="noteAndEditor">
|
||||||
|
<div id="noteList">
|
||||||
|
<div class="clearfix" id="notesAndSort" style="position: relative">
|
||||||
|
|
||||||
|
<div class="pull-left">
|
||||||
|
|
||||||
|
<!-- 我的笔记本 -->
|
||||||
|
<div class="dropdown" id="myNotebookNavForListNav">
|
||||||
|
<a class="ios7-a dropdown-toggle" id="dropdownMenu1" data-toggle="dropdown">
|
||||||
|
<span id="curNotebookForListNote">{{msg . "all"}}</span>
|
||||||
|
<i class="fa fa-angle-down"></i>
|
||||||
|
</a>
|
||||||
|
<!-- 如果notebook过多, 则会产生滚动 -->
|
||||||
|
<ul class="dropdown-menu" role="menu"
|
||||||
|
aria-labelledby="dropdownMenu1" style="left: 5px;" id="notebookNavForListNote">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 共享的笔记本 -->
|
||||||
|
<div class="dropdown" id="sharedNotebookNavForListNav" style="display: none">
|
||||||
|
<a class="ios7-a dropdown-toggle" id="dropdownMenu2" data-toggle="dropdown">
|
||||||
|
<span id="curSharedNotebookForListNote">{{msg . "all"}}</span>
|
||||||
|
<i class="fa fa-angle-down"></i>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu" role="menu"
|
||||||
|
aria-labelledby="dropdownMenu2" style="left: 5px;" id="sharedNotebookNavForListNote">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pull-left" id="tagSearch" style="line-height: 38px">
|
||||||
|
</div>
|
||||||
|
<div id="sortType">
|
||||||
|
<div class="dropdown">
|
||||||
|
<a class="ios7-a dropdown-toggle" id="dropdownMenu1"
|
||||||
|
data-toggle="dropdown">
|
||||||
|
<!--
|
||||||
|
<i class="fa fa-sort-alpha-asc">
|
||||||
|
</i>Sort <i class="fa fa-angle-down"></i>
|
||||||
|
-->
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu" role="menu"
|
||||||
|
aria-labelledby="dropdownMenu1"
|
||||||
|
style="right: 3px; ! important; left: -100px; min-width: 100px;">
|
||||||
|
<li role="presentation"><a role="menuitem" tabindex="-1"
|
||||||
|
href="#">创建日期</a></li>
|
||||||
|
<li role="presentation"><a role="menuitem" tabindex="-1"
|
||||||
|
href="#">修改日期</a></li>
|
||||||
|
<li role="presentation"><a role="menuitem" tabindex="-1"
|
||||||
|
href="#">标题</a></li>
|
||||||
|
<li role="presentation" class="divider"></li>
|
||||||
|
<li role="presentation"><a role="menuitem" tabindex="-1"
|
||||||
|
href="#">Separated </a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 笔记列表 -->
|
||||||
|
<!-- wrap 为了slimScroll -->
|
||||||
|
<div id="noteItemListWrap" style="position: absolute; left: 0; right: 0; top: 41px; bottom: 3px">
|
||||||
|
<div id="noteItemList">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="noteSplit" id="noteSplitter"></div>
|
||||||
|
|
||||||
|
<div id="note">
|
||||||
|
<!-- 只读模式 -->
|
||||||
|
<div id="noteRead">
|
||||||
|
<div id="noteReadContainer">
|
||||||
|
<div id="noteReadTop">
|
||||||
|
<h2 id="noteReadTitle"></h2>
|
||||||
|
<div class="clearfix">
|
||||||
|
|
||||||
|
<div class="pull-left">
|
||||||
|
<i class="fa fa-bookmark-o"></i>
|
||||||
|
<span id="noteReadTags"></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 修改时间 -->
|
||||||
|
<div class="pull-left" style="margin-left: 10px;">
|
||||||
|
<i class="fa fa-calendar"></i>{{msg . "update"}}
|
||||||
|
<span id="noteReadUpdatedTime"></span>
|
||||||
|
</div>
|
||||||
|
<!-- 修改时间 -->
|
||||||
|
<div class="pull-left" style="margin-left: 10px;">
|
||||||
|
<i class="fa fa-calendar"></i>{{msg . "create"}}
|
||||||
|
<span id="noteReadCreatedTime"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="noteReadContent">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- 遮罩, 为了resize3Columns用 -->
|
||||||
|
<div id="noteMask"
|
||||||
|
style="position: absolute; top: 0px; bottom: 0px; right: 0; left: 10px; z-index: -1"></div>
|
||||||
|
<div id="editorMask">
|
||||||
|
该笔记本下空空如也...何不
|
||||||
|
<br />
|
||||||
|
<div id="editorMaskBtns">
|
||||||
|
<br />
|
||||||
|
<a class="note">新建笔记</a>
|
||||||
|
<a class="markdown">新建Markdown笔记</a>
|
||||||
|
</div>
|
||||||
|
<div id="editorMaskBtnsEmpty">
|
||||||
|
Sorry, 这里不能添加笔记的.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="noteTop">
|
||||||
|
<!-- 左侧放tag, 右侧放按钮, 比如save, info, move, delete -->
|
||||||
|
<div id="tool" class="clearfix">
|
||||||
|
<!-- tag可以参考 mac的文件tag, 预定义一些颜色, 用户也可以自己输入-->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<div class="pull-left" id="noteTitleDiv">
|
||||||
|
<input name="noteTitle" id="noteTitle" value="" placeholder="无标题">
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<div class="pull-left" id="tag">
|
||||||
|
<div id="tags" style="display: inline-block; line-height: 25px;">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="dropdown" style="display: inline-block"
|
||||||
|
id="tagDropdown">
|
||||||
|
<i class="fa fa-bookmark-o"></i>
|
||||||
|
<a
|
||||||
|
class="metro-a dropdown-toggle" data-toggle="dropdown"
|
||||||
|
id="addTagTrigger" style="cursor: text; padding-left: 0">
|
||||||
|
{{msg . "clickAddTag"}}
|
||||||
|
</a>
|
||||||
|
<input type="text" id="addTagInput" />
|
||||||
|
<ul class="dropdown-menu" role="menu" id="tagColor">
|
||||||
|
<li role="presentation"><span class="label label-red">{{msg . "red"}}</span>
|
||||||
|
</li>
|
||||||
|
<li role="presentation"><span class="label label-blue">{{msg . "blue"}}</span>
|
||||||
|
</li>
|
||||||
|
<li role="presentation"><span class="label label-yellow">{{msg . "yellow"}}</span></li>
|
||||||
|
<li role="presentation"><span class="label label-green">{{msg . "green"}}</span></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="pull-right" id="editorTool">
|
||||||
|
<li><a class="ios7-a " id="saveBtn" title="ctrl+s"
|
||||||
|
data-toggle="dropdown">{{msg . "save"}}</a></li>
|
||||||
|
<li><a class="ios7-a " id="tipsBtn"
|
||||||
|
data-toggle="dropdown">{{msg . "editorTips"}}</a></li>
|
||||||
|
<li><a class="ios7-a " id="contentHistory"
|
||||||
|
data-toggle="dropdown">{{msg . "history"}}</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="noteTitleDiv">
|
||||||
|
<input name="noteTitle" id="noteTitle" value="" placeholder="{{msg . "unTitled"}}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="editor">
|
||||||
|
<!-- 编辑器 -->
|
||||||
|
<div id="mceToolbar" style="">
|
||||||
|
<div id="popularToolbar"
|
||||||
|
style="position: absolute; right: 30px; left: 0"></div>
|
||||||
|
<a
|
||||||
|
style="dispaly: block; position: absolute; cursor: pointer; right: 10px; padding: 3px 10px"
|
||||||
|
id="moreBtn"> <i class="fa fa-angle-down"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div id="leanoteNav">
|
||||||
|
<h1>
|
||||||
|
<i class="fa fa-align-justify" title="文档导航"></i>
|
||||||
|
<span>{{msg . "nav"}}</span>
|
||||||
|
</h1>
|
||||||
|
<div id="leanoteNavContent">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- 由此可以算高度 -->
|
||||||
|
<div id="editorContent" name="editorContent">
|
||||||
|
{{.noteContent}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="mdEditor">
|
||||||
|
<div id="wmd-button-bar" id="mdBar"></div>
|
||||||
|
<!-- 为了scroll -->
|
||||||
|
|
||||||
|
<div class="clearfix" id="mdEditorPreview">
|
||||||
|
<div id="left-column" class="pull-left">
|
||||||
|
<div id="wmd-panel-editor" class="wmd-panel-editor">
|
||||||
|
<textarea class="wmd-input theme" id="wmd-input" spellcheck="false"></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="right-column" class="pull-right">
|
||||||
|
<div id="wmd-panel-preview" class="wmd-panel-preview preview-container">
|
||||||
|
<div id="wmd-preview" class="wmd-preview"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<textarea id="md-section-helper"></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- mdEditor -->
|
||||||
|
<!-- Hidden Popup Modal -->
|
||||||
|
<div class="modal fade bs-modal-sm" id="editorDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" id="editorDialog-title">操作</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
<p></p>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-addon">
|
||||||
|
<i></i>
|
||||||
|
</span>
|
||||||
|
<input type="text" class="form-control" placeholder="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
|
||||||
|
<button type="button" class="btn btn-primary" id="editorDialog-confirm">确认</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 弹出框 模板 -->
|
||||||
|
<div class="modal fade bs-modal-sm" id="leanoteDialogRemote" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal fade bs-modal-sm" id="leanoteDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" id="modalTitle">操作</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
内容区
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
||||||
|
<button type="button" class="btn btn-primary">Save changes</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
|
||||||
|
<div class="modal fade bs-modal-sm" id="sendRegisterEmailDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" class="modalTitle">邀请好友</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
<form role="form">
|
||||||
|
<div class="form-group">
|
||||||
|
<div id="registerEmailMsg" class="alert alert-warning" style="display: none">
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="toEmail"/>
|
||||||
|
<label for="emailContent">邮件内容</label>
|
||||||
|
<textarea class="form-control" id="emailContent">Hi, 我是李铁, leanote非常好用, 快来注册吧.</textarea>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
|
||||||
|
<button type="button" class="btn btn-success" id="registerEmailBtn">发送</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
|
||||||
|
<div class="modal fade bs-modal-sm" id="setThemeDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" class="modalTitle">主题设置</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
<style>
|
||||||
|
#themeForm td {
|
||||||
|
padding: 5px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
#themeForm img {
|
||||||
|
border: 1px solid #eee;
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<table id="themeForm">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label>
|
||||||
|
<img src="/images/slider/all.gif" height="100px">
|
||||||
|
<br />
|
||||||
|
<input type="radio" name="theme" value="default"> {{msg . "default"}}
|
||||||
|
</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<label>
|
||||||
|
<img src="/images/slider/all-simple.gif" height="100px">
|
||||||
|
<br />
|
||||||
|
<input type="radio" name="theme" value="simple"> {{msg . "simple"}}
|
||||||
|
</label>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">{{msg . "close"}}</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
|
||||||
|
<!-- 编辑器提示 -->
|
||||||
|
<div class="modal fade bs-modal-sm" id="tipsDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" class="modalTitle">{{msg . "editorTips"}}</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
{{msg . "editorTipsInfo"}}
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">{{msg . "close"}}</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
|
||||||
|
<!-- 图片上传 -->
|
||||||
|
<div class="modal fade bs-modal-sm" id="imageDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content" style="height: 460px;" >
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" class="modalTitle">{{msg . "uploadImage"}}</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<iframe style="" height="360" src="" scrolling="no" frameBorder="0" width="99%"></iframe>
|
||||||
|
</div>
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
|
||||||
|
<!-- 您的建议
|
||||||
|
<div class="modal fade bs-modal-sm" id="suggestionsDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" class="modalTitle">{{msg . "yourSuggestions"}}</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div style="margin-bottom:20px;">
|
||||||
|
{{msg . "suggestionsInfo"}}<br />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="alert alert-warning" id="suggestionMsg" style="display: none"> </div>
|
||||||
|
<textarea style="width: 100%; height: 100px" id="suggestionTextarea" placeholder="{{msg . "suggestions"}}"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button id="suggestionBtn" class="btn btn-success" >{{msg . "submit"}}</button>
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">{{msg . "close"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- modal 静态区域 -->
|
||||||
|
<div class="display: hidden">
|
||||||
|
|
||||||
|
<!-- 长微博 -->
|
||||||
|
<div id="html2ImageDialog">
|
||||||
|
<div class="modal-body">
|
||||||
|
<div style="max-height: 300px; padding: 5px 0; text-align: center; overflow: scroll;" class="weibo">
|
||||||
|
<span class="text">
|
||||||
|
leanote正在努力为你生成长微博...
|
||||||
|
</span>
|
||||||
|
<br />
|
||||||
|
<img src="/images/loading-24.gif"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">{{msg . "cancel"}}</button>
|
||||||
|
<button type="button" class="btn btn-success sendWeiboBtn disabled">{{msg . "send"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 长微博 -->
|
||||||
|
<div id="reSendActiveEmailDialog">
|
||||||
|
<div class="modal-body">
|
||||||
|
<div style="max-height: 300px; padding: 5px 0; text-align: center; overflow: scroll;" class="weibo">
|
||||||
|
<span class="text">
|
||||||
|
<img src="/images/loading-24.gif"/>
|
||||||
|
正在发送邮件到{{.userInfo.Email}}...
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
|
||||||
|
<button type="button" class="btn btn-success viewEmailBtn disabled">查看邮件</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 帐户设置 -->
|
||||||
|
<div id="dialogSetInfo">
|
||||||
|
<div class="modal-body">
|
||||||
|
<ul class="nav nav-tabs" id="myTabs">
|
||||||
|
<li><a href="#baseInfo" data-toggle="tab">{{msg . "basicInfo"}}</a></li>
|
||||||
|
<li><a href="#emailInfo" data-toggle="tab">{{msg . "updateEmail"}}</a></li>
|
||||||
|
<li><a href="#updatePwd" data-toggle="tab">{{msg . "updatePassword"}}</a></li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content">
|
||||||
|
<div class="tab-pane active" id="baseInfo">
|
||||||
|
<form>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="username">用户名设置</label>
|
||||||
|
<div class="alert alert-danger" id="usernameMsg" style="display: none"></div>
|
||||||
|
<input type="text" class="form-control" id="username">
|
||||||
|
你的邮箱是 {{.userInfo.Email}}, 可以再设置一个唯一的用户名.
|
||||||
|
<br />
|
||||||
|
用户名至少4位, 不可含特殊字符.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<button id="usernameBtn" class="btn btn-success">提交</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane" id="emailInfo">
|
||||||
|
<form>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
当前邮箱为: <span id="curEmail">{{.userInfo.Email}}</span>
|
||||||
|
{{if .userInfo.Verified}}
|
||||||
|
已验证
|
||||||
|
{{else}}
|
||||||
|
未验证
|
||||||
|
<a class="raw nowToActive">现在去验证</a>
|
||||||
|
<a class="raw reSendActiveEmail">重新发送</a>
|
||||||
|
{{end}}
|
||||||
|
<br />
|
||||||
|
<label for="email">修改邮箱</label>
|
||||||
|
<div class="alert alert-danger" id="emailMsg" style="display: none"></div>
|
||||||
|
<input type="text" class="form-control" id="email">
|
||||||
|
邮箱修改后, 验证之后才有效, 验证之后新的邮箱地址将会作为登录帐号使用.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<button id="emailBtn" class="btn btn-success">发送验证邮箱</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane" id="updatePwd">
|
||||||
|
<form>
|
||||||
|
<table style="width: 80%">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div class="alert alert-danger" id="pwdMsg" style="display: none"></div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="width: 80px">
|
||||||
|
<label for="pwd">{{msg . "oldPassword"}}</label>
|
||||||
|
<input type="password" class="form-control" id="oldPwd" name="oldPwd">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="pwd">{{msg . "newPassword"}}</label>
|
||||||
|
<input type="password" class="form-control" id="pwd" name="pwd">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="pwd2">{{msg . "password2"}}</label>
|
||||||
|
<input type="password" class="form-control" id="pwd2" name="pwd2">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<button id="pwdBtn" class="btn btn-success" style="width: 100%">{{msg . "submit"}}</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 账号设置, 是通过third 登录进来的 -->
|
||||||
|
<div id="thirdDialogSetInfo">
|
||||||
|
<div class="modal-body">
|
||||||
|
<ul class="nav nav-tabs" id="thirdMyTabs">
|
||||||
|
<li><a href="#accountInfo" data-toggle="tab">创建帐号</a></li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content">
|
||||||
|
<div class="tab-pane active" id="accountInfo">
|
||||||
|
您现在使用的是第三方帐号登录leanote, 您也可以注册leanote帐号登录, 赶紧注册一个吧.
|
||||||
|
<br />
|
||||||
|
注册成功后仍可以使用第三方帐号登录leanote并管理您现有的笔记.
|
||||||
|
<form>
|
||||||
|
<div class="alert alert-danger" id="thirdAccountMsg" style="display: none"></div>
|
||||||
|
<table style="width: 100%">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="thirdEmail">邮箱</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" class="form-control" id="thirdEmail">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="thirdPwd">密码</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="password" class="form-control" id="thirdPwd">
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
密码至少6位
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="thirdPwd2">重复密码</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="password" class="form-control" id="thirdPwd2">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td>
|
||||||
|
<button id="accountBtn" class="btn btn-success" style="width: 100%">提交</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="hide" id="copyDiv"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src="js/jquery-1.9.0.min.js"></script>
|
||||||
|
<script src="js/i18n/msg.{{.locale}}.js"></script>
|
||||||
|
<script src="js/common.js"></script>
|
||||||
|
<script>
|
||||||
|
var UrlPrefix = "http://leanote.com"; // 为了发weibo
|
||||||
|
var UserInfo = json({{.userInfoJson}});
|
||||||
|
var notebooks = json({{.notebooks}});
|
||||||
|
var shareNotebooks = json({{.shareNotebooks}});
|
||||||
|
var sharedUserInfos = json({{.sharedUserInfos}});
|
||||||
|
var notes = json({{.notes}});
|
||||||
|
var noteContentJson = json({{.noteContentJson}});
|
||||||
|
var tagsJson = json({{.tagsJson}});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 渲染view -->
|
||||||
|
<script src="/js/jQuery-slimScroll-1.3.0/jquery.slimscroll.js"></script>
|
||||||
|
<script src="js/app/page.js"></script>
|
||||||
|
|
||||||
|
<script src="tinymce/tinymce.min.js"></script>
|
||||||
|
<script src="js/jquery-cookie-min.js"></script>
|
||||||
|
<script src="js/bootstrap-min.js"></script>
|
||||||
|
<script src="js/app/note.js"></script>
|
||||||
|
<script src="js/app/tag.js"></script>
|
||||||
|
<script src="js/app/notebook.js"></script>
|
||||||
|
<script src="js/app/share.js"></script>
|
||||||
|
<script src="js/object_id-min.js"></script>
|
||||||
|
<script src="js/ZeroClipboard/ZeroClipboard-min.js"></script>
|
||||||
|
<script>
|
||||||
|
Notebook.renderNotebooks(notebooks);
|
||||||
|
Share.renderShareNotebooks(sharedUserInfos, shareNotebooks);
|
||||||
|
|
||||||
|
Note.renderNotes(notes);
|
||||||
|
if(!isEmpty(notes)) {
|
||||||
|
Note.changeNote(notes[0].NoteId);
|
||||||
|
}
|
||||||
|
|
||||||
|
Note.setNoteCache(noteContentJson);
|
||||||
|
Note.renderNoteContent(noteContentJson)
|
||||||
|
|
||||||
|
Tag.renderTagNav(tagsJson);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- mdEditor -->
|
||||||
|
<link href="/public/mdeditor/editor/editor.css" rel="stylesheet">
|
||||||
|
<script src="/public/mdeditor/editor/pagedown/Markdown.Converter-min.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/pagedown/Markdown.Sanitizer-min.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/pagedown/Markdown.Editor-min.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/pagedown/local/Markdown.local.zh-min.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/Markdown.Extra-min.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/underscore-min.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/scrollLink.js"></script>
|
||||||
|
<!--mathjax-->
|
||||||
|
<script type="text/x-mathjax-config">
|
||||||
|
MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ["\\(","\\)"]], processEscapes: true }, messageStyle: "none"});
|
||||||
|
</script>
|
||||||
|
<script src="/public/mdeditor/editor/mathJax-min.js"></script>
|
||||||
|
<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||||
|
<script src="/public/mdeditor/editor/jquery.waitforimages-min.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/google-code-prettify/prettify.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/editor.js"></script>
|
||||||
|
<!-- mdEditor end -->
|
||||||
|
|
||||||
|
<!-- context-menu -->
|
||||||
|
<link rel="stylesheet" href="/js/contextmenu/css/contextmenu.css" type="text/css" />
|
||||||
|
<script src="/js/contextmenu/jquery.contextmenu.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,955 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="zh">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta name="keywords" content="leanote,leanote.com">
|
||||||
|
<meta name="description" content="leanote, your own cloud note">
|
||||||
|
<title>leanote, your own cloud note</title>
|
||||||
|
|
||||||
|
<link href="css/bootstrap.css" rel="stylesheet" />
|
||||||
|
<!-- 先加载, 没有样式, 宽度不定 -->
|
||||||
|
<link rel="stylesheet" href="tinymce/skins/custom/skin.min.css" type="text/css" />
|
||||||
|
<!-- leanote css -->
|
||||||
|
<link rel="stylesheet" href="css/theme/{{if .userInfo.Theme}}{{.userInfo.Theme}}{{else}}default{{end}}.css" type="text/css" id="themeLink" />
|
||||||
|
<link href="css/font-awesome-4.0.3/css/font-awesome.css" rel="stylesheet" />
|
||||||
|
|
||||||
|
<script>
|
||||||
|
function log(o) {
|
||||||
|
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="page">
|
||||||
|
<div id="pageInner">
|
||||||
|
|
||||||
|
<!-- 头部 -->
|
||||||
|
<!-- <div id="headerContainer"> -->
|
||||||
|
<div id="header">
|
||||||
|
|
||||||
|
<!-- <div id="headerLeft" class="pull-left">
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
<div id="logo" class="pull-left">
|
||||||
|
<span>lea</span>note
|
||||||
|
<!-- <img style="height: 45px;" src="/images/logo.png" title="leanote, 不一样的笔记" alt="leanote">
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
<div id="switcher" class="pull-left">
|
||||||
|
<i class="fa fa-align-justify" id="leftSwitcher" title="{{msg . "leftHidden"}}"></i>
|
||||||
|
<span id="leftSwitcher2" title="{{msg . "leftShow"}}">lea</span>
|
||||||
|
</div>
|
||||||
|
<!-- search -->
|
||||||
|
<div class="pull-left">
|
||||||
|
<form class="navbar-form form-inline col-lg-2 hidden-xs" id="searchNote">
|
||||||
|
<input class="form-control" placeholder="Search" type="text" id="searchNoteInput">
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 全局按钮 -->
|
||||||
|
<div class="pull-left" style="line-height: 40px; margin-top: 10px;">
|
||||||
|
|
||||||
|
<!-- 新建笔记 -->
|
||||||
|
<div id="newMyNote">
|
||||||
|
<a id="newNoteBtn" title="{{msg . "newNote"}}">
|
||||||
|
<i class="fa fa-file-o"></i>
|
||||||
|
{{msg . "newNote"}}
|
||||||
|
</a>
|
||||||
|
|
|
||||||
|
<a id="newNoteMarkdownBtn" title="{{msg . "newMarkdown"}}">
|
||||||
|
Markdown
|
||||||
|
</a>
|
||||||
|
- <span id="curNotebookForNewNote" notebookId=""></span>
|
||||||
|
<div class="dropdown" style="display: inline-block">
|
||||||
|
<a class="ios7-a dropdown-toggle"
|
||||||
|
id="dropdownMenu2" data-toggle="dropdown">
|
||||||
|
<i class="fa fa-angle-down"></i>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu2" style="width: 180px;left: -5px;" id="notebookNavForNewNote">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 只为新建别人的笔记 -->
|
||||||
|
<div id="newSharedNote" style="display: none">
|
||||||
|
<a id="newSharedNoteBtn">
|
||||||
|
<i class="fa fa-file-o"></i>
|
||||||
|
{{msg . "newNote"}}
|
||||||
|
</a>
|
||||||
|
|
|
||||||
|
<a id="newShareNoteMarkdownBtn" title="{{msg . "newMarkdown"}}">
|
||||||
|
Markdown
|
||||||
|
</a>
|
||||||
|
- <span id="curNotebookForNewSharedNote" notebookId="" userId=""></span>
|
||||||
|
<div class="dropdown" style="display: inline-block">
|
||||||
|
<a class="ios7-a dropdown-toggle"
|
||||||
|
id="dropdownMenu2" data-toggle="dropdown">
|
||||||
|
<i class="fa fa-angle-down"></i>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu2" style="width: 180px;left: -5px;" id="notebookNavForNewSharedNote">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pull-left" style="line-height: 40px; margin-top: 10px; margin-left: 10px;" id="leanoteMsg">
|
||||||
|
<span id="msg" style="display: inline-block;"></span>
|
||||||
|
<img id="loading" style="visibility: hidden" src="/images/loading-a-20.gif" />
|
||||||
|
|
||||||
|
{{if .openRegister}}
|
||||||
|
{{if eq .userInfo.Email "demo@leanote.com"}}
|
||||||
|
<span>
|
||||||
|
{{msg . "demoRegister"}}
|
||||||
|
</span>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<div class="pull-left alert-warning" style="line-height: 20px; margin-top: 10px; margin-left: 0px; display: none" id="verifyMsg">
|
||||||
|
您还没有验证邮箱, 验证邮件已发送至 {{.userInfo.Email}}.
|
||||||
|
<br />
|
||||||
|
<a class=".nowToActive">现在去验证</a> <a id="reSendActiveEmail">重新发送</a> <a id="wrongEmail">邮箱填错了?</a>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<div class="pull-right" style="margin: 0 10px" id="myProfile">
|
||||||
|
<div class="dropdown">
|
||||||
|
<a class="dropdown-toggle" data-toggle="dropdown" style="line-height: 60px;">
|
||||||
|
<!--
|
||||||
|
<img src="images/avatar.png" style="height: 40px; border: 1px solid #ccc" />
|
||||||
|
-->
|
||||||
|
<span class="username">
|
||||||
|
{{if .userInfo.UsernameRaw}}
|
||||||
|
{{.userInfo.UsernameRaw}}
|
||||||
|
{{else}}
|
||||||
|
{{.userInfo.Username}}
|
||||||
|
{{end}}
|
||||||
|
</span>
|
||||||
|
<i class="fa fa-angle-down"></i>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu li-a" role="menu">
|
||||||
|
<li role="presentation" id="setInfo">
|
||||||
|
<i class="fa fa-info"></i>
|
||||||
|
{{msg . "accountSetting"}}
|
||||||
|
</li>
|
||||||
|
<li role="presentation" id="setTheme">
|
||||||
|
<i class="fa fa-sun-o"></i>
|
||||||
|
{{msg . "themeSetting"}}
|
||||||
|
</li>
|
||||||
|
<!--
|
||||||
|
<li role="presentation" id="yourSuggestions">
|
||||||
|
<i class="fa fa-comment-o"></i>
|
||||||
|
{{msg . "yourSuggestions"}}
|
||||||
|
</li>
|
||||||
|
-->
|
||||||
|
<li role="presentation" onclick="logout()">
|
||||||
|
<i class="fa fa-sign-out"></i>
|
||||||
|
{{msg . "logout"}}
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pull-right" style="margin: 0 10px" id="topNav">
|
||||||
|
<a target="_blank" href="/blog/{{.userInfo.Username}}">
|
||||||
|
{{msg . "myBlog"}}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<ul id="setting" class="pull-right">
|
||||||
|
<li class="dropdown messages">
|
||||||
|
<a class="dropdown-toggle" data-toggle="dropdown">
|
||||||
|
<span aria-hidden="true" class="icon se7en-flag"></span>
|
||||||
|
<div class="sr-only">Messages</div>
|
||||||
|
<p class="counter">3</p>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a href="#"> c@c.com 共享了笔记给你 是否接受? </a></li>
|
||||||
|
<li><a href="#"> d@c.com 共享了笔记给你 是否接受? </a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<li class="dropdown settings">
|
||||||
|
<a class="dropdown-toggle" data-toggle="dropdown">
|
||||||
|
<span aria-hidden="true" class="icon se7en-gear"></span>
|
||||||
|
<div class="sr-only">Settings</div>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<li><a class="settings-link blue"><span></span>Blue</a></li>
|
||||||
|
<li><a class="settings-link green"><span></span>Green</a></li>
|
||||||
|
<li><a class="settings-link orange"><span></span>Orange</a>
|
||||||
|
</li>
|
||||||
|
<li><a class="settings-link magenta"><span></span>Magenta</a>
|
||||||
|
</li>
|
||||||
|
<li><a class="settings-link gray"><span></span>Gray</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
-->
|
||||||
|
<div style="clear: both"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="mainContainer" class="clearfix">
|
||||||
|
<div id="mainMask">
|
||||||
|
<img src="/images/loading-30.gif" />
|
||||||
|
<br />
|
||||||
|
<br />
|
||||||
|
loading...
|
||||||
|
</div>
|
||||||
|
<div id="leftNotebook">
|
||||||
|
<div id="notebook">
|
||||||
|
<div class="folderNote opened" id="myNotebooks">
|
||||||
|
<div class="folderHeader clearfix">
|
||||||
|
<i class="fa fa-book pull-left fa-left"></i>
|
||||||
|
<span class="pull-left">
|
||||||
|
{{msg . "notebook"}}
|
||||||
|
</span>
|
||||||
|
<div class="pull-right" id="addNotebookPlus" title="{{msg . "addNotebook"}}">
|
||||||
|
<i class="fa fa-plus" title="{{msg . "addNotebook"}}"></i>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<ul class="folderBody" id="notebookList">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="folderNote closed" id="myTag">
|
||||||
|
<div class="folderHeader">
|
||||||
|
<i class="fa fa-bookmark fa-left"></i>
|
||||||
|
<span>
|
||||||
|
{{msg . "tag"}}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="folderBody" id="tagNav">
|
||||||
|
<li><a> <span class="label label-red">{{msg . "red"}}</span></a></li>
|
||||||
|
<li><a> <span class="label label-blue">{{msg . "blue"}}</span></a></li>
|
||||||
|
<li><a> <span class="label label-yellow">{{msg . "yellow"}}</span></a></li>
|
||||||
|
<li><a> <span class="label label-green">{{msg . "green"}}</span></a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="folderNote closed" id="">
|
||||||
|
<div class="folderHeader">
|
||||||
|
<i class="fa fa-user fa-left"></i>
|
||||||
|
<span>
|
||||||
|
共享
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="folderBody" id="shareNotebooks">
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 缩小版 -->
|
||||||
|
<div id="notebookMin">
|
||||||
|
<!-- 这里隐藏, 不要 -->
|
||||||
|
<div target="#notebookList" title="{{msg . "notebook"}}" class="minContainer">
|
||||||
|
<i class="fa fa-book"></i>
|
||||||
|
<ul class="dropdown-menu" id="minNotebookList">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div target="#tagNav" title="{{msg . "myTag"}}" class="minContainer">
|
||||||
|
<i class="fa fa-bookmark"></i>
|
||||||
|
<ul class="dropdown-menu" id="minTagNav">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<div id="minShareNotebooks">
|
||||||
|
<!--
|
||||||
|
<div class="minContainer" target="" title="">
|
||||||
|
<i class="fa fa-user"></i>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!--
|
||||||
|
底下隐藏/展开
|
||||||
|
<div id="notebookBottom">
|
||||||
|
<i class="fa fa-angle-left" id="leftSwitcher"></i>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="noteSplit" id="notebookSplitter"></div>
|
||||||
|
|
||||||
|
<div id="noteAndEditor">
|
||||||
|
<div id="noteList">
|
||||||
|
<div class="clearfix" id="notesAndSort" style="position: relative">
|
||||||
|
|
||||||
|
<div class="pull-left">
|
||||||
|
|
||||||
|
<!-- 我的笔记本 -->
|
||||||
|
<div class="dropdown" id="myNotebookNavForListNav">
|
||||||
|
<a class="ios7-a dropdown-toggle" id="dropdownMenu1" data-toggle="dropdown">
|
||||||
|
<span id="curNotebookForListNote">{{msg . "all"}}</span>
|
||||||
|
<i class="fa fa-angle-down"></i>
|
||||||
|
</a>
|
||||||
|
<!-- 如果notebook过多, 则会产生滚动 -->
|
||||||
|
<ul class="dropdown-menu" role="menu"
|
||||||
|
aria-labelledby="dropdownMenu1" style="left: 5px;" id="notebookNavForListNote">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 共享的笔记本 -->
|
||||||
|
<div class="dropdown" id="sharedNotebookNavForListNav" style="display: none">
|
||||||
|
<a class="ios7-a dropdown-toggle" id="dropdownMenu2" data-toggle="dropdown">
|
||||||
|
<span id="curSharedNotebookForListNote">{{msg . "all"}}</span>
|
||||||
|
<i class="fa fa-angle-down"></i>
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu" role="menu"
|
||||||
|
aria-labelledby="dropdownMenu2" style="left: 5px;" id="sharedNotebookNavForListNote">
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="pull-left" id="tagSearch" style="line-height: 38px">
|
||||||
|
</div>
|
||||||
|
<div id="sortType">
|
||||||
|
<div class="dropdown">
|
||||||
|
<a class="ios7-a dropdown-toggle" id="dropdownMenu1"
|
||||||
|
data-toggle="dropdown">
|
||||||
|
<!--
|
||||||
|
<i class="fa fa-sort-alpha-asc">
|
||||||
|
</i>Sort <i class="fa fa-angle-down"></i>
|
||||||
|
-->
|
||||||
|
</a>
|
||||||
|
<ul class="dropdown-menu" role="menu"
|
||||||
|
aria-labelledby="dropdownMenu1"
|
||||||
|
style="right: 3px; ! important; left: -100px; min-width: 100px;">
|
||||||
|
<li role="presentation"><a role="menuitem" tabindex="-1"
|
||||||
|
href="#">创建日期</a></li>
|
||||||
|
<li role="presentation"><a role="menuitem" tabindex="-1"
|
||||||
|
href="#">修改日期</a></li>
|
||||||
|
<li role="presentation"><a role="menuitem" tabindex="-1"
|
||||||
|
href="#">标题</a></li>
|
||||||
|
<li role="presentation" class="divider"></li>
|
||||||
|
<li role="presentation"><a role="menuitem" tabindex="-1"
|
||||||
|
href="#">Separated </a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 笔记列表 -->
|
||||||
|
<!-- wrap 为了slimScroll -->
|
||||||
|
<div id="noteItemListWrap" style="position: absolute; left: 0; right: 0; top: 41px; bottom: 3px">
|
||||||
|
<div id="noteItemList">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="noteSplit" id="noteSplitter"></div>
|
||||||
|
|
||||||
|
<div id="note">
|
||||||
|
<!-- 只读模式 -->
|
||||||
|
<div id="noteRead">
|
||||||
|
<div id="noteReadContainer">
|
||||||
|
<div id="noteReadTop">
|
||||||
|
<h2 id="noteReadTitle"></h2>
|
||||||
|
<div class="clearfix">
|
||||||
|
|
||||||
|
<div class="pull-left">
|
||||||
|
<i class="fa fa-bookmark-o"></i>
|
||||||
|
<span id="noteReadTags"></span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 修改时间 -->
|
||||||
|
<div class="pull-left" style="margin-left: 10px;">
|
||||||
|
<i class="fa fa-calendar"></i>{{msg . "update"}}
|
||||||
|
<span id="noteReadUpdatedTime"></span>
|
||||||
|
</div>
|
||||||
|
<!-- 修改时间 -->
|
||||||
|
<div class="pull-left" style="margin-left: 10px;">
|
||||||
|
<i class="fa fa-calendar"></i>{{msg . "create"}}
|
||||||
|
<span id="noteReadCreatedTime"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="noteReadContent">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- 遮罩, 为了resize3Columns用 -->
|
||||||
|
<div id="noteMask"
|
||||||
|
style="position: absolute; top: 0px; bottom: 0px; right: 0; left: 10px; z-index: -1"></div>
|
||||||
|
<div id="editorMask">
|
||||||
|
该笔记本下空空如也...何不
|
||||||
|
<br />
|
||||||
|
<div id="editorMaskBtns">
|
||||||
|
<br />
|
||||||
|
<a class="note">新建笔记</a>
|
||||||
|
<a class="markdown">新建Markdown笔记</a>
|
||||||
|
</div>
|
||||||
|
<div id="editorMaskBtnsEmpty">
|
||||||
|
Sorry, 这里不能添加笔记的.
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="noteTop">
|
||||||
|
<!-- 左侧放tag, 右侧放按钮, 比如save, info, move, delete -->
|
||||||
|
<div id="tool" class="clearfix">
|
||||||
|
<!-- tag可以参考 mac的文件tag, 预定义一些颜色, 用户也可以自己输入-->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<div class="pull-left" id="noteTitleDiv">
|
||||||
|
<input name="noteTitle" id="noteTitle" value="" placeholder="无标题">
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<div class="pull-left" id="tag">
|
||||||
|
<div id="tags" style="display: inline-block; line-height: 25px;">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="dropdown" style="display: inline-block"
|
||||||
|
id="tagDropdown">
|
||||||
|
<i class="fa fa-bookmark-o"></i>
|
||||||
|
<a
|
||||||
|
class="metro-a dropdown-toggle" data-toggle="dropdown"
|
||||||
|
id="addTagTrigger" style="cursor: text; padding-left: 0">
|
||||||
|
{{msg . "clickAddTag"}}
|
||||||
|
</a>
|
||||||
|
<input type="text" id="addTagInput" />
|
||||||
|
<ul class="dropdown-menu" role="menu" id="tagColor">
|
||||||
|
<li role="presentation"><span class="label label-red">{{msg . "red"}}</span>
|
||||||
|
</li>
|
||||||
|
<li role="presentation"><span class="label label-blue">{{msg . "blue"}}</span>
|
||||||
|
</li>
|
||||||
|
<li role="presentation"><span class="label label-yellow">{{msg . "yellow"}}</span></li>
|
||||||
|
<li role="presentation"><span class="label label-green">{{msg . "green"}}</span></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="pull-right" id="editorTool">
|
||||||
|
<li><a class="ios7-a " id="saveBtn" title="ctrl+s"
|
||||||
|
data-toggle="dropdown">{{msg . "save"}}</a></li>
|
||||||
|
<li><a class="ios7-a " id="tipsBtn"
|
||||||
|
data-toggle="dropdown">{{msg . "editorTips"}}</a></li>
|
||||||
|
<li><a class="ios7-a " id="contentHistory"
|
||||||
|
data-toggle="dropdown">{{msg . "history"}}</a></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="noteTitleDiv">
|
||||||
|
<input name="noteTitle" id="noteTitle" value="" placeholder="{{msg . "unTitled"}}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="editor">
|
||||||
|
<!-- 编辑器 -->
|
||||||
|
<div id="mceToolbar" style="">
|
||||||
|
<div id="popularToolbar"
|
||||||
|
style="position: absolute; right: 30px; left: 0"></div>
|
||||||
|
<a
|
||||||
|
style="dispaly: block; position: absolute; cursor: pointer; right: 10px; padding: 3px 10px"
|
||||||
|
id="moreBtn"> <i class="fa fa-angle-down"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div id="leanoteNav">
|
||||||
|
<h1>
|
||||||
|
<i class="fa fa-align-justify" title="文档导航"></i>
|
||||||
|
<span>{{msg . "nav"}}</span>
|
||||||
|
</h1>
|
||||||
|
<div id="leanoteNavContent">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- 由此可以算高度 -->
|
||||||
|
<div id="editorContent" name="editorContent">
|
||||||
|
{{.noteContent}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div id="mdEditor">
|
||||||
|
<div id="wmd-button-bar" id="mdBar"></div>
|
||||||
|
<!-- 为了scroll -->
|
||||||
|
|
||||||
|
<div class="clearfix" id="mdEditorPreview">
|
||||||
|
<div id="left-column" class="pull-left">
|
||||||
|
<div id="wmd-panel-editor" class="wmd-panel-editor">
|
||||||
|
<textarea class="wmd-input theme" id="wmd-input" spellcheck="false"></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="right-column" class="pull-right">
|
||||||
|
<div id="wmd-panel-preview" class="wmd-panel-preview preview-container">
|
||||||
|
<div id="wmd-preview" class="wmd-preview"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<textarea id="md-section-helper"></textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- mdEditor -->
|
||||||
|
<!-- Hidden Popup Modal -->
|
||||||
|
<div class="modal fade bs-modal-sm" id="editorDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" id="editorDialog-title">操作</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
<p></p>
|
||||||
|
<div class="input-group">
|
||||||
|
<span class="input-group-addon">
|
||||||
|
<i></i>
|
||||||
|
</span>
|
||||||
|
<input type="text" class="form-control" placeholder="">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
|
||||||
|
<button type="button" class="btn btn-primary" id="editorDialog-confirm">确认</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- 弹出框 模板 -->
|
||||||
|
<div class="modal fade bs-modal-sm" id="leanoteDialogRemote" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal fade bs-modal-sm" id="leanoteDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" id="modalTitle">操作</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
内容区
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
||||||
|
<button type="button" class="btn btn-primary">Save changes</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
|
||||||
|
<div class="modal fade bs-modal-sm" id="sendRegisterEmailDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" class="modalTitle">邀请好友</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
<form role="form">
|
||||||
|
<div class="form-group">
|
||||||
|
<div id="registerEmailMsg" class="alert alert-warning" style="display: none">
|
||||||
|
</div>
|
||||||
|
<input type="hidden" id="toEmail"/>
|
||||||
|
<label for="emailContent">邮件内容</label>
|
||||||
|
<textarea class="form-control" id="emailContent">Hi, 我是李铁, leanote非常好用, 快来注册吧.</textarea>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
|
||||||
|
<button type="button" class="btn btn-success" id="registerEmailBtn">发送</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
|
||||||
|
<div class="modal fade bs-modal-sm" id="setThemeDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" class="modalTitle">主题设置</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
<style>
|
||||||
|
#themeForm td {
|
||||||
|
padding: 5px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
#themeForm img {
|
||||||
|
border: 1px solid #eee;
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<table id="themeForm">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label>
|
||||||
|
<img src="/images/slider/all.gif" height="100px">
|
||||||
|
<br />
|
||||||
|
<input type="radio" name="theme" value="default"> {{msg . "default"}}
|
||||||
|
</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<label>
|
||||||
|
<img src="/images/slider/all-simple.gif" height="100px">
|
||||||
|
<br />
|
||||||
|
<input type="radio" name="theme" value="simple"> {{msg . "simple"}}
|
||||||
|
</label>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">{{msg . "close"}}</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
|
||||||
|
<!-- 编辑器提示 -->
|
||||||
|
<div class="modal fade bs-modal-sm" id="tipsDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" class="modalTitle">{{msg . "editorTips"}}</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
{{msg . "editorTipsInfo"}}
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">{{msg . "close"}}</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
|
||||||
|
<!-- 图片上传 -->
|
||||||
|
<div class="modal fade bs-modal-sm" id="imageDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content" style="height: 460px;" >
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" class="modalTitle">{{msg . "uploadImage"}}</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<iframe style="" height="360" src="" scrolling="no" frameBorder="0" width="99%"></iframe>
|
||||||
|
</div>
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
</div><!-- /.modal -->
|
||||||
|
|
||||||
|
<!-- 您的建议
|
||||||
|
<div class="modal fade bs-modal-sm" id="suggestionsDialog" tabindex="-1" role="dialog" aria-labelledby="mySmallModalLabel" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" class="modalTitle">{{msg . "yourSuggestions"}}</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div style="margin-bottom:20px;">
|
||||||
|
{{msg . "suggestionsInfo"}}<br />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="alert alert-warning" id="suggestionMsg" style="display: none"> </div>
|
||||||
|
<textarea style="width: 100%; height: 100px" id="suggestionTextarea" placeholder="{{msg . "suggestions"}}"></textarea>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button id="suggestionBtn" class="btn btn-success" >{{msg . "submit"}}</button>
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">{{msg . "close"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- modal 静态区域 -->
|
||||||
|
<div class="display: hidden">
|
||||||
|
|
||||||
|
<!-- 长微博 -->
|
||||||
|
<div id="html2ImageDialog">
|
||||||
|
<div class="modal-body">
|
||||||
|
<div style="max-height: 300px; padding: 5px 0; text-align: center; overflow: scroll;" class="weibo">
|
||||||
|
<span class="text">
|
||||||
|
leanote正在努力为你生成长微博...
|
||||||
|
</span>
|
||||||
|
<br />
|
||||||
|
<img src="/images/loading-24.gif"/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">{{msg . "cancel"}}</button>
|
||||||
|
<button type="button" class="btn btn-success sendWeiboBtn disabled">{{msg . "send"}}</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 长微博 -->
|
||||||
|
<div id="reSendActiveEmailDialog">
|
||||||
|
<div class="modal-body">
|
||||||
|
<div style="max-height: 300px; padding: 5px 0; text-align: center; overflow: scroll;" class="weibo">
|
||||||
|
<span class="text">
|
||||||
|
<img src="/images/loading-24.gif"/>
|
||||||
|
正在发送邮件到{{.userInfo.Email}}...
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
|
||||||
|
<button type="button" class="btn btn-success viewEmailBtn disabled">查看邮件</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 帐户设置 -->
|
||||||
|
<div id="dialogSetInfo">
|
||||||
|
<div class="modal-body">
|
||||||
|
<ul class="nav nav-tabs" id="myTabs">
|
||||||
|
<li><a href="#baseInfo" data-toggle="tab">{{msg . "basicInfo"}}</a></li>
|
||||||
|
<li><a href="#emailInfo" data-toggle="tab">{{msg . "updateEmail"}}</a></li>
|
||||||
|
<li><a href="#updatePwd" data-toggle="tab">{{msg . "updatePassword"}}</a></li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content">
|
||||||
|
<div class="tab-pane active" id="baseInfo">
|
||||||
|
<form>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="username">用户名设置</label>
|
||||||
|
<div class="alert alert-danger" id="usernameMsg" style="display: none"></div>
|
||||||
|
<input type="text" class="form-control" id="username">
|
||||||
|
你的邮箱是 {{.userInfo.Email}}, 可以再设置一个唯一的用户名.
|
||||||
|
<br />
|
||||||
|
用户名至少4位, 不可含特殊字符.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<button id="usernameBtn" class="btn btn-success">提交</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane" id="emailInfo">
|
||||||
|
<form>
|
||||||
|
<table>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
当前邮箱为: <span id="curEmail">{{.userInfo.Email}}</span>
|
||||||
|
{{if .userInfo.Verified}}
|
||||||
|
已验证
|
||||||
|
{{else}}
|
||||||
|
未验证
|
||||||
|
<a class="raw nowToActive">现在去验证</a>
|
||||||
|
<a class="raw reSendActiveEmail">重新发送</a>
|
||||||
|
{{end}}
|
||||||
|
<br />
|
||||||
|
<label for="email">修改邮箱</label>
|
||||||
|
<div class="alert alert-danger" id="emailMsg" style="display: none"></div>
|
||||||
|
<input type="text" class="form-control" id="email">
|
||||||
|
邮箱修改后, 验证之后才有效, 验证之后新的邮箱地址将会作为登录帐号使用.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<button id="emailBtn" class="btn btn-success">发送验证邮箱</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="tab-pane" id="updatePwd">
|
||||||
|
<form>
|
||||||
|
<table style="width: 80%">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<div class="alert alert-danger" id="pwdMsg" style="display: none"></div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td style="width: 80px">
|
||||||
|
<label for="pwd">{{msg . "oldPassword"}}</label>
|
||||||
|
<input type="password" class="form-control" id="oldPwd" name="oldPwd">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="pwd">{{msg . "newPassword"}}</label>
|
||||||
|
<input type="password" class="form-control" id="pwd" name="pwd">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="pwd2">{{msg . "password2"}}</label>
|
||||||
|
<input type="password" class="form-control" id="pwd2" name="pwd2">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<button id="pwdBtn" class="btn btn-success" style="width: 100%">{{msg . "submit"}}</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- 账号设置, 是通过third 登录进来的 -->
|
||||||
|
<div id="thirdDialogSetInfo">
|
||||||
|
<div class="modal-body">
|
||||||
|
<ul class="nav nav-tabs" id="thirdMyTabs">
|
||||||
|
<li><a href="#accountInfo" data-toggle="tab">创建帐号</a></li>
|
||||||
|
</ul>
|
||||||
|
<div class="tab-content">
|
||||||
|
<div class="tab-pane active" id="accountInfo">
|
||||||
|
您现在使用的是第三方帐号登录leanote, 您也可以注册leanote帐号登录, 赶紧注册一个吧.
|
||||||
|
<br />
|
||||||
|
注册成功后仍可以使用第三方帐号登录leanote并管理您现有的笔记.
|
||||||
|
<form>
|
||||||
|
<div class="alert alert-danger" id="thirdAccountMsg" style="display: none"></div>
|
||||||
|
<table style="width: 100%">
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="thirdEmail">邮箱</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="text" class="form-control" id="thirdEmail">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="thirdPwd">密码</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="password" class="form-control" id="thirdPwd">
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
密码至少6位
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<label for="thirdPwd2">重复密码</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<input type="password" class="form-control" id="thirdPwd2">
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td></td>
|
||||||
|
<td>
|
||||||
|
<button id="accountBtn" class="btn btn-success" style="width: 100%">提交</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="hide" id="copyDiv"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<script src="js/jquery-1.9.0.min.js"></script>
|
||||||
|
<script src="js/i18n/msg.{{.locale}}.js"></script>
|
||||||
|
<script src="js/common-min.js"></script>
|
||||||
|
<script>
|
||||||
|
var UrlPrefix = "http://leanote.com"; // 为了发weibo
|
||||||
|
var UserInfo = json({{.userInfoJson}});
|
||||||
|
var notebooks = json({{.notebooks}});
|
||||||
|
var shareNotebooks = json({{.shareNotebooks}});
|
||||||
|
var sharedUserInfos = json({{.sharedUserInfos}});
|
||||||
|
var notes = json({{.notes}});
|
||||||
|
var noteContentJson = json({{.noteContentJson}});
|
||||||
|
var tagsJson = json({{.tagsJson}});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- 渲染view -->
|
||||||
|
<script src="/js/jQuery-slimScroll-1.3.0/jquery.slimscroll.js"></script>
|
||||||
|
<script src="js/app/page-min.js"></script>
|
||||||
|
|
||||||
|
<script src="tinymce/tinymce.min.js"></script>
|
||||||
|
<script src="js/jquery-cookie-min.js"></script>
|
||||||
|
<script src="js/bootstrap-min.js"></script>
|
||||||
|
<script src="js/app/note-min.js"></script>
|
||||||
|
<script src="js/app/tag-min.js"></script>
|
||||||
|
<script src="js/app/notebook-min.js"></script>
|
||||||
|
<script src="js/app/share-min.js"></script>
|
||||||
|
<script src="js/object_id-min.js"></script>
|
||||||
|
<script src="js/ZeroClipboard/ZeroClipboard-min.js"></script>
|
||||||
|
<script>
|
||||||
|
Notebook.renderNotebooks(notebooks);
|
||||||
|
Share.renderShareNotebooks(sharedUserInfos, shareNotebooks);
|
||||||
|
|
||||||
|
Note.renderNotes(notes);
|
||||||
|
if(!isEmpty(notes)) {
|
||||||
|
Note.changeNote(notes[0].NoteId);
|
||||||
|
}
|
||||||
|
|
||||||
|
Note.setNoteCache(noteContentJson);
|
||||||
|
Note.renderNoteContent(noteContentJson)
|
||||||
|
|
||||||
|
Tag.renderTagNav(tagsJson);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- mdEditor -->
|
||||||
|
<link href="/public/mdeditor/editor/editor.css" rel="stylesheet">
|
||||||
|
<script src="/public/mdeditor/editor/pagedown/Markdown.Converter-min.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/pagedown/Markdown.Sanitizer-min.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/pagedown/Markdown.Editor-min.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/pagedown/local/Markdown.local.zh-min.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/Markdown.Extra-min.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/underscore-min.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/scrollLink-min.js"></script>
|
||||||
|
<!--mathjax-->
|
||||||
|
<script type="text/x-mathjax-config">
|
||||||
|
MathJax.Hub.Config({ tex2jax: { inlineMath: [['$','$'], ["\\(","\\)"]], processEscapes: true }, messageStyle: "none"});
|
||||||
|
</script>
|
||||||
|
<script src="/public/mdeditor/editor/mathJax-min.js"></script>
|
||||||
|
<script src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
|
||||||
|
<script src="/public/mdeditor/editor/jquery.waitforimages-min.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/google-code-prettify/prettify.js"></script>
|
||||||
|
<script src="/public/mdeditor/editor/editor-min.js"></script>
|
||||||
|
<!-- mdEditor end -->
|
||||||
|
|
||||||
|
<!-- context-menu -->
|
||||||
|
<link rel="stylesheet" href="/js/contextmenu/css/contextmenu.css" type="text/css" />
|
||||||
|
<script src="/js/contextmenu/jquery.contextmenu-min.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
{{set . "title" "Home"}}
|
||||||
|
{{template "header.html" .}}
|
||||||
|
|
||||||
|
<header class="hero-unit" style="background-color:red">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="hero-text">
|
||||||
|
<h1>Hello, life</h1>
|
||||||
|
<p></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="span6">
|
||||||
|
{{template "flash.html" .}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "footer.html" .}}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{{template "home/header_box.html" .}}
|
||||||
|
|
||||||
|
<section id="box">
|
||||||
|
<div>
|
||||||
|
<h1>
|
||||||
|
leanote | we got a error
|
||||||
|
</h1>
|
||||||
|
<form class="form-inline" id="boxForm">
|
||||||
|
<p>
|
||||||
|
Sorry, we can't get your infomation.
|
||||||
|
<br />
|
||||||
|
Please <a href="/login">Sign in</a> Or <a href="/register?email={{.email}}">Sign up</a>
|
||||||
|
</p>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
+72
@@ -0,0 +1,72 @@
|
|||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" id="modalTitle">分享 <b>{{.title}}</b></h4>
|
||||||
|
</div>
|
||||||
|
{{$noteOrNotebookId := .noteOrNotebookId}}
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
<button class="btn btn-default" id="addShareNotebookBtn">添加分享</button>
|
||||||
|
<div id="shareMsg" class="alert alert-danger" style="display: none; margin: 5px 0 0 0;"></div>
|
||||||
|
<table class="table table-hover" id="shareNotebookTable">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>#</th>
|
||||||
|
<th>好友邮箱</th>
|
||||||
|
<th>权限</th>
|
||||||
|
<th>删除分享</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<tr id="tr1">
|
||||||
|
<td>#</td>
|
||||||
|
<td>
|
||||||
|
<input id="friendsEmail" type="text" class="form-control" style="width: 200px" placeholder="好友邮箱">
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<label for="readPerm1"><input type="radio" name="perm1" checked="checked" value="0" id="readPerm1"> 只读</label>
|
||||||
|
<label for="writePerm1"><input type="radio" name="perm1" value="1" id="writePerm1"> 可编辑</label>
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<button class="btn btn-success" onclick="addShareNoteOrNotebook(1)">分享</button>
|
||||||
|
<button class="btn btn-warning" onclick="deleteShareNoteOrNotebook(1)">删除</button>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{range $i, $v := .noteOrNotebookShareUserInfos}}
|
||||||
|
{{$toUserId := $v.ToUserId.Hex}}
|
||||||
|
<tr>
|
||||||
|
<td>{{add $i}}</td>
|
||||||
|
<td>{{$v.Email}}</td>
|
||||||
|
<td>
|
||||||
|
{{if eq $v.Perm 0}}
|
||||||
|
<a href="#" noteOrNotebookId="{{$noteOrNotebookId}}" perm="{{$v.Perm}}" toUserId="{{$toUserId}}" title="点击改变权限" class="btn btn-default change-perm">只读</a>
|
||||||
|
{{else}}
|
||||||
|
<a href="#" noteOrNotebookId="{{$noteOrNotebookId}}" perm="{{$v.Perm}}" toUserId="{{$toUserId}}" title="点击改变权限" class="btn btn-default change-perm">可编辑</a>
|
||||||
|
{{end}}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="#" noteOrNotebookId="{{$noteOrNotebookId}}" toUserId="{{$toUserId}}" class="btn btn-warning delete-share">删除</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
<script>
|
||||||
|
Share.dialogIsNote = {{.isNote}};
|
||||||
|
Share.dialogNoteOrNotebookId = '{{.noteOrNotebookId}}';
|
||||||
|
$(function() {
|
||||||
|
setTimeout(function() {
|
||||||
|
$("#tr1 #friendsEmail").focus();
|
||||||
|
}, 500);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
<div class="modal-dialog modal-sm">
|
||||||
|
<div class="modal-content">
|
||||||
|
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title" id="modalTitle">{{.note.Title}} 的分享状态</h4>
|
||||||
|
</div>
|
||||||
|
{{$noteId := .note.NoteId.Hex}}
|
||||||
|
|
||||||
|
<div class="modal-body">
|
||||||
|
{{if .noteShareUserInfos }}
|
||||||
|
<table class="table table-hover">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>#</th>
|
||||||
|
<th>Email</th>
|
||||||
|
<th>权限</th>
|
||||||
|
<th>删除分享</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{{range $i, $v := .noteShareUserInfos}}
|
||||||
|
{{$toUserId := $v.ToUserId.Hex}}
|
||||||
|
<tr>
|
||||||
|
<td>{{add $i}}</td>
|
||||||
|
<td>{{$v.Email}}</td>
|
||||||
|
<td>
|
||||||
|
{{if eq $v.Perm 0}}
|
||||||
|
<a href="#" noteId="{{$noteId}}" perm="{{$v.Perm}}" toUserId="{{$toUserId}}" title="点击改变权限" class="btn btn-default change-perm">只读</a>
|
||||||
|
{{else}}
|
||||||
|
<a href="#" noteId="{{$noteId}}" perm="{{$v.Perm}}" toUserId="{{$toUserId}}" title="点击改变权限" class="btn btn-default change-perm">可编辑</a>
|
||||||
|
{{end}}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
<a href="#" noteId="{{$noteId}}" toUserId="{{$toUserId}}" class="btn btn-warning delete-share">删除</a>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{{else}}
|
||||||
|
无分享信息
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div><!-- /.modal-content -->
|
||||||
|
</div><!-- /.modal-dialog -->
|
||||||
|
<script>
|
||||||
|
$(function() {
|
||||||
|
$(".change-perm").click(function() {
|
||||||
|
var self = this;
|
||||||
|
var perm = $(this).attr("perm");
|
||||||
|
var noteId = $(this).attr("noteId");
|
||||||
|
var toUserId = $(this).attr("toUserId");
|
||||||
|
var toHtml = "可编辑";
|
||||||
|
var toPerm = "1";
|
||||||
|
if(perm == "1") {
|
||||||
|
toHtml = "只读";
|
||||||
|
toPerm = "0";
|
||||||
|
}
|
||||||
|
ajaxGet("/share/UpdateShareNotePerm", {noteId: noteId, perm: toPerm, toUserId: toUserId}, function(ret) {
|
||||||
|
if(ret) {
|
||||||
|
$(self).html(toHtml);
|
||||||
|
$(self).attr("perm", toPerm);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$(".delete-share").click(function() {
|
||||||
|
var self = this;
|
||||||
|
var noteId = $(this).attr("noteId");
|
||||||
|
var toUserId = $(this).attr("toUserId");
|
||||||
|
ajaxGet("/share/DeleteShareNote", {noteId: noteId, toUserId: toUserId}, function(ret) {
|
||||||
|
if(ret) {
|
||||||
|
$(self).parent().parent().remove();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
{{template "home/header_box.html" .}}
|
||||||
|
<section id="box">
|
||||||
|
<div id="posts">
|
||||||
|
<h1>
|
||||||
|
leanote 验证邮箱 -
|
||||||
|
{{if .ok}}成功{{else}}失败{{end}}
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<form class="form-inline" id="boxForm">
|
||||||
|
|
||||||
|
您的邮箱 {{.email}} 验证
|
||||||
|
{{if .ok}}成功{{else}}失败{{end}}
|
||||||
|
|
||||||
|
{{if .msg}}<br />{{.msg}}{{end}}
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<a href="/note">回到我的笔记</a>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
{{template "home/header_box.html" .}}
|
||||||
|
<section id="box">
|
||||||
|
<div>
|
||||||
|
<h1>
|
||||||
|
leanote 验证邮箱 -
|
||||||
|
{{if .ok}}成功{{else}}失败{{end}}
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<form class="form-inline" id="boxForm">
|
||||||
|
您的邮箱 {{.email}} 验证
|
||||||
|
{{if .ok}}成功{{else}}失败{{end}}
|
||||||
|
{{if .ok}}
|
||||||
|
<br />
|
||||||
|
您的新登录邮箱为 {{.email}}
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{if .msg}}<br />{{.msg}}{{end}}
|
||||||
|
|
||||||
|
<br />
|
||||||
|
<a href="/note">回到我的笔记</a>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
BIN
Binary file not shown.
Regular → Executable
BIN
Binary file not shown.
@@ -0,0 +1,23 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
SCRIPTPATH=$(cd "$(dirname "$0")"; pwd)
|
||||||
|
|
||||||
|
# set link
|
||||||
|
#
|
||||||
|
#path="$SCRIPTPATH/src/github.com/leanote"
|
||||||
|
#if [ ! -d "$path" ]; then
|
||||||
|
# mkdir -p "$path"
|
||||||
|
#fi
|
||||||
|
# ln -s ../../../../ $SCRIPTPATH/src/github.com/leanote/leanote
|
||||||
|
|
||||||
|
# set GOPATH
|
||||||
|
export GOPATH=$GOPATH:$SCRIPTPATH
|
||||||
|
|
||||||
|
# run
|
||||||
|
osName=`uname`
|
||||||
|
if [ $osName == "Darwin" ]; then
|
||||||
|
chmod 777 "$SCRIPTPATH/leanote-mac"
|
||||||
|
"$SCRIPTPATH/leanote-mac" -importPath github.com/leanote/leanote
|
||||||
|
else
|
||||||
|
chmod 777 "$SCRIPTPATH/leanote-linux"
|
||||||
|
"$SCRIPTPATH/leanote-linux" -importPath github.com/leanote/leanote
|
||||||
|
fi
|
||||||
File renamed without changes.
+545
@@ -0,0 +1,545 @@
|
|||||||
|
3dm=x-world/x-3dmf
|
||||||
|
3dmf=x-world/x-3dmf
|
||||||
|
7z=application/x-7z-compressed
|
||||||
|
a=application/octet-stream
|
||||||
|
aab=application/x-authorware-bin
|
||||||
|
aam=application/x-authorware-map
|
||||||
|
aas=application/x-authorware-seg
|
||||||
|
abc=text/vndabc
|
||||||
|
ace=application/x-ace-compressed
|
||||||
|
acgi=text/html
|
||||||
|
afl=video/animaflex
|
||||||
|
ai=application/postscript
|
||||||
|
aif=audio/aiff
|
||||||
|
aifc=audio/aiff
|
||||||
|
aiff=audio/aiff
|
||||||
|
aim=application/x-aim
|
||||||
|
aip=text/x-audiosoft-intra
|
||||||
|
alz=application/x-alz-compressed
|
||||||
|
ani=application/x-navi-animation
|
||||||
|
aos=application/x-nokia-9000-communicator-add-on-software
|
||||||
|
aps=application/mime
|
||||||
|
arc=application/x-arc-compressed
|
||||||
|
arj=application/arj
|
||||||
|
art=image/x-jg
|
||||||
|
asf=video/x-ms-asf
|
||||||
|
asm=text/x-asm
|
||||||
|
asp=text/asp
|
||||||
|
asx=application/x-mplayer2
|
||||||
|
au=audio/basic
|
||||||
|
avi=video/x-msvideo
|
||||||
|
avs=video/avs-video
|
||||||
|
bcpio=application/x-bcpio
|
||||||
|
bin=application/mac-binary
|
||||||
|
bmp=image/bmp
|
||||||
|
boo=application/book
|
||||||
|
book=application/book
|
||||||
|
boz=application/x-bzip2
|
||||||
|
bsh=application/x-bsh
|
||||||
|
bz2=application/x-bzip2
|
||||||
|
bz=application/x-bzip
|
||||||
|
c++=text/plain
|
||||||
|
c=text/x-c
|
||||||
|
cab=application/vnd.ms-cab-compressed
|
||||||
|
cat=application/vndms-pkiseccat
|
||||||
|
cc=text/x-c
|
||||||
|
ccad=application/clariscad
|
||||||
|
cco=application/x-cocoa
|
||||||
|
cdf=application/cdf
|
||||||
|
cer=application/pkix-cert
|
||||||
|
cha=application/x-chat
|
||||||
|
chat=application/x-chat
|
||||||
|
chrt=application/vnd.kde.kchart
|
||||||
|
class=application/java
|
||||||
|
# ? class=application/java-vm
|
||||||
|
com=text/plain
|
||||||
|
conf=text/plain
|
||||||
|
cpio=application/x-cpio
|
||||||
|
cpp=text/x-c
|
||||||
|
cpt=application/mac-compactpro
|
||||||
|
crl=application/pkcs-crl
|
||||||
|
crt=application/pkix-cert
|
||||||
|
crx=application/x-chrome-extension
|
||||||
|
csh=text/x-scriptcsh
|
||||||
|
css=text/css
|
||||||
|
csv=text/csv
|
||||||
|
cxx=text/plain
|
||||||
|
dar=application/x-dar
|
||||||
|
dcr=application/x-director
|
||||||
|
deb=application/x-debian-package
|
||||||
|
deepv=application/x-deepv
|
||||||
|
def=text/plain
|
||||||
|
der=application/x-x509-ca-cert
|
||||||
|
dif=video/x-dv
|
||||||
|
dir=application/x-director
|
||||||
|
divx=video/divx
|
||||||
|
dl=video/dl
|
||||||
|
dmg=application/x-apple-diskimage
|
||||||
|
doc=application/msword
|
||||||
|
dot=application/msword
|
||||||
|
dp=application/commonground
|
||||||
|
drw=application/drafting
|
||||||
|
dump=application/octet-stream
|
||||||
|
dv=video/x-dv
|
||||||
|
dvi=application/x-dvi
|
||||||
|
dwf=drawing/x-dwf=(old)
|
||||||
|
dwg=application/acad
|
||||||
|
dxf=application/dxf
|
||||||
|
dxr=application/x-director
|
||||||
|
el=text/x-scriptelisp
|
||||||
|
elc=application/x-bytecodeelisp=(compiled=elisp)
|
||||||
|
eml=message/rfc822
|
||||||
|
env=application/x-envoy
|
||||||
|
eps=application/postscript
|
||||||
|
es=application/x-esrehber
|
||||||
|
etx=text/x-setext
|
||||||
|
evy=application/envoy
|
||||||
|
exe=application/octet-stream
|
||||||
|
f77=text/x-fortran
|
||||||
|
f90=text/x-fortran
|
||||||
|
f=text/x-fortran
|
||||||
|
fdf=application/vndfdf
|
||||||
|
fif=application/fractals
|
||||||
|
fli=video/fli
|
||||||
|
flo=image/florian
|
||||||
|
flv=video/x-flv
|
||||||
|
flx=text/vndfmiflexstor
|
||||||
|
fmf=video/x-atomic3d-feature
|
||||||
|
for=text/x-fortran
|
||||||
|
fpx=image/vndfpx
|
||||||
|
frl=application/freeloader
|
||||||
|
funk=audio/make
|
||||||
|
g3=image/g3fax
|
||||||
|
g=text/plain
|
||||||
|
gif=image/gif
|
||||||
|
gl=video/gl
|
||||||
|
gsd=audio/x-gsm
|
||||||
|
gsm=audio/x-gsm
|
||||||
|
gsp=application/x-gsp
|
||||||
|
gss=application/x-gss
|
||||||
|
gtar=application/x-gtar
|
||||||
|
gz=application/x-compressed
|
||||||
|
gzip=application/x-gzip
|
||||||
|
h=text/x-h
|
||||||
|
hdf=application/x-hdf
|
||||||
|
help=application/x-helpfile
|
||||||
|
hgl=application/vndhp-hpgl
|
||||||
|
hh=text/x-h
|
||||||
|
hlb=text/x-script
|
||||||
|
hlp=application/hlp
|
||||||
|
hpg=application/vndhp-hpgl
|
||||||
|
hpgl=application/vndhp-hpgl
|
||||||
|
hqx=application/binhex
|
||||||
|
hta=application/hta
|
||||||
|
htc=text/x-component
|
||||||
|
htm=text/html
|
||||||
|
html=text/html
|
||||||
|
htmls=text/html
|
||||||
|
htt=text/webviewhtml
|
||||||
|
htx=text/html
|
||||||
|
ice=x-conference/x-cooltalk
|
||||||
|
ico=image/x-icon
|
||||||
|
ics=text/calendar
|
||||||
|
icz=text/calendar
|
||||||
|
idc=text/plain
|
||||||
|
ief=image/ief
|
||||||
|
iefs=image/ief
|
||||||
|
iges=application/iges
|
||||||
|
igs=application/iges
|
||||||
|
ima=application/x-ima
|
||||||
|
imap=application/x-httpd-imap
|
||||||
|
inf=application/inf
|
||||||
|
ins=application/x-internett-signup
|
||||||
|
ip=application/x-ip2
|
||||||
|
isu=video/x-isvideo
|
||||||
|
it=audio/it
|
||||||
|
iv=application/x-inventor
|
||||||
|
ivr=i-world/i-vrml
|
||||||
|
ivy=application/x-livescreen
|
||||||
|
jam=audio/x-jam
|
||||||
|
jav=text/x-java-source
|
||||||
|
java=text/x-java-source
|
||||||
|
jcm=application/x-java-commerce
|
||||||
|
jfif-tbnl=image/jpeg
|
||||||
|
jfif=image/jpeg
|
||||||
|
jnlp=application/x-java-jnlp-file
|
||||||
|
jpe=image/jpeg
|
||||||
|
jpeg=image/jpeg
|
||||||
|
jpg=image/jpeg
|
||||||
|
jps=image/x-jps
|
||||||
|
js=application/javascript
|
||||||
|
json=application/json
|
||||||
|
jut=image/jutvision
|
||||||
|
kar=audio/midi
|
||||||
|
karbon=application/vnd.kde.karbon
|
||||||
|
kfo=application/vnd.kde.kformula
|
||||||
|
flw=application/vnd.kde.kivio
|
||||||
|
kml=application/vnd.google-earth.kml+xml
|
||||||
|
kmz=application/vnd.google-earth.kmz
|
||||||
|
kon=application/vnd.kde.kontour
|
||||||
|
kpr=application/vnd.kde.kpresenter
|
||||||
|
kpt=application/vnd.kde.kpresenter
|
||||||
|
ksp=application/vnd.kde.kspread
|
||||||
|
kwd=application/vnd.kde.kword
|
||||||
|
kwt=application/vnd.kde.kword
|
||||||
|
ksh=text/x-scriptksh
|
||||||
|
la=audio/nspaudio
|
||||||
|
lam=audio/x-liveaudio
|
||||||
|
latex=application/x-latex
|
||||||
|
lha=application/lha
|
||||||
|
lhx=application/octet-stream
|
||||||
|
list=text/plain
|
||||||
|
lma=audio/nspaudio
|
||||||
|
log=text/plain
|
||||||
|
lsp=text/x-scriptlisp
|
||||||
|
lst=text/plain
|
||||||
|
lsx=text/x-la-asf
|
||||||
|
ltx=application/x-latex
|
||||||
|
lzh=application/octet-stream
|
||||||
|
lzx=application/lzx
|
||||||
|
m1v=video/mpeg
|
||||||
|
m2a=audio/mpeg
|
||||||
|
m2v=video/mpeg
|
||||||
|
m3u=audio/x-mpegurl
|
||||||
|
m=text/x-m
|
||||||
|
man=application/x-troff-man
|
||||||
|
manifest=text/cache-manifest
|
||||||
|
map=application/x-navimap
|
||||||
|
mar=text/plain
|
||||||
|
mbd=application/mbedlet
|
||||||
|
mc$=application/x-magic-cap-package-10
|
||||||
|
mcd=application/mcad
|
||||||
|
mcf=text/mcf
|
||||||
|
mcp=application/netmc
|
||||||
|
me=application/x-troff-me
|
||||||
|
mht=message/rfc822
|
||||||
|
mhtml=message/rfc822
|
||||||
|
mid=application/x-midi
|
||||||
|
midi=application/x-midi
|
||||||
|
mif=application/x-frame
|
||||||
|
mime=message/rfc822
|
||||||
|
mjf=audio/x-vndaudioexplosionmjuicemediafile
|
||||||
|
mjpg=video/x-motion-jpeg
|
||||||
|
mm=application/base64
|
||||||
|
mme=application/base64
|
||||||
|
mod=audio/mod
|
||||||
|
moov=video/quicktime
|
||||||
|
mov=video/quicktime
|
||||||
|
movie=video/x-sgi-movie
|
||||||
|
mp2=audio/mpeg
|
||||||
|
mp3=audio/mpeg3
|
||||||
|
mp4=video/mp4
|
||||||
|
mpa=audio/mpeg
|
||||||
|
mpc=application/x-project
|
||||||
|
mpe=video/mpeg
|
||||||
|
mpeg=video/mpeg
|
||||||
|
mpg=video/mpeg
|
||||||
|
mpga=audio/mpeg
|
||||||
|
mpp=application/vndms-project
|
||||||
|
mpt=application/x-project
|
||||||
|
mpv=application/x-project
|
||||||
|
mpx=application/x-project
|
||||||
|
mrc=application/marc
|
||||||
|
ms=application/x-troff-ms
|
||||||
|
mv=video/x-sgi-movie
|
||||||
|
my=audio/make
|
||||||
|
mzz=application/x-vndaudioexplosionmzz
|
||||||
|
nap=image/naplps
|
||||||
|
naplps=image/naplps
|
||||||
|
nc=application/x-netcdf
|
||||||
|
ncm=application/vndnokiaconfiguration-message
|
||||||
|
nif=image/x-niff
|
||||||
|
niff=image/x-niff
|
||||||
|
nix=application/x-mix-transfer
|
||||||
|
nsc=application/x-conference
|
||||||
|
nvd=application/x-navidoc
|
||||||
|
o=application/octet-stream
|
||||||
|
oda=application/oda
|
||||||
|
odb=application/vnd.oasis.opendocument.database
|
||||||
|
odc=application/vnd.oasis.opendocument.chart
|
||||||
|
odf=application/vnd.oasis.opendocument.formula
|
||||||
|
odg=application/vnd.oasis.opendocument.graphics
|
||||||
|
odi=application/vnd.oasis.opendocument.image
|
||||||
|
odm=application/vnd.oasis.opendocument.text-master
|
||||||
|
odp=application/vnd.oasis.opendocument.presentation
|
||||||
|
ods=application/vnd.oasis.opendocument.spreadsheet
|
||||||
|
odt=application/vnd.oasis.opendocument.text
|
||||||
|
oga=audio/ogg
|
||||||
|
ogg=audio/ogg
|
||||||
|
ogv=video/ogg
|
||||||
|
omc=application/x-omc
|
||||||
|
omcd=application/x-omcdatamaker
|
||||||
|
omcr=application/x-omcregerator
|
||||||
|
otc=application/vnd.oasis.opendocument.chart-template
|
||||||
|
otf=application/vnd.oasis.opendocument.formula-template
|
||||||
|
otg=application/vnd.oasis.opendocument.graphics-template
|
||||||
|
oth=application/vnd.oasis.opendocument.text-web
|
||||||
|
oti=application/vnd.oasis.opendocument.image-template
|
||||||
|
otm=application/vnd.oasis.opendocument.text-master
|
||||||
|
otp=application/vnd.oasis.opendocument.presentation-template
|
||||||
|
ots=application/vnd.oasis.opendocument.spreadsheet-template
|
||||||
|
ott=application/vnd.oasis.opendocument.text-template
|
||||||
|
p10=application/pkcs10
|
||||||
|
p12=application/pkcs-12
|
||||||
|
p7a=application/x-pkcs7-signature
|
||||||
|
p7c=application/pkcs7-mime
|
||||||
|
p7m=application/pkcs7-mime
|
||||||
|
p7r=application/x-pkcs7-certreqresp
|
||||||
|
p7s=application/pkcs7-signature
|
||||||
|
p=text/x-pascal
|
||||||
|
part=application/pro_eng
|
||||||
|
pas=text/pascal
|
||||||
|
pbm=image/x-portable-bitmap
|
||||||
|
pcl=application/vndhp-pcl
|
||||||
|
pct=image/x-pict
|
||||||
|
pcx=image/x-pcx
|
||||||
|
pdb=chemical/x-pdb
|
||||||
|
pdf=application/pdf
|
||||||
|
pfunk=audio/make
|
||||||
|
pgm=image/x-portable-graymap
|
||||||
|
pic=image/pict
|
||||||
|
pict=image/pict
|
||||||
|
pkg=application/x-newton-compatible-pkg
|
||||||
|
pko=application/vndms-pkipko
|
||||||
|
pl=text/x-scriptperl
|
||||||
|
plx=application/x-pixclscript
|
||||||
|
pm4=application/x-pagemaker
|
||||||
|
pm5=application/x-pagemaker
|
||||||
|
pm=text/x-scriptperl-module
|
||||||
|
png=image/png
|
||||||
|
pnm=application/x-portable-anymap
|
||||||
|
pot=application/mspowerpoint
|
||||||
|
pov=model/x-pov
|
||||||
|
ppa=application/vndms-powerpoint
|
||||||
|
ppm=image/x-portable-pixmap
|
||||||
|
pps=application/mspowerpoint
|
||||||
|
ppt=application/mspowerpoint
|
||||||
|
ppz=application/mspowerpoint
|
||||||
|
pre=application/x-freelance
|
||||||
|
prt=application/pro_eng
|
||||||
|
ps=application/postscript
|
||||||
|
psd=application/octet-stream
|
||||||
|
pvu=paleovu/x-pv
|
||||||
|
pwz=application/vndms-powerpoint
|
||||||
|
py=text/x-scriptphyton
|
||||||
|
pyc=applicaiton/x-bytecodepython
|
||||||
|
qcp=audio/vndqcelp
|
||||||
|
qd3=x-world/x-3dmf
|
||||||
|
qd3d=x-world/x-3dmf
|
||||||
|
qif=image/x-quicktime
|
||||||
|
qt=video/quicktime
|
||||||
|
qtc=video/x-qtc
|
||||||
|
qti=image/x-quicktime
|
||||||
|
qtif=image/x-quicktime
|
||||||
|
ra=audio/x-pn-realaudio
|
||||||
|
ram=audio/x-pn-realaudio
|
||||||
|
rar=application/x-rar-compressed
|
||||||
|
ras=application/x-cmu-raster
|
||||||
|
rast=image/cmu-raster
|
||||||
|
rexx=text/x-scriptrexx
|
||||||
|
rf=image/vndrn-realflash
|
||||||
|
rgb=image/x-rgb
|
||||||
|
rm=application/vndrn-realmedia
|
||||||
|
rmi=audio/mid
|
||||||
|
rmm=audio/x-pn-realaudio
|
||||||
|
rmp=audio/x-pn-realaudio
|
||||||
|
rng=application/ringing-tones
|
||||||
|
rnx=application/vndrn-realplayer
|
||||||
|
roff=application/x-troff
|
||||||
|
rp=image/vndrn-realpix
|
||||||
|
rpm=audio/x-pn-realaudio-plugin
|
||||||
|
rt=text/vndrn-realtext
|
||||||
|
rtf=text/richtext
|
||||||
|
rtx=text/richtext
|
||||||
|
rv=video/vndrn-realvideo
|
||||||
|
s=text/x-asm
|
||||||
|
s3m=audio/s3m
|
||||||
|
s7z=application/x-7z-compressed
|
||||||
|
saveme=application/octet-stream
|
||||||
|
sbk=application/x-tbook
|
||||||
|
scm=text/x-scriptscheme
|
||||||
|
sdml=text/plain
|
||||||
|
sdp=application/sdp
|
||||||
|
sdr=application/sounder
|
||||||
|
sea=application/sea
|
||||||
|
set=application/set
|
||||||
|
sgm=text/x-sgml
|
||||||
|
sgml=text/x-sgml
|
||||||
|
sh=text/x-scriptsh
|
||||||
|
shar=application/x-bsh
|
||||||
|
shtml=text/x-server-parsed-html
|
||||||
|
sid=audio/x-psid
|
||||||
|
skd=application/x-koan
|
||||||
|
skm=application/x-koan
|
||||||
|
skp=application/x-koan
|
||||||
|
skt=application/x-koan
|
||||||
|
sit=application/x-stuffit
|
||||||
|
sitx=application/x-stuffitx
|
||||||
|
sl=application/x-seelogo
|
||||||
|
smi=application/smil
|
||||||
|
smil=application/smil
|
||||||
|
snd=audio/basic
|
||||||
|
sol=application/solids
|
||||||
|
spc=text/x-speech
|
||||||
|
spl=application/futuresplash
|
||||||
|
spr=application/x-sprite
|
||||||
|
sprite=application/x-sprite
|
||||||
|
spx=audio/ogg
|
||||||
|
src=application/x-wais-source
|
||||||
|
ssi=text/x-server-parsed-html
|
||||||
|
ssm=application/streamingmedia
|
||||||
|
sst=application/vndms-pkicertstore
|
||||||
|
step=application/step
|
||||||
|
stl=application/sla
|
||||||
|
stp=application/step
|
||||||
|
sv4cpio=application/x-sv4cpio
|
||||||
|
sv4crc=application/x-sv4crc
|
||||||
|
svf=image/vnddwg
|
||||||
|
svg=image/svg+xml
|
||||||
|
svr=application/x-world
|
||||||
|
swf=application/x-shockwave-flash
|
||||||
|
t=application/x-troff
|
||||||
|
talk=text/x-speech
|
||||||
|
tar=application/x-tar
|
||||||
|
tbk=application/toolbook
|
||||||
|
tcl=text/x-scripttcl
|
||||||
|
tcsh=text/x-scripttcsh
|
||||||
|
tex=application/x-tex
|
||||||
|
texi=application/x-texinfo
|
||||||
|
texinfo=application/x-texinfo
|
||||||
|
text=text/plain
|
||||||
|
tgz=application/gnutar
|
||||||
|
tif=image/tiff
|
||||||
|
tiff=image/tiff
|
||||||
|
tr=application/x-troff
|
||||||
|
tsi=audio/tsp-audio
|
||||||
|
tsp=application/dsptype
|
||||||
|
tsv=text/tab-separated-values
|
||||||
|
turbot=image/florian
|
||||||
|
txt=text/plain
|
||||||
|
uil=text/x-uil
|
||||||
|
uni=text/uri-list
|
||||||
|
unis=text/uri-list
|
||||||
|
unv=application/i-deas
|
||||||
|
uri=text/uri-list
|
||||||
|
uris=text/uri-list
|
||||||
|
ustar=application/x-ustar
|
||||||
|
uu=text/x-uuencode
|
||||||
|
uue=text/x-uuencode
|
||||||
|
vcd=application/x-cdlink
|
||||||
|
vcf=text/x-vcard
|
||||||
|
vcard=text/x-vcard
|
||||||
|
vcs=text/x-vcalendar
|
||||||
|
vda=application/vda
|
||||||
|
vdo=video/vdo
|
||||||
|
vew=application/groupwise
|
||||||
|
viv=video/vivo
|
||||||
|
vivo=video/vivo
|
||||||
|
vmd=application/vocaltec-media-desc
|
||||||
|
vmf=application/vocaltec-media-file
|
||||||
|
voc=audio/voc
|
||||||
|
vos=video/vosaic
|
||||||
|
vox=audio/voxware
|
||||||
|
vqe=audio/x-twinvq-plugin
|
||||||
|
vqf=audio/x-twinvq
|
||||||
|
vql=audio/x-twinvq-plugin
|
||||||
|
vrml=application/x-vrml
|
||||||
|
vrt=x-world/x-vrt
|
||||||
|
vsd=application/x-visio
|
||||||
|
vst=application/x-visio
|
||||||
|
vsw=application/x-visio
|
||||||
|
w60=application/wordperfect60
|
||||||
|
w61=application/wordperfect61
|
||||||
|
w6w=application/msword
|
||||||
|
wav=audio/wav
|
||||||
|
wb1=application/x-qpro
|
||||||
|
wbmp=image/vnd.wap.wbmp
|
||||||
|
web=application/vndxara
|
||||||
|
wiz=application/msword
|
||||||
|
wk1=application/x-123
|
||||||
|
wmf=windows/metafile
|
||||||
|
wml=text/vnd.wap.wml
|
||||||
|
wmlc=application/vnd.wap.wmlc
|
||||||
|
wmls=text/vnd.wap.wmlscript
|
||||||
|
wmlsc=application/vnd.wap.wmlscriptc
|
||||||
|
word=application/msword
|
||||||
|
wp5=application/wordperfect
|
||||||
|
wp6=application/wordperfect
|
||||||
|
wp=application/wordperfect
|
||||||
|
wpd=application/wordperfect
|
||||||
|
wq1=application/x-lotus
|
||||||
|
wri=application/mswrite
|
||||||
|
wrl=application/x-world
|
||||||
|
wrz=model/vrml
|
||||||
|
wsc=text/scriplet
|
||||||
|
wsrc=application/x-wais-source
|
||||||
|
wtk=application/x-wintalk
|
||||||
|
x-png=image/png
|
||||||
|
xbm=image/x-xbitmap
|
||||||
|
xdr=video/x-amt-demorun
|
||||||
|
xgz=xgl/drawing
|
||||||
|
xif=image/vndxiff
|
||||||
|
xl=application/excel
|
||||||
|
xla=application/excel
|
||||||
|
xlb=application/excel
|
||||||
|
xlc=application/excel
|
||||||
|
xld=application/excel
|
||||||
|
xlk=application/excel
|
||||||
|
xll=application/excel
|
||||||
|
xlm=application/excel
|
||||||
|
xls=application/excel
|
||||||
|
xlt=application/excel
|
||||||
|
xlv=application/excel
|
||||||
|
xlw=application/excel
|
||||||
|
xm=audio/xm
|
||||||
|
xml=text/xml
|
||||||
|
xmz=xgl/movie
|
||||||
|
xpix=application/x-vndls-xpix
|
||||||
|
xpm=image/x-xpixmap
|
||||||
|
xsr=video/x-amt-showrun
|
||||||
|
xwd=image/x-xwd
|
||||||
|
xyz=chemical/x-pdb
|
||||||
|
z=application/x-compress
|
||||||
|
zip=application/zip
|
||||||
|
zoo=application/octet-stream
|
||||||
|
zsh=text/x-scriptzsh
|
||||||
|
# Office 2007 mess - http://wdg.uncc.edu/Microsoft_Office_2007_MIME_Types_for_Apache_and_IIS
|
||||||
|
docx=application/vnd.openxmlformats-officedocument.wordprocessingml.document
|
||||||
|
docm=application/vnd.ms-word.document.macroEnabled.12
|
||||||
|
dotx=application/vnd.openxmlformats-officedocument.wordprocessingml.template
|
||||||
|
dotm=application/vnd.ms-word.template.macroEnabled.12
|
||||||
|
xlsx=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
|
||||||
|
xlsm=application/vnd.ms-excel.sheet.macroEnabled.12
|
||||||
|
xltx=application/vnd.openxmlformats-officedocument.spreadsheetml.template
|
||||||
|
xltm=application/vnd.ms-excel.template.macroEnabled.12
|
||||||
|
xlsb=application/vnd.ms-excel.sheet.binary.macroEnabled.12
|
||||||
|
xlam=application/vnd.ms-excel.addin.macroEnabled.12
|
||||||
|
pptx=application/vnd.openxmlformats-officedocument.presentationml.presentation
|
||||||
|
pptm=application/vnd.ms-powerpoint.presentation.macroEnabled.12
|
||||||
|
ppsx=application/vnd.openxmlformats-officedocument.presentationml.slideshow
|
||||||
|
ppsm=application/vnd.ms-powerpoint.slideshow.macroEnabled.12
|
||||||
|
potx=application/vnd.openxmlformats-officedocument.presentationml.template
|
||||||
|
potm=application/vnd.ms-powerpoint.template.macroEnabled.12
|
||||||
|
ppam=application/vnd.ms-powerpoint.addin.macroEnabled.12
|
||||||
|
sldx=application/vnd.openxmlformats-officedocument.presentationml.slide
|
||||||
|
sldm=application/vnd.ms-powerpoint.slide.macroEnabled.12
|
||||||
|
thmx=application/vnd.ms-officetheme
|
||||||
|
onetoc=application/onenote
|
||||||
|
onetoc2=application/onenote
|
||||||
|
onetmp=application/onenote
|
||||||
|
onepkg=application/onenote
|
||||||
|
# koffice
|
||||||
|
|
||||||
|
# iWork
|
||||||
|
key=application/x-iwork-keynote-sffkey
|
||||||
|
kth=application/x-iwork-keynote-sffkth
|
||||||
|
nmbtemplate=application/x-iwork-numbers-sfftemplate
|
||||||
|
numbers=application/x-iwork-numbers-sffnumbers
|
||||||
|
pages=application/x-iwork-pages-sffpages
|
||||||
|
template=application/x-iwork-pages-sfftemplate
|
||||||
|
|
||||||
|
# Extensions for Mozilla apps (Firefox and friends)
|
||||||
|
xpi=application/x-xpinstall
|
||||||
|
|
||||||
|
# Opera extensions
|
||||||
|
oex=application/x-opera-extension
|
||||||
+100
@@ -0,0 +1,100 @@
|
|||||||
|
package controllers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/revel/revel"
|
||||||
|
"os"
|
||||||
|
fpath "path/filepath"
|
||||||
|
"strings"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Static struct {
|
||||||
|
*revel.Controller
|
||||||
|
}
|
||||||
|
|
||||||
|
// This method handles requests for files. The supplied prefix may be absolute
|
||||||
|
// or relative. If the prefix is relative it is assumed to be relative to the
|
||||||
|
// application directory. The filepath may either be just a file or an
|
||||||
|
// additional filepath to search for the given file. This response may return
|
||||||
|
// the following responses in the event of an error or invalid request;
|
||||||
|
// 403(Forbidden): If the prefix filepath combination results in a directory.
|
||||||
|
// 404(Not found): If the prefix and filepath combination results in a non-existent file.
|
||||||
|
// 500(Internal Server Error): There are a few edge cases that would likely indicate some configuration error outside of revel.
|
||||||
|
//
|
||||||
|
// Note that when defining routes in routes/conf the parameters must not have
|
||||||
|
// spaces around the comma.
|
||||||
|
// Bad: Static.Serve("public/img", "favicon.png")
|
||||||
|
// Good: Static.Serve("public/img","favicon.png")
|
||||||
|
//
|
||||||
|
// Examples:
|
||||||
|
// Serving a directory
|
||||||
|
// Route (conf/routes):
|
||||||
|
// GET /public/{<.*>filepath} Static.Serve("public")
|
||||||
|
// Request:
|
||||||
|
// public/js/sessvars.js
|
||||||
|
// Calls
|
||||||
|
// Static.Serve("public","js/sessvars.js")
|
||||||
|
//
|
||||||
|
// Serving a file
|
||||||
|
// Route (conf/routes):
|
||||||
|
// GET /favicon.ico Static.Serve("public/img","favicon.png")
|
||||||
|
// Request:
|
||||||
|
// favicon.ico
|
||||||
|
// Calls:
|
||||||
|
// Static.Serve("public/img", "favicon.png")
|
||||||
|
func (c Static) Serve(prefix, filepath string) revel.Result {
|
||||||
|
var basePath string
|
||||||
|
|
||||||
|
if !fpath.IsAbs(prefix) {
|
||||||
|
basePath = revel.BasePath
|
||||||
|
}
|
||||||
|
|
||||||
|
basePathPrefix := fpath.Join(basePath, fpath.FromSlash(prefix))
|
||||||
|
fname := fpath.Join(basePathPrefix, fpath.FromSlash(filepath))
|
||||||
|
if !strings.HasPrefix(fname, basePathPrefix) {
|
||||||
|
revel.WARN.Printf("Attempted to read file outside of base path: %s", fname)
|
||||||
|
return c.NotFound("")
|
||||||
|
}
|
||||||
|
|
||||||
|
finfo, err := os.Stat(fname)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) || err.(*os.PathError).Err == syscall.ENOTDIR {
|
||||||
|
revel.WARN.Printf("File not found (%s): %s ", fname, err)
|
||||||
|
return c.NotFound("File not found")
|
||||||
|
}
|
||||||
|
revel.ERROR.Printf("Error trying to get fileinfo for '%s': %s", fname, err)
|
||||||
|
return c.RenderError(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if finfo.Mode().IsDir() {
|
||||||
|
revel.WARN.Printf("Attempted directory listing of %s", fname)
|
||||||
|
return c.Forbidden("Directory listing not allowed")
|
||||||
|
}
|
||||||
|
|
||||||
|
file, err := os.Open(fname)
|
||||||
|
if err != nil {
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
revel.WARN.Printf("File not found (%s): %s ", fname, err)
|
||||||
|
return c.NotFound("File not found")
|
||||||
|
}
|
||||||
|
revel.ERROR.Printf("Error opening '%s': %s", fname, err)
|
||||||
|
return c.RenderError(err)
|
||||||
|
}
|
||||||
|
return c.RenderFile(file, revel.Inline)
|
||||||
|
}
|
||||||
|
|
||||||
|
// This method allows modules to serve binary files. The parameters are the same
|
||||||
|
// as Static.Serve with the additional module name pre-pended to the list of
|
||||||
|
// arguments.
|
||||||
|
func (c Static) ServeModule(moduleName, prefix, filepath string) revel.Result {
|
||||||
|
var basePath string
|
||||||
|
for _, module := range revel.Modules {
|
||||||
|
if module.Name == moduleName {
|
||||||
|
basePath = module.Path
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
absPath := fpath.Join(basePath, fpath.FromSlash(prefix))
|
||||||
|
|
||||||
|
return c.Serve(absPath, filepath)
|
||||||
|
}
|
||||||
+152
@@ -0,0 +1,152 @@
|
|||||||
|
package controllers
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"fmt"
|
||||||
|
"github.com/revel/revel"
|
||||||
|
"html"
|
||||||
|
"html/template"
|
||||||
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TestRunner struct {
|
||||||
|
*revel.Controller
|
||||||
|
}
|
||||||
|
|
||||||
|
type TestSuiteDesc struct {
|
||||||
|
Name string
|
||||||
|
Tests []TestDesc
|
||||||
|
}
|
||||||
|
|
||||||
|
type TestDesc struct {
|
||||||
|
Name string
|
||||||
|
}
|
||||||
|
|
||||||
|
type TestSuiteResult struct {
|
||||||
|
Name string
|
||||||
|
Passed bool
|
||||||
|
Results []TestResult
|
||||||
|
}
|
||||||
|
|
||||||
|
type TestResult struct {
|
||||||
|
Name string
|
||||||
|
Passed bool
|
||||||
|
ErrorHtml template.HTML
|
||||||
|
ErrorSummary string
|
||||||
|
}
|
||||||
|
|
||||||
|
var NONE = []reflect.Value{}
|
||||||
|
|
||||||
|
func (c TestRunner) Index() revel.Result {
|
||||||
|
var testSuites []TestSuiteDesc
|
||||||
|
for _, testSuite := range revel.TestSuites {
|
||||||
|
testSuites = append(testSuites, DescribeSuite(testSuite))
|
||||||
|
}
|
||||||
|
return c.Render(testSuites)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Run runs a single test, given by the argument.
|
||||||
|
func (c TestRunner) Run(suite, test string) revel.Result {
|
||||||
|
result := TestResult{Name: test}
|
||||||
|
for _, testSuite := range revel.TestSuites {
|
||||||
|
t := reflect.TypeOf(testSuite).Elem()
|
||||||
|
if t.Name() != suite {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// Found the suite, create a new instance and run the named method.
|
||||||
|
v := reflect.New(t)
|
||||||
|
func() {
|
||||||
|
defer func() {
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
error := revel.NewErrorFromPanic(err)
|
||||||
|
if error == nil {
|
||||||
|
result.ErrorHtml = template.HTML(html.EscapeString(fmt.Sprint(err)))
|
||||||
|
} else {
|
||||||
|
var buffer bytes.Buffer
|
||||||
|
tmpl, _ := revel.MainTemplateLoader.Template("TestRunner/FailureDetail.html")
|
||||||
|
tmpl.Render(&buffer, error)
|
||||||
|
result.ErrorSummary = errorSummary(error)
|
||||||
|
result.ErrorHtml = template.HTML(buffer.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
// Initialize the test suite with a NewTestSuite()
|
||||||
|
testSuiteInstance := v.Elem().FieldByName("TestSuite")
|
||||||
|
testSuiteInstance.Set(reflect.ValueOf(revel.NewTestSuite()))
|
||||||
|
|
||||||
|
// Call Before(), call the test, and call After().
|
||||||
|
if m := v.MethodByName("Before"); m.IsValid() {
|
||||||
|
m.Call(NONE)
|
||||||
|
}
|
||||||
|
|
||||||
|
if m := v.MethodByName("After"); m.IsValid() {
|
||||||
|
defer m.Call(NONE)
|
||||||
|
}
|
||||||
|
|
||||||
|
v.MethodByName(test).Call(NONE)
|
||||||
|
|
||||||
|
// No panic means success.
|
||||||
|
result.Passed = true
|
||||||
|
}()
|
||||||
|
break
|
||||||
|
}
|
||||||
|
return c.RenderJson(result)
|
||||||
|
}
|
||||||
|
|
||||||
|
// List returns a JSON list of test suites and tests.
|
||||||
|
// Used by the "test" command line tool.
|
||||||
|
func (c TestRunner) List() revel.Result {
|
||||||
|
var testSuites []TestSuiteDesc
|
||||||
|
for _, testSuite := range revel.TestSuites {
|
||||||
|
testSuites = append(testSuites, DescribeSuite(testSuite))
|
||||||
|
}
|
||||||
|
return c.RenderJson(testSuites)
|
||||||
|
}
|
||||||
|
|
||||||
|
func DescribeSuite(testSuite interface{}) TestSuiteDesc {
|
||||||
|
t := reflect.TypeOf(testSuite)
|
||||||
|
|
||||||
|
// Get a list of methods of the embedded test type.
|
||||||
|
super := t.Elem().Field(0).Type
|
||||||
|
superMethodNameSet := map[string]struct{}{}
|
||||||
|
for i := 0; i < super.NumMethod(); i++ {
|
||||||
|
superMethodNameSet[super.Method(i).Name] = struct{}{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get a list of methods on the test suite that take no parameters, return
|
||||||
|
// no results, and were not part of the embedded type's method set.
|
||||||
|
var tests []TestDesc
|
||||||
|
for i := 0; i < t.NumMethod(); i++ {
|
||||||
|
m := t.Method(i)
|
||||||
|
mt := m.Type
|
||||||
|
_, isSuperMethod := superMethodNameSet[m.Name]
|
||||||
|
if mt.NumIn() == 1 &&
|
||||||
|
mt.NumOut() == 0 &&
|
||||||
|
mt.In(0) == t &&
|
||||||
|
!isSuperMethod &&
|
||||||
|
strings.HasPrefix(m.Name, "Test") {
|
||||||
|
tests = append(tests, TestDesc{m.Name})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TestSuiteDesc{
|
||||||
|
Name: t.Elem().Name(),
|
||||||
|
Tests: tests,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func errorSummary(error *revel.Error) string {
|
||||||
|
var message = fmt.Sprintf("%4sStatus: %s\n%4sIn %s", "", error.Description, "", error.Path)
|
||||||
|
if error.Line != 0 {
|
||||||
|
message += fmt.Sprintf(" (around line %d): ", error.Line)
|
||||||
|
for _, line := range error.ContextSource() {
|
||||||
|
if line.IsError {
|
||||||
|
message += line.Source
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return message
|
||||||
|
}
|
||||||
+12
@@ -0,0 +1,12 @@
|
|||||||
|
package app
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/revel/revel"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
revel.OnAppStart(func() {
|
||||||
|
fmt.Println("Go to /@tests to run the tests.")
|
||||||
|
})
|
||||||
|
}
|
||||||
+9
@@ -0,0 +1,9 @@
|
|||||||
|
<b>{{.Description}}</b><br>
|
||||||
|
In {{.Path}}
|
||||||
|
{{if .Line}}
|
||||||
|
(around {{if .Line}}line {{.Line}}{{end}}{{if .Column}} column {{.Column}}{{end}})
|
||||||
|
{{end}}:
|
||||||
|
{{range .ContextSource}}{{if .IsError}}<code>{{.Source}}</code>{{end}}{{end}}<br>
|
||||||
|
<a style="cursor:pointer;"
|
||||||
|
onclick="x=this.nextSibling.style;if(!x.display)x.display='none';else x.display=''">
|
||||||
|
Show Stack</a><pre style="display:none;">{{.Stack}}</pre>
|
||||||
+84
@@ -0,0 +1,84 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Revel Test Runner</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||||
|
<link href="/@tests/public/css/bootstrap.css" type="text/css" rel="stylesheet"></link>
|
||||||
|
<script src="/@tests/public/js/jquery-1.9.1.min.js" type="text/javascript"></script>
|
||||||
|
<style>
|
||||||
|
header { padding:20px 0; background-color:#ADD8E6 }
|
||||||
|
.passed td { background-color: #90EE90 !important; }
|
||||||
|
.failed td { background-color: #FFB6C1 !important; }
|
||||||
|
.tests td.name, .tests td.result { padding-top: 13px; }
|
||||||
|
pre { font-size:10px; white-space: pre; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header>
|
||||||
|
<div class="container">
|
||||||
|
<table><tr><td>
|
||||||
|
<h1>Test Runner</h1>
|
||||||
|
<p class="lead">Run all of your application's tests from here.</p>
|
||||||
|
</td><td style="padding-left:150px;">
|
||||||
|
<button class="btn btn-large" all-tests="">Run All Tests</button>
|
||||||
|
</td></tr></table>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
{{range .testSuites}}
|
||||||
|
<p class="lead" style="margin-top:20px;">{{.Name}}</p>
|
||||||
|
<table class="table table-striped tests" suite="{{.Name}}">
|
||||||
|
{{range .Tests}}
|
||||||
|
<tr>
|
||||||
|
<td class="name">{{.Name}}</td>
|
||||||
|
<td class="result">
|
||||||
|
</td>
|
||||||
|
<td><button test="{{.Name}}" class="btn">Run</button></td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</table>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
var running = 0;
|
||||||
|
|
||||||
|
$("button[test]").click(function() {
|
||||||
|
var button = $(this).addClass("disabled").text("Running");
|
||||||
|
running += 1;
|
||||||
|
runTest(button);
|
||||||
|
});
|
||||||
|
|
||||||
|
$("button[all-tests]").click(function() {
|
||||||
|
var button = $(this).addClass("disabled").text("Running");
|
||||||
|
$("button[test]").click();
|
||||||
|
});
|
||||||
|
|
||||||
|
function runTest(button) {
|
||||||
|
var suite = button.parents("table").attr("suite");
|
||||||
|
var test = button.attr("test");
|
||||||
|
var row = button.parents("tr");
|
||||||
|
var resultCell = row.children(".result");
|
||||||
|
$.ajax({
|
||||||
|
dataType: "json",
|
||||||
|
url: "/@tests/"+suite+"/"+test,
|
||||||
|
async: false,
|
||||||
|
success: function(result) {
|
||||||
|
row.attr("class", result.Passed ? "passed" : "failed");
|
||||||
|
if (result.Passed) {
|
||||||
|
resultCell.html("");
|
||||||
|
} else {
|
||||||
|
resultCell.html(result.ErrorHtml);
|
||||||
|
}
|
||||||
|
button.removeClass("disabled").text("Run");
|
||||||
|
running -= 1;
|
||||||
|
if (running == 0) {
|
||||||
|
$("button[all-tests]").removeClass("disabled").text("Run All Tests");
|
||||||
|
}
|
||||||
|
}});
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
+47
@@ -0,0 +1,47 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Revel Test Runner</title>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 20px;
|
||||||
|
color: #333333;
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
header { padding:20px 0; }
|
||||||
|
header.passed { background-color: #90EE90 !important; }
|
||||||
|
header.failed { background-color: #FFB6C1 !important; }
|
||||||
|
table { margin-top: 20px; padding: 8px; line-height: 20px; }
|
||||||
|
td { vertical-align: top; padding-right:20px; }
|
||||||
|
a { color: #0088cc; }
|
||||||
|
.container { margin-left: auto; margin-right: auto; width: 940px; }
|
||||||
|
.result.failed b { font-weight:bold; color: #C00; font-size: 14px; }
|
||||||
|
.result.failed span { color: #C00; font-size: 14px; }
|
||||||
|
</style>
|
||||||
|
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<header class="{{if .Passed}}passed{{else}}failed{{end}}">
|
||||||
|
<div class="container">
|
||||||
|
<h1>{{.Name}}</h1>
|
||||||
|
<p>{{if .Passed}}PASSED{{else}}FAILED{{end}}</p>
|
||||||
|
</div>
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="container">
|
||||||
|
<table>
|
||||||
|
{{range .Results}}
|
||||||
|
<tr class="result {{if .Passed}}passed{{else}}failed{{end}}">
|
||||||
|
<td><span>{{.Name}}</span></td>
|
||||||
|
<td>{{if .ErrorHtml}}{{.ErrorHtml}}{{else}}PASSED{{end}}</td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
GET /@tests TestRunner.Index
|
||||||
|
GET /@tests.list TestRunner.List
|
||||||
|
GET /@tests/public/*filepath Static.ServeModule(testrunner,public)
|
||||||
|
GET /@tests/:suite/:test TestRunner.Run
|
||||||
+5774
File diff suppressed because it is too large.
Load diff
BIN
Binary file not shown.
|
After Width: | Height: | Size: 5.5 KiB |
+5
@@ -0,0 +1,5 @@
|
|||||||
|
/*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license
|
||||||
|
//@ sourceMappingURL=jquery.min.map
|
||||||
|
*/(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(Line truncated
|
||||||
|
return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+Line truncated
|
||||||
|
}b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}reLine truncated
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Forbidden</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{{with .Error}}
|
||||||
|
<h1>
|
||||||
|
{{.Title}}
|
||||||
|
</h1>
|
||||||
|
<p>
|
||||||
|
{{.Description}}
|
||||||
|
</p>
|
||||||
|
{{end}}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"title": "{{js .Error.Title}}",
|
||||||
|
"description": "{{js .Error.Description}}"
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
{{.Error.Title}}
|
||||||
|
|
||||||
|
{{.Error.Description}}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
<forbidden>{{.Error.Description}}</forbidden>
|
||||||
+63
@@ -0,0 +1,63 @@
|
|||||||
|
<style type="text/css">
|
||||||
|
html, body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: Helvetica, Arial, Sans;
|
||||||
|
background: #EEEEEE;
|
||||||
|
}
|
||||||
|
.block {
|
||||||
|
padding: 20px;
|
||||||
|
border-bottom: 1px solid #aaa;
|
||||||
|
}
|
||||||
|
#header h1 {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 28px;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
#more {
|
||||||
|
color: #666;
|
||||||
|
font-size: 80%;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
#header {
|
||||||
|
background: #FFFFCC;
|
||||||
|
}
|
||||||
|
#header p {
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
#routes {
|
||||||
|
background: #f6f6f6;
|
||||||
|
}
|
||||||
|
#routes h2 {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 18px;
|
||||||
|
margin: 0 0 10px 0;
|
||||||
|
}
|
||||||
|
#routes ol {
|
||||||
|
|
||||||
|
}
|
||||||
|
#routes li {
|
||||||
|
font-size: 14px;
|
||||||
|
font-family: monospace;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div id="header" class="block">
|
||||||
|
{{with .Error}}
|
||||||
|
<h1>
|
||||||
|
{{.Title}}
|
||||||
|
</h1>
|
||||||
|
<p>
|
||||||
|
{{.Description}}
|
||||||
|
</p>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
<div id="routes" class="block">
|
||||||
|
<h2>These routes have been tried, in this order :</h2>
|
||||||
|
<ol>
|
||||||
|
{{range .Router.Routes}}
|
||||||
|
<li>{{pad .Method 10}}{{pad .Path 50}}{{.Action}}</li>
|
||||||
|
{{end}}
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
+26
@@ -0,0 +1,26 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Not found</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
|
||||||
|
{{if .DevMode}}
|
||||||
|
|
||||||
|
{{template "errors/404-dev.html" .}}
|
||||||
|
|
||||||
|
{{else}}
|
||||||
|
|
||||||
|
{{with .Error}}
|
||||||
|
<h1>
|
||||||
|
{{.Title}}
|
||||||
|
</h1>
|
||||||
|
<p>
|
||||||
|
{{.Description}}
|
||||||
|
</p>
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"title": "{{js .Error.Title}}",
|
||||||
|
"description": "{{js .Error.Description}}"
|
||||||
|
}
|
||||||
+3
@@ -0,0 +1,3 @@
|
|||||||
|
{{.Error.Title}}
|
||||||
|
|
||||||
|
{{.Error.Description}}
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
<notfound>{{.Error.Description}}</notfound>
|
||||||
+118
@@ -0,0 +1,118 @@
|
|||||||
|
<style type="text/css">
|
||||||
|
html, body {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
font-family: Helvetica, Arial, Sans;
|
||||||
|
background: #EEEEEE;
|
||||||
|
}
|
||||||
|
.block {
|
||||||
|
padding: 20px;
|
||||||
|
border-bottom: 1px solid #aaa;
|
||||||
|
}
|
||||||
|
#header h1 {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 28px;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
#more {
|
||||||
|
color: #666;
|
||||||
|
font-size: 80%;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
#header {
|
||||||
|
background: #fcd2da;
|
||||||
|
}
|
||||||
|
#header p {
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
#source {
|
||||||
|
background: #f6f6f6;
|
||||||
|
}
|
||||||
|
#source h2 {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 18px;
|
||||||
|
margin: 0 0 10px 0;
|
||||||
|
}
|
||||||
|
#source .lineNumber {
|
||||||
|
float: left;
|
||||||
|
display: block;
|
||||||
|
width: 40px;
|
||||||
|
text-align: right;
|
||||||
|
margin-right: 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
font-family: monospace;
|
||||||
|
background: #333;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
#source .line {
|
||||||
|
clear: both;
|
||||||
|
color: #333;
|
||||||
|
margin-bottom: 1px;
|
||||||
|
}
|
||||||
|
#source pre {
|
||||||
|
font-size: 14px;
|
||||||
|
margin: 0;
|
||||||
|
overflow-x: hidden;
|
||||||
|
}
|
||||||
|
#source .error {
|
||||||
|
color: #c00 !important;
|
||||||
|
}
|
||||||
|
#source .error .lineNumber {
|
||||||
|
background: #c00;
|
||||||
|
}
|
||||||
|
#source a {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
#source a:hover * {
|
||||||
|
cursor: pointer !important;
|
||||||
|
}
|
||||||
|
#source a:hover pre {
|
||||||
|
background: #FAFFCF !important;
|
||||||
|
}
|
||||||
|
#source em {
|
||||||
|
font-style: normal;
|
||||||
|
text-decoration: underline;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
#source strong {
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{{with .Error}}
|
||||||
|
<div id="header" class="block">
|
||||||
|
<h1>
|
||||||
|
{{.Title}}
|
||||||
|
</h1>
|
||||||
|
<p>
|
||||||
|
{{if .SourceType}}
|
||||||
|
The {{.SourceType}} <strong>{{.Path}}</strong> does not compile: <strong>{{.Description}}</strong>
|
||||||
|
{{else}}
|
||||||
|
{{.Description}}
|
||||||
|
{{end}}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{{if .Path}}
|
||||||
|
<div id="source" class="block">
|
||||||
|
<h2>In {{.Path}}
|
||||||
|
{{if .Line}}
|
||||||
|
(around {{if .Line}}line {{.Line}}{{end}}{{if .Column}} column {{.Column}}{{end}})
|
||||||
|
{{end}}
|
||||||
|
</h2>
|
||||||
|
{{range .ContextSource}}
|
||||||
|
<div class="line {{if .IsError}}error{{end}}">
|
||||||
|
<span class="lineNumber">{{.Line}}:</span>
|
||||||
|
<pre>{{.Source}}</pre>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
{{if .MetaError}}
|
||||||
|
<div id="source" class="block">
|
||||||
|
<h2>Additionally, an error occurred while handling this error.</h2>
|
||||||
|
<div class="line error">
|
||||||
|
{{.MetaError}}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
+16
@@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Application error</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
{{if .DevMode}}
|
||||||
|
{{template "errors/500-dev.html" .}}
|
||||||
|
{{else}}
|
||||||
|
<h1>Oops, an error occured</h1>
|
||||||
|
<p>
|
||||||
|
This exception has been logged.
|
||||||
|
</p>
|
||||||
|
{{end}}
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
{
|
||||||
|
"title": "{{js .Error.Title}}",
|
||||||
|
"description": "{{js .Error.Description}}"
|
||||||
|
}
|
||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
{{.Error.Title}}
|
||||||
|
{{.Error.Description}}
|
||||||
|
|
||||||
|
{{if eq .RunMode "dev"}}
|
||||||
|
{{with .Error}}
|
||||||
|
{{if .Path}}
|
||||||
|
----------
|
||||||
|
In {{.Path}} {{if .Line}}(around line {{.Line}}){{end}}
|
||||||
|
|
||||||
|
{{range .ContextSource}}
|
||||||
|
{{if .IsError}}>{{else}} {{end}} {{.Line}}: {{.Source}}{{end}}
|
||||||
|
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
<error>
|
||||||
|
<title>{{.Error.Title}}</title>
|
||||||
|
<description>{{.Error.Description}}</description>
|
||||||
|
</error>
|
||||||
File renamed without changes.
@@ -0,0 +1,55 @@
|
|||||||
|
# Routes
|
||||||
|
# This file defines all application routes (Higher priority routes first)
|
||||||
|
# ~~~~
|
||||||
|
|
||||||
|
module:testrunner
|
||||||
|
|
||||||
|
# Home is My Blog
|
||||||
|
Get / Blog.Index
|
||||||
|
GET /note Note.Index
|
||||||
|
# leanote home
|
||||||
|
GET /index Index.Index
|
||||||
|
|
||||||
|
GET /login Auth.Login
|
||||||
|
POST /doLogin Auth.DoLogin
|
||||||
|
GET /logout Auth.Logout
|
||||||
|
Get /demo Auth.Demo
|
||||||
|
|
||||||
|
Get /register Auth.Register
|
||||||
|
POST /doRegister Auth.DoRegister
|
||||||
|
|
||||||
|
GET /findPassword/:token Auth.FindPassword2
|
||||||
|
GET /findPassword Auth.FindPassword
|
||||||
|
POST /doFindPassword Auth.DoFindPassword
|
||||||
|
POST /findPasswordUpdate Auth.FindPasswordUpdate
|
||||||
|
|
||||||
|
# mobile
|
||||||
|
GET /mobile Mobile.Index
|
||||||
|
|
||||||
|
# blog
|
||||||
|
# /blog/view/:noteId必须要放在/blog/:userId...之前
|
||||||
|
GET /blog/searchBlog/:userId Blog.SearchBlog
|
||||||
|
GET /blog/set Blog.Set
|
||||||
|
GET /blog/aboutMe/:userId Blog.AboutMe
|
||||||
|
POST /blog/setUserBlogBase Blog.SetUserBlogBase
|
||||||
|
POST /blog/setUserBlogComment Blog.SetUserBlogComment
|
||||||
|
POST /blog/setUserBlogStyle Blog.SetUserBlogStyle
|
||||||
|
GET /blog/view/:noteId Blog.View
|
||||||
|
GET /blog/:userId Blog.Index
|
||||||
|
GET /blog/:userId/:notebookId Blog.Index
|
||||||
|
GET /blog Blog.Index
|
||||||
|
|
||||||
|
# Map static resources from the /app/public folder to the /public path
|
||||||
|
GET /favicon.ico Static.Serve("public/images/favicon.ico")
|
||||||
|
GET /public/*filepath Static.Serve("public")
|
||||||
|
GET /js/*filepath Static.Serve("public/js")
|
||||||
|
GET /images/*filepath Static.Serve("public/images")
|
||||||
|
GET /img/*filepath Static.Serve("public/img")
|
||||||
|
GET /css/*filepath Static.Serve("public/css")
|
||||||
|
GET /fonts/*filepath Static.Serve("public/fonts")
|
||||||
|
GET /tinymce/*filepath Static.Serve("public/tinymce")
|
||||||
|
#GET /plugins/*filepath Static.Serve("public/tinymce/plugins")
|
||||||
|
GET /upload/*filepath Static.Serve("public/upload")
|
||||||
|
|
||||||
|
# common
|
||||||
|
* /:controller/:action :controller.:action
|
||||||
@@ -0,0 +1,120 @@
|
|||||||
|
# leanote
|
||||||
|
moto=Not just a note!
|
||||||
|
# 首页
|
||||||
|
forgetPassword = Forget password?
|
||||||
|
or=or
|
||||||
|
try=Try it
|
||||||
|
3th=Third-party accounts
|
||||||
|
usernameOrEmail=Username or email
|
||||||
|
password=Password
|
||||||
|
home=Home
|
||||||
|
aboutLeanote=About leanote
|
||||||
|
suggestions=Suggestions
|
||||||
|
yourSuggestions=Suggestions
|
||||||
|
leanoteBlog=Blog
|
||||||
|
knowledge=Knowledge
|
||||||
|
knowledgeInfo=Use leanote as a note, manage your knowledge in leanote.
|
||||||
|
share=Share
|
||||||
|
shareInfo=Share your knowledge to your friends in leanote.
|
||||||
|
cooperation=Cooperation
|
||||||
|
cooperationInfo=Collaborate with friends to improve your knowledge.
|
||||||
|
blog=Blog
|
||||||
|
blogInfo=You can public your knowledge and leanote is your blog!
|
||||||
|
suggestionsInfo=help us to improve our service.
|
||||||
|
yourContact=Your contact
|
||||||
|
emailOrOthers=Email or other contact way
|
||||||
|
|
||||||
|
hi=Hi
|
||||||
|
welcomeUseLeanote=Welcome!
|
||||||
|
myNote=Enter to my note
|
||||||
|
curUser=Email
|
||||||
|
|
||||||
|
# form
|
||||||
|
submit=submit
|
||||||
|
register=Sign up
|
||||||
|
login=Sign in
|
||||||
|
password2=Confirm your password
|
||||||
|
email=Email
|
||||||
|
inputUsername=Username(email) is required
|
||||||
|
inputEmail=Email is required
|
||||||
|
wrongEmail=Wrong email
|
||||||
|
wrongUsernameOrPassword=Wrong username or password
|
||||||
|
inputPassword=Password is required
|
||||||
|
wrongPassword=Wrong password
|
||||||
|
logining=Sign in
|
||||||
|
loginSuccess=login success
|
||||||
|
ing=processing
|
||||||
|
|
||||||
|
# 注册
|
||||||
|
registerSuccessAndRdirectToNote=register success, now redirect to my note...
|
||||||
|
|
||||||
|
# 找回密码
|
||||||
|
passwordTips=The length is at least 6
|
||||||
|
findPassword=Find password
|
||||||
|
findPasswordSendEmailOver=We have already send the find password link to your email, please check out your email
|
||||||
|
checkEmai=Check email
|
||||||
|
findPasswordTimeout=time out
|
||||||
|
reFindPassword=find password again
|
||||||
|
updatePassword=Update password
|
||||||
|
updatePasswordSuccessRedirectToLogin=update password success and redirect to login page...
|
||||||
|
inputPassword2=Please input your password again
|
||||||
|
confirmPassword=Please confirm your password
|
||||||
|
notGoodPassword=Tt's not a good password, the length is at least 6
|
||||||
|
|
||||||
|
# 笔记主页
|
||||||
|
myBlog=Blog
|
||||||
|
history=Histories
|
||||||
|
save=Save
|
||||||
|
editorTips=Editor Tips
|
||||||
|
editorTipsInfo=<h4>1. Short Cuts</h4>ctrl+shift+c Toggle code <br /> ctrl+shift+i Insert/edit image <h4>2. shift+enter Get out of current block</h4> eg. <img src="/images/outofcode.png" style="width: 90px"/> in this situation you can use shift+enter to get out of current code block.
|
||||||
|
newNote=New Note
|
||||||
|
newMarkdown=New Markdown Note
|
||||||
|
clickAddTag=Click to add Tag
|
||||||
|
notebook=Notebook
|
||||||
|
myNotebook=My Notebook
|
||||||
|
addNotebook=Add Notebook
|
||||||
|
all=Newest
|
||||||
|
trash=Trash
|
||||||
|
unTitled=UnTitled
|
||||||
|
defaultShare=Default sharing
|
||||||
|
leftHidden=Hidden slide bar
|
||||||
|
leftShow=Show slide bar
|
||||||
|
nav=Note Nav
|
||||||
|
|
||||||
|
update=Update
|
||||||
|
create=Create
|
||||||
|
|
||||||
|
demoRegister=您现在使用的是体验帐号, <a href="/register">立即注册?</a>
|
||||||
|
|
||||||
|
close=Close
|
||||||
|
cancel=Cancel
|
||||||
|
send=Send
|
||||||
|
|
||||||
|
# 标签
|
||||||
|
tag=Tag
|
||||||
|
myTag=My Tag
|
||||||
|
red=red
|
||||||
|
yellow=yellow
|
||||||
|
blue=blue
|
||||||
|
green=green
|
||||||
|
|
||||||
|
# 设置
|
||||||
|
accountSetting=Account
|
||||||
|
themeSetting=Theme
|
||||||
|
logout=Logout
|
||||||
|
basicInfo=Basic
|
||||||
|
updateEmail=Update Email
|
||||||
|
usernameSetting=Update Username
|
||||||
|
oldPassword=Old Password
|
||||||
|
newPassword=New Password
|
||||||
|
|
||||||
|
default=Default
|
||||||
|
simple=Simple
|
||||||
|
|
||||||
|
# tinymce
|
||||||
|
uploadImage=Upload Image
|
||||||
|
|
||||||
|
# error
|
||||||
|
notFound=This page cann't found.
|
||||||
|
|
||||||
|
a=a
|
||||||
@@ -0,0 +1,123 @@
|
|||||||
|
# leanote
|
||||||
|
moto=不一样的笔记!
|
||||||
|
|
||||||
|
# 首页
|
||||||
|
forgetPassword = 忘记密码?
|
||||||
|
or=或
|
||||||
|
try=体验一下
|
||||||
|
3th=第三方登录
|
||||||
|
usernameOrEmail=用户名或Email
|
||||||
|
password=密码
|
||||||
|
home=主页
|
||||||
|
aboutLeanote=关于leanote
|
||||||
|
suggestions=建议
|
||||||
|
yourSuggestions=帮助完善leanote
|
||||||
|
leanoteBlog=官方博客
|
||||||
|
knowledge=知识
|
||||||
|
knowledgeInfo=leanote是一个笔记, 你可以用它来管理自己的知识.
|
||||||
|
share=分享
|
||||||
|
shareInfo=你也可以将知识分享给你的好友.
|
||||||
|
cooperation=协作
|
||||||
|
cooperationInfo=分享给好友的同时也可以让你的好友和你一起来完善它.
|
||||||
|
blog=博客
|
||||||
|
blogInfo=将笔记公开, 让知识传播的更远!
|
||||||
|
suggestionsInfo=帮助我们完善leanote
|
||||||
|
yourContact=您的联系方式
|
||||||
|
emailOrOthers=Email或其它联系方式
|
||||||
|
|
||||||
|
hi=Hi
|
||||||
|
welcomeUseLeanote=欢迎使用leanote
|
||||||
|
myNote=进入我的笔记
|
||||||
|
curUser=当前登录帐户
|
||||||
|
|
||||||
|
# form
|
||||||
|
submit=提交
|
||||||
|
login=登录
|
||||||
|
register=注册
|
||||||
|
password2=确认密码
|
||||||
|
email=Email
|
||||||
|
inputUsername=请输入用户名或Email
|
||||||
|
inputEmail=请输入Email
|
||||||
|
wrongEmail=Email格式有误
|
||||||
|
wrongUsernameOrPassword=用户名或密码有误
|
||||||
|
inputPassword=请输入密码
|
||||||
|
wrongPassword=密码有误
|
||||||
|
logining=正在登录
|
||||||
|
loginSuccess=登录成功, 正在跳转
|
||||||
|
ing=正在处理
|
||||||
|
|
||||||
|
# 注册
|
||||||
|
registerSuccessAndRdirectToNote=注册成功, 正在转至我的笔记...
|
||||||
|
|
||||||
|
# 找回密码
|
||||||
|
passwordTips=密码至少6位
|
||||||
|
findPassword=找回密码
|
||||||
|
findPasswordSendEmailOver=已经将修改密码的链接发送到您的邮箱, 请查收邮件.
|
||||||
|
checkEmai=查收邮箱
|
||||||
|
updatePassword=修改密码
|
||||||
|
findPasswordTimeout=链接已过期
|
||||||
|
reFindPassword=重新找回密码
|
||||||
|
updatePassword=修改密码
|
||||||
|
updatePasswordSuccessRedirectToLogin=修改成功, 正在跳转到登录页
|
||||||
|
inputPassword2=请再次输入密码
|
||||||
|
confirmPassword=两次密码输入不一致
|
||||||
|
notGoodPassword=密码至少6位
|
||||||
|
|
||||||
|
# 笔记主页
|
||||||
|
myBlog=我的博客
|
||||||
|
history=历史记录
|
||||||
|
save=保存
|
||||||
|
editorTips=帮助
|
||||||
|
editorTipsInfo=<h4>1. 快捷键</h4>ctrl+shift+c 代码块切换 <br /> ctrl+shift+i 插入/修改图片<h4>2. shift+enter 跳出当前区域</h4>比如在代码块中<img src="/images/outofcode.png" style="width: 90px"/>按shift+enter可跳出当前代码块.
|
||||||
|
newNote=新建笔记
|
||||||
|
newMarkdown=新建Markdown笔记
|
||||||
|
clickAddTag=点击添加标签
|
||||||
|
notebook=笔记本
|
||||||
|
myNotebook=我的笔记本
|
||||||
|
addNotebook=添加笔记本
|
||||||
|
all=最新
|
||||||
|
trash=废纸篓
|
||||||
|
unTitled=无标题
|
||||||
|
defaultShare=默认共享
|
||||||
|
leftHidden=隐藏左侧
|
||||||
|
leftShow=展开左侧
|
||||||
|
nav=文档导航
|
||||||
|
|
||||||
|
update=更新
|
||||||
|
create=创建
|
||||||
|
|
||||||
|
demoRegister=您现在使用的是体验帐号, <a href="/register">立即注册?</a>
|
||||||
|
|
||||||
|
close=关闭
|
||||||
|
cancel=取消
|
||||||
|
send=发送
|
||||||
|
|
||||||
|
# 标签
|
||||||
|
tag=标签
|
||||||
|
myTag=我的标签
|
||||||
|
red=红色
|
||||||
|
yellow=黄色
|
||||||
|
blue=蓝色
|
||||||
|
green=绿色
|
||||||
|
|
||||||
|
# 设置
|
||||||
|
accountSetting=帐户设置
|
||||||
|
themeSetting=主题设置
|
||||||
|
logout=退出
|
||||||
|
basicInfo=基本信息
|
||||||
|
updateEmail=修改Email
|
||||||
|
usernameSetting=用户名设置
|
||||||
|
oldPassword=旧密码
|
||||||
|
newPassword=新密码
|
||||||
|
|
||||||
|
default=默认
|
||||||
|
simple=简约
|
||||||
|
|
||||||
|
# tinymce
|
||||||
|
uploadImage=上传图片
|
||||||
|
|
||||||
|
# error
|
||||||
|
notFound=该页面不存在
|
||||||
|
|
||||||
|
# 必须要加这个, 奇怪
|
||||||
|
[CN]
|
||||||
BIN
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
{ "indexes" : [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "leanote_public.has_share_notes", "name" : "_id_" }, { "v" : 1, "key" : { "UserId" : 1, "ToUserId" : 1 }, "unique" : true, "ns" : "leanote_public.has_share_notes", "name" : "UserId_1_ToUserId_1" } ] }
|
||||||
BIN
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
{ "indexes" : [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "leanote_public.note_content_histories", "name" : "_id_" } ] }
|
||||||
BIN
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
{ "indexes" : [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "leanote_public.note_contents", "name" : "_id_" } ] }
|
||||||
BIN
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
{ "indexes" : [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "leanote_public.notebooks", "name" : "_id_" }, { "v" : 1, "key" : { "UserId" : 1 }, "ns" : "leanote_public.notebooks", "name" : "UserId_1" } ] }
|
||||||
BIN
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
{ "indexes" : [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "leanote_public.notes", "name" : "_id_" }, { "v" : 1, "key" : { "UserId" : 1 }, "ns" : "leanote_public.notes", "name" : "UserId_1" } ] }
|
||||||
BIN
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
{ "indexes" : [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "leanote_public.share_notebooks", "name" : "_id_" } ] }
|
||||||
BIN
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
{ "indexes" : [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "leanote_public.share_notes", "name" : "_id_" }, { "v" : 1, "key" : { "UserId" : 1, "ToUserId" : 1, "NoteId" : 1 }, "unique" : true, "ns" : "leanote_public.share_notes", "name" : "UserId_1_ToUserId_1_NoteId_1" } ] }
|
||||||
BIN
Binary file not shown.
BIN
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
{ "indexes" : [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "leanote_public.system.users", "name" : "_id_" }, { "v" : 1, "key" : { "user" : 1, "userSource" : 1 }, "unique" : true, "ns" : "leanote_public.system.users", "name" : "user_1_userSource_1" } ] }
|
||||||
Whitespace-only changes.
+1
@@ -0,0 +1 @@
|
|||||||
|
{ "indexes" : [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "leanote_public.tags", "name" : "_id_" }, { "v" : 1, "key" : { "UserId" : 1 }, "ns" : "leanote_public.tags", "name" : "UserId_1" } ] }
|
||||||
BIN
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
{ "indexes" : [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "leanote_public.tokens", "name" : "_id_" } ] }
|
||||||
BIN
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
{ "indexes" : [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "leanote_public.user_blogs", "name" : "_id_" } ] }
|
||||||
BIN
Binary file not shown.
+1
@@ -0,0 +1 @@
|
|||||||
|
{ "indexes" : [ { "v" : 1, "key" : { "_id" : 1 }, "ns" : "leanote_public.users", "name" : "_id_" } ] }
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
*,
|
||||||
|
body {
|
||||||
|
font-family: 'Open Sans', '微软雅黑', Arial, Tahoma, sans-serif;
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
h1,
|
||||||
|
h2,
|
||||||
|
h3 {
|
||||||
|
font-family: 'Open Sans', '微软雅黑', Arial, Tahoma, sans-serif;
|
||||||
|
font-weight: 300 !important;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
text-decoration: underline !important;
|
||||||
|
}
|
||||||
|
#headerContainer {
|
||||||
|
height: 230px;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
#posts {
|
||||||
|
width: 745px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
#postsContainer {
|
||||||
|
background: #f5f5f5 url("../images/noise.png");
|
||||||
|
padding-bottom: 5px;
|
||||||
|
}
|
||||||
|
/* header */
|
||||||
|
#header {
|
||||||
|
color: #000000;
|
||||||
|
position: relative;
|
||||||
|
padding: 0 0 20px 0;
|
||||||
|
margin-top: 65px;
|
||||||
|
}
|
||||||
|
#header h1 {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
#header h1 a {
|
||||||
|
font-size: 48px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #000000;
|
||||||
|
}
|
||||||
|
#header #blogDesc {
|
||||||
|
font-size: 32px;
|
||||||
|
font-style: italic;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
.navbar {
|
||||||
|
background-color: #f7f5e7;
|
||||||
|
margin-bottom: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
.nav li a:hover {
|
||||||
|
background-color: #000000 !important;
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
.nav li.active a {
|
||||||
|
background-color: #f7f5e7 !important;
|
||||||
|
color: #bc360a !important;
|
||||||
|
}
|
||||||
|
.navbar-collapse {
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
.navbar-form {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
/* posts */
|
||||||
|
#posts {
|
||||||
|
padding-top: 10px;
|
||||||
|
}
|
||||||
|
#posts .each-post {
|
||||||
|
border-bottom: 1px solid #ebeff2;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
padding: 30px;
|
||||||
|
background-color: #fff;
|
||||||
|
-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||||
|
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
#posts .each-post .title {
|
||||||
|
font-size: 48px;
|
||||||
|
color: #000000;
|
||||||
|
padding: 0 0 15px 0;
|
||||||
|
}
|
||||||
|
#posts .each-post .title a {
|
||||||
|
font-size: 48px;
|
||||||
|
color: #000000;
|
||||||
|
padding: 0 0 15px 0;
|
||||||
|
}
|
||||||
|
#posts .each-post .title a:hover {
|
||||||
|
color: #ea9629;
|
||||||
|
}
|
||||||
|
#posts .each-post .created-time {
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
padding-bottom: 3px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
#posts .each-post .more {
|
||||||
|
background: #000000;
|
||||||
|
padding: 9px 10px;
|
||||||
|
border-radius: 2px;
|
||||||
|
line-height: 1;
|
||||||
|
font-size: 13px;
|
||||||
|
display: inline-block;
|
||||||
|
text-transform: uppercase;
|
||||||
|
margin-top: 15px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
#disqus_thread {
|
||||||
|
border-top: 1px solid #eee;
|
||||||
|
padding: 5px 0 0 0;
|
||||||
|
}
|
||||||
|
#search {
|
||||||
|
width: 200px;
|
||||||
|
}
|
||||||
|
#footerContainer {
|
||||||
|
background-color: #ffffff;
|
||||||
|
color: #666666;
|
||||||
|
}
|
||||||
|
#footerContainer #footer a {
|
||||||
|
color: #666666;
|
||||||
|
}
|
||||||
|
#footerContainer #footer ul {
|
||||||
|
list-style: none;
|
||||||
|
margin-bottom: 10px ;
|
||||||
|
padding-left: 20px;
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../../fonts/open-sans2/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff') format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../../fonts/open-sans2/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff') format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../../fonts/open-sans2/k3k702ZOKiLJc3WVjuplzHhCUOGz7vYGh680lGh-uXM.woff') format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../../fonts/open-sans2/xjAJXh38I15wypJXxuGMBobN6UDyHWBl620a-IRfuBk.woff') format('woff')}::selection{background:#000;color:#fff}
|
||||||
|
::-moz-selection{background:#000;color:#fff}
|
||||||
|
::-webkit-selection{background:#000;color:#fff}
|
||||||
|
*,body{font-family:'Open Sans','Helvetica Neue',Arial,'Hiragino Sans GB','Microsoft YaHei','WenQuanYi Micro Hei',sans-serif;font-weight:300;font-size:14px}
|
||||||
|
h1,h2,h3{font-family:'Open Sans','Helvetica Neue',Arial,'Hiragino Sans GB','Microsoft YaHei','WenQuanYi Micro Hei',sans-serif;font-weight:300 !important}
|
||||||
|
a{cursor:pointer}
|
||||||
|
a:hover{text-decoration:underline !important}
|
||||||
|
#headerContainer{height:230px;background-color:#fff}
|
||||||
|
#posts{width:745px;margin:auto}
|
||||||
|
#postsContainer{background:#f5f5f5 url("../images/noise.png");padding-bottom:5px}
|
||||||
|
#header{color:#000;position:relative;padding:0 0 20px 0;margin-top:65px}#header h1{margin:0}#header h1 a{font-size:48px;font-weight:bold;color:#000}#header h1 a img{height:40px}
|
||||||
|
#header #blogDesc{font-size:32px;font-style:italic;margin-top:10px}
|
||||||
|
.navbar{background-color:#f7f5e7;margin-bottom:0;border-radius:0;border:none}
|
||||||
|
.nav li a:hover{background-color:#000 !important;color:#fff !important}
|
||||||
|
.nav li.active a{background-color:#f7f5e7 !important;color:#bc360a !important}
|
||||||
|
.navbar-collapse{padding-left:0;padding-right:0}
|
||||||
|
.navbar-form{padding:0}
|
||||||
|
#posts{padding-top:10px}#posts .each-post{border-bottom:1px solid #ebeff2;margin-bottom:10px;padding:30px;background-color:#fff;-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);border-radius:3px}#posts .each-post .title{font-size:48px;color:#000;padding:0 0 15px 0}#posts .each-post .title a{font-size:48px;color:#000;padding:0 0 15px 0}#posts .each-post .title a:hover{color:#ea9629}
|
||||||
|
#posts .each-post .created-time{border-bottom:1px solid #eee;padding-bottom:3px;margin-bottom:5px}
|
||||||
|
#posts .each-post .more{background:#000;padding:9px 10px;border-radius:2px;line-height:1;font-size:13px;display:inline-block;text-transform:uppercase;margin-top:15px;margin-bottom:15px;color:#fff}
|
||||||
|
#disqus_thread{border-top:1px solid #eee;padding:5px 0 0 0}
|
||||||
|
#search{width:150px}
|
||||||
|
#footerContainer{background-color:#fff;color:#666}#footerContainer #footer a{color:#666}
|
||||||
|
#footerContainer #footer ul{list-style:none;margin-bottom:10px;padding-left:20px}
|
||||||
@@ -0,0 +1,204 @@
|
|||||||
|
@bgColor: #fff;
|
||||||
|
@headerBgColor: #fff;
|
||||||
|
@fontFamily: 'Open Sans','Helvetica Neue',Arial,'Hiragino Sans GB','Microsoft YaHei','WenQuanYi Micro Hei',sans-serif;
|
||||||
|
@aWhiteColor: #fff;
|
||||||
|
@aBlackColor: #000;
|
||||||
|
@borderColor: #EBEFF2;
|
||||||
|
@border: 1px solid #EBEFF2;
|
||||||
|
@borderMore: 1px solid #ccc; // 颜色更深
|
||||||
|
@headerHeight: 230px;
|
||||||
|
@hColor: #000;
|
||||||
|
@fontSize: 14px;
|
||||||
|
@containerWidth: 745px;
|
||||||
|
@titleColor: @hColor; // #5AD4A0;
|
||||||
|
@titleHoverColor:#ea9629;
|
||||||
|
@navBgColor: #f7f5e7;
|
||||||
|
@navActiveAColor: rgb(188, 54, 10);
|
||||||
|
@navHoverABgColor: #000;
|
||||||
|
@navHoverAColor: #fff;
|
||||||
|
|
||||||
|
// font
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Open Sans';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 300;
|
||||||
|
src: local('Open Sans Light'), local('OpenSans-Light'), url('../../fonts/open-sans2/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff') format('woff');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Open Sans';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Open Sans'), local('OpenSans'), url('../../fonts/open-sans2/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff') format('woff');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Open Sans';
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 700;
|
||||||
|
src: local('Open Sans Bold'), local('OpenSans-Bold'), url('../../fonts/open-sans2/k3k702ZOKiLJc3WVjuplzHhCUOGz7vYGh680lGh-uXM.woff') format('woff');
|
||||||
|
}
|
||||||
|
@font-face {
|
||||||
|
font-family: 'Open Sans';
|
||||||
|
font-style: italic;
|
||||||
|
font-weight: 400;
|
||||||
|
src: local('Open Sans Italic'), local('OpenSans-Italic'), url('../../fonts/open-sans2/xjAJXh38I15wypJXxuGMBobN6UDyHWBl620a-IRfuBk.woff') format('woff');
|
||||||
|
}
|
||||||
|
|
||||||
|
/*"HelveticaNeue-Light","Helvetica Neue Light","Helvetica Neue", Helvetica, "Microsoft Yahei", Verdana, Simsun, "Segoe UI", "Segoe UI Web Regular", "Segoe UI Symbol", "BBAlpha Sans", "S60 Sans", Arial, sans-serif;*/
|
||||||
|
@selectionBg: @aBlackColor;
|
||||||
|
@selectionColor: #fff;
|
||||||
|
::selection { background:@selectionBg; color:@selectionColor; }
|
||||||
|
::-moz-selection { background:@selectionBg; color:@selectionColor; }
|
||||||
|
::-webkit-selection { background:@selectionBg; color:@selectionColor; }
|
||||||
|
html,body {
|
||||||
|
}
|
||||||
|
|
||||||
|
*, body {
|
||||||
|
font-family: @fontFamily;
|
||||||
|
font-weight: 300;
|
||||||
|
font-size: @fontSize;
|
||||||
|
}
|
||||||
|
h1, h2, h3 {
|
||||||
|
font-family: @fontFamily;
|
||||||
|
font-weight: 300 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
text-decoration: underline !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#headerContainer {
|
||||||
|
height: @headerHeight;
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
#posts {
|
||||||
|
width: @containerWidth;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
#postsContainer {
|
||||||
|
background: #f5f5f5 url("../../images/noise.png");
|
||||||
|
padding-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* header */
|
||||||
|
#header {
|
||||||
|
color: #000000;
|
||||||
|
position: relative;
|
||||||
|
padding: 0 0 20px 0;
|
||||||
|
margin-top: 65px;
|
||||||
|
h1 {
|
||||||
|
margin: 0;
|
||||||
|
a {
|
||||||
|
font-size: 48px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: @aBlackColor;
|
||||||
|
img {
|
||||||
|
height: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#blogDesc {
|
||||||
|
font-size: 32px;
|
||||||
|
font-style: italic;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar {
|
||||||
|
background-color: @navBgColor;
|
||||||
|
margin-bottom: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav li a:hover {
|
||||||
|
background-color: @navHoverABgColor !important;
|
||||||
|
color: @navHoverAColor !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.nav li.active a {
|
||||||
|
background-color: @navBgColor !important;
|
||||||
|
color: @navActiveAColor !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.navbar-collapse {
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right:0;
|
||||||
|
}
|
||||||
|
.navbar-form {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* posts */
|
||||||
|
#posts {
|
||||||
|
padding-top: 10px;
|
||||||
|
.each-post {
|
||||||
|
border-bottom: @border;
|
||||||
|
margin-bottom: 10px;
|
||||||
|
padding: 30px;
|
||||||
|
background-color: #fff;
|
||||||
|
-moz-box-shadow: 0 1px 3px rgba(0, 0, 0, .1);
|
||||||
|
-webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, .1);
|
||||||
|
border-radius: 3px;
|
||||||
|
.title {
|
||||||
|
font-size: 48px;
|
||||||
|
color: @titleColor;
|
||||||
|
padding: 0 0 15px 0;
|
||||||
|
a {
|
||||||
|
font-size: 48px;
|
||||||
|
color: @titleColor;
|
||||||
|
padding: 0 0 15px 0;
|
||||||
|
&:hover {
|
||||||
|
color: @titleHoverColor;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.created-time {
|
||||||
|
border-bottom: 1px solid #eee;
|
||||||
|
padding-bottom: 3px;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.more {
|
||||||
|
background: @titleColor;
|
||||||
|
padding: 9px 10px;
|
||||||
|
border-radius: 2px;
|
||||||
|
line-height: 1;
|
||||||
|
font-size: 13px;
|
||||||
|
display: inline-block;
|
||||||
|
text-transform: uppercase;
|
||||||
|
margin-top: 15px;
|
||||||
|
margin-bottom: 15px;
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#disqus_thread {
|
||||||
|
border-top: 1px solid #eee;
|
||||||
|
padding: 5px 0 0 0;
|
||||||
|
}
|
||||||
|
#search {
|
||||||
|
width: 150px;
|
||||||
|
}
|
||||||
|
#searchInput {
|
||||||
|
// width: 0px;
|
||||||
|
}
|
||||||
|
@footerColor: #666;
|
||||||
|
@footerBgColor: #fff;
|
||||||
|
#footerContainer {
|
||||||
|
background-color: @footerBgColor;
|
||||||
|
color: @footerColor;
|
||||||
|
#footer {
|
||||||
|
a {
|
||||||
|
color: @footerColor;
|
||||||
|
}
|
||||||
|
ul {
|
||||||
|
list-style: none;
|
||||||
|
margin-bottom: 10px ;
|
||||||
|
padding-left:20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
@font-face{font-family:'Open Sans';font-style:normal;font-weight:300;src:local('Open Sans Light'),local('OpenSans-Light'),url('../../fonts/open-sans2/DXI1ORHCpsQm3Vp6mXoaTXhCUOGz7vYGh680lGh-uXM.woff') format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:400;src:local('Open Sans'),local('OpenSans'),url('../../fonts/open-sans2/cJZKeOuBrn4kERxqtaUH3T8E0i7KZn-EPnyo3HZu7kw.woff') format('woff')}@font-face{font-family:'Open Sans';font-style:normal;font-weight:700;src:local('Open Sans Bold'),local('OpenSans-Bold'),url('../../fonts/open-sans2/k3k702ZOKiLJc3WVjuplzHhCUOGz7vYGh680lGh-uXM.woff') format('woff')}@font-face{font-family:'Open Sans';font-style:italic;font-weight:400;src:local('Open Sans Italic'),local('OpenSans-Italic'),url('../../fonts/open-sans2/xjAJXh38I15wypJXxuGMBobN6UDyHWBl620a-IRfuBk.woff') format('woff')}::selection{background:#000;color:#fff}
|
||||||
|
::-moz-selection{background:#000;color:#fff}
|
||||||
|
::-webkit-selection{background:#000;color:#fff}
|
||||||
|
*,body{font-family:'Open Sans','Helvetica Neue',Arial,'Hiragino Sans GB','Microsoft YaHei','WenQuanYi Micro Hei',sans-serif;font-weight:300;font-size:14px}
|
||||||
|
h1,h2,h3{font-family:'Open Sans','Helvetica Neue',Arial,'Hiragino Sans GB','Microsoft YaHei','WenQuanYi Micro Hei',sans-serif;font-weight:300 !important}
|
||||||
|
a{cursor:pointer}
|
||||||
|
a:hover{text-decoration:none !important}
|
||||||
|
#headerContainer{height:100px;background-color:#fff}
|
||||||
|
#posts{width:845px;margin:auto}
|
||||||
|
#postsContainer{background:#f5f5f5 url("../images/noise.png");padding-bottom:5px}
|
||||||
|
#header{color:#000;position:relative;padding:0 0 20px 0;margin-top:15px}#header h1{margin:0;font-size:32px}#header h1 a{color:#000;font-size:32px}#header h1 a img{height:40px}
|
||||||
|
#header #blogDesc{margin-top:10px}
|
||||||
|
.navbar{margin-bottom:0;border-radius:0;border:none}
|
||||||
|
.navbar-collapse{padding-left:0;padding-right:0}
|
||||||
|
.navbar-form{padding:0}
|
||||||
|
#posts{padding-top:10px}#posts .each-post{border-bottom:1px solid #ebeff2;margin-bottom:10px;padding:30px;background-color:#fff;-moz-box-shadow:0 1px 3px rgba(0,0,0,0.1);-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.1);border-radius:3px}#posts .each-post .title{font-size:32px;color:#0fb264;padding:0 0 15px 0}#posts .each-post .title a{font-size:32px;color:#0fb264;padding:0 0 15px 0}
|
||||||
|
#posts .each-post .created-time{border-bottom:1px solid #eee;padding-bottom:3px;margin-bottom:5px}
|
||||||
|
#posts .each-post .more{background:#0fb264;padding:9px 10px;border-radius:2px;line-height:1;font-size:13px;display:inline-block;text-transform:uppercase;margin-top:15px;margin-bottom:15px;color:#fff}
|
||||||
|
#disqus_thread{border-top:1px solid #eee;padding:5px 0 0 0}
|
||||||
|
#search{width:200px}
|
||||||
|
#footerContainer{background-color:#fff;color:#666}#footerContainer #footer a{color:#666}
|
||||||
|
#footerContainer #footer ul{list-style:none;margin:0;padding-left:20px}
|
||||||
Loaded 100 of 977 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user