Compare commits

..
110 Commits
Author SHA1 Message Date
lealife 371f5e23c3 realease 2017-07-27 20:25:54 +08:00
lealife 825fda5544 windows export pdf 2017-07-27 20:00:53 +08:00
lealife 6ede5c1559 for release 2017-07-27 15:31:52 +08:00
lealife 1ff90dacde Fix windows export pdf
https://github.com/leanote/leanote/issues/514
2017-07-27 15:08:34 +08:00
lealife 2654b684df upgrade revel to 0.16 2017-06-21 18:24:42 +08:00
life d424395d85 Update .travis.yml 2017-06-21 18:09:53 +08:00
life 54810b3458 Merge pull request #628 from samtux/master
Translation to Spanish
2017-06-21 17:57:56 +08:00
Samuel Mesa 1cf66ad6c0 Translation to Spanish 2017-06-19 21:10:49 -05:00
lealife 6dc334ca51 Chrome 58 cannot select image 2017-05-19 11:50:50 +08:00
life f9b4ead6be Merge pull request #590 from sundev126/patch-1
修复arm 32下/adminUser/index假死的bug
2017-04-16 21:36:13 +08:00
lealife 3bf6703929 blog paging configuration 2017-04-16 15:27:35 +08:00
Sunpy ec657b9dcb 修复arm 32下/adminUser/index假死的bug
如果pageSize为0,则计算页数的时候会造成浮点数除0.0,由于浮点数除0得到的结果是`+Inf`,转换为整数后的结果是`2,147,483,647`,所以在渲染page.html模板时需要很长时间。
2017-04-13 18:00:42 +08:00
lealife 4ffd048b2a Form submission canceled because the form is not connected 2017-04-12 15:58:55 +08:00
lealife 6af19670da Upgrade revel from 0.13 to 0.14
https://github.com/revel/revel/releases/tag/v0.14.0
2017-04-08 18:55:42 +08:00
lealife 721e375d76 mind map 2017-03-07 13:38:04 +08:00
lealife 41f95cf0e5 2.4 released 2017-02-20 13:57:24 +08:00
lealife ba411ef580 2.4 released 2017-02-20 13:51:07 +08:00
lealife 9dcf0ed53e delete unused 2017-02-20 13:48:26 +08:00
lealife d5d853ffd3 Support note list view and sorter 2017-02-18 20:01:43 +08:00
lealife ae29119664 set session.expires to 3h 2017-02-18 20:01:26 +08:00
lealife ad644258f5 Support for leanote-chrome plugin 2017-02-18 20:01:14 +08:00
lealife 8c98f4da5c markdown remove smartypants; support table align 2017-02-09 11:39:30 +08:00
lealife e2585bf695 2.3 released 2017-01-23 22:41:31 +08:00
lealife 3b9bc687c4 theme 2017-01-23 18:26:56 +08:00
lealife 2db182db1b 2.3 released 2017-01-23 17:43:41 +08:00
lealife f3e1eb6c3f Add leaui mind map plugin 2017-01-23 17:43:13 +08:00
lealife 956e1ba2bb fix upload image error [api] 2017-01-23 17:42:38 +08:00
lealife f294fa4124 fix cannot add deleted tags 2017-01-23 17:42:21 +08:00
lealife cabf89f9b8 like bug 2017-01-23 17:42:04 +08:00
lealife d183cd5a77 https://github.com/leanote/leanote/issues/513 2017-01-16 11:49:30 +08:00
lealife 000dfea92d 2.2.2 2017-01-07 15:55:31 +08:00
lealife a53398ebb4 Fix export note image to pdf error 2017-01-07 15:53:22 +08:00
lealife b23592229a update travis 2016-12-31 12:16:17 +08:00
lealife 584bde247e fix search deleted note 2016-12-31 12:10:27 +08:00
lealife 6774392807 2.2.1 2016-12-28 11:19:09 +08:00
lealife 964cf1a750 fix issue can't sync images on markdown notes 2016-12-28 10:27:08 +08:00
lealife 52128e6453 update qq groups 2016-12-26 15:45:48 +08:00
lealife 032470c3df v 2.2 2016-12-24 15:47:57 +08:00
lealife a8dd578624 relative image url/fix conflict when upload attachment again 2016-12-24 15:16:23 +08:00
lealife f49624d3eb Support send email with ssl 2016-10-29 16:38:13 +08:00
lealife 816af11db2 防止Unzip文件恶意攻击 2016-10-27 16:37:12 +08:00
lealife eda03f0aa4 防止用"../../来获取其它文件" 2016-10-27 15:40:17 +08:00
lealife 6a06511405 防止用"../../来获取其它文件" 2016-10-27 15:09:10 +08:00
lealife 15d8ebdc0f New Chrome, Chinese input problem
https://github.com/leanote/leanote/issues/42
2016-09-24 10:44:10 +08:00
life 5dc929c4c0 Merge pull request #408 from zhang-yuan/master
Translation fixed
2016-08-26 09:55:50 +08:00
life a4d6a99fee Merge pull request #409 from alexsourcerer/patch-9
Update album.conf  (fr-fr)
2016-08-26 09:54:59 +08:00
life 15d3b847cb Merge pull request #411 from alexsourcerer/patch-11
Update member.conf (fr-fr)
2016-08-26 09:54:49 +08:00
life 065ac99942 Merge pull request #412 from alexsourcerer/patch-12
Update msg.conf (fr-fr)
2016-08-26 09:54:33 +08:00
life 08ec359b93 Merge pull request #413 from alexsourcerer/patch-13
Update tinymce_editor.conf (fr-fr)
2016-08-26 09:54:03 +08:00
life 2f81c04f41 Merge pull request #378 from lucienevans/master
auto number in MathJax (just blog)
2016-08-26 09:52:23 +08:00
life e8bff79425 Merge pull request #410 from alexsourcerer/patch-10
Update markdown.conf
2016-08-26 09:49:45 +08:00
alexsourcerer 4ca8e8cd83 Update tinymce_editor.conf
translation created & completed!
2016-08-23 12:41:32 +02:00
alexsourcerer c0cc08a3c2 Update msg.conf
translation updated!
2016-08-23 12:04:53 +02:00
alexsourcerer d32a6dd277 Update member.conf
updated translation to french
2016-08-23 11:57:22 +02:00
alexsourcerer 8bacc15309 Update markdown.conf
translated to french
2016-08-23 11:46:26 +02:00
alexsourcerer 8a3f24b9c6 Update album.conf
translated to french
2016-08-23 11:37:16 +02:00
haha 2a7d1fe7b5 Add translation 2016-08-23 14:09:53 +08:00
haha 9a05ffcd8f 翻译问题 2016-08-23 12:11:41 +08:00
lealife aa95e680f9 travis use go 1.4 2016-08-23 11:06:50 +08:00
life 874ab69c34 Merge pull request #406 from Xunius/patch-2
add vim and emacs modes to features
2016-08-23 10:33:13 +08:00
Xunius d43f5fd7ab add vim and emacs modes to features 2016-08-22 17:44:39 +08:00
life 6a048f0d9a Merge pull request #403 from Xunius/patch-1
rephrased English n Chinese, fixed links to docs.
2016-08-22 17:23:21 +08:00
Xunius cb3681f651 rephrased English n Chinese, fixed links to docs.
Fixed grammar errors in English and polished the wordings.
Changed order at one place to make the Doc part appear before develop.
Added links to installation tutorials
2016-08-19 19:12:30 +08:00
life dfd7159401 Merge pull request #361 from gaoyifan/patch-1
fix spelling mistake in README.md
2016-07-22 10:36:10 +08:00
lucien 929ec975da auto number in MathJax 2016-06-21 23:35:49 +08:00
life e826dc7b93 Merge pull request #374 from mhoffmann75/german_transl
add complete german translation
2016-06-10 17:12:21 +08:00
Martin Hoffmann 629a49e54b add complete german translation
- modify app/views/home/header.html to know de-de messages folder
- create messages/de-de folder with all german language files (album, blog, ...)
- create public/js/i18n/blog.de-de.js and ms.de-de.js files
- add public/tinymce/langs/de-de.js from tinymce project

