Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
64a3177978 | ||
|
|
ed2ad19341 | ||
|
|
b140cd538f | ||
|
|
2654b684df | ||
|
|
d424395d85 | ||
|
|
54810b3458 | ||
|
|
1cf66ad6c0 | ||
|
|
6dc334ca51 | ||
|
|
f9b4ead6be | ||
|
|
3bf6703929 | ||
|
|
ec657b9dcb | ||
|
|
4ffd048b2a | ||
|
|
6af19670da | ||
|
|
721e375d76 | ||
|
|
41f95cf0e5 | ||
|
|
ba411ef580 | ||
|
|
9dcf0ed53e | ||
|
|
d5d853ffd3 | ||
|
|
ae29119664 | ||
|
|
ad644258f5 | ||
|
|
8c98f4da5c | ||
|
|
e2585bf695 | ||
|
|
3b9bc687c4 | ||
|
|
2db182db1b | ||
|
|
f3e1eb6c3f | ||
|
|
956e1ba2bb | ||
|
|
f294fa4124 | ||
|
|
cabf89f9b8 | ||
|
|
d183cd5a77 | ||
|
|
000dfea92d | ||
|
|
a53398ebb4 | ||
|
|
b23592229a | ||
|
|
584bde247e | ||
|
|
6774392807 | ||
|
|
964cf1a750 | ||
|
|
52128e6453 | ||
|
|
032470c3df | ||
|
|
a8dd578624 | ||
|
|
f49624d3eb | ||
|
|
816af11db2 | ||
|
|
eda03f0aa4 | ||
|
|
6a06511405 | ||
|
|
15d8ebdc0f | ||
|
|
5dc929c4c0 | ||
|
|
a4d6a99fee | ||
|
|
15d3b847cb | ||
|
|
065ac99942 | ||
|
|
08ec359b93 | ||
|
|
2f81c04f41 | ||
|
|
e8bff79425 | ||
|
|
4ca8e8cd83 | ||
|
|
c0cc08a3c2 | ||
|
|
d32a6dd277 | ||
|
|
8bacc15309 | ||
|
|
8a3f24b9c6 | ||
|
|
2a7d1fe7b5 | ||
|
|
9a05ffcd8f | ||
|
|
aa95e680f9 | ||
|
|
874ab69c34 | ||
|
|
d43f5fd7ab | ||
|
|
6a048f0d9a | ||
|
|
cb3681f651 | ||
|
|
dfd7159401 | ||
|
|
929ec975da | ||
|
|
e826dc7b93 | ||
|
|
629a49e54b | ||
|
|
6ebedf94f0 | ||
|
|
a07bb25128 | ||
|
|
a007b89ebb | ||
|
|
cc4b003503 | ||
|
|
091922175a | ||
|
|
371c93912d | ||
|
|
27221acda7 | ||
|
|
5db724e80b | ||
|
|
14265d9de4 | ||
|
|
5c9e95ed60 | ||
|
|
2fc97ed42d | ||
|
|
45cca30cec | ||
|
|
31167b6aaf | ||
|
|
139906b9d6 | ||
|
|
a9d49369e2 | ||
|
|
303e0da5c0 | ||
|
|
ff5523bfaa | ||
|
|
063dd0140d | ||
|
|
c52d388d5d | ||
|
|
18bcdb48af | ||
|
|
db8f132507 | ||
|
|
439d5212b0 | ||
|
|
88e2320027 | ||
|
|
659a4e590a | ||
|
|
ab7f2386e0 | ||
|
|
ec82ff18f2 | ||
|
|
f3f00626e6 | ||
|
|
80fbb56426 | ||
|
|
a5c952882f | ||
|
|
973b452a7e | ||
|
|
25bcd21ea9 | ||
|
|
09de5e1e83 | ||
|
|
15b0ef21ff | ||
|
|
9cf9ded855 | ||
|
|
7af433ebaf | ||
|
|
67b608b324 | ||
|
|
2aa3f5a654 | ||
|
|
f5538218bd | ||
|
|
0e3bdd177c | ||
|
|
12520cc09d | ||
|
|
cb67892124 | ||
|
|
45c09c9a26 | ||
|
|
20951ea2dd | ||
|
|
530f2368da | ||
|
|
e685a99628 | ||
|
|
bfc5acc3ee | ||
|
|
551e3d965e | ||
|
|
7c479b5595 | ||
|
|
b135f9717f | ||
|
|
08ae37cae0 | ||
|
|
315a7bbe62 | ||
|
|
e173b18ddc | ||
|
|
dcc25df679 | ||
|
|
c561dec14c | ||
|
|
43e8f2e701 | ||
|
|
dd9952c453 | ||
|
|
19517dd634 | ||
|
|
a5b006aae7 | ||
|
|
90bd07cdcc | ||
|
|
92576e9239 |
No files matched your search
+4
-5
@@ -1,5 +1,5 @@
|
|||||||
language: go
|
language: go
|
||||||
go: 1.3
|
go: 1.7
|
||||||
|
|
||||||
services:
|
services:
|
||||||
- mongodb # 2.4.12
|
- mongodb # 2.4.12
|
||||||
@@ -7,8 +7,9 @@ services:
|
|||||||
install:
|
install:
|
||||||
- export PATH=$PATH:$HOME/gopath/bin
|
- export PATH=$PATH:$HOME/gopath/bin
|
||||||
- go get -v github.com/leanote/leanote/app
|
- go get -v github.com/leanote/leanote/app
|
||||||
- go get -u github.com/revel/cmd/revel
|
- go get -v github.com/leanote/leanote/cmd
|
||||||
- ls $GOPATH/src/github.com/revel/
|
# - go get -u github.com/revel/cmd/revel
|
||||||
|
# - ls $GOPATH/src/github.com/revel/
|
||||||
# - go get github.com/revel/moudle/revel
|
# - go get github.com/revel/moudle/revel
|
||||||
# - go install github.com/revel/cmd/revel
|
# - go install github.com/revel/cmd/revel
|
||||||
- pwd
|
- pwd
|
||||||
@@ -18,8 +19,6 @@ script:
|
|||||||
- mongo --version
|
- mongo --version
|
||||||
- mongorestore -h localhost -d leanote --directoryperdb ./mongodb_backup/leanote_install_data/
|
- mongorestore -h localhost -d leanote --directoryperdb ./mongodb_backup/leanote_install_data/
|
||||||
|
|
||||||
- go test github.com/leanote/leanote/app/tests
|
|
||||||
|
|
||||||
# gen tmp/main.go, routes/routes.go
|
# gen tmp/main.go, routes/routes.go
|
||||||
- go run app/cmd/main.go
|
- go run app/cmd/main.go
|
||||||
# build
|
# build
|
||||||
|
|||||||
+35
-17
@@ -15,6 +15,8 @@ var base = leanoteBase + '/public'; // public base
|
|||||||
var noteDev = leanoteBase + '/app/views/note/note-dev.html';
|
var noteDev = leanoteBase + '/app/views/note/note-dev.html';
|
||||||
var noteProBase = leanoteBase + '/app/views/note';
|
var noteProBase = leanoteBase + '/app/views/note';
|
||||||
|
|
||||||
|
var messagesPath = leanoteBase + 'messages';
|
||||||
|
|
||||||
// 合并Js, 这些js都是不怎么修改, 且是依赖
|
// 合并Js, 这些js都是不怎么修改, 且是依赖
|
||||||
// 840kb, 非常耗时!!
|
// 840kb, 非常耗时!!
|
||||||
gulp.task('concatDepJs', function() {
|
gulp.task('concatDepJs', function() {
|
||||||
@@ -26,7 +28,7 @@ gulp.task('concatDepJs', function() {
|
|||||||
'js/jQuery-slimScroll-1.3.0/jquery.slimscroll-min.js',
|
'js/jQuery-slimScroll-1.3.0/jquery.slimscroll-min.js',
|
||||||
'js/contextmenu/jquery.contextmenu-min.js',
|
'js/contextmenu/jquery.contextmenu-min.js',
|
||||||
'js/bootstrap-min.js',
|
'js/bootstrap-min.js',
|
||||||
'js/object_id-min.js',
|
'js/object_id.js',
|
||||||
];
|
];
|
||||||
|
|
||||||
for(var i in jss) {
|
for(var i in jss) {
|
||||||
@@ -205,6 +207,7 @@ gulp.task('i18n', function() {
|
|||||||
ls(leanoteBase + '/app/views');
|
ls(leanoteBase + '/app/views');
|
||||||
|
|
||||||
console.log('parsed');
|
console.log('parsed');
|
||||||
|
var langs = {}; // zh-cn: 1
|
||||||
|
|
||||||
// msg.zh
|
// msg.zh
|
||||||
function getAllMsgs(fname) {
|
function getAllMsgs(fname) {
|
||||||
@@ -229,14 +232,25 @@ gulp.task('i18n', function() {
|
|||||||
return msg;
|
return msg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 得到所有的语言的后缀
|
||||||
|
// 返回{en-us: 1, }
|
||||||
|
function getAllLangs() {
|
||||||
|
var langs = {};
|
||||||
|
var files = fs.readdirSync(messagesPath);
|
||||||
|
for(fn in files) {
|
||||||
|
var fname = files[fn];
|
||||||
|
if (fname.indexOf('-') > 0) {
|
||||||
|
langs[fname] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return langs;
|
||||||
|
}
|
||||||
|
|
||||||
// msg.zh, msg.js
|
// msg.zh, msg.js
|
||||||
function genI18nJsFile(fromFilename, otherNames, keys) {
|
function genI18nJsFile(targetFilename, lang, fromFilenames, keys) {
|
||||||
var msgs = {};
|
var msgs = {};
|
||||||
otherNames.unshift(fromFilename);
|
fromFilenames.forEach(function (name) {
|
||||||
// console.log(fromFilename);
|
var tmpMsgs = getAllMsgs(leanoteBase + '/messages/' + lang + '/' + name + '.conf');
|
||||||
// console.log(otherNames);
|
|
||||||
otherNames.forEach(function (name) {
|
|
||||||
var tmpMsgs = getAllMsgs(leanoteBase + '/messages/' + name);
|
|
||||||
for (var i in tmpMsgs) {
|
for (var i in tmpMsgs) {
|
||||||
msgs[i] = tmpMsgs[i];
|
msgs[i] = tmpMsgs[i];
|
||||||
}
|
}
|
||||||
@@ -261,20 +275,24 @@ gulp.task('i18n', function() {
|
|||||||
'}';
|
'}';
|
||||||
|
|
||||||
// 写入到文件中
|
// 写入到文件中
|
||||||
var toFilename = fromFilename + '.js';
|
var toFilename = targetFilename + '.' + lang + '.js';
|
||||||
fs.writeFile(base + '/js/i18n/' + toFilename, str);
|
fs.writeFile(base + '/js/i18n/' + toFilename, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 必须要的
|
function genTinymceLang(lang) {
|
||||||
// keys.push();
|
var msgs = getAllMsgs(leanoteBase + 'messages/' + lang + '/tinymce_editor.conf');
|
||||||
|
var str = 'tinymce.addI18n("' + lang + '",' + JSON.stringify(msgs) + ');';
|
||||||
|
fs.writeFile(base + '/tinymce/langs/' + lang + '.js', str);
|
||||||
|
}
|
||||||
|
|
||||||
genI18nJsFile('blog.zh', [], keys);
|
var langs = getAllLangs();
|
||||||
genI18nJsFile('blog.en', [], keys);
|
for (var lang in langs) {
|
||||||
genI18nJsFile('blog.fr', [], keys);
|
genI18nJsFile('blog', lang, ['blog'], keys);
|
||||||
|
genI18nJsFile('msg', lang, ['msg', 'member', 'markdown', 'album'], keys);
|
||||||
|
|
||||||
|
genTinymceLang(lang);
|
||||||
|
}
|
||||||
|
|
||||||
genI18nJsFile('msg.fr', ['member.fr', 'markdown.fr', 'album.fr'], keys);
|
|
||||||
genI18nJsFile('msg.zh', ['member.zh', 'markdown.zh', 'album.zh'], keys);
|
|
||||||
genI18nJsFile('msg.en', ['member.en', 'markdown.en', 'album.en'], keys);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
// 合并album需要的js
|
// 合并album需要的js
|
||||||
@@ -322,7 +340,7 @@ gulp.task('tinymce', function() {
|
|||||||
|
|
||||||
var cp = require('child_process');
|
var cp = require('child_process');
|
||||||
|
|
||||||
var bundleCmd = 'grunt bundle --themes leanote --plugins autolink,link,leaui_image,lists,hr,paste,searchreplace,leanote_nav,leanote_code,tabfocus,table,directionality,textcolor';
|
var bundleCmd = 'grunt bundle --themes leanote --plugins autolink,link,leaui_image,leaui_mindmap,lists,hr,paste,searchreplace,leanote_nav,leanote_code,tabfocus,table,directionality,textcolor';
|
||||||
// build
|
// build
|
||||||
cp.exec('grunt minify', {cwd: tinymceBase}, function(err, stdout, stderr) {
|
cp.exec('grunt minify', {cwd: tinymceBase}, function(err, stdout, stderr) {
|
||||||
console.log('stdout: ' + stdout);
|
console.log('stdout: ' + stdout);
|
||||||
|
|||||||
@@ -5,66 +5,83 @@
|
|||||||
|
|
||||||
## 1. Introduction
|
## 1. Introduction
|
||||||
|
|
||||||
Leanote, Not Just A Notepad!
|
Leanote, not just a notepad!
|
||||||

|

|
||||||
|
|
||||||
**Some Features**
|
**Highlighted Features**
|
||||||
|
|
||||||
* Knowledge: Manage your knowledge in Leanote. Leanote contains the tinymce editor and a markdown editor, just enjoy yourself writing.
|
* Note-taking made easy: Leanote incorporates a clean and intuitive interface, the `tinymce` rich-text editor and a dedicated *markdown* editor, making your writing/typing more efficient and enjoyable. For more advanced users, we even offer `Vim` and `Emacs` writing modes to help boost your writing speed to another level.
|
||||||
* Share: Share your knowledge with your friends in Leanote. You can invite your friends to join your notepad in the cloud so you can share knowledge.
|
* Knowledge management: The flexible and versatile notebook-note-tagging system of Leanote makes it an ideal tool for knowledge management.
|
||||||
* Cooperation: Collaborate with friends to improve your skills.
|
* Sharing: Share your knowledge, thoughts and experiences with friends via Leanote. Invite your friends to join your notepad in the cloud.
|
||||||
* Blog: Publish your knowledge and make Leanote your blog.
|
* Cooperating: Collaborate with colleagues to improve skills, fertilize ideas and brainstorm on the fly.
|
||||||
|
* Blogging: Publish your work and make Leanote your personal blog.
|
||||||
|
|
||||||
**Other Features**
|
**Other Features**
|
||||||
|
|
||||||
* Support Markdown
|
* Markdown syntax support
|
||||||
* Writting mode
|
* Distraction-free writing mode
|
||||||
* Export note to PDF
|
* `Vim` and `Emacs` editing mode
|
||||||
* Note batch operation
|
* Export notes to PDFs
|
||||||
* Custom theme for blog
|
* Batch note operation
|
||||||
|
* Customizable themes for blogging
|
||||||
|
|
||||||
## 2. Why we created Leanote
|
## 2. Why we create Leanote
|
||||||
To be honest, our inspiration comes from Evernote. We use Evernote to manage our knowledge everyday. But we find that:
|
|
||||||
* Evernote's editor can't meet our needs, it does not have document navigation, it does not render code properly (as a programmer, syntax highlighted code rendering is a basic need), it cannot resize images and so forth
|
We have been using the popular note-taking software/service `Evernote` as our knowledge management tool on a daily basis. Benefited from and inspired by `Evernote`, we decided to create a brand-new tool that provides everything `Evernote` has to offer, plus a bunch of new features that `Evernote` failed to deliver, such as:
|
||||||
* We like markdown, but Evernote does not support it.
|
|
||||||
* We want to share our knowledge, so all of us have our blogs (e.g. on Wordpress) and our Evernote accounts, but why can not those two be one!
|
* A more powerful editor: `Evernote`'s editor lacks the functionalities of **document navigation**, **syntax based code rendering** (as a programmer, syntax highlighted code rendering is a necessity), **image resizing** and so forth.
|
||||||
|
* Everybody loves *markdown*, however `Evernote` simply wouldn't add it despite of years' of requests from users. So we will do the favor and bring a *markdown* enabled editor to you, guess what, it is also rendered in real-time!
|
||||||
|
* If you a developer and miss the `Vim` or `Emacs` ways of writing, we offer you the choice of `Vim` and `Emacs` editting modes. Equipped with *markdown* syntax for text formatting, you will never need to touch your mouse while writing.
|
||||||
|
* We love managing knowledge and thoughts as much as sharing them, so everybody has their own note account (`Evernote`, `Onenote`, `Google doc`, `Wiz note` etc.) and social media account (`Facebook`, `Wordpress`, blogs, etc.). But why can’t those two be one? Leanote makes this first step to bridge the private note-taking and public knowledge sharing seamlessly.
|
||||||
|
* A complete and all-platform (sorry Windows phone) covering software suite: that includes Leanote Web & Server (this repository), [Desktop app](https://github.com/leanote/desktop-app), [iOS](https://github.com/leanote/leanote-ios), [Android](https://github.com/leanote/leanote-android). And they are all open source!
|
||||||
* ......
|
* ......
|
||||||
|
|
||||||
## 3. How to install Leanote
|
## 3. How to get Leanote
|
||||||
|
|
||||||
Leanote contains: Leanote Web & Server (this repository), [Desktop app](https://github.com/leanote/desktop-app), [iOS](https://github.com/leanote/leanote-ios), [Android](https://github.com/leanote/leanote-android). And all the products are open source!
|
The Leanote software suite contains: Leanote Web & Server (this repository), [Desktop app](https://github.com/leanote/desktop-app), [iOS](https://github.com/leanote/leanote-ios), [Android](https://github.com/leanote/leanote-android).
|
||||||
|
|
||||||
You can install Leanote on your server, and use Leanote App (Desktop, iOs, Android) to sync notes with your self-hosted server.
|
Interested in our product and want to try it out from your web browser? Welcome to sign up on https://leanote.com.
|
||||||
|
|
||||||
Welcome to sign up on https://leanote.com, Leanote team provide a stable and reliable service for you.
|
Feeling suspicious about how those note-taking companies treat your personal data? You can install Leanote on your server, and use Leanote App (Desktop, iOS, Android) to sync notes with your self-hosted server.
|
||||||
|
|
||||||
More information about how to install Leanote please see:
|
More information about how to install Leanote please see:
|
||||||
|
|
||||||
* [Leanote binary installation tutorial](https://github.com/leanote/leanote/wiki/leanote-binary-distribution-installation-tutorial)
|
* Leanote binary installation tutorial:
|
||||||
* [Leanote source installation tutorial](https://github.com/leanote/leanote/wiki/leanote-source-installation-tutorial)
|
* [Windows](https://github.com/leanote/leanote/wiki/leanote-source-installation-on-Windows-(En))
|
||||||
|
* [Mac and Linux](https://github.com/leanote/leanote/wiki/leanote-binary-installation-on-Mac-and-Linux-(En))
|
||||||
|
* Leanote source installation tutorial:
|
||||||
|
* [Windows](https://github.com/leanote/leanote/wiki/leanote-source-installation-on-Windows-(En))
|
||||||
|
* [Mac and Linux](https://github.com/leanote/leanote/wiki/Leanote-source-installation-on-Mac-and-Linux-(En))
|
||||||
|
|
||||||
## 4. How to develop Leanote
|
## 4. Documentation
|
||||||
|
|
||||||
Please see [How-to-develop-leanote](https://github.com/leanote/leanote/wiki/How-to-develop-leanote-%E5%A6%82%E4%BD%95%E5%BC%80%E5%8F%91leanote)
|
Please see [wiki](https://github.com/leanote/leanote/wiki) for detailed instruction on how to install Leanote on various platforms, trouble shooting and configuration explanations.
|
||||||
|
|
||||||
## 5. Docs
|
|
||||||
|
|
||||||
Please see [wiki](https://github.com/leanote/leanote/wiki).
|
## 5. How to develop Leanote
|
||||||
|
|
||||||
## 6. Contributors
|
If you are a developer yourself and feel like to build on top of Leanote, please refer to [How-to-develop-leanote](https://github.com/leanote/leanote/wiki/How-to-develop-leanote-%E5%A6%82%E4%BD%95%E5%BC%80%E5%8F%91leanote).
|
||||||
Thank you to all the [contributors](https://github.com/leanote/leanote/graphs/contributors) on
|
|
||||||
this project. Your help is much appreciated.
|
|
||||||
|
## 6. Contributions
|
||||||
|
|
||||||
|
Like or dislike Leanote, please leave your comments and suggestions to help us improve it.
|
||||||
|
If you encounter any issue, we suggest you first do a search in the issues section to see whether a solution already exists, or open up a new one otherwise.
|
||||||
|
|
||||||
|
We’d like to acknowledge the contributions made by our [developers and contributors](https://github.com/leanote/leanote/graphs/contributors) to
|
||||||
|
this project. Leanote won’t exist without your hard work. Your help is much appreciated.
|
||||||
|
|
||||||
## 7. Join us
|
## 7. Join us
|
||||||
|
|
||||||
Please fork this repository and contribute back using [pull requests](https://github.com/leanote/leanote/pulls).
|
Please feel free to fork this repository and contribute back using [pull requests](https://github.com/leanote/leanote/pulls).
|
||||||
|
|
||||||
If you find some problems or has some good ideas, please submit [issues](https://github.com/leanote/leanote/issues).
|
If you find any problems or have any good ideas, feature requests, please submit here [issues](https://github.com/leanote/leanote/issues).
|
||||||
|
|
||||||
You are always welcomed!
|
|
||||||
|
|
||||||
## 8. Donation
|
## 8. Donation
|
||||||
Support us, [donate us](http://leanote.org/#donate). And thanks [donators](http://leanote.leanote.com/post/leanote-donation-list).
|
|
||||||
|
If you like our product, consider supporting us via [donate us](http://leanote.org/#donate).
|
||||||
|
We acknowledge the donations make by all the [donators](http://leanote.leanote.com/post/leanote-donation-list).
|
||||||
|
|
||||||
## 9. Related projects
|
## 9. Related projects
|
||||||
|
|
||||||
@@ -72,14 +89,14 @@ Support us, [donate us](http://leanote.org/#donate). And thanks [donators](http:
|
|||||||
* [Leanote iOS](https://github.com/leanote/leanote-ios), [Download From App Store](https://itunes.apple.com/en/app/leanote/id1022302858?mt=8)
|
* [Leanote iOS](https://github.com/leanote/leanote-ios), [Download From App Store](https://itunes.apple.com/en/app/leanote/id1022302858?mt=8)
|
||||||
* [Leanote Android](https://github.com/leanote/leanote-android), development phase
|
* [Leanote Android](https://github.com/leanote/leanote-android), development phase
|
||||||
|
|
||||||
Yare are welcome to join us.
|
You are welcome to join us.
|
||||||
|
|
||||||
## 9. Support & Join us
|
## 10. Contacts
|
||||||
|
|
||||||
* Email: leanote@leanote.com
|
* Email: leanote@leanote.com
|
||||||
* [Leanote BBS](http://bbs.leanote.com)
|
* [Leanote BBS](http://bbs.leanote.com)
|
||||||
* [Leanote Google Group](https://groups.google.com/forum/#!forum/leanote)
|
* [Leanote Google Group](https://groups.google.com/forum/#!forum/leanote)
|
||||||
* QQ Group: 256076853, 158716820
|
* QQ Groups: 326073529, 256076853, 158716820
|
||||||
|
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
|
|
||||||
@@ -91,64 +108,71 @@ Leanote, 不只是笔记!
|
|||||||
|
|
||||||
**特性**
|
**特性**
|
||||||
|
|
||||||
* 知识管理: 通过Leanote来管理知识, Leanote有易操作的界面, 包含两款编辑器富文本编辑器和Markdown编辑器. 在Leanote, 你可以尽情享受写作.
|
* 高效笔记:Leanote 有易操作的界面, 包含一款富文本编辑器和Markdown编辑器,让您的笔记记录更轻松和高效。对高阶用户,我们还提供`Vim` 和`Emacs` 编辑模式,助推你的写作速度更上层楼。
|
||||||
* 博客: Leanote也可以作为你的博客, 将知识公开成博客, 让Leanote把你的知识传播的更远!
|
* 知识管理: Leanote 灵活而强大的“笔记本-笔记-标签”系统,让它成为你个人知识管理的利器。
|
||||||
* 分享: 你也可以通过分享知识给好友, 让好友拥有你的知识.
|
* 分享: 你可以通过Leanote同好友分享知识、想法和经历, 邀请好友加入你的笔记簿,通过云端交流信息。
|
||||||
* 协作: 在分享的同时也可以与好友一起协作知识.
|
* 协作: Leanote协助你与同事之间相互协作,激荡新思路,随时随地头脑风暴。
|
||||||
|
* 博客: Leanote也可以作为你的个人博客, 把你的知识传播的更远!
|
||||||
|
|
||||||
**一些其它特性**
|
**其它特性**
|
||||||
|
|
||||||
* 支持Markdown编辑
|
* 支持Markdown编辑
|
||||||
* 写作模式
|
* 写作模式
|
||||||
|
* `Vim` 及 `Emacs` 编辑模式
|
||||||
* 支持PDF导出
|
* 支持PDF导出
|
||||||
* 支持批量操作
|
* 支持批量操作
|
||||||
* 博客自定义主题, 实现高度定制化
|
* 博客自定义主题, 实现高度定制化
|
||||||
|
|
||||||
## 2. 为什么我们要创建Leanote?
|
## 2. 为什么我们要创建Leanote?
|
||||||
说实话, 我们曾是evernote的忠实粉丝, 但是我们也发现evernote的不足:
|
我们都曾是`Evernote`的忠实粉丝, 一直以来`Evernote`都是我们日常知识管理的有效工具。于是我们决定重新创造一款工具,提供`Evernote`所能提供的功能,同时弥补`Evernote`的不足,比如:
|
||||||
* evernote的编辑器不能满足我们的需求, 不能贴代码(格式会乱掉, 作为程序员, 代码是我们的基本需求啊), 图片不能缩放.
|
* 功能更强的文本编辑器:`Evernote`的编辑器不能满足我们的需求, 不能实现文档导航、不能贴代码(格式会乱掉, 作为程序员, 代码是我们的基本需求啊), 图片不能缩放等。
|
||||||
* 我们是markdown的爱好者, 可是evernote竟然没有.
|
* `Evernote` 不支持所有人都喜爱的markdown语法,于是我们为Leanote配备了一款可以实时渲染的markdown编辑器。
|
||||||
* 我们也想将知识公开, 所以我们有自己的博客, 如wordpress, 但为什么这两者不能合二为一呢?
|
* 如果你是一名开发者,觉得手指怀念`Vim` 或 `Emacs` 了,那么我们还提供给你`Vim` 和 `Emacs` 写作模式,配合*markdown*的格式编辑,写作的时候再也不用去碰鼠标了。
|
||||||
|
* 知识积累和知识分享同样重要,因此大家都有自己的笔记账号和社交账号。但为什么这两者不能合二为一呢? Leanote 做到了将二者无缝衔接。
|
||||||
|
* 一套完整的、全平台覆盖的软件套装,包括了web、桌面、安卓、IOS设备,而且全部开源!
|
||||||
* 还有...
|
* 还有...
|
||||||
|
|
||||||
## 3.安装Leanote
|
## 3. 获取Leanote
|
||||||
|
|
||||||
Leanote云笔记产品包括: Leanote Web & Server(即本仓库), 桌面客户端, ios, android. 4端全部开源! 你可以下载它安装在自己的服务器上, Leanote的客户端可以连接自建的服务.
|
Leanote云笔记产品包括: Leanote Web & Server(即本仓库), 桌面客户端, IOS, android. 4端全部开源!
|
||||||
|
|
||||||
欢迎在 https://leanote.com 上注册, Leanote团队为你提供稳定可靠的服务.
|
如果想试用我们的产品,欢迎在 https://leanote.com 上注册, Leanote团队为你提供稳定可靠的服务。
|
||||||
|
担心服务厂商如何处理你的个人数据吗?你可以下载Leanote安装在自己的服务器上, 通过Leanote客户端连接与自建服务同步数据。
|
||||||
|
|
||||||
这里详细整理了Leanote二进版和Leanote开发版的安装教程, 请移步至:
|
这里详细整理了Leanote二进版和Leanote开发版的安装教程, 请移步至:
|
||||||
|
|
||||||
* [Leanote二进制详细安装教程](https://github.com/leanote/leanote/wiki/leanote%E4%BA%8C%E8%BF%9B%E5%88%B6%E7%89%88%E8%AF%A6%E7%BB%86%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B)
|
* Leanote二进制详细安装教程:
|
||||||
* [Leanote源码详细安装教程](https://github.com/leanote/leanote/wiki/leanote%E5%BC%80%E5%8F%91%E7%89%88%E8%AF%A6%E7%BB%86%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B)
|
* [Windows](https://github.com/leanote/leanote/wiki/Leanote%E4%BA%8C%E8%BF%9B%E5%88%B6%E7%89%88%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B---Windows)
|
||||||
|
* [Mac, Linux](https://github.com/leanote/leanote/wiki/leanote%E4%BA%8C%E8%BF%9B%E5%88%B6%E7%89%88%E8%AF%A6%E7%BB%86%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B)
|
||||||
|
* Leanote源码详细安装教程:
|
||||||
|
* [Windows](https://github.com/leanote/leanote/wiki/Leanote-%E6%BA%90%E7%A0%81%E7%89%88%E8%AF%A6%E7%BB%86%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B----Windows)
|
||||||
|
* [Mac, Linux](https://github.com/leanote/leanote/wiki/leanote%E5%BC%80%E5%8F%91%E7%89%88%E8%AF%A6%E7%BB%86%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B)
|
||||||
|
|
||||||
## 4. 如何对Leanote进行二次开发
|
## 4. 相关文档
|
||||||
|
|
||||||
请查看 [How-to-develop-Leanote](https://github.com/leanote/leanote/wiki/How-to-develop-leanote-%E5%A6%82%E4%BD%95%E5%BC%80%E5%8F%91leanote)
|
更多详细的安装说明、问题处理和配置说明文档,请查看 [wiki](https://github.com/leanote/leanote/wiki)。
|
||||||
|
|
||||||
## 5 相关文档
|
## 5. 如何对Leanote进行二次开发
|
||||||
* [Leanote二进制版详细安装教程](https://github.com/leanote/leanote/wiki/leanote%E4%BA%8C%E8%BF%9B%E5%88%B6%E7%89%88%E8%AF%A6%E7%BB%86%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B)
|
|
||||||
* [Leanote源码详细安装教程](https://github.com/leanote/leanote/wiki/leanote%E5%BC%80%E5%8F%91%E7%89%88%E8%AF%A6%E7%BB%86%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B)
|
|
||||||
* [Leanote source Leanote源码导读](https://github.com/leanote/leanote/wiki/Leanote-source-leanote源码导读)
|
|
||||||
* [Leanote blog theme api(中文版)](https://github.com/leanote/leanote/wiki/leanote-blog-theme-api)
|
|
||||||
* [How to develop leanote 如何开发Leanote](https://github.com/leanote/leanote/wiki/How-to-develop-leanote-如何开发leanote)
|
|
||||||
|
|
||||||
更多文档请查看 [wiki](https://github.com/leanote/leanote/wiki).
|
如果您有兴趣基于Leanote二次开发,请查看 [How-to-develop-Leanote](https://github.com/leanote/leanote/wiki/How-to-develop-leanote-%E5%A6%82%E4%BD%95%E5%BC%80%E5%8F%91leanote)。
|
||||||
|
|
||||||
## 6. 贡献者
|
## 6. 贡献者
|
||||||
|
|
||||||
谢谢 [贡献者](https://github.com/leanote/leanote/graphs/contributors) 的贡献, Leanote因有你们而更完美!
|
在此对向Leanote贡献力量的[贡献者们](https://github.com/leanote/leanote/graphs/contributors) 表示感谢。Leanote因有你们而更完美!
|
||||||
|
|
||||||
## 7. 加入我们
|
## 7. 加入我们
|
||||||
|
|
||||||
欢迎提交[pull requests](https://github.com/leanote/leanote/pulls) 到Leanote.
|
欢迎提交[pull requests](https://github.com/leanote/leanote/pulls) 到Leanote。
|
||||||
|
|
||||||
有任何问题或建议, 欢迎提交[issue](https://github.com/leanote/leanote/issues).
|
有任何问题或建议, 请先搜索[issue](https://github.com/leanote/leanote/issues)区是否已经有解决方法。如果没有,欢迎提交新issue。
|
||||||
|
|
||||||
Leanote还有很多问题, 如果你喜欢它, 欢迎加入我们一起完善Leanote.
|
Leanote还有很多问题, 如果你喜欢它, 欢迎加入我们一起完善Leanote。
|
||||||
|
|
||||||
## 8. 捐赠
|
## 8. 捐赠
|
||||||
支持我们, [捐赠Leanote](http://leanote.org/#donate). 感谢[捐赠者](http://leanote.leanote.com/post/leanote-donation-list), 谢谢你们的鼓励, Leanote会一直坚持!
|
|
||||||
|
如果您喜欢我们的产品,请考虑支持我们, [捐赠Leanote](http://leanote.org/#donate)。
|
||||||
|
|
||||||
|
感谢[这些捐赠者](http://leanote.leanote.com/post/leanote-donation-list), 谢谢你们的鼓励, Leanote会一直坚持!
|
||||||
|
|
||||||
## 9. 其它相关项目
|
## 9. 其它相关项目
|
||||||
* [Leanote Desktop App](https://github.com/leanote/desktop-app), [下载地址](http://app.leanote.com)
|
* [Leanote Desktop App](https://github.com/leanote/desktop-app), [下载地址](http://app.leanote.com)
|
||||||
@@ -160,6 +184,6 @@ Leanote还有很多问题, 如果你喜欢它, 欢迎加入我们一起完善Lea
|
|||||||
## 联系&加入我们
|
## 联系&加入我们
|
||||||
* Email: leanote@leanote.com
|
* Email: leanote@leanote.com
|
||||||
* [Leanote 社区](http://bbs.leanote.com)
|
* [Leanote 社区](http://bbs.leanote.com)
|
||||||
* QQ群: 256076853, 158716820(已满)
|
* [QQ群](http://leanote.leanote.com/post/Leanote-groups)
|
||||||
* [Leanote Google Group](https://groups.google.com/forum/#!forum/leanote)
|
* [Leanote Google Group](https://groups.google.com/forum/#!forum/leanote)
|
||||||
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
# Leanote
|
|
||||||
|
|
||||||
[](https://gitter.im/leanote/leanote?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
|
||||||
[](https://travis-ci.org/leanote/leanote)
|
|
||||||
## 1. 介绍
|
|
||||||
|
|
||||||
Leanote, 不只是笔记!
|
|
||||||

|
|
||||||
|
|
||||||
**特性**
|
|
||||||
|
|
||||||
* 知识管理: 通过leanote来管理知识, leanote有易操作的界面, 包含两款编辑器tinymce和markdown. 在leanote, 你可以尽情享受写作.
|
|
||||||
* 分享: 你也可以通过分享知识给好友, 让好友拥有你的知识.
|
|
||||||
* 协作: 在分享的同时也可以与好友一起协作知识.
|
|
||||||
* 博客: leanote也可以作为你的博客, 将知识公开成博客, 让leanote把你的知识传播的更远!
|
|
||||||
|
|
||||||
## 2. 为什么我们要创建leanote?
|
|
||||||
说实话, 我们曾是evernote的忠实粉丝, 但是我们也发现evernote的不足:
|
|
||||||
* evernote的编辑器不能满足我们的需求, 不能贴代码(格式会乱掉, 作为程序员, 代码是我们的基本需求啊), 图片不能缩放.
|
|
||||||
* 我们是markdown的爱好者, 可是evernote竟然没有.
|
|
||||||
* 我们也想将知识公开, 所以我们有自己的博客, 如wordpress, 但为什么这两者不能合二为一呢?
|
|
||||||
* 还有...
|
|
||||||
|
|
||||||
## 3.安装leanote
|
|
||||||
leanote是一款私有云笔记, 你可以下载它安装在自己的服务器上, 当然也可以在 http://leanote.com 上注册.
|
|
||||||
|
|
||||||
这里详细整理了leanote二进版和leanote开发版的安装教程, 请移步至:
|
|
||||||
|
|
||||||
* [leanote二进制详细安装教程](https://github.com/leanote/leanote/wiki/leanote%E4%BA%8C%E8%BF%9B%E5%88%B6%E7%89%88%E8%AF%A6%E7%BB%86%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B)
|
|
||||||
* [leanote开发版详细安装教程](https://github.com/leanote/leanote/wiki/leanote%E5%BC%80%E5%8F%91%E7%89%88%E8%AF%A6%E7%BB%86%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B)
|
|
||||||
|
|
||||||
## 4. 如何对leanote进行二次开发
|
|
||||||
|
|
||||||
请查看 [How-to-develop-leanote](https://github.com/leanote/leanote/wiki/How-to-develop-leanote-%E5%A6%82%E4%BD%95%E5%BC%80%E5%8F%91leanote)
|
|
||||||
|
|
||||||
## 5 相关文档
|
|
||||||
* [leanote二进制版详细安装教程](https://github.com/leanote/leanote/wiki/leanote%E4%BA%8C%E8%BF%9B%E5%88%B6%E7%89%88%E8%AF%A6%E7%BB%86%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B)
|
|
||||||
* [leanote开发版详细安装教程](https://github.com/leanote/leanote/wiki/leanote%E5%BC%80%E5%8F%91%E7%89%88%E8%AF%A6%E7%BB%86%E5%AE%89%E8%A3%85%E6%95%99%E7%A8%8B)
|
|
||||||
* [Leanote source leanote源码导读](https://github.com/leanote/leanote/wiki/Leanote-source-leanote源码导读)
|
|
||||||
* [leanote blog theme api(中文版)](https://github.com/leanote/leanote/wiki/leanote-blog-theme-api)
|
|
||||||
* [How to develop leanote 如何开发leanote](https://github.com/leanote/leanote/wiki/How-to-develop-leanote-如何开发leanote)
|
|
||||||
|
|
||||||
更多文档请查看 [wiki](https://github.com/leanote/leanote/wiki).
|
|
||||||
|
|
||||||
## 6. 贡献者
|
|
||||||
多谢 [贡献者](https://github.com/leanote/leanote/graphs/contributors) 的贡献, leanote因有你们而更完美!
|
|
||||||
|
|
||||||
## 7. 加入我们
|
|
||||||
|
|
||||||
欢迎提交[pull requests](https://github.com/leanote/leanote/pulls) 到leanote.
|
|
||||||
|
|
||||||
有任何问题或建议, 欢迎提交[issue](https://github.com/leanote/leanote/issues).
|
|
||||||
|
|
||||||
Leanote还有很多问题, 如果你喜欢它, 欢迎加入我们一起完善leanote.
|
|
||||||
|
|
||||||
## 8. 捐赠
|
|
||||||
支持我们, [捐赠Leanote](http://leanote.org/#donate). 感谢[捐赠者](http://leanote.leanote.com/post/leanote-donation-list), 谢谢你们的鼓励, Leanote会一直坚持!
|
|
||||||
|
|
||||||
## 9. 其它相关项目
|
|
||||||
* [Leanote Desktop App](https://github.com/leanote/desktop-app), [下载地址](http://app.leanote.com)
|
|
||||||
* [Leanote IOS](https://github.com/leanote/leanote-ios), [从App Store下载](https://itunes.apple.com/zn/app/leanote/id1022302858?mt=8)
|
|
||||||
* [Leanote Android](https://github.com/Dminter/leanote-android-client), 开发阶段
|
|
||||||
|
|
||||||
欢迎加入我们!
|
|
||||||
|
|
||||||
## 联系&加入我们
|
|
||||||
* Email: leanote@leanote.com
|
|
||||||
* [leanote 社区](http://bbs.leanote.com)
|
|
||||||
* QQ群: 158716820, 256076853
|
|
||||||
* [Leanote Google Group](https://groups.google.com/forum/#!forum/leanote)
|
|
||||||
|
|
||||||
----------------------------------------------------------------
|
|
||||||
[English](README.md)
|
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
# Modifications
|
||||||
|
|
||||||
|
* revel.go
|
||||||
|
|
||||||
|
```
|
||||||
|
RevelImportPath = "github.com/leanote/leanote/vendor/github.com/revel/revel"
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
# RUN
|
||||||
|
```
|
||||||
|
go install github.com/leanote/leanote/cmd/leanote_revel
|
||||||
|
leanote_revel run github.com/leanote/leanote
|
||||||
|
```
|
||||||
|
|
||||||
|
# build leanote, 在当前目录生成了leanote二进制文件
|
||||||
|
go build -o ./leanote github.com/leanote/leanote/app/tmp
|
||||||
|
|
||||||
|
# 运行leanote, 其中-importPath是必须的
|
||||||
|
./leanote -importPath=github.com/leanote/leanote -runMode=prod -port=9000
|
||||||
@@ -23,11 +23,11 @@ func (c Album) Index() revel.Result {
|
|||||||
// all albums by userId
|
// all albums by userId
|
||||||
func (c Album) GetAlbums() revel.Result {
|
func (c Album) GetAlbums() revel.Result {
|
||||||
re := albumService.GetAlbums(c.GetUserId())
|
re := albumService.GetAlbums(c.GetUserId())
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
func (c Album) DeleteAlbum(albumId string) revel.Result {
|
func (c Album) DeleteAlbum(albumId string) revel.Result {
|
||||||
re, msg := albumService.DeleteAlbum(c.GetUserId(), albumId)
|
re, msg := albumService.DeleteAlbum(c.GetUserId(), albumId)
|
||||||
return c.RenderJson(info.Re{Ok: re, Msg: msg})
|
return c.RenderJSON(info.Re{Ok: re, Msg: msg})
|
||||||
}
|
}
|
||||||
|
|
||||||
// add album
|
// add album
|
||||||
@@ -40,13 +40,13 @@ func (c Album) AddAlbum(name string) revel.Result {
|
|||||||
re := albumService.AddAlbum(album)
|
re := albumService.AddAlbum(album)
|
||||||
|
|
||||||
if re {
|
if re {
|
||||||
return c.RenderJson(album)
|
return c.RenderJSON(album)
|
||||||
} else {
|
} else {
|
||||||
return c.RenderJson(false)
|
return c.RenderJSON(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// update alnum name
|
// update alnum name
|
||||||
func (c Album) UpdateAlbum(albumId, name string) revel.Result {
|
func (c Album) UpdateAlbum(albumId, name string) revel.Result {
|
||||||
return c.RenderJson(albumService.UpdateAlbum(albumId, c.GetUserId(), name))
|
return c.RenderJSON(albumService.UpdateAlbum(albumId, c.GetUserId(), name))
|
||||||
}
|
}
|
||||||
@@ -24,7 +24,7 @@ type Attach struct {
|
|||||||
// 上传附件
|
// 上传附件
|
||||||
func (c Attach) UploadAttach(noteId string) revel.Result {
|
func (c Attach) UploadAttach(noteId string) revel.Result {
|
||||||
re := c.uploadAttach(noteId)
|
re := c.uploadAttach(noteId)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
func (c Attach) uploadAttach(noteId string) (re info.Re) {
|
func (c Attach) uploadAttach(noteId string) (re info.Re) {
|
||||||
var fileId = ""
|
var fileId = ""
|
||||||
@@ -118,7 +118,7 @@ func (c Attach) uploadAttach(noteId string) (re info.Re) {
|
|||||||
func (c Attach) DeleteAttach(attachId string) revel.Result {
|
func (c Attach) DeleteAttach(attachId string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok, re.Msg = attachService.DeleteAttach(attachId, c.GetUserId())
|
re.Ok, re.Msg = attachService.DeleteAttach(attachId, c.GetUserId())
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// get all attachs by noteId
|
// get all attachs by noteId
|
||||||
@@ -126,7 +126,7 @@ func (c Attach) GetAttachs(noteId string) revel.Result {
|
|||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = true
|
re.Ok = true
|
||||||
re.List = attachService.ListAttachs(noteId, c.GetUserId())
|
re.List = attachService.ListAttachs(noteId, c.GetUserId())
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 下载附件
|
// 下载附件
|
||||||
|
|||||||
@@ -17,29 +17,29 @@ type Auth struct {
|
|||||||
//--------
|
//--------
|
||||||
// 登录
|
// 登录
|
||||||
func (c Auth) Login(email, from string) revel.Result {
|
func (c Auth) Login(email, from string) revel.Result {
|
||||||
c.RenderArgs["title"] = c.Message("login")
|
c.ViewArgs["title"] = c.Message("login")
|
||||||
c.RenderArgs["subTitle"] = c.Message("login")
|
c.ViewArgs["subTitle"] = c.Message("login")
|
||||||
c.RenderArgs["email"] = email
|
c.ViewArgs["email"] = email
|
||||||
c.RenderArgs["from"] = from
|
c.ViewArgs["from"] = from
|
||||||
c.RenderArgs["openRegister"] = configService.IsOpenRegister()
|
c.ViewArgs["openRegister"] = configService.IsOpenRegister()
|
||||||
|
|
||||||
sessionId := c.Session.Id()
|
sessionId := c.Session.ID()
|
||||||
if sessionService.LoginTimesIsOver(sessionId) {
|
if sessionService.LoginTimesIsOver(sessionId) {
|
||||||
c.RenderArgs["needCaptcha"] = true
|
c.ViewArgs["needCaptcha"] = true
|
||||||
}
|
}
|
||||||
|
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
|
|
||||||
if c.Has("demo") {
|
if c.Has("demo") {
|
||||||
c.RenderArgs["demo"] = true
|
c.ViewArgs["demo"] = true
|
||||||
c.RenderArgs["email"] = "demo@leanote.com"
|
c.ViewArgs["email"] = "demo@leanote.com"
|
||||||
}
|
}
|
||||||
return c.RenderTemplate("home/login.html")
|
return c.RenderTemplate("home/login.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 为了demo和register
|
// 为了demo和register
|
||||||
func (c Auth) doLogin(email, pwd string) revel.Result {
|
func (c Auth) doLogin(email, pwd string) revel.Result {
|
||||||
sessionId := c.Session.Id()
|
sessionId := c.Session.ID()
|
||||||
var msg = ""
|
var msg = ""
|
||||||
|
|
||||||
userInfo, err := authService.Login(email, pwd)
|
userInfo, err := authService.Login(email, pwd)
|
||||||
@@ -49,13 +49,13 @@ func (c Auth) doLogin(email, pwd string) revel.Result {
|
|||||||
} else {
|
} else {
|
||||||
c.SetSession(userInfo)
|
c.SetSession(userInfo)
|
||||||
sessionService.ClearLoginTimes(sessionId)
|
sessionService.ClearLoginTimes(sessionId)
|
||||||
return c.RenderJson(info.Re{Ok: true})
|
return c.RenderJSON(info.Re{Ok: true})
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.RenderJson(info.Re{Ok: false, Item: sessionService.LoginTimesIsOver(sessionId), Msg: c.Message(msg)})
|
return c.RenderJSON(info.Re{Ok: false, Item: sessionService.LoginTimesIsOver(sessionId), Msg: c.Message(msg)})
|
||||||
}
|
}
|
||||||
func (c Auth) DoLogin(email, pwd string, captcha string) revel.Result {
|
func (c Auth) DoLogin(email, pwd string, captcha string) revel.Result {
|
||||||
sessionId := c.Session.Id()
|
sessionId := c.Session.ID()
|
||||||
var msg = ""
|
var msg = ""
|
||||||
|
|
||||||
// > 5次需要验证码, 直到登录成功
|
// > 5次需要验证码, 直到登录成功
|
||||||
@@ -70,16 +70,16 @@ func (c Auth) DoLogin(email, pwd string, captcha string) revel.Result {
|
|||||||
} else {
|
} else {
|
||||||
c.SetSession(userInfo)
|
c.SetSession(userInfo)
|
||||||
sessionService.ClearLoginTimes(sessionId)
|
sessionService.ClearLoginTimes(sessionId)
|
||||||
return c.RenderJson(info.Re{Ok: true})
|
return c.RenderJSON(info.Re{Ok: true})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.RenderJson(info.Re{Ok: false, Item: sessionService.LoginTimesIsOver(sessionId), Msg: c.Message(msg)})
|
return c.RenderJSON(info.Re{Ok: false, Item: sessionService.LoginTimesIsOver(sessionId), Msg: c.Message(msg)})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注销
|
// 注销
|
||||||
func (c Auth) Logout() revel.Result {
|
func (c Auth) Logout() revel.Result {
|
||||||
sessionId := c.Session.Id()
|
sessionId := c.Session.ID()
|
||||||
sessionService.Clear(sessionId)
|
sessionService.Clear(sessionId)
|
||||||
c.ClearSession()
|
c.ClearSession()
|
||||||
return c.Redirect("/login")
|
return c.Redirect("/login")
|
||||||
@@ -92,7 +92,7 @@ func (c Auth) Demo() revel.Result {
|
|||||||
|
|
||||||
userInfo, err := authService.Login(email, pwd)
|
userInfo, err := authService.Login(email, pwd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.RenderJson(info.Re{Ok: false})
|
return c.RenderJSON(info.Re{Ok: false})
|
||||||
} else {
|
} else {
|
||||||
c.SetSession(userInfo)
|
c.SetSession(userInfo)
|
||||||
return c.Redirect("/note")
|
return c.Redirect("/note")
|
||||||
@@ -107,11 +107,11 @@ func (c Auth) Register(from, iu string) revel.Result {
|
|||||||
return c.Redirect("/index")
|
return c.Redirect("/index")
|
||||||
}
|
}
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
c.RenderArgs["from"] = from
|
c.ViewArgs["from"] = from
|
||||||
c.RenderArgs["iu"] = iu
|
c.ViewArgs["iu"] = iu
|
||||||
|
|
||||||
c.RenderArgs["title"] = c.Message("register")
|
c.ViewArgs["title"] = c.Message("register")
|
||||||
c.RenderArgs["subTitle"] = c.Message("register")
|
c.ViewArgs["subTitle"] = c.Message("register")
|
||||||
return c.RenderTemplate("home/register.html")
|
return c.RenderTemplate("home/register.html")
|
||||||
}
|
}
|
||||||
func (c Auth) DoRegister(email, pwd, iu string) revel.Result {
|
func (c Auth) DoRegister(email, pwd, iu string) revel.Result {
|
||||||
@@ -145,22 +145,22 @@ func (c Auth) DoRegister(email, pwd, iu string) revel.Result {
|
|||||||
// 找回密码
|
// 找回密码
|
||||||
func (c Auth) FindPassword() revel.Result {
|
func (c Auth) FindPassword() revel.Result {
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
c.RenderArgs["title"] = c.Message("findPassword")
|
c.ViewArgs["title"] = c.Message("findPassword")
|
||||||
c.RenderArgs["subTitle"] = c.Message("findPassword")
|
c.ViewArgs["subTitle"] = c.Message("findPassword")
|
||||||
return c.RenderTemplate("home/find_password.html")
|
return c.RenderTemplate("home/find_password.html")
|
||||||
}
|
}
|
||||||
func (c Auth) DoFindPassword(email string) revel.Result {
|
func (c Auth) DoFindPassword(email string) revel.Result {
|
||||||
pwdService.FindPwd(email)
|
pwdService.FindPwd(email)
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = true
|
re.Ok = true
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 点击链接后, 先验证之
|
// 点击链接后, 先验证之
|
||||||
func (c Auth) FindPassword2(token string) revel.Result {
|
func (c Auth) FindPassword2(token string) revel.Result {
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
c.RenderArgs["title"] = c.Message("findPassword")
|
c.ViewArgs["title"] = c.Message("findPassword")
|
||||||
c.RenderArgs["subTitle"] = c.Message("findPassword")
|
c.ViewArgs["subTitle"] = c.Message("findPassword")
|
||||||
if token == "" {
|
if token == "" {
|
||||||
return c.RenderTemplate("find_password2_timeout.html")
|
return c.RenderTemplate("find_password2_timeout.html")
|
||||||
}
|
}
|
||||||
@@ -168,10 +168,10 @@ func (c Auth) FindPassword2(token string) revel.Result {
|
|||||||
if !ok {
|
if !ok {
|
||||||
return c.RenderTemplate("home/find_password2_timeout.html")
|
return c.RenderTemplate("home/find_password2_timeout.html")
|
||||||
}
|
}
|
||||||
c.RenderArgs["findPwd"] = findPwd
|
c.ViewArgs["findPwd"] = findPwd
|
||||||
|
|
||||||
c.RenderArgs["title"] = c.Message("updatePassword")
|
c.ViewArgs["title"] = c.Message("updatePassword")
|
||||||
c.RenderArgs["subTitle"] = c.Message("updatePassword")
|
c.ViewArgs["subTitle"] = c.Message("updatePassword")
|
||||||
|
|
||||||
return c.RenderTemplate("home/find_password2.html")
|
return c.RenderTemplate("home/find_password2.html")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package controllers
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
|
"github.com/leanote/leanote/app/lea/i18n"
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
@@ -19,6 +20,11 @@ type BaseController struct {
|
|||||||
*revel.Controller
|
*revel.Controller
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 覆盖revel.Message
|
||||||
|
func (c *BaseController) Message(message string, args ...interface{}) (value string) {
|
||||||
|
return i18n.Message(c.Request.Locale, message, args...)
|
||||||
|
}
|
||||||
|
|
||||||
func (c BaseController) GetUserId() string {
|
func (c BaseController) GetUserId() string {
|
||||||
if userId, ok := c.Session["UserId"]; ok {
|
if userId, ok := c.Session["UserId"]; ok {
|
||||||
return userId
|
return userId
|
||||||
@@ -174,27 +180,31 @@ func (c BaseController) GetTotalPage(page, count int) int {
|
|||||||
|
|
||||||
//-------------
|
//-------------
|
||||||
func (c BaseController) E404() revel.Result {
|
func (c BaseController) E404() revel.Result {
|
||||||
c.RenderArgs["title"] = "404"
|
c.ViewArgs["title"] = "404"
|
||||||
return c.NotFound("", nil)
|
return c.NotFound("", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置本地
|
// 设置本地
|
||||||
func (c BaseController) SetLocale() string {
|
func (c BaseController) SetLocale() string {
|
||||||
locale := string(c.Request.Locale) // zh-CN
|
locale := string(c.Request.Locale) // zh-CN
|
||||||
|
// lang := locale
|
||||||
|
// if strings.Contains(locale, "-") {
|
||||||
|
// pos := strings.Index(locale, "-")
|
||||||
|
// lang = locale[0:pos]
|
||||||
|
// }
|
||||||
|
// if lang != "zh" && lang != "en" {
|
||||||
|
// lang = "en"
|
||||||
|
// }
|
||||||
lang := locale
|
lang := locale
|
||||||
if strings.Contains(locale, "-") {
|
if !i18n.HasLang(locale) {
|
||||||
pos := strings.Index(locale, "-")
|
lang = i18n.GetDefaultLang()
|
||||||
lang = locale[0:pos]
|
|
||||||
}
|
}
|
||||||
if lang != "zh" && lang != "en" {
|
c.ViewArgs["locale"] = lang
|
||||||
lang = "en"
|
c.ViewArgs["siteUrl"] = configService.GetSiteUrl()
|
||||||
}
|
|
||||||
c.RenderArgs["locale"] = lang
|
|
||||||
c.RenderArgs["siteUrl"] = configService.GetSiteUrl()
|
|
||||||
|
|
||||||
c.RenderArgs["blogUrl"] = configService.GetBlogUrl()
|
c.ViewArgs["blogUrl"] = configService.GetBlogUrl()
|
||||||
c.RenderArgs["leaUrl"] = configService.GetLeaUrl()
|
c.ViewArgs["leaUrl"] = configService.GetLeaUrl()
|
||||||
c.RenderArgs["noteUrl"] = configService.GetNoteUrl()
|
c.ViewArgs["noteUrl"] = configService.GetNoteUrl()
|
||||||
|
|
||||||
return lang
|
return lang
|
||||||
}
|
}
|
||||||
@@ -202,9 +212,9 @@ func (c BaseController) SetLocale() string {
|
|||||||
// 设置userInfo
|
// 设置userInfo
|
||||||
func (c BaseController) SetUserInfo() info.User {
|
func (c BaseController) SetUserInfo() info.User {
|
||||||
userInfo := c.GetUserInfo()
|
userInfo := c.GetUserInfo()
|
||||||
c.RenderArgs["userInfo"] = userInfo
|
c.ViewArgs["userInfo"] = userInfo
|
||||||
if userInfo.Username == configService.GetAdminUsername() {
|
if userInfo.Username == configService.GetAdminUsername() {
|
||||||
c.RenderArgs["isAdmin"] = true
|
c.ViewArgs["isAdmin"] = true
|
||||||
}
|
}
|
||||||
return userInfo
|
return userInfo
|
||||||
}
|
}
|
||||||
@@ -220,11 +230,11 @@ func (c BaseController) RenderTemplateStr(templatePath string) string {
|
|||||||
|
|
||||||
tpl := &revel.RenderTemplateResult{
|
tpl := &revel.RenderTemplateResult{
|
||||||
Template: template,
|
Template: template,
|
||||||
RenderArgs: c.RenderArgs, // 把args给它
|
ViewArgs: c.ViewArgs, // 把args给它
|
||||||
}
|
}
|
||||||
|
|
||||||
var buffer bytes.Buffer
|
var buffer bytes.Buffer
|
||||||
tpl.Template.Render(&buffer, c.RenderArgs)
|
tpl.Template.Render(&buffer, c.ViewArgs)
|
||||||
return buffer.String()
|
return buffer.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,5 +263,5 @@ func (c BaseController) RenderRe(re info.Re) revel.Result {
|
|||||||
if strings.HasPrefix(re.Msg, "???") {
|
if strings.HasPrefix(re.Msg, "???") {
|
||||||
re.Msg = oldMsg
|
re.Msg = oldMsg
|
||||||
}
|
}
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
+101
-101
@@ -49,8 +49,8 @@ $.bootstrapJsUrl
|
|||||||
|
|
||||||
func (c Blog) render(templateName string, themePath string) revel.Result {
|
func (c Blog) render(templateName string, themePath string) revel.Result {
|
||||||
isPreview := false
|
isPreview := false
|
||||||
if c.RenderArgs["isPreview"] != nil {
|
if c.ViewArgs["isPreview"] != nil {
|
||||||
themePath2 := c.RenderArgs["themePath"]
|
themePath2 := c.ViewArgs["themePath"]
|
||||||
if themePath2 == nil {
|
if themePath2 == nil {
|
||||||
return c.E404()
|
return c.E404()
|
||||||
}
|
}
|
||||||
@@ -59,9 +59,9 @@ func (c Blog) render(templateName string, themePath string) revel.Result {
|
|||||||
c.setPreviewUrl()
|
c.setPreviewUrl()
|
||||||
|
|
||||||
// 因为common的themeInfo是从UserBlog.ThemeId来取的, 所以这里要fugai下
|
// 因为common的themeInfo是从UserBlog.ThemeId来取的, 所以这里要fugai下
|
||||||
c.RenderArgs["themeInfo"] = c.RenderArgs["themeInfoPreview"]
|
c.ViewArgs["themeInfo"] = c.ViewArgs["themeInfoPreview"]
|
||||||
}
|
}
|
||||||
return blog.RenderTemplate(templateName, c.RenderArgs, revel.BasePath+"/"+themePath, isPreview)
|
return blog.RenderTemplate(templateName, c.ViewArgs, revel.BasePath+"/"+themePath, isPreview)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 404
|
// 404
|
||||||
@@ -113,8 +113,8 @@ func (c Blog) setPreviewUrl() {
|
|||||||
themeId := c.Session["themeId"]
|
themeId := c.Session["themeId"]
|
||||||
theme := themeService.GetTheme(userId, themeId)
|
theme := themeService.GetTheme(userId, themeId)
|
||||||
|
|
||||||
siteUrl := configService.GetSiteUrl()
|
// siteUrl := configService.GetSiteUrl()
|
||||||
blogUrl := siteUrl + "/preview" // blog.leanote.com
|
blogUrl := "/preview" // blog.leanote.com
|
||||||
|
|
||||||
indexUrl = blogUrl + "/" + userIdOrEmail
|
indexUrl = blogUrl + "/" + userIdOrEmail
|
||||||
cateUrl = blogUrl + "/cate/" + userIdOrEmail // /notebookId
|
cateUrl = blogUrl + "/cate/" + userIdOrEmail // /notebookId
|
||||||
@@ -125,26 +125,26 @@ func (c Blog) setPreviewUrl() {
|
|||||||
archiveUrl = blogUrl + "/archives/" + userIdOrEmail // blog.leanote.com/archive/userId
|
archiveUrl = blogUrl + "/archives/" + userIdOrEmail // blog.leanote.com/archive/userId
|
||||||
tagsUrl = blogUrl + "/tags/" + userIdOrEmail // blog.leanote.com/archive/userId
|
tagsUrl = blogUrl + "/tags/" + userIdOrEmail // blog.leanote.com/archive/userId
|
||||||
|
|
||||||
c.RenderArgs["indexUrl"] = indexUrl
|
c.ViewArgs["indexUrl"] = indexUrl
|
||||||
c.RenderArgs["cateUrl"] = cateUrl
|
c.ViewArgs["cateUrl"] = cateUrl
|
||||||
c.RenderArgs["postUrl"] = postUrl
|
c.ViewArgs["postUrl"] = postUrl
|
||||||
c.RenderArgs["searchUrl"] = searchUrl
|
c.ViewArgs["searchUrl"] = searchUrl
|
||||||
c.RenderArgs["singleUrl"] = singleUrl // 单页
|
c.ViewArgs["singleUrl"] = singleUrl // 单页
|
||||||
c.RenderArgs["archiveUrl"] = archiveUrl
|
c.ViewArgs["archiveUrl"] = archiveUrl
|
||||||
c.RenderArgs["archivesUrl"] = archiveUrl // 别名
|
c.ViewArgs["archivesUrl"] = archiveUrl // 别名
|
||||||
c.RenderArgs["tagsUrl"] = tagsUrl
|
c.ViewArgs["tagsUrl"] = tagsUrl
|
||||||
c.RenderArgs["tagPostsUrl"] = blogUrl + "/tag/" + userIdOrEmail
|
c.ViewArgs["tagPostsUrl"] = blogUrl + "/tag/" + userIdOrEmail
|
||||||
c.RenderArgs["tagUrl"] = c.RenderArgs["tagPostsUrl"]
|
c.ViewArgs["tagUrl"] = c.ViewArgs["tagPostsUrl"]
|
||||||
|
|
||||||
// themeBaseUrl 本theme的路径url, 可以加载js, css, images之类的
|
// themeBaseUrl 本theme的路径url, 可以加载js, css, images之类的
|
||||||
c.RenderArgs["themeBaseUrl"] = "/" + theme.Path
|
c.ViewArgs["themeBaseUrl"] = "/" + theme.Path
|
||||||
}
|
}
|
||||||
|
|
||||||
// 各种地址设置
|
// 各种地址设置
|
||||||
func (c Blog) setUrl(userBlog info.UserBlog, userInfo info.User) {
|
func (c Blog) setUrl(userBlog info.UserBlog, userInfo info.User) {
|
||||||
// 主页 http://leanote.com/blog/life or http://blog.leanote.com/life or http:// xxxx.leanote.com or aa.com
|
// 主页 http://leanote.com/blog/life or http://blog.leanote.com/life or http:// xxxx.leanote.com or aa.com
|
||||||
host := c.Request.Request.Host
|
// host := c.Request.Request.Host
|
||||||
var staticUrl = configService.GetUserUrl(strings.Split(host, ":")[0])
|
// var staticUrl = configService.GetUserUrl(strings.Split(host, ":")[0])
|
||||||
// staticUrl == host, 为保证同源!!! 只有host, http://leanote.com, http://blog/leanote.com
|
// staticUrl == host, 为保证同源!!! 只有host, http://leanote.com, http://blog/leanote.com
|
||||||
// life.leanote.com, lealife.com
|
// life.leanote.com, lealife.com
|
||||||
siteUrl := configService.GetSiteUrl()
|
siteUrl := configService.GetSiteUrl()
|
||||||
@@ -152,36 +152,36 @@ func (c Blog) setUrl(userBlog info.UserBlog, userInfo info.User) {
|
|||||||
// 分类
|
// 分类
|
||||||
// 搜索
|
// 搜索
|
||||||
// 查看
|
// 查看
|
||||||
c.RenderArgs["siteUrl"] = siteUrl
|
c.ViewArgs["siteUrl"] = siteUrl
|
||||||
c.RenderArgs["indexUrl"] = blogUrls.IndexUrl
|
c.ViewArgs["indexUrl"] = blogUrls.IndexUrl
|
||||||
c.RenderArgs["cateUrl"] = blogUrls.CateUrl
|
c.ViewArgs["cateUrl"] = blogUrls.CateUrl
|
||||||
c.RenderArgs["postUrl"] = blogUrls.PostUrl
|
c.ViewArgs["postUrl"] = blogUrls.PostUrl
|
||||||
c.RenderArgs["searchUrl"] = blogUrls.SearchUrl
|
c.ViewArgs["searchUrl"] = blogUrls.SearchUrl
|
||||||
c.RenderArgs["singleUrl"] = blogUrls.SingleUrl // 单页
|
c.ViewArgs["singleUrl"] = blogUrls.SingleUrl // 单页
|
||||||
c.RenderArgs["archiveUrl"] = blogUrls.ArchiveUrl
|
c.ViewArgs["archiveUrl"] = blogUrls.ArchiveUrl
|
||||||
c.RenderArgs["archivesUrl"] = blogUrls.ArchiveUrl // 别名
|
c.ViewArgs["archivesUrl"] = blogUrls.ArchiveUrl // 别名
|
||||||
c.RenderArgs["tagsUrl"] = blogUrls.TagsUrl
|
c.ViewArgs["tagsUrl"] = blogUrls.TagsUrl
|
||||||
c.RenderArgs["tagPostsUrl"] = blogUrls.TagPostsUrl
|
c.ViewArgs["tagPostsUrl"] = blogUrls.TagPostsUrl
|
||||||
c.RenderArgs["tagUrl"] = blogUrls.TagPostsUrl // 别名
|
c.ViewArgs["tagUrl"] = blogUrls.TagPostsUrl // 别名
|
||||||
|
|
||||||
// themeBaseUrl 本theme的路径url, 可以加载js, css, images之类的
|
// themeBaseUrl 本theme的路径url, 可以加载js, css, images之类的
|
||||||
c.RenderArgs["themeBaseUrl"] = "/" + userBlog.ThemePath
|
c.ViewArgs["themeBaseUrl"] = "/" + userBlog.ThemePath
|
||||||
|
|
||||||
// 其它static js
|
// 其它static js
|
||||||
c.RenderArgs["jQueryUrl"] = siteUrl + "/js/jquery-1.9.0.min.js"
|
c.ViewArgs["jQueryUrl"] = "/js/jquery-1.9.0.min.js"
|
||||||
|
|
||||||
c.RenderArgs["prettifyJsUrl"] = siteUrl + "/js/google-code-prettify/prettify.js"
|
c.ViewArgs["prettifyJsUrl"] = "/js/google-code-prettify/prettify.js"
|
||||||
c.RenderArgs["prettifyCssUrl"] = siteUrl + "/js/google-code-prettify/prettify.css"
|
c.ViewArgs["prettifyCssUrl"] = "/js/google-code-prettify/prettify.css"
|
||||||
|
|
||||||
c.RenderArgs["blogCommonJsUrl"] = siteUrl + "/public/blog/js/common.js"
|
c.ViewArgs["blogCommonJsUrl"] = "/public/blog/js/common.js"
|
||||||
|
|
||||||
c.RenderArgs["shareCommentCssUrl"] = siteUrl + "/public/blog/css/share_comment.css"
|
c.ViewArgs["shareCommentCssUrl"] = "/public/blog/css/share_comment.css"
|
||||||
c.RenderArgs["shareCommentJsUrl"] = siteUrl + "/public/blog/js/share_comment.js"
|
c.ViewArgs["shareCommentJsUrl"] = "/public/blog/js/share_comment.js"
|
||||||
|
|
||||||
c.RenderArgs["fontAwesomeUrl"] = staticUrl + "/css/font-awesome-4.2.0/css/font-awesome.css"
|
c.ViewArgs["fontAwesomeUrl"] = "/css/font-awesome-4.2.0/css/font-awesome.css"
|
||||||
|
|
||||||
c.RenderArgs["bootstrapCssUrl"] = siteUrl + "/css/bootstrap.css"
|
c.ViewArgs["bootstrapCssUrl"] = "/css/bootstrap.css"
|
||||||
c.RenderArgs["bootstrapJsUrl"] = siteUrl + "/js/bootstrap-min.js"
|
c.ViewArgs["bootstrapJsUrl"] = "/js/bootstrap-min.js"
|
||||||
}
|
}
|
||||||
|
|
||||||
// 笔记本分类
|
// 笔记本分类
|
||||||
@@ -265,8 +265,8 @@ func (c Blog) getCates(userBlog info.UserBlog) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c.RenderArgs["cates"] = cates
|
c.ViewArgs["cates"] = cates
|
||||||
c.RenderArgs["catesTree"] = catesTree
|
c.ViewArgs["catesTree"] = catesTree
|
||||||
}
|
}
|
||||||
|
|
||||||
// 单页
|
// 单页
|
||||||
@@ -281,7 +281,7 @@ func (c Blog) getSingles(userId string) {
|
|||||||
singles2[i] = map[string]string{"title": page["Title"], "singleId": page["SingleId"]}
|
singles2[i] = map[string]string{"title": page["Title"], "singleId": page["SingleId"]}
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
c.RenderArgs["singles"] = singles
|
c.ViewArgs["singles"] = singles
|
||||||
}
|
}
|
||||||
|
|
||||||
// $.blog = {userId, title, subTitle, desc, openComment, }
|
// $.blog = {userId, title, subTitle, desc, openComment, }
|
||||||
@@ -300,11 +300,11 @@ func (c Blog) setBlog(userBlog info.UserBlog, userInfo info.User) {
|
|||||||
"SubDomain": userBlog.SubDomain,
|
"SubDomain": userBlog.SubDomain,
|
||||||
"Domain": userBlog.Domain,
|
"Domain": userBlog.Domain,
|
||||||
}
|
}
|
||||||
c.RenderArgs["blogInfo"] = blogInfo
|
c.ViewArgs["blogInfo"] = blogInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Blog) setPaging(pageInfo info.Page) {
|
func (c Blog) setPaging(pageInfo info.Page) {
|
||||||
c.RenderArgs["paging"] = pageInfo
|
c.ViewArgs["paging"] = pageInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
// 公共
|
// 公共
|
||||||
@@ -315,13 +315,13 @@ func (c Blog) blogCommon(userId string, userBlog info.UserBlog, userInfo info.Us
|
|||||||
return false, userBlog
|
return false, userBlog
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// c.RenderArgs["userInfo"] = userInfo
|
// c.ViewArgs["userInfo"] = userInfo
|
||||||
|
|
||||||
// 最新笔记
|
// 最新笔记
|
||||||
_, recentBlogs := blogService.ListBlogs(userId, "", 1, 5, userBlog.SortField, userBlog.IsAsc)
|
_, recentBlogs := blogService.ListBlogs(userId, "", 1, 5, userBlog.SortField, userBlog.IsAsc)
|
||||||
c.RenderArgs["recentPosts"] = blogService.FixBlogs(recentBlogs)
|
c.ViewArgs["recentPosts"] = blogService.FixBlogs(recentBlogs)
|
||||||
c.RenderArgs["latestPosts"] = c.RenderArgs["recentPosts"]
|
c.ViewArgs["latestPosts"] = c.ViewArgs["recentPosts"]
|
||||||
c.RenderArgs["tags"] = blogService.GetBlogTags(userId)
|
c.ViewArgs["tags"] = blogService.GetBlogTags(userId)
|
||||||
|
|
||||||
// 语言, url地址
|
// 语言, url地址
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
@@ -331,7 +331,7 @@ func (c Blog) blogCommon(userId string, userBlog info.UserBlog, userInfo info.Us
|
|||||||
userBlog = blogService.GetUserBlog(userId)
|
userBlog = blogService.GetUserBlog(userId)
|
||||||
}
|
}
|
||||||
c.setBlog(userBlog, userInfo)
|
c.setBlog(userBlog, userInfo)
|
||||||
// c.RenderArgs["userBlog"] = userBlog
|
// c.ViewArgs["userBlog"] = userBlog
|
||||||
|
|
||||||
// 分类导航
|
// 分类导航
|
||||||
c.getCates(userBlog)
|
c.getCates(userBlog)
|
||||||
@@ -342,12 +342,12 @@ func (c Blog) blogCommon(userId string, userBlog info.UserBlog, userInfo info.Us
|
|||||||
c.setUrl(userBlog, userInfo)
|
c.setUrl(userBlog, userInfo)
|
||||||
|
|
||||||
// 当前分类Id, 全设为""
|
// 当前分类Id, 全设为""
|
||||||
c.RenderArgs["curCateId"] = ""
|
c.ViewArgs["curCateId"] = ""
|
||||||
c.RenderArgs["curSingleId"] = ""
|
c.ViewArgs["curSingleId"] = ""
|
||||||
|
|
||||||
// 得到主题信息
|
// 得到主题信息
|
||||||
themeInfo := themeService.GetThemeInfo(userBlog.ThemeId.Hex(), userBlog.Style)
|
themeInfo := themeService.GetThemeInfo(userBlog.ThemeId.Hex(), userBlog.Style)
|
||||||
c.RenderArgs["themeInfo"] = themeInfo
|
c.ViewArgs["themeInfo"] = themeInfo
|
||||||
|
|
||||||
// Log(">>")
|
// Log(">>")
|
||||||
// Log(userBlog.Style)
|
// Log(userBlog.Style)
|
||||||
@@ -404,9 +404,9 @@ func (c Blog) Tags(userIdOrEmail string) (re revel.Result) {
|
|||||||
return c.e404(userBlog.ThemePath) // 404 TODO 使用用户的404
|
return c.e404(userBlog.ThemePath) // 404 TODO 使用用户的404
|
||||||
}
|
}
|
||||||
|
|
||||||
c.RenderArgs["curIsTags"] = true
|
c.ViewArgs["curIsTags"] = true
|
||||||
tags := blogService.GetBlogTags(userId)
|
tags := blogService.GetBlogTags(userId)
|
||||||
c.RenderArgs["tags"] = tags
|
c.ViewArgs["tags"] = tags
|
||||||
return c.render("tags.html", userBlog.ThemePath)
|
return c.render("tags.html", userBlog.ThemePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -443,15 +443,15 @@ func (c Blog) Tag(userIdOrEmail, tag string) (re revel.Result) {
|
|||||||
tag = userIdOrEmail
|
tag = userIdOrEmail
|
||||||
}
|
}
|
||||||
|
|
||||||
c.RenderArgs["curIsTagPosts"] = true
|
c.ViewArgs["curIsTagPosts"] = true
|
||||||
c.RenderArgs["curTag"] = tag
|
c.ViewArgs["curTag"] = tag
|
||||||
page := c.GetPage()
|
page := c.GetPage()
|
||||||
pageInfo, blogs := blogService.SearchBlogByTags([]string{tag}, userId, page, userBlog.PerPageSize, userBlog.SortField, userBlog.IsAsc)
|
pageInfo, blogs := blogService.SearchBlogByTags([]string{tag}, userId, page, userBlog.PerPageSize, userBlog.SortField, userBlog.IsAsc)
|
||||||
c.setPaging(pageInfo)
|
c.setPaging(pageInfo)
|
||||||
|
|
||||||
c.RenderArgs["posts"] = blogService.FixBlogs(blogs)
|
c.ViewArgs["posts"] = blogService.FixBlogs(blogs)
|
||||||
tagPostsUrl := c.RenderArgs["tagPostsUrl"].(string)
|
tagPostsUrl := c.ViewArgs["tagPostsUrl"].(string)
|
||||||
c.RenderArgs["pagingBaseUrl"] = tagPostsUrl + "/" + tag
|
c.ViewArgs["pagingBaseUrl"] = tagPostsUrl + "/" + tag
|
||||||
|
|
||||||
return c.render("tag_posts.html", userBlog.ThemePath)
|
return c.render("tag_posts.html", userBlog.ThemePath)
|
||||||
}
|
}
|
||||||
@@ -490,16 +490,16 @@ func (c Blog) Archives(userIdOrEmail string, cateId string, year, month int) (re
|
|||||||
}
|
}
|
||||||
|
|
||||||
arcs := blogService.ListBlogsArchive(userId, notebookId, year, month, "PublicTime", false)
|
arcs := blogService.ListBlogsArchive(userId, notebookId, year, month, "PublicTime", false)
|
||||||
c.RenderArgs["archives"] = arcs
|
c.ViewArgs["archives"] = arcs
|
||||||
|
|
||||||
c.RenderArgs["curIsArchive"] = true
|
c.ViewArgs["curIsArchive"] = true
|
||||||
if notebookId != "" {
|
if notebookId != "" {
|
||||||
notebook := notebookService.GetNotebookById(notebookId)
|
notebook := notebookService.GetNotebookById(notebookId)
|
||||||
c.RenderArgs["curCateTitle"] = notebook.Title
|
c.ViewArgs["curCateTitle"] = notebook.Title
|
||||||
c.RenderArgs["curCateId"] = notebookId
|
c.ViewArgs["curCateId"] = notebookId
|
||||||
}
|
}
|
||||||
c.RenderArgs["curYear"] = year
|
c.ViewArgs["curYear"] = year
|
||||||
c.RenderArgs["curMonth"] = month
|
c.ViewArgs["curMonth"] = month
|
||||||
|
|
||||||
return c.render("archive.html", userBlog.ThemePath)
|
return c.render("archive.html", userBlog.ThemePath)
|
||||||
}
|
}
|
||||||
@@ -541,15 +541,15 @@ func (c Blog) Cate(userIdOrEmail string, notebookId string) (re revel.Result) {
|
|||||||
page := c.GetPage()
|
page := c.GetPage()
|
||||||
pageInfo, blogs := blogService.ListBlogs(userId, notebookId2, page, userBlog.PerPageSize, userBlog.SortField, userBlog.IsAsc)
|
pageInfo, blogs := blogService.ListBlogs(userId, notebookId2, page, userBlog.PerPageSize, userBlog.SortField, userBlog.IsAsc)
|
||||||
blogs2 := blogService.FixBlogs(blogs)
|
blogs2 := blogService.FixBlogs(blogs)
|
||||||
c.RenderArgs["posts"] = blogs2
|
c.ViewArgs["posts"] = blogs2
|
||||||
|
|
||||||
c.setPaging(pageInfo)
|
c.setPaging(pageInfo)
|
||||||
|
|
||||||
c.RenderArgs["curCateTitle"] = notebook.Title
|
c.ViewArgs["curCateTitle"] = notebook.Title
|
||||||
c.RenderArgs["curCateId"] = notebookId2
|
c.ViewArgs["curCateId"] = notebookId2
|
||||||
cateUrl := c.RenderArgs["cateUrl"].(string)
|
cateUrl := c.ViewArgs["cateUrl"].(string)
|
||||||
c.RenderArgs["pagingBaseUrl"] = cateUrl + "/" + notebookId
|
c.ViewArgs["pagingBaseUrl"] = cateUrl + "/" + notebookId
|
||||||
c.RenderArgs["curIsCate"] = true
|
c.ViewArgs["curIsCate"] = true
|
||||||
|
|
||||||
return c.render("cate.html", userBlog.ThemePath)
|
return c.render("cate.html", userBlog.ThemePath)
|
||||||
}
|
}
|
||||||
@@ -594,12 +594,12 @@ func (c Blog) Index(userIdOrEmail string) (re revel.Result) {
|
|||||||
page := c.GetPage()
|
page := c.GetPage()
|
||||||
pageInfo, blogs := blogService.ListBlogs(userId, "", page, userBlog.PerPageSize, userBlog.SortField, userBlog.IsAsc)
|
pageInfo, blogs := blogService.ListBlogs(userId, "", page, userBlog.PerPageSize, userBlog.SortField, userBlog.IsAsc)
|
||||||
blogs2 := blogService.FixBlogs(blogs)
|
blogs2 := blogService.FixBlogs(blogs)
|
||||||
c.RenderArgs["posts"] = blogs2
|
c.ViewArgs["posts"] = blogs2
|
||||||
|
|
||||||
c.setPaging(pageInfo)
|
c.setPaging(pageInfo)
|
||||||
c.RenderArgs["pagingBaseUrl"] = c.RenderArgs["indexUrl"]
|
c.ViewArgs["pagingBaseUrl"] = c.ViewArgs["indexUrl"]
|
||||||
|
|
||||||
c.RenderArgs["curIsIndex"] = true
|
c.ViewArgs["curIsIndex"] = true
|
||||||
|
|
||||||
return c.render("index.html", userBlog.ThemePath)
|
return c.render("index.html", userBlog.ThemePath)
|
||||||
}
|
}
|
||||||
@@ -631,9 +631,9 @@ func (c Blog) Post(userIdOrEmail, noteId string) (re revel.Result) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
post := blogService.FixBlog(blogInfo)
|
post := blogService.FixBlog(blogInfo)
|
||||||
c.RenderArgs["post"] = post
|
c.ViewArgs["post"] = post
|
||||||
// c.RenderArgs["userInfo"] = userInfo
|
// c.ViewArgs["userInfo"] = userInfo
|
||||||
c.RenderArgs["curIsPost"] = true
|
c.ViewArgs["curIsPost"] = true
|
||||||
|
|
||||||
// 上一篇, 下一篇
|
// 上一篇, 下一篇
|
||||||
var baseTime interface{}
|
var baseTime interface{}
|
||||||
@@ -649,10 +649,10 @@ func (c Blog) Post(userIdOrEmail, noteId string) (re revel.Result) {
|
|||||||
|
|
||||||
prePost, nextPost := blogService.PreNextBlog(userId, userBlog.SortField, userBlog.IsAsc, post.NoteId, baseTime)
|
prePost, nextPost := blogService.PreNextBlog(userId, userBlog.SortField, userBlog.IsAsc, post.NoteId, baseTime)
|
||||||
if prePost.NoteId != "" {
|
if prePost.NoteId != "" {
|
||||||
c.RenderArgs["prePost"] = prePost
|
c.ViewArgs["prePost"] = prePost
|
||||||
}
|
}
|
||||||
if nextPost.NoteId != "" {
|
if nextPost.NoteId != "" {
|
||||||
c.RenderArgs["nextPost"] = nextPost
|
c.ViewArgs["nextPost"] = nextPost
|
||||||
}
|
}
|
||||||
return c.render("post.html", userBlog.ThemePath)
|
return c.render("post.html", userBlog.ThemePath)
|
||||||
}
|
}
|
||||||
@@ -682,7 +682,7 @@ func (c Blog) Single(userIdOrEmail, singleId string) (re revel.Result) {
|
|||||||
panic("")
|
panic("")
|
||||||
}
|
}
|
||||||
|
|
||||||
c.RenderArgs["single"] = map[string]interface{}{
|
c.ViewArgs["single"] = map[string]interface{}{
|
||||||
"SingleId": single.SingleId.Hex(),
|
"SingleId": single.SingleId.Hex(),
|
||||||
"Title": single.Title,
|
"Title": single.Title,
|
||||||
"UrlTitle": single.UrlTitle,
|
"UrlTitle": single.UrlTitle,
|
||||||
@@ -690,8 +690,8 @@ func (c Blog) Single(userIdOrEmail, singleId string) (re revel.Result) {
|
|||||||
"CreatedTime": single.CreatedTime,
|
"CreatedTime": single.CreatedTime,
|
||||||
"UpdatedTime": single.UpdatedTime,
|
"UpdatedTime": single.UpdatedTime,
|
||||||
}
|
}
|
||||||
c.RenderArgs["curSingleId"] = single.SingleId.Hex()
|
c.ViewArgs["curSingleId"] = single.SingleId.Hex()
|
||||||
c.RenderArgs["curIsSingle"] = true
|
c.ViewArgs["curIsSingle"] = true
|
||||||
|
|
||||||
return c.render("single.html", userBlog.ThemePath)
|
return c.render("single.html", userBlog.ThemePath)
|
||||||
}
|
}
|
||||||
@@ -716,7 +716,7 @@ func (c Blog) Search(userIdOrEmail, keywords string) (re revel.Result) {
|
|||||||
} else {
|
} else {
|
||||||
userInfo = userService.GetUserInfoByAny(userIdOrEmail)
|
userInfo = userService.GetUserInfoByAny(userIdOrEmail)
|
||||||
}
|
}
|
||||||
// c.RenderArgs["userInfo"] = userInfo
|
// c.ViewArgs["userInfo"] = userInfo
|
||||||
userId = userInfo.UserId.Hex()
|
userId = userInfo.UserId.Hex()
|
||||||
var ok = false
|
var ok = false
|
||||||
if ok, userBlog = c.blogCommon(userId, userBlog, userInfo); !ok {
|
if ok, userBlog = c.blogCommon(userId, userBlog, userInfo); !ok {
|
||||||
@@ -727,11 +727,11 @@ func (c Blog) Search(userIdOrEmail, keywords string) (re revel.Result) {
|
|||||||
pageInfo, blogs := blogService.SearchBlog(keywords, userId, page, userBlog.PerPageSize, userBlog.SortField, userBlog.IsAsc)
|
pageInfo, blogs := blogService.SearchBlog(keywords, userId, page, userBlog.PerPageSize, userBlog.SortField, userBlog.IsAsc)
|
||||||
c.setPaging(pageInfo)
|
c.setPaging(pageInfo)
|
||||||
|
|
||||||
c.RenderArgs["posts"] = blogService.FixBlogs(blogs)
|
c.ViewArgs["posts"] = blogService.FixBlogs(blogs)
|
||||||
c.RenderArgs["keywords"] = keywords
|
c.ViewArgs["keywords"] = keywords
|
||||||
searchUrl, _ := c.RenderArgs["searchUrl"].(string)
|
searchUrl, _ := c.ViewArgs["searchUrl"].(string)
|
||||||
c.RenderArgs["pagingBaseUrl"] = searchUrl + "?keywords=" + keywords
|
c.ViewArgs["pagingBaseUrl"] = searchUrl + "?keywords=" + keywords
|
||||||
c.RenderArgs["curIsSearch"] = true
|
c.ViewArgs["curIsSearch"] = true
|
||||||
|
|
||||||
return c.render("search.html", userBlog.ThemePath)
|
return c.render("search.html", userBlog.ThemePath)
|
||||||
}
|
}
|
||||||
@@ -741,7 +741,7 @@ func (c Blog) setRenderUserInfo(userInfo info.User) {
|
|||||||
if userInfo.Username == "" {
|
if userInfo.Username == "" {
|
||||||
userInfo.Username = userInfo.Email
|
userInfo.Username = userInfo.Email
|
||||||
}
|
}
|
||||||
c.RenderArgs["userInfo"] = userInfo
|
c.ViewArgs["userInfo"] = userInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------
|
//----------------
|
||||||
@@ -753,7 +753,7 @@ func (c Blog) GetPostStat(noteId string) revel.Result {
|
|||||||
re.Ok = true
|
re.Ok = true
|
||||||
statInfo := blogService.GetBlogStat(noteId)
|
statInfo := blogService.GetBlogStat(noteId)
|
||||||
re.Item = statInfo
|
re.Item = statInfo
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// jsonP
|
// jsonP
|
||||||
@@ -778,7 +778,7 @@ func (c Blog) GetLikes(noteId string, callback string) revel.Result {
|
|||||||
result["hasMoreLikedUser"] = hasMoreLikedUser
|
result["hasMoreLikedUser"] = hasMoreLikedUser
|
||||||
|
|
||||||
re.Item = result
|
re.Item = result
|
||||||
return c.RenderJsonP(callback, re)
|
return c.RenderJSONP(callback, re)
|
||||||
}
|
}
|
||||||
func (c Blog) GetLikesAndComments(noteId, callback string) revel.Result {
|
func (c Blog) GetLikesAndComments(noteId, callback string) revel.Result {
|
||||||
userId := c.GetUserId()
|
userId := c.GetUserId()
|
||||||
@@ -806,13 +806,13 @@ func (c Blog) GetLikesAndComments(noteId, callback string) revel.Result {
|
|||||||
result["comments"] = comments
|
result["comments"] = comments
|
||||||
result["commentUserInfo"] = commentUserInfo
|
result["commentUserInfo"] = commentUserInfo
|
||||||
re.Item = result
|
re.Item = result
|
||||||
return c.RenderJsonP(callback, re)
|
return c.RenderJSONP(callback, re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Blog) IncReadNum(noteId string) revel.Result {
|
func (c Blog) IncReadNum(noteId string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = blogService.IncReadNum(noteId)
|
re.Ok = blogService.IncReadNum(noteId)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 点赞, 要用jsonp
|
// 点赞, 要用jsonp
|
||||||
@@ -820,7 +820,7 @@ func (c Blog) LikePost(noteId string, callback string) revel.Result {
|
|||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
userId := c.GetUserId()
|
userId := c.GetUserId()
|
||||||
re.Ok, re.Item = blogService.LikeBlog(noteId, userId)
|
re.Ok, re.Item = blogService.LikeBlog(noteId, userId)
|
||||||
return c.RenderJsonP(callback, re)
|
return c.RenderJSONP(callback, re)
|
||||||
}
|
}
|
||||||
func (c Blog) GetComments(noteId string, callback string) revel.Result {
|
func (c Blog) GetComments(noteId string, callback string) revel.Result {
|
||||||
// 评论
|
// 评论
|
||||||
@@ -836,24 +836,24 @@ func (c Blog) GetComments(noteId string, callback string) revel.Result {
|
|||||||
re.Item = result
|
re.Item = result
|
||||||
|
|
||||||
if callback != "" {
|
if callback != "" {
|
||||||
return c.RenderJsonP(callback, result)
|
return c.RenderJSONP(callback, result)
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// jsonp
|
// jsonp
|
||||||
func (c Blog) DeleteComment(noteId, commentId string, callback string) revel.Result {
|
func (c Blog) DeleteComment(noteId, commentId string, callback string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = blogService.DeleteComment(noteId, commentId, c.GetUserId())
|
re.Ok = blogService.DeleteComment(noteId, commentId, c.GetUserId())
|
||||||
return c.RenderJsonP(callback, re)
|
return c.RenderJSONP(callback, re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// jsonp
|
// jsonp
|
||||||
func (c Blog) CommentPost(noteId, content, toCommentId string, callback string) revel.Result {
|
func (c Blog) CommentPost(noteId, content, toCommentId string, callback string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok, re.Item = blogService.Comment(noteId, toCommentId, c.GetUserId(), content)
|
re.Ok, re.Item = blogService.Comment(noteId, toCommentId, c.GetUserId(), content)
|
||||||
return c.RenderJsonP(callback, re)
|
return c.RenderJSONP(callback, re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// jsonp
|
// jsonp
|
||||||
@@ -862,7 +862,7 @@ func (c Blog) LikeComment(commentId string, callback string) revel.Result {
|
|||||||
ok, isILikeIt, num := blogService.LikeComment(commentId, c.GetUserId())
|
ok, isILikeIt, num := blogService.LikeComment(commentId, c.GetUserId())
|
||||||
re.Ok = ok
|
re.Ok = ok
|
||||||
re.Item = bson.M{"IsILikeIt": isILikeIt, "Num": num}
|
re.Item = bson.M{"IsILikeIt": isILikeIt, "Num": num}
|
||||||
return c.RenderJsonP(callback, re)
|
return c.RenderJSONP(callback, re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 显示分类的最近博客, jsonp
|
// 显示分类的最近博客, jsonp
|
||||||
@@ -898,5 +898,5 @@ func (c Blog) ListCateLatest(notebookId, callback string) revel.Result {
|
|||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = true
|
re.Ok = true
|
||||||
re.List = blogs
|
re.List = blogs
|
||||||
return c.RenderJsonP(callback, re)
|
return c.RenderJSONP(callback, re)
|
||||||
}
|
}
|
||||||
@@ -24,9 +24,9 @@ type File struct {
|
|||||||
func (c File) UploadBlogLogo() revel.Result {
|
func (c File) UploadBlogLogo() revel.Result {
|
||||||
re := c.uploadImage("blogLogo", "")
|
re := c.uploadImage("blogLogo", "")
|
||||||
|
|
||||||
c.RenderArgs["fileUrlPath"] = re.Id
|
c.ViewArgs["fileUrlPath"] = re.Id
|
||||||
c.RenderArgs["resultCode"] = re.Code
|
c.ViewArgs["resultCode"] = re.Code
|
||||||
c.RenderArgs["resultMsg"] = re.Msg
|
c.ViewArgs["resultMsg"] = re.Msg
|
||||||
|
|
||||||
return c.RenderTemplate("file/blog_logo.html")
|
return c.RenderTemplate("file/blog_logo.html")
|
||||||
}
|
}
|
||||||
@@ -54,16 +54,16 @@ func (c File) PasteImage(noteId string) revel.Result {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 头像设置
|
// 头像设置
|
||||||
func (c File) UploadAvatar() revel.Result {
|
func (c File) UploadAvatar() revel.Result {
|
||||||
re := c.uploadImage("logo", "")
|
re := c.uploadImage("logo", "")
|
||||||
|
|
||||||
c.RenderArgs["fileUrlPath"] = re.Id
|
c.ViewArgs["fileUrlPath"] = re.Id
|
||||||
c.RenderArgs["resultCode"] = re.Code
|
c.ViewArgs["resultCode"] = re.Code
|
||||||
c.RenderArgs["resultMsg"] = re.Msg
|
c.ViewArgs["resultMsg"] = re.Msg
|
||||||
|
|
||||||
if re.Ok {
|
if re.Ok {
|
||||||
re.Ok = userService.UpdateAvatar(c.GetUserId(), re.Id)
|
re.Ok = userService.UpdateAvatar(c.GetUserId(), re.Id)
|
||||||
@@ -72,13 +72,13 @@ func (c File) UploadAvatar() revel.Result {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// leaui image plugin upload image
|
// leaui image plugin upload image
|
||||||
func (c File) UploadImageLeaui(albumId string) revel.Result {
|
func (c File) UploadImageLeaui(albumId string) revel.Result {
|
||||||
re := c.uploadImage("", albumId)
|
re := c.uploadImage("", albumId)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 上传图片, 公用方法
|
// 上传图片, 公用方法
|
||||||
@@ -201,19 +201,19 @@ func (c File) uploadImage(from, albumId string) (re info.Re) {
|
|||||||
// get all images by userId with page
|
// get all images by userId with page
|
||||||
func (c File) GetImages(albumId, key string, page int) revel.Result {
|
func (c File) GetImages(albumId, key string, page int) revel.Result {
|
||||||
re := fileService.ListImagesWithPage(c.GetUserId(), albumId, key, page, 12)
|
re := fileService.ListImagesWithPage(c.GetUserId(), albumId, key, page, 12)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c File) UpdateImageTitle(fileId, title string) revel.Result {
|
func (c File) UpdateImageTitle(fileId, title string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = fileService.UpdateImageTitle(c.GetUserId(), fileId, title)
|
re.Ok = fileService.UpdateImageTitle(c.GetUserId(), fileId, title)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c File) DeleteImage(fileId string) revel.Result {
|
func (c File) DeleteImage(fileId string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok, re.Msg = fileService.DeleteImage(c.GetUserId(), fileId)
|
re.Ok, re.Msg = fileService.DeleteImage(c.GetUserId(), fileId)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
@@ -235,7 +235,7 @@ func (c File) OutputImage(noteId, fileId string) revel.Result {
|
|||||||
func (c File) CopyImage(userId, fileId, toUserId string) revel.Result {
|
func (c File) CopyImage(userId, fileId, toUserId string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok, re.Id = fileService.CopyImage(userId, fileId, toUserId)
|
re.Ok, re.Id = fileService.CopyImage(userId, fileId, toUserId)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 复制外网的图片
|
// 复制外网的图片
|
||||||
@@ -251,13 +251,13 @@ func (c File) CopyHttpImage(src string) revel.Result {
|
|||||||
dir := revel.BasePath + "/" + fileUrlPath
|
dir := revel.BasePath + "/" + fileUrlPath
|
||||||
err := os.MkdirAll(dir, 0755)
|
err := os.MkdirAll(dir, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
filesize, filename, _, ok := netutil.WriteUrl(src, dir)
|
filesize, filename, _, ok := netutil.WriteUrl(src, dir)
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
re.Msg = "copy error"
|
re.Msg = "copy error"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// File
|
// File
|
||||||
@@ -273,5 +273,5 @@ func (c File) CopyHttpImage(src string) revel.Result {
|
|||||||
// re.Item = fileInfo.Path
|
// re.Item = fileInfo.Path
|
||||||
re.Ok, re.Msg = fileService.AddImage(fileInfo, "", c.GetUserId(), true)
|
re.Ok, re.Msg = fileService.AddImage(fileInfo, "", c.GetUserId(), true)
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
@@ -23,8 +23,8 @@ func (c Index) Default() revel.Result {
|
|||||||
// leanote展示页, 没有登录的, 或已登录明确要进该页的
|
// leanote展示页, 没有登录的, 或已登录明确要进该页的
|
||||||
func (c Index) Index() revel.Result {
|
func (c Index) Index() revel.Result {
|
||||||
c.SetUserInfo()
|
c.SetUserInfo()
|
||||||
c.RenderArgs["title"] = "leanote"
|
c.ViewArgs["title"] = "leanote"
|
||||||
c.RenderArgs["openRegister"] = configService.GlobalStringConfigs["openRegister"]
|
c.ViewArgs["openRegister"] = configService.GlobalStringConfigs["openRegister"]
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
|
|
||||||
return c.RenderTemplate("home/index.html")
|
return c.RenderTemplate("home/index.html")
|
||||||
@@ -40,5 +40,5 @@ func (c Index) Suggestion(addr, suggestion string) revel.Result {
|
|||||||
emailService.SendEmail("leanote@leanote.com", "建议", "UserId: "+c.GetUserId()+" <br /> Suggestions: "+suggestion)
|
emailService.SendEmail("leanote@leanote.com", "建议", "UserId: "+c.GetUserId()+" <br /> Suggestions: "+suggestion)
|
||||||
}()
|
}()
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
@@ -12,5 +12,5 @@ type NoteContentHistory struct {
|
|||||||
func (c NoteContentHistory) ListHistories(noteId string) revel.Result {
|
func (c NoteContentHistory) ListHistories(noteId string) revel.Result {
|
||||||
histories := noteContentHistoryService.ListHistories(noteId, c.GetUserId())
|
histories := noteContentHistoryService.ListHistories(noteId, c.GetUserId())
|
||||||
|
|
||||||
return c.RenderJson(histories)
|
return c.RenderJSON(histories)
|
||||||
}
|
}
|
||||||
@@ -36,7 +36,7 @@ func (c Note) Index(noteId, online string) revel.Result {
|
|||||||
return c.Redirect("/login")
|
return c.Redirect("/login")
|
||||||
}
|
}
|
||||||
|
|
||||||
c.RenderArgs["openRegister"] = configService.IsOpenRegister()
|
c.ViewArgs["openRegister"] = configService.IsOpenRegister()
|
||||||
|
|
||||||
// 已登录了, 那么得到所有信息
|
// 已登录了, 那么得到所有信息
|
||||||
notebooks := notebookService.GetNotebooks(userId)
|
notebooks := notebookService.GetNotebooks(userId)
|
||||||
@@ -58,16 +58,16 @@ func (c Note) Index(noteId, online string) revel.Result {
|
|||||||
noteContent = noteService.GetNoteContent(noteId, noteOwner)
|
noteContent = noteService.GetNoteContent(noteId, noteOwner)
|
||||||
|
|
||||||
hasRightNoteId = true
|
hasRightNoteId = true
|
||||||
c.RenderArgs["curNoteId"] = noteId
|
c.ViewArgs["curNoteId"] = noteId
|
||||||
c.RenderArgs["curNotebookId"] = note.NotebookId.Hex()
|
c.ViewArgs["curNotebookId"] = note.NotebookId.Hex()
|
||||||
|
|
||||||
// 打开的是共享的笔记, 那么判断是否是共享给我的默认笔记
|
// 打开的是共享的笔记, 那么判断是否是共享给我的默认笔记
|
||||||
if noteOwner != c.GetUserId() {
|
if noteOwner != c.GetUserId() {
|
||||||
if shareService.HasReadPerm(noteOwner, c.GetUserId(), noteId) {
|
if shareService.HasReadPerm(noteOwner, c.GetUserId(), noteId) {
|
||||||
// 不要获取notebook下的笔记
|
// 不要获取notebook下的笔记
|
||||||
// 在前端下发请求
|
// 在前端下发请求
|
||||||
c.RenderArgs["curSharedNoteNotebookId"] = note.NotebookId.Hex()
|
c.ViewArgs["curSharedNoteNotebookId"] = note.NotebookId.Hex()
|
||||||
c.RenderArgs["curSharedUserId"] = noteOwner
|
c.ViewArgs["curSharedUserId"] = noteOwner
|
||||||
// 没有读写权限
|
// 没有读写权限
|
||||||
} else {
|
} else {
|
||||||
hasRightNoteId = false
|
hasRightNoteId = false
|
||||||
@@ -97,7 +97,7 @@ func (c Note) Index(noteId, online string) revel.Result {
|
|||||||
|
|
||||||
// 得到最近的笔记
|
// 得到最近的笔记
|
||||||
_, latestNotes := noteService.ListNotes(c.GetUserId(), "", false, c.GetPage(), 50, defaultSortField, false, false)
|
_, latestNotes := noteService.ListNotes(c.GetUserId(), "", false, c.GetPage(), 50, defaultSortField, false, false)
|
||||||
c.RenderArgs["latestNotes"] = latestNotes
|
c.ViewArgs["latestNotes"] = latestNotes
|
||||||
}
|
}
|
||||||
|
|
||||||
// 没有传入笔记
|
// 没有传入笔记
|
||||||
@@ -106,27 +106,27 @@ func (c Note) Index(noteId, online string) revel.Result {
|
|||||||
_, notes = noteService.ListNotes(c.GetUserId(), "", false, c.GetPage(), 50, defaultSortField, false, false)
|
_, notes = noteService.ListNotes(c.GetUserId(), "", false, c.GetPage(), 50, defaultSortField, false, false)
|
||||||
if len(notes) > 0 {
|
if len(notes) > 0 {
|
||||||
noteContent = noteService.GetNoteContent(notes[0].NoteId.Hex(), userId)
|
noteContent = noteService.GetNoteContent(notes[0].NoteId.Hex(), userId)
|
||||||
c.RenderArgs["curNoteId"] = notes[0].NoteId.Hex()
|
c.ViewArgs["curNoteId"] = notes[0].NoteId.Hex()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 当然, 还需要得到第一个notes的content
|
// 当然, 还需要得到第一个notes的content
|
||||||
//...
|
//...
|
||||||
c.RenderArgs["isAdmin"] = configService.GetAdminUsername() == userInfo.Username
|
c.ViewArgs["isAdmin"] = configService.GetAdminUsername() == userInfo.Username
|
||||||
|
|
||||||
c.RenderArgs["userInfo"] = userInfo
|
c.ViewArgs["userInfo"] = userInfo
|
||||||
c.RenderArgs["notebooks"] = notebooks
|
c.ViewArgs["notebooks"] = notebooks
|
||||||
c.RenderArgs["shareNotebooks"] = shareNotebooks // note信息在notes列表中
|
c.ViewArgs["shareNotebooks"] = shareNotebooks // note信息在notes列表中
|
||||||
c.RenderArgs["sharedUserInfos"] = sharedUserInfos
|
c.ViewArgs["sharedUserInfos"] = sharedUserInfos
|
||||||
|
|
||||||
c.RenderArgs["notes"] = notes
|
c.ViewArgs["notes"] = notes
|
||||||
c.RenderArgs["noteContentJson"] = noteContent
|
c.ViewArgs["noteContentJson"] = noteContent
|
||||||
c.RenderArgs["noteContent"] = noteContent.Content
|
c.ViewArgs["noteContent"] = noteContent.Content
|
||||||
|
|
||||||
c.RenderArgs["tags"] = tagService.GetTags(c.GetUserId())
|
c.ViewArgs["tags"] = tagService.GetTags(c.GetUserId())
|
||||||
|
|
||||||
c.RenderArgs["globalConfigs"] = configService.GetGlobalConfigForUser()
|
c.ViewArgs["globalConfigs"] = configService.GetGlobalConfigForUser()
|
||||||
|
|
||||||
// return c.RenderTemplate("note/note.html")
|
// return c.RenderTemplate("note/note.html")
|
||||||
|
|
||||||
@@ -142,24 +142,34 @@ func (c Note) Index(noteId, online string) revel.Result {
|
|||||||
// 否则, 转向登录页面
|
// 否则, 转向登录页面
|
||||||
func (c Note) ListNotes(notebookId string) revel.Result {
|
func (c Note) ListNotes(notebookId string) revel.Result {
|
||||||
_, notes := noteService.ListNotes(c.GetUserId(), notebookId, false, c.GetPage(), pageSize, defaultSortField, false, false)
|
_, notes := noteService.ListNotes(c.GetUserId(), notebookId, false, c.GetPage(), pageSize, defaultSortField, false, false)
|
||||||
return c.RenderJson(notes)
|
return c.RenderJSON(notes)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到trash
|
// 得到trash
|
||||||
func (c Note) ListTrashNotes() revel.Result {
|
func (c Note) ListTrashNotes() revel.Result {
|
||||||
_, notes := noteService.ListNotes(c.GetUserId(), "", true, c.GetPage(), pageSize, defaultSortField, false, false)
|
_, notes := noteService.ListNotes(c.GetUserId(), "", true, c.GetPage(), pageSize, defaultSortField, false, false)
|
||||||
return c.RenderJson(notes)
|
return c.RenderJSON(notes)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到note和内容
|
// 得到note和内容
|
||||||
func (c Note) GetNoteAndContent(noteId string) revel.Result {
|
func (c Note) GetNoteAndContent(noteId string) revel.Result {
|
||||||
return c.RenderJson(noteService.GetNoteAndContent(noteId, c.GetUserId()))
|
return c.RenderJSON(noteService.GetNoteAndContent(noteId, c.GetUserId()))
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c Note) GetNoteAndContentBySrc(src string) revel.Result {
|
||||||
|
noteId, noteAndContent := noteService.GetNoteAndContentBySrc(src, c.GetUserId())
|
||||||
|
ret := info.Re{}
|
||||||
|
if noteId != "" {
|
||||||
|
ret.Ok = true
|
||||||
|
ret.Item = noteAndContent
|
||||||
|
}
|
||||||
|
return c.RenderJSON(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到内容
|
// 得到内容
|
||||||
func (c Note) GetNoteContent(noteId string) revel.Result {
|
func (c Note) GetNoteContent(noteId string) revel.Result {
|
||||||
noteContent := noteService.GetNoteContent(noteId, c.GetUserId())
|
noteContent := noteService.GetNoteContent(noteId, c.GetUserId())
|
||||||
return c.RenderJson(noteContent)
|
return c.RenderJSON(noteContent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 这里不能用json, 要用post
|
// 这里不能用json, 要用post
|
||||||
@@ -177,6 +187,7 @@ func (c Note) UpdateNoteOrContent(noteOrContent info.NoteOrContent) revel.Result
|
|||||||
NoteId: bson.ObjectIdHex(noteOrContent.NoteId),
|
NoteId: bson.ObjectIdHex(noteOrContent.NoteId),
|
||||||
NotebookId: bson.ObjectIdHex(noteOrContent.NotebookId),
|
NotebookId: bson.ObjectIdHex(noteOrContent.NotebookId),
|
||||||
Title: noteOrContent.Title,
|
Title: noteOrContent.Title,
|
||||||
|
Src: noteOrContent.Src, // 来源
|
||||||
Tags: strings.Split(noteOrContent.Tags, ","),
|
Tags: strings.Split(noteOrContent.Tags, ","),
|
||||||
Desc: noteOrContent.Desc,
|
Desc: noteOrContent.Desc,
|
||||||
ImgSrc: noteOrContent.ImgSrc,
|
ImgSrc: noteOrContent.ImgSrc,
|
||||||
@@ -190,7 +201,7 @@ func (c Note) UpdateNoteOrContent(noteOrContent info.NoteOrContent) revel.Result
|
|||||||
Abstract: noteOrContent.Abstract}
|
Abstract: noteOrContent.Abstract}
|
||||||
|
|
||||||
note = noteService.AddNoteAndContentForController(note, noteContent, c.GetUserId())
|
note = noteService.AddNoteAndContentForController(note, noteContent, c.GetUserId())
|
||||||
return c.RenderJson(note)
|
return c.RenderJSON(note)
|
||||||
}
|
}
|
||||||
|
|
||||||
noteUpdate := bson.M{}
|
noteUpdate := bson.M{}
|
||||||
@@ -237,7 +248,7 @@ func (c Note) UpdateNoteOrContent(noteOrContent info.NoteOrContent) revel.Result
|
|||||||
Log(contentOk)
|
Log(contentOk)
|
||||||
Log(contentMsg)
|
Log(contentMsg)
|
||||||
|
|
||||||
return c.RenderJson(true)
|
return c.RenderJSON(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除note/ 删除别人共享给我的笔记
|
// 删除note/ 删除别人共享给我的笔记
|
||||||
@@ -247,19 +258,19 @@ func (c Note) DeleteNote(noteIds []string, isShared bool) revel.Result {
|
|||||||
for _, noteId := range noteIds {
|
for _, noteId := range noteIds {
|
||||||
trashService.DeleteNote(noteId, c.GetUserId())
|
trashService.DeleteNote(noteId, c.GetUserId())
|
||||||
}
|
}
|
||||||
return c.RenderJson(true)
|
return c.RenderJSON(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, noteId := range noteIds {
|
for _, noteId := range noteIds {
|
||||||
trashService.DeleteSharedNote(noteId, c.GetUserId())
|
trashService.DeleteSharedNote(noteId, c.GetUserId())
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.RenderJson(true)
|
return c.RenderJSON(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除trash, 已弃用, 用DeleteNote
|
// 删除trash, 已弃用, 用DeleteNote
|
||||||
func (c Note) DeleteTrash(noteId string) revel.Result {
|
func (c Note) DeleteTrash(noteId string) revel.Result {
|
||||||
return c.RenderJson(trashService.DeleteTrash(noteId, c.GetUserId()))
|
return c.RenderJSON(trashService.DeleteTrash(noteId, c.GetUserId()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 移动note
|
// 移动note
|
||||||
@@ -268,7 +279,7 @@ func (c Note) MoveNote(noteIds []string, notebookId string) revel.Result {
|
|||||||
for _, noteId := range noteIds {
|
for _, noteId := range noteIds {
|
||||||
noteService.MoveNote(noteId, notebookId, userId)
|
noteService.MoveNote(noteId, notebookId, userId)
|
||||||
}
|
}
|
||||||
return c.RenderJson(true)
|
return c.RenderJSON(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 复制note
|
// 复制note
|
||||||
@@ -281,7 +292,7 @@ func (c Note) CopyNote(noteIds []string, notebookId string) revel.Result {
|
|||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = true
|
re.Ok = true
|
||||||
re.Item = copyNotes
|
re.Item = copyNotes
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 复制别人共享的笔记给我
|
// 复制别人共享的笔记给我
|
||||||
@@ -294,7 +305,7 @@ func (c Note) CopySharedNote(noteIds []string, notebookId, fromUserId string) re
|
|||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = true
|
re.Ok = true
|
||||||
re.Item = copyNotes
|
re.Item = copyNotes
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------
|
//------------
|
||||||
@@ -302,13 +313,13 @@ func (c Note) CopySharedNote(noteIds []string, notebookId, fromUserId string) re
|
|||||||
// 通过title搜索
|
// 通过title搜索
|
||||||
func (c Note) SearchNote(key string) revel.Result {
|
func (c Note) SearchNote(key string) revel.Result {
|
||||||
_, blogs := noteService.SearchNote(key, c.GetUserId(), c.GetPage(), pageSize, "UpdatedTime", false, false)
|
_, blogs := noteService.SearchNote(key, c.GetUserId(), c.GetPage(), pageSize, "UpdatedTime", false, false)
|
||||||
return c.RenderJson(blogs)
|
return c.RenderJSON(blogs)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通过tags搜索
|
// 通过tags搜索
|
||||||
func (c Note) SearchNoteByTags(tags []string) revel.Result {
|
func (c Note) SearchNoteByTags(tags []string) revel.Result {
|
||||||
_, blogs := noteService.SearchNoteByTags(tags, c.GetUserId(), c.GetPage(), pageSize, "UpdatedTime", false)
|
_, blogs := noteService.SearchNoteByTags(tags, c.GetUserId(), c.GetPage(), pageSize, "UpdatedTime", false)
|
||||||
return c.RenderJson(blogs)
|
return c.RenderJSON(blogs)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 生成PDF
|
// 生成PDF
|
||||||
@@ -338,6 +349,8 @@ func (c Note) ToPdf(noteId, appKey string) revel.Result {
|
|||||||
siteUrlPattern = strings.Replace(siteUrlPattern, "http", "https*", 1)
|
siteUrlPattern = strings.Replace(siteUrlPattern, "http", "https*", 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
siteUrlPattern = "(?:" + siteUrlPattern + ")*"
|
||||||
|
|
||||||
regImage, _ := regexp.Compile(`<img .*?(src=('|")` + siteUrlPattern + `/(file/outputImage|api/file/getImage)\?fileId=([a-z0-9A-Z]{24})("|'))`)
|
regImage, _ := regexp.Compile(`<img .*?(src=('|")` + siteUrlPattern + `/(file/outputImage|api/file/getImage)\?fileId=([a-z0-9A-Z]{24})("|'))`)
|
||||||
|
|
||||||
findsImage := regImage.FindAllStringSubmatch(contentStr, -1) // 查找所有的
|
findsImage := regImage.FindAllStringSubmatch(contentStr, -1) // 查找所有的
|
||||||
@@ -384,11 +397,11 @@ func (c Note) ToPdf(noteId, appKey string) revel.Result {
|
|||||||
} else {
|
} else {
|
||||||
note.Tags = nil
|
note.Tags = nil
|
||||||
}
|
}
|
||||||
c.RenderArgs["blog"] = note
|
c.ViewArgs["blog"] = note
|
||||||
c.RenderArgs["content"] = contentStr
|
c.ViewArgs["content"] = contentStr
|
||||||
c.RenderArgs["userInfo"] = userInfo
|
c.ViewArgs["userInfo"] = userInfo
|
||||||
userBlog := blogService.GetUserBlog(noteUserId)
|
userBlog := blogService.GetUserBlog(noteUserId)
|
||||||
c.RenderArgs["userBlog"] = userBlog
|
c.ViewArgs["userBlog"] = userBlog
|
||||||
|
|
||||||
return c.RenderTemplate("file/pdf.html")
|
return c.RenderTemplate("file/pdf.html")
|
||||||
}
|
}
|
||||||
@@ -475,5 +488,5 @@ func (c Note) SetNote2Blog(noteIds []string, isBlog, isTop bool) revel.Result {
|
|||||||
for _, noteId := range noteIds {
|
for _, noteId := range noteIds {
|
||||||
noteService.ToBlog(c.GetUserId(), noteId, isBlog, isTop)
|
noteService.ToBlog(c.GetUserId(), noteId, isBlog, isTop)
|
||||||
}
|
}
|
||||||
return c.RenderJson(true)
|
return c.RenderJSON(true)
|
||||||
}
|
}
|
||||||
@@ -14,18 +14,18 @@ type Notebook struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c Notebook) Index(notebook info.Notebook, i int, name string) revel.Result {
|
func (c Notebook) Index(notebook info.Notebook, i int, name string) revel.Result {
|
||||||
return c.RenderJson(notebook)
|
return c.RenderJSON(notebook)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到用户的所有笔记本
|
// 得到用户的所有笔记本
|
||||||
func (c Notebook) GetNotebooks() revel.Result {
|
func (c Notebook) GetNotebooks() revel.Result {
|
||||||
re := notebookService.GetNotebooks(c.GetUserId())
|
re := notebookService.GetNotebooks(c.GetUserId())
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Notebook) DeleteNotebook(notebookId string) revel.Result {
|
func (c Notebook) DeleteNotebook(notebookId string) revel.Result {
|
||||||
re, msg := notebookService.DeleteNotebook(c.GetUserId(), notebookId)
|
re, msg := notebookService.DeleteNotebook(c.GetUserId(), notebookId)
|
||||||
return c.RenderJson(info.Re{Ok: re, Msg: msg})
|
return c.RenderJSON(info.Re{Ok: re, Msg: msg})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加notebook
|
// 添加notebook
|
||||||
@@ -41,21 +41,21 @@ func (c Notebook) AddNotebook(notebookId, title, parentNotebookId string) revel.
|
|||||||
re, notebook := notebookService.AddNotebook(notebook)
|
re, notebook := notebookService.AddNotebook(notebook)
|
||||||
|
|
||||||
if re {
|
if re {
|
||||||
return c.RenderJson(notebook)
|
return c.RenderJSON(notebook)
|
||||||
} else {
|
} else {
|
||||||
return c.RenderJson(false)
|
return c.RenderJSON(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改标题
|
// 修改标题
|
||||||
func (c Notebook) UpdateNotebookTitle(notebookId, title string) revel.Result {
|
func (c Notebook) UpdateNotebookTitle(notebookId, title string) revel.Result {
|
||||||
return c.RenderJson(notebookService.UpdateNotebookTitle(notebookId, c.GetUserId(), title))
|
return c.RenderJSON(notebookService.UpdateNotebookTitle(notebookId, c.GetUserId(), title))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 排序
|
// 排序
|
||||||
// 无用
|
// 无用
|
||||||
// func (c Notebook) SortNotebooks(notebookId2Seqs map[string]int) revel.Result {
|
// func (c Notebook) SortNotebooks(notebookId2Seqs map[string]int) revel.Result {
|
||||||
// return c.RenderJson(notebookService.SortNotebooks(c.GetUserId(), notebookId2Seqs))
|
// return c.RenderJSON(notebookService.SortNotebooks(c.GetUserId(), notebookId2Seqs))
|
||||||
// }
|
// }
|
||||||
|
|
||||||
// 调整notebooks, 可能是排序, 可能是移动到其它笔记本下
|
// 调整notebooks, 可能是排序, 可能是移动到其它笔记本下
|
||||||
@@ -70,11 +70,11 @@ func (c Notebook) DragNotebooks(data string) revel.Result {
|
|||||||
info := DragNotebooksInfo{}
|
info := DragNotebooksInfo{}
|
||||||
json.Unmarshal([]byte(data), &info)
|
json.Unmarshal([]byte(data), &info)
|
||||||
|
|
||||||
return c.RenderJson(notebookService.DragNotebooks(c.GetUserId(), info.CurNotebookId, info.ParentNotebookId, info.Siblings))
|
return c.RenderJSON(notebookService.DragNotebooks(c.GetUserId(), info.CurNotebookId, info.ParentNotebookId, info.Siblings))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置notebook <-> blog
|
// 设置notebook <-> blog
|
||||||
func (c Notebook) SetNotebook2Blog(notebookId string, isBlog bool) revel.Result {
|
func (c Notebook) SetNotebook2Blog(notebookId string, isBlog bool) revel.Result {
|
||||||
re := notebookService.ToBlog(c.GetUserId(), notebookId, isBlog)
|
re := notebookService.ToBlog(c.GetUserId(), notebookId, isBlog)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
@@ -32,10 +32,10 @@ func (c Preview) getPreviewThemeAbsolutePath(themeId string) bool {
|
|||||||
}
|
}
|
||||||
theme := themeService.GetTheme(c.GetUserId(), themeId)
|
theme := themeService.GetTheme(c.GetUserId(), themeId)
|
||||||
|
|
||||||
c.RenderArgs["isPreview"] = true
|
c.ViewArgs["isPreview"] = true
|
||||||
c.RenderArgs["themeId"] = themeId
|
c.ViewArgs["themeId"] = themeId
|
||||||
c.RenderArgs["themeInfoPreview"] = theme.Info
|
c.ViewArgs["themeInfoPreview"] = theme.Info
|
||||||
c.RenderArgs["themePath"] = theme.Path
|
c.ViewArgs["themePath"] = theme.Path
|
||||||
if theme.Path == "" {
|
if theme.Path == "" {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -47,7 +47,7 @@ func (c Preview) Index(userIdOrEmail string, themeId string) revel.Result {
|
|||||||
return c.E404()
|
return c.E404()
|
||||||
}
|
}
|
||||||
return c.Blog.Index(c.GetUserId())
|
return c.Blog.Index(c.GetUserId())
|
||||||
// return blog.RenderTemplate("index.html", c.RenderArgs, c.getPreviewThemeAbsolutePath(themeId))
|
// return blog.RenderTemplate("index.html", c.ViewArgs, c.getPreviewThemeAbsolutePath(themeId))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Preview) Tag(userIdOrEmail, tag string) revel.Result {
|
func (c Preview) Tag(userIdOrEmail, tag string) revel.Result {
|
||||||
@@ -62,42 +62,42 @@ func (c Preview) Tags(userIdOrEmail string) revel.Result {
|
|||||||
}
|
}
|
||||||
return c.Blog.Tags(c.GetUserId())
|
return c.Blog.Tags(c.GetUserId())
|
||||||
// if tag == "" {
|
// if tag == "" {
|
||||||
// return blog.RenderTemplate("tags.html", c.RenderArgs, c.getPreviewThemeAbsolutePath(""))
|
// return blog.RenderTemplate("tags.html", c.ViewArgs, c.getPreviewThemeAbsolutePath(""))
|
||||||
// }
|
// }
|
||||||
// return blog.RenderTemplate("tag_posts.html", c.RenderArgs, c.getPreviewThemeAbsolutePath(""))
|
// return blog.RenderTemplate("tag_posts.html", c.ViewArgs, c.getPreviewThemeAbsolutePath(""))
|
||||||
}
|
}
|
||||||
func (c Preview) Archives(userIdOrEmail string, notebookId string, year, month int) revel.Result {
|
func (c Preview) Archives(userIdOrEmail string, notebookId string, year, month int) revel.Result {
|
||||||
if !c.getPreviewThemeAbsolutePath("") {
|
if !c.getPreviewThemeAbsolutePath("") {
|
||||||
return c.E404()
|
return c.E404()
|
||||||
}
|
}
|
||||||
return c.Blog.Archives(c.GetUserId(), notebookId, year, month)
|
return c.Blog.Archives(c.GetUserId(), notebookId, year, month)
|
||||||
// return blog.RenderTemplate("archive.html", c.RenderArgs, c.getPreviewThemeAbsolutePath(""))
|
// return blog.RenderTemplate("archive.html", c.ViewArgs, c.getPreviewThemeAbsolutePath(""))
|
||||||
}
|
}
|
||||||
func (c Preview) Cate(userIdOrEmail, notebookId string) revel.Result {
|
func (c Preview) Cate(userIdOrEmail, notebookId string) revel.Result {
|
||||||
if !c.getPreviewThemeAbsolutePath("") {
|
if !c.getPreviewThemeAbsolutePath("") {
|
||||||
return c.E404()
|
return c.E404()
|
||||||
}
|
}
|
||||||
return c.Blog.Cate(userIdOrEmail, notebookId)
|
return c.Blog.Cate(userIdOrEmail, notebookId)
|
||||||
// return blog.RenderTemplate("cate.html", c.RenderArgs, c.getPreviewThemeAbsolutePath(""))
|
// return blog.RenderTemplate("cate.html", c.ViewArgs, c.getPreviewThemeAbsolutePath(""))
|
||||||
}
|
}
|
||||||
func (c Preview) Post(userIdOrEmail, noteId string) revel.Result {
|
func (c Preview) Post(userIdOrEmail, noteId string) revel.Result {
|
||||||
if !c.getPreviewThemeAbsolutePath("") {
|
if !c.getPreviewThemeAbsolutePath("") {
|
||||||
return c.E404()
|
return c.E404()
|
||||||
}
|
}
|
||||||
return c.Blog.Post(userIdOrEmail, noteId)
|
return c.Blog.Post(userIdOrEmail, noteId)
|
||||||
// return blog.RenderTemplate("view.html", c.RenderArgs, c.getPreviewThemeAbsolutePath(""))
|
// return blog.RenderTemplate("view.html", c.ViewArgs, c.getPreviewThemeAbsolutePath(""))
|
||||||
}
|
}
|
||||||
func (c Preview) Single(userIdOrEmail, singleId string) revel.Result {
|
func (c Preview) Single(userIdOrEmail, singleId string) revel.Result {
|
||||||
if !c.getPreviewThemeAbsolutePath("") {
|
if !c.getPreviewThemeAbsolutePath("") {
|
||||||
return c.E404()
|
return c.E404()
|
||||||
}
|
}
|
||||||
return c.Blog.Single(userIdOrEmail, singleId)
|
return c.Blog.Single(userIdOrEmail, singleId)
|
||||||
// return blog.RenderTemplate("single.html", c.RenderArgs, c.getPreviewThemeAbsolutePath(""))
|
// return blog.RenderTemplate("single.html", c.ViewArgs, c.getPreviewThemeAbsolutePath(""))
|
||||||
}
|
}
|
||||||
func (c Preview) Search(userIdOrEmail, keywords string) revel.Result {
|
func (c Preview) Search(userIdOrEmail, keywords string) revel.Result {
|
||||||
if !c.getPreviewThemeAbsolutePath("") {
|
if !c.getPreviewThemeAbsolutePath("") {
|
||||||
return c.E404()
|
return c.E404()
|
||||||
}
|
}
|
||||||
return c.Blog.Search(c.GetUserId(), keywords)
|
return c.Blog.Search(c.GetUserId(), keywords)
|
||||||
// return blog.RenderTemplate("search.html", c.RenderArgs, c.getPreviewThemeAbsolutePath(""))
|
// return blog.RenderTemplate("search.html", c.ViewArgs, c.getPreviewThemeAbsolutePath(""))
|
||||||
}
|
}
|
||||||
@@ -33,7 +33,7 @@ func (c Share) AddShareNote(noteId string, emails []string, perm int) revel.Resu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.RenderJson(status)
|
return c.RenderJSON(status)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加共享notebook
|
// 添加共享notebook
|
||||||
@@ -53,7 +53,7 @@ func (c Share) AddShareNotebook(notebookId string, emails []string, perm int) re
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.RenderJson(status)
|
return c.RenderJSON(status)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到notes
|
// 得到notes
|
||||||
@@ -63,10 +63,10 @@ func (c Share) ListShareNotes(notebookId, userId string) revel.Result {
|
|||||||
var notes []info.ShareNoteWithPerm
|
var notes []info.ShareNoteWithPerm
|
||||||
if notebookId == "" {
|
if notebookId == "" {
|
||||||
notes = shareService.ListShareNotes(c.GetUserId(), userId, c.GetPage(), pageSize, defaultSortField, false)
|
notes = shareService.ListShareNotes(c.GetUserId(), userId, c.GetPage(), pageSize, defaultSortField, false)
|
||||||
return c.RenderJson(notes)
|
return c.RenderJSON(notes)
|
||||||
} else {
|
} else {
|
||||||
// 有notebookId的
|
// 有notebookId的
|
||||||
return c.RenderJson(shareService.ListShareNotesByNotebookId(notebookId, c.GetUserId(), userId, c.GetPage(), pageSize, defaultSortField, false))
|
return c.RenderJSON(shareService.ListShareNotesByNotebookId(notebookId, c.GetUserId(), userId, c.GetPage(), pageSize, defaultSortField, false))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,7 +74,7 @@ func (c Share) ListShareNotes(notebookId, userId string) revel.Result {
|
|||||||
// sharedUserId 是谁的笔记
|
// sharedUserId 是谁的笔记
|
||||||
func (c Share) GetShareNoteContent(noteId, sharedUserId string) revel.Result {
|
func (c Share) GetShareNoteContent(noteId, sharedUserId string) revel.Result {
|
||||||
noteContent := shareService.GetShareNoteContent(noteId, c.GetUserId(), sharedUserId)
|
noteContent := shareService.GetShareNoteContent(noteId, c.GetUserId(), sharedUserId)
|
||||||
return c.RenderJson(noteContent)
|
return c.RenderJSON(noteContent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 查看note的分享信息
|
// 查看note的分享信息
|
||||||
@@ -85,13 +85,13 @@ func (c Share) ListNoteShareUserInfo(noteId string) revel.Result {
|
|||||||
note := noteService.GetNote(noteId, c.GetUserId())
|
note := noteService.GetNote(noteId, c.GetUserId())
|
||||||
|
|
||||||
noteShareUserInfos := shareService.ListNoteShareUserInfo(noteId, c.GetUserId())
|
noteShareUserInfos := shareService.ListNoteShareUserInfo(noteId, c.GetUserId())
|
||||||
c.RenderArgs["noteOrNotebookShareUserInfos"] = noteShareUserInfos
|
c.ViewArgs["noteOrNotebookShareUserInfos"] = noteShareUserInfos
|
||||||
|
|
||||||
c.RenderArgs["noteOrNotebookShareGroupInfos"] = shareService.GetNoteShareGroups(noteId, c.GetUserId())
|
c.ViewArgs["noteOrNotebookShareGroupInfos"] = shareService.GetNoteShareGroups(noteId, c.GetUserId())
|
||||||
|
|
||||||
c.RenderArgs["isNote"] = true
|
c.ViewArgs["isNote"] = true
|
||||||
c.RenderArgs["noteOrNotebookId"] = note.NoteId.Hex()
|
c.ViewArgs["noteOrNotebookId"] = note.NoteId.Hex()
|
||||||
c.RenderArgs["title"] = note.Title
|
c.ViewArgs["title"] = note.Title
|
||||||
|
|
||||||
return c.RenderTemplate("share/note_notebook_share_user_infos.html")
|
return c.RenderTemplate("share/note_notebook_share_user_infos.html")
|
||||||
}
|
}
|
||||||
@@ -99,14 +99,14 @@ func (c Share) ListNotebookShareUserInfo(notebookId string) revel.Result {
|
|||||||
notebook := notebookService.GetNotebook(notebookId, c.GetUserId())
|
notebook := notebookService.GetNotebook(notebookId, c.GetUserId())
|
||||||
|
|
||||||
notebookShareUserInfos := shareService.ListNotebookShareUserInfo(notebookId, c.GetUserId())
|
notebookShareUserInfos := shareService.ListNotebookShareUserInfo(notebookId, c.GetUserId())
|
||||||
c.RenderArgs["noteOrNotebookShareUserInfos"] = notebookShareUserInfos
|
c.ViewArgs["noteOrNotebookShareUserInfos"] = notebookShareUserInfos
|
||||||
|
|
||||||
c.RenderArgs["noteOrNotebookShareGroupInfos"] = shareService.GetNotebookShareGroups(notebookId, c.GetUserId())
|
c.ViewArgs["noteOrNotebookShareGroupInfos"] = shareService.GetNotebookShareGroups(notebookId, c.GetUserId())
|
||||||
LogJ(c.RenderArgs["noteOrNotebookShareGroupInfos"])
|
LogJ(c.ViewArgs["noteOrNotebookShareGroupInfos"])
|
||||||
|
|
||||||
c.RenderArgs["isNote"] = false
|
c.ViewArgs["isNote"] = false
|
||||||
c.RenderArgs["noteOrNotebookId"] = notebook.NotebookId.Hex()
|
c.ViewArgs["noteOrNotebookId"] = notebook.NotebookId.Hex()
|
||||||
c.RenderArgs["title"] = notebook.Title
|
c.ViewArgs["title"] = notebook.Title
|
||||||
|
|
||||||
return c.RenderTemplate("share/note_notebook_share_user_infos.html")
|
return c.RenderTemplate("share/note_notebook_share_user_infos.html")
|
||||||
}
|
}
|
||||||
@@ -114,38 +114,38 @@ func (c Share) ListNotebookShareUserInfo(notebookId string) revel.Result {
|
|||||||
//------------
|
//------------
|
||||||
// 改变share note 权限
|
// 改变share note 权限
|
||||||
func (c Share) UpdateShareNotePerm(noteId string, perm int, toUserId string) revel.Result {
|
func (c Share) UpdateShareNotePerm(noteId string, perm int, toUserId string) revel.Result {
|
||||||
return c.RenderJson(shareService.UpdateShareNotePerm(noteId, perm, c.GetUserId(), toUserId))
|
return c.RenderJSON(shareService.UpdateShareNotePerm(noteId, perm, c.GetUserId(), toUserId))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 改变share notebook 权限
|
// 改变share notebook 权限
|
||||||
func (c Share) UpdateShareNotebookPerm(notebookId string, perm int, toUserId string) revel.Result {
|
func (c Share) UpdateShareNotebookPerm(notebookId string, perm int, toUserId string) revel.Result {
|
||||||
return c.RenderJson(shareService.UpdateShareNotebookPerm(notebookId, perm, c.GetUserId(), toUserId))
|
return c.RenderJSON(shareService.UpdateShareNotebookPerm(notebookId, perm, c.GetUserId(), toUserId))
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------
|
//---------------
|
||||||
// 删除share note
|
// 删除share note
|
||||||
func (c Share) DeleteShareNote(noteId string, toUserId string) revel.Result {
|
func (c Share) DeleteShareNote(noteId string, toUserId string) revel.Result {
|
||||||
return c.RenderJson(shareService.DeleteShareNote(noteId, c.GetUserId(), toUserId))
|
return c.RenderJSON(shareService.DeleteShareNote(noteId, c.GetUserId(), toUserId))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除share notebook
|
// 删除share notebook
|
||||||
func (c Share) DeleteShareNotebook(notebookId string, toUserId string) revel.Result {
|
func (c Share) DeleteShareNotebook(notebookId string, toUserId string) revel.Result {
|
||||||
return c.RenderJson(shareService.DeleteShareNotebook(notebookId, c.GetUserId(), toUserId))
|
return c.RenderJSON(shareService.DeleteShareNotebook(notebookId, c.GetUserId(), toUserId))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除share note, 被共享方删除
|
// 删除share note, 被共享方删除
|
||||||
func (c Share) DeleteShareNoteBySharedUser(noteId string, fromUserId string) revel.Result {
|
func (c Share) DeleteShareNoteBySharedUser(noteId string, fromUserId string) revel.Result {
|
||||||
return c.RenderJson(shareService.DeleteShareNote(noteId, fromUserId, c.GetUserId()))
|
return c.RenderJSON(shareService.DeleteShareNote(noteId, fromUserId, c.GetUserId()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除share notebook, 被共享方删除
|
// 删除share notebook, 被共享方删除
|
||||||
func (c Share) DeleteShareNotebookBySharedUser(notebookId string, fromUserId string) revel.Result {
|
func (c Share) DeleteShareNotebookBySharedUser(notebookId string, fromUserId string) revel.Result {
|
||||||
return c.RenderJson(shareService.DeleteShareNotebook(notebookId, fromUserId, c.GetUserId()))
|
return c.RenderJSON(shareService.DeleteShareNotebook(notebookId, fromUserId, c.GetUserId()))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除fromUserId分享给我的所有note, notebook
|
// 删除fromUserId分享给我的所有note, notebook
|
||||||
func (c Share) DeleteUserShareNoteAndNotebook(fromUserId string) revel.Result {
|
func (c Share) DeleteUserShareNoteAndNotebook(fromUserId string) revel.Result {
|
||||||
return c.RenderJson(shareService.DeleteUserShareNoteAndNotebook(fromUserId, c.GetUserId()))
|
return c.RenderJSON(shareService.DeleteUserShareNoteAndNotebook(fromUserId, c.GetUserId()))
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------
|
//-------------
|
||||||
@@ -155,14 +155,14 @@ func (c Share) DeleteUserShareNoteAndNotebook(fromUserId string) revel.Result {
|
|||||||
func (c Share) AddShareNoteGroup(noteId, groupId string, perm int) revel.Result {
|
func (c Share) AddShareNoteGroup(noteId, groupId string, perm int) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = shareService.AddShareNoteGroup(c.GetUserId(), noteId, groupId, perm)
|
re.Ok = shareService.AddShareNoteGroup(c.GetUserId(), noteId, groupId, perm)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除
|
// 删除
|
||||||
func (c Share) DeleteShareNoteGroup(noteId, groupId string) revel.Result {
|
func (c Share) DeleteShareNoteGroup(noteId, groupId string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = shareService.DeleteShareNoteGroup(c.GetUserId(), noteId, groupId)
|
re.Ok = shareService.DeleteShareNoteGroup(c.GetUserId(), noteId, groupId)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新, 也是一样, 先删后加
|
// 更新, 也是一样, 先删后加
|
||||||
@@ -176,14 +176,14 @@ func (c Share) UpdateShareNoteGroupPerm(noteId, groupId string, perm int) revel.
|
|||||||
func (c Share) AddShareNotebookGroup(notebookId, groupId string, perm int) revel.Result {
|
func (c Share) AddShareNotebookGroup(notebookId, groupId string, perm int) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = shareService.AddShareNotebookGroup(c.GetUserId(), notebookId, groupId, perm)
|
re.Ok = shareService.AddShareNotebookGroup(c.GetUserId(), notebookId, groupId, perm)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除
|
// 删除
|
||||||
func (c Share) DeleteShareNotebookGroup(notebookId, groupId string) revel.Result {
|
func (c Share) DeleteShareNotebookGroup(notebookId, groupId string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = shareService.DeleteShareNotebookGroup(c.GetUserId(), notebookId, groupId)
|
re.Ok = shareService.DeleteShareNotebookGroup(c.GetUserId(), notebookId, groupId)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新, 也是一样, 先删后加
|
// 更新, 也是一样, 先删后加
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ func (c Tag) UpdateTag(tag string) revel.Result {
|
|||||||
ret := info.NewRe()
|
ret := info.NewRe()
|
||||||
ret.Ok = true
|
ret.Ok = true
|
||||||
ret.Item = tagService.AddOrUpdateTag(c.GetUserId(), tag)
|
ret.Item = tagService.AddOrUpdateTag(c.GetUserId(), tag)
|
||||||
return c.RenderJson(ret)
|
return c.RenderJSON(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除标签
|
// 删除标签
|
||||||
@@ -26,5 +26,5 @@ func (c Tag) DeleteTag(tag string) revel.Result {
|
|||||||
ret := info.Re{}
|
ret := info.Re{}
|
||||||
ret.Ok = true
|
ret.Ok = true
|
||||||
ret.Item = tagService.DeleteTag(c.GetUserId(), tag)
|
ret.Item = tagService.DeleteTag(c.GetUserId(), tag)
|
||||||
return c.RenderJson(ret)
|
return c.RenderJSON(ret)
|
||||||
}
|
}
|
||||||
@@ -21,8 +21,8 @@ type User struct {
|
|||||||
|
|
||||||
func (c User) Account(tab int) revel.Result {
|
func (c User) Account(tab int) revel.Result {
|
||||||
userInfo := c.GetUserInfo()
|
userInfo := c.GetUserInfo()
|
||||||
c.RenderArgs["userInfo"] = userInfo
|
c.ViewArgs["userInfo"] = userInfo
|
||||||
c.RenderArgs["tab"] = tab
|
c.ViewArgs["tab"] = tab
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
return c.RenderTemplate("user/account.html")
|
return c.RenderTemplate("user/account.html")
|
||||||
}
|
}
|
||||||
@@ -70,18 +70,18 @@ func (c User) UpdateTheme(theme string) revel.Result {
|
|||||||
if re.Ok {
|
if re.Ok {
|
||||||
c.UpdateSession("Theme", theme)
|
c.UpdateSession("Theme", theme)
|
||||||
}
|
}
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送邀请链接
|
// 发送邀请链接
|
||||||
func (c User) SendRegisterEmail(content, toEmail string) revel.Result {
|
func (c User) SendRegisterEmail(content, toEmail string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
if content == "" || !IsEmail(toEmail) {
|
if content == "" || !IsEmail(toEmail) {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
re.Ok = emailService.SendInviteEmail(c.GetUserInfo(), toEmail, content)
|
re.Ok = emailService.SendInviteEmail(c.GetUserInfo(), toEmail, content)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------
|
//---------------------------
|
||||||
@@ -90,7 +90,7 @@ func (c User) SendRegisterEmail(content, toEmail string) revel.Result {
|
|||||||
func (c User) ReSendActiveEmail() revel.Result {
|
func (c User) ReSendActiveEmail() revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = emailService.RegisterSendActiveEmail(c.GetUserInfo(), c.GetEmail())
|
re.Ok = emailService.RegisterSendActiveEmail(c.GetUserInfo(), c.GetEmail())
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通过点击链接
|
// 通过点击链接
|
||||||
@@ -100,10 +100,10 @@ func (c User) UpdateEmail(token string) revel.Result {
|
|||||||
|
|
||||||
ok, msg, email := userService.UpdateEmail(token)
|
ok, msg, email := userService.UpdateEmail(token)
|
||||||
|
|
||||||
c.RenderArgs["title"] = "验证邮箱"
|
c.ViewArgs["title"] = "验证邮箱"
|
||||||
c.RenderArgs["ok"] = ok
|
c.ViewArgs["ok"] = ok
|
||||||
c.RenderArgs["msg"] = msg
|
c.ViewArgs["msg"] = msg
|
||||||
c.RenderArgs["email"] = email
|
c.ViewArgs["email"] = email
|
||||||
|
|
||||||
// 修改session
|
// 修改session
|
||||||
if ok {
|
if ok {
|
||||||
@@ -124,10 +124,10 @@ func (c User) ActiveEmail(token string) revel.Result {
|
|||||||
c.UpdateSession("Verified", "1")
|
c.UpdateSession("Verified", "1")
|
||||||
}
|
}
|
||||||
|
|
||||||
c.RenderArgs["title"] = "验证邮箱"
|
c.ViewArgs["title"] = "验证邮箱"
|
||||||
c.RenderArgs["ok"] = ok
|
c.ViewArgs["ok"] = ok
|
||||||
c.RenderArgs["msg"] = msg
|
c.ViewArgs["msg"] = msg
|
||||||
c.RenderArgs["email"] = email
|
c.ViewArgs["email"] = email
|
||||||
|
|
||||||
return c.RenderTemplate("user/active_email.html")
|
return c.RenderTemplate("user/active_email.html")
|
||||||
}
|
}
|
||||||
@@ -144,7 +144,7 @@ func (c User) UpdateColumnWidth(notebookWidth, noteListWidth, mdEditorWidth int)
|
|||||||
|
|
||||||
LogJ(c.Session)
|
LogJ(c.Session)
|
||||||
}
|
}
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
func (c User) UpdateLeftIsMin(leftIsMin bool) revel.Result {
|
func (c User) UpdateLeftIsMin(leftIsMin bool) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
@@ -156,5 +156,5 @@ func (c User) UpdateLeftIsMin(leftIsMin bool) revel.Result {
|
|||||||
c.UpdateSession("LeftIsMin", "0")
|
c.UpdateSession("LeftIsMin", "0")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
@@ -46,7 +46,7 @@ func (c AdminBaseController) getSorter(sorterField string, isAsc bool, okSorter
|
|||||||
} else {
|
} else {
|
||||||
isAsc = false
|
isAsc = false
|
||||||
}
|
}
|
||||||
c.RenderArgs["sorter"] = sorter
|
c.ViewArgs["sorter"] = sorter
|
||||||
return sorterField, isAsc
|
return sorterField, isAsc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,14 +17,14 @@ func (c AdminBlog) Index(sorter, keywords string) revel.Result {
|
|||||||
pageNumber := c.GetPage()
|
pageNumber := c.GetPage()
|
||||||
sorterField, isAsc := c.getSorter("CreatedTime", false, []string{"title", "userId", "isRecommed", "createdTime"})
|
sorterField, isAsc := c.getSorter("CreatedTime", false, []string{"title", "userId", "isRecommed", "createdTime"})
|
||||||
pageInfo, blogs := blogService.ListAllBlogs("", "", keywords, false, pageNumber, userPageSize, sorterField, isAsc)
|
pageInfo, blogs := blogService.ListAllBlogs("", "", keywords, false, pageNumber, userPageSize, sorterField, isAsc)
|
||||||
c.RenderArgs["pageInfo"] = pageInfo
|
c.ViewArgs["pageInfo"] = pageInfo
|
||||||
c.RenderArgs["blogs"] = blogs
|
c.ViewArgs["blogs"] = blogs
|
||||||
c.RenderArgs["keywords"] = keywords
|
c.ViewArgs["keywords"] = keywords
|
||||||
return c.RenderTemplate("admin/blog/list.html")
|
return c.RenderTemplate("admin/blog/list.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminBlog) SetRecommend(noteId string, recommend bool) revel.Result {
|
func (c AdminBlog) SetRecommend(noteId string, recommend bool) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = blogService.SetRecommend(noteId, recommend)
|
re.Ok = blogService.SetRecommend(noteId, recommend)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
@@ -14,23 +14,23 @@ type Admin struct {
|
|||||||
func (c Admin) Index() revel.Result {
|
func (c Admin) Index() revel.Result {
|
||||||
c.SetUserInfo()
|
c.SetUserInfo()
|
||||||
|
|
||||||
c.RenderArgs["title"] = "leanote"
|
c.ViewArgs["title"] = "leanote"
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
|
|
||||||
c.RenderArgs["countUser"] = userService.CountUser()
|
c.ViewArgs["countUser"] = userService.CountUser()
|
||||||
c.RenderArgs["countNote"] = noteService.CountNote("")
|
c.ViewArgs["countNote"] = noteService.CountNote("")
|
||||||
c.RenderArgs["countBlog"] = noteService.CountBlog("")
|
c.ViewArgs["countBlog"] = noteService.CountBlog("")
|
||||||
|
|
||||||
return c.RenderTemplate("admin/index.html")
|
return c.RenderTemplate("admin/index.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 模板
|
// 模板
|
||||||
func (c Admin) T(t string) revel.Result {
|
func (c Admin) T(t string) revel.Result {
|
||||||
c.RenderArgs["str"] = configService.GlobalStringConfigs
|
c.ViewArgs["str"] = configService.GlobalStringConfigs
|
||||||
c.RenderArgs["arr"] = configService.GlobalArrayConfigs
|
c.ViewArgs["arr"] = configService.GlobalArrayConfigs
|
||||||
c.RenderArgs["map"] = configService.GlobalMapConfigs
|
c.ViewArgs["map"] = configService.GlobalMapConfigs
|
||||||
c.RenderArgs["arrMap"] = configService.GlobalArrMapConfigs
|
c.ViewArgs["arrMap"] = configService.GlobalArrMapConfigs
|
||||||
c.RenderArgs["version"] = configService.GetVersion()
|
c.ViewArgs["version"] = configService.GetVersion()
|
||||||
return c.RenderTemplate("admin/" + t + ".html")
|
return c.RenderTemplate("admin/" + t + ".html")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,33 +26,33 @@ func (c AdminData) Index() revel.Result {
|
|||||||
backups2[j] = backups[i]
|
backups2[j] = backups[i]
|
||||||
j++
|
j++
|
||||||
}
|
}
|
||||||
c.RenderArgs["backups"] = backups2
|
c.ViewArgs["backups"] = backups2
|
||||||
return c.RenderTemplate("admin/data/index.html")
|
return c.RenderTemplate("admin/data/index.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminData) Backup() revel.Result {
|
func (c AdminData) Backup() revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok, re.Msg = configService.Backup("")
|
re.Ok, re.Msg = configService.Backup("")
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 还原
|
// 还原
|
||||||
func (c AdminData) Restore(createdTime string) revel.Result {
|
func (c AdminData) Restore(createdTime string) revel.Result {
|
||||||
re := info.Re{}
|
re := info.Re{}
|
||||||
re.Ok, re.Msg = configService.Restore(createdTime)
|
re.Ok, re.Msg = configService.Restore(createdTime)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminData) Delete(createdTime string) revel.Result {
|
func (c AdminData) Delete(createdTime string) revel.Result {
|
||||||
re := info.Re{}
|
re := info.Re{}
|
||||||
re.Ok, re.Msg = configService.DeleteBackup(createdTime)
|
re.Ok, re.Msg = configService.DeleteBackup(createdTime)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
func (c AdminData) UpdateRemark(createdTime, remark string) revel.Result {
|
func (c AdminData) UpdateRemark(createdTime, remark string) revel.Result {
|
||||||
re := info.Re{}
|
re := info.Re{}
|
||||||
re.Ok, re.Msg = configService.UpdateBackupRemark(createdTime, remark)
|
re.Ok, re.Msg = configService.UpdateBackupRemark(createdTime, remark)
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
func (c AdminData) Download(createdTime string) revel.Result {
|
func (c AdminData) Download(createdTime string) revel.Result {
|
||||||
backup, ok := configService.GetBackup(createdTime)
|
backup, ok := configService.GetBackup(createdTime)
|
||||||
|
|||||||
@@ -23,8 +23,8 @@ func (c AdminEmail) Email() revel.Result {
|
|||||||
func (c AdminEmail) Blog() revel.Result {
|
func (c AdminEmail) Blog() revel.Result {
|
||||||
recommendTags := configService.GetGlobalArrayConfig("recommendTags")
|
recommendTags := configService.GetGlobalArrayConfig("recommendTags")
|
||||||
newTags := configService.GetGlobalArrayConfig("newTags")
|
newTags := configService.GetGlobalArrayConfig("newTags")
|
||||||
c.RenderArgs["recommendTags"] = strings.Join(recommendTags, ",")
|
c.ViewArgs["recommendTags"] = strings.Join(recommendTags, ",")
|
||||||
c.RenderArgs["newTags"] = strings.Join(newTags, ",")
|
c.ViewArgs["newTags"] = strings.Join(newTags, ",")
|
||||||
return c.RenderTemplate("admin/setting/blog.html")
|
return c.RenderTemplate("admin/setting/blog.html")
|
||||||
}
|
}
|
||||||
func (c AdminEmail) DoBlogTag(recommendTags, newTags string) revel.Result {
|
func (c AdminEmail) DoBlogTag(recommendTags, newTags string) revel.Result {
|
||||||
@@ -33,14 +33,14 @@ func (c AdminEmail) DoBlogTag(recommendTags, newTags string) revel.Result {
|
|||||||
re.Ok = configService.UpdateGlobalArrayConfig(c.GetUserId(), "recommendTags", strings.Split(recommendTags, ","))
|
re.Ok = configService.UpdateGlobalArrayConfig(c.GetUserId(), "recommendTags", strings.Split(recommendTags, ","))
|
||||||
re.Ok = configService.UpdateGlobalArrayConfig(c.GetUserId(), "newTags", strings.Split(newTags, ","))
|
re.Ok = configService.UpdateGlobalArrayConfig(c.GetUserId(), "newTags", strings.Split(newTags, ","))
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// demo
|
// demo
|
||||||
// blog标签设置
|
// blog标签设置
|
||||||
func (c AdminEmail) Demo() revel.Result {
|
func (c AdminEmail) Demo() revel.Result {
|
||||||
c.RenderArgs["demoUsername"] = configService.GetGlobalStringConfig("demoUsername")
|
c.ViewArgs["demoUsername"] = configService.GetGlobalStringConfig("demoUsername")
|
||||||
c.RenderArgs["demoPassword"] = configService.GetGlobalStringConfig("demoPassword")
|
c.ViewArgs["demoPassword"] = configService.GetGlobalStringConfig("demoPassword")
|
||||||
return c.RenderTemplate("admin/setting/demo.html")
|
return c.RenderTemplate("admin/setting/demo.html")
|
||||||
}
|
}
|
||||||
func (c AdminEmail) DoDemo(demoUsername, demoPassword string) revel.Result {
|
func (c AdminEmail) DoDemo(demoUsername, demoPassword string) revel.Result {
|
||||||
@@ -48,40 +48,41 @@ func (c AdminEmail) DoDemo(demoUsername, demoPassword string) revel.Result {
|
|||||||
|
|
||||||
userInfo, err := authService.Login(demoUsername, demoPassword)
|
userInfo, err := authService.Login(demoUsername, demoPassword)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.RenderJson(info.Re{Ok: false})
|
return c.RenderJSON(info.Re{Ok: false})
|
||||||
}
|
}
|
||||||
if userInfo.UserId == "" {
|
if userInfo.UserId == "" {
|
||||||
re.Msg = "The User is Not Exists"
|
re.Msg = "The User is Not Exists"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "demoUserId", userInfo.UserId.Hex())
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "demoUserId", userInfo.UserId.Hex())
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "demoUsername", demoUsername)
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "demoUsername", demoUsername)
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "demoPassword", demoPassword)
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "demoPassword", demoPassword)
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToImage
|
// ToImage
|
||||||
// 长微博的bin路径phantomJs
|
// 长微博的bin路径phantomJs
|
||||||
func (c AdminEmail) ToImage() revel.Result {
|
func (c AdminEmail) ToImage() revel.Result {
|
||||||
c.RenderArgs["toImageBinPath"] = configService.GetGlobalStringConfig("toImageBinPath")
|
c.ViewArgs["toImageBinPath"] = configService.GetGlobalStringConfig("toImageBinPath")
|
||||||
return c.RenderTemplate("admin/setting/toImage.html")
|
return c.RenderTemplate("admin/setting/toImage.html")
|
||||||
}
|
}
|
||||||
func (c AdminEmail) DoToImage(toImageBinPath string) revel.Result {
|
func (c AdminEmail) DoToImage(toImageBinPath string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "toImageBinPath", toImageBinPath)
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "toImageBinPath", toImageBinPath)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminEmail) Set(emailHost, emailPort, emailUsername, emailPassword string) revel.Result {
|
func (c AdminEmail) Set(emailHost, emailPort, emailUsername, emailPassword, emailSSL string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "emailHost", emailHost)
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "emailHost", emailHost)
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "emailPort", emailPort)
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "emailPort", emailPort)
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "emailUsername", emailUsername)
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "emailUsername", emailUsername)
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "emailPassword", emailPassword)
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "emailPassword", emailPassword)
|
||||||
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "emailSSL", emailSSL)
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
func (c AdminEmail) Template() revel.Result {
|
func (c AdminEmail) Template() revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
@@ -107,7 +108,7 @@ func (c AdminEmail) Template() revel.Result {
|
|||||||
if !ok {
|
if !ok {
|
||||||
re.Ok = false
|
re.Ok = false
|
||||||
re.Msg = "Error key: " + key + "<br />" + msg
|
re.Msg = "Error key: " + key + "<br />" + msg
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
} else {
|
} else {
|
||||||
configService.UpdateGlobalStringConfig(userId, key, v)
|
configService.UpdateGlobalStringConfig(userId, key, v)
|
||||||
}
|
}
|
||||||
@@ -115,7 +116,7 @@ func (c AdminEmail) Template() revel.Result {
|
|||||||
}
|
}
|
||||||
|
|
||||||
re.Ok = true
|
re.Ok = true
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送Email
|
// 发送Email
|
||||||
@@ -126,7 +127,7 @@ func (c AdminEmail) SendEmailToEmails(sendEmails, latestEmailSubject, latestEmai
|
|||||||
|
|
||||||
if latestEmailSubject == "" || latestEmailBody == "" {
|
if latestEmailSubject == "" || latestEmailBody == "" {
|
||||||
re.Msg = "subject or body is blank"
|
re.Msg = "subject or body is blank"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
if saveAsOldEmail {
|
if saveAsOldEmail {
|
||||||
@@ -139,7 +140,7 @@ func (c AdminEmail) SendEmailToEmails(sendEmails, latestEmailSubject, latestEmai
|
|||||||
emails := strings.Split(sendEmails, "\n")
|
emails := strings.Split(sendEmails, "\n")
|
||||||
|
|
||||||
re.Ok, re.Msg = emailService.SendEmailToEmails(emails, latestEmailSubject, latestEmailBody)
|
re.Ok, re.Msg = emailService.SendEmailToEmails(emails, latestEmailSubject, latestEmailBody)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 发送Email
|
// 发送Email
|
||||||
@@ -150,7 +151,7 @@ func (c AdminEmail) SendToUsers2(emails, latestEmailSubject, latestEmailBody str
|
|||||||
|
|
||||||
if latestEmailSubject == "" || latestEmailBody == "" {
|
if latestEmailSubject == "" || latestEmailBody == "" {
|
||||||
re.Msg = "subject or body is blank"
|
re.Msg = "subject or body is blank"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
if saveAsOldEmail {
|
if saveAsOldEmail {
|
||||||
@@ -167,7 +168,7 @@ func (c AdminEmail) SendToUsers2(emails, latestEmailSubject, latestEmailBody str
|
|||||||
|
|
||||||
re.Ok, re.Msg = emailService.SendEmailToUsers(users, latestEmailSubject, latestEmailBody)
|
re.Ok, re.Msg = emailService.SendEmailToUsers(users, latestEmailSubject, latestEmailBody)
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// send Email dialog
|
// send Email dialog
|
||||||
@@ -175,9 +176,9 @@ func (c AdminEmail) SendEmailDialog(emails string) revel.Result {
|
|||||||
emailsArr := strings.Split(emails, ",")
|
emailsArr := strings.Split(emails, ",")
|
||||||
emailsNl := strings.Join(emailsArr, "\n")
|
emailsNl := strings.Join(emailsArr, "\n")
|
||||||
|
|
||||||
c.RenderArgs["emailsNl"] = emailsNl
|
c.ViewArgs["emailsNl"] = emailsNl
|
||||||
c.RenderArgs["str"] = configService.GlobalStringConfigs
|
c.ViewArgs["str"] = configService.GlobalStringConfigs
|
||||||
c.RenderArgs["map"] = configService.GlobalMapConfigs
|
c.ViewArgs["map"] = configService.GlobalMapConfigs
|
||||||
|
|
||||||
return c.RenderTemplate("admin/email/emailDialog.html")
|
return c.RenderTemplate("admin/email/emailDialog.html")
|
||||||
}
|
}
|
||||||
@@ -189,7 +190,7 @@ func (c AdminEmail) SendToUsers(userFilterEmail, userFilterWhiteList, userFilter
|
|||||||
|
|
||||||
if latestEmailSubject == "" || latestEmailBody == "" {
|
if latestEmailSubject == "" || latestEmailBody == "" {
|
||||||
re.Msg = "subject or body is blank"
|
re.Msg = "subject or body is blank"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
if saveAsOldEmail {
|
if saveAsOldEmail {
|
||||||
@@ -203,33 +204,33 @@ func (c AdminEmail) SendToUsers(userFilterEmail, userFilterWhiteList, userFilter
|
|||||||
if users == nil || len(users) == 0 {
|
if users == nil || len(users) == 0 {
|
||||||
re.Ok = false
|
re.Ok = false
|
||||||
re.Msg = "no users"
|
re.Msg = "no users"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
re.Ok, re.Msg = emailService.SendEmailToUsers(users, latestEmailSubject, latestEmailBody)
|
re.Ok, re.Msg = emailService.SendEmailToUsers(users, latestEmailSubject, latestEmailBody)
|
||||||
if !re.Ok {
|
if !re.Ok {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
re.Ok = true
|
re.Ok = true
|
||||||
re.Msg = "users:" + strconv.Itoa(len(users))
|
re.Msg = "users:" + strconv.Itoa(len(users))
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除emails
|
// 删除emails
|
||||||
func (c AdminEmail) DeleteEmails(ids string) revel.Result {
|
func (c AdminEmail) DeleteEmails(ids string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = emailService.DeleteEmails(strings.Split(ids, ","))
|
re.Ok = emailService.DeleteEmails(strings.Split(ids, ","))
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminEmail) List(sorter, keywords string) revel.Result {
|
func (c AdminEmail) List(sorter, keywords string) revel.Result {
|
||||||
pageNumber := c.GetPage()
|
pageNumber := c.GetPage()
|
||||||
sorterField, isAsc := c.getSorter("CreatedTime", false, []string{"email", "ok", "subject", "createdTime"})
|
sorterField, isAsc := c.getSorter("CreatedTime", false, []string{"email", "ok", "subject", "createdTime"})
|
||||||
pageInfo, emails := emailService.ListEmailLogs(pageNumber, userPageSize, sorterField, isAsc, keywords)
|
pageInfo, emails := emailService.ListEmailLogs(pageNumber, userPageSize, sorterField, isAsc, keywords)
|
||||||
c.RenderArgs["pageInfo"] = pageInfo
|
c.ViewArgs["pageInfo"] = pageInfo
|
||||||
c.RenderArgs["emails"] = emails
|
c.ViewArgs["emails"] = emails
|
||||||
c.RenderArgs["keywords"] = keywords
|
c.ViewArgs["keywords"] = keywords
|
||||||
return c.RenderTemplate("admin/email/list.html")
|
return c.RenderTemplate("admin/email/list.html")
|
||||||
}
|
}
|
||||||
@@ -23,8 +23,8 @@ func (c AdminSetting) Email() revel.Result {
|
|||||||
func (c AdminSetting) Blog() revel.Result {
|
func (c AdminSetting) Blog() revel.Result {
|
||||||
recommendTags := configService.GetGlobalArrayConfig("recommendTags")
|
recommendTags := configService.GetGlobalArrayConfig("recommendTags")
|
||||||
newTags := configService.GetGlobalArrayConfig("newTags")
|
newTags := configService.GetGlobalArrayConfig("newTags")
|
||||||
c.RenderArgs["recommendTags"] = strings.Join(recommendTags, ",")
|
c.ViewArgs["recommendTags"] = strings.Join(recommendTags, ",")
|
||||||
c.RenderArgs["newTags"] = strings.Join(newTags, ",")
|
c.ViewArgs["newTags"] = strings.Join(newTags, ",")
|
||||||
return c.RenderTemplate("admin/setting/blog.html")
|
return c.RenderTemplate("admin/setting/blog.html")
|
||||||
}
|
}
|
||||||
func (c AdminSetting) DoBlogTag(recommendTags, newTags string) revel.Result {
|
func (c AdminSetting) DoBlogTag(recommendTags, newTags string) revel.Result {
|
||||||
@@ -33,7 +33,7 @@ func (c AdminSetting) DoBlogTag(recommendTags, newTags string) revel.Result {
|
|||||||
re.Ok = configService.UpdateGlobalArrayConfig(c.GetUserId(), "recommendTags", strings.Split(recommendTags, ","))
|
re.Ok = configService.UpdateGlobalArrayConfig(c.GetUserId(), "recommendTags", strings.Split(recommendTags, ","))
|
||||||
re.Ok = configService.UpdateGlobalArrayConfig(c.GetUserId(), "newTags", strings.Split(newTags, ","))
|
re.Ok = configService.UpdateGlobalArrayConfig(c.GetUserId(), "newTags", strings.Split(newTags, ","))
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 共享设置
|
// 共享设置
|
||||||
@@ -43,14 +43,14 @@ func (c AdminSetting) ShareNote(registerSharedUserId string,
|
|||||||
|
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok, re.Msg = configService.UpdateShareNoteConfig(registerSharedUserId, registerSharedNotebookPerms, registerSharedNotePerms, registerSharedNotebookIds, registerSharedNoteIds, registerCopyNoteIds)
|
re.Ok, re.Msg = configService.UpdateShareNoteConfig(registerSharedUserId, registerSharedNotebookPerms, registerSharedNotePerms, registerSharedNotebookIds, registerSharedNoteIds, registerCopyNoteIds)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// demo
|
// demo
|
||||||
// blog标签设置
|
// blog标签设置
|
||||||
func (c AdminSetting) Demo() revel.Result {
|
func (c AdminSetting) Demo() revel.Result {
|
||||||
c.RenderArgs["demoUsername"] = configService.GetGlobalStringConfig("demoUsername")
|
c.ViewArgs["demoUsername"] = configService.GetGlobalStringConfig("demoUsername")
|
||||||
c.RenderArgs["demoPassword"] = configService.GetGlobalStringConfig("demoPassword")
|
c.ViewArgs["demoPassword"] = configService.GetGlobalStringConfig("demoPassword")
|
||||||
return c.RenderTemplate("admin/setting/demo.html")
|
return c.RenderTemplate("admin/setting/demo.html")
|
||||||
}
|
}
|
||||||
func (c AdminSetting) DoDemo(demoUsername, demoPassword string) revel.Result {
|
func (c AdminSetting) DoDemo(demoUsername, demoPassword string) revel.Result {
|
||||||
@@ -59,34 +59,40 @@ func (c AdminSetting) DoDemo(demoUsername, demoPassword string) revel.Result {
|
|||||||
userInfo, err := authService.Login(demoUsername, demoPassword)
|
userInfo, err := authService.Login(demoUsername, demoPassword)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println(err)
|
fmt.Println(err)
|
||||||
return c.RenderJson(info.Re{Ok: false})
|
return c.RenderJSON(info.Re{Ok: false})
|
||||||
}
|
}
|
||||||
if userInfo.UserId == "" {
|
if userInfo.UserId == "" {
|
||||||
re.Msg = "The User is Not Exists"
|
re.Msg = "The User is Not Exists"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "demoUserId", userInfo.UserId.Hex())
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "demoUserId", userInfo.UserId.Hex())
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "demoUsername", demoUsername)
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "demoUsername", demoUsername)
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "demoPassword", demoPassword)
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "demoPassword", demoPassword)
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminSetting) ExportPdf(path string) revel.Result {
|
func (c AdminSetting) ExportPdf(path string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "exportPdfBinPath", path)
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "exportPdfBinPath", path)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c AdminSetting) DoSiteUrl(siteUrl string) revel.Result {
|
||||||
|
re := info.NewRe()
|
||||||
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "siteUrl", siteUrl)
|
||||||
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SubDomain
|
// SubDomain
|
||||||
func (c AdminSetting) SubDomain() revel.Result {
|
func (c AdminSetting) SubDomain() revel.Result {
|
||||||
c.RenderArgs["str"] = configService.GlobalStringConfigs
|
c.ViewArgs["str"] = configService.GlobalStringConfigs
|
||||||
c.RenderArgs["arr"] = configService.GlobalArrayConfigs
|
c.ViewArgs["arr"] = configService.GlobalArrayConfigs
|
||||||
|
|
||||||
c.RenderArgs["noteSubDomain"] = configService.GetGlobalStringConfig("noteSubDomain")
|
c.ViewArgs["noteSubDomain"] = configService.GetGlobalStringConfig("noteSubDomain")
|
||||||
c.RenderArgs["blogSubDomain"] = configService.GetGlobalStringConfig("blogSubDomain")
|
c.ViewArgs["blogSubDomain"] = configService.GetGlobalStringConfig("blogSubDomain")
|
||||||
c.RenderArgs["leaSubDomain"] = configService.GetGlobalStringConfig("leaSubDomain")
|
c.ViewArgs["leaSubDomain"] = configService.GetGlobalStringConfig("leaSubDomain")
|
||||||
|
|
||||||
return c.RenderTemplate("admin/setting/subDomain.html")
|
return c.RenderTemplate("admin/setting/subDomain.html")
|
||||||
}
|
}
|
||||||
@@ -100,13 +106,13 @@ func (c AdminSetting) DoSubDomain(noteSubDomain, blogSubDomain, leaSubDomain, bl
|
|||||||
re.Ok = configService.UpdateGlobalArrayConfig(c.GetUserId(), "blackSubDomains", strings.Split(blackSubDomains, ","))
|
re.Ok = configService.UpdateGlobalArrayConfig(c.GetUserId(), "blackSubDomains", strings.Split(blackSubDomains, ","))
|
||||||
re.Ok = configService.UpdateGlobalArrayConfig(c.GetUserId(), "blackCustomDomains", strings.Split(blackCustomDomains, ","))
|
re.Ok = configService.UpdateGlobalArrayConfig(c.GetUserId(), "blackCustomDomains", strings.Split(blackCustomDomains, ","))
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminSetting) OpenRegister(openRegister string) revel.Result {
|
func (c AdminSetting) OpenRegister(openRegister string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "openRegister", openRegister)
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "openRegister", openRegister)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminSetting) HomePage(homePage string) revel.Result {
|
func (c AdminSetting) HomePage(homePage string) revel.Result {
|
||||||
@@ -115,7 +121,7 @@ func (c AdminSetting) HomePage(homePage string) revel.Result {
|
|||||||
homePage = ""
|
homePage = ""
|
||||||
}
|
}
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "homePage", homePage)
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "homePage", homePage)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminSetting) Mongodb(mongodumpPath, mongorestorePath string) revel.Result {
|
func (c AdminSetting) Mongodb(mongodumpPath, mongorestorePath string) revel.Result {
|
||||||
@@ -123,7 +129,7 @@ func (c AdminSetting) Mongodb(mongodumpPath, mongorestorePath string) revel.Resu
|
|||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "mongodumpPath", mongodumpPath)
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "mongodumpPath", mongodumpPath)
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "mongorestorePath", mongorestorePath)
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "mongorestorePath", mongorestorePath)
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminSetting) UploadSize(uploadImageSize, uploadAvatarSize, uploadBlogLogoSize, uploadAttachSize float64) revel.Result {
|
func (c AdminSetting) UploadSize(uploadImageSize, uploadAvatarSize, uploadBlogLogoSize, uploadAttachSize float64) revel.Result {
|
||||||
@@ -132,5 +138,5 @@ func (c AdminSetting) UploadSize(uploadImageSize, uploadAvatarSize, uploadBlogLo
|
|||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "uploadAvatarSize", fmt.Sprintf("%v", uploadAvatarSize))
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "uploadAvatarSize", fmt.Sprintf("%v", uploadAvatarSize))
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "uploadBlogLogoSize", fmt.Sprintf("%v", uploadBlogLogoSize))
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "uploadBlogLogoSize", fmt.Sprintf("%v", uploadBlogLogoSize))
|
||||||
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "uploadAttachSize", fmt.Sprintf("%v", uploadAttachSize))
|
re.Ok = configService.UpdateGlobalStringConfig(c.GetUserId(), "uploadAttachSize", fmt.Sprintf("%v", uploadAttachSize))
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
@@ -20,11 +20,11 @@ func (c AdminUpgrade) UpgradeBlog() revel.Result {
|
|||||||
func (c AdminUpgrade) UpgradeBetaToBeta2() revel.Result {
|
func (c AdminUpgrade) UpgradeBetaToBeta2() revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok, re.Msg = upgradeService.UpgradeBetaToBeta2(c.GetUserId())
|
re.Ok, re.Msg = upgradeService.UpgradeBetaToBeta2(c.GetUserId())
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminUpgrade) UpgradeBeta3ToBeta4() revel.Result {
|
func (c AdminUpgrade) UpgradeBeta3ToBeta4() revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok, re.Msg = upgradeService.Api(c.GetUserId())
|
re.Ok, re.Msg = upgradeService.Api(c.GetUserId())
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
@@ -18,14 +18,14 @@ var userPageSize = 10
|
|||||||
|
|
||||||
func (c AdminUser) Index(sorter, keywords string, pageSize int) revel.Result {
|
func (c AdminUser) Index(sorter, keywords string, pageSize int) revel.Result {
|
||||||
pageNumber := c.GetPage()
|
pageNumber := c.GetPage()
|
||||||
if userPageSize == 0 {
|
if pageSize == 0 {
|
||||||
pageSize = userPageSize
|
pageSize = userPageSize
|
||||||
}
|
}
|
||||||
sorterField, isAsc := c.getSorter("CreatedTime", false, []string{"email", "username", "verified", "createdTime", "accountType"})
|
sorterField, isAsc := c.getSorter("CreatedTime", false, []string{"email", "username", "verified", "createdTime", "accountType"})
|
||||||
pageInfo, users := userService.ListUsers(pageNumber, pageSize, sorterField, isAsc, keywords)
|
pageInfo, users := userService.ListUsers(pageNumber, pageSize, sorterField, isAsc, keywords)
|
||||||
c.RenderArgs["pageInfo"] = pageInfo
|
c.ViewArgs["pageInfo"] = pageInfo
|
||||||
c.RenderArgs["users"] = users
|
c.ViewArgs["users"] = users
|
||||||
c.RenderArgs["keywords"] = keywords
|
c.ViewArgs["keywords"] = keywords
|
||||||
return c.RenderTemplate("admin/user/list.html")
|
return c.RenderTemplate("admin/user/list.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -53,7 +53,7 @@ func (c AdminUser) Register(email, pwd string) revel.Result {
|
|||||||
// 修改帐户
|
// 修改帐户
|
||||||
func (c AdminUser) ResetPwd(userId string) revel.Result {
|
func (c AdminUser) ResetPwd(userId string) revel.Result {
|
||||||
userInfo := userService.GetUserInfo(userId)
|
userInfo := userService.GetUserInfo(userId)
|
||||||
c.RenderArgs["userInfo"] = userInfo
|
c.ViewArgs["userInfo"] = userInfo
|
||||||
return c.RenderTemplate("admin/user/reset_pwd.html")
|
return c.RenderTemplate("admin/user/reset_pwd.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ func AuthInterceptor(c *revel.Controller) revel.Result {
|
|||||||
if c.Request.Header.Get("X-Requested-With") == "XMLHttpRequest" {
|
if c.Request.Header.Get("X-Requested-With") == "XMLHttpRequest" {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Msg = "NOTLOGIN"
|
re.Msg = "NOTLOGIN"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.Redirect("/login")
|
return c.Redirect("/login")
|
||||||
|
|||||||
@@ -28,12 +28,12 @@ func (c ApiAuth) Login(email, pwd string) revel.Result {
|
|||||||
if err == nil {
|
if err == nil {
|
||||||
token := bson.NewObjectId().Hex()
|
token := bson.NewObjectId().Hex()
|
||||||
sessionService.SetUserId(token, userInfo.UserId.Hex())
|
sessionService.SetUserId(token, userInfo.UserId.Hex())
|
||||||
return c.RenderJson(info.AuthOk{Ok: true, Token: token, UserId: userInfo.UserId, Email: userInfo.Email, Username: userInfo.Username})
|
return c.RenderJSON(info.AuthOk{Ok: true, Token: token, UserId: userInfo.UserId, Email: userInfo.Email, Username: userInfo.Username})
|
||||||
} else {
|
} else {
|
||||||
// 登录错误, 则错误次数++
|
// 登录错误, 则错误次数++
|
||||||
msg = "wrongUsernameOrPassword"
|
msg = "wrongUsernameOrPassword"
|
||||||
}
|
}
|
||||||
return c.RenderJson(info.ApiRe{Ok: false, Msg: c.Message(msg)})
|
return c.RenderJSON(info.ApiRe{Ok: false, Msg: c.Message(msg)})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注销
|
// 注销
|
||||||
@@ -43,7 +43,7 @@ func (c ApiAuth) Logout() revel.Result {
|
|||||||
sessionService.Clear(token)
|
sessionService.Clear(token)
|
||||||
re := info.NewApiRe()
|
re := info.NewApiRe()
|
||||||
re.Ok = true
|
re.Ok = true
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册
|
// 注册
|
||||||
@@ -53,17 +53,17 @@ func (c ApiAuth) Register(email, pwd string) revel.Result {
|
|||||||
re := info.NewApiRe()
|
re := info.NewApiRe()
|
||||||
if !configService.IsOpenRegister() {
|
if !configService.IsOpenRegister() {
|
||||||
re.Msg = "notOpenRegister" // 未开放注册
|
re.Msg = "notOpenRegister" // 未开放注册
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
if re.Ok, re.Msg = Vd("email", email); !re.Ok {
|
if re.Ok, re.Msg = Vd("email", email); !re.Ok {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册
|
// 注册
|
||||||
re.Ok, re.Msg = authService.Register(email, pwd, "")
|
re.Ok, re.Msg = authService.Register(email, pwd, "")
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
@@ -142,10 +142,10 @@ func (c ApiBaseContrller) upload(name string, noteId string, isAttach bool) (ok
|
|||||||
// 生成新的文件名
|
// 生成新的文件名
|
||||||
filename := handel.Filename
|
filename := handel.Filename
|
||||||
_, ext := SplitFilename(filename)
|
_, ext := SplitFilename(filename)
|
||||||
if ext != ".gif" && ext != ".jpg" && ext != ".png" && ext != ".bmp" && ext != ".jpeg" {
|
// if ext != ".gif" && ext != ".jpg" && ext != ".png" && ext != ".bmp" && ext != ".jpeg" {
|
||||||
msg = "notImage"
|
// msg = "notImage"
|
||||||
return
|
// return
|
||||||
}
|
// }
|
||||||
|
|
||||||
filename = newGuid + ext
|
filename = newGuid + ext
|
||||||
data, err := ioutil.ReadAll(file)
|
data, err := ioutil.ReadAll(file)
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ func (c ApiFile) CopyImage(userId, fileId, toUserId string) revel.Result {
|
|||||||
|
|
||||||
re.Ok, re.Id = fileService.CopyImage(userId, fileId, toUserId)
|
re.Ok, re.Id = fileService.CopyImage(userId, fileId, toUserId)
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// get all images by userId with page
|
// get all images by userId with page
|
||||||
@@ -39,19 +39,19 @@ func (c ApiFile) GetImages(albumId, key string, page int) revel.Result {
|
|||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = true
|
re.Ok = true
|
||||||
re.Item = imagesPage
|
re.Item = imagesPage
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c ApiFile) UpdateImageTitle(fileId, title string) revel.Result {
|
func (c ApiFile) UpdateImageTitle(fileId, title string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = fileService.UpdateImageTitle(c.getUserId(), fileId, title)
|
re.Ok = fileService.UpdateImageTitle(c.getUserId(), fileId, title)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c ApiFile) DeleteImage(fileId string) revel.Result {
|
func (c ApiFile) DeleteImage(fileId string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok, re.Msg = fileService.DeleteImage(c.getUserId(), fileId)
|
re.Ok, re.Msg = fileService.DeleteImage(c.getUserId(), fileId)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -8,8 +8,9 @@ import (
|
|||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
// "strings"
|
||||||
"time"
|
"time"
|
||||||
|
"regexp"
|
||||||
// "github.com/leanote/leanote/app/types"
|
// "github.com/leanote/leanote/app/types"
|
||||||
// "io/ioutil"
|
// "io/ioutil"
|
||||||
// "fmt"
|
// "fmt"
|
||||||
@@ -51,7 +52,7 @@ func (c ApiNote) GetSyncNotes(afterUsn, maxEntry int) revel.Result {
|
|||||||
maxEntry = 100
|
maxEntry = 100
|
||||||
}
|
}
|
||||||
notes := noteService.GetSyncNotes(c.getUserId(), afterUsn, maxEntry)
|
notes := noteService.GetSyncNotes(c.getUserId(), afterUsn, maxEntry)
|
||||||
return c.RenderJson(notes)
|
return c.RenderJSON(notes)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到笔记本下的笔记
|
// 得到笔记本下的笔记
|
||||||
@@ -60,17 +61,17 @@ func (c ApiNote) GetNotes(notebookId string) revel.Result {
|
|||||||
if notebookId != "" && !bson.IsObjectIdHex(notebookId) {
|
if notebookId != "" && !bson.IsObjectIdHex(notebookId) {
|
||||||
re := info.NewApiRe()
|
re := info.NewApiRe()
|
||||||
re.Msg = "notebookIdInvalid"
|
re.Msg = "notebookIdInvalid"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
_, notes := noteService.ListNotes(c.getUserId(), notebookId, false, c.GetPage(), pageSize, defaultSortField, false, false)
|
_, notes := noteService.ListNotes(c.getUserId(), notebookId, false, c.GetPage(), pageSize, defaultSortField, false, false)
|
||||||
return c.RenderJson(noteService.ToApiNotes(notes))
|
return c.RenderJSON(noteService.ToApiNotes(notes))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到trash
|
// 得到trash
|
||||||
// [OK]
|
// [OK]
|
||||||
func (c ApiNote) GetTrashNotes() revel.Result {
|
func (c ApiNote) GetTrashNotes() revel.Result {
|
||||||
_, notes := noteService.ListNotes(c.getUserId(), "", true, c.GetPage(), pageSize, defaultSortField, false, false)
|
_, notes := noteService.ListNotes(c.getUserId(), "", true, c.GetPage(), pageSize, defaultSortField, false, false)
|
||||||
return c.RenderJson(noteService.ToApiNotes(notes))
|
return c.RenderJSON(noteService.ToApiNotes(notes))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -126,17 +127,17 @@ func (c ApiNote) GetNote(noteId string) revel.Result {
|
|||||||
if !bson.IsObjectIdHex(noteId) {
|
if !bson.IsObjectIdHex(noteId) {
|
||||||
re := info.NewApiRe()
|
re := info.NewApiRe()
|
||||||
re.Msg = "noteIdInvalid"
|
re.Msg = "noteIdInvalid"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
note := noteService.GetNote(noteId, c.getUserId())
|
note := noteService.GetNote(noteId, c.getUserId())
|
||||||
if note.NoteId == "" {
|
if note.NoteId == "" {
|
||||||
re := info.NewApiRe()
|
re := info.NewApiRe()
|
||||||
re.Msg = "notExists"
|
re.Msg = "notExists"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
apiNotes := noteService.ToApiNotes([]info.Note{note})
|
apiNotes := noteService.ToApiNotes([]info.Note{note})
|
||||||
return c.RenderJson(apiNotes[0])
|
return c.RenderJSON(apiNotes[0])
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到note和内容
|
// 得到note和内容
|
||||||
@@ -147,7 +148,7 @@ func (c ApiNote) GetNoteAndContent(noteId string) revel.Result {
|
|||||||
apiNotes := noteService.ToApiNotes([]info.Note{noteAndContent.Note})
|
apiNotes := noteService.ToApiNotes([]info.Note{noteAndContent.Note})
|
||||||
apiNote := apiNotes[0]
|
apiNote := apiNotes[0]
|
||||||
apiNote.Content = noteService.FixContent(noteAndContent.Content, noteAndContent.IsMarkdown)
|
apiNote.Content = noteService.FixContent(noteAndContent.Content, noteAndContent.IsMarkdown)
|
||||||
return c.RenderJson(apiNote)
|
return c.RenderJSON(apiNote)
|
||||||
}
|
}
|
||||||
|
|
||||||
// content里的image, attach链接是
|
// content里的image, attach链接是
|
||||||
@@ -158,11 +159,33 @@ func (c ApiNote) fixPostNotecontent(noteOrContent *info.ApiNote) {
|
|||||||
if noteOrContent.Content == "" {
|
if noteOrContent.Content == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
files := noteOrContent.Files
|
files := noteOrContent.Files
|
||||||
if files != nil && len(files) > 0 {
|
if files != nil && len(files) > 0 {
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
if file.LocalFileId != "" {
|
if file.LocalFileId != "" {
|
||||||
noteOrContent.Content = strings.Replace(noteOrContent.Content, "fileId="+file.LocalFileId, "fileId="+file.FileId, -1)
|
LogJ(file)
|
||||||
|
if !file.IsAttach {
|
||||||
|
// <img src="https://"
|
||||||
|
// 
|
||||||
|
reg, _ := regexp.Compile(`https*://[^/]*?/api/file/getImage\?fileId=`+file.LocalFileId)
|
||||||
|
// Log(reg)
|
||||||
|
noteOrContent.Content = reg.ReplaceAllString(noteOrContent.Content, `/api/file/getImage?fileId=`+file.FileId)
|
||||||
|
|
||||||
|
// // "http://a.com/api/file/getImage?fileId=localId" => /api/file/getImage?fileId=serverId
|
||||||
|
// noteOrContent.Content = strings.Replace(noteOrContent.Content,
|
||||||
|
// baseUrl + "/api/file/getImage?fileId="+file.LocalFileId,
|
||||||
|
// "/api/file/getImage?fileId="+file.FileId, -1)
|
||||||
|
} else {
|
||||||
|
reg, _ := regexp.Compile(`https*://[^/]*?/api/file/getAttach\?fileId=`+file.LocalFileId)
|
||||||
|
Log(reg)
|
||||||
|
noteOrContent.Content = reg.ReplaceAllString(noteOrContent.Content, `/api/file/getAttach?fileId=`+file.FileId)
|
||||||
|
/*
|
||||||
|
noteOrContent.Content = strings.Replace(noteOrContent.Content,
|
||||||
|
baseUrl + "/api/file/getAttach?fileId="+file.LocalFileId,
|
||||||
|
"/api/file/getAttach?fileId="+file.FileId, -1)
|
||||||
|
*/
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -184,7 +207,7 @@ func (c ApiNote) GetNoteContent(noteId string) revel.Result {
|
|||||||
Content: noteContent.Content,
|
Content: noteContent.Content,
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.RenderJson(apiNoteContent)
|
return c.RenderJSON(apiNoteContent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加笔记
|
// 添加笔记
|
||||||
@@ -210,10 +233,10 @@ func (c ApiNote) AddNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
LogJ(file)
|
LogJ(file)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
// return c.RenderJson(re)
|
// return c.RenderJSON(re)
|
||||||
if noteOrContent.NotebookId == "" || !bson.IsObjectIdHex(noteOrContent.NotebookId) {
|
if noteOrContent.NotebookId == "" || !bson.IsObjectIdHex(noteOrContent.NotebookId) {
|
||||||
re.Msg = "notebookIdNotExists"
|
re.Msg = "notebookIdNotExists"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
noteId := bson.NewObjectId()
|
noteId := bson.NewObjectId()
|
||||||
@@ -236,7 +259,7 @@ func (c ApiNote) AddNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
}
|
}
|
||||||
// 报不是图片的错误没关系, 证明客户端传来非图片的数据
|
// 报不是图片的错误没关系, 证明客户端传来非图片的数据
|
||||||
if msg != "notImage" {
|
if msg != "notImage" {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 建立映射
|
// 建立映射
|
||||||
@@ -248,7 +271,7 @@ func (c ApiNote) AddNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -259,7 +282,7 @@ func (c ApiNote) AddNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
// Log("Add")
|
// Log("Add")
|
||||||
// LogJ(noteOrContent)
|
// LogJ(noteOrContent)
|
||||||
|
|
||||||
// return c.RenderJson(re)
|
// return c.RenderJSON(re)
|
||||||
|
|
||||||
note := info.Note{UserId: userId,
|
note := info.Note{UserId: userId,
|
||||||
NoteId: noteId,
|
NoteId: noteId,
|
||||||
@@ -295,7 +318,7 @@ func (c ApiNote) AddNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
|
|
||||||
if note.NoteId == "" {
|
if note.NoteId == "" {
|
||||||
re.Ok = false
|
re.Ok = false
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加需要返回的
|
// 添加需要返回的
|
||||||
@@ -309,7 +332,7 @@ func (c ApiNote) AddNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
noteOrContent.Content = ""
|
noteOrContent.Content = ""
|
||||||
noteOrContent.Abstract = ""
|
noteOrContent.Abstract = ""
|
||||||
// apiNote := info.NoteToApiNote(note, noteOrContent.Files)
|
// apiNote := info.NoteToApiNote(note, noteOrContent.Files)
|
||||||
return c.RenderJson(noteOrContent)
|
return c.RenderJSON(noteOrContent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新笔记
|
// 更新笔记
|
||||||
@@ -324,12 +347,12 @@ func (c ApiNote) UpdateNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
|
|
||||||
if noteOrContent.NoteId == "" {
|
if noteOrContent.NoteId == "" {
|
||||||
re.Msg = "noteIdNotExists"
|
re.Msg = "noteIdNotExists"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
if noteOrContent.Usn <= 0 {
|
if noteOrContent.Usn <= 0 {
|
||||||
re.Msg = "usnNotExists"
|
re.Msg = "usnNotExists"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log("_____________")
|
// Log("_____________")
|
||||||
@@ -345,13 +368,14 @@ func (c ApiNote) UpdateNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
note := noteService.GetNote(noteId, userId)
|
note := noteService.GetNote(noteId, userId)
|
||||||
if note.NoteId == "" {
|
if note.NoteId == "" {
|
||||||
re.Msg = "notExists"
|
re.Msg = "notExists"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
if note.Usn != noteOrContent.Usn {
|
if note.Usn != noteOrContent.Usn {
|
||||||
re.Msg = "conflict"
|
re.Msg = "conflict"
|
||||||
Log("conflict")
|
Log("conflict")
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
Log("没有冲突")
|
||||||
|
|
||||||
// 如果传了files
|
// 如果传了files
|
||||||
// TODO 测试
|
// TODO 测试
|
||||||
@@ -378,14 +402,14 @@ func (c ApiNote) UpdateNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
} else {
|
} else {
|
||||||
re.Msg = msg
|
re.Msg = msg
|
||||||
}
|
}
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
} else {
|
} else {
|
||||||
// 建立映射
|
// 建立映射
|
||||||
file.FileId = fileId
|
file.FileId = fileId
|
||||||
noteOrContent.Files[i] = file
|
noteOrContent.Files[i] = file
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -466,7 +490,7 @@ func (c ApiNote) UpdateNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
if !noteOk {
|
if !noteOk {
|
||||||
re.Ok = false
|
re.Ok = false
|
||||||
re.Msg = noteMsg
|
re.Msg = noteMsg
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -504,7 +528,7 @@ func (c ApiNote) UpdateNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if !re.Ok {
|
if !re.Ok {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
noteOrContent.Content = ""
|
noteOrContent.Content = ""
|
||||||
@@ -515,14 +539,14 @@ func (c ApiNote) UpdateNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
// LogJ(noteOrContent.Files)
|
// LogJ(noteOrContent.Files)
|
||||||
noteOrContent.UserId = c.getUserId()
|
noteOrContent.UserId = c.getUserId()
|
||||||
|
|
||||||
return c.RenderJson(noteOrContent)
|
return c.RenderJSON(noteOrContent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除trash
|
// 删除trash
|
||||||
func (c ApiNote) DeleteTrash(noteId string, usn int) revel.Result {
|
func (c ApiNote) DeleteTrash(noteId string, usn int) revel.Result {
|
||||||
re := info.NewReUpdate()
|
re := info.NewReUpdate()
|
||||||
re.Ok, re.Msg, re.Usn = trashService.DeleteTrashApi(noteId, c.getUserId(), usn)
|
re.Ok, re.Msg, re.Usn = trashService.DeleteTrashApi(noteId, c.getUserId(), usn)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到历史列表
|
// 得到历史列表
|
||||||
@@ -534,7 +558,7 @@ func (c ApiNote) GetHistories(noteId string) revel.Result {
|
|||||||
re.Ok = true
|
re.Ok = true
|
||||||
re.Item = histories
|
re.Item = histories
|
||||||
}
|
}
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
@@ -545,13 +569,13 @@ func (c ApiNote) ExportPdf(noteId string) revel.Result {
|
|||||||
userId := c.getUserId()
|
userId := c.getUserId()
|
||||||
if noteId == "" {
|
if noteId == "" {
|
||||||
re.Msg = "noteNotExists"
|
re.Msg = "noteNotExists"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
note := noteService.GetNoteById(noteId)
|
note := noteService.GetNoteById(noteId)
|
||||||
if note.NoteId == "" {
|
if note.NoteId == "" {
|
||||||
re.Msg = "noteNotExists"
|
re.Msg = "noteNotExists"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
noteUserId := note.UserId.Hex()
|
noteUserId := note.UserId.Hex()
|
||||||
@@ -560,7 +584,7 @@ func (c ApiNote) ExportPdf(noteId string) revel.Result {
|
|||||||
// 是否是有权限协作的
|
// 是否是有权限协作的
|
||||||
if !note.IsBlog && !shareService.HasReadPerm(noteUserId, userId, noteId) {
|
if !note.IsBlog && !shareService.HasReadPerm(noteUserId, userId, noteId) {
|
||||||
re.Msg = "noteNotExists"
|
re.Msg = "noteNotExists"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -570,7 +594,7 @@ func (c ApiNote) ExportPdf(noteId string) revel.Result {
|
|||||||
dir := revel.BasePath + "/" + fileUrlPath
|
dir := revel.BasePath + "/" + fileUrlPath
|
||||||
if !MkdirAll(dir) {
|
if !MkdirAll(dir) {
|
||||||
re.Msg = "noDir"
|
re.Msg = "noDir"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
filename := guid + ".pdf"
|
filename := guid + ".pdf"
|
||||||
path := dir + "/" + filename
|
path := dir + "/" + filename
|
||||||
@@ -599,12 +623,12 @@ func (c ApiNote) ExportPdf(noteId string) revel.Result {
|
|||||||
_, err := cmd.Output()
|
_, err := cmd.Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
re.Msg = "sysError"
|
re.Msg = "sysError"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
file, err := os.Open(path)
|
file, err := os.Open(path)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
re.Msg = "sysError"
|
re.Msg = "sysError"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
filenameReturn := note.Title
|
filenameReturn := note.Title
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ func (c ApiNotebook) GetSyncNotebooks(afterUsn, maxEntry int) revel.Result {
|
|||||||
maxEntry = 100
|
maxEntry = 100
|
||||||
}
|
}
|
||||||
notebooks := notebookService.GeSyncNotebooks(c.getUserId(), afterUsn, maxEntry)
|
notebooks := notebookService.GeSyncNotebooks(c.getUserId(), afterUsn, maxEntry)
|
||||||
return c.RenderJson(c.fixNotebooks(notebooks))
|
return c.RenderJSON(c.fixNotebooks(notebooks))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到用户的所有笔记本
|
// 得到用户的所有笔记本
|
||||||
@@ -61,7 +61,7 @@ func (c ApiNotebook) GetSyncNotebooks(afterUsn, maxEntry int) revel.Result {
|
|||||||
// info.SubNotebooks
|
// info.SubNotebooks
|
||||||
func (c ApiNotebook) GetNotebooks() revel.Result {
|
func (c ApiNotebook) GetNotebooks() revel.Result {
|
||||||
notebooks := notebookService.GeSyncNotebooks(c.getUserId(), 0, 99999)
|
notebooks := notebookService.GeSyncNotebooks(c.getUserId(), 0, 99999)
|
||||||
return c.RenderJson(c.fixNotebooks(notebooks))
|
return c.RenderJSON(c.fixNotebooks(notebooks))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加notebook
|
// 添加notebook
|
||||||
@@ -77,9 +77,9 @@ func (c ApiNotebook) AddNotebook(title, parentNotebookId string, seq int) revel.
|
|||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok, notebook = notebookService.AddNotebook(notebook)
|
re.Ok, notebook = notebookService.AddNotebook(notebook)
|
||||||
if !re.Ok {
|
if !re.Ok {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
return c.RenderJson(c.fixNotebook(¬ebook))
|
return c.RenderJSON(c.fixNotebook(¬ebook))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改笔记
|
// 修改笔记
|
||||||
@@ -91,10 +91,10 @@ func (c ApiNotebook) UpdateNotebook(notebookId, title, parentNotebookId string,
|
|||||||
if !ok {
|
if !ok {
|
||||||
re.Ok = false
|
re.Ok = false
|
||||||
re.Msg = msg
|
re.Msg = msg
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
LogJ(notebook)
|
LogJ(notebook)
|
||||||
return c.RenderJson(c.fixNotebook(¬ebook))
|
return c.RenderJSON(c.fixNotebook(¬ebook))
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除笔记本
|
// 删除笔记本
|
||||||
@@ -102,5 +102,5 @@ func (c ApiNotebook) UpdateNotebook(notebookId, title, parentNotebookId string,
|
|||||||
func (c ApiNotebook) DeleteNotebook(notebookId string, usn int) revel.Result {
|
func (c ApiNotebook) DeleteNotebook(notebookId string, usn int) revel.Result {
|
||||||
re := info.NewApiRe()
|
re := info.NewApiRe()
|
||||||
re.Ok, re.Msg = notebookService.DeleteNotebookForce(c.getUserId(), notebookId, usn)
|
re.Ok, re.Msg = notebookService.DeleteNotebookForce(c.getUserId(), notebookId, usn)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
@@ -23,7 +23,7 @@ func (c ApiTag) GetSyncTags(afterUsn, maxEntry int) revel.Result {
|
|||||||
maxEntry = 100
|
maxEntry = 100
|
||||||
}
|
}
|
||||||
tags := tagService.GeSyncTags(c.getUserId(), afterUsn, maxEntry)
|
tags := tagService.GeSyncTags(c.getUserId(), afterUsn, maxEntry)
|
||||||
return c.RenderJson(tags)
|
return c.RenderJSON(tags)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加Tag
|
// 添加Tag
|
||||||
@@ -44,7 +44,7 @@ func (c ApiTag) GetSyncTags(afterUsn, maxEntry int) revel.Result {
|
|||||||
*/
|
*/
|
||||||
func (c ApiTag) AddTag(tag string) revel.Result {
|
func (c ApiTag) AddTag(tag string) revel.Result {
|
||||||
ret := tagService.AddOrUpdateTag(c.getUserId(), tag)
|
ret := tagService.AddOrUpdateTag(c.getUserId(), tag)
|
||||||
return c.RenderJson(ret)
|
return c.RenderJSON(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除标签
|
// 删除标签
|
||||||
@@ -52,5 +52,5 @@ func (c ApiTag) AddTag(tag string) revel.Result {
|
|||||||
func (c ApiTag) DeleteTag(tag string, usn int) revel.Result {
|
func (c ApiTag) DeleteTag(tag string, usn int) revel.Result {
|
||||||
re := info.NewReUpdate()
|
re := info.NewReUpdate()
|
||||||
re.Ok, re.Msg, re.Usn = tagService.DeleteTagApi(c.getUserId(), tag, usn)
|
re.Ok, re.Msg, re.Usn = tagService.DeleteTagApi(c.getUserId(), tag, usn)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
@@ -28,7 +28,7 @@ func (c ApiUser) Info() revel.Result {
|
|||||||
|
|
||||||
userInfo := c.getUserInfo()
|
userInfo := c.getUserInfo()
|
||||||
if userInfo.UserId == "" {
|
if userInfo.UserId == "" {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
apiUser := info.ApiUser{
|
apiUser := info.ApiUser{
|
||||||
UserId: userInfo.UserId.Hex(),
|
UserId: userInfo.UserId.Hex(),
|
||||||
@@ -37,7 +37,7 @@ func (c ApiUser) Info() revel.Result {
|
|||||||
Logo: userInfo.Logo,
|
Logo: userInfo.Logo,
|
||||||
Verified: userInfo.Verified,
|
Verified: userInfo.Verified,
|
||||||
}
|
}
|
||||||
return c.RenderJson(apiUser)
|
return c.RenderJSON(apiUser)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改用户名
|
// 修改用户名
|
||||||
@@ -46,15 +46,15 @@ func (c ApiUser) UpdateUsername(username string) revel.Result {
|
|||||||
re := info.NewApiRe()
|
re := info.NewApiRe()
|
||||||
if c.GetUsername() == "demo" {
|
if c.GetUsername() == "demo" {
|
||||||
re.Msg = "cannotUpdateDemo"
|
re.Msg = "cannotUpdateDemo"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
if re.Ok, re.Msg = Vd("username", username); !re.Ok {
|
if re.Ok, re.Msg = Vd("username", username); !re.Ok {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
re.Ok, re.Msg = userService.UpdateUsername(c.getUserId(), username)
|
re.Ok, re.Msg = userService.UpdateUsername(c.getUserId(), username)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改密码
|
// 修改密码
|
||||||
@@ -63,23 +63,23 @@ func (c ApiUser) UpdatePwd(oldPwd, pwd string) revel.Result {
|
|||||||
re := info.NewApiRe()
|
re := info.NewApiRe()
|
||||||
if c.GetUsername() == "demo" {
|
if c.GetUsername() == "demo" {
|
||||||
re.Msg = "cannotUpdateDemo"
|
re.Msg = "cannotUpdateDemo"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
if re.Ok, re.Msg = Vd("password", oldPwd); !re.Ok {
|
if re.Ok, re.Msg = Vd("password", oldPwd); !re.Ok {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
re.Ok, re.Msg = userService.UpdatePwd(c.getUserId(), oldPwd, pwd)
|
re.Ok, re.Msg = userService.UpdatePwd(c.getUserId(), oldPwd, pwd)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获得同步状态
|
// 获得同步状态
|
||||||
// [OK]
|
// [OK]
|
||||||
func (c ApiUser) GetSyncState() revel.Result {
|
func (c ApiUser) GetSyncState() revel.Result {
|
||||||
ret := bson.M{"LastSyncUsn": userService.GetUsn(c.getUserId()), "LastSyncTime": time.Now().Unix()}
|
ret := bson.M{"LastSyncUsn": userService.GetUsn(c.getUserId()), "LastSyncTime": time.Now().Unix()}
|
||||||
return c.RenderJson(ret)
|
return c.RenderJSON(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 头像设置
|
// 头像设置
|
||||||
@@ -91,11 +91,11 @@ func (c ApiUser) UpdateLogo() revel.Result {
|
|||||||
|
|
||||||
if ok {
|
if ok {
|
||||||
ok = userService.UpdateAvatar(c.getUserId(), url)
|
ok = userService.UpdateAvatar(c.getUserId(), url)
|
||||||
return c.RenderJson(map[string]string{"Logo": url})
|
return c.RenderJSON(map[string]string{"Logo": url})
|
||||||
} else {
|
} else {
|
||||||
re := info.NewApiRe()
|
re := info.NewApiRe()
|
||||||
re.Msg = msg
|
re.Msg = msg
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -75,7 +75,7 @@ func AuthInterceptor(c *revel.Controller) revel.Result {
|
|||||||
noToken := false
|
noToken := false
|
||||||
if token == "" {
|
if token == "" {
|
||||||
// 若无, 则取sessionId
|
// 若无, 则取sessionId
|
||||||
token = c.Session.Id()
|
token = c.Session.ID()
|
||||||
noToken = true
|
noToken = true
|
||||||
}
|
}
|
||||||
c.Session["_token"] = token
|
c.Session["_token"] = token
|
||||||
@@ -106,7 +106,7 @@ func AuthInterceptor(c *revel.Controller) revel.Result {
|
|||||||
// 没有登录, 返回错误的信息, 需要登录
|
// 没有登录, 返回错误的信息, 需要登录
|
||||||
re := info.NewApiRe()
|
re := info.NewApiRe()
|
||||||
re.Msg = "NOTLOGIN"
|
re.Msg = "NOTLOGIN"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
|
|||||||
@@ -103,7 +103,7 @@ func AuthInterceptor(c *revel.Controller) revel.Result {
|
|||||||
if c.Request.Header.Get("X-Requested-With") == "XMLHttpRequest" {
|
if c.Request.Header.Get("X-Requested-With") == "XMLHttpRequest" {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Msg = "NOTLOGIN"
|
re.Msg = "NOTLOGIN"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.Redirect("/login")
|
return c.Redirect("/login")
|
||||||
|
|||||||
@@ -46,7 +46,7 @@ func (c MemberBaseController) getSorter(sorterField string, isAsc bool, okSorter
|
|||||||
} else {
|
} else {
|
||||||
isAsc = false
|
isAsc = false
|
||||||
}
|
}
|
||||||
c.RenderArgs["sorter"] = sorter
|
c.ViewArgs["sorter"] = sorter
|
||||||
return sorterField, isAsc
|
return sorterField, isAsc
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,13 +21,13 @@ type MemberBlog struct {
|
|||||||
func (c MemberBlog) common() info.UserBlog {
|
func (c MemberBlog) common() info.UserBlog {
|
||||||
userId := c.GetUserId()
|
userId := c.GetUserId()
|
||||||
userInfo := userService.GetUserInfo(userId)
|
userInfo := userService.GetUserInfo(userId)
|
||||||
c.RenderArgs["userInfo"] = userInfo
|
c.ViewArgs["userInfo"] = userInfo
|
||||||
|
|
||||||
// 得到博客设置信息
|
// 得到博客设置信息
|
||||||
c.RenderArgs["allowCustomDomain"] = configService.GetGlobalStringConfig("allowCustomDomain")
|
c.ViewArgs["allowCustomDomain"] = configService.GetGlobalStringConfig("allowCustomDomain")
|
||||||
|
|
||||||
userBlog := blogService.GetUserBlog(userId)
|
userBlog := blogService.GetUserBlog(userId)
|
||||||
c.RenderArgs["userBlog"] = userBlog
|
c.ViewArgs["userBlog"] = userBlog
|
||||||
|
|
||||||
c.SetUserInfo()
|
c.SetUserInfo()
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
@@ -62,7 +62,7 @@ func (c MemberBlog) getSorter(sorterField string, isAsc bool, okSorter []string)
|
|||||||
} else {
|
} else {
|
||||||
isAsc = false
|
isAsc = false
|
||||||
}
|
}
|
||||||
c.RenderArgs["sorter"] = sorter
|
c.ViewArgs["sorter"] = sorter
|
||||||
return sorterField, isAsc
|
return sorterField, isAsc
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -72,18 +72,18 @@ var userPageSize = 15
|
|||||||
func (c MemberBlog) Index(sorter, keywords string) revel.Result {
|
func (c MemberBlog) Index(sorter, keywords string) revel.Result {
|
||||||
userId := c.GetUserId()
|
userId := c.GetUserId()
|
||||||
userInfo := userService.GetUserInfo(userId)
|
userInfo := userService.GetUserInfo(userId)
|
||||||
c.RenderArgs["userInfo"] = userInfo
|
c.ViewArgs["userInfo"] = userInfo
|
||||||
|
|
||||||
c.RenderArgs["title"] = c.Message("Posts")
|
c.ViewArgs["title"] = c.Message("Posts")
|
||||||
pageNumber := c.GetPage()
|
pageNumber := c.GetPage()
|
||||||
sorterField, isAsc := c.getSorter("CreatedTime", false, []string{"title", "urlTitle", "updatedTime", "publicTime", "createdTime"})
|
sorterField, isAsc := c.getSorter("CreatedTime", false, []string{"title", "urlTitle", "updatedTime", "publicTime", "createdTime"})
|
||||||
pageInfo, blogs := blogService.ListAllBlogs(c.GetUserId(), "", keywords, false, pageNumber, userPageSize, sorterField, isAsc)
|
pageInfo, blogs := blogService.ListAllBlogs(c.GetUserId(), "", keywords, false, pageNumber, userPageSize, sorterField, isAsc)
|
||||||
c.RenderArgs["pageInfo"] = pageInfo
|
c.ViewArgs["pageInfo"] = pageInfo
|
||||||
c.RenderArgs["blogs"] = blogs
|
c.ViewArgs["blogs"] = blogs
|
||||||
c.RenderArgs["keywords"] = keywords
|
c.ViewArgs["keywords"] = keywords
|
||||||
|
|
||||||
userAndBlog := userService.GetUserAndBlog(c.GetUserId())
|
userAndBlog := userService.GetUserAndBlog(c.GetUserId())
|
||||||
c.RenderArgs["userAndBlog"] = userAndBlog
|
c.ViewArgs["userAndBlog"] = userAndBlog
|
||||||
|
|
||||||
c.common()
|
c.common()
|
||||||
|
|
||||||
@@ -94,48 +94,48 @@ func (c MemberBlog) Index(sorter, keywords string) revel.Result {
|
|||||||
func (c MemberBlog) UpdateBlogUrlTitle(noteId, urlTitle string) revel.Result {
|
func (c MemberBlog) UpdateBlogUrlTitle(noteId, urlTitle string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok, re.Item = blogService.UpateBlogUrlTitle(c.GetUserId(), noteId, urlTitle)
|
re.Ok, re.Item = blogService.UpateBlogUrlTitle(c.GetUserId(), noteId, urlTitle)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改笔记的urlTitle
|
// 修改笔记的urlTitle
|
||||||
func (c MemberBlog) UpdateBlogAbstract(noteId string) revel.Result {
|
func (c MemberBlog) UpdateBlogAbstract(noteId string) revel.Result {
|
||||||
c.common()
|
c.common()
|
||||||
c.RenderArgs["title"] = c.Message("Update Post Abstract")
|
c.ViewArgs["title"] = c.Message("Update Post Abstract")
|
||||||
note := noteService.GetNoteAndContent(noteId, c.GetUserId())
|
note := noteService.GetNoteAndContent(noteId, c.GetUserId())
|
||||||
if !note.Note.IsBlog {
|
if !note.Note.IsBlog {
|
||||||
return c.E404()
|
return c.E404()
|
||||||
}
|
}
|
||||||
c.RenderArgs["note"] = note
|
c.ViewArgs["note"] = note
|
||||||
c.RenderArgs["noteId"] = noteId
|
c.ViewArgs["noteId"] = noteId
|
||||||
return c.RenderTemplate("member/blog/update_abstract.html")
|
return c.RenderTemplate("member/blog/update_abstract.html")
|
||||||
}
|
}
|
||||||
func (c MemberBlog) DoUpdateBlogAbstract(noteId, imgSrc, desc, abstract string) revel.Result {
|
func (c MemberBlog) DoUpdateBlogAbstract(noteId, imgSrc, desc, abstract string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = blogService.UpateBlogAbstract(c.GetUserId(), noteId, imgSrc, desc, abstract)
|
re.Ok = blogService.UpateBlogAbstract(c.GetUserId(), noteId, imgSrc, desc, abstract)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 基本信息设置
|
// 基本信息设置
|
||||||
func (c MemberBlog) Base() revel.Result {
|
func (c MemberBlog) Base() revel.Result {
|
||||||
c.common()
|
c.common()
|
||||||
c.RenderArgs["title"] = c.Message("Blog Base Info")
|
c.ViewArgs["title"] = c.Message("Blog Base Info")
|
||||||
return c.RenderTemplate("member/blog/base.html")
|
return c.RenderTemplate("member/blog/base.html")
|
||||||
}
|
}
|
||||||
func (c MemberBlog) Comment() revel.Result {
|
func (c MemberBlog) Comment() revel.Result {
|
||||||
c.common()
|
c.common()
|
||||||
c.RenderArgs["title"] = c.Message("Comment")
|
c.ViewArgs["title"] = c.Message("Comment")
|
||||||
return c.RenderTemplate("member/blog/comment.html")
|
return c.RenderTemplate("member/blog/comment.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberBlog) Paging() revel.Result {
|
func (c MemberBlog) Paging() revel.Result {
|
||||||
c.common()
|
c.common()
|
||||||
c.RenderArgs["title"] = c.Message("Paging")
|
c.ViewArgs["title"] = c.Message("Paging")
|
||||||
return c.RenderTemplate("member/blog/paging.html")
|
return c.RenderTemplate("member/blog/paging.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberBlog) Cate() revel.Result {
|
func (c MemberBlog) Cate() revel.Result {
|
||||||
userBlog := c.common()
|
userBlog := c.common()
|
||||||
c.RenderArgs["title"] = c.Message("Category")
|
c.ViewArgs["title"] = c.Message("Category")
|
||||||
|
|
||||||
notebooks := blogService.ListBlogNotebooks(c.GetUserId())
|
notebooks := blogService.ListBlogNotebooks(c.GetUserId())
|
||||||
notebooksMap := map[string]info.Notebook{}
|
notebooksMap := map[string]info.Notebook{}
|
||||||
@@ -166,7 +166,7 @@ func (c MemberBlog) Cate() revel.Result {
|
|||||||
i++
|
i++
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
c.RenderArgs["notebooks"] = notebooks2
|
c.ViewArgs["notebooks"] = notebooks2
|
||||||
|
|
||||||
return c.RenderTemplate("member/blog/cate.html")
|
return c.RenderTemplate("member/blog/cate.html")
|
||||||
}
|
}
|
||||||
@@ -175,54 +175,54 @@ func (c MemberBlog) Cate() revel.Result {
|
|||||||
func (c MemberBlog) UpateCateIds(cateIds []string) revel.Result {
|
func (c MemberBlog) UpateCateIds(cateIds []string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = blogService.UpateCateIds(c.GetUserId(), cateIds)
|
re.Ok = blogService.UpateCateIds(c.GetUserId(), cateIds)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberBlog) UpdateCateUrlTitle(cateId, urlTitle string) revel.Result {
|
func (c MemberBlog) UpdateCateUrlTitle(cateId, urlTitle string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok, re.Item = blogService.UpateCateUrlTitle(c.GetUserId(), cateId, urlTitle)
|
re.Ok, re.Item = blogService.UpateCateUrlTitle(c.GetUserId(), cateId, urlTitle)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 保存之, 包含增加与保存
|
// 保存之, 包含增加与保存
|
||||||
func (c MemberBlog) DoAddOrUpdateSingle(singleId, title, content string) revel.Result {
|
func (c MemberBlog) DoAddOrUpdateSingle(singleId, title, content string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = blogService.AddOrUpdateSingle(c.GetUserId(), singleId, title, content)
|
re.Ok = blogService.AddOrUpdateSingle(c.GetUserId(), singleId, title, content)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
func (c MemberBlog) AddOrUpdateSingle(singleId string) revel.Result {
|
func (c MemberBlog) AddOrUpdateSingle(singleId string) revel.Result {
|
||||||
c.common()
|
c.common()
|
||||||
c.RenderArgs["title"] = c.Message("Add Single")
|
c.ViewArgs["title"] = c.Message("Add Single")
|
||||||
c.RenderArgs["singleId"] = singleId
|
c.ViewArgs["singleId"] = singleId
|
||||||
if singleId != "" {
|
if singleId != "" {
|
||||||
c.RenderArgs["title"] = c.Message("Update Single")
|
c.ViewArgs["title"] = c.Message("Update Single")
|
||||||
c.RenderArgs["single"] = blogService.GetSingle(singleId)
|
c.ViewArgs["single"] = blogService.GetSingle(singleId)
|
||||||
}
|
}
|
||||||
return c.RenderTemplate("member/blog/add_single.html")
|
return c.RenderTemplate("member/blog/add_single.html")
|
||||||
}
|
}
|
||||||
func (c MemberBlog) SortSingles(singleIds []string) revel.Result {
|
func (c MemberBlog) SortSingles(singleIds []string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = blogService.SortSingles(c.GetUserId(), singleIds)
|
re.Ok = blogService.SortSingles(c.GetUserId(), singleIds)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberBlog) DeleteSingle(singleId string) revel.Result {
|
func (c MemberBlog) DeleteSingle(singleId string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = blogService.DeleteSingle(c.GetUserId(), singleId)
|
re.Ok = blogService.DeleteSingle(c.GetUserId(), singleId)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改页面标题
|
// 修改页面标题
|
||||||
func (c MemberBlog) UpdateSingleUrlTitle(singleId, urlTitle string) revel.Result {
|
func (c MemberBlog) UpdateSingleUrlTitle(singleId, urlTitle string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok, re.Item = blogService.UpdateSingleUrlTitle(c.GetUserId(), singleId, urlTitle)
|
re.Ok, re.Item = blogService.UpdateSingleUrlTitle(c.GetUserId(), singleId, urlTitle)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberBlog) Single() revel.Result {
|
func (c MemberBlog) Single() revel.Result {
|
||||||
c.common()
|
c.common()
|
||||||
c.RenderArgs["title"] = c.Message("Single")
|
c.ViewArgs["title"] = c.Message("Single")
|
||||||
c.RenderArgs["singles"] = blogService.GetSingles(c.GetUserId())
|
c.ViewArgs["singles"] = blogService.GetSingles(c.GetUserId())
|
||||||
|
|
||||||
return c.RenderTemplate("member/blog/single.html")
|
return c.RenderTemplate("member/blog/single.html")
|
||||||
}
|
}
|
||||||
@@ -231,12 +231,12 @@ func (c MemberBlog) Single() revel.Result {
|
|||||||
func (c MemberBlog) Theme() revel.Result {
|
func (c MemberBlog) Theme() revel.Result {
|
||||||
c.common()
|
c.common()
|
||||||
activeTheme, otherThemes := themeService.GetUserThemes(c.GetUserId())
|
activeTheme, otherThemes := themeService.GetUserThemes(c.GetUserId())
|
||||||
c.RenderArgs["activeTheme"] = activeTheme
|
c.ViewArgs["activeTheme"] = activeTheme
|
||||||
c.RenderArgs["otherThemes"] = otherThemes
|
c.ViewArgs["otherThemes"] = otherThemes
|
||||||
|
|
||||||
c.RenderArgs["optionThemes"] = themeService.GetDefaultThemes()
|
c.ViewArgs["optionThemes"] = themeService.GetDefaultThemes()
|
||||||
|
|
||||||
c.RenderArgs["title"] = c.Message("Theme")
|
c.ViewArgs["title"] = c.Message("Theme")
|
||||||
return c.RenderTemplate("member/blog/theme.html")
|
return c.RenderTemplate("member/blog/theme.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,11 +253,11 @@ func (c MemberBlog) UpdateTheme(themeId string, isNew int) revel.Result {
|
|||||||
}
|
}
|
||||||
|
|
||||||
c.common()
|
c.common()
|
||||||
c.RenderArgs["title"] = c.Message("Update Theme")
|
c.ViewArgs["title"] = c.Message("Update Theme")
|
||||||
c.RenderArgs["isNew"] = isNew
|
c.ViewArgs["isNew"] = isNew
|
||||||
|
|
||||||
// 先复制之
|
// 先复制之
|
||||||
c.RenderArgs["themeId"] = themeId
|
c.ViewArgs["themeId"] = themeId
|
||||||
|
|
||||||
// 得到脚本目录
|
// 得到脚本目录
|
||||||
userId := c.GetUserId()
|
userId := c.GetUserId()
|
||||||
@@ -266,7 +266,7 @@ func (c MemberBlog) UpdateTheme(themeId string, isNew int) revel.Result {
|
|||||||
if theme.ThemeId == "" {
|
if theme.ThemeId == "" {
|
||||||
return c.E404()
|
return c.E404()
|
||||||
}
|
}
|
||||||
c.RenderArgs["theme"] = theme
|
c.ViewArgs["theme"] = theme
|
||||||
|
|
||||||
path := revel.BasePath + "/" + theme.Path
|
path := revel.BasePath + "/" + theme.Path
|
||||||
|
|
||||||
@@ -287,7 +287,7 @@ func (c MemberBlog) UpdateTheme(themeId string, isNew int) revel.Result {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
c.RenderArgs["myTpls"] = myTpls
|
c.ViewArgs["myTpls"] = myTpls
|
||||||
|
|
||||||
return c.RenderTemplate("member/blog/update_theme.html")
|
return c.RenderTemplate("member/blog/update_theme.html")
|
||||||
}
|
}
|
||||||
@@ -298,7 +298,7 @@ func (c MemberBlog) GetTplContent(themeId string, filename string) revel.Result
|
|||||||
re.Ok = true
|
re.Ok = true
|
||||||
re.Item = themeService.GetTplContent(c.GetUserId(), themeId, filename)
|
re.Item = themeService.GetTplContent(c.GetUserId(), themeId, filename)
|
||||||
|
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
func (c MemberBlog) UpdateTplContent(themeId, filename, content string) revel.Result {
|
func (c MemberBlog) UpdateTplContent(themeId, filename, content string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
@@ -309,7 +309,7 @@ func (c MemberBlog) UpdateTplContent(themeId, filename, content string) revel.Re
|
|||||||
func (c MemberBlog) DeleteTpl(themeId, filename string) revel.Result {
|
func (c MemberBlog) DeleteTpl(themeId, filename string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = themeService.DeleteTpl(c.GetUserId(), themeId, filename)
|
re.Ok = themeService.DeleteTpl(c.GetUserId(), themeId, filename)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberBlog) ListThemeImages(themeId string) revel.Result {
|
func (c MemberBlog) ListThemeImages(themeId string) revel.Result {
|
||||||
@@ -320,22 +320,22 @@ func (c MemberBlog) ListThemeImages(themeId string) revel.Result {
|
|||||||
images := ListDir(path)
|
images := ListDir(path)
|
||||||
re.List = images
|
re.List = images
|
||||||
re.Ok = true
|
re.Ok = true
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberBlog) DeleteThemeImage(themeId, filename string) revel.Result {
|
func (c MemberBlog) DeleteThemeImage(themeId, filename string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
path := themeService.GetThemeAbsolutePath(c.GetUserId(), themeId) + "/images/" + filename
|
path := themeService.GetThemeAbsolutePath(c.GetUserId(), themeId) + "/images/" + filename
|
||||||
re.Ok = DeleteFile(path)
|
re.Ok = DeleteFile(path)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 上传主题图片
|
// 上传主题图片
|
||||||
func (c MemberBlog) UploadThemeImage(themeId string) revel.Result {
|
func (c MemberBlog) UploadThemeImage(themeId string) revel.Result {
|
||||||
re := c.uploadImage(themeId)
|
re := c.uploadImage(themeId)
|
||||||
c.RenderArgs["fileUrlPath"] = re.Id
|
c.ViewArgs["fileUrlPath"] = re.Id
|
||||||
c.RenderArgs["resultCode"] = re.Code
|
c.ViewArgs["resultCode"] = re.Code
|
||||||
c.RenderArgs["resultMsg"] = re.Msg
|
c.ViewArgs["resultMsg"] = re.Msg
|
||||||
return c.RenderTemplate("file/blog_logo.html")
|
return c.RenderTemplate("file/blog_logo.html")
|
||||||
}
|
}
|
||||||
func (c MemberBlog) uploadImage(themeId string) (re info.Re) {
|
func (c MemberBlog) uploadImage(themeId string) (re info.Re) {
|
||||||
@@ -405,21 +405,21 @@ func (c MemberBlog) uploadImage(themeId string) (re info.Re) {
|
|||||||
func (c MemberBlog) ActiveTheme(themeId string) revel.Result {
|
func (c MemberBlog) ActiveTheme(themeId string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = themeService.ActiveTheme(c.GetUserId(), themeId)
|
re.Ok = themeService.ActiveTheme(c.GetUserId(), themeId)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除主题
|
// 删除主题
|
||||||
func (c MemberBlog) DeleteTheme(themeId string) revel.Result {
|
func (c MemberBlog) DeleteTheme(themeId string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = themeService.DeleteTheme(c.GetUserId(), themeId)
|
re.Ok = themeService.DeleteTheme(c.GetUserId(), themeId)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 管理员公开主题
|
// 管理员公开主题
|
||||||
func (c MemberBlog) PublicTheme(themeId string) revel.Result {
|
func (c MemberBlog) PublicTheme(themeId string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = themeService.PublicTheme(c.GetUserId(), themeId)
|
re.Ok = themeService.PublicTheme(c.GetUserId(), themeId)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 导出
|
// 导出
|
||||||
@@ -444,7 +444,7 @@ func (c MemberBlog) ImportTheme() revel.Result {
|
|||||||
file, handel, err := c.Request.FormFile("file")
|
file, handel, err := c.Request.FormFile("file")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
re.Msg = fmt.Sprintf("%v", err)
|
re.Msg = fmt.Sprintf("%v", err)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
@@ -454,7 +454,7 @@ func (c MemberBlog) ImportTheme() revel.Result {
|
|||||||
err = os.MkdirAll(dir, 0755)
|
err = os.MkdirAll(dir, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
re.Msg = fmt.Sprintf("%v", err)
|
re.Msg = fmt.Sprintf("%v", err)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
// 生成新的文件名
|
// 生成新的文件名
|
||||||
filename := handel.Filename
|
filename := handel.Filename
|
||||||
@@ -463,26 +463,26 @@ func (c MemberBlog) ImportTheme() revel.Result {
|
|||||||
_, ext = SplitFilename(filename)
|
_, ext = SplitFilename(filename)
|
||||||
if ext != ".zip" {
|
if ext != ".zip" {
|
||||||
re.Msg = "Please upload zip file"
|
re.Msg = "Please upload zip file"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
filename = filename
|
filename = filename
|
||||||
data, err := ioutil.ReadAll(file)
|
data, err := ioutil.ReadAll(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// > 10M?
|
// > 10M?
|
||||||
if len(data) > 10*1024*1024 {
|
if len(data) > 10*1024*1024 {
|
||||||
re.Msg = "File is big than 10M"
|
re.Msg = "File is big than 10M"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
toPath := dir + "/" + filename
|
toPath := dir + "/" + filename
|
||||||
err = ioutil.WriteFile(toPath, data, 0777)
|
err = ioutil.WriteFile(toPath, data, 0777)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
re.Msg = fmt.Sprintf("%v", err)
|
re.Msg = fmt.Sprintf("%v", err)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 上传好后, 增加之
|
// 上传好后, 增加之
|
||||||
@@ -494,7 +494,7 @@ func (c MemberBlog) ImportTheme() revel.Result {
|
|||||||
func (c MemberBlog) InstallTheme(themeId string) revel.Result {
|
func (c MemberBlog) InstallTheme(themeId string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = themeService.InstallTheme(c.GetUserId(), themeId)
|
re.Ok = themeService.InstallTheme(c.GetUserId(), themeId)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新建主题
|
// 新建主题
|
||||||
@@ -508,17 +508,17 @@ func (c MemberBlog) NewTheme() revel.Result {
|
|||||||
func (c MemberBlog) SetUserBlogBase(userBlog info.UserBlogBase) revel.Result {
|
func (c MemberBlog) SetUserBlogBase(userBlog info.UserBlogBase) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = blogService.UpdateUserBlogBase(c.GetUserId(), userBlog)
|
re.Ok = blogService.UpdateUserBlogBase(c.GetUserId(), userBlog)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
func (c MemberBlog) SetUserBlogComment(userBlog info.UserBlogComment) revel.Result {
|
func (c MemberBlog) SetUserBlogComment(userBlog info.UserBlogComment) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = blogService.UpdateUserBlogComment(c.GetUserId(), userBlog)
|
re.Ok = blogService.UpdateUserBlogComment(c.GetUserId(), userBlog)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
func (c MemberBlog) SetUserBlogStyle(userBlog info.UserBlogStyle) revel.Result {
|
func (c MemberBlog) SetUserBlogStyle(userBlog info.UserBlogStyle) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = blogService.UpdateUserBlogStyle(c.GetUserId(), userBlog)
|
re.Ok = blogService.UpdateUserBlogStyle(c.GetUserId(), userBlog)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberBlog) SetUserBlogPaging(perPageSize int, sortField string, isAsc bool) revel.Result {
|
func (c MemberBlog) SetUserBlogPaging(perPageSize int, sortField string, isAsc bool) revel.Result {
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ type MemberGroup struct {
|
|||||||
func (c MemberGroup) Index() revel.Result {
|
func (c MemberGroup) Index() revel.Result {
|
||||||
c.SetUserInfo()
|
c.SetUserInfo()
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
c.RenderArgs["title"] = c.Message("My Group")
|
c.ViewArgs["title"] = c.Message("My Group")
|
||||||
c.RenderArgs["groups"] = groupService.GetGroupsAndUsers(c.GetUserId())
|
c.ViewArgs["groups"] = groupService.GetGroupsAndUsers(c.GetUserId())
|
||||||
return c.RenderTemplate("member/group/index.html")
|
return c.RenderTemplate("member/group/index.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -23,13 +23,13 @@ func (c MemberGroup) Index() revel.Result {
|
|||||||
func (c MemberGroup) AddGroup(title string) revel.Result {
|
func (c MemberGroup) AddGroup(title string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok, re.Item = groupService.AddGroup(c.GetUserId(), title)
|
re.Ok, re.Item = groupService.AddGroup(c.GetUserId(), title)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberGroup) UpdateGroupTitle(groupId, title string) revel.Result {
|
func (c MemberGroup) UpdateGroupTitle(groupId, title string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = groupService.UpdateGroupTitle(c.GetUserId(), groupId, title)
|
re.Ok = groupService.UpdateGroupTitle(c.GetUserId(), groupId, title)
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberGroup) DeleteGroup(groupId string) revel.Result {
|
func (c MemberGroup) DeleteGroup(groupId string) revel.Result {
|
||||||
|
|||||||
@@ -13,10 +13,10 @@ type MemberIndex struct {
|
|||||||
// admin 主页
|
// admin 主页
|
||||||
func (c MemberIndex) Index() revel.Result {
|
func (c MemberIndex) Index() revel.Result {
|
||||||
c.SetUserInfo()
|
c.SetUserInfo()
|
||||||
c.RenderArgs["title"] = c.Message("Leanote Member Center")
|
c.ViewArgs["title"] = c.Message("Leanote Member Center")
|
||||||
|
|
||||||
c.RenderArgs["countNote"] = noteService.CountNote(c.GetUserId())
|
c.ViewArgs["countNote"] = noteService.CountNote(c.GetUserId())
|
||||||
c.RenderArgs["countBlog"] = noteService.CountBlog(c.GetUserId())
|
c.ViewArgs["countBlog"] = noteService.CountBlog(c.GetUserId())
|
||||||
|
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
|
|
||||||
@@ -25,10 +25,10 @@ func (c MemberIndex) Index() revel.Result {
|
|||||||
|
|
||||||
// 模板
|
// 模板
|
||||||
func (c MemberIndex) T(t string) revel.Result {
|
func (c MemberIndex) T(t string) revel.Result {
|
||||||
c.RenderArgs["str"] = configService.GlobalStringConfigs
|
c.ViewArgs["str"] = configService.GlobalStringConfigs
|
||||||
c.RenderArgs["arr"] = configService.GlobalArrayConfigs
|
c.ViewArgs["arr"] = configService.GlobalArrayConfigs
|
||||||
c.RenderArgs["map"] = configService.GlobalMapConfigs
|
c.ViewArgs["map"] = configService.GlobalMapConfigs
|
||||||
c.RenderArgs["arrMap"] = configService.GlobalArrMapConfigs
|
c.ViewArgs["arrMap"] = configService.GlobalArrMapConfigs
|
||||||
return c.RenderTemplate("admin/" + t + ".html")
|
return c.RenderTemplate("admin/" + t + ".html")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -13,28 +13,28 @@ type MemberUser struct {
|
|||||||
func (c MemberUser) Username() revel.Result {
|
func (c MemberUser) Username() revel.Result {
|
||||||
c.SetUserInfo()
|
c.SetUserInfo()
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
c.RenderArgs["title"] = c.Message("Username")
|
c.ViewArgs["title"] = c.Message("Username")
|
||||||
return c.RenderTemplate("member/user/username.html")
|
return c.RenderTemplate("member/user/username.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberUser) Email() revel.Result {
|
func (c MemberUser) Email() revel.Result {
|
||||||
c.SetUserInfo()
|
c.SetUserInfo()
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
c.RenderArgs["title"] = c.Message("Email")
|
c.ViewArgs["title"] = c.Message("Email")
|
||||||
return c.RenderTemplate("member/user/email.html")
|
return c.RenderTemplate("member/user/email.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberUser) Password() revel.Result {
|
func (c MemberUser) Password() revel.Result {
|
||||||
c.SetUserInfo()
|
c.SetUserInfo()
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
c.RenderArgs["title"] = c.Message("Password")
|
c.ViewArgs["title"] = c.Message("Password")
|
||||||
return c.RenderTemplate("member/user/password.html")
|
return c.RenderTemplate("member/user/password.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberUser) Avatar() revel.Result {
|
func (c MemberUser) Avatar() revel.Result {
|
||||||
c.SetUserInfo()
|
c.SetUserInfo()
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
c.RenderArgs["title"] = c.Message("Avatar")
|
c.ViewArgs["title"] = c.Message("Avatar")
|
||||||
c.RenderArgs["globalConfigs"] = configService.GetGlobalConfigForUser()
|
c.ViewArgs["globalConfigs"] = configService.GetGlobalConfigForUser()
|
||||||
return c.RenderTemplate("member/user/avatar.html")
|
return c.RenderTemplate("member/user/avatar.html")
|
||||||
}
|
}
|
||||||
@@ -93,7 +93,7 @@ func AuthInterceptor(c *revel.Controller) revel.Result {
|
|||||||
if c.Request.Header.Get("X-Requested-With") == "XMLHttpRequest" {
|
if c.Request.Header.Get("X-Requested-With") == "XMLHttpRequest" {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Msg = "NOTLOGIN"
|
re.Msg = "NOTLOGIN"
|
||||||
return c.RenderJson(re)
|
return c.RenderJSON(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.Redirect("/login")
|
return c.Redirect("/login")
|
||||||
|
|||||||
@@ -1,92 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"encoding/json"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
// convert revel msg to js msg
|
|
||||||
|
|
||||||
var msgBasePath = "/Users/life/Documents/Go/package2/src/github.com/leanote/leanote/messages/"
|
|
||||||
var targetBasePath = "/Users/life/Documents/Go/package2/src/github.com/leanote/leanote/public/js/i18n/"
|
|
||||||
|
|
||||||
func parse(filename string) {
|
|
||||||
file, err := os.Open(msgBasePath + filename)
|
|
||||||
reader := bufio.NewReader(file)
|
|
||||||
msg := map[string]string{}
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for true {
|
|
||||||
line, _, err := reader.ReadLine()
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(line) == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// 对每一行进行处理
|
|
||||||
if line[0] == '#' || line[1] == '#' {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
lineStr := string(line)
|
|
||||||
|
|
||||||
// 找到第一个=位置
|
|
||||||
pos := strings.Index(lineStr, "=")
|
|
||||||
|
|
||||||
if pos < 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
key := string(line[0:pos])
|
|
||||||
value := string(line[pos+1:])
|
|
||||||
|
|
||||||
// fmt.Println(lineStr)
|
|
||||||
// fmt.Println(value)
|
|
||||||
|
|
||||||
msg[key] = value
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSON
|
|
||||||
b, _ := json.Marshal(msg)
|
|
||||||
str := string(b)
|
|
||||||
fmt.Println(str)
|
|
||||||
|
|
||||||
targetName := targetBasePath + filename + ".js"
|
|
||||||
file2, err2 := os.OpenFile(targetName, os.O_RDWR|os.O_CREATE, 0644)
|
|
||||||
if err2 != nil {
|
|
||||||
file2, err2 = os.Create(targetName)
|
|
||||||
}
|
|
||||||
file2.WriteString("var MSG = " + str + ";" + `
|
|
||||||
function getMsg(key, data) {
|
|
||||||
var msg = MSG[key]
|
|
||||||
if(msg) {
|
|
||||||
if(data) {
|
|
||||||
if(!isArray(data)) {
|
|
||||||
data = [data];
|
|
||||||
}
|
|
||||||
for(var i = 0; i < data.length; ++i) {
|
|
||||||
msg = msg.replace("%s", data[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 生成js的i18n文件
|
|
||||||
func main() {
|
|
||||||
parse("msg.en")
|
|
||||||
parse("msg.zh")
|
|
||||||
parse("msg.fr")
|
|
||||||
parse("blog.zh")
|
|
||||||
parse("blog.en")
|
|
||||||
parse("blog.fr")
|
|
||||||
}
|
|
||||||
@@ -15,6 +15,8 @@ type Note struct {
|
|||||||
Title string `Title` // 标题
|
Title string `Title` // 标题
|
||||||
Desc string `Desc` // 描述, 非html
|
Desc string `Desc` // 描述, 非html
|
||||||
|
|
||||||
|
Src string `Src,omitempty` // 来源, 2016/4/22
|
||||||
|
|
||||||
ImgSrc string `ImgSrc` // 图片, 第一张缩略图地址
|
ImgSrc string `ImgSrc` // 图片, 第一张缩略图地址
|
||||||
Tags []string `Tags,omitempty`
|
Tags []string `Tags,omitempty`
|
||||||
|
|
||||||
@@ -92,6 +94,7 @@ type NoteOrContent struct {
|
|||||||
UserId string
|
UserId string
|
||||||
Title string
|
Title string
|
||||||
Desc string
|
Desc string
|
||||||
|
Src string
|
||||||
ImgSrc string
|
ImgSrc string
|
||||||
Tags string
|
Tags string
|
||||||
Content string
|
Content string
|
||||||
@@ -101,3 +104,9 @@ type NoteOrContent struct {
|
|||||||
FromUserId string // 为共享而新建
|
FromUserId string // 为共享而新建
|
||||||
IsBlog bool // 是否是blog, 更新note不需要修改, 添加note时才有可能用到, 此时需要判断notebook是否设为Blog
|
IsBlog bool // 是否是blog, 更新note不需要修改, 添加note时才有可能用到, 此时需要判断notebook是否设为Blog
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 分开的
|
||||||
|
type NoteAndContentSep struct {
|
||||||
|
NoteInfo Note
|
||||||
|
NoteContentInfo NoteContent
|
||||||
|
}
|
||||||
+18
-8
@@ -10,6 +10,7 @@ import (
|
|||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
. "github.com/leanote/leanote/app/lea"
|
||||||
_ "github.com/leanote/leanote/app/lea/binder"
|
_ "github.com/leanote/leanote/app/lea/binder"
|
||||||
|
"github.com/leanote/leanote/app/lea/i18n"
|
||||||
"github.com/leanote/leanote/app/lea/route"
|
"github.com/leanote/leanote/app/lea/route"
|
||||||
"github.com/leanote/leanote/app/service"
|
"github.com/leanote/leanote/app/service"
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
@@ -40,7 +41,8 @@ func init() {
|
|||||||
|
|
||||||
revel.FlashFilter, // Restore and write the flash cookie.
|
revel.FlashFilter, // Restore and write the flash cookie.
|
||||||
revel.ValidationFilter, // Restore kept validation errors and save new ones from cookie.
|
revel.ValidationFilter, // Restore kept validation errors and save new ones from cookie.
|
||||||
revel.I18nFilter, // Resolve the requested language
|
// revel.I18nFilter, // Resolve the requested language
|
||||||
|
i18n.I18nFilter, // Resolve the requested language by leanote
|
||||||
revel.InterceptorFilter, // Run interceptors around the action.
|
revel.InterceptorFilter, // Run interceptors around the action.
|
||||||
revel.CompressFilter, // Compress the result.
|
revel.CompressFilter, // Compress the result.
|
||||||
revel.ActionInvoker, // Invoke the action.
|
revel.ActionInvoker, // Invoke the action.
|
||||||
@@ -127,7 +129,7 @@ func init() {
|
|||||||
if tags == nil || len(tags) == 0 {
|
if tags == nil || len(tags) == 0 {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
locale, _ := renderArgs[revel.CurrentLocaleRenderArg].(string)
|
locale, _ := renderArgs[revel.CurrentLocaleViewArg].(string)
|
||||||
tagStr := ""
|
tagStr := ""
|
||||||
lenTags := len(tags)
|
lenTags := len(tags)
|
||||||
|
|
||||||
@@ -146,7 +148,7 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
classes += " label-post"
|
classes += " label-post"
|
||||||
var url = tagPostUrl + "/" + url.QueryEscape(tag)
|
var url = tagPostUrl + "/" + tag
|
||||||
tagStr += "<a class=\"" + classes + "\" href=\"" + url + "\">" + str + "</a>"
|
tagStr += "<a class=\"" + classes + "\" href=\"" + url + "\">" + str + "</a>"
|
||||||
if i != lenTags-1 {
|
if i != lenTags-1 {
|
||||||
tagStr += " "
|
tagStr += " "
|
||||||
@@ -180,10 +182,18 @@ func init() {
|
|||||||
return template.HTML(tagStr)
|
return template.HTML(tagStr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
revel.TemplateFuncs["msg"] = func(renderArgs map[string]interface{}, message string, args ...interface{}) template.HTML {
|
||||||
|
str, ok := renderArgs[revel.CurrentLocaleViewArg].(string)
|
||||||
|
if !ok {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return template.HTML(i18n.Message(str, message, args...))
|
||||||
|
}
|
||||||
|
|
||||||
// 不用revel的msg
|
// 不用revel的msg
|
||||||
revel.TemplateFuncs["leaMsg"] = func(renderArgs map[string]interface{}, key string) template.HTML {
|
revel.TemplateFuncs["leaMsg"] = func(renderArgs map[string]interface{}, key string) template.HTML {
|
||||||
locale, _ := renderArgs[revel.CurrentLocaleRenderArg].(string)
|
locale, _ := renderArgs[revel.CurrentLocaleViewArg].(string)
|
||||||
str := revel.Message(locale, key)
|
str := i18n.Message(locale, key)
|
||||||
if strings.HasPrefix(str, "???") {
|
if strings.HasPrefix(str, "???") {
|
||||||
str = key
|
str = key
|
||||||
}
|
}
|
||||||
@@ -195,7 +205,7 @@ func init() {
|
|||||||
if tags == nil || len(tags) == 0 {
|
if tags == nil || len(tags) == 0 {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
locale, _ := renderArgs[revel.CurrentLocaleRenderArg].(string)
|
locale, _ := renderArgs[revel.CurrentLocaleViewArg].(string)
|
||||||
tagStr := ""
|
tagStr := ""
|
||||||
lenTags := len(tags)
|
lenTags := len(tags)
|
||||||
|
|
||||||
@@ -220,7 +230,7 @@ func init() {
|
|||||||
classes += " label-default"
|
classes += " label-default"
|
||||||
}
|
}
|
||||||
classes += " label-post"
|
classes += " label-post"
|
||||||
var url = tagPostUrl + url.QueryEscape(tag)
|
var url = tagPostUrl + tag
|
||||||
tagStr += "<a class=\"" + classes + "\" href=\"" + url + "\">" + str + "</a>"
|
tagStr += "<a class=\"" + classes + "\" href=\"" + url + "\">" + str + "</a>"
|
||||||
if i != lenTags-1 {
|
if i != lenTags-1 {
|
||||||
tagStr += " "
|
tagStr += " "
|
||||||
@@ -297,7 +307,7 @@ func init() {
|
|||||||
|
|
||||||
// http://stackoverflow.com/questions/14226416/go-lang-templates-always-quotes-a-string-and-removes-comments
|
// http://stackoverflow.com/questions/14226416/go-lang-templates-always-quotes-a-string-and-removes-comments
|
||||||
revel.TemplateFuncs["rawMsg"] = func(renderArgs map[string]interface{}, message string, args ...interface{}) template.JS {
|
revel.TemplateFuncs["rawMsg"] = func(renderArgs map[string]interface{}, message string, args ...interface{}) template.JS {
|
||||||
str, ok := renderArgs[revel.CurrentLocaleRenderArg].(string)
|
str, ok := renderArgs[revel.CurrentLocaleViewArg].(string)
|
||||||
if !ok {
|
if !ok {
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-2
@@ -6,8 +6,16 @@ import (
|
|||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Log(i interface{}) {
|
func Log(i ...interface{}) {
|
||||||
revel.INFO.Println(i)
|
revel.INFO.Println(i...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func LogW(i ...interface{}) {
|
||||||
|
revel.WARN.Println(i...)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Log1(key, i interface{}) {
|
||||||
|
revel.INFO.Println(key, i)
|
||||||
}
|
}
|
||||||
|
|
||||||
func LogJ(i interface{}) {
|
func LogJ(i interface{}) {
|
||||||
|
|||||||
@@ -7,6 +7,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"strings"
|
"strings"
|
||||||
|
"github.com/leanote/leanote/app/lea"
|
||||||
)
|
)
|
||||||
|
|
||||||
// main functions shows how to TarGz a directory/file and
|
// main functions shows how to TarGz a directory/file and
|
||||||
@@ -150,6 +151,12 @@ func Unzip(srcFilePath string, destDirPath string) (ok bool, msg string) {
|
|||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 包含恶意目录
|
||||||
|
if strings.Contains(f.Name, "../") {
|
||||||
|
lea.LogW("恶意文件", f.Name);
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
// 把首文件夹去掉, 即j去掉, 分离出文件夹和文件名
|
// 把首文件夹去掉, 即j去掉, 分离出文件夹和文件名
|
||||||
paths := strings.Split(f.Name, "/")
|
paths := strings.Split(f.Name, "/")
|
||||||
prePath := ""
|
prePath := ""
|
||||||
|
|||||||
+11
-11
@@ -39,7 +39,7 @@ var CloneTemplate *template.Template
|
|||||||
type RenderTemplateResult struct {
|
type RenderTemplateResult struct {
|
||||||
Template *template.Template
|
Template *template.Template
|
||||||
PathContent map[string]string
|
PathContent map[string]string
|
||||||
RenderArgs map[string]interface{}
|
ViewArgs map[string]interface{}
|
||||||
|
|
||||||
IsPreview bool // 是否是预览
|
IsPreview bool // 是否是预览
|
||||||
CurBlogTpl *BlogTpl
|
CurBlogTpl *BlogTpl
|
||||||
@@ -62,7 +62,7 @@ func parseTemplateError(err error) (templateName string, line int, description s
|
|||||||
return templateName, line, description
|
return templateName, line, description
|
||||||
}
|
}
|
||||||
func (r *RenderTemplateResult) render(req *revel.Request, resp *revel.Response, wr io.Writer) {
|
func (r *RenderTemplateResult) render(req *revel.Request, resp *revel.Response, wr io.Writer) {
|
||||||
err := r.Template.Execute(wr, r.RenderArgs)
|
err := r.Template.Execute(wr, r.ViewArgs)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -91,7 +91,7 @@ func (r *RenderTemplateResult) render(req *revel.Request, resp *revel.Response,
|
|||||||
// 这里, 错误!!
|
// 这里, 错误!!
|
||||||
// 这里应该导向到本主题的错误页面
|
// 这里应该导向到本主题的错误页面
|
||||||
resp.Status = 500
|
resp.Status = 500
|
||||||
ErrorResult{r.RenderArgs, compileError, r.IsPreview, r.CurBlogTpl}.Apply(req, resp)
|
ErrorResult{r.ViewArgs, compileError, r.IsPreview, r.CurBlogTpl}.Apply(req, resp)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *RenderTemplateResult) Apply(req *revel.Request, resp *revel.Response) {
|
func (r *RenderTemplateResult) Apply(req *revel.Request, resp *revel.Response) {
|
||||||
@@ -162,7 +162,7 @@ func RenderTemplate(name string, args map[string]interface{}, basePath string, i
|
|||||||
r = &RenderTemplateResult{
|
r = &RenderTemplateResult{
|
||||||
Template: t,
|
Template: t,
|
||||||
PathContent: BlogTplObject.PathContent, // 为了显示错误
|
PathContent: BlogTplObject.PathContent, // 为了显示错误
|
||||||
RenderArgs: args, // 把args给它
|
ViewArgs: args, // 把args给它
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 复制一份
|
// 复制一份
|
||||||
@@ -202,7 +202,7 @@ func RenderTemplate(name string, args map[string]interface{}, basePath string, i
|
|||||||
r = &RenderTemplateResult{
|
r = &RenderTemplateResult{
|
||||||
Template: t,
|
Template: t,
|
||||||
PathContent: newBlogTplObject.PathContent, // 为了显示错误
|
PathContent: newBlogTplObject.PathContent, // 为了显示错误
|
||||||
RenderArgs: args,
|
ViewArgs: args,
|
||||||
CurBlogTpl: newBlogTplObject,
|
CurBlogTpl: newBlogTplObject,
|
||||||
IsPreview: isPreview,
|
IsPreview: isPreview,
|
||||||
}
|
}
|
||||||
@@ -215,7 +215,7 @@ func RenderTemplate(name string, args map[string]interface{}, basePath string, i
|
|||||||
//
|
//
|
||||||
|
|
||||||
type ErrorResult struct {
|
type ErrorResult struct {
|
||||||
RenderArgs map[string]interface{}
|
ViewArgs map[string]interface{}
|
||||||
Error error
|
Error error
|
||||||
IsPreview bool
|
IsPreview bool
|
||||||
CurBlogTpl *BlogTpl
|
CurBlogTpl *BlogTpl
|
||||||
@@ -280,18 +280,18 @@ func (r ErrorResult) Apply(req *revel.Request, resp *revel.Response) {
|
|||||||
panic("no error provided")
|
panic("no error provided")
|
||||||
}
|
}
|
||||||
|
|
||||||
if r.RenderArgs == nil {
|
if r.ViewArgs == nil {
|
||||||
r.RenderArgs = make(map[string]interface{})
|
r.ViewArgs = make(map[string]interface{})
|
||||||
}
|
}
|
||||||
r.RenderArgs["Error"] = revelError
|
r.ViewArgs["Error"] = revelError
|
||||||
r.RenderArgs["Router"] = revel.MainRouter
|
r.ViewArgs["Router"] = revel.MainRouter
|
||||||
|
|
||||||
// 不是preview就不要显示错误了
|
// 不是preview就不要显示错误了
|
||||||
if r.IsPreview {
|
if r.IsPreview {
|
||||||
var b bytes.Buffer
|
var b bytes.Buffer
|
||||||
out := io.Writer(resp.Out)
|
out := io.Writer(resp.Out)
|
||||||
// out = ioutil.Discard
|
// out = ioutil.Discard
|
||||||
err = tmpl.Execute(&b, r.RenderArgs)
|
err = tmpl.Execute(&b, r.ViewArgs)
|
||||||
resp.WriteHeader(http.StatusOK, "text/html; charset=utf-8")
|
resp.WriteHeader(http.StatusOK, "text/html; charset=utf-8")
|
||||||
b.WriteTo(out)
|
b.WriteTo(out)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,223 @@
|
|||||||
|
package i18n
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/revel/revel"
|
||||||
|
"github.com/robfig/config"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
CurrentLocaleViewArg = "currentLocale" // The key for the current locale render arg value
|
||||||
|
|
||||||
|
messageFilesDirectory = "messages"
|
||||||
|
messageFilePattern = `^\w+\.conf$`
|
||||||
|
unknownValueFormat = "??? %s ???"
|
||||||
|
defaultLanguageOption = "i18n.default_language"
|
||||||
|
localeCookieConfigKey = "i18n.cookie"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// All currently loaded message configs.
|
||||||
|
// en-us, zh-cn, zh-hk ->
|
||||||
|
messages map[string]*config.Config
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetAllLangMessages() map[string]*config.Config {
|
||||||
|
return messages
|
||||||
|
}
|
||||||
|
|
||||||
|
func HasLang(lang string) bool {
|
||||||
|
_, ok := messages[lang]
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetDefaultLang() string {
|
||||||
|
lang, _ := revel.Config.String(defaultLanguageOption)
|
||||||
|
return lang
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return all currently loaded message languages.
|
||||||
|
func MessageLanguages() []string {
|
||||||
|
languages := make([]string, len(messages))
|
||||||
|
i := 0
|
||||||
|
for language, _ := range messages {
|
||||||
|
languages[i] = language
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
return languages
|
||||||
|
}
|
||||||
|
|
||||||
|
// Perform a message look-up for the given locale and message using the given arguments.
|
||||||
|
//
|
||||||
|
// When either an unknown locale or message is detected, a specially formatted string is returned.
|
||||||
|
func Message(locale, message string, args ...interface{}) string {
|
||||||
|
language, region := parseLocale(locale)
|
||||||
|
|
||||||
|
langAndRegion := language + "-" + region
|
||||||
|
// revel.TRACE.Println(langAndRegion + " 怎么回事")
|
||||||
|
|
||||||
|
messageConfig, knownLanguage := messages[langAndRegion]
|
||||||
|
if !knownLanguage {
|
||||||
|
// revel.TRACE.Printf("Unsupported language for locale '%s' and message '%s', trying default language", locale, message)
|
||||||
|
|
||||||
|
if defaultLanguage, found := revel.Config.String(defaultLanguageOption); found {
|
||||||
|
// revel.TRACE.Printf("Using default language '%s'", defaultLanguage)
|
||||||
|
|
||||||
|
messageConfig, knownLanguage = messages[defaultLanguage]
|
||||||
|
if !knownLanguage {
|
||||||
|
// WARN.Printf("Unsupported default language for locale '%s' and message '%s'", defaultLanguage, message)
|
||||||
|
return fmt.Sprintf(unknownValueFormat, message)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// WARN.Printf("Unable to find default language option (%s); messages for unsupported locales will never be translated", defaultLanguageOption)
|
||||||
|
return fmt.Sprintf(unknownValueFormat, message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This works because unlike the goconfig documentation suggests it will actually
|
||||||
|
// try to resolve message in DEFAULT if it did not find it in the given section.
|
||||||
|
value, error := messageConfig.String(region, message)
|
||||||
|
if error != nil {
|
||||||
|
// WARN.Printf("Unknown message '%s' for locale '%s'", message, locale)
|
||||||
|
return fmt.Sprintf(unknownValueFormat, message)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(args) > 0 {
|
||||||
|
// revel.TRACE.Printf("Arguments detected, formatting '%s' with %v", value, args)
|
||||||
|
value = fmt.Sprintf(value, args...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseLocale(locale string) (language, region string) {
|
||||||
|
if strings.Contains(locale, "-") {
|
||||||
|
languageAndRegion := strings.Split(locale, "-")
|
||||||
|
return languageAndRegion[0], languageAndRegion[1]
|
||||||
|
}
|
||||||
|
|
||||||
|
return locale, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// Recursively read and cache all available messages from all message files on the given path.
|
||||||
|
func loadMessages(path string) {
|
||||||
|
messages = make(map[string]*config.Config)
|
||||||
|
|
||||||
|
if error := filepath.Walk(path, loadEachMessageLang); error != nil && !os.IsNotExist(error) {
|
||||||
|
// ERROR.Println("Error reading messages files:", error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加载每一个文件夹
|
||||||
|
func loadEachMessageLang(parentPath string, parentInfo os.FileInfo, osError error) (err error) {
|
||||||
|
if !parentInfo.IsDir() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := filepath.Walk(parentPath, func(path string, info os.FileInfo, osError error) error {
|
||||||
|
return loadMessageFile(parentInfo.Name(), path, info, osError)
|
||||||
|
|
||||||
|
}); err != nil && !os.IsNotExist(err) {
|
||||||
|
// ERROR.Println("Error reading messages files:", error)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Load a single message file
|
||||||
|
func loadMessageFile(locale string, path string, info os.FileInfo, osError error) error {
|
||||||
|
if osError != nil {
|
||||||
|
return osError
|
||||||
|
}
|
||||||
|
if info.IsDir() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
if matched, _ := regexp.MatchString(messageFilePattern, info.Name()); matched {
|
||||||
|
if config, error := parseMessagesFile(path); error != nil {
|
||||||
|
return error
|
||||||
|
} else {
|
||||||
|
// locale := parseLocaleFromFileName(info.Name())
|
||||||
|
// revel.TRACE.Print(locale + "----locale")
|
||||||
|
|
||||||
|
// If we have already parsed a message file for this locale, merge both
|
||||||
|
if _, exists := messages[locale]; exists {
|
||||||
|
messages[locale].Merge(config)
|
||||||
|
revel.TRACE.Printf("Successfully merged messages for locale '%s'", locale)
|
||||||
|
} else {
|
||||||
|
messages[locale] = config
|
||||||
|
}
|
||||||
|
|
||||||
|
revel.TRACE.Println("Successfully loaded messages from file", info.Name())
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
revel.TRACE.Printf("Ignoring file %s because it did not have a valid extension", info.Name())
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseMessagesFile(path string) (messageConfig *config.Config, error error) {
|
||||||
|
messageConfig, error = config.ReadDefault(path)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseLocaleFromFileName(file string) string {
|
||||||
|
extension := filepath.Ext(file)[1:]
|
||||||
|
return strings.ToLower(extension)
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
revel.OnAppStart(func() {
|
||||||
|
loadMessages(filepath.Join(revel.BasePath, messageFilesDirectory))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func I18nFilter(c *revel.Controller, fc []revel.Filter) {
|
||||||
|
if foundCookie, cookieValue := hasLocaleCookie(c.Request); foundCookie {
|
||||||
|
revel.TRACE.Printf("Found locale cookie value: %s", cookieValue)
|
||||||
|
setCurrentLocaleControllerArguments(c, cookieValue)
|
||||||
|
} else if foundHeader, headerValue := hasAcceptLanguageHeader(c.Request); foundHeader {
|
||||||
|
revel.TRACE.Printf("Found Accept-Language header value: %s", headerValue)
|
||||||
|
setCurrentLocaleControllerArguments(c, headerValue)
|
||||||
|
} else {
|
||||||
|
revel.TRACE.Println("Unable to find locale in cookie or header, using empty string")
|
||||||
|
setCurrentLocaleControllerArguments(c, "")
|
||||||
|
}
|
||||||
|
fc[0](c, fc[1:])
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the current locale controller argument (CurrentLocaleControllerArg) with the given locale.
|
||||||
|
func setCurrentLocaleControllerArguments(c *revel.Controller, locale string) {
|
||||||
|
c.Request.Locale = locale
|
||||||
|
c.ViewArgs[CurrentLocaleViewArg] = locale
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine whether the given request has valid Accept-Language value.
|
||||||
|
//
|
||||||
|
// Assumes that the accept languages stored in the request are sorted according to quality, with top
|
||||||
|
// quality first in the slice.
|
||||||
|
func hasAcceptLanguageHeader(request *revel.Request) (bool, string) {
|
||||||
|
if request.AcceptLanguages != nil && len(request.AcceptLanguages) > 0 {
|
||||||
|
return true, request.AcceptLanguages[0].Language
|
||||||
|
}
|
||||||
|
|
||||||
|
return false, ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// Determine whether the given request has a valid language cookie value.
|
||||||
|
func hasLocaleCookie(request *revel.Request) (bool, string) {
|
||||||
|
if request != nil && request.Cookies() != nil {
|
||||||
|
name := revel.Config.StringDefault(localeCookieConfigKey, revel.CookiePrefix+"_LANG")
|
||||||
|
if cookie, error := request.Cookie(name); error == nil {
|
||||||
|
return true, cookie.Value
|
||||||
|
} else {
|
||||||
|
revel.TRACE.Printf("Unable to read locale cookie with name '%s': %s", name, error.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false, ""
|
||||||
|
}
|
||||||
@@ -119,6 +119,7 @@ func (this *AttachService) DeleteAllAttachs(noteId, userId string) bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// delete attach
|
// delete attach
|
||||||
|
// 删除附件为什么要incrNoteUsn ? 因为可能没有内容要修改的
|
||||||
func (this *AttachService) DeleteAttach(attachId, userId string) (bool, string) {
|
func (this *AttachService) DeleteAttach(attachId, userId string) (bool, string) {
|
||||||
attach := info.Attach{}
|
attach := info.Attach{}
|
||||||
db.Get(db.Attachs, attachId, &attach)
|
db.Get(db.Attachs, attachId, &attach)
|
||||||
|
|||||||
@@ -518,7 +518,7 @@ func (this *BlogService) fixUserBlog(userBlog *info.UserBlog) {
|
|||||||
// Logo路径问题, 有些有http: 有些没有
|
// Logo路径问题, 有些有http: 有些没有
|
||||||
if userBlog.Logo != "" && !strings.HasPrefix(userBlog.Logo, "http") {
|
if userBlog.Logo != "" && !strings.HasPrefix(userBlog.Logo, "http") {
|
||||||
userBlog.Logo = strings.Trim(userBlog.Logo, "/")
|
userBlog.Logo = strings.Trim(userBlog.Logo, "/")
|
||||||
userBlog.Logo = configService.GetSiteUrl() + "/" + userBlog.Logo
|
userBlog.Logo = "/" + userBlog.Logo
|
||||||
}
|
}
|
||||||
|
|
||||||
if userBlog.SortField == "" {
|
if userBlog.SortField == "" {
|
||||||
@@ -673,19 +673,18 @@ func (this *BlogService) LikeBlog(noteId, userId string) (ok bool, isLike bool)
|
|||||||
|
|
||||||
noteIdO := bson.ObjectIdHex(noteId)
|
noteIdO := bson.ObjectIdHex(noteId)
|
||||||
userIdO := bson.ObjectIdHex(userId)
|
userIdO := bson.ObjectIdHex(userId)
|
||||||
var n int
|
|
||||||
if !db.Has(db.BlogLikes, bson.M{"NoteId": noteIdO, "UserId": userIdO}) {
|
if !db.Has(db.BlogLikes, bson.M{"NoteId": noteIdO, "UserId": userIdO}) {
|
||||||
n = 1
|
|
||||||
// 添加之
|
// 添加之
|
||||||
db.Insert(db.BlogLikes, info.BlogLike{LikeId: bson.NewObjectId(), NoteId: noteIdO, UserId: userIdO, CreatedTime: time.Now()})
|
db.Insert(db.BlogLikes, info.BlogLike{LikeId: bson.NewObjectId(), NoteId: noteIdO, UserId: userIdO, CreatedTime: time.Now()})
|
||||||
isLike = true
|
isLike = true
|
||||||
} else {
|
} else {
|
||||||
// 已点过, 那么删除之
|
// 已点过, 那么删除之
|
||||||
n = -1
|
|
||||||
db.Delete(db.BlogLikes, bson.M{"NoteId": noteIdO, "UserId": userIdO})
|
db.Delete(db.BlogLikes, bson.M{"NoteId": noteIdO, "UserId": userIdO})
|
||||||
isLike = false
|
isLike = false
|
||||||
}
|
}
|
||||||
ok = db.Update(db.Notes, bson.M{"_id": noteIdO}, bson.M{"$inc": bson.M{"LikeNum": n}})
|
|
||||||
|
count := db.Count(db.BlogLikes, bson.M{"NoteId": noteIdO})
|
||||||
|
ok = db.UpdateByQI(db.Notes, bson.M{"_id": noteIdO}, bson.M{"LikeNum": count})
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -1108,6 +1107,7 @@ func (this *BlogService) SortSingles(userId string, singleIds []string) (ok bool
|
|||||||
|
|
||||||
// 得到用户的博客url
|
// 得到用户的博客url
|
||||||
func (this *BlogService) GetUserBlogUrl(userBlog *info.UserBlog, username string) string {
|
func (this *BlogService) GetUserBlogUrl(userBlog *info.UserBlog, username string) string {
|
||||||
|
/*
|
||||||
if userBlog != nil {
|
if userBlog != nil {
|
||||||
if userBlog.Domain != "" && configService.AllowCustomDomain() {
|
if userBlog.Domain != "" && configService.AllowCustomDomain() {
|
||||||
return configService.GetUserUrl(userBlog.Domain)
|
return configService.GetUserUrl(userBlog.Domain)
|
||||||
@@ -1118,12 +1118,15 @@ func (this *BlogService) GetUserBlogUrl(userBlog *info.UserBlog, username string
|
|||||||
username = userBlog.UserId.Hex()
|
username = userBlog.UserId.Hex()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
return configService.GetBlogUrl() + "/" + username
|
return configService.GetBlogUrl() + "/" + username
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到所有url
|
// 得到所有url
|
||||||
func (this *BlogService) GetBlogUrls(userBlog *info.UserBlog, userInfo *info.User) info.BlogUrls {
|
func (this *BlogService) GetBlogUrls(userBlog *info.UserBlog, userInfo *info.User) info.BlogUrls {
|
||||||
var indexUrl, postUrl, searchUrl, cateUrl, singleUrl, tagsUrl, archiveUrl, tagPostsUrl string
|
var indexUrl, postUrl, searchUrl, cateUrl, singleUrl, tagsUrl, archiveUrl, tagPostsUrl string
|
||||||
|
|
||||||
|
/*
|
||||||
if userBlog.Domain != "" && configService.AllowCustomDomain() { // http://demo.com
|
if userBlog.Domain != "" && configService.AllowCustomDomain() { // http://demo.com
|
||||||
// ok
|
// ok
|
||||||
indexUrl = configService.GetUserUrl(userBlog.Domain)
|
indexUrl = configService.GetUserUrl(userBlog.Domain)
|
||||||
@@ -1144,6 +1147,7 @@ func (this *BlogService) GetBlogUrls(userBlog *info.UserBlog, userInfo *info.Use
|
|||||||
tagsUrl = indexUrl + "/tags"
|
tagsUrl = indexUrl + "/tags"
|
||||||
tagPostsUrl = indexUrl + "/tag"
|
tagPostsUrl = indexUrl + "/tag"
|
||||||
} else {
|
} else {
|
||||||
|
*/
|
||||||
// ok
|
// ok
|
||||||
blogUrl := configService.GetBlogUrl() // blog.leanote.com
|
blogUrl := configService.GetBlogUrl() // blog.leanote.com
|
||||||
userIdOrEmail := ""
|
userIdOrEmail := ""
|
||||||
@@ -1162,7 +1166,7 @@ func (this *BlogService) GetBlogUrls(userBlog *info.UserBlog, userInfo *info.Use
|
|||||||
archiveUrl = blogUrl + "/archives/" + userIdOrEmail // blog.leanote.com/archive/username
|
archiveUrl = blogUrl + "/archives/" + userIdOrEmail // blog.leanote.com/archive/username
|
||||||
tagsUrl = blogUrl + "/tags/" + userIdOrEmail
|
tagsUrl = blogUrl + "/tags/" + userIdOrEmail
|
||||||
tagPostsUrl = blogUrl + "/tag/" + userIdOrEmail // blog.leanote.com/archive/username
|
tagPostsUrl = blogUrl + "/tag/" + userIdOrEmail // blog.leanote.com/archive/username
|
||||||
}
|
// }
|
||||||
|
|
||||||
return info.BlogUrls{
|
return info.BlogUrls{
|
||||||
IndexUrl: indexUrl,
|
IndexUrl: indexUrl,
|
||||||
|
|||||||
@@ -49,7 +49,8 @@ func (this *ConfigService) InitGlobalConfigs() bool {
|
|||||||
this.adminUserId = userInfo.UserId.Hex()
|
this.adminUserId = userInfo.UserId.Hex()
|
||||||
|
|
||||||
configs := []info.Config{}
|
configs := []info.Config{}
|
||||||
db.ListByQ(db.Configs, bson.M{"UserId": userInfo.UserId}, &configs)
|
// db.ListByQ(db.Configs, bson.M{"UserId": userInfo.UserId}, &configs)
|
||||||
|
db.ListByQ(db.Configs, bson.M{}, &configs)
|
||||||
|
|
||||||
for _, config := range configs {
|
for _, config := range configs {
|
||||||
if config.IsArr {
|
if config.IsArr {
|
||||||
@@ -67,10 +68,20 @@ func (this *ConfigService) InitGlobalConfigs() bool {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// site URL
|
||||||
|
if s, ok := this.GlobalStringConfigs["siteUrl"]; !ok || s != "" {
|
||||||
|
this.GlobalStringConfigs["siteUrl"] = this.siteUrl
|
||||||
|
}
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *ConfigService) GetSiteUrl() string {
|
func (this *ConfigService) GetSiteUrl() string {
|
||||||
|
s := this.GetGlobalStringConfig("siteUrl")
|
||||||
|
if s != "" {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
return this.siteUrl
|
return this.siteUrl
|
||||||
}
|
}
|
||||||
func (this *ConfigService) GetAdminUsername() string {
|
func (this *ConfigService) GetAdminUsername() string {
|
||||||
@@ -86,7 +97,7 @@ func (this *ConfigService) updateGlobalConfig(userId, key string, value interfac
|
|||||||
if _, ok := this.GlobalAllConfigs[key]; !ok {
|
if _, ok := this.GlobalAllConfigs[key]; !ok {
|
||||||
// 需要添加
|
// 需要添加
|
||||||
config := info.Config{ConfigId: bson.NewObjectId(),
|
config := info.Config{ConfigId: bson.NewObjectId(),
|
||||||
UserId: bson.ObjectIdHex(userId),
|
UserId: bson.ObjectIdHex(userId), // 没用
|
||||||
Key: key,
|
Key: key,
|
||||||
IsArr: isArr,
|
IsArr: isArr,
|
||||||
IsMap: isMap,
|
IsMap: isMap,
|
||||||
@@ -131,7 +142,8 @@ func (this *ConfigService) updateGlobalConfig(userId, key string, value interfac
|
|||||||
i["ValueStr"] = v
|
i["ValueStr"] = v
|
||||||
this.GlobalStringConfigs[key] = v
|
this.GlobalStringConfigs[key] = v
|
||||||
}
|
}
|
||||||
return db.UpdateByQMap(db.Configs, bson.M{"UserId": bson.ObjectIdHex(userId), "Key": key}, i)
|
// return db.UpdateByQMap(db.Configs, bson.M{"UserId": bson.ObjectIdHex(userId), "Key": key}, i)
|
||||||
|
return db.UpdateByQMap(db.Configs, bson.M{"Key": key}, i)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -498,42 +510,25 @@ func (this *ConfigService) GetDefaultDomain() string {
|
|||||||
return defaultDomain
|
return defaultDomain
|
||||||
}
|
}
|
||||||
|
|
||||||
// 包含http://
|
|
||||||
func (this *ConfigService) GetDefaultUrl() string {
|
|
||||||
return schema + defaultDomain
|
|
||||||
}
|
|
||||||
|
|
||||||
// note
|
// note
|
||||||
func (this *ConfigService) GetNoteDomain() string {
|
func (this *ConfigService) GetNoteDomain() string {
|
||||||
subDomain := this.GetGlobalStringConfig("noteSubDomain")
|
return "/note"
|
||||||
if subDomain != "" {
|
|
||||||
return subDomain + port
|
|
||||||
}
|
|
||||||
return this.GetDefaultDomain() + "/note"
|
|
||||||
}
|
}
|
||||||
func (this *ConfigService) GetNoteUrl() string {
|
func (this *ConfigService) GetNoteUrl() string {
|
||||||
return schema + this.GetNoteDomain()
|
return this.GetNoteDomain()
|
||||||
}
|
}
|
||||||
|
|
||||||
// blog
|
// blog
|
||||||
func (this *ConfigService) GetBlogDomain() string {
|
func (this *ConfigService) GetBlogDomain() string {
|
||||||
subDomain := this.GetGlobalStringConfig("blogSubDomain")
|
return "/blog"
|
||||||
if subDomain != "" {
|
|
||||||
return subDomain + port
|
|
||||||
}
|
|
||||||
return this.GetDefaultDomain() + "/blog"
|
|
||||||
}
|
}
|
||||||
func (this *ConfigService) GetBlogUrl() string {
|
func (this *ConfigService) GetBlogUrl() string {
|
||||||
return schema + this.GetBlogDomain()
|
return this.GetBlogDomain()
|
||||||
}
|
}
|
||||||
|
|
||||||
// lea
|
// lea
|
||||||
func (this *ConfigService) GetLeaDomain() string {
|
func (this *ConfigService) GetLeaDomain() string {
|
||||||
subDomain := this.GetGlobalStringConfig("leaSubDomain")
|
return "/lea"
|
||||||
if subDomain != "" {
|
|
||||||
return subDomain + port
|
|
||||||
}
|
|
||||||
return this.GetDefaultDomain() + "/lea"
|
|
||||||
}
|
}
|
||||||
func (this *ConfigService) GetLeaUrl() string {
|
func (this *ConfigService) GetLeaUrl() string {
|
||||||
return schema + this.GetLeaDomain()
|
return schema + this.GetLeaDomain()
|
||||||
@@ -611,5 +606,5 @@ func (this *ConfigService) HomePageIsAdminsBlog() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *ConfigService) GetVersion() string {
|
func (this *ConfigService) GetVersion() string {
|
||||||
return "1.4"
|
return "2.4"
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,8 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"crypto/tls"
|
||||||
|
"net"
|
||||||
"bytes"
|
"bytes"
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
@@ -29,12 +31,74 @@ var host = ""
|
|||||||
var emailPort = ""
|
var emailPort = ""
|
||||||
var username = ""
|
var username = ""
|
||||||
var password = ""
|
var password = ""
|
||||||
|
var ssl = false
|
||||||
|
|
||||||
func InitEmailFromDb() {
|
func InitEmailFromDb() {
|
||||||
host = configService.GetGlobalStringConfig("emailHost")
|
host = configService.GetGlobalStringConfig("emailHost")
|
||||||
emailPort = configService.GetGlobalStringConfig("emailPort")
|
emailPort = configService.GetGlobalStringConfig("emailPort")
|
||||||
username = configService.GetGlobalStringConfig("emailUsername")
|
username = configService.GetGlobalStringConfig("emailUsername")
|
||||||
password = configService.GetGlobalStringConfig("emailPassword")
|
password = configService.GetGlobalStringConfig("emailPassword")
|
||||||
|
if configService.GetGlobalStringConfig("emailSSL") == "1" {
|
||||||
|
ssl = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//return a smtp client
|
||||||
|
func dial(addr string) (*smtp.Client, error) {
|
||||||
|
conn, err := tls.Dial("tcp", addr, nil)
|
||||||
|
if err != nil {
|
||||||
|
LogW("Dialing Error:", err)
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
//分解主机端口字符串
|
||||||
|
host, _, _ := net.SplitHostPort(addr)
|
||||||
|
return smtp.NewClient(conn, host)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SendEmailWithSSL (auth smtp.Auth, to []string, msg []byte) (err error) {
|
||||||
|
//create smtp client
|
||||||
|
c, err := dial(host + ":" + emailPort)
|
||||||
|
if err != nil {
|
||||||
|
LogW("Create smpt client error:", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
defer c.Close()
|
||||||
|
|
||||||
|
if auth != nil {
|
||||||
|
if ok, _ := c.Extension("AUTH"); ok {
|
||||||
|
if err = c.Auth(auth); err != nil {
|
||||||
|
LogW("Error during AUTH", err)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = c.Mail(username); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, addr := range to {
|
||||||
|
if err = c.Rcpt(addr); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
w, err := c.Data()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = w.Write(msg)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
err = w.Close()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.Quit()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *EmailService) SendEmail(to, subject, body string) (ok bool, e string) {
|
func (this *EmailService) SendEmail(to, subject, body string) (ok bool, e string) {
|
||||||
@@ -57,7 +121,14 @@ func (this *EmailService) SendEmail(to, subject, body string) (ok bool, e string
|
|||||||
|
|
||||||
msg := []byte("To: " + to + "\r\nFrom: " + username + "<" + username + ">\r\nSubject: " + subject + "\r\n" + content_type + "\r\n\r\n" + body)
|
msg := []byte("To: " + to + "\r\nFrom: " + username + "<" + username + ">\r\nSubject: " + subject + "\r\n" + content_type + "\r\n\r\n" + body)
|
||||||
send_to := strings.Split(to, ";")
|
send_to := strings.Split(to, ";")
|
||||||
err := smtp.SendMail(host+":"+emailPort, auth, username, send_to, msg)
|
|
||||||
|
var err error
|
||||||
|
if ssl {
|
||||||
|
err = SendEmailWithSSL(auth, send_to, msg)
|
||||||
|
} else {
|
||||||
|
Log("no ssl")
|
||||||
|
err = smtp.SendMail(host + ":" + emailPort, auth, username, send_to, msg)
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
e = fmt.Sprint(err)
|
e = fmt.Sprint(err)
|
||||||
|
|||||||
@@ -62,6 +62,35 @@ func (this *NoteService) GetNoteAndContent(noteId, userId string) (noteAndConten
|
|||||||
return info.NoteAndContent{note, noteContent}
|
return info.NoteAndContent{note, noteContent}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *NoteService) GetNoteBySrc(src, userId string) (note info.Note) {
|
||||||
|
note = info.Note{}
|
||||||
|
if src == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
notes := []info.Note{}
|
||||||
|
q := db.Notes.Find(bson.M{
|
||||||
|
"UserId": bson.ObjectIdHex(userId),
|
||||||
|
"Src": src,
|
||||||
|
})
|
||||||
|
q.Sort("-Usn").Limit(1).All(¬es)
|
||||||
|
if len(notes) > 0 {
|
||||||
|
return notes[0]
|
||||||
|
}
|
||||||
|
// db.GetByQ(db.Notes, bson.M{"Src": src, "UserId": bson.ObjectIdHex(userId), "IsDeleted": false}, ¬e)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (this *NoteService) GetNoteAndContentBySrc(src, userId string) (noteId string, noteAndContent info.NoteAndContentSep) {
|
||||||
|
note := this.GetNoteBySrc(src, userId)
|
||||||
|
if (note.NoteId != "") {
|
||||||
|
noteId = note.NoteId.Hex()
|
||||||
|
noteContent := this.GetNoteContent(note.NoteId.Hex(), userId)
|
||||||
|
return noteId, info.NoteAndContentSep{note, noteContent}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// 获取同步的笔记
|
// 获取同步的笔记
|
||||||
// > afterUsn的笔记
|
// > afterUsn的笔记
|
||||||
func (this *NoteService) GetSyncNotes(userId string, afterUsn, maxEntry int) []info.ApiNote {
|
func (this *NoteService) GetSyncNotes(userId string, afterUsn, maxEntry int) []info.ApiNote {
|
||||||
@@ -415,9 +444,15 @@ func (this *NoteService) UpdateNote(updatedUserId, noteId string, needUpdate bso
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// 这里不再判断, 因为controller已经判断了, 删除附件会新增, 所以不用判断
|
||||||
if usn > 0 && note.Usn != usn {
|
if usn > 0 && note.Usn != usn {
|
||||||
|
Log("有冲突!!")
|
||||||
|
Log(note.Usn)
|
||||||
|
Log(usn)
|
||||||
return false, "conflict", 0
|
return false, "conflict", 0
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
// 是否已自定义
|
// 是否已自定义
|
||||||
if note.IsBlog && note.HasSelfDefined {
|
if note.IsBlog && note.HasSelfDefined {
|
||||||
@@ -438,11 +473,7 @@ func (this *NoteService) UpdateNote(updatedUserId, noteId string, needUpdate bso
|
|||||||
afterUsn := userService.IncrUsn(userId)
|
afterUsn := userService.IncrUsn(userId)
|
||||||
needUpdate["Usn"] = afterUsn
|
needUpdate["Usn"] = afterUsn
|
||||||
|
|
||||||
// 添加tag2
|
needRecountTags := false
|
||||||
// TODO 这个tag去掉, 添加tag另外添加, 不要这个
|
|
||||||
if tags, ok := needUpdate["Tags"]; ok {
|
|
||||||
tagService.AddTagsI(userId, tags)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 是否修改了isBlog
|
// 是否修改了isBlog
|
||||||
// 也要修改noteContents的IsBlog
|
// 也要修改noteContents的IsBlog
|
||||||
@@ -455,6 +486,19 @@ func (this *NoteService) UpdateNote(updatedUserId, noteId string, needUpdate bso
|
|||||||
if !note.IsBlog {
|
if !note.IsBlog {
|
||||||
needUpdate["PublicTime"] = needUpdate["UpdatedTime"]
|
needUpdate["PublicTime"] = needUpdate["UpdatedTime"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
needRecountTags = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 添加tag2
|
||||||
|
// TODO 这个tag去掉, 添加tag另外添加, 不要这个
|
||||||
|
if tags, ok := needUpdate["Tags"]; ok {
|
||||||
|
tagService.AddTagsI(userId, tags)
|
||||||
|
|
||||||
|
// 如果是博客, 标签改了, 那么重新计算
|
||||||
|
if note.IsBlog {
|
||||||
|
needRecountTags = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -463,6 +507,13 @@ func (this *NoteService) UpdateNote(updatedUserId, noteId string, needUpdate bso
|
|||||||
return ok, "", 0
|
return ok, "", 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if needRecountTags {
|
||||||
|
// 重新计算tags
|
||||||
|
go (func() {
|
||||||
|
blogService.ReCountBlogTags(userId)
|
||||||
|
})()
|
||||||
|
}
|
||||||
|
|
||||||
// 重新获取之
|
// 重新获取之
|
||||||
note = this.GetNoteById(noteId)
|
note = this.GetNoteById(noteId)
|
||||||
|
|
||||||
@@ -841,7 +892,13 @@ func (this *NoteService) searchNoteFromContent(notes []info.Note, userId, key st
|
|||||||
notes2 := this.ListNotesByNoteIds(noteIds2)
|
notes2 := this.ListNotesByNoteIds(noteIds2)
|
||||||
|
|
||||||
// 合并之
|
// 合并之
|
||||||
notes = append(notes, notes2...)
|
// 不能是删除的
|
||||||
|
for _, n := range notes2 {
|
||||||
|
if !n.IsDeleted && !n.IsTrash {
|
||||||
|
// notes = append(notes, notes2...)
|
||||||
|
notes = append(notes, n)
|
||||||
|
}
|
||||||
|
}
|
||||||
return notes
|
return notes
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1001,6 +1058,8 @@ func (this *NoteService) FixContentBad(content string, isMarkdown bool) string {
|
|||||||
return content
|
return content
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 得到笔记的内容, 此时将笔记内的链接转成标准的Leanote Url
|
||||||
|
// 将笔记的图片, 附件链接转换成 site.url/file/getImage?fileId=xxx, site.url/file/getAttach?fileId=xxxx
|
||||||
// 性能更好, 5倍的差距
|
// 性能更好, 5倍的差距
|
||||||
func (this *NoteService) FixContent(content string, isMarkdown bool) string {
|
func (this *NoteService) FixContent(content string, isMarkdown bool) string {
|
||||||
baseUrl := configService.GetSiteUrl()
|
baseUrl := configService.GetSiteUrl()
|
||||||
@@ -1013,12 +1072,19 @@ func (this *NoteService) FixContent(content string, isMarkdown bool) string {
|
|||||||
} else {
|
} else {
|
||||||
baseUrlPattern = strings.Replace(baseUrl, "http://", "https*://", 1)
|
baseUrlPattern = strings.Replace(baseUrl, "http://", "https*://", 1)
|
||||||
}
|
}
|
||||||
|
baseUrlPattern = "(?:" + baseUrlPattern + ")*"
|
||||||
|
|
||||||
|
Log(baseUrlPattern)
|
||||||
|
|
||||||
patterns := []map[string]string{
|
patterns := []map[string]string{
|
||||||
|
map[string]string{"src": "src", "middle": "/api/file/getImage", "param": "fileId", "to": "getImage?fileId="},
|
||||||
map[string]string{"src": "src", "middle": "/file/outputImage", "param": "fileId", "to": "getImage?fileId="},
|
map[string]string{"src": "src", "middle": "/file/outputImage", "param": "fileId", "to": "getImage?fileId="},
|
||||||
|
|
||||||
map[string]string{"src": "href", "middle": "/attach/download", "param": "attachId", "to": "getAttach?fileId="},
|
map[string]string{"src": "href", "middle": "/attach/download", "param": "attachId", "to": "getAttach?fileId="},
|
||||||
|
map[string]string{"src": "href", "middle": "/api/file/getAtach", "param": "fileId", "to": "getAttach?fileId="},
|
||||||
|
|
||||||
// 该链接已失效, 不再支持
|
// 该链接已失效, 不再支持
|
||||||
map[string]string{"src": "href", "middle": "/attach/downloadAll", "param": "noteId", "to": "getAllAttachs?noteId="},
|
// map[string]string{"src": "href", "middle": "/attach/downloadAll", "param": "noteId", "to": "getAllAttachs?noteId="},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, eachPattern := range patterns {
|
for _, eachPattern := range patterns {
|
||||||
@@ -1040,6 +1106,8 @@ func (this *NoteService) FixContent(content string, isMarkdown bool) string {
|
|||||||
reg2, _ = regexp.Compile("<a(?:[^>]+?)(" + eachPattern["src"] + `=['"]*` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})["']*)[^>]*>`)
|
reg2, _ = regexp.Compile("<a(?:[^>]+?)(" + eachPattern["src"] + `=['"]*` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})["']*)[^>]*>`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Log(reg2)
|
||||||
|
|
||||||
content = reg.ReplaceAllStringFunc(content, func(str string) string {
|
content = reg.ReplaceAllStringFunc(content, func(str string) string {
|
||||||
// str=这样的
|
// str=这样的
|
||||||
// <img src="http://localhost:9000/file/outputImage?fileId=563d706e99c37b48e0000001" alt="" data-mce-src="http://localhost:9000/file/outputImage?fileId=563d706e99c37b48e0000002">
|
// <img src="http://localhost:9000/file/outputImage?fileId=563d706e99c37b48e0000001" alt="" data-mce-src="http://localhost:9000/file/outputImage?fileId=563d706e99c37b48e0000002">
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package service
|
|||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
. "github.com/leanote/leanote/app/lea"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@@ -61,6 +61,14 @@ func (this *TagService) AddOrUpdateTag(userId string, tag string) info.NoteTag {
|
|||||||
noteTag.Count = count
|
noteTag.Count = count
|
||||||
noteTag.UpdatedTime = time.Now()
|
noteTag.UpdatedTime = time.Now()
|
||||||
// noteTag.Usn = userService.IncrUsn(userId), 更新count而已
|
// noteTag.Usn = userService.IncrUsn(userId), 更新count而已
|
||||||
|
|
||||||
|
// 之前删除过的, 现在要添加回来了
|
||||||
|
if noteTag.IsDeleted {
|
||||||
|
Log("之前删除过的, 现在要添加回来了: " + tag)
|
||||||
|
noteTag.Usn = userService.IncrUsn(userId)
|
||||||
|
noteTag.IsDeleted = false
|
||||||
|
}
|
||||||
|
|
||||||
db.UpdateByIdAndUserId(db.NoteTags, noteTag.TagId.Hex(), userId, noteTag)
|
db.UpdateByIdAndUserId(db.NoteTags, noteTag.TagId.Hex(), userId, noteTag)
|
||||||
return noteTag
|
return noteTag
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -264,8 +264,22 @@ func (this *ThemeService) GetDefaultThemes() (themes []info.Theme) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func validateFilename(filename string) bool {
|
||||||
|
// 防止用"../../来获取其它文件"
|
||||||
|
if (strings.Contains(filename, "..")) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// 得到模板内容
|
// 得到模板内容
|
||||||
func (this *ThemeService) GetTplContent(userId, themeId, filename string) string {
|
func (this *ThemeService) GetTplContent(userId, themeId, filename string) string {
|
||||||
|
if (!validateFilename(filename)) {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
path := this.GetThemeAbsolutePath(userId, themeId) + "/" + filename
|
path := this.GetThemeAbsolutePath(userId, themeId) + "/" + filename
|
||||||
return GetFileStrContent(path)
|
return GetFileStrContent(path)
|
||||||
}
|
}
|
||||||
@@ -290,6 +304,10 @@ func (this *ThemeService) GetThemePath(userId, themeId string) string {
|
|||||||
|
|
||||||
// 更新模板内容
|
// 更新模板内容
|
||||||
func (this *ThemeService) UpdateTplContent(userId, themeId, filename, content string) (ok bool, msg string) {
|
func (this *ThemeService) UpdateTplContent(userId, themeId, filename, content string) (ok bool, msg string) {
|
||||||
|
if (!validateFilename(filename)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
basePath := this.GetThemeAbsolutePath(userId, themeId)
|
basePath := this.GetThemeAbsolutePath(userId, themeId)
|
||||||
path := basePath + "/" + filename
|
path := basePath + "/" + filename
|
||||||
if strings.Contains(filename, ".html") {
|
if strings.Contains(filename, ".html") {
|
||||||
@@ -326,6 +344,10 @@ func (this *ThemeService) UpdateTplContent(userId, themeId, filename, content st
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *ThemeService) DeleteTpl(userId, themeId, filename string) (ok bool) {
|
func (this *ThemeService) DeleteTpl(userId, themeId, filename string) (ok bool) {
|
||||||
|
if (!validateFilename(filename)) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
path := this.GetThemeAbsolutePath(userId, themeId) + "/" + filename
|
path := this.GetThemeAbsolutePath(userId, themeId) + "/" + filename
|
||||||
ok = DeleteFile(path)
|
ok = DeleteFile(path)
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ func (this *UserService) setUserLogo(user *info.User) {
|
|||||||
}
|
}
|
||||||
if user.Logo != "" && !strings.HasPrefix(user.Logo, "http") {
|
if user.Logo != "" && !strings.HasPrefix(user.Logo, "http") {
|
||||||
user.Logo = strings.Trim(user.Logo, "/")
|
user.Logo = strings.Trim(user.Logo, "/")
|
||||||
user.Logo = configService.GetSiteUrl() + "/" + user.Logo
|
user.Logo = "/" + user.Logo
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package tests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/revel/revel"
|
||||||
|
"github.com/leanote/leanote/app/db"
|
||||||
|
"testing"
|
||||||
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
|
"github.com/leanote/leanote/app/service"
|
||||||
|
// "gopkg.in/mgo.v2"
|
||||||
|
// "fmt"
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
revel.Init("dev", "github.com/leanote/leanote", "/Users/life/Documents/Go/package_base/src")
|
||||||
|
db.Init("mongodb://localhost:27017/leanote", "leanote")
|
||||||
|
service.InitService()
|
||||||
|
service.ConfigS.InitGlobalConfigs()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 测试登录
|
||||||
|
func TestSendMail(t *testing.T) {
|
||||||
|
ok, err := service.EmailS.SendEmail("life@leanote.com", "你好", "你好吗")
|
||||||
|
t.Log(ok)
|
||||||
|
t.Log(err)
|
||||||
|
}
|
||||||
@@ -0,0 +1,32 @@
|
|||||||
|
package tests
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/leanote/leanote/app/db"
|
||||||
|
"github.com/revel/revel"
|
||||||
|
"testing"
|
||||||
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
|
"github.com/leanote/leanote/app/service"
|
||||||
|
// "regexp"
|
||||||
|
// "gopkg.in/mgo.v2"
|
||||||
|
// "fmt"
|
||||||
|
// "strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
// 可在server端调试
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
revel.Init("dev", "github.com/leanote/leanote", "/Users/life/Documents/Go/package_base/src")
|
||||||
|
db.Init("mongodb://localhost:27017/leanote", "leanote")
|
||||||
|
service.InitService()
|
||||||
|
service.ConfigS.InitGlobalConfigs()
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestApiFixNoteContent2(t *testing.T) {
|
||||||
|
note2 := service.NoteS.GetNote("585df83771c1b17e8a000000", "585df81199c37b6176000004")
|
||||||
|
note := service.NoteS.GetNoteContent("585df83771c1b17e8a000000", "585df81199c37b6176000004")
|
||||||
|
contentFixed := service.NoteS.FixContent(note.Content, false)
|
||||||
|
t.Log(note2.Title)
|
||||||
|
t.Log(note.Content)
|
||||||
|
t.Log(contentFixed)
|
||||||
|
}
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
package tests
|
||||||
|
|
||||||
|
import (
|
||||||
|
// "github.com/leanote/leanote/app/db"
|
||||||
|
"testing"
|
||||||
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
|
// "github.com/leanote/leanote/app/service"
|
||||||
|
// "gopkg.in/mgo.v2"
|
||||||
|
// "fmt"
|
||||||
|
"regexp"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
// 测试登录
|
||||||
|
func TestReg(t *testing.T) {
|
||||||
|
a := `<a href="http://localhost:9000/api/file/getAttach?fileId=585e0e9c270a35609300000c" target="_blank" data-mce-href="http://localhost:9000/api/file/getAttach?fileId=585e0e9c270a35609300000c">proxy.go</a>`
|
||||||
|
reg, _ := regexp.Compile(`"https*://[^/]*?/api/file/getAttach\?fileId=585e0e9c270a35609300000c`)
|
||||||
|
|
||||||
|
a2 := reg.ReplaceAllString(a, `"`)
|
||||||
|
t.Log(a2)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -24,6 +24,10 @@
|
|||||||
<label>Password</label>
|
<label>Password</label>
|
||||||
<input type="text" class="form-control" name="emailPassword" value="{{.str.emailPassword}}" placeholder="">
|
<input type="text" class="form-control" name="emailPassword" value="{{.str.emailPassword}}" placeholder="">
|
||||||
</div>
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label>SSL ?</label>
|
||||||
|
<input type="checkbox" class="form-control" name="emailSSL" {{if .str.emailSSL}}checked="checked"{{end}} value="1">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<footer class="panel-footer text-right bg-light lter">
|
<footer class="panel-footer text-right bg-light lter">
|
||||||
|
|||||||
@@ -131,6 +131,15 @@
|
|||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
<ul class="nav lt">
|
<ul class="nav lt">
|
||||||
|
|
||||||
|
<li>
|
||||||
|
<a href="/admin/t?t=setting/site_url">
|
||||||
|
<span>
|
||||||
|
Site's URL
|
||||||
|
</span>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
<li>
|
<li>
|
||||||
<a href="/admin/t?t=setting/home_page">
|
<a href="/admin/t?t=setting/home_page">
|
||||||
<span>
|
<span>
|
||||||
@@ -216,6 +225,7 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
<!--
|
||||||
<li>
|
<li>
|
||||||
<a href="#">
|
<a href="#">
|
||||||
<i class="fa fa-space-shuttle icon">
|
<i class="fa fa-space-shuttle icon">
|
||||||
@@ -250,5 +260,6 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
|
-->
|
||||||
</ul>
|
</ul>
|
||||||
</nav>
|
</nav>
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
{{template "admin/top.html" .}}
|
||||||
|
<div class="m-b-md"> <h3 class="m-b-none">Site's URL</h3></div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<form id="add_user_form">
|
||||||
|
<section class="panel panel-default">
|
||||||
|
<div class="panel-body">
|
||||||
|
<div class="form-group">
|
||||||
|
<label>Site's URL</label>
|
||||||
|
<input type="text" class="form-control" name="siteUrl" value="{{.str.siteUrl}}" placeholder="http://localhost:9000">
|
||||||
|
Please note that if the value isn't blank, it will override the "siteUrl" configuration on app.conf.
|
||||||
|
<br>
|
||||||
|
Site's URL will be used to upload images, find password, and send email...
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<footer class="panel-footer text-right bg-light lter">
|
||||||
|
<button type="submit" id="submit" class="btn btn-success btn-s-xs">Submit</button>
|
||||||
|
</footer>
|
||||||
|
</section>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{{template "admin/footer.html" .}}
|
||||||
|
<script src="/public/admin/js/jquery-validation-1.13.0/jquery.validate.js"></script>
|
||||||
|
<script>
|
||||||
|
$(function() {
|
||||||
|
init_validator("#add_user_form");
|
||||||
|
$("#submit").click(function(e){
|
||||||
|
e.preventDefault();
|
||||||
|
var t = this;
|
||||||
|
if($("#add_user_form").valid()) {
|
||||||
|
$(t).button('loading');
|
||||||
|
ajaxPost("/adminSetting/doSiteUrl", getFormJsonData("add_user_form"), function(ret){
|
||||||
|
$(t).button('reset');
|
||||||
|
if(!ret.Ok) {
|
||||||
|
art.alert(ret.Msg);
|
||||||
|
} else {
|
||||||
|
art.tips("Success");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
{{template "admin/end.html" .}}
|
||||||
+12
-19
@@ -16,37 +16,30 @@
|
|||||||
<script src="/public/admin/js/ie/excanvas.js"></script>
|
<script src="/public/admin/js/ie/excanvas.js"></script>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
</head>
|
</head>
|
||||||
<body class="">
|
<body class="lang-{{$.locale}}">
|
||||||
<section class="vbox">
|
<section class="vbox">
|
||||||
<header class="bg-dark dk header navbar navbar-fixed-top-xs">
|
<header class="bg-dark dk header navbar navbar-fixed-top-xs">
|
||||||
<div class="navbar-header aside-md clearfix" id="logo">
|
|
||||||
<a href="/admin/index" class="navbar-brand" data-toggle="fullscreen"></a>
|
<div class="navbar-header logo-ctn">
|
||||||
<div>Admin</div>
|
<a href="/admin/index" class="navbar-brand clearfix" data-toggle="fullscreen">
|
||||||
|
<span id="logo"></span>
|
||||||
|
<span class="logo-title">Admin</span>
|
||||||
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ul class="nav navbar-nav navbar-right m-n hidden-xs nav-user">
|
<ul class="nav navbar-nav navbar-right m-n hidden-xs nav-user">
|
||||||
<li class="hidden-xs">
|
<li class="hidden-xs">
|
||||||
<a href="http://leanote.com" class="dk" target="_blank">
|
<a href="/" class="dk">
|
||||||
Leanote Home
|
Home
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="hidden-xs">
|
<li class="hidden-xs">
|
||||||
<a href="https://github.com/leanote/leanote" class="dk" target="_blank">
|
<a href="/note" class="dk">
|
||||||
Leanote Github
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li class="hidden-xs">
|
|
||||||
<a href="http://lea.leanote.com" class="dk" target="_blank">
|
|
||||||
lea++
|
|
||||||
</a>
|
|
||||||
</li>
|
|
||||||
<li class="hidden-xs">
|
|
||||||
<a href="/note" class="dk" target="_blank">
|
|
||||||
My Note
|
My Note
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="hidden-xs">
|
<li class="hidden-xs">
|
||||||
<a href="/blog" class="dk" target="_blank">
|
<a href="/blog" class="dk">
|
||||||
My Blog
|
My Blog
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
@@ -84,7 +77,7 @@
|
|||||||
</section>
|
</section>
|
||||||
<footer class="footer lt hidden-xs b-t b-light" style="min-height: initial;
|
<footer class="footer lt hidden-xs b-t b-light" style="min-height: initial;
|
||||||
padding: 10px 15px;text-align:center;">
|
padding: 10px 15px;text-align:center;">
|
||||||
<a href="http://leanote.com" target="_blank">leanote</a> © 2015
|
© <a href="https://leanote.com" target="_blank">Leanote</a>
|
||||||
<!--
|
<!--
|
||||||
<a href="#nav" data-toggle="class:nav-xs" class="pull-right btn btn-sm btn-default btn-icon">
|
<a href="#nav" data-toggle="class:nav-xs" class="pull-right btn btn-sm btn-default btn-icon">
|
||||||
<i class="fa fa-angle-left text">
|
<i class="fa fa-angle-left text">
|
||||||
|
|||||||
@@ -161,6 +161,6 @@ var UrlPrefix = '{{.siteUrl}}';
|
|||||||
<script src="/public/album/js/main.js"></script>
|
<script src="/public/album/js/main.js"></script>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<script src="/public/album/js/main.all.js"></script>
|
<script src="/public/album/js/main.all.js?i=2"></script>
|
||||||
|
|
||||||
</html>
|
</html>
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
{{template "blog/header.html" .}}
|
|
||||||
|
|
||||||
<div id="postsContainer">
|
|
||||||
<div id="posts">
|
|
||||||
<div class="each-post">
|
|
||||||
<div class="title">
|
|
||||||
{{msg . "aboutMe"}}
|
|
||||||
</div>
|
|
||||||
<div class="created-time">
|
|
||||||
</div>
|
|
||||||
<div class="desc">
|
|
||||||
{{.userBlog.AboutMe | raw}}
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{template "blog/footer.html" .}}
|
|
||||||
@@ -1,204 +0,0 @@
|
|||||||
<!-- 赞 -->
|
|
||||||
<div class="entry-controls clearfix">
|
|
||||||
<div class="vote-section-wrapper clearfix">
|
|
||||||
<button class="btn btn-default btn-zan" id="likeBtn"><i class="fa fa-thumbs-o-up"></i> <span id="likeNum">{{.blog.LikeNum}}</span> {{msg . "like"}}</button>
|
|
||||||
<span class="control-item read-counts"><i class="fa fa-eye"></i> {{if .blog.ReadNum}}{{.blog.ReadNum}}{{else}}1{{end}} {{msg . "viewers"}}</span>
|
|
||||||
</div>
|
|
||||||
<div class="right-section">
|
|
||||||
<div id="weixinQRCode"></div>
|
|
||||||
<!-- google+
|
|
||||||
<g:plusone size=”medium”></g:plusone>
|
|
||||||
-->
|
|
||||||
<button class="btn btn-share btn-default btn-weibo"><i class="fa fa-weibo"></i> {{msg . "sinaWeibo"}}</button>
|
|
||||||
<button class="btn btn-share btn-default btn-weixin"><i class="fa fa-wechat"></i> {{msg . "weixin"}}</button>
|
|
||||||
<div class="dropdown" style="display: inline-block; cursor: pointer; padding: 5px 10px;">
|
|
||||||
<!-- open -->
|
|
||||||
<div class="dropdown-toggle" data-hover="dropdown" data-toggle="dropdown">
|
|
||||||
<i class="fa fa-share-square-o"></i>
|
|
||||||
{{msg . "moreShare"}}
|
|
||||||
</div>
|
|
||||||
<ul class="dropdown-menu" role="menu">
|
|
||||||
<li><a href="#" class="btn-share tencent-weibo"><i class="fa fa-tencent-weibo"></i> {{msg . "tencentWeibo"}}</a></li>
|
|
||||||
<li><a href="#" class="btn-share qq"><i class="fa fa-qq"></i> {{msg . "qqZone"}}</a></li>
|
|
||||||
<li><a href="#" class="btn-share renren"><i class="fa fa-renren"></i> {{msg . "renren"}}</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<!-- 举报 -->
|
|
||||||
{{if eq .locale "zh"}}
|
|
||||||
<div style="display: inline-block">
|
|
||||||
<a id="reportBtn"><i class="fa fa-flag-o"></i> {{msg . "report"}}</a>
|
|
||||||
</div>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
||||||
<div class="voters clearfix" id="likers">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script type="text/x-jsrender" id="tLikers">
|
|
||||||
[[for users]]
|
|
||||||
<a id="liker_[[:UserId]]" href="[[:~root.blogUrl]]/[[:Username]]" target="_blank" class="voter">
|
|
||||||
[[if Logo]]
|
|
||||||
<img alt="avatar" class="avatar-small" src="[[:Logo]]">
|
|
||||||
[[else]]
|
|
||||||
<img alt="avatar" class="avatar-small" src="/images/blog/default_avatar.png">
|
|
||||||
[[/if]]
|
|
||||||
</a>
|
|
||||||
[[/for]]
|
|
||||||
</script>
|
|
||||||
{{if and .userBlog.CanComment (not (eq .userBlog.CommentType "disqus"))}}
|
|
||||||
|
|
||||||
<script type="text/x-jsrender" id="tComments">
|
|
||||||
[[for comments]]
|
|
||||||
<li class="comment-item">
|
|
||||||
<!-- 头像 -->
|
|
||||||
<a ui-hovercard="" target="_blank" class="avatar-link" title="[[:UserInfo.Username]]" href="[[:~root.blogUrl]]/[[:UserInfo.Username]]">
|
|
||||||
<img class="avatar" src="[[:UserInfo.Logo]]">
|
|
||||||
</a>
|
|
||||||
<!-- 评论 -->
|
|
||||||
<div class="comment-body">
|
|
||||||
<div class="comment-hd">
|
|
||||||
<a href="[[:~root.blogUrl]]/[[:UserInfo.Username]]" target="_blank" >[[:UserInfo.Username]]</a>
|
|
||||||
[[if IsAuthorComment]]
|
|
||||||
<span>({{msg . "author"}})</span>
|
|
||||||
[[/if]]
|
|
||||||
|
|
||||||
<!-- 回复其它人 -->
|
|
||||||
[[if ToUserInfo]]
|
|
||||||
<span class="in-reply-to">
|
|
||||||
{{rawMsg . "reply"}}
|
|
||||||
<a href="[[:~root.blogUrl]]/[[:ToUserInfo.Username]]">[[:ToUserInfo.Username]]</a>
|
|
||||||
</span>
|
|
||||||
[[if ToUserIsAuthor]]
|
|
||||||
<span>({{msg . "author"}})</span>
|
|
||||||
[[/if]]
|
|
||||||
[[/if]]
|
|
||||||
</div>
|
|
||||||
<div class="comment-content ng-binding" ng-bind-html="comment.content">
|
|
||||||
[[html:Content]]
|
|
||||||
</div>
|
|
||||||
<div class="comment-ft clearfix" data-comment-id="[[:CommentId]]" >
|
|
||||||
<span title="" ui-time="" class="date">[[:PublishDate]] </span>
|
|
||||||
<span class="like-num [[if !LikeNum]]hide[[/if]]" title="[[:LikeNum]] {{rawMsg . "like"}}"><span class="like-num-i">[[:LikeNum]]</span> {{rawMsg . "like"}}</span></span>
|
|
||||||
|
|
||||||
[[if ~root.visitUserInfo.UserId]]
|
|
||||||
[[if IsMyNote && !IsMyComment]]
|
|
||||||
<a href="javascript:;" class="comment-trash op-link "><i class="fa fa-trash"></i> {{rawMsg . "delete"}}</a>
|
|
||||||
[[/if]]
|
|
||||||
[[if !IsMyComment]]
|
|
||||||
<a href="javascript:;" class="comment-reply op-link ">
|
|
||||||
<i class="fa fa-reply"></i>
|
|
||||||
{{rawMsg . "reply"}}
|
|
||||||
</a>
|
|
||||||
<a href="javascript:;" class="comment-like op-link"><i class="fa fa-thumbs-o-up"></i> <span class="like-text">[[if IsILikeIt]]{{rawMsg . "unlike"}}[[else]]{{rawMsg . "like"}}[[/if]]</span></a>
|
|
||||||
{{if eq .locale "zh"}}
|
|
||||||
<a href="javascript:;" class="comment-report op-link "><i class="fa fa-flag-o"></i> {{rawMsg . "report"}}</a>
|
|
||||||
{{end}}
|
|
||||||
[[else]]
|
|
||||||
<a href="javascript:;" class="comment-trash op-link "><i class="fa fa-trash"></i> {{rawMsg . "delete"}}</a>
|
|
||||||
[[/if]]
|
|
||||||
[[/if]]
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- 回复该评论 -->
|
|
||||||
[[if ~root.visitUserInfo.UserId]]
|
|
||||||
<form class="comment-form comment-box-ft">
|
|
||||||
<div class="clearfix">
|
|
||||||
<div class="avatar-wrap">
|
|
||||||
<img class="avatar" src="[[:~root.visitUserInfo.Logo]]">
|
|
||||||
</div>
|
|
||||||
<div class="editor-wrap">
|
|
||||||
<textarea class="editable" id="commentContent" name="commentContent" placeholder="{{rawMsg . "reply"}}"></textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="command clearfix" style="display: block;">
|
|
||||||
<button class="reply-comment-btn save btn btn-primary" data-comment-id="[[:CommentId]]">{{rawMsg . "comment"}}</button>
|
|
||||||
<a class="cancel reply-cancel btn-link">{{rawMsg . "cancel"}}</a>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
[[/if]]
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
[[/for]]
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<!-- 评论 -->
|
|
||||||
<div class="comment-box hide">
|
|
||||||
{{if .visitUserInfo.UserId}}
|
|
||||||
<form class="comment-form comment-box-ft" id="commentForm">
|
|
||||||
<div class="clearfix">
|
|
||||||
<div class="avatar-wrap">
|
|
||||||
<img class="avatar" src="{{.visitUserInfo.Logo}}">
|
|
||||||
</div>
|
|
||||||
<div class="editor-wrap">
|
|
||||||
<textarea class="editable" id="commentContent" name="commentContent" placeholder="{{msg . "comment"}}" style="height: 100px;"></textarea>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="command clearfix" style="display: block;">
|
|
||||||
<button id="commentBtn" class="reply-comment-btn save btn btn-primary">{{msg . "comment"}}</button>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
{{else}}
|
|
||||||
<div class="needLogin">
|
|
||||||
<a onclick="goLogin()">{{msg . "signIn"}}</a>, {{msg . "submitComment"}}.
|
|
||||||
<br />
|
|
||||||
没有帐号? <a onclick="goRegister()">{{msg . "signUp"}}</a>
|
|
||||||
</div>
|
|
||||||
{{end}}
|
|
||||||
<div class="box-header">
|
|
||||||
<span class="counter">
|
|
||||||
<i class="icon icon-comment"></i><span id="commentNum">{{.blog.CommentNum}}</span> {{msg . "comments"}}
|
|
||||||
</span>
|
|
||||||
</div>
|
|
||||||
<ul id="comments">
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="moreComments">
|
|
||||||
<div class="hide comments-more">
|
|
||||||
<a>More...</a>
|
|
||||||
</div>
|
|
||||||
<div class="comments-loading">
|
|
||||||
<img src="/images/loading-32.gif" />
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{if eq .locale "zh"}}
|
|
||||||
<div id="reportMsg" class="hide">
|
|
||||||
<form class="report-form" name="reportForm">
|
|
||||||
<ul class="options clearfix">
|
|
||||||
<li><label><input required="" value="{{msg . "reportReason1"}}" name="reason" type="radio">{{msg . "reportReason1"}}</label></li>
|
|
||||||
<li><label><input required="" value="{{msg . "reportReason2"}}" name="reason" type="radio">{{msg . "reportReason2"}}</label></li>
|
|
||||||
<li><label><input required="" value="{{msg . "reportReason3"}}" name="reason" type="radio">{{msg . "reportReason3"}}</label></li>
|
|
||||||
<li><label><input required="" value="{{msg . "reportReason4"}}" name="reason" type="radio">{{msg . "reportReason4"}}</label></li>
|
|
||||||
<li><label><input required="" value="" name="reason" type="radio">{{msg . "other"}}</label></li>
|
|
||||||
</ul>
|
|
||||||
<p class="input-container" style="display: none">
|
|
||||||
<input placeholder="{{msg . "reportReason"}}" type="text" name="detail" class="form-control reason-text basic-input" />
|
|
||||||
</p>
|
|
||||||
<p class="footnote"></p>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
{{end}}
|
|
||||||
|
|
||||||
{{end}}
|
|
||||||
|
|
||||||
{{if and .userBlog.CanComment (eq .userBlog.CommentType "disqus")}}
|
|
||||||
|
|
||||||
<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}}
|
|
||||||
@@ -1,56 +0,0 @@
|
|||||||
<div id="footerContainer">
|
|
||||||
{{$userId := .userBlog.UserId.Hex}}
|
|
||||||
<div class="container" id="footer">
|
|
||||||
<div class="col-md-4">
|
|
||||||
<h3>{{msg . "blogNavs"}}</h3>
|
|
||||||
<ul>
|
|
||||||
<li><a href="{{$.blogUrl}}/{{$.userInfo.Username}}">{{msg . "home"}}</a></li>
|
|
||||||
{{range .notebooks}}
|
|
||||||
<li>
|
|
||||||
<a href="{{$.cateUrl}}/{{.NotebookId.Hex}}">{{.Title}}</a>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
<li><a href="{{$.aboutMeUrl}}">{{msg . "aboutMe"}}</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-4">
|
|
||||||
<h3>{{msg . "latestPosts"}}</h3>
|
|
||||||
<ul>
|
|
||||||
{{range .recentBlogs}}
|
|
||||||
<li title="{{.Title}}"><a href="{{$.blogUrl}}/view/{{.NoteId.Hex}}/">{{.Title}}</a></li>
|
|
||||||
{{end}}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-4">
|
|
||||||
<h3>{{msg . "quickLinks"}}</h3>
|
|
||||||
<ul>
|
|
||||||
<li><a href="{{$.noteUrl}}">{{msg . "myNote"}}</a></li>
|
|
||||||
<li><a href="{{$.siteUrl}}/login">leanote {{msg . "login"}}</a></li>
|
|
||||||
<li><a href="http://leanote.com" target="_blank">leanote {{msg . "home"}}</a></li>
|
|
||||||
<li><a href="http://lea.leanote.com" target="_blank">lea++</a></li>
|
|
||||||
<li><a href="http://bbs.leanote.com" target="_blank">leanote {{msg . "community"}}</a></li>
|
|
||||||
<li><a href="https://github.com/leanote/leanote" target="_blank">leanote github</a></li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script src="{{$.siteUrl}}/js/jquery-1.9.0.min.js"></script>
|
|
||||||
<script src="{{$.siteUrl}}/js/bootstrap-min.js"></script>
|
|
||||||
<script src="{{$.siteUrl}}/js/bootstrap-hover-dropdown.js"></script>
|
|
||||||
<script src="{{$.siteUrl}}/js/i18n/blog.{{.locale}}.js"></script>
|
|
||||||
{{if not .isMe}}
|
|
||||||
<script src="{{$.siteUrl}}/blog/isMe.js?userId={{.userBlog.UserId.Hex}}"></script>
|
|
||||||
{{end}}
|
|
||||||
<script>
|
|
||||||
// 搜索
|
|
||||||
function search(e) {
|
|
||||||
var key = $("#searchInput").val();
|
|
||||||
if(!key) {
|
|
||||||
location.href = "{{$.searchUrl}}";
|
|
||||||
} else {
|
|
||||||
var tpl = '<form action="{{$.searchUrl}}" method="get">';
|
|
||||||
tpl += '<input name="key" value="' + key + '" />';
|
|
||||||
tpl += "</form";
|
|
||||||
$(tpl).submit();
|
|
||||||
}
|
|
||||||
}␍</script>
|
|
||||||
@@ -1,104 +0,0 @@
|
|||||||
<!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, {{msg $ "moto"}}">
|
|
||||||
<meta name="author" content="leanote">
|
|
||||||
|
|
||||||
<title>{{.title}}</title>
|
|
||||||
<!-- Bootstrap core CSS -->
|
|
||||||
<link href="{{.siteUrl}}/css/bootstrap.css" rel="stylesheet">
|
|
||||||
<!-- 字体必须同一域 -->
|
|
||||||
{{if .set}}
|
|
||||||
<link href="{{.siteUrl}}/css/font-awesome-4.2.0/css/font-awesome.css" rel="stylesheet">
|
|
||||||
{{else}}
|
|
||||||
<link href="{{$.staticUrl}}/css/font-awesome-4.2.0/css/font-awesome.css" rel="stylesheet">
|
|
||||||
{{end}}
|
|
||||||
<link id="styleLink" href="{{.siteUrl}}/css/blog/{{if .userBlog.Style}}{{.userBlog.Style}}{{else}}blog_default{{end}}.css" rel="stylesheet">
|
|
||||||
<link href="{{.siteUrl}}/css/blog/comment.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="{{.indexUrl}}" 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>
|
|
||||||
<a class="navbar-brand" href="{{.indexUrl}}">
|
|
||||||
{{if .userBlog.Logo}}
|
|
||||||
<img src="{{.userBlog.Logo}}" title="{{.userBlog.Title}}"/>
|
|
||||||
{{else}}
|
|
||||||
{{.userBlog.Title | raw}}
|
|
||||||
{{end}}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="navbar-collapse collapse">
|
|
||||||
<ul class="nav navbar-nav">
|
|
||||||
{{$navNotebookId := .notebookId}}
|
|
||||||
<li class="{{if .index}}active{{end}}"><a href="{{.indexUrl}}">{{msg . "home"}}</a></li>
|
|
||||||
{{range .notebooks}}
|
|
||||||
{{$notebookId := .NotebookId.Hex}}
|
|
||||||
<li class="{{if $navNotebookId}}{{if eq $navNotebookId $notebookId}}active{{else}}{{end}}{{end}}">
|
|
||||||
<a href="{{$.cateUrl}}/{{$notebookId}}"
|
|
||||||
>{{.Title}}</a>
|
|
||||||
</li>
|
|
||||||
{{end}}
|
|
||||||
<li class="{{if .aboutMe}}active{{end}}"><a href="{{.aboutMeUrl}}">{{msg . "aboutMe"}}</a></li>
|
|
||||||
<!-- 同源上传logo -->
|
|
||||||
<li class="is-me {{if .set}}active{{end}} {{if not .isMe}}hide{{end}}" ><a href="{{$.siteUrl}}/blog/set/">{{msg . "blogSet"}}</a></li>
|
|
||||||
<li><a href="{{$.noteUrl}}" class="is-me {{if not .isMe}}hide{{end}}">{{msg . "myNote"}}</a></li>
|
|
||||||
</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}}"};
|
|
||||||
var UserBlogInfo={CanComment: {{.userBlog.CanComment}}, CommentType: "{{.userBlog.CommentType}}"};
|
|
||||||
var indexUrl = "{{$.indexUrl}}";
|
|
||||||
var viewUrl = "{{$.viewUrl}}";
|
|
||||||
var blogUrl = "{{$.blogUrl}}";
|
|
||||||
var staticUrl = "{{$.staticUrl}}"; // blog.leanote.com, life.leanote.com, aaa.com
|
|
||||||
</script>
|
|
||||||
@@ -1,73 +0,0 @@
|
|||||||
<!-- This file is Depreciated -->
|
|
||||||
|
|
||||||
<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>
|
|
||||||
-->
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
{{template "blog/header.html" .}}
|
|
||||||
|
|
||||||
<div id="postsContainer">
|
|
||||||
<div class="container">
|
|
||||||
{{if .notebookId}}
|
|
||||||
<h2>{{msg . "blogClass"}} - {{.notebook.Title}}</h2>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
||||||
<div id="posts">
|
|
||||||
{{$G := .}}
|
|
||||||
{{range .blogs}}
|
|
||||||
<div class="each-post">
|
|
||||||
<div class="title">
|
|
||||||
<a href="{{$.viewUrl}}/{{.NoteId.Hex}}" title="{{msg $ "fullBlog"}}">
|
|
||||||
{{.Title}}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="created-time">
|
|
||||||
<i class="fa fa-bookmark-o"></i>
|
|
||||||
{{if .Tags}}
|
|
||||||
{{blogTags $ .Tags}}
|
|
||||||
{{else}}
|
|
||||||
{{msg $ "noTag"}}
|
|
||||||
{{end}}
|
|
||||||
|
|
|
||||||
<i class="fa fa-calendar"></i> {{msg $ "updatedTime"}} {{.UpdatedTime | datetime}} |
|
|
||||||
<i class="fa fa-calendar"></i> {{msg $ "createdTime"}} {{.CreatedTime | datetime}}
|
|
||||||
</div>
|
|
||||||
<div class="desc">
|
|
||||||
{{.Content | raw}}
|
|
||||||
</div>
|
|
||||||
<a class="more" href="{{$.viewUrl}}/{{.NoteId.Hex}}" title="{{msg $ "fullBlog"}}">{{msg $ "more"}}.</a>
|
|
||||||
</div>
|
|
||||||
{{end}}
|
|
||||||
<!-- 分页 -->
|
|
||||||
<ul class="pager">
|
|
||||||
{{if .notebookId}}
|
|
||||||
{{set $ "pageUrl" (concatStr $.cateUrl "/" .notebookId)}}
|
|
||||||
{{else}}
|
|
||||||
{{set $ "pageUrl" $.indexUrl}}
|
|
||||||
{{end}}
|
|
||||||
{{page $.pageUrl .page .pageSize .count}}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{template "blog/footer.html" .}}
|
|
||||||
{{template "blog/highlight.html"}}
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
{{template "blog/header.html" .}}
|
|
||||||
|
|
||||||
<div id="postsContainer">
|
|
||||||
<div class="container">
|
|
||||||
<h2>{{msg . "search"}} - {{.key}} </h2>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div id="posts">
|
|
||||||
{{range .blogs}}
|
|
||||||
<div class="each-post">
|
|
||||||
<div class="title">
|
|
||||||
<a href="{{$.viewUrl}}/{{.NoteId.Hex}}" title="{{msg $ "fullBlog"}}">
|
|
||||||
{{.Title}}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
<div class="created-time">
|
|
||||||
<i class="fa fa-bookmark-o"></i>
|
|
||||||
{{if .Tags}}
|
|
||||||
{{blogTags $ .Tags}}
|
|
||||||
{{else}}
|
|
||||||
{{msg $ "noTag"}}
|
|
||||||
{{end}}
|
|
||||||
|
|
|
||||||
<i class="fa fa-calendar"></i> {{msg $ "updatedTime"}} {{.UpdatedTime | datetime}} |
|
|
||||||
<i class="fa fa-calendar"></i> {{msg $ "createdTime"}} {{.CreatedTime | datetime}}
|
|
||||||
</div>
|
|
||||||
<div class="desc">
|
|
||||||
{{.Content | raw}}
|
|
||||||
</div>
|
|
||||||
<a class="more" href="{{$.viewUrl}}/{{.NoteId.Hex}}" title="{{msg $ "fullBlog"}}">{{msg $ "more"}}</a>
|
|
||||||
</div>
|
|
||||||
{{end}}
|
|
||||||
|
|
||||||
{{if not .blogs }}
|
|
||||||
<div class="each-post">
|
|
||||||
{{msg . "none"}}
|
|
||||||
</div>
|
|
||||||
{{end}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{template "blog/footer.html" .}}
|
|
||||||
{{template "blog/highlight.html"}}
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,323 +0,0 @@
|
|||||||
{{template "blog/header.html" .}}
|
|
||||||
|
|
||||||
<!-- set页面不是自定义域名和二级域名页 -->
|
|
||||||
<link rel="stylesheet" href="{{.siteUrl}}/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">{{msg . "baseInfoSet"}}</a></li>
|
|
||||||
<li class=""><a href="#commentInfo" data-toggle="tab">{{msg . "commentSet"}}</a></li>
|
|
||||||
<li class=""><a href="#styleInfo" data-toggle="tab">{{msg . "themeSet"}}</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 class="col-sm-2 control-label"></label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<div class="alert alert-success" id="styleMsg" style="display: none; margin-bottom: 3px;"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="Style" class="col-sm-2 control-label">{{msg . "theme"}}</label>
|
|
||||||
<div class="col-sm-10" style="margin-top: 6px;" id="themeList">
|
|
||||||
<label>
|
|
||||||
<img class="preview" src="{{$.siteUrl}}/images/blog/theme/default.png" />
|
|
||||||
<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}}>
|
|
||||||
{{msg . "default"}}
|
|
||||||
</label>
|
|
||||||
<label>
|
|
||||||
<img class="preview" src="{{$.siteUrl}}/images/blog/theme/elegent.png" />
|
|
||||||
<input type="radio" name="Style"
|
|
||||||
value="blog_daqi"
|
|
||||||
{{if eq .userBlog.Style "blog_daqi"}}checked="checked"{{end}}>
|
|
||||||
{{msg . "elegant"}}
|
|
||||||
</label>
|
|
||||||
<label>
|
|
||||||
<img class="preview" src="{{$.siteUrl}}/images/blog/theme/left_nav_fix.png" />
|
|
||||||
<input type="radio" name="Style"
|
|
||||||
value="blog_left_fixed"
|
|
||||||
{{if eq .userBlog.Style "blog_left_fixed"}}checked="checked"{{end}}>
|
|
||||||
{{msg . "navFixed"}}
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<div class="col-sm-offset-2 col-sm-10">
|
|
||||||
<button class="btn btn-success">{{msg . "save"}}</button>
|
|
||||||
<span class="msg"></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</form>
|
|
||||||
</div>
|
|
||||||
<div class="tab-pane" id="commentInfo">
|
|
||||||
<form class="form-horizontal" role="form">
|
|
||||||
<div class="form-group">
|
|
||||||
<label class="col-sm-2 control-label"></label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<div class="alert alert-success" id="commentMsg" style="display: none; margin-bottom: 3px;"></div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="subTitle" class="col-sm-2 control-label">{{msg . "chooseComment"}}</label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<label>
|
|
||||||
<input type="checkbox" id="CanComment" name="CanComment"
|
|
||||||
{{if .userBlog.CanComment}}checked="checked"{{end}} > {{msg . "openComment"}}
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<br />
|
|
||||||
|
|
||||||
<div id="commentSet" {{if not .userBlog.CanComment}}style="display: none"{{end}}>
|
|
||||||
<label>
|
|
||||||
<input type="radio"
|
|
||||||
name="commentType"
|
|
||||||
value="default"
|
|
||||||
{{if or (not .userBlog.CommentType) (eq .userBlog.CommentType "default")}}checked="checked"{{end}} > Default
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<label>
|
|
||||||
<input type="radio" name="commentType" id="disqus"
|
|
||||||
value="disqus"
|
|
||||||
{{if eq .userBlog.CommentType "disqus"}}checked="checked"{{end}} > Disqus
|
|
||||||
</label>
|
|
||||||
|
|
||||||
<div id="disqusSet" {{if not (eq .userBlog.CommentType "disqus")}}style="display: none"{{end}}>
|
|
||||||
<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 />
|
|
||||||
{{msg . "disqusHelp"}}
|
|
||||||
<a target="_blank" href="http://leanote.com/blog/view/52db8463e01c530ef8000001">{{msg . "needHelp"}}</a>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="form-group">
|
|
||||||
<div class="col-sm-offset-2 col-sm-10">
|
|
||||||
<button class="btn btn-success">{{msg . "save"}}</button>
|
|
||||||
<span class="msg"></span>
|
|
||||||
</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">{{msg . "blogName"}}</label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input type="text" class="form-control" id="Title" name="Title"
|
|
||||||
placeholder="eg: leanote's blog"
|
|
||||||
value="{{if .userBlog.Title}}{{.userBlog.Title}}{{else}}{{.userInfo.Email}} 's blog{{end}}">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="form-group">
|
|
||||||
<label for="logo" class="col-sm-2 control-label">{{msg . "blogLogo"}}</label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input type="hidden" name="Logo" id="Logo"
|
|
||||||
value="{{.userBlog.Logo}}" />
|
|
||||||
<form id="formLogo" action="{{$.siteUrl}}/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();' />
|
|
||||||
{{msg . "blogLogoTips"}}
|
|
||||||
<div id="logoImg"
|
|
||||||
{{if .userBlog.Logo }}
|
|
||||||
{{else}}
|
|
||||||
style="display: none"{{end}}
|
|
||||||
>
|
|
||||||
<img src="{{.userBlog.Logo}}" style="height: 40px" /> <a
|
|
||||||
href="#" id="deleteLogo">{{msg . "delete"}}</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">{{msg . "blogDesc"}}</label>
|
|
||||||
<div class="col-sm-10">
|
|
||||||
<input type="text" class="form-control" id="SubTitle"
|
|
||||||
name="SubTitle" value="{{.userBlog.SubTitle}}"
|
|
||||||
placeholder="eg: leanote, Not Just A Notebook">
|
|
||||||
</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">{{msg . "aboutMe"}}</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">{{msg . "save"}}</button>
|
|
||||||
<span class="msg"></span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
</div>
|
|
||||||
|
|
||||||
{{template "blog/footer.html" .}}
|
|
||||||
|
|
||||||
<script src="{{.siteUrl}}/js/common-min.js"></script>
|
|
||||||
<script type="text/javascript" src="{{.siteUrl}}/tinymce/tinymce.min.js"></script>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var urlPrefix = "{{.siteUrl}}";
|
|
||||||
$(function() {
|
|
||||||
tinymce.init({
|
|
||||||
selector : "#AboutMe",
|
|
||||||
content_css : [ "/css/bootstrap.css", "/css/editor/editor.css" ],
|
|
||||||
skin : "custom",
|
|
||||||
language : "{{.locale}}",
|
|
||||||
height : 300,
|
|
||||||
width : "100%",
|
|
||||||
skin : "custom",
|
|
||||||
plugins : [
|
|
||||||
"advlist autolink link leanote_image lists charmap hr ",
|
|
||||||
"searchreplace visualblocks visualchars leanote_code tabfocus",
|
|
||||||
"table contextmenu directionality textcolor paste fullpage textcolor"],
|
|
||||||
toolbar1 : "formatselect |fontselect fontsizeselect| forecolor backcolor | bold italic underline strikethrough | bullist numlist |",
|
|
||||||
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")) {
|
|
||||||
$("#commentSet").show();
|
|
||||||
} else {
|
|
||||||
$("#commentSet").hide();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
$("input[name='commentType']").click(function() {
|
|
||||||
if ($("input[name='commentType']:checked").val() == "disqus") {
|
|
||||||
$("#disqusSet").show();
|
|
||||||
} else {
|
|
||||||
$("#disqusSet").hide();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// 基本设置
|
|
||||||
$("#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"), "{{msg . "saveSuccess"}}", 2000);
|
|
||||||
$("#blogDesc").html(data.SubTitle);
|
|
||||||
$("#logo").html(data.Title);
|
|
||||||
if(data.Logo) {
|
|
||||||
$("#logo").html(t('<img src="?" />', urlPrefix + "/" + data.Logo));
|
|
||||||
}
|
|
||||||
}, this);
|
|
||||||
});
|
|
||||||
// 评论
|
|
||||||
$("#commentInfo .btn-success").click(function(e) {
|
|
||||||
e.preventDefault();
|
|
||||||
var data = {
|
|
||||||
CanComment : $("#CanComment").is(":checked"),
|
|
||||||
CommentType: $("input[name='commentType']:checked").val(),
|
|
||||||
DisqusId : $("#DisqusId").val(),
|
|
||||||
}
|
|
||||||
post("/blog/setUserBlogComment", data, function(ret) {
|
|
||||||
showMsg2($("#commentInfo .msg"), "{{msg . "saveSuccess"}}", 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"), "{{msg . "saveSuccess"}}", 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", urlPrefix + "/" + ret.filename).parent().show();
|
|
||||||
$("#Logo").val(ret.filename);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
alert(ret.result);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// 上传出错
|
|
||||||
alert("上传出错");
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -1,125 +0,0 @@
|
|||||||
{{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"></i>
|
|
||||||
{{if .blog.Tags}}
|
|
||||||
{{blogTags $ .blog.Tags}}
|
|
||||||
{{else}}
|
|
||||||
{{msg . "noTag"}}
|
|
||||||
{{end}}
|
|
||||||
|
|
|
||||||
<i class="fa fa-calendar"></i> {{msg . "updatedTime"}} {{.blog.UpdatedTime | datetime}} |
|
|
||||||
<i class="fa fa-calendar"></i> {{msg . "createdTime"}} {{.blog.CreatedTime | datetime}}
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="mobile-created-time">
|
|
||||||
{{ if .userInfo.Logo}}
|
|
||||||
<img src="{{.userInfo.Logo}}" id="userLogo">
|
|
||||||
{{else}}
|
|
||||||
<img src="{{$.siteUrl}}/images/blog/default_avatar.png" id="userLogo">
|
|
||||||
{{end}}
|
|
||||||
{{.userInfo.Username}}
|
|
||||||
|
|
||||||
{{if .blog.Tags}}
|
|
||||||
|
|
||||||
<i class="fa fa-bookmark-o" style="color: #666"></i>
|
|
||||||
{{blogTags $ .blog.Tags}}
|
|
||||||
{{end}}
|
|
||||||
</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 id="desc" class="hide">{{.blog.Desc}}</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- comment -->
|
|
||||||
{{template "blog/comment.html" .}}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{template "blog/footer.html" .}}
|
|
||||||
{{template "blog/highlight.html"}}
|
|
||||||
<div id="blogNav">
|
|
||||||
<div id="blogNavNav">
|
|
||||||
<i class="fa fa-align-justify" title="文档导航"></i>
|
|
||||||
<span>{{msg . "blogNav"}}</span>
|
|
||||||
</div>
|
|
||||||
<div id="blogNavContent">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var visitUserInfo = eval("(" + {{.visitUserInfoJson}} + ")");
|
|
||||||
var urlPrefix = "{{.siteUrl}}";
|
|
||||||
var noteId = "{{.blog.NoteId.Hex}}";
|
|
||||||
var preLikeNum = +"{{.blog.LikeNum}}";
|
|
||||||
var commentNum = +"{{.blog.CommentNum}}";
|
|
||||||
</script>
|
|
||||||
<script src="/js/app/blog/common.js"></script>
|
|
||||||
<script src="/js/jsrender.js"></script>
|
|
||||||
<script src="/js/jquery-cookie-min.js"></script>
|
|
||||||
<script src="/js/bootstrap-dialog.min.js"></script>
|
|
||||||
<script src="/js/jquery.qrcode.min.js"></script>
|
|
||||||
<script src="/js/app/blog/view.js"></script>
|
|
||||||
|
|
||||||
{{if .blog.IsMarkdown }}
|
|
||||||
<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();
|
|
||||||
weixin();
|
|
||||||
</script>
|
|
||||||
{{else}}
|
|
||||||
<script>
|
|
||||||
$(function() {
|
|
||||||
initNav();
|
|
||||||
weixin();
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
{{end}}
|
|
||||||
|
|
||||||
<!--google+
|
|
||||||
<script type="text/javascript" src="https://apis.google.com/js/plusone.js"> {lang: 'zh-CN'} </script>
|
|
||||||
-->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
@@ -26,7 +26,7 @@
|
|||||||
</section>
|
</section>
|
||||||
<div id="boxFooter">
|
<div id="boxFooter">
|
||||||
<p>
|
<p>
|
||||||
<a href="/index">leanote</a> © 2015
|
© <a href="/index">Leanote</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
</section>
|
</section>
|
||||||
<div id="boxFooter">
|
<div id="boxFooter">
|
||||||
<p>
|
<p>
|
||||||
<a href="/index">leanote</a> © 2015
|
© <a href="/index">Leanote</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</body>
|
</body>
|
||||||
|
|||||||
@@ -50,12 +50,12 @@ table tr:nth-child(2n) {
|
|||||||
{{ if .userBlog.Logo}}
|
{{ if .userBlog.Logo}}
|
||||||
<img src="{{.userBlog.Logo}}" id="logo">
|
<img src="{{.userBlog.Logo}}" id="logo">
|
||||||
{{else}}
|
{{else}}
|
||||||
<img src="{{$.siteUrl}}/images/blog/default_avatar.png" id="logo">
|
<img src="/images/blog/default_avatar.png" id="logo">
|
||||||
{{end}}
|
{{end}}
|
||||||
{{.userInfo.Username}}
|
{{.userInfo.Username}}
|
||||||
-->
|
-->
|
||||||
{{if .blog.Tags}}
|
{{if .blog.Tags}}
|
||||||
<img src="{{$.siteUrl}}/images/blog/tag.png" id="tag">
|
<img src="/images/blog/tag.png" id="tag">
|
||||||
{{blogTagsForExport $ .blog.Tags}}
|
{{blogTagsForExport $ .blog.Tags}}
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
@@ -79,7 +79,7 @@ table tr:nth-child(2n) {
|
|||||||
<!--
|
<!--
|
||||||
<div id="footer">
|
<div id="footer">
|
||||||
<p class="split"></p>
|
<p class="split"></p>
|
||||||
<a href="http://leanote.com"><img src="{{.siteUrl}}/images/logo/leanote_icon_blue.png" id="leanote_logo"/></a>
|
<a href="http://leanote.com"><img src="/images/logo/leanote_icon_blue.png" id="leanote_logo"/></a>
|
||||||
<p>
|
<p>
|
||||||
<a href="http://leanote.com">Leanote</a>
|
<a href="http://leanote.com">Leanote</a>
|
||||||
<br />
|
<br />
|
||||||
@@ -88,10 +88,10 @@ table tr:nth-child(2n) {
|
|||||||
</div>
|
</div>
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<script src="{{.siteUrl}}/js/jquery-1.9.0.min.js"></script>
|
<script src="/js/jquery-1.9.0.min.js"></script>
|
||||||
|
|
||||||
<link href="{{.siteUrl}}/public/mdeditor/editor/google-code-prettify/prettify.css" type="text/css" rel="stylesheet">
|
<link href="/public/js/google-code-prettify/prettify.css" type="text/css" rel="stylesheet">
|
||||||
<script src="{{.siteUrl}}/public/mdeditor/editor/google-code-prettify/prettify.js"></script>
|
<script src="/public/js/google-code-prettify/prettify.js"></script>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
function ok() {
|
function ok() {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<section id="box" class="animated fadeInUp">
|
<section id="box" class="animated fadeInUp">
|
||||||
<div>
|
<div>
|
||||||
<h1 id="logo">Leanote</h1>
|
<h1 id="logo"></h1>
|
||||||
<div id="boxForm">
|
<div id="boxForm">
|
||||||
<div id="boxHeader">{{msg . "findPassword"}}</div>
|
<div id="boxHeader">{{msg . "findPassword"}}</div>
|
||||||
<form>
|
<form>
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
<a href="/index">{{msg . "home"}}</a>
|
<a href="/index">{{msg . "home"}}</a>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a href="/index">leanote</a> © 2014-2015
|
© <a href="https://leanote.com">Leanote</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<section id="box" class="animated fadeInUp">
|
<section id="box" class="animated fadeInUp">
|
||||||
<div>
|
<div>
|
||||||
<h1 id="logo">Leanote</h1>
|
<h1 id="logo"></h1>
|
||||||
<div id="boxForm">
|
<div id="boxForm">
|
||||||
<div id="boxHeader">{{msg . "updatePassword"}}</div>
|
<div id="boxHeader">{{msg . "updatePassword"}}</div>
|
||||||
<form>
|
<form>
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
<a href="/index">{{msg . "home"}}</a>
|
<a href="/index">{{msg . "home"}}</a>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a href="/index">leanote</a> © 2014-2015
|
© <a href="https://leanote.com">Leanote</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
<section id="box" class="animated fadeInUp">
|
<section id="box" class="animated fadeInUp">
|
||||||
<div>
|
<div>
|
||||||
<h1 id="logo">Leanote</h1>
|
<h1 id="logo"></h1>
|
||||||
<div id="boxForm">
|
<div id="boxForm">
|
||||||
<div id="boxHeader">{{msg . "findPasswordTimeout"}}</div>
|
<div id="boxHeader">{{msg . "findPasswordTimeout"}}</div>
|
||||||
<form>
|
<form>
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
<a href="/index">{{msg . "home"}}</a>
|
<a href="/index">{{msg . "home"}}</a>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a href="/index">leanote</a> © 2014-2015
|
© <a href="https://leanote.com">Leanote</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -4,22 +4,21 @@
|
|||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<i class="fa fa-envelope-o fa-3x icon-muted"></i>
|
<i class="fa fa-envelope-o fa-3x icon-muted"></i>
|
||||||
<h2>Contact</h2>
|
<h2>Contact</h2>
|
||||||
<a href="http://weibo.com/leanotecom" target="_blank"><i class="fa fa-weibo"></i></a>
|
<a href="http://weibo.com/leanotecom" target="_blank"><i class="fa fa-weibo"></i></a> / leanote@leanote.com
|
||||||
<br />
|
<br />
|
||||||
leanote@leanote.com
|
|
||||||
<br />
|
|
||||||
Copyright © 2014-2015 <a href="https://leanote.com">Leanote</a>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<i class="fa fa-globe fa-3x icon-muted"></i>
|
<i class="fa fa-globe fa-3x icon-muted"></i>
|
||||||
<h2>Join Us</h2>
|
<h2>Join Us</h2>
|
||||||
<a href="https://github.com/leanote/leanote">Github Leanote</a>
|
<a href="https://github.com/leanote/leanote">Github</a> / <a href="http://leanote.leanote.com/post/Leanote-groups">QQ Group</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="footer-leanote">
|
||||||
|
Copyright © <a href="https://leanote.com">Leanote</a>
|
||||||
<br/>
|
<br/>
|
||||||
QQ Group: <span id="qqGrup">256076853, <s>158716820</s></span>
|
Proudly powered by <a href="https://leanote.com">Leanote</a>
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="footer-leanote">Proudly powered by <a href="https://leanote.com">Leanote</a></div>
|
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -4,16 +4,14 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="keywords" content="leanote,leanote.com">
|
<meta name="keywords" content="leanote,leanote.com,蚂蚁笔记">
|
||||||
<meta name="description" content="Leanote, {{msg $ "moto"}}">
|
<meta name="description" content="Leanote,蚂蚁笔记, {{msg $ "moto"}}">
|
||||||
<meta name="author" content="leanote">
|
<meta name="author" content="leanote,蚂蚁笔记">
|
||||||
<title>{{.title}}</title>
|
<title>{{.title}}</title>
|
||||||
|
|
||||||
<link href="/css/bootstrap.css" rel="stylesheet">
|
<link href="/css/bootstrap.css" rel="stylesheet">
|
||||||
<link href="/css/font-awesome-4.2.0/css/font-awesome.css" rel="stylesheet">
|
<link href="/css/font-awesome-4.2.0/css/font-awesome.css" rel="stylesheet">
|
||||||
<link href="/css/index.css" rel="stylesheet">
|
<link href="/css/index.css" rel="stylesheet">
|
||||||
<style>
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
function log(o) {
|
function log(o) {
|
||||||
@@ -21,7 +19,7 @@ function log(o) {
|
|||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body class="lang-{{$.locale}}">
|
||||||
<nav id="headerContainer" style="background-color:#fff" class="navbar navbar-default navbar-fixed-top" role="navigation">
|
<nav id="headerContainer" style="background-color:#fff" class="navbar navbar-default navbar-fixed-top" role="navigation">
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<div class="navbar-header">
|
<div class="navbar-header">
|
||||||
@@ -31,16 +29,20 @@ function log(o) {
|
|||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
</button>
|
</button>
|
||||||
<a class="navbar-brand" href="/index">
|
<a class="navbar-brand" href="/index" id="logo">
|
||||||
<img src="/images/logo/leanote_black.png" id="" title="leanote, {{msg $ "moto"}}"/>
|
<img src="/images/logo/leanote_black.png" class="hide" title="leanote, {{msg $ "moto"}}"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div id="navbar" class="navbar-collapse collapse">
|
<div id="navbar" class="navbar-collapse collapse">
|
||||||
<div id="lang">
|
<div id="lang">
|
||||||
<a data-lang="en-us">English</a>
|
<a data-lang="en-us">English</a>
|
||||||
|
<a data-lang="de-de">Deutsch</a>
|
||||||
<a data-lang="fr-fr">Français</a>
|
<a data-lang="fr-fr">Français</a>
|
||||||
<a data-lang="zh-cn">简体中文</a>
|
<a data-lang="zh-cn">简体中文</a>
|
||||||
|
<a data-lang="zh-hk">繁体中文</a>
|
||||||
|
<a data-lang="pt-pt">Português</a>
|
||||||
|
<a data-lang="es-co">Spanish</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ul class="nav navbar-nav navbar-left">
|
<ul class="nav navbar-nav navbar-left">
|
||||||
@@ -49,7 +51,7 @@ function log(o) {
|
|||||||
<a href="http://bbs.leanote.com" target="_blank" class="">{{msg . "discussion"}}</a>
|
<a href="http://bbs.leanote.com" target="_blank" class="">{{msg . "discussion"}}</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
<li><a id="leanoteBlog" href="http://lea.leanote.com" target="_blank" title="Lea++, leanote blog platform" class="">Lea++</a></li>
|
<li><a id="leanoteBlog" href="http://lea.leanote.com" target="_blank" title="Leanote explore, leanote blog platform" class="">{{leaMsg . "Leanote Explore"}}</a></li>
|
||||||
<li><a id="leanoteApp" href="http://app.leanote.com" target="_blank" title="Leanote App" class="">{{msg . "desktopApp"}}</a></li>
|
<li><a id="leanoteApp" href="http://app.leanote.com" target="_blank" title="Leanote App" class="">{{msg . "desktopApp"}}</a></li>
|
||||||
<li>
|
<li>
|
||||||
<a href="http://leanote.org#donate" target="_blank" class="">{{msg . "donate"}}</a>
|
<a href="http://leanote.org#donate" target="_blank" class="">{{msg . "donate"}}</a>
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
<meta charset="utf-8">
|
<meta charset="utf-8">
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
<meta name="keywords" content="leanote,leanote.com">
|
<meta name="keywords" content="leanote,蚂蚁笔记,leanote.com">
|
||||||
<meta name="description" content="leanote, {{msg $ "moto"}}">
|
<meta name="description" content="leanote, 蚂蚁笔记, {{msg $ "moto"}}">
|
||||||
<meta name="author" content="leanote">
|
<meta name="author" content="leanote,蚂蚁笔记">
|
||||||
<title>{{.title}}</title>
|
<title>{{.title}}</title>
|
||||||
|
|
||||||
<link href="/css/bootstrap.css" rel="stylesheet">
|
<link href="/css/bootstrap.css" rel="stylesheet">
|
||||||
|
|||||||
@@ -77,15 +77,5 @@ var lang = '{{.locale}}';
|
|||||||
<script src="/js/home/index.js"></script>
|
<script src="/js/home/index.js"></script>
|
||||||
|
|
||||||
|
|
||||||
<script>
|
|
||||||
var _hmt = _hmt || [];
|
|
||||||
(function() {
|
|
||||||
var hm = document.createElement("script");
|
|
||||||
hm.src = "//hm.baidu.com/hm.js?d0c988e37b452b3bf1220d45b30f2de2";
|
|
||||||
var s = document.getElementsByTagName("script")[0];
|
|
||||||
s.parentNode.insertBefore(hm, s);
|
|
||||||
})();
|
|
||||||
</script>
|
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -15,7 +15,7 @@
|
|||||||
</div>
|
</div>
|
||||||
-->
|
-->
|
||||||
<div>
|
<div>
|
||||||
<h1 id="logo">Leanote</h1>
|
<h1 id="logo"></h1>
|
||||||
<div id="boxForm">
|
<div id="boxForm">
|
||||||
<div id="boxHeader">{{msg . "login"}}</div>
|
<div id="boxHeader">{{msg . "login"}}</div>
|
||||||
<form>
|
<form>
|
||||||
@@ -61,10 +61,10 @@
|
|||||||
|
|
||||||
<div id="boxFooter">
|
<div id="boxFooter">
|
||||||
<p>
|
<p>
|
||||||
<a href="/index">{{msg . "home"}}</a>
|
<a href="/">{{msg . "home"}}</a>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a href="/index">leanote</a> © 2014-2015
|
© <a href="https://leanote.com">Leanote</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
</div>
|
</div>
|
||||||
-->
|
-->
|
||||||
<div>
|
<div>
|
||||||
<h1 id="logo">Leanote</h1>
|
<h1 id="logo"></h1>
|
||||||
<div id="boxForm">
|
<div id="boxForm">
|
||||||
<div id="boxHeader">{{msg . "register"}}</div>
|
<div id="boxHeader">{{msg . "register"}}</div>
|
||||||
<form>
|
<form>
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
<a href="/index">{{msg . "home"}}</a>
|
<a href="/index">{{msg . "home"}}</a>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a href="/index">leanote</a> © 2014-2015
|
© <a href="https://leanote.com">Leanote</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
name="sortField"
|
name="sortField"
|
||||||
value="">
|
value="">
|
||||||
<option value="PublicTime" {{if eq $.userBlog.SortField "PublicTime"}}selected{{end}}>{{msg $ "publicTime"}}</option>
|
<option value="PublicTime" {{if eq $.userBlog.SortField "PublicTime"}}selected{{end}}>{{msg $ "publicTime"}}</option>
|
||||||
<option value="CreatedTime" {{if eq $.userBlog.SortField "CreatedTimeTime"}}selected{{end}}>{{msg $ "createdTime"}}</option>
|
<option value="CreatedTime" {{if eq $.userBlog.SortField "CreatedTime"}}selected{{end}}>{{msg $ "createdTime"}}</option>
|
||||||
<option value="UpdatedTime" {{if eq $.userBlog.SortField "UpdatedTime"}}selected{{end}}>{{msg $ "updatedTime"}}</option>
|
<option value="UpdatedTime" {{if eq $.userBlog.SortField "UpdatedTime"}}selected{{end}}>{{msg $ "updatedTime"}}</option>
|
||||||
<option value="Title" {{if eq $.userBlog.SortField "Title"}}selected{{end}}>{{msg . "title"}}</option>
|
<option value="Title" {{if eq $.userBlog.SortField "Title"}}selected{{end}}>{{msg . "title"}}</option>
|
||||||
</select>
|
</select>
|
||||||
|
|||||||
@@ -44,7 +44,7 @@
|
|||||||
<a class="btn btn-default btn-sm btn-export"><span class="fa fa-download"></span> {{msg $ "export"}}</a>
|
<a class="btn btn-default btn-sm btn-export"><span class="fa fa-download"></span> {{msg $ "export"}}</a>
|
||||||
<!-- 必须是自己的主题 -->
|
<!-- 必须是自己的主题 -->
|
||||||
{{if .activeTheme.ThemeId}}
|
{{if .activeTheme.ThemeId}}
|
||||||
<a class="btn btn-default btn-sm" href="{{$.siteUrl}}/preview?themeId={{.activeTheme.ThemeId.Hex}}" target="_blank"><span class="fa fa-eye"></span> {{msg $ "preview"}}</a>
|
<a class="btn btn-default btn-sm" href="/preview?themeId={{.activeTheme.ThemeId.Hex}}" target="_blank"><span class="fa fa-eye"></span> {{msg $ "preview"}}</a>
|
||||||
{{end}}
|
{{end}}
|
||||||
<a class="btn btn-primary btn-sm" target="_blank" href="/member/blog/updateTheme?themeId={{if .activeTheme.ThemeId}}{{.activeTheme.ThemeId.Hex}}{{end}}"><span class="fa fa-pencil"></span> {{msg $ "edit"}}</a>
|
<a class="btn btn-primary btn-sm" target="_blank" href="/member/blog/updateTheme?themeId={{if .activeTheme.ThemeId}}{{.activeTheme.ThemeId.Hex}}{{end}}"><span class="fa fa-pencil"></span> {{msg $ "edit"}}</a>
|
||||||
</div>
|
</div>
|
||||||
@@ -84,7 +84,7 @@
|
|||||||
<div class="btn-group" data-id="{{.ThemeId.Hex}}">
|
<div class="btn-group" data-id="{{.ThemeId.Hex}}">
|
||||||
<a class="btn btn-default btn-sm btn-delete" data-loading-text="..."><span class="fa fa-remove"></span> {{msg $ "delete"}}</a>
|
<a class="btn btn-default btn-sm btn-delete" data-loading-text="..."><span class="fa fa-remove"></span> {{msg $ "delete"}}</a>
|
||||||
<a class="btn btn-default btn-sm btn-export"><span class="fa fa-download"></span> {{msg $ "export"}}</a>
|
<a class="btn btn-default btn-sm btn-export"><span class="fa fa-download"></span> {{msg $ "export"}}</a>
|
||||||
<a class="btn btn-default btn-sm" href="{{$.siteUrl}}/preview?themeId={{.ThemeId.Hex}}" target="_blank"><span class="fa fa-eye"></span> {{msg $ "preview"}}</a>
|
<a class="btn btn-default btn-sm" href="/preview?themeId={{.ThemeId.Hex}}" target="_blank"><span class="fa fa-eye"></span> {{msg $ "preview"}}</a>
|
||||||
<a class="btn btn-default btn-sm" target="_blank" href="/member/blog/updateTheme?themeId={{.ThemeId.Hex}}"><span class="fa fa-pencil"></span> {{msg $ "edit"}}</a>
|
<a class="btn btn-default btn-sm" target="_blank" href="/member/blog/updateTheme?themeId={{.ThemeId.Hex}}"><span class="fa fa-pencil"></span> {{msg $ "edit"}}</a>
|
||||||
<a class="btn btn-primary btn-sm btn-active" data-loading-text="..."><span class="fa fa-check"></span> {{msg $ "use"}}</a>
|
<a class="btn btn-primary btn-sm btn-active" data-loading-text="..."><span class="fa fa-check"></span> {{msg $ "use"}}</a>
|
||||||
{{if $.isAdmin}}
|
{{if $.isAdmin}}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
-
|
-
|
||||||
{{.theme.Name}}
|
{{.theme.Name}}
|
||||||
{{end}}
|
{{end}}
|
||||||
<a class="btn btn-default" href="{{$.siteUrl}}/preview?themeId={{.themeId}}" target="_blank"><span class="fa fa-eye"></span> {{msg . "preview"}}</a>
|
<a class="btn btn-default" href="/preview?themeId={{.themeId}}" target="_blank"><span class="fa fa-eye"></span> {{msg . "preview"}}</a>
|
||||||
|
|
||||||
<small>
|
<small>
|
||||||
|
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<b class="bg-success">
|
<b class="bg-success">
|
||||||
</b>
|
</b>
|
||||||
</i>
|
</i>
|
||||||
<span>
|
<span class="nav-h1">
|
||||||
{{msg . "memberCenter"}}
|
{{msg . "memberCenter"}}
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
<i class="fa fa-angle-up text-active">
|
<i class="fa fa-angle-up text-active">
|
||||||
</i>
|
</i>
|
||||||
</span>
|
</span>
|
||||||
<span>
|
<span class="nav-h1">
|
||||||
{{msg . "accountInfo"}}
|
{{msg . "accountInfo"}}
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
@@ -77,7 +77,7 @@
|
|||||||
<i class="fa fa-angle-up text-active">
|
<i class="fa fa-angle-up text-active">
|
||||||
</i>
|
</i>
|
||||||
</span>
|
</span>
|
||||||
<span>
|
<span class="nav-h1">
|
||||||
{{msg . "blog"}}
|
{{msg . "blog"}}
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
@@ -141,7 +141,7 @@
|
|||||||
<b class="bg-success">
|
<b class="bg-success">
|
||||||
</b>
|
</b>
|
||||||
</i>
|
</i>
|
||||||
<span>
|
<span class="nav-h1">
|
||||||
{{msg . "group"}}
|
{{msg . "group"}}
|
||||||
</span>
|
</span>
|
||||||
</a>
|
</a>
|
||||||
|
|||||||
@@ -16,24 +16,24 @@
|
|||||||
<script src="/public/admin/js/ie/excanvas.js"></script>
|
<script src="/public/admin/js/ie/excanvas.js"></script>
|
||||||
<![endif]-->
|
<![endif]-->
|
||||||
</head>
|
</head>
|
||||||
<body class="">
|
<body class="lang-{{$.locale}}">
|
||||||
<section class="vbox">
|
<section class="vbox">
|
||||||
<header class="bg-dark dk header navbar navbar-fixed-top-xs">
|
<header class="bg-dark dk header navbar navbar-fixed-top-xs">
|
||||||
<div class="navbar-header aside-md" id="logo">
|
<div class="navbar-header aside-md logo-ctn">
|
||||||
<a href="/member" class="navbar-brand clearfix" data-toggle="fullscreen">
|
<a href="/member" class="navbar-brand clearfix" data-toggle="fullscreen">
|
||||||
<span class="logo-icon"></span>
|
<span id="logo"></span>
|
||||||
<span class="logo-title">{{msg . "memberCenter"}}</span>
|
<span class="logo-title">{{msg . "memberCenter"}}</span>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ul class="nav navbar-nav navbar-right m-n hidden-xs nav-user">
|
<ul class="nav navbar-nav navbar-right m-n hidden-xs nav-user">
|
||||||
<li class="hidden-xs">
|
<li class="hidden-xs">
|
||||||
<a href="/note" class="dk" target="_blank">
|
<a href="/note" class="dk">
|
||||||
{{msg . "myNote"}}
|
{{msg . "myNote"}}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="hidden-xs">
|
<li class="hidden-xs">
|
||||||
<a href="/blog/{{$.session.Username}}" class="dk" target="_blank">
|
<a href="/blog/{{$.session.Username}}" class="dk">
|
||||||
{{msg . "myBlog"}}
|
{{msg . "myBlog"}}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
</section>
|
</section>
|
||||||
<footer class="footer lt hidden-xs b-t b-light" style="min-height: initial;
|
<footer class="footer lt hidden-xs b-t b-light" style="min-height: initial;
|
||||||
padding: 10px 15px;text-align:center;">
|
padding: 10px 15px;text-align:center;">
|
||||||
<a href="http://leanote.com" target="_blank">leanote</a> © 2015
|
© <a href="https://leanote.com" target="_blank">Leanote</a>
|
||||||
<!--
|
<!--
|
||||||
<a href="#nav" data-toggle="class:nav-xs" class="pull-right btn btn-sm btn-default btn-icon">
|
<a href="#nav" data-toggle="class:nav-xs" class="pull-right btn btn-sm btn-default btn-icon">
|
||||||
<i class="fa fa-angle-left text">
|
<i class="fa fa-angle-left text">
|
||||||
|
|||||||
@@ -6,8 +6,8 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
|
||||||
<meta name="apple-touch-fullscreen" content="yes">
|
<meta name="apple-touch-fullscreen" content="yes">
|
||||||
<meta name=”apple-mobile-web-app-capable” content=”yes” />
|
<meta name=”apple-mobile-web-app-capable” content=”yes” />
|
||||||
<meta name="keywords" content="leanote,leanote.com">
|
<meta name="keywords" content="leanote,leanote.com,蚂蚁笔记">
|
||||||
<meta name="description" content="Leanote, {{msg $ "moto"}}">
|
<meta name="description" content="Leanote, 蚂蚁笔记, {{msg $ "moto"}}">
|
||||||
<title>Leanote, {{msg $ "moto"}}</title>
|
<title>Leanote, {{msg $ "moto"}}</title>
|
||||||
|
|
||||||
<link href="/css/bootstrap-min.css" rel="stylesheet" />
|
<link href="/css/bootstrap-min.css" rel="stylesheet" />
|
||||||
@@ -39,7 +39,7 @@ function log(o) {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body class="leanote-plugin lang-{{$.locale}}">
|
||||||
<div id="page">
|
<div id="page">
|
||||||
<div id="pageInner">
|
<div id="pageInner">
|
||||||
|
|
||||||
@@ -47,17 +47,10 @@ function log(o) {
|
|||||||
<!-- <div id="headerContainer"> -->
|
<!-- <div id="headerContainer"> -->
|
||||||
<div id="header">
|
<div id="header">
|
||||||
|
|
||||||
<!--
|
<a id="logo" href="/" title="Leanote {{msg . "home"}}" class="pull-left"></a>
|
||||||
<div id="headerLeft" class="pull-left">
|
|
||||||
</div>
|
|
||||||
-->
|
|
||||||
<div id="logo" class="pull-left">
|
|
||||||
<!--<span>lea</span>note -->
|
|
||||||
<!--<img style="height: 45px;" src="/images/logo/leanote_white.png" title="leanote, 不一样的笔记" alt="leanote">-->
|
|
||||||
</div>
|
|
||||||
<div id="switcher" class="pull-left">
|
<div id="switcher" class="pull-left">
|
||||||
<i class="fa fa-align-justify" id="leftSwitcher" title="{{msg . "leftHidden"}}"></i>
|
<i class="fa fa-dedent" id="leftSwitcher" title="{{msg . "leftHidden"}}"></i>
|
||||||
<span id="leftSwitcher2" title="{{msg . "leftShow"}}"></span>
|
<span id="leftSwitcher2" class="fa fa-indent" title="{{msg . "leftShow"}}"></span>
|
||||||
</div>
|
</div>
|
||||||
<!-- search -->
|
<!-- search -->
|
||||||
<div class="pull-left" id="searchWrap">
|
<div class="pull-left" id="searchWrap">
|
||||||
@@ -134,9 +127,9 @@ function log(o) {
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pull-right" style="margin: 0 10px" id="myProfile">
|
<div class="pull-right" id="myProfile">
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<a class="dropdown-toggle" title="{{.userInfo.Username}}" data-toggle="dropdown" style="line-height: 60px;">
|
<a class="dropdown-toggle profile-img" title="{{.userInfo.Username}}" data-toggle="dropdown">
|
||||||
<img alt="{{.userInfo.Username}}" title="{{.userInfo.Username}}" src="{{if .userInfo.Logo}}{{.userInfo.Logo}}{{else}}/images/blog/default_avatar.png{{end}}" id="myAvatar"/>
|
<img alt="{{.userInfo.Username}}" title="{{.userInfo.Username}}" src="{{if .userInfo.Logo}}{{.userInfo.Logo}}{{else}}/images/blog/default_avatar.png{{end}}" id="myAvatar"/>
|
||||||
<span class="username">
|
<span class="username">
|
||||||
{{.userInfo.Username}}
|
{{.userInfo.Username}}
|
||||||
@@ -198,7 +191,7 @@ function log(o) {
|
|||||||
|
|
||||||
<div class="pull-right top-nav writting-hide lea-blog">
|
<div class="pull-right top-nav writting-hide lea-blog">
|
||||||
<a target="_blank" href="http://lea.leanote.com">
|
<a target="_blank" href="http://lea.leanote.com">
|
||||||
Lea++
|
{{msg . "Explore"}}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -208,13 +201,13 @@ function log(o) {
|
|||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pull-right toggle-editor-mode" style="line-height: 60px; margin-right:10px" id="toggleEditorMode">
|
<div class="pull-right toggle-editor-mode top-nav" id="toggleEditorMode">
|
||||||
<a href="#writing"><span>{{msg . "writingMode"}}</span></a>
|
<a href="#writing"><span>{{msg . "writingMode"}}</span></a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{if eq .userInfo.Email "demo@leanote.com"}}
|
{{if eq .userInfo.Email "demo@leanote.com"}}
|
||||||
{{if .openRegister}}
|
{{if .openRegister}}
|
||||||
<div class="pull-right" style="line-height: 60px; margin-right:10px" id="demoRegister">
|
<div class="pull-right top-nav" id="demoRegister">
|
||||||
<span>
|
<span>
|
||||||
{{msg . "demoRegister"}}
|
{{msg . "demoRegister"}}
|
||||||
</span>
|
</span>
|
||||||
@@ -352,63 +345,74 @@ function log(o) {
|
|||||||
</div>
|
</div>
|
||||||
<div id="noteList">
|
<div id="noteList">
|
||||||
<div class="clearfix" id="notesAndSort" style="position: relative">
|
<div class="clearfix" id="notesAndSort" style="position: relative">
|
||||||
|
|
||||||
<div class="pull-left">
|
<div class="pull-left">
|
||||||
<!-- 我的笔记本 -->
|
<!-- 我的笔记本 -->
|
||||||
<div class="dropdown" id="myNotebookNavForListNav">
|
<div class="dropdown" id="myNotebookNavForListNav">
|
||||||
<a class="ios7-a dropdown-toggle" id="dropdownMenu1" data-toggle="dropdown">
|
<a class="ios7-a">
|
||||||
<span id="curNotebookForListNote">{{msg . "all"}}</span>
|
<span id="curNotebookForListNote">{{msg . "all"}}</span>
|
||||||
<!--
|
|
||||||
<i class="fa fa-angle-down"></i>
|
|
||||||
-->
|
|
||||||
</a>
|
</a>
|
||||||
<!-- 如果notebook过多, 则会产生滚动 弃用
|
|
||||||
<div class="dropdown-menu dropdown-list" style="left: 5px;">
|
|
||||||
<ul role="menu" aria-labelledby="dropdownMenu1" id="notebookNavForListNote"></ul>
|
|
||||||
</div>
|
|
||||||
-->
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 共享的笔记本 -->
|
<!-- 共享的笔记本 -->
|
||||||
<div class="dropdown" id="sharedNotebookNavForListNav" style="display: none">
|
<div class="dropdown" id="sharedNotebookNavForListNav" style="display: none">
|
||||||
<a class="ios7-a dropdown-toggle" id="dropdownMenu2" data-toggle="dropdown">
|
<a class="ios7-a">
|
||||||
<span id="curSharedNotebookForListNote">{{msg . "all"}}</span>
|
<span id="curSharedNotebookForListNote">{{msg . "all"}}</span>
|
||||||
<!--
|
|
||||||
<i class="fa fa-angle-down"></i>
|
|
||||||
-->
|
|
||||||
</a>
|
</a>
|
||||||
<ul class="dropdown-menu" role="menu"
|
</div>
|
||||||
aria-labelledby="dropdownMenu2" style="left: 5px;" id="sharedNotebookNavForListNote">
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
<!-- tag search -->
|
||||||
|
<div class="pull-left" id="tagSearch"></div>
|
||||||
|
|
||||||
<div class="pull-left" id="tagSearch" style="line-height: 38px">
|
<!-- sort type -->
|
||||||
</div>
|
|
||||||
<div id="sortType">
|
<div id="sortType">
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<a class="ios7-a dropdown-toggle" id="dropdownMenu1"
|
<a class="ios7-a dropdown-toggle" id="dropdownMenu1"
|
||||||
data-toggle="dropdown">
|
data-toggle="dropdown">
|
||||||
<!--
|
</i><i class="fa fa-th-list"></i>
|
||||||
<i class="fa fa-sort-alpha-asc">
|
|
||||||
</i>Sort <i class="fa fa-angle-down"></i>
|
|
||||||
-->
|
|
||||||
</a>
|
</a>
|
||||||
<!--
|
|
||||||
<ul class="dropdown-menu" role="menu"
|
<ul class="dropdown-menu" role="menu"
|
||||||
aria-labelledby="dropdownMenu1"
|
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 data-view="snippet" class="view-style view-snippet" role="menuitem">
|
||||||
<li role="presentation"><a role="menuitem" tabindex="-1"
|
<i class="fa fa-check"></i>
|
||||||
href="#">修改日期</a></li>
|
{{leaMsg . "Snippet View"}}
|
||||||
<li role="presentation"><a role="menuitem" tabindex="-1"
|
</a></li>
|
||||||
href="#">标题</a></li>
|
<li role="presentation"><a data-view="list" class="view-style view-list" role="menuitem">
|
||||||
|
<i class="fa fa-check"></i>
|
||||||
|
{{leaMsg . "List View"}}
|
||||||
|
</a></li>
|
||||||
<li role="presentation" class="divider"></li>
|
<li role="presentation" class="divider"></li>
|
||||||
<li role="presentation"><a role="menuitem" tabindex="-1"
|
<li role="presentation"><a data-sorter="dateCreatedASC" class="sorter-style sorter-dateCreatedASC" role="menuitem">
|
||||||
href="#">Separated </a></li>
|
<i class="fa fa-check"></i>
|
||||||
|
{{leaMsg . "Date Created"}} <i class="fa fa-sort-alpha-asc"></i>
|
||||||
|
</a></li>
|
||||||
|
<li role="presentation"><a data-sorter="dateCreatedDESC" class="sorter-style sorter-dateCreatedDESC" role="menuitem">
|
||||||
|
<i class="fa fa-check"></i>
|
||||||
|
{{leaMsg . "Date Created"}} <i class="fa fa-sort-alpha-desc"></i>
|
||||||
|
</a></li>
|
||||||
|
<li role="presentation" class="divider"></li>
|
||||||
|
<li role="presentation"><a data-sorter="dateUpdatedASC" class="sorter-style sorter-dateUpdatedASC" role="menuitem">
|
||||||
|
<i class="fa fa-check"></i>
|
||||||
|
{{leaMsg . "Date Updated"}} <i class="fa fa-sort-alpha-asc"></i>
|
||||||
|
</a></li>
|
||||||
|
<li role="presentation"><a data-sorter="dateUpdatedDESC" class="sorter-style sorter-dateUpdatedDESC checked" role="menuitem">
|
||||||
|
<i class="fa fa-check"></i>
|
||||||
|
{{leaMsg . "Date Updated"}} <i class="fa fa-sort-alpha-desc"></i>
|
||||||
|
</a></li>
|
||||||
|
<li role="presentation" class="divider"></li>
|
||||||
|
<li role="presentation"><a data-sorter="titleASC" class="sorter-style sorter-titleASC" role="menuitem">
|
||||||
|
<i class="fa fa-check"></i>
|
||||||
|
{{leaMsg . "Title"}} <i class="fa fa-sort-alpha-asc"></i>
|
||||||
|
|
||||||
|
</a></li>
|
||||||
|
<li role="presentation"><a data-sorter="titleDESC" class="sorter-style sorter-titleDESC" role="menuitem">
|
||||||
|
<i class="fa fa-check"></i>
|
||||||
|
{{leaMsg . "Title"}} <i class="fa fa-sort-alpha-desc"></i>
|
||||||
|
</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
-->
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -423,7 +427,7 @@ function log(o) {
|
|||||||
|
|
||||||
<div class="noteSplit" id="noteSplitter"></div>
|
<div class="noteSplit" id="noteSplitter"></div>
|
||||||
|
|
||||||
<div id="note">
|
<div id="note" class="read-only-editor">
|
||||||
|
|
||||||
<!-- 遮罩, 为了resize3Columns用 -->
|
<!-- 遮罩, 为了resize3Columns用 -->
|
||||||
<div id="noteMask" class="note-mask"></div>
|
<div id="noteMask" class="note-mask"></div>
|
||||||
@@ -494,8 +498,12 @@ function log(o) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ul class="pull-right" id="editorTool">
|
<ul class="pull-right" id="editorTool">
|
||||||
|
<li><a class="ios7-a " id="editBtn"
|
||||||
|
data-toggle="dropdown" title="ctrl/cmd+e {{leaMsg . "Toggle Modify with Readonly"}}">
|
||||||
|
<span class="fa"></span></a></li>
|
||||||
|
|
||||||
<li><a class="ios7-a " id="saveBtn"
|
<li><a class="ios7-a " id="saveBtn"
|
||||||
data-toggle="dropdown" title="ctrl+s {{msg . "save"}}">
|
data-toggle="dropdown" title="ctrl/cmd+s {{msg . "save"}}">
|
||||||
<span class="fa fa-save"></span></a></li>
|
<span class="fa fa-save"></span></a></li>
|
||||||
|
|
||||||
<li class="dropdown" id="noteInfoDropdown">
|
<li class="dropdown" id="noteInfoDropdown">
|
||||||
@@ -572,7 +580,7 @@ function log(o) {
|
|||||||
</div>
|
</div>
|
||||||
<!-- 查看信息 -->
|
<!-- 查看信息 -->
|
||||||
<div id="infoToolbar" class="info-toolbar invisible">
|
<div id="infoToolbar" class="info-toolbar invisible">
|
||||||
<a class="toolbar-update" title="{{msg . "modify"}} ctrl/cmd+e"><i class="fa fa-pencil"></i> <span class="lang">{{msg . "modify"}}</span></a>
|
|
||||||
<span class="lang">{{msg . "created"}}</span>: <span class="created-time"></span>
|
<span class="lang">{{msg . "created"}}</span>: <span class="created-time"></span>
|
||||||
<span class="lang">{{msg . "updated"}}</span>: <span class="updated-time"></span>
|
<span class="lang">{{msg . "updated"}}</span>: <span class="updated-time"></span>
|
||||||
</div>
|
</div>
|
||||||
@@ -607,7 +615,6 @@ function log(o) {
|
|||||||
<div class="navbar navbar-default">
|
<div class="navbar navbar-default">
|
||||||
<div class="navbar-inner" id="wmd-button-bar">
|
<div class="navbar-inner" id="wmd-button-bar">
|
||||||
<div id="mdInfoToolbar" class="info-toolbar invisible">
|
<div id="mdInfoToolbar" class="info-toolbar invisible">
|
||||||
<a class="toolbar-update" title="{{msg . "modify"}} ctrl/cmd+e"><i class="fa fa-pencil"></i> <span class="lang">{{msg . "modify"}}</span></a>
|
|
||||||
<span class="lang">{{msg . "created"}}</span>: <span class="created-time"></span>
|
<span class="lang">{{msg . "created"}}</span>: <span class="created-time"></span>
|
||||||
<span class="lang">{{msg . "updated"}}</span>: <span class="updated-time"></span>
|
<span class="lang">{{msg . "updated"}}</span>: <span class="updated-time"></span>
|
||||||
</div>
|
</div>
|
||||||
@@ -860,7 +867,7 @@ function log(o) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
var LEA = {};
|
var LEA = {sPath: ''};
|
||||||
LEA.locale = "{{.locale}}";
|
LEA.locale = "{{.locale}}";
|
||||||
var UrlPrefix = '{{.siteUrl}}';
|
var UrlPrefix = '{{.siteUrl}}';
|
||||||
var UserInfo = {{.userInfo|jsonJs}};
|
var UserInfo = {{.userInfo|jsonJs}};
|
||||||
@@ -886,7 +893,7 @@ var GlobalConfigs = {{.globalConfigs|jsonJs}};
|
|||||||
<!-- dev -->
|
<!-- dev -->
|
||||||
<script src="/js/jquery-1.9.0.min.js"></script>
|
<script src="/js/jquery-1.9.0.min.js"></script>
|
||||||
<script src="/js/jquery.ztree.all-3.5.js"></script>
|
<script src="/js/jquery.ztree.all-3.5.js"></script>
|
||||||
<script src="/js/object_id-min.js"></script>
|
<script src="/js/object_id.js"></script>
|
||||||
<!-- /dev -->
|
<!-- /dev -->
|
||||||
|
|
||||||
<script src="/tinymce/tinymce.js"></script>
|
<script src="/tinymce/tinymce.js"></script>
|
||||||
|
|||||||
+60
-56
@@ -6,8 +6,8 @@
|
|||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
|
||||||
<meta name="apple-touch-fullscreen" content="yes">
|
<meta name="apple-touch-fullscreen" content="yes">
|
||||||
<meta name=”apple-mobile-web-app-capable” content=”yes” />
|
<meta name=”apple-mobile-web-app-capable” content=”yes” />
|
||||||
<meta name="keywords" content="leanote,leanote.com">
|
<meta name="keywords" content="leanote,leanote.com,蚂蚁笔记">
|
||||||
<meta name="description" content="Leanote, {{msg $ "moto"}}">
|
<meta name="description" content="Leanote, 蚂蚁笔记, {{msg $ "moto"}}">
|
||||||
<title>Leanote, {{msg $ "moto"}}</title>
|
<title>Leanote, {{msg $ "moto"}}</title>
|
||||||
<link href="/css/bootstrap-min.css" rel="stylesheet" />
|
<link href="/css/bootstrap-min.css" rel="stylesheet" />
|
||||||
<!-- 先加载, 没有样式, 宽度不定 -->
|
<!-- 先加载, 没有样式, 宽度不定 -->
|
||||||
@@ -35,23 +35,16 @@ function log(o) {
|
|||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body class="leanote-plugin lang-{{$.locale}}">
|
||||||
<div id="page">
|
<div id="page">
|
||||||
<div id="pageInner">
|
<div id="pageInner">
|
||||||
<!-- 头部 -->
|
<!-- 头部 -->
|
||||||
<!-- <div id="headerContainer"> -->
|
<!-- <div id="headerContainer"> -->
|
||||||
<div id="header">
|
<div id="header">
|
||||||
<!--
|
<a id="logo" href="/" title="Leanote {{msg . "home"}}" class="pull-left"></a>
|
||||||
<div id="headerLeft" class="pull-left">
|
|
||||||
</div>
|
|
||||||
-->
|
|
||||||
<div id="logo" class="pull-left">
|
|
||||||
<!--<span>lea</span>note -->
|
|
||||||
<!--<img style="height: 45px;" src="/images/logo/leanote_white.png" title="leanote, 不一样的笔记" alt="leanote">-->
|
|
||||||
</div>
|
|
||||||
<div id="switcher" class="pull-left">
|
<div id="switcher" class="pull-left">
|
||||||
<i class="fa fa-align-justify" id="leftSwitcher" title="{{msg . "leftHidden"}}"></i>
|
<i class="fa fa-dedent" id="leftSwitcher" title="{{msg . "leftHidden"}}"></i>
|
||||||
<span id="leftSwitcher2" title="{{msg . "leftShow"}}"></span>
|
<span id="leftSwitcher2" class="fa fa-indent" title="{{msg . "leftShow"}}"></span>
|
||||||
</div>
|
</div>
|
||||||
<!-- search -->
|
<!-- search -->
|
||||||
<div class="pull-left" id="searchWrap">
|
<div class="pull-left" id="searchWrap">
|
||||||
@@ -124,9 +117,9 @@ function log(o) {
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pull-right" style="margin: 0 10px" id="myProfile">
|
<div class="pull-right" id="myProfile">
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<a class="dropdown-toggle" title="{{.userInfo.Username}}" data-toggle="dropdown" style="line-height: 60px;">
|
<a class="dropdown-toggle profile-img" title="{{.userInfo.Username}}" data-toggle="dropdown">
|
||||||
<img alt="{{.userInfo.Username}}" title="{{.userInfo.Username}}" src="{{if .userInfo.Logo}}{{.userInfo.Logo}}{{else}}/images/blog/default_avatar.png{{end}}" id="myAvatar"/>
|
<img alt="{{.userInfo.Username}}" title="{{.userInfo.Username}}" src="{{if .userInfo.Logo}}{{.userInfo.Logo}}{{else}}/images/blog/default_avatar.png{{end}}" id="myAvatar"/>
|
||||||
<span class="username">
|
<span class="username">
|
||||||
{{.userInfo.Username}}
|
{{.userInfo.Username}}
|
||||||
@@ -187,7 +180,7 @@ function log(o) {
|
|||||||
</div>
|
</div>
|
||||||
<div class="pull-right top-nav writting-hide lea-blog">
|
<div class="pull-right top-nav writting-hide lea-blog">
|
||||||
<a target="_blank" href="http://lea.leanote.com">
|
<a target="_blank" href="http://lea.leanote.com">
|
||||||
Lea++
|
{{msg . "Explore"}}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -196,13 +189,13 @@ function log(o) {
|
|||||||
{{msg . "myBlog"}}
|
{{msg . "myBlog"}}
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="pull-right toggle-editor-mode" style="line-height: 60px; margin-right:10px" id="toggleEditorMode">
|
<div class="pull-right toggle-editor-mode top-nav" id="toggleEditorMode">
|
||||||
<a href="#writing"><span>{{msg . "writingMode"}}</span></a>
|
<a href="#writing"><span>{{msg . "writingMode"}}</span></a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{{if eq .userInfo.Email "demo@leanote.com"}}
|
{{if eq .userInfo.Email "demo@leanote.com"}}
|
||||||
{{if .openRegister}}
|
{{if .openRegister}}
|
||||||
<div class="pull-right" style="line-height: 60px; margin-right:10px" id="demoRegister">
|
<div class="pull-right top-nav" id="demoRegister">
|
||||||
<span>
|
<span>
|
||||||
{{msg . "demoRegister"}}
|
{{msg . "demoRegister"}}
|
||||||
</span>
|
</span>
|
||||||
@@ -340,58 +333,67 @@ function log(o) {
|
|||||||
<div class="pull-left">
|
<div class="pull-left">
|
||||||
<!-- 我的笔记本 -->
|
<!-- 我的笔记本 -->
|
||||||
<div class="dropdown" id="myNotebookNavForListNav">
|
<div class="dropdown" id="myNotebookNavForListNav">
|
||||||
<a class="ios7-a dropdown-toggle" id="dropdownMenu1" data-toggle="dropdown">
|
<a class="ios7-a">
|
||||||
<span id="curNotebookForListNote">{{msg . "all"}}</span>
|
<span id="curNotebookForListNote">{{msg . "all"}}</span>
|
||||||
<!--
|
|
||||||
<i class="fa fa-angle-down"></i>
|
|
||||||
-->
|
|
||||||
</a>
|
</a>
|
||||||
<!-- 如果notebook过多, 则会产生滚动 弃用
|
|
||||||
<div class="dropdown-menu dropdown-list" style="left: 5px;">
|
|
||||||
<ul role="menu" aria-labelledby="dropdownMenu1" id="notebookNavForListNote"></ul>
|
|
||||||
</div>
|
|
||||||
-->
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 共享的笔记本 -->
|
<!-- 共享的笔记本 -->
|
||||||
<div class="dropdown" id="sharedNotebookNavForListNav" style="display: none">
|
<div class="dropdown" id="sharedNotebookNavForListNav" style="display: none">
|
||||||
<a class="ios7-a dropdown-toggle" id="dropdownMenu2" data-toggle="dropdown">
|
<a class="ios7-a">
|
||||||
<span id="curSharedNotebookForListNote">{{msg . "all"}}</span>
|
<span id="curSharedNotebookForListNote">{{msg . "all"}}</span>
|
||||||
<!--
|
|
||||||
<i class="fa fa-angle-down"></i>
|
|
||||||
-->
|
|
||||||
</a>
|
</a>
|
||||||
<ul class="dropdown-menu" role="menu"
|
|
||||||
aria-labelledby="dropdownMenu2" style="left: 5px;" id="sharedNotebookNavForListNote">
|
|
||||||
</ul>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="pull-left" id="tagSearch" style="line-height: 38px">
|
<!-- tag search -->
|
||||||
</div>
|
<div class="pull-left" id="tagSearch"></div>
|
||||||
|
<!-- sort type -->
|
||||||
<div id="sortType">
|
<div id="sortType">
|
||||||
<div class="dropdown">
|
<div class="dropdown">
|
||||||
<a class="ios7-a dropdown-toggle" id="dropdownMenu1"
|
<a class="ios7-a dropdown-toggle" id="dropdownMenu1"
|
||||||
data-toggle="dropdown">
|
data-toggle="dropdown">
|
||||||
<!--
|
</i><i class="fa fa-th-list"></i>
|
||||||
<i class="fa fa-sort-alpha-asc">
|
|
||||||
</i>Sort <i class="fa fa-angle-down"></i>
|
|
||||||
-->
|
|
||||||
</a>
|
</a>
|
||||||
<!--
|
|
||||||
<ul class="dropdown-menu" role="menu"
|
<ul class="dropdown-menu" role="menu"
|
||||||
aria-labelledby="dropdownMenu1"
|
aria-labelledby="dropdownMenu1"
|
||||||
style="right: 3px; ! important; left: -100px; min-width: 100px;">
|
>
|
||||||
<li role="presentation"><a role="menuitem" tabindex="-1"
|
<li role="presentation"><a data-view="snippet" class="view-style view-snippet" role="menuitem">
|
||||||
href="#">创建日期</a></li>
|
<i class="fa fa-check"></i>
|
||||||
<li role="presentation"><a role="menuitem" tabindex="-1"
|
{{leaMsg . "Snippet View"}}
|
||||||
href="#">修改日期</a></li>
|
</a></li>
|
||||||
<li role="presentation"><a role="menuitem" tabindex="-1"
|
<li role="presentation"><a data-view="list" class="view-style view-list" role="menuitem">
|
||||||
href="#">标题</a></li>
|
<i class="fa fa-check"></i>
|
||||||
|
{{leaMsg . "List View"}}
|
||||||
|
</a></li>
|
||||||
<li role="presentation" class="divider"></li>
|
<li role="presentation" class="divider"></li>
|
||||||
<li role="presentation"><a role="menuitem" tabindex="-1"
|
<li role="presentation"><a data-sorter="dateCreatedASC" class="sorter-style sorter-dateCreatedASC" role="menuitem">
|
||||||
href="#">Separated </a></li>
|
<i class="fa fa-check"></i>
|
||||||
|
{{leaMsg . "Date Created"}} <i class="fa fa-sort-alpha-asc"></i>
|
||||||
|
</a></li>
|
||||||
|
<li role="presentation"><a data-sorter="dateCreatedDESC" class="sorter-style sorter-dateCreatedDESC" role="menuitem">
|
||||||
|
<i class="fa fa-check"></i>
|
||||||
|
{{leaMsg . "Date Created"}} <i class="fa fa-sort-alpha-desc"></i>
|
||||||
|
</a></li>
|
||||||
|
<li role="presentation" class="divider"></li>
|
||||||
|
<li role="presentation"><a data-sorter="dateUpdatedASC" class="sorter-style sorter-dateUpdatedASC" role="menuitem">
|
||||||
|
<i class="fa fa-check"></i>
|
||||||
|
{{leaMsg . "Date Updated"}} <i class="fa fa-sort-alpha-asc"></i>
|
||||||
|
</a></li>
|
||||||
|
<li role="presentation"><a data-sorter="dateUpdatedDESC" class="sorter-style sorter-dateUpdatedDESC checked" role="menuitem">
|
||||||
|
<i class="fa fa-check"></i>
|
||||||
|
{{leaMsg . "Date Updated"}} <i class="fa fa-sort-alpha-desc"></i>
|
||||||
|
</a></li>
|
||||||
|
<li role="presentation" class="divider"></li>
|
||||||
|
<li role="presentation"><a data-sorter="titleASC" class="sorter-style sorter-titleASC" role="menuitem">
|
||||||
|
<i class="fa fa-check"></i>
|
||||||
|
{{leaMsg . "Title"}} <i class="fa fa-sort-alpha-asc"></i>
|
||||||
|
|
||||||
|
</a></li>
|
||||||
|
<li role="presentation"><a data-sorter="titleDESC" class="sorter-style sorter-titleDESC" role="menuitem">
|
||||||
|
<i class="fa fa-check"></i>
|
||||||
|
{{leaMsg . "Title"}} <i class="fa fa-sort-alpha-desc"></i>
|
||||||
|
</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
-->
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -405,7 +407,7 @@ function log(o) {
|
|||||||
|
|
||||||
<div class="noteSplit" id="noteSplitter"></div>
|
<div class="noteSplit" id="noteSplitter"></div>
|
||||||
|
|
||||||
<div id="note">
|
<div id="note" class="read-only-editor">
|
||||||
|
|
||||||
<!-- 遮罩, 为了resize3Columns用 -->
|
<!-- 遮罩, 为了resize3Columns用 -->
|
||||||
<div id="noteMask" class="note-mask"></div>
|
<div id="noteMask" class="note-mask"></div>
|
||||||
@@ -473,8 +475,11 @@ function log(o) {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<ul class="pull-right" id="editorTool">
|
<ul class="pull-right" id="editorTool">
|
||||||
|
<li><a class="ios7-a " id="editBtn"
|
||||||
|
data-toggle="dropdown" title="ctrl/cmd+e {{leaMsg . "Toggle Modify with Readonly"}}">
|
||||||
|
<span class="fa"></span></a></li>
|
||||||
<li><a class="ios7-a " id="saveBtn"
|
<li><a class="ios7-a " id="saveBtn"
|
||||||
data-toggle="dropdown" title="ctrl+s {{msg . "save"}}">
|
data-toggle="dropdown" title="ctrl/cmd+s {{msg . "save"}}">
|
||||||
<span class="fa fa-save"></span></a></li>
|
<span class="fa fa-save"></span></a></li>
|
||||||
<li class="dropdown" id="noteInfoDropdown">
|
<li class="dropdown" id="noteInfoDropdown">
|
||||||
<a class="ios7-a dropdown-toggle" data-toggle="dropdown" title="{{msg . "Information"}}">
|
<a class="ios7-a dropdown-toggle" data-toggle="dropdown" title="{{msg . "Information"}}">
|
||||||
@@ -547,7 +552,7 @@ function log(o) {
|
|||||||
</div>
|
</div>
|
||||||
<!-- 查看信息 -->
|
<!-- 查看信息 -->
|
||||||
<div id="infoToolbar" class="info-toolbar invisible">
|
<div id="infoToolbar" class="info-toolbar invisible">
|
||||||
<a class="toolbar-update" title="{{msg . "modify"}} ctrl/cmd+e"><i class="fa fa-pencil"></i> <span class="lang">{{msg . "modify"}}</span></a>
|
|
||||||
<span class="lang">{{msg . "created"}}</span>: <span class="created-time"></span>
|
<span class="lang">{{msg . "created"}}</span>: <span class="created-time"></span>
|
||||||
<span class="lang">{{msg . "updated"}}</span>: <span class="updated-time"></span>
|
<span class="lang">{{msg . "updated"}}</span>: <span class="updated-time"></span>
|
||||||
</div>
|
</div>
|
||||||
@@ -582,7 +587,6 @@ function log(o) {
|
|||||||
<div class="navbar navbar-default">
|
<div class="navbar navbar-default">
|
||||||
<div class="navbar-inner" id="wmd-button-bar">
|
<div class="navbar-inner" id="wmd-button-bar">
|
||||||
<div id="mdInfoToolbar" class="info-toolbar invisible">
|
<div id="mdInfoToolbar" class="info-toolbar invisible">
|
||||||
<a class="toolbar-update" title="{{msg . "modify"}} ctrl/cmd+e"><i class="fa fa-pencil"></i> <span class="lang">{{msg . "modify"}}</span></a>
|
|
||||||
<span class="lang">{{msg . "created"}}</span>: <span class="created-time"></span>
|
<span class="lang">{{msg . "created"}}</span>: <span class="created-time"></span>
|
||||||
<span class="lang">{{msg . "updated"}}</span>: <span class="updated-time"></span>
|
<span class="lang">{{msg . "updated"}}</span>: <span class="updated-time"></span>
|
||||||
</div>
|
</div>
|
||||||
@@ -833,7 +837,7 @@ function log(o) {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
var LEA = {};
|
var LEA = {sPath: ''};
|
||||||
LEA.locale = "{{.locale}}";
|
LEA.locale = "{{.locale}}";
|
||||||
var UrlPrefix = '{{.siteUrl}}';
|
var UrlPrefix = '{{.siteUrl}}';
|
||||||
var UserInfo = {{.userInfo|jsonJs}};
|
var UserInfo = {{.userInfo|jsonJs}};
|
||||||
|
|||||||
+13
-4
@@ -9,7 +9,7 @@ SP=$(cd "$(dirname "$0")"; pwd)
|
|||||||
tmp="/Users/life/Desktop/leanote_release"
|
tmp="/Users/life/Desktop/leanote_release"
|
||||||
|
|
||||||
# version
|
# version
|
||||||
V="v1.4"
|
V="v2.5"
|
||||||
|
|
||||||
##=================================
|
##=================================
|
||||||
# 1. 先build 成 3个平台, 2种bit = 6种
|
# 1. 先build 成 3个平台, 2种bit = 6种
|
||||||
@@ -32,7 +32,7 @@ function build()
|
|||||||
suffix=".exe"
|
suffix=".exe"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
GOOS=$1 GOARCH=$2 go build -o leanote-$1-$2$suffix ../app/tmp
|
GOOS=$1 GOARCH=$2 go build -o leanote-$1-$2$suffix github.com/leanote/leanote/app/tmp
|
||||||
}
|
}
|
||||||
|
|
||||||
build "linux" "386";
|
build "linux" "386";
|
||||||
@@ -62,12 +62,16 @@ cd $SP
|
|||||||
cd ../
|
cd ../
|
||||||
|
|
||||||
# bin
|
# bin
|
||||||
cp -r ./bin/src $tmp/leanote/bin/
|
# cp -r ./bin/src $tmp/leanote/bin/
|
||||||
|
mkdir -p $tmp/leanote/bin/src/github.com/leanote
|
||||||
cp ./bin/run.sh $tmp/leanote/bin/
|
cp ./bin/run.sh $tmp/leanote/bin/
|
||||||
cp ./bin/run.bat $tmp/leanote/bin/
|
cp ./bin/run.bat $tmp/leanote/bin/
|
||||||
|
|
||||||
# views
|
# views
|
||||||
cp -r ./app/views $tmp/leanote/app
|
cp -r ./app/views $tmp/leanote/app
|
||||||
|
# vendor
|
||||||
|
cp -r ./vendor $tmp/leanote/
|
||||||
|
|
||||||
# 可不要, 源码
|
# 可不要, 源码
|
||||||
#cp -r ./app/service $tmp/leanote/app/service
|
#cp -r ./app/service $tmp/leanote/app/service
|
||||||
#cp -r ./app/controllers $tmp/leanote/app/controllers
|
#cp -r ./app/controllers $tmp/leanote/app/controllers
|
||||||
@@ -122,7 +126,12 @@ function tarRelease()
|
|||||||
if [ $1 = "linux" -o $1 = "darwin" ]
|
if [ $1 = "linux" -o $1 = "darwin" ]
|
||||||
then
|
then
|
||||||
suffix=""
|
suffix=""
|
||||||
cp ./bin/run.sh $tmp/leanote/bin/
|
if [ $2 = "arm" ]
|
||||||
|
then
|
||||||
|
cp ./bin/run-arm.sh $tmp/leanote/bin/run.sh
|
||||||
|
else
|
||||||
|
cp ./bin/run-$1-$2.sh $tmp/leanote/bin/run.sh
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
cp ./bin/run.bat $tmp/leanote/bin/
|
cp ./bin/run.bat $tmp/leanote/bin/
|
||||||
suffix=".exe"
|
suffix=".exe"
|
||||||
|
|||||||
@@ -13,17 +13,6 @@ ln -s ../../../../ $SCRIPTPATH/src/github.com/leanote/leanote
|
|||||||
# set GOPATH
|
# set GOPATH
|
||||||
export GOPATH=$SCRIPTPATH
|
export GOPATH=$SCRIPTPATH
|
||||||
|
|
||||||
# run
|
script="$SCRIPTPATH/leanote-linux-arm"
|
||||||
osName=`uname` # Darwin or Linux
|
|
||||||
osName=`tr '[A-Z]' '[a-z]' <<<"$osName"` # toLowerCase
|
|
||||||
bit=`getconf LONG_BIT` # 32, 64
|
|
||||||
if [ $bit = "64" ]
|
|
||||||
then
|
|
||||||
bit="amd64"
|
|
||||||
else
|
|
||||||
bit="386"
|
|
||||||
fi
|
|
||||||
|
|
||||||
script="$SCRIPTPATH/leanote-$osName-$bit"
|
|
||||||
chmod 777 $script
|
chmod 777 $script
|
||||||
$script -importPath github.com/leanote/leanote
|
$script -importPath github.com/leanote/leanote
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
SCRIPTPATH=$(cd "$(dirname "$0")"; pwd)
|
||||||
|
|
||||||
|
# set link
|
||||||
|
|
||||||
|
path="$SCRIPTPATH/src/github.com/leanote"
|
||||||
|
if [ ! -d "$path" ]; then
|
||||||
|
mkdir -p "$path"
|
||||||
|
fi
|
||||||
|
rm -rf $SCRIPTPATH/src/github.com/leanote/leanote # 先删除
|
||||||
|
ln -s ../../../../ $SCRIPTPATH/src/github.com/leanote/leanote
|
||||||
|
|
||||||
|
# set GOPATH
|
||||||
|
export GOPATH=$SCRIPTPATH
|
||||||
|
|
||||||
|
script="$SCRIPTPATH/leanote-darwin-amd64"
|
||||||
|
chmod 777 $script
|
||||||
|
$script -importPath github.com/leanote/leanote
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
SCRIPTPATH=$(cd "$(dirname "$0")"; pwd)
|
||||||
|
|
||||||
|
# set link
|
||||||
|
|
||||||
|
path="$SCRIPTPATH/src/github.com/leanote"
|
||||||
|
if [ ! -d "$path" ]; then
|
||||||
|
mkdir -p "$path"
|
||||||
|
fi
|
||||||
|
rm -rf $SCRIPTPATH/src/github.com/leanote/leanote # 先删除
|
||||||
|
ln -s ../../../../ $SCRIPTPATH/src/github.com/leanote/leanote
|
||||||
|
|
||||||
|
# set GOPATH
|
||||||
|
export GOPATH=$SCRIPTPATH
|
||||||
|
|
||||||
|
script="$SCRIPTPATH/leanote-linux-386"
|
||||||
|
chmod 777 $script
|
||||||
|
$script -importPath github.com/leanote/leanote
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
SCRIPTPATH=$(cd "$(dirname "$0")"; pwd)
|
||||||
|
|
||||||
|
# set link
|
||||||
|
|
||||||
|
path="$SCRIPTPATH/src/github.com/leanote"
|
||||||
|
if [ ! -d "$path" ]; then
|
||||||
|
mkdir -p "$path"
|
||||||
|
fi
|
||||||
|
rm -rf $SCRIPTPATH/src/github.com/leanote/leanote # 先删除
|
||||||
|
ln -s ../../../../ $SCRIPTPATH/src/github.com/leanote/leanote
|
||||||
|
|
||||||
|
# set GOPATH
|
||||||
|
export GOPATH=$SCRIPTPATH
|
||||||
|
|
||||||
|
script="$SCRIPTPATH/leanote-linux-amd64"
|
||||||
|
chmod 777 $script
|
||||||
|
$script -importPath github.com/leanote/leanote
|
||||||
@@ -0,0 +1,11 @@
|
|||||||
|
# Revel command line tools
|
||||||
|
|
||||||
|
Provides the `revel` command, used to create and run Revel apps.
|
||||||
|
|
||||||
|
- More info at http://revel.github.io/manual/tool.html
|
||||||
|
|
||||||
|
Install
|
||||||
|
------------
|
||||||
|
```bash
|
||||||
|
go get github.com/revel/cmd/revel
|
||||||
|
```
|
||||||
Loaded 100 of 1703 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user