Thanks to Marc Manthey (macbroadcast) who is the original author of the german translation for the leanote 1.x project (https://github.com/macbroadcast/leanote). I took his work as starting point for my complete german translation on leanote 2.0.
2016-06-10 09:46:31 +02:00
lealife 6ebedf94f0 app.conf 2016-05-25 17:33:38 +08:00
lealife a07bb25128 remove unused codes and add site'url configuration on admin 2016-05-25 16:05:47 +08:00
lealife a007b89ebb v2.0 2016-05-25 14:46:40 +08:00
lealife cc4b003503 markdown vim cursor fixed 2016-05-25 09:51:53 +08:00
lealife 091922175a box leanote logo 2016-05-22 16:12:51 +08:00
lealife 371c93912d build 2016-05-22 10:36:36 +08:00
lealife 27221acda7 new logo 2016-05-22 10:34:40 +08:00
lealife 5db724e80b new logo 2016-05-21 23:05:50 +08:00
Yifan Gao 14265d9de4 fix spelling mistake in README.md 2016-05-18 10:26:24 +08:00
lealife 5c9e95ed60 build 2016-04-16 14:53:30 +08:00
lealife 2fc97ed42d markdown editor prettify add linenums 2016-04-16 14:51:54 +08:00
lealife 45cca30cec lea++ -> Explore 2016-04-16 12:09:48 +08:00
lealife 31167b6aaf recount tags 2016-04-16 11:58:39 +08:00
lealife 139906b9d6 recount tags when public note 2016-04-16 11:31:27 +08:00
lealife a9d49369e2 upgrade markdown mathjax 2016-04-12 22:02:36 +08:00
life 303e0da5c0 Update README.md 2016-04-09 10:12:46 +08:00
life ff5523bfaa Merge pull request #340 from eric2100/patch-15
Update blog.conf
2016-04-08 17:07:20 +08:00
Tsunghan,Tsai 063dd0140d Update blog.conf
部分口語修改
2016-04-08 12:31:41 +08:00
life c52d388d5d Merge pull request #337 from eric2100/patch-14
Update msg.conf
2016-04-07 17:31:04 +08:00
eric2100 18bcdb48af Update msg.conf 2016-04-07 12:29:03 +08:00
life db8f132507 Merge pull request #333 from eric2100/patch-9
Update blog.conf
2016-04-05 10:14:31 +08:00
life 439d5212b0 Merge pull request #334 from eric2100/patch-10
Update markdown.conf
2016-04-05 10:13:40 +08:00
life 88e2320027 Merge pull request #335 from eric2100/patch-11
Update member.conf
2016-04-05 10:13:09 +08:00
life 659a4e590a Merge pull request #336 from eric2100/patch-12
Update tinymce_editor.conf
2016-04-05 10:12:19 +08:00
eric2100 ab7f2386e0 Update tinymce_editor.conf 2016-04-05 00:24:21 +08:00
eric2100 ec82ff18f2 Update member.conf 2016-04-05 00:16:00 +08:00
eric2100 f3f00626e6 Update markdown.conf 2016-04-05 00:03:27 +08:00
eric2100 80fbb56426 Update blog.conf 2016-04-05 00:01:46 +08:00
life a5c952882f Merge pull request #332 from eric2100/patch-8
Update album.conf
2016-04-03 21:30:30 +08:00
eric2100 973b452a7e Update album.conf 2016-04-02 21:12:30 +08:00
lealife 25bcd21ea9 overwrite revel.Message 2016-03-19 23:00:41 +08:00
lealife 09de5e1e83 Gulp js i18n generator 2016-03-19 15:46:41 +08:00
lealife 15b0ef21ff restructure messages 2016-03-19 15:37:36 +08:00
lealife 9cf9ded855 remove config langs. Gulp will get all langs by messages/ 2016-03-19 15:17:15 +08:00
lealife 7af433ebaf build 2016-03-19 14:36:47 +08:00
lealife 67b608b324 set langs to config and modify gulp build to support langs 2016-03-19 14:30:07 +08:00
lealife 2aa3f5a654 support 中文繁体 2016-03-19 14:05:09 +08:00
lealife f5538218bd remove baidu statistics Code
https://github.com/leanote/leanote/issues/318
2016-03-04 22:23:53 +08:00
lealife 0e3bdd177c md resize when toggle 2016-02-27 15:30:01 +08:00
lealife 12520cc09d mathjax 2.6.1 2016-02-27 14:20:31 +08:00
life cb67892124 Merge pull request #309 from alexsourcerer/patch-8
Update msg.fr
2016-02-18 14:55:17 +08:00
alexsourcerer 45c09c9a26 Update msg.fr
I updated the msg.fr file (note that the website isn't it french at all anymore for french users)
2016-02-03 23:10:50 +01:00
lealife 20951ea2dd build release 2015-12-25 23:59:57 +08:00
1193 changed files with 104219 additions and 5197 deletions

No files matched your search

-1
View File
@@ -7,7 +7,6 @@ bin/release
bin/test.sh bin/test.sh
bin/tmp bin/tmp
bin/test bin/test
bin/src
public/upload public/upload
app/routes/routes.go app/routes/routes.go
app/tmp/main.go app/tmp/main.go
+1 -3
View File
@@ -1,5 +1,5 @@
language: go language: go
go: 1.3 go: 1.7
services: services:
- mongodb # 2.4.12 - mongodb # 2.4.12
@@ -18,8 +18,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 -19
View File
@@ -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,22 +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('blog.pt', [], 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);
genI18nJsFile('msg.pt', ['member.pt', 'markdown.pt', 'album.pt'], keys);
}); });
// 合并album需要的js // 合并album需要的js
@@ -324,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);
+88 -64
View File
@@ -5,66 +5,83 @@
## 1. Introduction ## 1. Introduction
Leanote, Not Just A Notepad! Leanote, not just a notepad!
![leanote.png](leanote.png "") ![leanote.png](leanote.png "")
**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
@@ -74,12 +91,12 @@ Support us, [donate us](http://leanote.org/#donate). And thanks [donators](http:
You 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)
-73
View File
@@ -1,73 +0,0 @@
# Leanote
[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/leanote/leanote?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
[![Build Status](https://travis-ci.org/leanote/leanote.svg)](https://travis-ci.org/leanote/leanote)
## 1. 介绍
Leanote, 不只是笔记!
![leanote.png](leanote.png "")
**特性**
* 知识管理: 通过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)
+5 -5
View File
@@ -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))
} }
+3 -3
View File
@@ -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)
} }
// 下载附件 // 下载附件
+29 -29
View File
@@ -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")
} }
+27 -17
View File
@@ -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" && lang != "fr" && lang != "pt" { 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
View File
@@ -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)
} }
+16 -16
View File
@@ -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)
} }
+3 -3
View File
@@ -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)
} }
+71 -37
View File
@@ -11,6 +11,7 @@ import (
"regexp" "regexp"
"strings" "strings"
"time" "time"
"runtime"
// "github.com/leanote/leanote/app/types" // "github.com/leanote/leanote/app/types"
// "io/ioutil" // "io/ioutil"
"fmt" "fmt"
@@ -36,7 +37,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 +59,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 +98,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 +107,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 +143,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 +188,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 +202,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 +249,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 +259,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 +280,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 +293,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 +306,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 +314,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 +350,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 +398,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")
} }
@@ -433,8 +447,12 @@ func (c Note) ExportPdf(noteId string) revel.Result {
binPath := configService.GetGlobalStringConfig("exportPdfBinPath") binPath := configService.GetGlobalStringConfig("exportPdfBinPath")
// 默认路径 // 默认路径
if binPath == "" { if binPath == "" {
if runtime.GOOS == "windows" {
binPath = `C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe`
} else {
binPath = "/usr/local/bin/wkhtmltopdf" binPath = "/usr/local/bin/wkhtmltopdf"
} }
}
url := configService.GetSiteUrl() + "/note/toPdf?noteId=" + noteId + "&appKey=" + appKey url := configService.GetSiteUrl() + "/note/toPdf?noteId=" + noteId + "&appKey=" + appKey
// cc := binPath + " --no-stop-slow-scripts --javascript-delay 10000 \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\"" // cc := binPath + " --no-stop-slow-scripts --javascript-delay 10000 \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\""
@@ -443,13 +461,29 @@ func (c Note) ExportPdf(noteId string) revel.Result {
// http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf_0.10.0_rc2-doc.html // http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf_0.10.0_rc2-doc.html
// wkhtmltopdf参数大全 // wkhtmltopdf参数大全
var cc string var cc string
// var cc []string
var ccWindows []string
if note.IsMarkdown { if note.IsMarkdown {
cc = binPath + " --lowquality --window-status done \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\"" cc = binPath + " --lowquality --window-status done \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\""
// cc = []string{binPath, "--lowquality", "--window-status", "done", "\"" + url + "\"", "\"" + path + "\""}
ccWindows = []string{"/C", binPath, "--lowquality", "--window-status", "done", url, path}
} else { } else {
cc = binPath + " --lowquality \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\"" cc = binPath + " --lowquality \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\""
// cc = []string{binPath, "--lowquality", "\"" + url + "\"", "\"" + path + "\""}
ccWindows = []string{"/C", binPath, "--lowquality", url, path}
} }
cmd := exec.Command("/bin/sh", "-c", cc) var cmd *exec.Cmd
// fmt.Println("-------1", runtime.GOOS, ccWindows)
if runtime.GOOS == "windows" {
fmt.Println(ccWindows)
// cmd = exec.Command("cmd", ccWindows...)
cmd = exec.Command(ccWindows[1], ccWindows[2:]...)
} else {
fmt.Println(cc)
cmd = exec.Command("/bin/sh", "-c", cc)
}
_, err := cmd.Output() _, err := cmd.Output()
if err != nil { if err != nil {
return c.RenderText("export pdf error. " + fmt.Sprintf("%v", err)) return c.RenderText("export pdf error. " + fmt.Sprintf("%v", err))
@@ -475,5 +509,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)
} }
+9 -9
View File
@@ -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)
} }
+12 -12
View File
@@ -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(""))
} }
+27 -27
View File
@@ -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)
} }
// 更新, 也是一样, 先删后加 // 更新, 也是一样, 先删后加
+2 -2
View File
@@ -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)
} }
+16 -16
View File
@@ -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)
} }
+1 -1
View File
@@ -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
} }
+4 -4
View File
@@ -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)
} }
+9 -9
View File
@@ -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")
} }
+5 -5
View File
@@ -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)
+30 -29
View File
@@ -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")
} }
+26 -20
View File
@@ -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)
} }
+5 -5
View File
@@ -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")
} }
+1 -1
View File
@@ -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")
+7 -7
View File
@@ -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)
} }
+4 -4
View File
@@ -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)
+4 -4
View 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)
} }
*/ */
+59 -35
View File
@@ -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://"
// ![](http://demo.leanote.top/api/file/getImage?fileId=5863219465b68e4fd5000001)
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
+7 -7
View File
@@ -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(&notebook)) return c.RenderJSON(c.fixNotebook(&notebook))
} }
// 修改笔记 // 修改笔记
@@ -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(&notebook)) return c.RenderJSON(c.fixNotebook(&notebook))
} }
// 删除笔记本 // 删除笔记本
@@ -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)
} }
+3 -3
View File
@@ -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)
} }
+12 -12
View File
@@ -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)
} }
} }
+2 -2
View File
@@ -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() {
+1 -1
View File
@@ -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
} }
+61 -61
View File
@@ -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")
} }
+1 -1
View File
@@ -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")
-94
View File
@@ -1,94 +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("msg.pt")
parse("blog.zh")
parse("blog.en")
parse("blog.fr")
parse("blog.pt")
}
+9
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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)
} }
+223
View File
@@ -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, ""
}
+1
View File
@@ -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)
+10 -6
View File
@@ -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,
+21 -26
View File
@@ -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.2" return "2.5"
} }
+72 -1
View File
@@ -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)
+75 -7
View File
@@ -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(&notes)
if len(notes) > 0 {
return notes[0]
}
// db.GetByQ(db.Notes, bson.M{"Src": src, "UserId": bson.ObjectIdHex(userId), "IsDeleted": false}, &note)
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">
+9 -1
View File
@@ -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
} }
+22
View File
@@ -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
+1 -1
View File
@@ -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
} }
} }
+25
View File
@@ -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)
}
+32
View File
@@ -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)
}
+26
View File
@@ -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)
}
+4
View File
@@ -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">
+11
View File
@@ -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>
+3 -3
View File
@@ -3,16 +3,16 @@
<div class="row"> <div class="row">
<div class="col-sm-6"> <div class="col-sm-8">
<form id="add_user_form"> <form id="add_user_form">
<section class="panel panel-default"> <section class="panel panel-default">
<div class="panel-body"> <div class="panel-body">
<div class="form-group"> <div class="form-group">
<label>Wkhtmltopdf Binary Path</label> <label>Wkhtmltopdf Binary Path</label>
<input type="text" class="form-control" placeholder="/usr/local/bin/wkhtmltopdf" name="path" value="{{.str.exportPdfBinPath}}"> <input type="text" class="form-control" placeholder="/usr/local/bin/wkhtmltopdf or C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe" name="path" value="{{.str.exportPdfBinPath}}">
Leanote use <a target="_blank" href="http://wkhtmltopdf.org">wkhtmltopdf</a> to export pdf. You should install it on your server. Leanote use <a target="_blank" href="http://wkhtmltopdf.org">wkhtmltopdf</a> to export pdf. You should install it on your server.
<br /> <br />
Please input the path that wkhtmltopdf installed, e.g. <code>/usr/local/bin/wkhtmltopdf</code> Please input the path that wkhtmltopdf installed, e.g. <code>/usr/local/bin/wkhtmltopdf</code> on mac os/linux or <code>C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe</code> on windows.
</div> </div>
</div> </div>
+51
View File
@@ -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
View File
@@ -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">
+1 -1
View File
@@ -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>
-19
View File
@@ -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" .}}
-204
View File
@@ -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}}
-56
View File
@@ -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>
-104
View File
@@ -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>
-73
View File
@@ -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>
-->
-50
View File
@@ -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>
-45
View File
@@ -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>
-323
View File
@@ -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>
-125
View File
@@ -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}}
&nbsp;
<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>
+1 -1
View File
@@ -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>
+1 -1
View File
@@ -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>
+6 -6
View File
@@ -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/js/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/js/google-code-prettify/prettify.js"></script> <script src="/public/js/google-code-prettify/prettify.js"></script>
<script> <script>
function ok() { function ok() {
+2 -2
View File
@@ -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 -2
View File
@@ -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 -2
View File
@@ -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>
+9 -10
View File
@@ -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>
+11 -10
View File
@@ -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,17 +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="pt-br">Portugu&ecirc;s</a> <a data-lang="zh-hk">繁体中文</a>
<a data-lang="pt-pt">Portugu&ecirc;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">
@@ -50,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>
+3 -3
View File
@@ -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">
-10
View File
@@ -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>
+3 -3
View File
@@ -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>
+2 -2
View File
@@ -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>
+1 -1
View File
@@ -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>
+2 -2
View File
@@ -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}}
+1 -1
View File
@@ -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>
+6 -6
View File
@@ -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">
+56 -52
View File
@@ -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>
@@ -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>
@@ -863,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}};
@@ -889,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>
+52 -50
View File
@@ -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>
@@ -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>
@@ -835,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}};
+1 -1
View File
@@ -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.2" V="v2.5"
##================================= ##=================================
# 1. 先build 成 3个平台, 2种bit = 6种 # 1. 先build 成 3个平台, 2种bit = 6种
+4 -4
View File
@@ -4,13 +4,13 @@ cd..
set SCRIPTPATH=%cd% set SCRIPTPATH=%cd%
: top src directory : top src directory
set path="%SCRIPTPATH%\bin\src\github.com\leanote" set leanotePath="%SCRIPTPATH%\bin\src\github.com\leanote"
if not exist "%path%" mkdir "%path%" if not exist "%leanotePath%" mkdir "%leanotePath%"
: create software link : create software link
if exist "%path%\leanote" del /Q "%path%\leanote" if exist "%leanotePath%\leanote" del /Q "%leanotePath%\leanote"
mklink /D "%path%\leanote" %SCRIPTPATH% mklink /D "%leanotePath%\leanote" %SCRIPTPATH%
: set GOPATH : set GOPATH
set GOPATH="%SCRIPTPATH%\bin" set GOPATH="%SCRIPTPATH%\bin"
@@ -0,0 +1,7 @@
modules
=======
Set of officially supported modules for Revel applications
### Caution
this is a work in progress
@@ -0,0 +1,6 @@
modules/auth
===============
Basic user/auth module
This should be modeled after [flask-security](https://github.com/mattupstate/flask-security)
@@ -0,0 +1,78 @@
package auth
import (
// "errors"
)
var (
Store StorageDriver
)
// Store = gormauth.NewGormAuthDriver()
type UserAuth interface {
// getters/setters implemented by the app-level model
UserId() string
Secret() string
HashedSecret() string
SetHashedSecret(string)
SecretDriver
// // implemented by secret driver
// Authenticate() (bool, error)
}
type SecretDriver interface {
Authenticate() (bool, error)
HashSecret(args ...interface{}) (string, error)
// stuff for documentation
// UserContext is expected in these?
// Secret expects 0 or non-0 arguments
// When no parameter is passed, it acts as a getter
// When one or more parameters are passed, it acts as a setter
// A driver should specify the expected arguments and their meanings
// Register()
// Login()
// Logout()
}
type StorageDriver interface {
Save(user interface{}) error
// Load should take a partially filled struct
// (with values needed to look up)
// and fills in the rest
Load(user interface{}) error
}
// func init() {
// // auth.Store = gorm...
// }
// func (c App) Login(email, password string) {
// u := User {
// Email ...
// }
// good, err := auth.Authenticate(email, password)
// user, err := user_info.GetUserByEmail(email)
// }
// Bycrypt Authenticate() expects a single string argument of the plaintext password
// It returns true on success and false if error or password mismatch
// func Authenticate(attemptedUser UserAuth) (bool, error) {
// // check user in Store
// loadedUser, err := Store.Load(attemptedUser.UserId())
// if err != nil {
// return false, errors.New("User Not Found")
// }
// loadedUser.Authenticate(attemptedUser.Secret())
// // successfully authenticated
// return true, nil
// }
@@ -0,0 +1,134 @@
package auth_test
import (
"errors"
"testing"
"github.com/revel/modules/auth"
"github.com/revel/modules/auth/driver/secret"
)
type User struct {
email string
password string
hashpass string
secret.BcryptAuth // SecurityDriver for testing
}
func NewUser(email, pass string) *User {
u := &User{
email: email,
password: pass,
}
u.UserContext = u
return u
}
func (self *User) UserId() string {
return self.email
}
func (self *User) Secret() string {
return self.password
}
func (self *User) HashedSecret() string {
return self.hashpass
}
func (self *User) SetHashedSecret(hpass string) {
self.hashpass = hpass
}
// func (self *User) Load() string
type TestStore struct {
data map[string]string
}
func (self *TestStore) Save(user interface{}) error {
u, ok := user.(*User)
if !ok {
return errors.New("TestStore.Save() expected arg of type User")
}
hPass, err := u.HashSecret(u.Secret())
if err != nil {
return err
}
self.data[u.UserId()] = hPass
return nil
}
func (self *TestStore) Load(user interface{}) error {
u, ok := user.(*User)
if !ok {
return errors.New("TestStore.Load() expected arg of type User")
}
hpass, ok := self.data[u.UserId()]
if !ok {
return errors.New("Record Not Found")
}
u.SetHashedSecret(hpass)
return nil
}
func TestPasswordHash(t *testing.T) {
auth.Store = &TestStore{
data: make(map[string]string),
}
u := NewUser("demo@domain.com", "demopass")
fail := NewUser("demo@domain.com", "")
var err error
u.hashpass, err = u.HashSecret(u.password)
if err != nil {
t.Errorf("Should have hashed password, get error: %v\n", err)
}
fail.hashpass, err = fail.HashSecret(fail.password)
if err == nil {
t.Errorf("Should have failed hashing\n")
}
}
func TestAuthenticate(t *testing.T) {
auth.Store = &TestStore{
data: make(map[string]string),
}
// user registered a long time ago
u := NewUser("demo@domain.com", "demopass")
err := auth.Store.Save(u)
if err != nil {
t.Errorf("Should have saved user: %v", err)
}
// users now logging in
pass := NewUser("demo@domain.com", "demopass")
fail := NewUser("demo@domain.com", "invalid")
// valid user is now trying to login
// check user in DB
err = auth.Store.Load(pass)
if err != nil {
t.Errorf("Should have loaded pass user: %v\n", err)
}
// check credentials
ok, err := pass.Authenticate()
if !ok || err != nil {
t.Errorf("Should have authenticated user")
}
// invalid user is now trying to login
err = auth.Store.Load(fail)
if err != nil {
t.Errorf("Should have loaded fail user")
}
// this should fail
ok, err = fail.Authenticate()
if ok || err != nil {
t.Errorf("Should have failed to authenticate user: %v\n", err)
}
}
Loaded 100 of 1193 files, more files were not shown because too many files have changed in this diff. Show more