Compare commits
255
Commits
1.0
..
feature-2.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
290772b437 | ||
|
|
6ebedf94f0 | ||
|
|
a07bb25128 | ||
|
|
a007b89ebb | ||
|
|
cc4b003503 | ||
|
|
091922175a | ||
|
|
371c93912d | ||
|
|
27221acda7 | ||
|
|
5db724e80b | ||
|
|
5c9e95ed60 | ||
|
|
2fc97ed42d | ||
|
|
45cca30cec | ||
|
|
31167b6aaf | ||
|
|
139906b9d6 | ||
|
|
a9d49369e2 | ||
|
|
303e0da5c0 | ||
|
|
ff5523bfaa | ||
|
|
063dd0140d | ||
|
|
c52d388d5d | ||
|
|
18bcdb48af | ||
|
|
db8f132507 | ||
|
|
439d5212b0 | ||
|
|
88e2320027 | ||
|
|
659a4e590a | ||
|
|
ab7f2386e0 | ||
|
|
ec82ff18f2 | ||
|
|
f3f00626e6 | ||
|
|
80fbb56426 | ||
|
|
a5c952882f | ||
|
|
973b452a7e | ||
|
|
25bcd21ea9 | ||
|
|
09de5e1e83 | ||
|
|
15b0ef21ff | ||
|
|
9cf9ded855 | ||
|
|
7af433ebaf | ||
|
|
67b608b324 | ||
|
|
2aa3f5a654 | ||
|
|
f5538218bd | ||
|
|
0e3bdd177c | ||
|
|
12520cc09d | ||
|
|
cb67892124 | ||
|
|
45c09c9a26 | ||
|
|
20951ea2dd | ||
|
|
530f2368da | ||
|
|
e685a99628 | ||
|
|
bfc5acc3ee | ||
|
|
551e3d965e | ||
|
|
7c479b5595 | ||
|
|
b135f9717f | ||
|
|
08ae37cae0 | ||
|
|
315a7bbe62 | ||
|
|
e173b18ddc | ||
|
|
dcc25df679 | ||
|
|
c561dec14c | ||
|
|
43e8f2e701 | ||
|
|
dd9952c453 | ||
|
|
19517dd634 | ||
|
|
a5b006aae7 | ||
|
|
90bd07cdcc | ||
|
|
92576e9239 | ||
|
|
c58e6874c2 | ||
|
|
cfebf00cf1 | ||
|
|
19be0990da | ||
|
|
3f27e4b0d4 | ||
|
|
4710fb6686 | ||
|
|
28324c0178 | ||
|
|
f270ade8d7 | ||
|
|
3b3e665a9f | ||
|
|
bfa85e2d34 | ||
|
|
fcf270a521 | ||
|
|
eba113c73c | ||
|
|
41f63156ea | ||
|
|
f54fe397c3 | ||
|
|
6f157289d3 | ||
|
|
65792d020c | ||
|
|
926882dce6 | ||
|
|
f834f469fc | ||
|
|
06d42c36f0 | ||
|
|
17d513a9de | ||
|
|
8cc00c1f66 | ||
|
|
cb433d9392 | ||
|
|
86ca1efd11 | ||
|
|
263f978c54 | ||
|
|
c8af7eda5d | ||
|
|
3724811802 | ||
|
|
10ff48267f | ||
|
|
cd0913aec0 | ||
|
|
f8d4c2ef20 | ||
|
|
f16b5e816e | ||
|
|
9a9968760a | ||
|
|
b1f36dfbf1 | ||
|
|
bc0e09f222 | ||
|
|
0dab71e72b | ||
|
|
10f23c19ab | ||
|
|
bba57ea302 | ||
|
|
f052117989 | ||
|
|
df4ec53647 | ||
|
|
a7eaf6114a | ||
|
|
b25bf0e16c | ||
|
|
d13447e6d0 | ||
|
|
6a1e84da0c | ||
|
|
51aeb7d46e | ||
|
|
2dbd025768 | ||
|
|
d52d80d529 | ||
|
|
2000bc585b | ||
|
|
8301a1e515 | ||
|
|
bee65eb36d | ||
|
|
78199583b0 | ||
|
|
28d5678349 | ||
|
|
e97c468f6e | ||
|
|
5d18554542 | ||
|
|
3ff0a9e09c | ||
|
|
6a753682b7 | ||
|
|
ce491e62c3 | ||
|
|
e4b847b731 | ||
|
|
a12b285a35 | ||
|
|
7f0ada8016 | ||
|
|
bac5ab4d79 | ||
|
|
b362406819 | ||
|
|
9e2edbb987 | ||
|
|
7809d00787 | ||
|
|
cba69444a8 | ||
|
|
5e02816c09 | ||
|
|
20b085aeae | ||
|
|
0f5e683a4f | ||
|
|
e134ca7244 | ||
|
|
6818574605 | ||
|
|
6eea03f81e | ||
|
|
1242834b7f | ||
|
|
1844513f08 | ||
|
|
b0be7a14d2 | ||
|
|
7e17c68dba | ||
|
|
6259f15ffa | ||
|
|
f65d027a0d | ||
|
|
e9e2ca50ee | ||
|
|
a64ef8517e | ||
|
|
c9bda60554 | ||
|
|
c3478520c0 | ||
|
|
8346ffe915 | ||
|
|
f49b046601 | ||
|
|
263c03291e | ||
|
|
29244c247e | ||
|
|
320de8637f | ||
|
|
33bc6bf84b | ||
|
|
0cd2c42b68 | ||
|
|
1716acf9e0 | ||
|
|
45477119d4 | ||
|
|
716fbeae0c | ||
|
|
103891e0c0 | ||
|
|
638b5b51e0 | ||
|
|
90fea722aa | ||
|
|
90ce35327f | ||
|
|
60e3b9446a | ||
|
|
16a726223c | ||
|
|
dfe45f39bb | ||
|
|
413be4a6d0 | ||
|
|
6a35f98f89 | ||
|
|
ad295d97c8 | ||
|
|
cf8171c9cd | ||
|
|
c616a4e9a6 | ||
|
|
04d641a5ad | ||
|
|
ec68570a38 | ||
|
|
407b44382c | ||
|
|
71a2bcc7f0 | ||
|
|
a2dd09725c | ||
|
|
f757e00f03 | ||
|
|
b7652bb321 | ||
|
|
e6018d32ec | ||
|
|
cb7e272bbe | ||
|
|
a4d9d8e0d3 | ||
|
|
c844c8b188 | ||
|
|
320263eefa | ||
|
|
274875c6c4 | ||
|
|
1ea35324c1 | ||
|
|
3e20ad3cdd | ||
|
|
711e6b3d17 | ||
|
|
0438bbb414 | ||
|
|
70ee362cc8 | ||
|
|
0479f1a433 | ||
|
|
7e01cb8227 | ||
|
|
ae0eb3b918 | ||
|
|
097d2709e2 | ||
|
|
f1e56272ef | ||
|
|
db4cfbf605 | ||
|
|
da7d31fa00 | ||
|
|
62bc74d3c6 | ||
|
|
4467689ec3 | ||
|
|
69a874d90d | ||
|
|
b259a00c94 | ||
|
|
a0088ead9e | ||
|
|
228fd80abd | ||
|
|
8b3a1a646a | ||
|
|
c4954b94b8 | ||
|
|
2b56ebd620 | ||
|
|
a78d95ddad | ||
|
|
938362154a | ||
|
|
8bff2b7000 | ||
|
|
c56f228646 | ||
|
|
98f0313e3e | ||
|
|
bde2e891ef | ||
|
|
7acdaede0d | ||
|
|
45d1b4bee3 | ||
|
|
4d0a170f01 | ||
|
|
5e37e5a37d | ||
|
|
a60da3d592 | ||
|
|
9a88fab84e | ||
|
|
4981d6aad4 | ||
|
|
7193ac6833 | ||
|
|
3d1a32764d | ||
|
|
2b8df3ed76 | ||
|
|
e94b004a5a | ||
|
|
6cc6f26fa1 | ||
|
|
120cdd53c3 | ||
|
|
435aac4a9c | ||
|
|
f234cf285d | ||
|
|
54953b69c6 | ||
|
|
60878b7a65 | ||
|
|
dada88d8a2 | ||
|
|
7167705409 | ||
|
|
4217abca6e | ||
|
|
49a97f2285 | ||
|
|
4f2d7b8cd0 | ||
|
|
afbda7bfb2 | ||
|
|
c568756d16 | ||
|
|
5794f76b0a | ||
|
|
74a768c0fb | ||
|
|
4136060825 | ||
|
|
e249a953cd | ||
|
|
eddc2e6356 | ||
|
|
1604474d6e | ||
|
|
bbaf71481c | ||
|
|
952117818c | ||
|
|
a31432f1bf | ||
|
|
b0afe25730 | ||
|
|
024e0e9bae | ||
|
|
dbabc3a5a8 | ||
|
|
a30aec8254 | ||
|
|
7440218974 | ||
|
|
b3c771a87f | ||
|
|
8f8451cdff | ||
|
|
6d7fe83469 | ||
|
|
05a5280162 | ||
|
|
8dd55eb949 | ||
|
|
5838cc218f | ||
|
|
2e52c957e0 | ||
|
|
9486c58d78 | ||
|
|
6e7c1e0d41 | ||
|
|
6a0a60a644 | ||
|
|
94f9c2c3cb | ||
|
|
37e7ed8d14 | ||
|
|
4227c80ec7 | ||
|
|
6ec6ef698b | ||
|
|
0543dd015e | ||
|
|
b88f895acf | ||
|
|
fc517700cc |
No files matched your search
@@ -16,5 +16,4 @@ app/tmp/main.go
|
|||||||
.project
|
.project
|
||||||
public/config.codekit
|
public/config.codekit
|
||||||
files
|
files
|
||||||
/gulpfile.js
|
|
||||||
/node_modules
|
/node_modules
|
||||||
+37
@@ -0,0 +1,37 @@
|
|||||||
|
language: go
|
||||||
|
go: 1.3
|
||||||
|
|
||||||
|
services:
|
||||||
|
- mongodb # 2.4.12
|
||||||
|
|
||||||
|
install:
|
||||||
|
- export PATH=$PATH:$HOME/gopath/bin
|
||||||
|
- go get -v github.com/leanote/leanote/app
|
||||||
|
- go get -u github.com/revel/cmd/revel
|
||||||
|
- ls $GOPATH/src/github.com/revel/
|
||||||
|
# - go get github.com/revel/moudle/revel
|
||||||
|
# - go install github.com/revel/cmd/revel
|
||||||
|
- pwd
|
||||||
|
- ls
|
||||||
|
|
||||||
|
script:
|
||||||
|
- mongo --version
|
||||||
|
- 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
|
||||||
|
- go run app/cmd/main.go
|
||||||
|
# build
|
||||||
|
- go build -o leanote github.com/leanote/leanote/app/tmp
|
||||||
|
# run with port 9000
|
||||||
|
- ./leanote -importPath=github.com/leanote/leanote -runMode=dev -port=9000 &
|
||||||
|
- sleep 10s;
|
||||||
|
# test
|
||||||
|
- curl http://localhost:9000
|
||||||
|
- curl http://localhost:9000/blog
|
||||||
|
- curl http://localhost:9000/login
|
||||||
|
- curl http://localhost:9000/demo
|
||||||
|
|
||||||
|
# - revel build github.com/leanote/leanote tmp
|
||||||
|
# OK
|
||||||
+409
@@ -0,0 +1,409 @@
|
|||||||
|
var gulp = require('gulp');
|
||||||
|
var clean = require('gulp-clean');
|
||||||
|
var uglify = require('gulp-uglify');
|
||||||
|
var rename = require('gulp-rename');
|
||||||
|
var minifyHtml = require("gulp-minify-html");
|
||||||
|
var concat = require('gulp-concat');
|
||||||
|
var replace = require('gulp-replace');
|
||||||
|
var inject = require('gulp-inject');
|
||||||
|
var gulpSequence = require('gulp-sequence');
|
||||||
|
|
||||||
|
var fs = require('fs');
|
||||||
|
|
||||||
|
var leanoteBase = './';
|
||||||
|
var base = leanoteBase + '/public'; // public base
|
||||||
|
var noteDev = leanoteBase + '/app/views/note/note-dev.html';
|
||||||
|
var noteProBase = leanoteBase + '/app/views/note';
|
||||||
|
|
||||||
|
var messagesPath = leanoteBase + 'messages';
|
||||||
|
|
||||||
|
// 合并Js, 这些js都是不怎么修改, 且是依赖
|
||||||
|
// 840kb, 非常耗时!!
|
||||||
|
gulp.task('concatDepJs', function() {
|
||||||
|
var jss = [
|
||||||
|
'js/jquery-1.9.0.min.js',
|
||||||
|
'js/jquery.ztree.all-3.5-min.js',
|
||||||
|
// 'tinymce/tinymce.full.min.js', // 使用打成的包, 加载速度快
|
||||||
|
// 'libs/ace/ace.js',
|
||||||
|
'js/jQuery-slimScroll-1.3.0/jquery.slimscroll-min.js',
|
||||||
|
'js/contextmenu/jquery.contextmenu-min.js',
|
||||||
|
'js/bootstrap-min.js',
|
||||||
|
'js/object_id-min.js',
|
||||||
|
];
|
||||||
|
|
||||||
|
for(var i in jss) {
|
||||||
|
jss[i] = base + '/' + jss[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return gulp
|
||||||
|
.src(jss)
|
||||||
|
// .pipe(uglify()) // 压缩
|
||||||
|
.pipe(concat('dep.min.js'))
|
||||||
|
.pipe(gulp.dest(base + '/js'));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 合并app js 这些js会经常变化 90kb
|
||||||
|
gulp.task('concatAppJs', function() {
|
||||||
|
var jss = [
|
||||||
|
'js/common.js',
|
||||||
|
'js/app/note.js',
|
||||||
|
'js/app/page.js', // 写作模式下, page依赖note
|
||||||
|
'js/app/tag.js',
|
||||||
|
'js/app/notebook.js',
|
||||||
|
'js/app/share.js',
|
||||||
|
];
|
||||||
|
|
||||||
|
for(var i in jss) {
|
||||||
|
jss[i] = base + '/' + jss[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return gulp
|
||||||
|
.src(jss)
|
||||||
|
.pipe(uglify()) // 压缩
|
||||||
|
.pipe(concat('app.min.js'))
|
||||||
|
.pipe(gulp.dest(base + '/js'));
|
||||||
|
});
|
||||||
|
|
||||||
|
// plugins压缩
|
||||||
|
gulp.task('plugins', function() {
|
||||||
|
// gulp.src(base + '/js/plugins/libs/*.js')
|
||||||
|
// .pipe(uglify()) // 压缩
|
||||||
|
// // .pipe(concat('main.min.js'))
|
||||||
|
// .pipe(gulp.dest(base + '/js/plugins/libs-min'));
|
||||||
|
|
||||||
|
// 所有js合并成一个
|
||||||
|
var jss = [
|
||||||
|
'note_info',
|
||||||
|
'tips',
|
||||||
|
'history',
|
||||||
|
'attachment_upload',
|
||||||
|
'editor_drop_paste',
|
||||||
|
'main'
|
||||||
|
];
|
||||||
|
|
||||||
|
for(var i in jss) {
|
||||||
|
jss[i] = base + '/js/plugins/' + jss[i] + '.js';
|
||||||
|
}
|
||||||
|
jss.push(base + '/js/plugins/libs-min/fileupload.js');
|
||||||
|
|
||||||
|
return gulp.src(jss)
|
||||||
|
.pipe(uglify()) // 压缩
|
||||||
|
.pipe(concat('main.min.js'))
|
||||||
|
.pipe(gulp.dest(base + '/js/plugins'));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 合并requirejs和markdown为一个文件
|
||||||
|
gulp.task('concatMarkdownJs', function() {
|
||||||
|
var jss = [
|
||||||
|
'js/require.js',
|
||||||
|
'md/main.min.js',
|
||||||
|
];
|
||||||
|
|
||||||
|
for(var i in jss) {
|
||||||
|
jss[i] = base + '/' + jss[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return gulp
|
||||||
|
.src(jss)
|
||||||
|
.pipe(uglify()) // 压缩
|
||||||
|
.pipe(concat('markdown.min.js'))
|
||||||
|
.pipe(gulp.dest(base + '/js'));
|
||||||
|
});
|
||||||
|
|
||||||
|
// / 合并requirejs和markdown为一个文件
|
||||||
|
gulp.task('concatMarkdownJsV2', function() {
|
||||||
|
var jss = [
|
||||||
|
'js/require.js',
|
||||||
|
'md/main-v2.min.js',
|
||||||
|
];
|
||||||
|
|
||||||
|
for(var i in jss) {
|
||||||
|
jss[i] = base + '/' + jss[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return gulp
|
||||||
|
.src(jss)
|
||||||
|
.pipe(uglify()) // 压缩
|
||||||
|
.pipe(concat('markdown-v2.min.js'))
|
||||||
|
.pipe(gulp.dest(base + '/js'));
|
||||||
|
});
|
||||||
|
|
||||||
|
// note-dev.html -> note.html, 替换css, js
|
||||||
|
// TODO 加?t=2323232, 强制浏览器更新, 一般只需要把app.min.js上加
|
||||||
|
gulp.task('devToProHtml', function() {
|
||||||
|
return gulp
|
||||||
|
.src(noteDev)
|
||||||
|
.pipe(replace(/<!-- dev -->[.\s\S]+?<!-- \/dev -->/g, '')) // 把dev 去掉
|
||||||
|
.pipe(replace(/<!-- pro_dep_js -->/, '<script src="/js/dep.min.js"></script>')) // 替换
|
||||||
|
.pipe(replace(/<!-- pro_app_js -->/, '<script src="/js/app.min.js"></script>')) // 替换
|
||||||
|
// .pipe(replace(/<!-- pro_markdown_js -->/, '<script src="/js/markdown.min.js"></script>')) // 替换
|
||||||
|
.pipe(replace(/<!-- pro_markdown_js -->/, '<script src="/js/markdown-v2.min.js"></script>')) // 替换
|
||||||
|
.pipe(replace('/tinymce/tinymce.js', '/tinymce/tinymce.full.min.js')) // 替换
|
||||||
|
.pipe(replace(/<!-- pro_tinymce_init_js -->/, "var tinyMCEPreInit = {base: '/public/tinymce', suffix: '.min'};")) // 替换
|
||||||
|
.pipe(replace(/plugins\/main.js/, "plugins/main.min.js")) // 替换
|
||||||
|
// 连续两个空行换成一个空行
|
||||||
|
.pipe(replace(/\r\n\r\n/g, '\r\n'))
|
||||||
|
.pipe(replace(/\r\n\r\n/g, '\r\n'))
|
||||||
|
.pipe(replace(/\r\n\r\n/g, '\r\n'))
|
||||||
|
.pipe(replace(/\r\n\r\n/g, '\r\n'))
|
||||||
|
.pipe(replace(/\r\n\r\n/g, '\r\n'))
|
||||||
|
.pipe(replace(/\r\n\r\n/g, '\r\n'))
|
||||||
|
.pipe(replace('console.log(o);', ''))
|
||||||
|
.pipe(replace('console.trace(o);', ''))
|
||||||
|
// .pipe(minifyHtml()) // 不行, 压缩后golang报错
|
||||||
|
.pipe(rename('note.html'))
|
||||||
|
.pipe(gulp.dest(noteProBase));
|
||||||
|
});
|
||||||
|
|
||||||
|
// 只获取需要js i18n的key
|
||||||
|
var path = require('path');
|
||||||
|
gulp.task('i18n', function() {
|
||||||
|
var keys = {};
|
||||||
|
var reg = /getMsg\(["']+(.+?)["']+/g;
|
||||||
|
// {rule: "required", msg: "inputNewPassword"},
|
||||||
|
var reg2 = /msg: ?"?([0-9a-zA-Z]*)"?/g;
|
||||||
|
function getKey(data) {
|
||||||
|
while(ret = reg.exec(data)) {
|
||||||
|
keys[ret[1]] = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while(ret2 = reg2.exec(data)) {
|
||||||
|
keys[ret2[1]] = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 先获取需要的key
|
||||||
|
function ls(ff) {
|
||||||
|
var files = fs.readdirSync(ff);
|
||||||
|
for(fn in files) {
|
||||||
|
var fname = ff + path.sep + files[fn];
|
||||||
|
var stat = fs.lstatSync(fname);
|
||||||
|
if(stat.isDirectory() == true) {
|
||||||
|
ls(fname);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ((fname.indexOf('.html') > 0 || fname.indexOf('.js') > 0)) {
|
||||||
|
// console.log(fname);
|
||||||
|
// if (fname.indexOf('min.js') < 0) {
|
||||||
|
var data = fs.readFileSync(fname, "utf-8");
|
||||||
|
// 得到getMsg里的key
|
||||||
|
getKey(data);
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log('parsing used keys');
|
||||||
|
|
||||||
|
ls(base + '/admin');
|
||||||
|
ls(base + '/blog');
|
||||||
|
ls(base + '/md');
|
||||||
|
ls(base + '/js');
|
||||||
|
ls(base + '/album');
|
||||||
|
ls(base + '/libs');
|
||||||
|
ls(base + '/member');
|
||||||
|
ls(base + '/tinymce');
|
||||||
|
|
||||||
|
ls(leanoteBase + '/app/views');
|
||||||
|
|
||||||
|
console.log('parsed');
|
||||||
|
var langs = {}; // zh-cn: 1
|
||||||
|
|
||||||
|
// msg.zh
|
||||||
|
function getAllMsgs(fname) {
|
||||||
|
var msg = {};
|
||||||
|
|
||||||
|
var data = fs.readFileSync(fname, "utf-8");
|
||||||
|
var lines = data.split('\n');
|
||||||
|
for (var i = 0; i < lines.length; ++i) {
|
||||||
|
var line = lines[i];
|
||||||
|
// 忽略注释
|
||||||
|
if (line[0] == '#' || line[1] == '#') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
var lineArr = line.split('=');
|
||||||
|
if (lineArr.length >= 2) {
|
||||||
|
var key = lineArr[0];
|
||||||
|
lineArr.shift();
|
||||||
|
msg[key] = lineArr.join('=');
|
||||||
|
// msg[lineArr[0]] = lineArr[1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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
|
||||||
|
function genI18nJsFile(targetFilename, lang, fromFilenames, keys) {
|
||||||
|
var msgs = {};
|
||||||
|
fromFilenames.forEach(function (name) {
|
||||||
|
var tmpMsgs = getAllMsgs(leanoteBase + '/messages/' + lang + '/' + name + '.conf');
|
||||||
|
for (var i in tmpMsgs) {
|
||||||
|
msgs[i] = tmpMsgs[i];
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var toMsgs = {};
|
||||||
|
for (var i in msgs) {
|
||||||
|
// 只要需要的
|
||||||
|
if (i in keys) {
|
||||||
|
toMsgs[i] = msgs[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var str = 'var MSG=' + JSON.stringify(toMsgs) + ';';
|
||||||
|
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;' +
|
||||||
|
'}';
|
||||||
|
|
||||||
|
// 写入到文件中
|
||||||
|
var toFilename = targetFilename + '.' + lang + '.js';
|
||||||
|
fs.writeFile(base + '/js/i18n/' + toFilename, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
function genTinymceLang(lang) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
var langs = getAllLangs();
|
||||||
|
for (var lang in langs) {
|
||||||
|
genI18nJsFile('blog', lang, ['blog'], keys);
|
||||||
|
genI18nJsFile('msg', lang, ['msg', 'member', 'markdown', 'album'], keys);
|
||||||
|
|
||||||
|
genTinymceLang(lang);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
// 合并album需要的js
|
||||||
|
gulp.task('concatAlbumJs', function() {
|
||||||
|
/*
|
||||||
|
gulp.src(base + '/album/js/main.js')
|
||||||
|
.pipe(uglify()) // 压缩
|
||||||
|
.pipe(rename({suffix: '.min'}))
|
||||||
|
.pipe(gulp.dest(base + '/album/js/'));
|
||||||
|
*/
|
||||||
|
|
||||||
|
gulp.src(base + '/album/css/style.css')
|
||||||
|
.pipe(rename({suffix: '-min'}))
|
||||||
|
.pipe(minifycss())
|
||||||
|
.pipe(gulp.dest(base + '/album/css'));
|
||||||
|
|
||||||
|
var jss = [
|
||||||
|
'js/jquery-1.9.0.min.js',
|
||||||
|
'js/bootstrap-min.js',
|
||||||
|
'js/plugins/libs-min/fileupload.js',
|
||||||
|
'js/jquery.pagination.js',
|
||||||
|
'album/js/main.js',
|
||||||
|
];
|
||||||
|
|
||||||
|
for(var i in jss) {
|
||||||
|
jss[i] = base + '/' + jss[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
return gulp
|
||||||
|
.src(jss)
|
||||||
|
.pipe(uglify()) // 压缩
|
||||||
|
.pipe(concat('main.all.js'))
|
||||||
|
.pipe(gulp.dest(base + '/album/js'));
|
||||||
|
});
|
||||||
|
|
||||||
|
// tinymce
|
||||||
|
// please set the right path on your own env
|
||||||
|
var tinymceBase = '/Users/life/leanote/leanote-tools/tinymce_4.1.9_leanote_public';
|
||||||
|
gulp.task('tinymce', function() {
|
||||||
|
// 先清理
|
||||||
|
fs.unlink(tinymceBase + '/js/tinymce/tinymce.dev.js');
|
||||||
|
fs.unlink(tinymceBase + '/js/tinymce/tinymce.jquery.dev.js');
|
||||||
|
fs.unlink(tinymceBase + '/js/tinymce/tinymce.full.js');
|
||||||
|
fs.unlink(tinymceBase + '/js/tinymce/tinymce.full.min.js');
|
||||||
|
|
||||||
|
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';
|
||||||
|
// build
|
||||||
|
cp.exec('grunt minify', {cwd: tinymceBase}, function(err, stdout, stderr) {
|
||||||
|
console.log('stdout: ' + stdout);
|
||||||
|
console.log('stderr: ' + stderr);
|
||||||
|
|
||||||
|
// 将所有都合并成一起
|
||||||
|
cp.exec(bundleCmd, {cwd: tinymceBase}, function(err, stdout, stderr) {
|
||||||
|
console.log('stdout: ' + stdout);
|
||||||
|
console.log('stderr: ' + stderr);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// 合并css, 无用
|
||||||
|
// Deprecated
|
||||||
|
gulp.task('concatCss', function() {
|
||||||
|
return gulp
|
||||||
|
.src([markdownRaw + '/css/default.css', markdownRaw + '/css/md.css'])
|
||||||
|
.pipe(concat('all.css'))
|
||||||
|
.pipe(gulp.dest(markdownMin));
|
||||||
|
});
|
||||||
|
|
||||||
|
// mincss
|
||||||
|
var minifycss = require('gulp-minify-css');
|
||||||
|
gulp.task('minifycss', function() {
|
||||||
|
gulp.src(base + '/css/bootstrap.css')
|
||||||
|
.pipe(rename({suffix: '-min'}))
|
||||||
|
.pipe(minifycss())
|
||||||
|
.pipe(gulp.dest(base + '/css'));
|
||||||
|
|
||||||
|
gulp.src(base + '/css/font-awesome-4.2.0/css/font-awesome.css')
|
||||||
|
.pipe(rename({suffix: '-min'}))
|
||||||
|
.pipe(minifycss())
|
||||||
|
.pipe(gulp.dest(base + '/css/font-awesome-4.2.0/css'));
|
||||||
|
|
||||||
|
gulp.src(base + '/css/zTreeStyle/zTreeStyle.css')
|
||||||
|
.pipe(rename({suffix: '-min'}))
|
||||||
|
.pipe(minifycss())
|
||||||
|
.pipe(gulp.dest(base + '/css/zTreeStyle'));
|
||||||
|
|
||||||
|
gulp.src(base + '/md/themes/default.css')
|
||||||
|
.pipe(rename({suffix: '-min'}))
|
||||||
|
.pipe(minifycss())
|
||||||
|
.pipe(gulp.dest(base + '/md/themes'));
|
||||||
|
|
||||||
|
gulp.src(base + '/js/contextmenu/css/contextmenu.css')
|
||||||
|
.pipe(rename({suffix: '-min'}))
|
||||||
|
.pipe(minifycss())
|
||||||
|
.pipe(gulp.dest(base + '/js/contextmenu/css'));
|
||||||
|
|
||||||
|
// theme
|
||||||
|
// 用codekit
|
||||||
|
var as = ['default', 'simple', 'writting', /*'writting-overwrite', */ 'mobile'];
|
||||||
|
/*
|
||||||
|
for(var i = 0; i < as.length; ++i) {
|
||||||
|
gulp.src(base + '/css/theme/' + as[i] + '.css')
|
||||||
|
.pipe(minifycss())
|
||||||
|
.pipe(gulp.dest(base + '/css/theme'));
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
gulp.task('concat', ['concatDepJs', 'concatAppJs', /* 'concatMarkdownJs', */'concatMarkdownJsV2']);
|
||||||
|
gulp.task('html', ['devToProHtml']);
|
||||||
|
gulp.task('default', ['concat', 'plugins', 'minifycss', 'i18n', 'concatAlbumJs', 'html']);
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
leanote - you own cloud note!
|
LEANOTE - NOT JUST A NOTEPAD!
|
||||||
|
|
||||||
Copyright 2014 by the contributors
|
Copyright 2014-2015 by the contributors
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@@ -12,7 +12,7 @@ but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
leanote is licensed under the GPL v2.
|
Leanote is licensed under the GPL v2.
|
||||||
|
|
||||||
life(life@leanote.com, lifephp@gmail.com)
|
life(life@leanote.com, lifephp@gmail.com)
|
||||||
|
|
||||||
|
|||||||
@@ -1,48 +1,62 @@
|
|||||||
|
|
||||||
# Leanote
|
# Leanote
|
||||||
|
|
||||||
|
[](https://travis-ci.org/leanote/leanote)
|
||||||
|
[](https://gitter.im/leanote/leanote?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
||||||
|
|
||||||
## 1. Introduction
|
## 1. Introduction
|
||||||
|
|
||||||
Leanote, not just a notepad!
|
Leanote, Not Just A Notepad!
|
||||||

|

|
||||||
|
|
||||||
**Some Features**
|
**Some Features**
|
||||||
|
|
||||||
* Knowledge: Manage your knowledge in leanote. leanote contains the tinymce editor and a markdown editor, just enjoy yourself writing.
|
* Knowledge: Manage your knowledge in Leanote. Leanote contains the tinymce editor and a markdown editor, just enjoy yourself writing.
|
||||||
* 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.
|
* 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.
|
||||||
* Cooperation: Collaborate with friends to improve your skills.
|
* Cooperation: Collaborate with friends to improve your skills.
|
||||||
* Blog: Publish your knowledge and make leanote your blog.
|
* Blog: Publish your knowledge and make Leanote your blog.
|
||||||
|
|
||||||
## 2. Why we created leanote
|
**Other Features**
|
||||||
|
|
||||||
|
* Support Markdown
|
||||||
|
* Writting mode
|
||||||
|
* Export note to PDF
|
||||||
|
* Note batch operation
|
||||||
|
* Custom theme for blog
|
||||||
|
|
||||||
|
## 2. Why we created Leanote
|
||||||
To be honest, our inspiration comes from Evernote. We use Evernote to manage our knowledge everyday. But we find that:
|
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
|
* 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 like markdown, but Evernote does not support it.
|
* 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!
|
* 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!
|
||||||
* ......
|
* ......
|
||||||
|
|
||||||
## 3. How to install leanote
|
## 3. How to install Leanote
|
||||||
|
|
||||||
More information about how to install leanote please see:
|
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!
|
||||||
* [leanote binary distribution installation tutorial](https://github.com/leanote/leanote/wiki/leanote-binary-distribution-installation-tutorial)
|
|
||||||
* [leanote develop distribution installation tutorial](https://github.com/leanote/leanote/wiki/leanote-develop-distribution-installation-tutorial)
|
|
||||||
|
|
||||||
## 4. How to develop leanote
|
You can install Leanote on your server, and use Leanote App (Desktop, iOs, Android) to sync notes with your self-hosted server.
|
||||||
|
|
||||||
|
Welcome to sign up on https://leanote.com, Leanote team provide a stable and reliable service for you.
|
||||||
|
|
||||||
|
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 source installation tutorial](https://github.com/leanote/leanote/wiki/leanote-source-installation-tutorial)
|
||||||
|
|
||||||
|
## 4. How to develop Leanote
|
||||||
|
|
||||||
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 [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. Docs
|
## 5. Docs
|
||||||
* [leanote binary distribution installation tutorial](https://github.com/leanote/leanote/wiki/leanote-binary-distribution-installation-tutorial)
|
|
||||||
* [leanote develop distribution installation tutorial](https://github.com/leanote/leanote/wiki/leanote-develop-distribution-installation-tutorial)
|
|
||||||
* [leanote blog theme api](https://github.com/leanote/leanote/wiki/leanote-blog-theme-api_en)
|
|
||||||
|
|
||||||
More docs please see [wiki](https://github.com/leanote/leanote/wiki).
|
Please see [wiki](https://github.com/leanote/leanote/wiki).
|
||||||
|
|
||||||
## 6. Contributors
|
## 6. Contributors
|
||||||
Thank you to all the [contributors](https://github.com/leanote/leanote/graphs/contributors) on
|
Thank you to all the [contributors](https://github.com/leanote/leanote/graphs/contributors) on
|
||||||
this project. Your help is much appreciated.
|
this project. 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 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 some problems or has some good ideas, please submit [issues](https://github.com/leanote/leanote/issues).
|
||||||
@@ -53,18 +67,99 @@ You are always welcomed!
|
|||||||
Support us, [donate us](http://leanote.org/#donate). And thanks [donators](http://leanote.leanote.com/post/leanote-donation-list).
|
Support us, [donate us](http://leanote.org/#donate). And thanks [donators](http://leanote.leanote.com/post/leanote-donation-list).
|
||||||
|
|
||||||
## 9. Related projects
|
## 9. Related projects
|
||||||
|
|
||||||
* [Leanote Desktop App](https://github.com/leanote/desktop-app), [Download](http://app.leanote.com)
|
* [Leanote Desktop App](https://github.com/leanote/desktop-app), [Download](http://app.leanote.com)
|
||||||
* [Leanote IOS](https://github.com/leanote/leanote-ios), development phase
|
* [Leanote iOS](https://github.com/leanote/leanote-ios), [Download From App Store](https://itunes.apple.com/en/app/leanote/id1022302858?mt=8)
|
||||||
* [Leanote Android](https://github.com/Dminter/leanote-android-client), development phase
|
* [Leanote Android](https://github.com/leanote/leanote-android), development phase
|
||||||
|
|
||||||
And also, you are welcome to join us.
|
You are welcome to join us.
|
||||||
|
|
||||||
## 9. Discussion
|
## 9. Support & Join us
|
||||||
* [leanote bbs](http://bbs.leanote.com)
|
|
||||||
* [leanote google group](https://groups.google.com/forum/#!forum/leanote)
|
* Email: leanote@leanote.com
|
||||||
* QQ Group: 158716820
|
* [Leanote BBS](http://bbs.leanote.com)
|
||||||
|
* [Leanote Google Group](https://groups.google.com/forum/#!forum/leanote)
|
||||||
|
* QQ Group: 326073529, 256076853, 158716820
|
||||||
|
|
||||||
-----------------------------------------------------------------------
|
-----------------------------------------------------------------------
|
||||||
[中文](README_zh.md)
|
|
||||||
|
|
||||||
|
# Leanote
|
||||||
|
|
||||||
|
## 1. 介绍
|
||||||
|
|
||||||
|
Leanote, 不只是笔记!
|
||||||
|
|
||||||
|
**特性**
|
||||||
|
|
||||||
|
* 知识管理: 通过Leanote来管理知识, Leanote有易操作的界面, 包含两款编辑器富文本编辑器和Markdown编辑器. 在Leanote, 你可以尽情享受写作.
|
||||||
|
* 博客: Leanote也可以作为你的博客, 将知识公开成博客, 让Leanote把你的知识传播的更远!
|
||||||
|
* 分享: 你也可以通过分享知识给好友, 让好友拥有你的知识.
|
||||||
|
* 协作: 在分享的同时也可以与好友一起协作知识.
|
||||||
|
|
||||||
|
**一些其它特性**
|
||||||
|
|
||||||
|
* 支持Markdown编辑
|
||||||
|
* 写作模式
|
||||||
|
* 支持PDF导出
|
||||||
|
* 支持批量操作
|
||||||
|
* 博客自定义主题, 实现高度定制化
|
||||||
|
|
||||||
|
## 2. 为什么我们要创建Leanote?
|
||||||
|
说实话, 我们曾是evernote的忠实粉丝, 但是我们也发现evernote的不足:
|
||||||
|
* evernote的编辑器不能满足我们的需求, 不能贴代码(格式会乱掉, 作为程序员, 代码是我们的基本需求啊), 图片不能缩放.
|
||||||
|
* 我们是markdown的爱好者, 可是evernote竟然没有.
|
||||||
|
* 我们也想将知识公开, 所以我们有自己的博客, 如wordpress, 但为什么这两者不能合二为一呢?
|
||||||
|
* 还有...
|
||||||
|
|
||||||
|
## 3.安装Leanote
|
||||||
|
|
||||||
|
Leanote云笔记产品包括: Leanote Web & Server(即本仓库), 桌面客户端, ios, android. 4端全部开源! 你可以下载它安装在自己的服务器上, Leanote的客户端可以连接自建的服务.
|
||||||
|
|
||||||
|
欢迎在 https://leanote.com 上注册, 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源码详细安装教程](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/leanote/leanote-android), 开发阶段
|
||||||
|
|
||||||
|
欢迎加入我们!
|
||||||
|
|
||||||
|
## 联系&加入我们
|
||||||
|
* Email: leanote@leanote.com
|
||||||
|
* [Leanote 社区](http://bbs.leanote.com)
|
||||||
|
* QQ群: 326073529, 256076853, 158716820
|
||||||
|
* [Leanote Google Group](https://groups.google.com/forum/#!forum/leanote)
|
||||||
|
|
||||||
+9
-6
@@ -1,5 +1,7 @@
|
|||||||
# Leanote产品
|
# Leanote
|
||||||
|
|
||||||
|
[](https://gitter.im/leanote/leanote?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
|
||||||
|
[](https://travis-ci.org/leanote/leanote)
|
||||||
## 1. 介绍
|
## 1. 介绍
|
||||||
|
|
||||||
Leanote, 不只是笔记!
|
Leanote, 不只是笔记!
|
||||||
@@ -56,15 +58,16 @@ Leanote还有很多问题, 如果你喜欢它, 欢迎加入我们一起完善lea
|
|||||||
|
|
||||||
## 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)
|
||||||
* [Leanote IOS](https://github.com/leanote/leanote-ios), 开发阶段
|
* [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), 开发阶段
|
* [Leanote Android](https://github.com/Dminter/leanote-android-client), 开发阶段
|
||||||
|
|
||||||
同样, 欢迎加入我们!
|
欢迎加入我们!
|
||||||
|
|
||||||
## 讨论
|
## 联系&加入我们
|
||||||
|
* Email: leanote@leanote.com
|
||||||
* [leanote 社区](http://bbs.leanote.com)
|
* [leanote 社区](http://bbs.leanote.com)
|
||||||
* QQ群: 158716820
|
* QQ群: 158716820, 256076853
|
||||||
* [leanote google group](https://groups.google.com/forum/#!forum/leanote)
|
* [Leanote Google Group](https://groups.google.com/forum/#!forum/leanote)
|
||||||
|
|
||||||
----------------------------------------------------------------
|
----------------------------------------------------------------
|
||||||
[English](README.md)
|
[English](README.md)
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/revel/cmd/harness"
|
||||||
|
"github.com/revel/revel"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
// go run main.go
|
||||||
|
// 生成routes.go, main.go
|
||||||
|
revel.Init("", "github.com/leanote/leanote", "")
|
||||||
|
_, err := harness.Build() // ok, err
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
fmt.Println("Ok")
|
||||||
|
// panicOnError(reverr, "Failed to build")
|
||||||
|
}
|
||||||
@@ -2,11 +2,11 @@ package controllers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
// "io/ioutil"
|
// "io/ioutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Album controller
|
// Album controller
|
||||||
@@ -14,12 +14,17 @@ type Album struct {
|
|||||||
BaseController
|
BaseController
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 图片管理, iframe
|
||||||
|
func (c Album) Index() revel.Result {
|
||||||
|
c.SetLocale()
|
||||||
|
return c.RenderTemplate("album/index.html")
|
||||||
|
}
|
||||||
|
|
||||||
// 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})
|
||||||
@@ -34,7 +39,7 @@ func (c Album) AddAlbum(name string) revel.Result {
|
|||||||
UserId: c.GetObjectUserId()}
|
UserId: c.GetObjectUserId()}
|
||||||
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)
|
||||||
|
|||||||
@@ -2,18 +2,18 @@ package controllers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"archive/tar"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
"compress/gzip"
|
||||||
|
"fmt"
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
|
. "github.com/leanote/leanote/app/lea"
|
||||||
|
"gopkg.in/mgo.v2/bson"
|
||||||
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
"io"
|
|
||||||
"fmt"
|
|
||||||
"archive/tar"
|
|
||||||
"compress/gzip"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// 附件
|
// 附件
|
||||||
@@ -57,17 +57,19 @@ func (c Attach) uploadAttach(noteId string) (re info.Re) {
|
|||||||
return re
|
return re
|
||||||
}
|
}
|
||||||
// > 5M?
|
// > 5M?
|
||||||
maxFileSize := configService.GetUploadSize("uploadAttachSize");
|
maxFileSize := configService.GetUploadSize("uploadAttachSize")
|
||||||
if maxFileSize <= 0 {
|
if maxFileSize <= 0 {
|
||||||
maxFileSize = 1000
|
maxFileSize = 1000
|
||||||
}
|
}
|
||||||
if(float64(len(data)) > maxFileSize * float64(1024*1024)) {
|
if float64(len(data)) > maxFileSize*float64(1024*1024) {
|
||||||
resultMsg = fmt.Sprintf("The file's size is bigger than %vM", maxFileSize)
|
resultMsg = fmt.Sprintf("The file's size is bigger than %vM", maxFileSize)
|
||||||
return re
|
return re
|
||||||
}
|
}
|
||||||
|
|
||||||
// 生成上传路径
|
// 生成上传路径
|
||||||
filePath := "files/" + c.GetUserId() + "/attachs"
|
// filePath := "files/" + c.GetUserId() + "/attachs"
|
||||||
|
newGuid := NewGuid()
|
||||||
|
filePath := "files/" + GetRandomFilePath(c.GetUserId(), newGuid) + "/attachs"
|
||||||
dir := revel.BasePath + "/" + filePath
|
dir := revel.BasePath + "/" + filePath
|
||||||
err = os.MkdirAll(dir, 0755)
|
err = os.MkdirAll(dir, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -76,8 +78,8 @@ func (c Attach) uploadAttach(noteId string) (re info.Re) {
|
|||||||
// 生成新的文件名
|
// 生成新的文件名
|
||||||
filename := handel.Filename
|
filename := handel.Filename
|
||||||
_, ext := SplitFilename(filename) // .doc
|
_, ext := SplitFilename(filename) // .doc
|
||||||
filename = NewGuid() + ext
|
filename = newGuid + ext
|
||||||
toPath := dir + "/" + filename;
|
toPath := dir + "/" + filename
|
||||||
err = ioutil.WriteFile(toPath, data, 0777)
|
err = ioutil.WriteFile(toPath, data, 0777)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return re
|
return re
|
||||||
@@ -97,7 +99,7 @@ func (c Attach) uploadAttach(noteId string) (re info.Re) {
|
|||||||
Type: fileType,
|
Type: fileType,
|
||||||
Size: filesize}
|
Size: filesize}
|
||||||
|
|
||||||
id := bson.NewObjectId();
|
id := bson.NewObjectId()
|
||||||
fileInfo.AttachId = id
|
fileInfo.AttachId = id
|
||||||
fileId = id.Hex()
|
fileId = id.Hex()
|
||||||
Ok, resultMsg = attachService.AddAttach(fileInfo, false)
|
Ok, resultMsg = attachService.AddAttach(fileInfo, false)
|
||||||
@@ -105,7 +107,7 @@ func (c Attach) uploadAttach(noteId string) (re info.Re) {
|
|||||||
resultMsg = c.Message(resultMsg)
|
resultMsg = c.Message(resultMsg)
|
||||||
}
|
}
|
||||||
|
|
||||||
fileInfo.Path = ""; // 不要返回
|
fileInfo.Path = "" // 不要返回
|
||||||
if Ok {
|
if Ok {
|
||||||
resultMsg = "success"
|
resultMsg = "success"
|
||||||
}
|
}
|
||||||
@@ -130,7 +132,7 @@ func (c Attach) GetAttachs(noteId string) revel.Result {
|
|||||||
// 下载附件
|
// 下载附件
|
||||||
// 权限判断
|
// 权限判断
|
||||||
func (c Attach) Download(attachId string) revel.Result {
|
func (c Attach) Download(attachId string) revel.Result {
|
||||||
attach := attachService.GetAttach(attachId, c.GetUserId()); // 得到路径
|
attach := attachService.GetAttach(attachId, c.GetUserId()) // 得到路径
|
||||||
path := attach.Path
|
path := attach.Path
|
||||||
if path == "" {
|
if path == "" {
|
||||||
return c.RenderText("")
|
return c.RenderText("")
|
||||||
@@ -165,10 +167,16 @@ func (c Attach) DownloadAll(noteId string) revel.Result {
|
|||||||
filename = "all.tar.gz"
|
filename = "all.tar.gz"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dir := revel.BasePath + "/files/attach_all"
|
||||||
|
|
||||||
|
if !MkdirAll(dir) {
|
||||||
|
return c.RenderText("error")
|
||||||
|
}
|
||||||
|
|
||||||
// file write
|
// file write
|
||||||
fw, err := os.Create(revel.BasePath + "/files/" + filename)
|
fw, err := os.Create(dir + "/" + filename)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return c.RenderText("")
|
return c.RenderText("error")
|
||||||
}
|
}
|
||||||
// defer fw.Close() // 不需要关闭, 还要读取给用户下载
|
// defer fw.Close() // 不需要关闭, 还要读取给用户下载
|
||||||
|
|
||||||
@@ -210,10 +218,10 @@ func (c Attach) DownloadAll(noteId string) revel.Result {
|
|||||||
}
|
}
|
||||||
} // for
|
} // for
|
||||||
|
|
||||||
// tw.Close()
|
// tw.Close()
|
||||||
// gw.Close()
|
// gw.Close()
|
||||||
// fw.Close()
|
// fw.Close()
|
||||||
// file, _ := os.Open(dir + "/" + filename)
|
// file, _ := os.Open(dir + "/" + filename)
|
||||||
// fw.Seek(0, 0)
|
// fw.Seek(0, 0)
|
||||||
return c.RenderBinary(fw, filename, revel.Attachment, time.Now()) // revel.Attachment
|
return c.RenderBinary(fw, filename, revel.Attachment, time.Now()) // revel.Attachment
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,11 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
. "github.com/leanote/leanote/app/lea"
|
||||||
// "strconv"
|
"github.com/revel/revel"
|
||||||
|
"strings"
|
||||||
|
// "strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 用户登录/注销/找回密码
|
// 用户登录/注销/找回密码
|
||||||
@@ -41,17 +42,17 @@ func (c Auth) doLogin(email, pwd string) revel.Result {
|
|||||||
sessionId := c.Session.Id()
|
sessionId := c.Session.Id()
|
||||||
var msg = ""
|
var msg = ""
|
||||||
|
|
||||||
userInfo := authService.Login(email, pwd)
|
userInfo, err := authService.Login(email, pwd)
|
||||||
if userInfo.Email != "" {
|
if err != nil {
|
||||||
|
// 登录错误, 则错误次数++
|
||||||
|
msg = "wrongUsernameOrPassword"
|
||||||
|
} 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})
|
||||||
} else {
|
|
||||||
// 登录错误, 则错误次数++
|
|
||||||
msg = "wrongUsernameOrPassword"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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()
|
||||||
@@ -61,20 +62,21 @@ func (c Auth) DoLogin(email, pwd string, captcha string) revel.Result {
|
|||||||
if sessionService.LoginTimesIsOver(sessionId) && sessionService.GetCaptcha(sessionId) != captcha {
|
if sessionService.LoginTimesIsOver(sessionId) && sessionService.GetCaptcha(sessionId) != captcha {
|
||||||
msg = "captchaError"
|
msg = "captchaError"
|
||||||
} else {
|
} else {
|
||||||
userInfo := authService.Login(email, pwd)
|
userInfo, err := authService.Login(email, pwd)
|
||||||
if userInfo.Email != "" {
|
if err != nil {
|
||||||
c.SetSession(userInfo)
|
|
||||||
sessionService.ClearLoginTimes(sessionId)
|
|
||||||
return c.RenderJson(info.Re{Ok: true})
|
|
||||||
} else {
|
|
||||||
// 登录错误, 则错误次数++
|
// 登录错误, 则错误次数++
|
||||||
msg = "wrongUsernameOrPassword"
|
msg = "wrongUsernameOrPassword"
|
||||||
sessionService.IncrLoginTimes(sessionId)
|
sessionService.IncrLoginTimes(sessionId)
|
||||||
|
} else {
|
||||||
|
c.SetSession(userInfo)
|
||||||
|
sessionService.ClearLoginTimes(sessionId)
|
||||||
|
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()
|
||||||
@@ -85,10 +87,13 @@ func (c Auth) Logout() revel.Result {
|
|||||||
|
|
||||||
// 体验一下
|
// 体验一下
|
||||||
func (c Auth) Demo() revel.Result {
|
func (c Auth) Demo() revel.Result {
|
||||||
email := configService.GetGlobalStringConfig("demoPassword")
|
email := configService.GetGlobalStringConfig("demoUsername")
|
||||||
pwd := configService.GetGlobalStringConfig("demoPassword");
|
pwd := configService.GetGlobalStringConfig("demoPassword")
|
||||||
userInfo := authService.Login(email, pwd)
|
|
||||||
if userInfo.Email != "" {
|
userInfo, err := authService.Login(email, pwd)
|
||||||
|
if err != nil {
|
||||||
|
return c.RenderJson(info.Re{Ok: false})
|
||||||
|
} else {
|
||||||
c.SetSession(userInfo)
|
c.SetSession(userInfo)
|
||||||
return c.Redirect("/note")
|
return c.Redirect("/note")
|
||||||
}
|
}
|
||||||
@@ -114,15 +119,17 @@ func (c Auth) DoRegister(email, pwd, iu string) revel.Result {
|
|||||||
return c.Redirect("/index")
|
return c.Redirect("/index")
|
||||||
}
|
}
|
||||||
|
|
||||||
re := info.NewRe();
|
re := info.NewRe()
|
||||||
|
|
||||||
if re.Ok, re.Msg = Vd("email", email); !re.Ok {
|
if re.Ok, re.Msg = Vd("email", email); !re.Ok {
|
||||||
return c.RenderRe(re);
|
return c.RenderRe(re)
|
||||||
}
|
}
|
||||||
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
||||||
return c.RenderRe(re);
|
return c.RenderRe(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
email = strings.ToLower(email)
|
||||||
|
|
||||||
// 注册
|
// 注册
|
||||||
re.Ok, re.Msg = authService.Register(email, pwd, iu)
|
re.Ok, re.Msg = authService.Register(email, pwd, iu)
|
||||||
|
|
||||||
@@ -137,6 +144,7 @@ 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.RenderArgs["title"] = c.Message("findPassword")
|
c.RenderArgs["title"] = c.Message("findPassword")
|
||||||
c.RenderArgs["subTitle"] = c.Message("findPassword")
|
c.RenderArgs["subTitle"] = c.Message("findPassword")
|
||||||
return c.RenderTemplate("home/find_password.html")
|
return c.RenderTemplate("home/find_password.html")
|
||||||
@@ -147,14 +155,16 @@ func (c Auth) DoFindPassword(email string) revel.Result {
|
|||||||
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.RenderArgs["title"] = c.Message("findPassword")
|
c.RenderArgs["title"] = c.Message("findPassword")
|
||||||
c.RenderArgs["subTitle"] = c.Message("findPassword")
|
c.RenderArgs["subTitle"] = c.Message("findPassword")
|
||||||
if token == "" {
|
if token == "" {
|
||||||
return c.RenderTemplate("find_password2_timeout.html")
|
return c.RenderTemplate("find_password2_timeout.html")
|
||||||
}
|
}
|
||||||
ok, _, findPwd := tokenService.VerifyToken(token, info.TokenPwd);
|
ok, _, findPwd := tokenService.VerifyToken(token, info.TokenPwd)
|
||||||
if !ok {
|
if !ok {
|
||||||
return c.RenderTemplate("home/find_password2_timeout.html")
|
return c.RenderTemplate("home/find_password2_timeout.html")
|
||||||
}
|
}
|
||||||
@@ -165,12 +175,13 @@ func (c Auth) FindPassword2(token string) revel.Result {
|
|||||||
|
|
||||||
return c.RenderTemplate("home/find_password2.html")
|
return c.RenderTemplate("home/find_password2.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 找回密码修改密码
|
// 找回密码修改密码
|
||||||
func (c Auth) FindPasswordUpdate(token, pwd string) revel.Result {
|
func (c Auth) FindPasswordUpdate(token, pwd string) revel.Result {
|
||||||
re := info.NewRe();
|
re := info.NewRe()
|
||||||
|
|
||||||
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
||||||
return c.RenderRe(re);
|
return c.RenderRe(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改之
|
// 修改之
|
||||||
|
|||||||
@@ -1,17 +1,18 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
|
||||||
"gopkg.in/mgo.v2/bson"
|
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
"github.com/leanote/leanote/app/lea/i18n"
|
||||||
// "io/ioutil"
|
"github.com/revel/revel"
|
||||||
// "fmt"
|
"gopkg.in/mgo.v2/bson"
|
||||||
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
|
// "io/ioutil"
|
||||||
|
// "fmt"
|
||||||
|
"bytes"
|
||||||
"math"
|
"math"
|
||||||
"strconv"
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"bytes"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// 公用Controller, 其它Controller继承它
|
// 公用Controller, 其它Controller继承它
|
||||||
@@ -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
|
||||||
@@ -56,7 +62,7 @@ func (c BaseController) GetUsername() string {
|
|||||||
// 得到用户信息
|
// 得到用户信息
|
||||||
func (c BaseController) GetUserInfo() info.User {
|
func (c BaseController) GetUserInfo() info.User {
|
||||||
if userId, ok := c.Session["UserId"]; ok && userId != "" {
|
if userId, ok := c.Session["UserId"]; ok && userId != "" {
|
||||||
return userService.GetUserInfo(userId);
|
return userService.GetUserInfo(userId)
|
||||||
/*
|
/*
|
||||||
notebookWidth, _ := strconv.Atoi(c.Session["NotebookWidth"])
|
notebookWidth, _ := strconv.Atoi(c.Session["NotebookWidth"])
|
||||||
noteListWidth, _ := strconv.Atoi(c.Session["NoteListWidth"])
|
noteListWidth, _ := strconv.Atoi(c.Session["NoteListWidth"])
|
||||||
@@ -84,6 +90,13 @@ func (c BaseController) GetUserInfo() info.User {
|
|||||||
return info.User{}
|
return info.User{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c BaseController) GetUserAndBlogUrl() info.UserAndBlogUrl {
|
||||||
|
if userId, ok := c.Session["UserId"]; ok && userId != "" {
|
||||||
|
return userService.GetUserAndBlogUrl(userId)
|
||||||
|
}
|
||||||
|
return info.UserAndBlogUrl{}
|
||||||
|
}
|
||||||
|
|
||||||
// 这里的session都是cookie中的, 与数据库session无关
|
// 这里的session都是cookie中的, 与数据库session无关
|
||||||
func (c BaseController) GetSession(key string) string {
|
func (c BaseController) GetSession(key string) string {
|
||||||
v, ok := c.Session[key]
|
v, ok := c.Session[key]
|
||||||
@@ -132,7 +145,7 @@ func (c BaseController) UpdateSession(key, value string) {
|
|||||||
|
|
||||||
// 返回json
|
// 返回json
|
||||||
func (c BaseController) Json(i interface{}) string {
|
func (c BaseController) Json(i interface{}) string {
|
||||||
// b, _ := json.MarshalIndent(i, "", " ")
|
// b, _ := json.MarshalIndent(i, "", " ")
|
||||||
b, _ := json.Marshal(i)
|
b, _ := json.Marshal(i)
|
||||||
return string(b)
|
return string(b)
|
||||||
}
|
}
|
||||||
@@ -150,9 +163,9 @@ func (c BaseController) GetPage() int {
|
|||||||
// 判断是否含有某参数
|
// 判断是否含有某参数
|
||||||
func (c BaseController) Has(key string) bool {
|
func (c BaseController) Has(key string) bool {
|
||||||
if _, ok := c.Params.Values[key]; ok {
|
if _, ok := c.Params.Values[key]; ok {
|
||||||
return true;
|
return true
|
||||||
}
|
}
|
||||||
return false;
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -162,28 +175,32 @@ func (c Blog) GetPage(page, count int, list interface{}) info.Page {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
func (c BaseController) GetTotalPage(page, count int) int {
|
func (c BaseController) GetTotalPage(page, count int) int {
|
||||||
return int(math.Ceil(float64(count)/float64(page)))
|
return int(math.Ceil(float64(count) / float64(page)))
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------
|
//-------------
|
||||||
func (c BaseController) E404() revel.Result {
|
func (c BaseController) E404() revel.Result {
|
||||||
c.RenderArgs["title"] = "404";
|
c.RenderArgs["title"] = "404"
|
||||||
return c.NotFound("", nil)
|
return c.NotFound("", nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置本地
|
// 设置本地
|
||||||
func (c BaseController) SetLocale() string {
|
func (c BaseController) SetLocale() string {
|
||||||
locale := string(c.Request.Locale) // zh-CN
|
locale := string(c.Request.Locale) // zh-CN
|
||||||
|
// lang := locale
|
||||||
|
// if strings.Contains(locale, "-") {
|
||||||
|
// pos := strings.Index(locale, "-")
|
||||||
|
// lang = locale[0:pos]
|
||||||
|
// }
|
||||||
|
// if lang != "zh" && lang != "en" {
|
||||||
|
// lang = "en"
|
||||||
|
// }
|
||||||
lang := locale
|
lang := locale
|
||||||
if strings.Contains(locale, "-") {
|
if !i18n.HasLang(locale) {
|
||||||
pos := strings.Index(locale, "-")
|
lang = i18n.GetDefaultLang()
|
||||||
lang = locale[0:pos]
|
|
||||||
}
|
}
|
||||||
if lang != "zh" && lang != "en" {
|
c.RenderArgs["locale"] = lang
|
||||||
lang = "en";
|
c.RenderArgs["siteUrl"] = configService.GetSiteUrl()
|
||||||
}
|
|
||||||
c.RenderArgs["locale"] = lang;
|
|
||||||
c.RenderArgs["siteUrl"] = configService.GetSiteUrl();
|
|
||||||
|
|
||||||
c.RenderArgs["blogUrl"] = configService.GetBlogUrl()
|
c.RenderArgs["blogUrl"] = configService.GetBlogUrl()
|
||||||
c.RenderArgs["leaUrl"] = configService.GetLeaUrl()
|
c.RenderArgs["leaUrl"] = configService.GetLeaUrl()
|
||||||
@@ -196,7 +213,7 @@ func (c BaseController) SetLocale() string {
|
|||||||
func (c BaseController) SetUserInfo() info.User {
|
func (c BaseController) SetUserInfo() info.User {
|
||||||
userInfo := c.GetUserInfo()
|
userInfo := c.GetUserInfo()
|
||||||
c.RenderArgs["userInfo"] = userInfo
|
c.RenderArgs["userInfo"] = userInfo
|
||||||
if(userInfo.Username == configService.GetAdminUsername()) {
|
if userInfo.Username == configService.GetAdminUsername() {
|
||||||
c.RenderArgs["isAdmin"] = true
|
c.RenderArgs["isAdmin"] = true
|
||||||
}
|
}
|
||||||
return userInfo
|
return userInfo
|
||||||
@@ -218,7 +235,7 @@ func (c BaseController) RenderTemplateStr(templatePath string) string {
|
|||||||
|
|
||||||
var buffer bytes.Buffer
|
var buffer bytes.Buffer
|
||||||
tpl.Template.Render(&buffer, c.RenderArgs)
|
tpl.Template.Render(&buffer, c.RenderArgs)
|
||||||
return buffer.String();
|
return buffer.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
// json, result
|
// json, result
|
||||||
@@ -227,7 +244,7 @@ func (c BaseController) RenderTemplateStr(templatePath string) string {
|
|||||||
func (c BaseController) RenderRe(re info.Re) revel.Result {
|
func (c BaseController) RenderRe(re info.Re) revel.Result {
|
||||||
oldMsg := re.Msg
|
oldMsg := re.Msg
|
||||||
if re.Msg != "" {
|
if re.Msg != "" {
|
||||||
if(strings.Contains(re.Msg, "-")) {
|
if strings.Contains(re.Msg, "-") {
|
||||||
msgAndValues := strings.Split(re.Msg, "-")
|
msgAndValues := strings.Split(re.Msg, "-")
|
||||||
if len(msgAndValues) == 2 {
|
if len(msgAndValues) == 2 {
|
||||||
re.Msg = c.Message(msgAndValues[0], msgAndValues[1])
|
re.Msg = c.Message(msgAndValues[0], msgAndValues[1])
|
||||||
|
|||||||
@@ -59,7 +59,7 @@ 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.RenderArgs["themeInfo"] = c.RenderArgs["themeInfoPreview"]
|
||||||
}
|
}
|
||||||
return blog.RenderTemplate(templateName, c.RenderArgs, revel.BasePath+"/"+themePath, isPreview)
|
return blog.RenderTemplate(templateName, c.RenderArgs, revel.BasePath+"/"+themePath, isPreview)
|
||||||
}
|
}
|
||||||
@@ -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
|
||||||
@@ -143,8 +143,8 @@ func (c Blog) setPreviewUrl() {
|
|||||||
// 各种地址设置
|
// 各种地址设置
|
||||||
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()
|
||||||
@@ -168,20 +168,20 @@ func (c Blog) setUrl(userBlog info.UserBlog, userInfo info.User) {
|
|||||||
c.RenderArgs["themeBaseUrl"] = "/" + userBlog.ThemePath
|
c.RenderArgs["themeBaseUrl"] = "/" + userBlog.ThemePath
|
||||||
|
|
||||||
// 其它static js
|
// 其它static js
|
||||||
c.RenderArgs["jQueryUrl"] = siteUrl + "/js/jquery-1.9.0.min.js"
|
c.RenderArgs["jQueryUrl"] = "/js/jquery-1.9.0.min.js"
|
||||||
|
|
||||||
c.RenderArgs["prettifyJsUrl"] = siteUrl + "/js/google-code-prettify/prettify.js"
|
c.RenderArgs["prettifyJsUrl"] = "/js/google-code-prettify/prettify.js"
|
||||||
c.RenderArgs["prettifyCssUrl"] = siteUrl + "/js/google-code-prettify/prettify.css"
|
c.RenderArgs["prettifyCssUrl"] = "/js/google-code-prettify/prettify.css"
|
||||||
|
|
||||||
c.RenderArgs["blogCommonJsUrl"] = siteUrl + "/public/blog/js/common.js"
|
c.RenderArgs["blogCommonJsUrl"] = "/public/blog/js/common.js"
|
||||||
|
|
||||||
c.RenderArgs["shareCommentCssUrl"] = siteUrl + "/public/blog/css/share_comment.css"
|
c.RenderArgs["shareCommentCssUrl"] = "/public/blog/css/share_comment.css"
|
||||||
c.RenderArgs["shareCommentJsUrl"] = siteUrl + "/public/blog/js/share_comment.js"
|
c.RenderArgs["shareCommentJsUrl"] = "/public/blog/js/share_comment.js"
|
||||||
|
|
||||||
c.RenderArgs["fontAwesomeUrl"] = staticUrl + "/css/font-awesome-4.2.0/css/font-awesome.css"
|
c.RenderArgs["fontAwesomeUrl"] = "/css/font-awesome-4.2.0/css/font-awesome.css"
|
||||||
|
|
||||||
c.RenderArgs["bootstrapCssUrl"] = siteUrl + "/css/bootstrap.css"
|
c.RenderArgs["bootstrapCssUrl"] = "/css/bootstrap.css"
|
||||||
c.RenderArgs["bootstrapJsUrl"] = siteUrl + "/js/bootstrap-min.js"
|
c.RenderArgs["bootstrapJsUrl"] = "/js/bootstrap-min.js"
|
||||||
}
|
}
|
||||||
|
|
||||||
// 笔记本分类
|
// 笔记本分类
|
||||||
@@ -235,8 +235,8 @@ func (c Blog) getCates(userBlog info.UserBlog) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// LogJ(">>")
|
// LogJ(">>")
|
||||||
// LogJ(cates)
|
// LogJ(cates)
|
||||||
|
|
||||||
// 建立层级
|
// 建立层级
|
||||||
hasParent := map[string]bool{} // 有父的cate
|
hasParent := map[string]bool{} // 有父的cate
|
||||||
@@ -244,9 +244,9 @@ func (c Blog) getCates(userBlog info.UserBlog) {
|
|||||||
parentCateId := cate.ParentCateId
|
parentCateId := cate.ParentCateId
|
||||||
if parentCateId != "" {
|
if parentCateId != "" {
|
||||||
if parentCate, ok := cateMap[parentCateId]; ok {
|
if parentCate, ok := cateMap[parentCateId]; ok {
|
||||||
// Log("________")
|
// Log("________")
|
||||||
// LogJ(parentCate)
|
// LogJ(parentCate)
|
||||||
// LogJ(cate)
|
// LogJ(cate)
|
||||||
if parentCate.Children == nil {
|
if parentCate.Children == nil {
|
||||||
parentCate.Children = []*info.Cate{cate}
|
parentCate.Children = []*info.Cate{cate}
|
||||||
} else {
|
} else {
|
||||||
@@ -265,10 +265,6 @@ func (c Blog) getCates(userBlog info.UserBlog) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Log("cates")
|
|
||||||
LogJ(cates)
|
|
||||||
LogJ(catesTree);
|
|
||||||
|
|
||||||
c.RenderArgs["cates"] = cates
|
c.RenderArgs["cates"] = cates
|
||||||
c.RenderArgs["catesTree"] = catesTree
|
c.RenderArgs["catesTree"] = catesTree
|
||||||
}
|
}
|
||||||
@@ -352,9 +348,10 @@ func (c Blog) blogCommon(userId string, userBlog info.UserBlog, userInfo info.Us
|
|||||||
// 得到主题信息
|
// 得到主题信息
|
||||||
themeInfo := themeService.GetThemeInfo(userBlog.ThemeId.Hex(), userBlog.Style)
|
themeInfo := themeService.GetThemeInfo(userBlog.ThemeId.Hex(), userBlog.Style)
|
||||||
c.RenderArgs["themeInfo"] = themeInfo
|
c.RenderArgs["themeInfo"] = themeInfo
|
||||||
Log(">>")
|
|
||||||
Log(userBlog.Style)
|
// Log(">>")
|
||||||
Log(userBlog.ThemeId.Hex())
|
// Log(userBlog.Style)
|
||||||
|
// Log(userBlog.ThemeId.Hex())
|
||||||
|
|
||||||
return true, userBlog
|
return true, userBlog
|
||||||
}
|
}
|
||||||
@@ -510,6 +507,7 @@ func (c Blog) Archives(userIdOrEmail string, cateId string, year, month int) (re
|
|||||||
// 进入某个用户的博客
|
// 进入某个用户的博客
|
||||||
var blogPageSize = 5
|
var blogPageSize = 5
|
||||||
var searchBlogPageSize = 30
|
var searchBlogPageSize = 30
|
||||||
|
|
||||||
// 分类 /cate/xxxxxxxx?notebookId=1212
|
// 分类 /cate/xxxxxxxx?notebookId=1212
|
||||||
func (c Blog) Cate(userIdOrEmail string, notebookId string) (re revel.Result) {
|
func (c Blog) Cate(userIdOrEmail string, notebookId string) (re revel.Result) {
|
||||||
// 自定义域名
|
// 自定义域名
|
||||||
|
|||||||
@@ -2,17 +2,17 @@ package controllers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
// "gopkg.in/mgo.v2/bson"
|
// "gopkg.in/mgo.v2/bson"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
. "github.com/leanote/leanote/app/lea"
|
||||||
"github.com/leanote/leanote/app/lea/captcha"
|
"github.com/leanote/leanote/app/lea/captcha"
|
||||||
// "github.com/leanote/leanote/app/types"
|
// "github.com/leanote/leanote/app/types"
|
||||||
// "io/ioutil"
|
// "io/ioutil"
|
||||||
// "fmt"
|
// "fmt"
|
||||||
// "math"
|
// "math"
|
||||||
// "os"
|
// "os"
|
||||||
// "path"
|
// "path"
|
||||||
// "strconv"
|
// "strconv"
|
||||||
"net/http"
|
"net/http"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -22,6 +22,7 @@ type Captcha struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Ca string
|
type Ca string
|
||||||
|
|
||||||
func (r Ca) Apply(req *revel.Request, resp *revel.Response) {
|
func (r Ca) Apply(req *revel.Request, resp *revel.Response) {
|
||||||
resp.WriteHeader(http.StatusOK, "image/png")
|
resp.WriteHeader(http.StatusOK, "image/png")
|
||||||
}
|
}
|
||||||
@@ -32,11 +33,11 @@ func (c Captcha) Get() revel.Result {
|
|||||||
image.WriteTo(c.Response.Out)
|
image.WriteTo(c.Response.Out)
|
||||||
|
|
||||||
sessionId := c.Session["_ID"]
|
sessionId := c.Session["_ID"]
|
||||||
// LogJ(c.Session)
|
// LogJ(c.Session)
|
||||||
// Log("------")
|
// Log("------")
|
||||||
// Log(str)
|
// Log(str)
|
||||||
// Log(sessionId)
|
// Log(sessionId)
|
||||||
Log("..")
|
Log("..")
|
||||||
sessionService.SetCaptcha(sessionId, str)
|
sessionService.SetCaptcha(sessionId, str)
|
||||||
|
|
||||||
return c.Render()
|
return c.Render()
|
||||||
|
|||||||
@@ -2,15 +2,15 @@ package controllers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"fmt"
|
||||||
|
"github.com/leanote/leanote/app/info"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
. "github.com/leanote/leanote/app/lea"
|
||||||
"github.com/leanote/leanote/app/lea/netutil"
|
"github.com/leanote/leanote/app/lea/netutil"
|
||||||
"github.com/leanote/leanote/app/info"
|
"gopkg.in/mgo.v2/bson"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"fmt"
|
// "strconv"
|
||||||
// "strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -22,7 +22,7 @@ type File struct {
|
|||||||
// 上传的是博客logo
|
// 上传的是博客logo
|
||||||
// TODO logo不要设置权限, 另外的目录
|
// TODO logo不要设置权限, 另外的目录
|
||||||
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.RenderArgs["fileUrlPath"] = re.Id
|
||||||
c.RenderArgs["resultCode"] = re.Code
|
c.RenderArgs["resultCode"] = re.Code
|
||||||
@@ -34,8 +34,9 @@ func (c File) UploadBlogLogo() revel.Result {
|
|||||||
// 拖拉上传, pasteImage
|
// 拖拉上传, pasteImage
|
||||||
// noteId 是为了判断是否是协作的note, 如果是则需要复制一份到note owner中
|
// noteId 是为了判断是否是协作的note, 如果是则需要复制一份到note owner中
|
||||||
func (c File) PasteImage(noteId string) revel.Result {
|
func (c File) PasteImage(noteId string) revel.Result {
|
||||||
re := c.uploadImage("pasteImage", "");
|
re := c.uploadImage("pasteImage", "")
|
||||||
|
|
||||||
|
if noteId != "" {
|
||||||
userId := c.GetUserId()
|
userId := c.GetUserId()
|
||||||
note := noteService.GetNoteById(noteId)
|
note := noteService.GetNoteById(noteId)
|
||||||
if note.UserId != "" {
|
if note.UserId != "" {
|
||||||
@@ -51,13 +52,14 @@ 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.RenderArgs["fileUrlPath"] = re.Id
|
||||||
c.RenderArgs["resultCode"] = re.Code
|
c.RenderArgs["resultCode"] = re.Code
|
||||||
@@ -66,7 +68,7 @@ func (c File) UploadAvatar() revel.Result {
|
|||||||
if re.Ok {
|
if re.Ok {
|
||||||
re.Ok = userService.UpdateAvatar(c.GetUserId(), re.Id)
|
re.Ok = userService.UpdateAvatar(c.GetUserId(), re.Id)
|
||||||
if re.Ok {
|
if re.Ok {
|
||||||
c.UpdateSession("Logo", re.Id);
|
c.UpdateSession("Logo", re.Id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,7 +77,7 @@ func (c File) UploadAvatar() revel.Result {
|
|||||||
|
|
||||||
// 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)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,12 +102,19 @@ func (c File) uploadImage(from, albumId string) (re info.Re) {
|
|||||||
return re
|
return re
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
// 生成上传路径
|
// 生成上传路径
|
||||||
if(from == "logo" || from == "blogLogo") {
|
newGuid := NewGuid()
|
||||||
fileUrlPath = "public/upload/" + c.GetUserId() + "/images/logo"
|
|
||||||
|
userId := c.GetUserId()
|
||||||
|
|
||||||
|
if from == "logo" || from == "blogLogo" {
|
||||||
|
fileUrlPath = "public/upload/" + Digest3(userId) + "/" + userId + "/images/logo"
|
||||||
} else {
|
} else {
|
||||||
fileUrlPath = "files/" + c.GetUserId() + "/images"
|
// fileUrlPath = "files/" + Digest3(userId) + "/" + userId + "/" + Digest2(newGuid) + "/images"
|
||||||
|
fileUrlPath = "files/" + GetRandomFilePath(userId, newGuid) + "/images"
|
||||||
}
|
}
|
||||||
|
|
||||||
dir := revel.BasePath + "/" + fileUrlPath
|
dir := revel.BasePath + "/" + fileUrlPath
|
||||||
err = os.MkdirAll(dir, 0755)
|
err = os.MkdirAll(dir, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -114,18 +123,19 @@ func (c File) uploadImage(from, albumId string) (re info.Re) {
|
|||||||
// 生成新的文件名
|
// 生成新的文件名
|
||||||
filename := handel.Filename
|
filename := handel.Filename
|
||||||
|
|
||||||
var ext string;
|
var ext string
|
||||||
if from == "pasteImage" {
|
if from == "pasteImage" {
|
||||||
ext = ".png"; // TODO 可能不是png类型
|
handel.Filename = c.Message("unTitled")
|
||||||
|
ext = ".png" // TODO 可能不是png类型
|
||||||
} else {
|
} else {
|
||||||
_, 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" {
|
||||||
resultMsg = "Please upload image"
|
resultMsg = "Please upload image"
|
||||||
return re
|
return re
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
filename = NewGuid() + ext
|
filename = newGuid + ext
|
||||||
data, err := ioutil.ReadAll(file)
|
data, err := ioutil.ReadAll(file)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
LogJ(err)
|
LogJ(err)
|
||||||
@@ -133,25 +143,25 @@ func (c File) uploadImage(from, albumId string) (re info.Re) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var maxFileSize float64
|
var maxFileSize float64
|
||||||
if(from == "logo") {
|
if from == "logo" {
|
||||||
maxFileSize = configService.GetUploadSize("uploadAvatarSize");
|
maxFileSize = configService.GetUploadSize("uploadAvatarSize")
|
||||||
} else if from == "blogLogo" {
|
} else if from == "blogLogo" {
|
||||||
maxFileSize = configService.GetUploadSize("uploadBlogLogoSize");
|
maxFileSize = configService.GetUploadSize("uploadBlogLogoSize")
|
||||||
} else {
|
} else {
|
||||||
maxFileSize = configService.GetUploadSize("uploadImageSize");
|
maxFileSize = configService.GetUploadSize("uploadImageSize")
|
||||||
}
|
}
|
||||||
if maxFileSize <= 0 {
|
if maxFileSize <= 0 {
|
||||||
maxFileSize = 1000
|
maxFileSize = 1000
|
||||||
}
|
}
|
||||||
|
|
||||||
// > 2M?
|
// > 2M?
|
||||||
if(float64(len(data)) > maxFileSize * float64(1024*1024)) {
|
if float64(len(data)) > maxFileSize*float64(1024*1024) {
|
||||||
resultCode = 0
|
resultCode = 0
|
||||||
resultMsg = fmt.Sprintf("The file Size is bigger than %vM", maxFileSize)
|
resultMsg = fmt.Sprintf("The file Size is bigger than %vM", maxFileSize)
|
||||||
return re
|
return 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 {
|
||||||
LogJ(err)
|
LogJ(err)
|
||||||
@@ -171,17 +181,18 @@ func (c File) uploadImage(from, albumId string) (re info.Re) {
|
|||||||
Path: fileUrlPath,
|
Path: fileUrlPath,
|
||||||
Size: filesize}
|
Size: filesize}
|
||||||
|
|
||||||
id := bson.NewObjectId();
|
id := bson.NewObjectId()
|
||||||
fileInfo.FileId = id
|
fileInfo.FileId = id
|
||||||
fileId = id.Hex()
|
fileId = id.Hex()
|
||||||
if(from == "logo" || from == "blogLogo") {
|
|
||||||
fileId = "public/upload/" + c.GetUserId() + "/images/logo/" + filename
|
if from == "logo" || from == "blogLogo" {
|
||||||
|
fileId = fileUrlPath
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok, resultMsg = fileService.AddImage(fileInfo, albumId, c.GetUserId(), from == "" || from == "pasteImage")
|
Ok, resultMsg = fileService.AddImage(fileInfo, albumId, c.GetUserId(), from == "" || from == "pasteImage")
|
||||||
resultMsg = c.Message(resultMsg)
|
resultMsg = c.Message(resultMsg)
|
||||||
|
|
||||||
fileInfo.Path = ""; // 不要返回
|
fileInfo.Path = "" // 不要返回
|
||||||
re.Item = fileInfo
|
re.Item = fileInfo
|
||||||
|
|
||||||
return re
|
return re
|
||||||
@@ -204,12 +215,13 @@ func (c File) DeleteImage(fileId string) revel.Result {
|
|||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------
|
//-----------
|
||||||
|
|
||||||
// 输出image
|
// 输出image
|
||||||
// 权限判断
|
// 权限判断
|
||||||
func (c File) OutputImage(noteId, fileId string) revel.Result {
|
func (c File) OutputImage(noteId, fileId string) revel.Result {
|
||||||
path := fileService.GetFile(c.GetUserId(), fileId); // 得到路径
|
path := fileService.GetFile(c.GetUserId(), fileId) // 得到路径
|
||||||
if path == "" {
|
if path == "" {
|
||||||
return c.RenderText("")
|
return c.RenderText("")
|
||||||
}
|
}
|
||||||
@@ -226,12 +238,17 @@ func (c File) CopyImage(userId, fileId, toUserId string) revel.Result {
|
|||||||
return c.RenderJson(re)
|
return c.RenderJson(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 复制外网的图片, 成公共图片 放在/upload下
|
// 复制外网的图片
|
||||||
// 都要好好的计算大小
|
// 都要好好的计算大小
|
||||||
func (c File) CopyHttpImage(src string) revel.Result {
|
func (c File) CopyHttpImage(src string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
fileUrlPath := "upload/" + c.GetUserId() + "/images"
|
|
||||||
dir := revel.BasePath + "/public/" + fileUrlPath
|
// 生成上传路径
|
||||||
|
newGuid := NewGuid()
|
||||||
|
userId := c.GetUserId()
|
||||||
|
// fileUrlPath := "files/" + Digest3(userId) + "/" + userId + "/" + Digest2(newGuid) + "/images"
|
||||||
|
fileUrlPath := "files/" + GetRandomFilePath(userId, newGuid) + "/images"
|
||||||
|
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)
|
||||||
@@ -249,11 +266,11 @@ func (c File) CopyHttpImage(src string) revel.Result {
|
|||||||
Path: fileUrlPath + "/" + filename,
|
Path: fileUrlPath + "/" + filename,
|
||||||
Size: filesize}
|
Size: filesize}
|
||||||
|
|
||||||
id := bson.NewObjectId();
|
id := bson.NewObjectId()
|
||||||
fileInfo.FileId = id
|
fileInfo.FileId = id
|
||||||
|
|
||||||
re.Id = id.Hex()
|
re.Id = id.Hex()
|
||||||
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)
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
"github.com/revel/revel"
|
||||||
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 首页
|
// 首页
|
||||||
@@ -13,21 +13,21 @@ type Index struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c Index) Default() revel.Result {
|
func (c Index) Default() revel.Result {
|
||||||
if configService.HomePageIsAdminsBlog(){
|
if configService.HomePageIsAdminsBlog() {
|
||||||
blog := Blog{c.BaseController}
|
blog := Blog{c.BaseController}
|
||||||
return blog.Index(configService.GetAdminUsername());
|
return blog.Index(configService.GetAdminUsername())
|
||||||
}
|
}
|
||||||
return c.Index()
|
return c.Index()
|
||||||
}
|
}
|
||||||
|
|
||||||
// leanote展示页, 没有登录的, 或已登录明确要进该页的
|
// leanote展示页, 没有登录的, 或已登录明确要进该页的
|
||||||
func (c Index) Index() revel.Result {
|
func (c Index) Index() revel.Result {
|
||||||
|
|
||||||
c.SetUserInfo()
|
c.SetUserInfo()
|
||||||
c.RenderArgs["title"] = "leanote"
|
c.RenderArgs["title"] = "leanote"
|
||||||
c.RenderArgs["openRegister"] = configService.GlobalStringConfigs["openRegister"]
|
c.RenderArgs["openRegister"] = configService.GlobalStringConfigs["openRegister"]
|
||||||
lang := c.SetLocale()
|
c.SetLocale()
|
||||||
|
|
||||||
return c.RenderTemplate("home/index_" + lang + ".html");
|
return c.RenderTemplate("home/index.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 建议
|
// 建议
|
||||||
@@ -37,8 +37,8 @@ func (c Index) Suggestion(addr, suggestion string) revel.Result {
|
|||||||
|
|
||||||
// 发给我
|
// 发给我
|
||||||
go func() {
|
go func() {
|
||||||
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)
|
||||||
}
|
}
|
||||||
@@ -2,17 +2,20 @@ package controllers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
"gopkg.in/mgo.v2/bson"
|
|
||||||
. "github.com/leanote/leanote/app/lea"
|
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
|
. "github.com/leanote/leanote/app/lea"
|
||||||
|
"gopkg.in/mgo.v2/bson"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"regexp"
|
||||||
"strings"
|
"strings"
|
||||||
// "time"
|
"time"
|
||||||
// "github.com/leanote/leanote/app/types"
|
// "github.com/leanote/leanote/app/types"
|
||||||
// "io/ioutil"
|
// "io/ioutil"
|
||||||
// "fmt"
|
"fmt"
|
||||||
// "bytes"
|
// "bytes"
|
||||||
// "os"
|
// "os"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Note struct {
|
type Note struct {
|
||||||
@@ -22,9 +25,9 @@ type Note struct {
|
|||||||
// 笔记首页, 判断是否已登录
|
// 笔记首页, 判断是否已登录
|
||||||
// 已登录, 得到用户基本信息(notebook, shareNotebook), 跳转到index.html中
|
// 已登录, 得到用户基本信息(notebook, shareNotebook), 跳转到index.html中
|
||||||
// 否则, 转向登录页面
|
// 否则, 转向登录页面
|
||||||
func (c Note) Index(noteId string) revel.Result {
|
func (c Note) Index(noteId, online string) revel.Result {
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
userInfo := c.GetUserInfo()
|
userInfo := c.GetUserAndBlogUrl()
|
||||||
|
|
||||||
userId := userInfo.UserId.Hex()
|
userId := userInfo.UserId.Hex()
|
||||||
|
|
||||||
@@ -64,13 +67,13 @@ func (c Note) Index(noteId string) revel.Result {
|
|||||||
// 不要获取notebook下的笔记
|
// 不要获取notebook下的笔记
|
||||||
// 在前端下发请求
|
// 在前端下发请求
|
||||||
c.RenderArgs["curSharedNoteNotebookId"] = note.NotebookId.Hex()
|
c.RenderArgs["curSharedNoteNotebookId"] = note.NotebookId.Hex()
|
||||||
c.RenderArgs["curSharedUserId"] = noteOwner;
|
c.RenderArgs["curSharedUserId"] = noteOwner
|
||||||
// 没有读写权限
|
// 没有读写权限
|
||||||
} else {
|
} else {
|
||||||
hasRightNoteId = false
|
hasRightNoteId = false
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
_, notes = noteService.ListNotes(c.GetUserId(), note.NotebookId.Hex(), false, c.GetPage(), 50, defaultSortField, false, false);
|
_, notes = noteService.ListNotes(c.GetUserId(), note.NotebookId.Hex(), false, c.GetPage(), 50, defaultSortField, false, false)
|
||||||
|
|
||||||
// 如果指定了某笔记, 则该笔记放在首位
|
// 如果指定了某笔记, 则该笔记放在首位
|
||||||
lenNotes := len(notes)
|
lenNotes := len(notes)
|
||||||
@@ -81,7 +84,7 @@ func (c Note) Index(noteId string) revel.Result {
|
|||||||
for _, note := range notes {
|
for _, note := range notes {
|
||||||
if note.NoteId.Hex() != noteId {
|
if note.NoteId.Hex() != noteId {
|
||||||
if i == lenNotes { // 防止越界
|
if i == lenNotes { // 防止越界
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
notes2[i] = note
|
notes2[i] = note
|
||||||
i++
|
i++
|
||||||
@@ -93,14 +96,14 @@ func (c Note) Index(noteId 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.RenderArgs["latestNotes"] = latestNotes
|
||||||
}
|
}
|
||||||
|
|
||||||
// 没有传入笔记
|
// 没有传入笔记
|
||||||
// 那么得到最新笔记
|
// 那么得到最新笔记
|
||||||
if !hasRightNoteId {
|
if !hasRightNoteId {
|
||||||
_, 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.RenderArgs["curNoteId"] = notes[0].NoteId.Hex()
|
||||||
@@ -125,8 +128,9 @@ func (c Note) Index(noteId string) revel.Result {
|
|||||||
|
|
||||||
c.RenderArgs["globalConfigs"] = configService.GetGlobalConfigForUser()
|
c.RenderArgs["globalConfigs"] = configService.GetGlobalConfigForUser()
|
||||||
|
|
||||||
// return c.RenderTemplate("note/note.html")
|
// return c.RenderTemplate("note/note.html")
|
||||||
if isDev, _ := revel.Config.Bool("mode.dev"); isDev {
|
|
||||||
|
if isDev, _ := revel.Config.Bool("mode.dev"); isDev && online == "" {
|
||||||
return c.RenderTemplate("note/note-dev.html")
|
return c.RenderTemplate("note/note-dev.html")
|
||||||
} else {
|
} else {
|
||||||
return c.RenderTemplate("note/note.html")
|
return c.RenderTemplate("note/note.html")
|
||||||
@@ -137,13 +141,13 @@ func (c Note) Index(noteId string) revel.Result {
|
|||||||
// 已登录, 得到用户基本信息(notebook, shareNotebook), 跳转到index.html中
|
// 已登录, 得到用户基本信息(notebook, shareNotebook), 跳转到index.html中
|
||||||
// 否则, 转向登录页面
|
// 否则, 转向登录页面
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,30 +162,12 @@ func (c Note) GetNoteContent(noteId string) revel.Result {
|
|||||||
return c.RenderJson(noteContent)
|
return c.RenderJson(noteContent)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新note或content
|
|
||||||
// 肯定会传userId(谁的), NoteId
|
|
||||||
// 会传Title, Content, Tags, 一种或几种
|
|
||||||
type NoteOrContent struct {
|
|
||||||
NotebookId string
|
|
||||||
NoteId string
|
|
||||||
UserId string
|
|
||||||
Title string
|
|
||||||
Desc string
|
|
||||||
ImgSrc string
|
|
||||||
Tags string
|
|
||||||
Content string
|
|
||||||
Abstract string
|
|
||||||
IsNew bool
|
|
||||||
IsMarkdown bool
|
|
||||||
FromUserId string // 为共享而新建
|
|
||||||
IsBlog bool // 是否是blog, 更新note不需要修改, 添加note时才有可能用到, 此时需要判断notebook是否设为Blog
|
|
||||||
}
|
|
||||||
// 这里不能用json, 要用post
|
// 这里不能用json, 要用post
|
||||||
func (c Note) UpdateNoteOrContent(noteOrContent NoteOrContent) revel.Result {
|
func (c Note) UpdateNoteOrContent(noteOrContent info.NoteOrContent) revel.Result {
|
||||||
// 新添加note
|
// 新添加note
|
||||||
if noteOrContent.IsNew {
|
if noteOrContent.IsNew {
|
||||||
userId := c.GetObjectUserId();
|
userId := c.GetObjectUserId()
|
||||||
// myUserId := userId
|
// myUserId := userId
|
||||||
// 为共享新建?
|
// 为共享新建?
|
||||||
if noteOrContent.FromUserId != "" {
|
if noteOrContent.FromUserId != "" {
|
||||||
userId = bson.ObjectIdHex(noteOrContent.FromUserId)
|
userId = bson.ObjectIdHex(noteOrContent.FromUserId)
|
||||||
@@ -196,12 +182,12 @@ func (c Note) UpdateNoteOrContent(noteOrContent NoteOrContent) revel.Result {
|
|||||||
ImgSrc: noteOrContent.ImgSrc,
|
ImgSrc: noteOrContent.ImgSrc,
|
||||||
IsBlog: noteOrContent.IsBlog,
|
IsBlog: noteOrContent.IsBlog,
|
||||||
IsMarkdown: noteOrContent.IsMarkdown,
|
IsMarkdown: noteOrContent.IsMarkdown,
|
||||||
};
|
}
|
||||||
noteContent := info.NoteContent{NoteId: note.NoteId,
|
noteContent := info.NoteContent{NoteId: note.NoteId,
|
||||||
UserId: userId,
|
UserId: userId,
|
||||||
IsBlog: note.IsBlog,
|
IsBlog: note.IsBlog,
|
||||||
Content: noteOrContent.Content,
|
Content: noteOrContent.Content,
|
||||||
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)
|
||||||
@@ -213,20 +199,20 @@ func (c Note) UpdateNoteOrContent(noteOrContent NoteOrContent) revel.Result {
|
|||||||
// Desc前台传来
|
// Desc前台传来
|
||||||
if c.Has("Desc") {
|
if c.Has("Desc") {
|
||||||
needUpdateNote = true
|
needUpdateNote = true
|
||||||
noteUpdate["Desc"] = noteOrContent.Desc;
|
noteUpdate["Desc"] = noteOrContent.Desc
|
||||||
}
|
}
|
||||||
if c.Has("ImgSrc") {
|
if c.Has("ImgSrc") {
|
||||||
needUpdateNote = true
|
needUpdateNote = true
|
||||||
noteUpdate["ImgSrc"] = noteOrContent.ImgSrc;
|
noteUpdate["ImgSrc"] = noteOrContent.ImgSrc
|
||||||
}
|
}
|
||||||
if c.Has("Title") {
|
if c.Has("Title") {
|
||||||
needUpdateNote = true
|
needUpdateNote = true
|
||||||
noteUpdate["Title"] = noteOrContent.Title;
|
noteUpdate["Title"] = noteOrContent.Title
|
||||||
}
|
}
|
||||||
|
|
||||||
if c.Has("Tags") {
|
if c.Has("Tags") {
|
||||||
needUpdateNote = true
|
needUpdateNote = true
|
||||||
noteUpdate["Tags"] = strings.Split(noteOrContent.Tags, ",");
|
noteUpdate["Tags"] = strings.Split(noteOrContent.Tags, ",")
|
||||||
}
|
}
|
||||||
|
|
||||||
// web端不控制
|
// web端不控制
|
||||||
@@ -240,10 +226,11 @@ func (c Note) UpdateNoteOrContent(noteOrContent NoteOrContent) revel.Result {
|
|||||||
contentOk := false
|
contentOk := false
|
||||||
contentMsg := ""
|
contentMsg := ""
|
||||||
if c.Has("Content") {
|
if c.Has("Content") {
|
||||||
// noteService.UpdateNoteContent(noteOrContent.UserId, c.GetUserId(),
|
// noteService.UpdateNoteContent(noteOrContent.UserId, c.GetUserId(),
|
||||||
// noteOrContent.NoteId, noteOrContent.Content, noteOrContent.Abstract)
|
// noteOrContent.NoteId, noteOrContent.Content, noteOrContent.Abstract)
|
||||||
contentOk, contentMsg, afterContentUsn = noteService.UpdateNoteContent(c.GetUserId(),
|
contentOk, contentMsg, afterContentUsn = noteService.UpdateNoteContent(c.GetUserId(),
|
||||||
noteOrContent.NoteId, noteOrContent.Content, noteOrContent.Abstract, needUpdateNote, -1)
|
noteOrContent.NoteId, noteOrContent.Content, noteOrContent.Abstract,
|
||||||
|
needUpdateNote, -1, time.Now())
|
||||||
}
|
}
|
||||||
|
|
||||||
Log(afterContentUsn)
|
Log(afterContentUsn)
|
||||||
@@ -255,28 +242,59 @@ func (c Note) UpdateNoteOrContent(noteOrContent NoteOrContent) revel.Result {
|
|||||||
|
|
||||||
// 删除note/ 删除别人共享给我的笔记
|
// 删除note/ 删除别人共享给我的笔记
|
||||||
// userId 是note.UserId
|
// userId 是note.UserId
|
||||||
func (c Note) DeleteNote(noteId, userId string, isShared bool) revel.Result {
|
func (c Note) DeleteNote(noteIds []string, isShared bool) revel.Result {
|
||||||
if(!isShared) {
|
if !isShared {
|
||||||
return c.RenderJson(trashService.DeleteNote(noteId, c.GetUserId()));
|
for _, noteId := range noteIds {
|
||||||
|
trashService.DeleteNote(noteId, c.GetUserId())
|
||||||
|
}
|
||||||
|
return c.RenderJson(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
return c.RenderJson(trashService.DeleteSharedNote(noteId, userId, c.GetUserId()));
|
for _, noteId := range noteIds {
|
||||||
|
trashService.DeleteSharedNote(noteId, c.GetUserId())
|
||||||
|
}
|
||||||
|
|
||||||
|
return c.RenderJson(true)
|
||||||
}
|
}
|
||||||
// 删除trash
|
|
||||||
|
// 删除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
|
||||||
func (c Note) MoveNote(noteId, notebookId string) revel.Result {
|
func (c Note) MoveNote(noteIds []string, notebookId string) revel.Result {
|
||||||
return c.RenderJson(noteService.MoveNote(noteId, notebookId, c.GetUserId()));
|
userId := c.GetUserId()
|
||||||
|
for _, noteId := range noteIds {
|
||||||
|
noteService.MoveNote(noteId, notebookId, userId)
|
||||||
|
}
|
||||||
|
return c.RenderJson(true)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 复制note
|
// 复制note
|
||||||
func (c Note) CopyNote(noteId, notebookId string) revel.Result {
|
func (c Note) CopyNote(noteIds []string, notebookId string) revel.Result {
|
||||||
return c.RenderJson(noteService.CopyNote(noteId, notebookId, c.GetUserId()));
|
copyNotes := make([]info.Note, len(noteIds))
|
||||||
|
userId := c.GetUserId()
|
||||||
|
for i, noteId := range noteIds {
|
||||||
|
copyNotes[i] = noteService.CopyNote(noteId, notebookId, userId)
|
||||||
|
}
|
||||||
|
re := info.NewRe()
|
||||||
|
re.Ok = true
|
||||||
|
re.Item = copyNotes
|
||||||
|
return c.RenderJson(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 复制别人共享的笔记给我
|
// 复制别人共享的笔记给我
|
||||||
func (c Note) CopySharedNote(noteId, notebookId, fromUserId string) revel.Result {
|
func (c Note) CopySharedNote(noteIds []string, notebookId, fromUserId string) revel.Result {
|
||||||
return c.RenderJson(noteService.CopySharedNote(noteId, notebookId, fromUserId, c.GetUserId()));
|
copyNotes := make([]info.Note, len(noteIds))
|
||||||
|
userId := c.GetUserId()
|
||||||
|
for i, noteId := range noteIds {
|
||||||
|
copyNotes[i] = noteService.CopySharedNote(noteId, notebookId, fromUserId, userId)
|
||||||
|
}
|
||||||
|
re := info.NewRe()
|
||||||
|
re.Ok = true
|
||||||
|
re.Item = copyNotes
|
||||||
|
return c.RenderJson(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------
|
//------------
|
||||||
@@ -286,14 +304,176 @@ 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
|
||||||
|
func (c Note) ToPdf(noteId, appKey string) revel.Result {
|
||||||
|
// 虽然传了cookie但是这里还是不能得到userId, 所以还是通过appKey来验证之
|
||||||
|
appKeyTrue, _ := revel.Config.String("app.secret")
|
||||||
|
if appKeyTrue != appKey {
|
||||||
|
return c.RenderText("auth error")
|
||||||
|
}
|
||||||
|
note := noteService.GetNoteById(noteId)
|
||||||
|
if note.NoteId == "" {
|
||||||
|
return c.RenderText("no note")
|
||||||
|
}
|
||||||
|
|
||||||
|
noteUserId := note.UserId.Hex()
|
||||||
|
content := noteService.GetNoteContent(noteId, noteUserId)
|
||||||
|
userInfo := userService.GetUserInfo(noteUserId)
|
||||||
|
|
||||||
|
//------------------
|
||||||
|
// 将content的图片转换为base64
|
||||||
|
contentStr := content.Content
|
||||||
|
|
||||||
|
siteUrlPattern := configService.GetSiteUrl()
|
||||||
|
if strings.Contains(siteUrlPattern, "https") {
|
||||||
|
siteUrlPattern = strings.Replace(siteUrlPattern, "https", "https*", 1)
|
||||||
|
} else {
|
||||||
|
siteUrlPattern = strings.Replace(siteUrlPattern, "http", "https*", 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
regImage, _ := regexp.Compile(`<img .*?(src=('|")` + siteUrlPattern + `/(file/outputImage|api/file/getImage)\?fileId=([a-z0-9A-Z]{24})("|'))`)
|
||||||
|
|
||||||
|
findsImage := regImage.FindAllStringSubmatch(contentStr, -1) // 查找所有的
|
||||||
|
// [<img src="http://leanote.com/api/getImage?fileId=3354672e8d38f411286b000069" alt="" width="692" height="302" data-mce-src="http://leanote.com/file/outputImage?fileId=54672e8d38f411286b000069" src="http://leanote.com/file/outputImage?fileId=54672e8d38f411286b000069" " file/outputImage 54672e8d38f411286b000069 "]
|
||||||
|
for _, eachFind := range findsImage {
|
||||||
|
if len(eachFind) == 6 {
|
||||||
|
fileId := eachFind[4]
|
||||||
|
// 得到base64编码文件
|
||||||
|
fileBase64 := fileService.GetImageBase64(noteUserId, fileId)
|
||||||
|
if fileBase64 == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1
|
||||||
|
// src="http://leanote.com/file/outputImage?fileId=54672e8d38f411286b000069"
|
||||||
|
allFixed := strings.Replace(eachFind[0], eachFind[1], "src=\""+fileBase64+"\"", -1)
|
||||||
|
contentStr = strings.Replace(contentStr, eachFind[0], allFixed, -1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// markdown
|
||||||
|
if note.IsMarkdown {
|
||||||
|
// 
|
||||||
|
regImageMarkdown, _ := regexp.Compile(`!\[.*?\]\(` + siteUrlPattern + `/(file/outputImage|api/file/getImage)\?fileId=([a-z0-9A-Z]{24})\)`)
|
||||||
|
findsImageMarkdown := regImageMarkdown.FindAllStringSubmatch(contentStr, -1) // 查找所有的
|
||||||
|
for _, eachFind := range findsImageMarkdown {
|
||||||
|
if len(eachFind) == 3 {
|
||||||
|
fileId := eachFind[2]
|
||||||
|
// 得到base64编码文件
|
||||||
|
fileBase64 := fileService.GetImageBase64(noteUserId, fileId)
|
||||||
|
if fileBase64 == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1
|
||||||
|
// src="http://leanote.com/file/outputImage?fileId=54672e8d38f411286b000069"
|
||||||
|
allFixed := ""
|
||||||
|
contentStr = strings.Replace(contentStr, eachFind[0], allFixed, -1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if note.Tags != nil && len(note.Tags) > 0 && note.Tags[0] != "" {
|
||||||
|
} else {
|
||||||
|
note.Tags = nil
|
||||||
|
}
|
||||||
|
c.RenderArgs["blog"] = note
|
||||||
|
c.RenderArgs["content"] = contentStr
|
||||||
|
c.RenderArgs["userInfo"] = userInfo
|
||||||
|
userBlog := blogService.GetUserBlog(noteUserId)
|
||||||
|
c.RenderArgs["userBlog"] = userBlog
|
||||||
|
|
||||||
|
return c.RenderTemplate("file/pdf.html")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 导出成PDF
|
||||||
|
func (c Note) ExportPdf(noteId string) revel.Result {
|
||||||
|
re := info.NewRe()
|
||||||
|
userId := c.GetUserId()
|
||||||
|
note := noteService.GetNoteById(noteId)
|
||||||
|
if note.NoteId == "" {
|
||||||
|
re.Msg = "No Note"
|
||||||
|
return c.RenderText("error")
|
||||||
|
}
|
||||||
|
|
||||||
|
noteUserId := note.UserId.Hex()
|
||||||
|
// 是否有权限
|
||||||
|
if noteUserId != userId {
|
||||||
|
// 是否是有权限协作的
|
||||||
|
if !note.IsBlog && !shareService.HasReadPerm(noteUserId, userId, noteId) {
|
||||||
|
re.Msg = "No Perm"
|
||||||
|
return c.RenderText("No Perm")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// path 判断是否需要重新生成之
|
||||||
|
guid := NewGuid()
|
||||||
|
fileUrlPath := "files/export_pdf"
|
||||||
|
dir := revel.BasePath + "/" + fileUrlPath
|
||||||
|
if !MkdirAll(dir) {
|
||||||
|
return c.RenderText("error, no dir")
|
||||||
|
}
|
||||||
|
filename := guid + ".pdf"
|
||||||
|
path := dir + "/" + filename
|
||||||
|
|
||||||
|
// leanote.com的secret
|
||||||
|
appKey, _ := revel.Config.String("app.secretLeanote")
|
||||||
|
if appKey == "" {
|
||||||
|
appKey, _ = revel.Config.String("app.secret")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成之
|
||||||
|
binPath := configService.GetGlobalStringConfig("exportPdfBinPath")
|
||||||
|
// 默认路径
|
||||||
|
if binPath == "" {
|
||||||
|
binPath = "/usr/local/bin/wkhtmltopdf"
|
||||||
|
}
|
||||||
|
|
||||||
|
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 + " \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\""
|
||||||
|
// 等待--window-status为done的状态
|
||||||
|
// http://madalgo.au.dk/~jakobt/wkhtmltoxdoc/wkhtmltopdf_0.10.0_rc2-doc.html
|
||||||
|
// wkhtmltopdf参数大全
|
||||||
|
var cc string
|
||||||
|
if note.IsMarkdown {
|
||||||
|
cc = binPath + " --lowquality --window-status done \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\""
|
||||||
|
} else {
|
||||||
|
cc = binPath + " --lowquality \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\""
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd := exec.Command("/bin/sh", "-c", cc)
|
||||||
|
_, err := cmd.Output()
|
||||||
|
if err != nil {
|
||||||
|
return c.RenderText("export pdf error. " + fmt.Sprintf("%v", err))
|
||||||
|
}
|
||||||
|
file, err := os.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
return c.RenderText("export pdf error. " + fmt.Sprintf("%v", err))
|
||||||
|
}
|
||||||
|
// http://stackoverflow.com/questions/8588818/chrome-pdf-display-duplicate-headers-received-from-the-server
|
||||||
|
// filenameReturn = strings.Replace(filenameReturn, ",", "-", -1)
|
||||||
|
filenameReturn := note.Title
|
||||||
|
filenameReturn = FixFilename(filenameReturn)
|
||||||
|
if filenameReturn == "" {
|
||||||
|
filenameReturn = "Untitled.pdf"
|
||||||
|
} else {
|
||||||
|
filenameReturn += ".pdf"
|
||||||
|
}
|
||||||
|
return c.RenderBinary(file, filenameReturn, revel.Attachment, time.Now()) // revel.Attachment
|
||||||
|
}
|
||||||
|
|
||||||
// 设置/取消Blog; 置顶
|
// 设置/取消Blog; 置顶
|
||||||
func (c Note) SetNote2Blog(noteId string, isBlog, isTop bool) revel.Result {
|
func (c Note) SetNote2Blog(noteIds []string, isBlog, isTop bool) revel.Result {
|
||||||
re := noteService.ToBlog(c.GetUserId(), noteId, isBlog, isTop)
|
for _, noteId := range noteIds {
|
||||||
return c.RenderJson(re)
|
noteService.ToBlog(c.GetUserId(), noteId, isBlog, isTop)
|
||||||
|
}
|
||||||
|
return c.RenderJson(true)
|
||||||
}
|
}
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
|
"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"
|
||||||
// "io/ioutil"
|
// "io/ioutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Notebook struct {
|
type Notebook struct {
|
||||||
@@ -34,18 +34,19 @@ func (c Notebook) AddNotebook(notebookId, title, parentNotebookId string) revel.
|
|||||||
Title: title,
|
Title: title,
|
||||||
Seq: -1,
|
Seq: -1,
|
||||||
UserId: c.GetObjectUserId()}
|
UserId: c.GetObjectUserId()}
|
||||||
if(parentNotebookId != "") {
|
if parentNotebookId != "" {
|
||||||
notebook.ParentNotebookId = bson.ObjectIdHex(parentNotebookId)
|
notebook.ParentNotebookId = bson.ObjectIdHex(parentNotebookId)
|
||||||
}
|
}
|
||||||
|
|
||||||
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))
|
||||||
@@ -53,9 +54,9 @@ func (c Notebook) UpdateNotebookTitle(notebookId, title string) revel.Result {
|
|||||||
|
|
||||||
// 排序
|
// 排序
|
||||||
// 无用
|
// 无用
|
||||||
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, 可能是排序, 可能是移动到其它笔记本下
|
||||||
type DragNotebooksInfo struct {
|
type DragNotebooksInfo struct {
|
||||||
@@ -63,6 +64,7 @@ type DragNotebooksInfo struct {
|
|||||||
ParentNotebookId string
|
ParentNotebookId string
|
||||||
Siblings []string
|
Siblings []string
|
||||||
}
|
}
|
||||||
|
|
||||||
// 传过来的data是JSON.stringfy数据
|
// 传过来的data是JSON.stringfy数据
|
||||||
func (c Notebook) DragNotebooks(data string) revel.Result {
|
func (c Notebook) DragNotebooks(data string) revel.Result {
|
||||||
info := DragNotebooksInfo{}
|
info := DragNotebooksInfo{}
|
||||||
|
|||||||
@@ -2,13 +2,13 @@ package controllers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "strings"
|
// "strings"
|
||||||
// "time"
|
// "time"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
// "github.com/leanote/leanote/app/info"
|
// "github.com/leanote/leanote/app/info"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
// "github.com/leanote/leanote/app/lea/blog"
|
// "github.com/leanote/leanote/app/lea/blog"
|
||||||
// "gopkg.in/mgo.v2/bson"
|
// "gopkg.in/mgo.v2/bson"
|
||||||
// "github.com/leanote/leanote/app/types"
|
// "github.com/leanote/leanote/app/types"
|
||||||
// "io/ioutil"
|
// "io/ioutil"
|
||||||
// "math"
|
// "math"
|
||||||
@@ -23,7 +23,7 @@ type Preview struct {
|
|||||||
// 得到要预览的主题绝对路径
|
// 得到要预览的主题绝对路径
|
||||||
func (c Preview) getPreviewThemeAbsolutePath(themeId string) bool {
|
func (c Preview) getPreviewThemeAbsolutePath(themeId string) bool {
|
||||||
if themeId != "" {
|
if themeId != "" {
|
||||||
c.Session["themeId"] = themeId // 存到session中, 下次的url就不能带了
|
c.Session["themeId"] = themeId // 存到session中, 下次的url就不能带了, 待优化, 有时会取不到
|
||||||
} else {
|
} else {
|
||||||
themeId = c.Session["themeId"] // 直接从session中获取
|
themeId = c.Session["themeId"] // 直接从session中获取
|
||||||
}
|
}
|
||||||
@@ -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.RenderArgs, c.getPreviewThemeAbsolutePath(themeId))
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c Preview) Tag(userIdOrEmail, tag string) revel.Result {
|
func (c Preview) Tag(userIdOrEmail, tag string) revel.Result {
|
||||||
@@ -61,43 +61,43 @@ func (c Preview) Tags(userIdOrEmail string) revel.Result {
|
|||||||
return c.E404()
|
return c.E404()
|
||||||
}
|
}
|
||||||
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.RenderArgs, c.getPreviewThemeAbsolutePath(""))
|
||||||
// }
|
// }
|
||||||
// return blog.RenderTemplate("tag_posts.html", c.RenderArgs, c.getPreviewThemeAbsolutePath(""))
|
// return blog.RenderTemplate("tag_posts.html", c.RenderArgs, 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.RenderArgs, 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.RenderArgs, 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.RenderArgs, 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.RenderArgs, 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.RenderArgs, c.getPreviewThemeAbsolutePath(""))
|
||||||
}
|
}
|
||||||
@@ -2,13 +2,13 @@ package controllers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
// "gopkg.in/mgo.v2/bson"
|
// "gopkg.in/mgo.v2/bson"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
// "github.com/leanote/leanote/app/types"
|
. "github.com/leanote/leanote/app/lea"
|
||||||
// "io/ioutil"
|
// "github.com/leanote/leanote/app/types"
|
||||||
// "fmt"
|
// "io/ioutil"
|
||||||
|
// "fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Share struct {
|
type Share struct {
|
||||||
@@ -19,13 +19,13 @@ type Share struct {
|
|||||||
func (c Share) AddShareNote(noteId string, emails []string, perm int) revel.Result {
|
func (c Share) AddShareNote(noteId string, emails []string, perm int) revel.Result {
|
||||||
status := make(map[string]info.Re, len(emails))
|
status := make(map[string]info.Re, len(emails))
|
||||||
// 自己不能给自己添加共享
|
// 自己不能给自己添加共享
|
||||||
myEmail := c.GetEmail();
|
myEmail := c.GetEmail()
|
||||||
for _, email := range emails {
|
for _, email := range emails {
|
||||||
if email == "" {
|
if email == "" {
|
||||||
continue;
|
continue
|
||||||
}
|
}
|
||||||
if(myEmail != email) {
|
if myEmail != email {
|
||||||
ok, msg, userId := shareService.AddShareNote(noteId, perm, c.GetUserId(), email);
|
ok, msg, userId := shareService.AddShareNote(noteId, perm, c.GetUserId(), email)
|
||||||
status[email] = info.Re{Ok: ok, Msg: msg, Id: userId}
|
status[email] = info.Re{Ok: ok, Msg: msg, Id: userId}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@@ -40,13 +40,13 @@ func (c Share) AddShareNote(noteId string, emails []string, perm int) revel.Resu
|
|||||||
func (c Share) AddShareNotebook(notebookId string, emails []string, perm int) revel.Result {
|
func (c Share) AddShareNotebook(notebookId string, emails []string, perm int) revel.Result {
|
||||||
status := make(map[string]info.Re, len(emails))
|
status := make(map[string]info.Re, len(emails))
|
||||||
// 自己不能给自己添加共享
|
// 自己不能给自己添加共享
|
||||||
myEmail := c.GetEmail();
|
myEmail := c.GetEmail()
|
||||||
for _, email := range emails {
|
for _, email := range emails {
|
||||||
if email == "" {
|
if email == "" {
|
||||||
continue;
|
continue
|
||||||
}
|
}
|
||||||
if(myEmail != email) {
|
if myEmail != email {
|
||||||
ok, msg, userId := shareService.AddShareNotebook(notebookId, perm, c.GetUserId(), email);
|
ok, msg, userId := shareService.AddShareNotebook(notebookId, perm, c.GetUserId(), email)
|
||||||
status[email] = info.Re{Ok: ok, Msg: msg, Id: userId}
|
status[email] = info.Re{Ok: ok, Msg: msg, Id: userId}
|
||||||
} else {
|
} else {
|
||||||
status[email] = info.Re{Ok: false, Msg: "不能分享给自己"}
|
status[email] = info.Re{Ok: false, Msg: "不能分享给自己"}
|
||||||
@@ -62,11 +62,11 @@ func (c Share) ListShareNotes(notebookId, userId string) revel.Result {
|
|||||||
// 表示是默认笔记本, 不是某个特定notebook的共享
|
// 表示是默认笔记本, 不是某个特定notebook的共享
|
||||||
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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ func (c Share) ListNoteShareUserInfo(noteId string) revel.Result {
|
|||||||
c.RenderArgs["noteOrNotebookShareGroupInfos"] = shareService.GetNoteShareGroups(noteId, c.GetUserId())
|
c.RenderArgs["noteOrNotebookShareGroupInfos"] = shareService.GetNoteShareGroups(noteId, c.GetUserId())
|
||||||
|
|
||||||
c.RenderArgs["isNote"] = true
|
c.RenderArgs["isNote"] = true
|
||||||
c.RenderArgs["noteOrNotebookId"] = note.NoteId.Hex();
|
c.RenderArgs["noteOrNotebookId"] = note.NoteId.Hex()
|
||||||
c.RenderArgs["title"] = note.Title
|
c.RenderArgs["title"] = note.Title
|
||||||
|
|
||||||
return c.RenderTemplate("share/note_notebook_share_user_infos.html")
|
return c.RenderTemplate("share/note_notebook_share_user_infos.html")
|
||||||
@@ -105,7 +105,7 @@ func (c Share) ListNotebookShareUserInfo(notebookId string) revel.Result {
|
|||||||
LogJ(c.RenderArgs["noteOrNotebookShareGroupInfos"])
|
LogJ(c.RenderArgs["noteOrNotebookShareGroupInfos"])
|
||||||
|
|
||||||
c.RenderArgs["isNote"] = false
|
c.RenderArgs["isNote"] = false
|
||||||
c.RenderArgs["noteOrNotebookId"] = notebook.NotebookId.Hex();
|
c.RenderArgs["noteOrNotebookId"] = notebook.NotebookId.Hex()
|
||||||
c.RenderArgs["title"] = notebook.Title
|
c.RenderArgs["title"] = notebook.Title
|
||||||
|
|
||||||
return c.RenderTemplate("share/note_notebook_share_user_infos.html")
|
return c.RenderTemplate("share/note_notebook_share_user_infos.html")
|
||||||
@@ -114,74 +114,78 @@ 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()))
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------------
|
//-------------
|
||||||
// 用户组
|
// 用户组
|
||||||
|
|
||||||
|
|
||||||
// 将笔记分享给分组
|
// 将笔记分享给分组
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新, 也是一样, 先删后加
|
// 更新, 也是一样, 先删后加
|
||||||
func (c Share) UpdateShareNoteGroupPerm(noteId, groupId string, perm int) revel.Result {
|
func (c Share) UpdateShareNoteGroupPerm(noteId, groupId string, perm int) revel.Result {
|
||||||
return c.AddShareNoteGroup(noteId, groupId, perm)
|
return c.AddShareNoteGroup(noteId, groupId, perm)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//------
|
//------
|
||||||
|
|
||||||
// 将笔记分享给分组
|
// 将笔记分享给分组
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新, 也是一样, 先删后加
|
// 更新, 也是一样, 先删后加
|
||||||
func (c Share) UpdateShareNotebookGroupPerm(notebookId, groupId string, perm int) revel.Result {
|
func (c Share) UpdateShareNotebookGroupPerm(notebookId, groupId string, perm int) revel.Result {
|
||||||
return c.AddShareNotebookGroup(notebookId, groupId, perm)
|
return c.AddShareNotebookGroup(notebookId, groupId, perm)
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ package controllers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
// "gopkg.in/mgo.v2/bson"
|
// "gopkg.in/mgo.v2/bson"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
// "os/exec"
|
// "os/exec"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Tag struct {
|
type Tag struct {
|
||||||
|
|||||||
@@ -2,16 +2,16 @@ package controllers
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
// "gopkg.in/mgo.v2/bson"
|
// "gopkg.in/mgo.v2/bson"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
// "github.com/leanote/leanote/app/types"
|
. "github.com/leanote/leanote/app/lea"
|
||||||
// "io/ioutil"
|
// "github.com/leanote/leanote/app/types"
|
||||||
// "fmt"
|
// "io/ioutil"
|
||||||
// "math"
|
// "fmt"
|
||||||
// "os"
|
// "math"
|
||||||
// "path"
|
// "os"
|
||||||
|
// "path"
|
||||||
"strconv"
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -29,59 +29,59 @@ func (c User) Account(tab int) revel.Result {
|
|||||||
|
|
||||||
// 修改用户名, 需要重置session
|
// 修改用户名, 需要重置session
|
||||||
func (c User) UpdateUsername(username string) revel.Result {
|
func (c User) UpdateUsername(username string) revel.Result {
|
||||||
re := info.NewRe();
|
re := info.NewRe()
|
||||||
if(c.GetUsername() == "demo") {
|
if c.GetUserId() == configService.GetGlobalStringConfig("demoUserId") {
|
||||||
re.Msg = "cannotUpdateDemo"
|
re.Msg = "cannotUpdateDemo"
|
||||||
return c.RenderRe(re);
|
return c.RenderRe(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
if re.Ok, re.Msg = Vd("username", username); !re.Ok {
|
if re.Ok, re.Msg = Vd("username", username); !re.Ok {
|
||||||
return c.RenderRe(re);
|
return c.RenderRe(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
re.Ok, re.Msg = userService.UpdateUsername(c.GetUserId(), username)
|
re.Ok, re.Msg = userService.UpdateUsername(c.GetUserId(), username)
|
||||||
if(re.Ok) {
|
if re.Ok {
|
||||||
c.UpdateSession("Username", username)
|
c.UpdateSession("Username", username)
|
||||||
}
|
}
|
||||||
return c.RenderRe(re);
|
return c.RenderRe(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改密码
|
// 修改密码
|
||||||
func (c User) UpdatePwd(oldPwd, pwd string) revel.Result {
|
func (c User) UpdatePwd(oldPwd, pwd string) revel.Result {
|
||||||
re := info.NewRe();
|
re := info.NewRe()
|
||||||
if(c.GetUsername() == "demo") {
|
if c.GetUserId() == configService.GetGlobalStringConfig("demoUserId") {
|
||||||
re.Msg = "cannotUpdateDemo"
|
re.Msg = "cannotUpdateDemo"
|
||||||
return c.RenderRe(re);
|
return c.RenderRe(re)
|
||||||
}
|
}
|
||||||
if re.Ok, re.Msg = Vd("password", oldPwd); !re.Ok {
|
if re.Ok, re.Msg = Vd("password", oldPwd); !re.Ok {
|
||||||
return c.RenderRe(re);
|
return c.RenderRe(re)
|
||||||
}
|
}
|
||||||
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
||||||
return c.RenderRe(re);
|
return c.RenderRe(re)
|
||||||
}
|
}
|
||||||
re.Ok, re.Msg = userService.UpdatePwd(c.GetUserId(), oldPwd, pwd)
|
re.Ok, re.Msg = userService.UpdatePwd(c.GetUserId(), oldPwd, pwd)
|
||||||
return c.RenderRe(re);
|
return c.RenderRe(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新主题
|
// 更新主题
|
||||||
func (c User) UpdateTheme(theme string) revel.Result {
|
func (c User) UpdateTheme(theme string) revel.Result {
|
||||||
re := info.NewRe();
|
re := info.NewRe()
|
||||||
re.Ok = userService.UpdateTheme(c.GetUserId(), theme)
|
re.Ok = userService.UpdateTheme(c.GetUserId(), theme)
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------
|
//---------------------------
|
||||||
@@ -93,25 +93,10 @@ func (c User) ReSendActiveEmail() revel.Result {
|
|||||||
return c.RenderJson(re)
|
return c.RenderJson(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改Email发送激活邮箱
|
|
||||||
func (c User) UpdateEmailSendActiveEmail(email string) revel.Result {
|
|
||||||
re := info.NewRe()
|
|
||||||
if(c.GetUsername() == "demo") {
|
|
||||||
re.Msg = "cannotUpdateDemo"
|
|
||||||
return c.RenderJson(re);
|
|
||||||
}
|
|
||||||
if re.Ok, re.Msg = Vd("email", email); !re.Ok {
|
|
||||||
return c.RenderRe(re);
|
|
||||||
}
|
|
||||||
|
|
||||||
re.Ok, re.Msg = emailService.UpdateEmailSendActiveEmail(c.GetUserInfo(), email)
|
|
||||||
return c.RenderRe(re)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 通过点击链接
|
// 通过点击链接
|
||||||
// 修改邮箱
|
// 修改邮箱
|
||||||
func (c User) UpdateEmail(token string) revel.Result {
|
func (c User) UpdateEmail(token string) revel.Result {
|
||||||
c.SetUserInfo();
|
c.SetUserInfo()
|
||||||
|
|
||||||
ok, msg, email := userService.UpdateEmail(token)
|
ok, msg, email := userService.UpdateEmail(token)
|
||||||
|
|
||||||
@@ -130,13 +115,13 @@ func (c User) UpdateEmail(token string) revel.Result {
|
|||||||
|
|
||||||
// 注册后激活邮箱
|
// 注册后激活邮箱
|
||||||
func (c User) ActiveEmail(token string) revel.Result {
|
func (c User) ActiveEmail(token string) revel.Result {
|
||||||
c.SetUserInfo();
|
c.SetUserInfo()
|
||||||
|
|
||||||
ok, msg, email := userService.ActiveEmail(token)
|
ok, msg, email := userService.ActiveEmail(token)
|
||||||
|
|
||||||
// 需要修改session
|
// 需要修改session
|
||||||
if ok {
|
if ok {
|
||||||
c.UpdateSession("Verified", "1");
|
c.UpdateSession("Verified", "1")
|
||||||
}
|
}
|
||||||
|
|
||||||
c.RenderArgs["title"] = "验证邮箱"
|
c.RenderArgs["title"] = "验证邮箱"
|
||||||
@@ -147,36 +132,15 @@ func (c User) ActiveEmail(token string) revel.Result {
|
|||||||
return c.RenderTemplate("user/active_email.html")
|
return c.RenderTemplate("user/active_email.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
//------------
|
|
||||||
// 第三方账号添加leanote账号
|
|
||||||
func (c User) AddAccount(email, pwd string) revel.Result {
|
|
||||||
re := info.NewRe()
|
|
||||||
|
|
||||||
if re.Ok, re.Msg = Vd("email", email); !re.Ok {
|
|
||||||
return c.RenderRe(re);
|
|
||||||
}
|
|
||||||
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
|
||||||
return c.RenderRe(re);
|
|
||||||
}
|
|
||||||
|
|
||||||
re.Ok, re.Msg = userService.ThirdAddUser(c.GetUserId(), email, pwd)
|
|
||||||
|
|
||||||
if re.Ok {
|
|
||||||
c.UpdateSession("Email", email);
|
|
||||||
}
|
|
||||||
|
|
||||||
return c.RenderRe(re)
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------
|
//-----------------
|
||||||
// 用户偏爱
|
// 用户偏爱
|
||||||
func (c User) UpdateColumnWidth(notebookWidth, noteListWidth, mdEditorWidth int) revel.Result {
|
func (c User) UpdateColumnWidth(notebookWidth, noteListWidth, mdEditorWidth int) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
re.Ok = userService.UpdateColumnWidth(c.GetUserId(), notebookWidth, noteListWidth, mdEditorWidth)
|
re.Ok = userService.UpdateColumnWidth(c.GetUserId(), notebookWidth, noteListWidth, mdEditorWidth)
|
||||||
if re.Ok {
|
if re.Ok {
|
||||||
c.UpdateSession("NotebookWidth", strconv.Itoa(notebookWidth));
|
c.UpdateSession("NotebookWidth", strconv.Itoa(notebookWidth))
|
||||||
c.UpdateSession("NoteListWidth", strconv.Itoa(noteListWidth));
|
c.UpdateSession("NoteListWidth", strconv.Itoa(noteListWidth))
|
||||||
c.UpdateSession("MdEditorWidth", strconv.Itoa(mdEditorWidth));
|
c.UpdateSession("MdEditorWidth", strconv.Itoa(mdEditorWidth))
|
||||||
|
|
||||||
LogJ(c.Session)
|
LogJ(c.Session)
|
||||||
}
|
}
|
||||||
@@ -187,9 +151,9 @@ func (c User) UpdateLeftIsMin(leftIsMin bool) revel.Result {
|
|||||||
re.Ok = userService.UpdateLeftIsMin(c.GetUserId(), leftIsMin)
|
re.Ok = userService.UpdateLeftIsMin(c.GetUserId(), leftIsMin)
|
||||||
if re.Ok {
|
if re.Ok {
|
||||||
if leftIsMin {
|
if leftIsMin {
|
||||||
c.UpdateSession("LeftIsMin", "1");
|
c.UpdateSession("LeftIsMin", "1")
|
||||||
} else {
|
} else {
|
||||||
c.UpdateSession("LeftIsMin", "0");
|
c.UpdateSession("LeftIsMin", "0")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return c.RenderJson(re)
|
return c.RenderJson(re)
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
package admin
|
package admin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
// "github.com/revel/revel"
|
// "github.com/revel/revel"
|
||||||
// "gopkg.in/mgo.v2/bson"
|
// "gopkg.in/mgo.v2/bson"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
|
||||||
"github.com/leanote/leanote/app/controllers"
|
"github.com/leanote/leanote/app/controllers"
|
||||||
// "io/ioutil"
|
. "github.com/leanote/leanote/app/lea"
|
||||||
// "fmt"
|
// "io/ioutil"
|
||||||
// "math"
|
// "fmt"
|
||||||
// "strconv"
|
// "math"
|
||||||
|
// "strconv"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -20,23 +20,23 @@ type AdminBaseController struct {
|
|||||||
|
|
||||||
// 得到sorterField 和 isAsc
|
// 得到sorterField 和 isAsc
|
||||||
// okSorter = ['email', 'username']
|
// okSorter = ['email', 'username']
|
||||||
func (c AdminBaseController) getSorter(sorterField string, isAsc bool, okSorter []string) (string, bool){
|
func (c AdminBaseController) getSorter(sorterField string, isAsc bool, okSorter []string) (string, bool) {
|
||||||
sorter := ""
|
sorter := ""
|
||||||
c.Params.Bind(&sorter, "sorter")
|
c.Params.Bind(&sorter, "sorter")
|
||||||
if sorter == "" {
|
if sorter == "" {
|
||||||
return sorterField, isAsc;
|
return sorterField, isAsc
|
||||||
}
|
}
|
||||||
|
|
||||||
// sorter形式 email-up, email-down
|
// sorter形式 email-up, email-down
|
||||||
s2 := strings.Split(sorter, "-")
|
s2 := strings.Split(sorter, "-")
|
||||||
if len(s2) != 2 {
|
if len(s2) != 2 {
|
||||||
return sorterField, isAsc;
|
return sorterField, isAsc
|
||||||
}
|
}
|
||||||
|
|
||||||
// 必须是可用的sorter
|
// 必须是可用的sorter
|
||||||
if okSorter != nil && len(okSorter) > 0 {
|
if okSorter != nil && len(okSorter) > 0 {
|
||||||
if !InArray(okSorter, s2[0]) {
|
if !InArray(okSorter, s2[0]) {
|
||||||
return sorterField, isAsc;
|
return sorterField, isAsc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ func (c AdminBaseController) getSorter(sorterField string, isAsc bool, okSorter
|
|||||||
isAsc = false
|
isAsc = false
|
||||||
}
|
}
|
||||||
c.RenderArgs["sorter"] = sorter
|
c.RenderArgs["sorter"] = sorter
|
||||||
return sorterField, isAsc;
|
return sorterField, isAsc
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminBaseController) updateConfig(keys []string) {
|
func (c AdminBaseController) updateConfig(keys []string) {
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package admin
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -15,16 +15,16 @@ type AdminBlog struct {
|
|||||||
// admin 主页
|
// admin 主页
|
||||||
func (c AdminBlog) Index(sorter, keywords string) revel.Result {
|
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.RenderArgs["pageInfo"] = pageInfo
|
||||||
c.RenderArgs["blogs"] = blogs
|
c.RenderArgs["blogs"] = blogs
|
||||||
c.RenderArgs["keywords"] = keywords
|
c.RenderArgs["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)
|
||||||
}
|
}
|
||||||
@@ -21,7 +21,7 @@ func (c Admin) Index() revel.Result {
|
|||||||
c.RenderArgs["countNote"] = noteService.CountNote("")
|
c.RenderArgs["countNote"] = noteService.CountNote("")
|
||||||
c.RenderArgs["countBlog"] = noteService.CountBlog("")
|
c.RenderArgs["countBlog"] = noteService.CountBlog("")
|
||||||
|
|
||||||
return c.RenderTemplate("admin/index.html");
|
return c.RenderTemplate("admin/index.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 模板
|
// 模板
|
||||||
@@ -35,5 +35,5 @@ func (c Admin) T(t string) revel.Result {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c Admin) GetView(view string) revel.Result {
|
func (c Admin) GetView(view string) revel.Result {
|
||||||
return c.RenderTemplate("admin/" + view);
|
return c.RenderTemplate("admin/" + view)
|
||||||
}
|
}
|
||||||
@@ -1,13 +1,13 @@
|
|||||||
package admin
|
package admin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
|
||||||
. "github.com/leanote/leanote/app/lea"
|
|
||||||
"github.com/leanote/leanote/app/info"
|
|
||||||
"archive/tar"
|
"archive/tar"
|
||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
"os"
|
"github.com/leanote/leanote/app/info"
|
||||||
|
. "github.com/leanote/leanote/app/lea"
|
||||||
|
"github.com/revel/revel"
|
||||||
"io"
|
"io"
|
||||||
|
"os"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -22,12 +22,12 @@ func (c AdminData) Index() revel.Result {
|
|||||||
// 逆序之
|
// 逆序之
|
||||||
backups2 := make([]map[string]string, len(backups))
|
backups2 := make([]map[string]string, len(backups))
|
||||||
j := 0
|
j := 0
|
||||||
for i := len(backups)-1; i >= 0; i-- {
|
for i := len(backups) - 1; i >= 0; i-- {
|
||||||
backups2[j] = backups[i]
|
backups2[j] = backups[i]
|
||||||
j++
|
j++
|
||||||
}
|
}
|
||||||
c.RenderArgs["backups"] = backups2
|
c.RenderArgs["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 {
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package admin
|
package admin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
|
||||||
. "github.com/leanote/leanote/app/lea"
|
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
"strings"
|
. "github.com/leanote/leanote/app/lea"
|
||||||
|
"github.com/revel/revel"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// admin 首页
|
// admin 首页
|
||||||
@@ -25,7 +25,7 @@ func (c AdminEmail) Blog() revel.Result {
|
|||||||
newTags := configService.GetGlobalArrayConfig("newTags")
|
newTags := configService.GetGlobalArrayConfig("newTags")
|
||||||
c.RenderArgs["recommendTags"] = strings.Join(recommendTags, ",")
|
c.RenderArgs["recommendTags"] = strings.Join(recommendTags, ",")
|
||||||
c.RenderArgs["newTags"] = strings.Join(newTags, ",")
|
c.RenderArgs["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 {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
@@ -41,14 +41,17 @@ func (c AdminEmail) DoBlogTag(recommendTags, newTags string) revel.Result {
|
|||||||
func (c AdminEmail) Demo() revel.Result {
|
func (c AdminEmail) Demo() revel.Result {
|
||||||
c.RenderArgs["demoUsername"] = configService.GetGlobalStringConfig("demoUsername")
|
c.RenderArgs["demoUsername"] = configService.GetGlobalStringConfig("demoUsername")
|
||||||
c.RenderArgs["demoPassword"] = configService.GetGlobalStringConfig("demoPassword")
|
c.RenderArgs["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 {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
|
|
||||||
userInfo := authService.Login(demoUsername, demoPassword)
|
userInfo, err := authService.Login(demoUsername, demoPassword)
|
||||||
|
if err != nil {
|
||||||
|
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,7 +66,7 @@ func (c AdminEmail) DoDemo(demoUsername, demoPassword string) revel.Result {
|
|||||||
// 长微博的bin路径phantomJs
|
// 长微博的bin路径phantomJs
|
||||||
func (c AdminEmail) ToImage() revel.Result {
|
func (c AdminEmail) ToImage() revel.Result {
|
||||||
c.RenderArgs["toImageBinPath"] = configService.GetGlobalStringConfig("toImageBinPath")
|
c.RenderArgs["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()
|
||||||
@@ -129,13 +132,13 @@ func (c AdminEmail) SendEmailToEmails(sendEmails, latestEmailSubject, latestEmai
|
|||||||
if saveAsOldEmail {
|
if saveAsOldEmail {
|
||||||
oldEmails := configService.GetGlobalMapConfig("oldEmails")
|
oldEmails := configService.GetGlobalMapConfig("oldEmails")
|
||||||
oldEmails[latestEmailSubject] = latestEmailBody
|
oldEmails[latestEmailSubject] = latestEmailBody
|
||||||
configService.UpdateGlobalMapConfig(c.GetUserId(), "oldEmails", oldEmails);
|
configService.UpdateGlobalMapConfig(c.GetUserId(), "oldEmails", oldEmails)
|
||||||
}
|
}
|
||||||
|
|
||||||
sendEmails = strings.Replace(sendEmails, "\r", "", -1)
|
sendEmails = strings.Replace(sendEmails, "\r", "", -1)
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,7 +156,7 @@ func (c AdminEmail) SendToUsers2(emails, latestEmailSubject, latestEmailBody str
|
|||||||
if saveAsOldEmail {
|
if saveAsOldEmail {
|
||||||
oldEmails := configService.GetGlobalMapConfig("oldEmails")
|
oldEmails := configService.GetGlobalMapConfig("oldEmails")
|
||||||
oldEmails[latestEmailSubject] = latestEmailBody
|
oldEmails[latestEmailSubject] = latestEmailBody
|
||||||
configService.UpdateGlobalMapConfig(c.GetUserId(), "oldEmails", oldEmails);
|
configService.UpdateGlobalMapConfig(c.GetUserId(), "oldEmails", oldEmails)
|
||||||
}
|
}
|
||||||
|
|
||||||
emails = strings.Replace(emails, "\r", "", -1)
|
emails = strings.Replace(emails, "\r", "", -1)
|
||||||
@@ -162,14 +165,13 @@ func (c AdminEmail) SendToUsers2(emails, latestEmailSubject, latestEmailBody str
|
|||||||
users := userService.ListUserInfosByEmails(emailsArr)
|
users := userService.ListUserInfosByEmails(emailsArr)
|
||||||
LogJ(emailsArr)
|
LogJ(emailsArr)
|
||||||
|
|
||||||
|
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
|
||||||
func (c AdminEmail) SendEmailDialog(emails string) revel.Result{
|
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")
|
||||||
|
|
||||||
@@ -177,7 +179,7 @@ func (c AdminEmail) SendEmailDialog(emails string) revel.Result{
|
|||||||
c.RenderArgs["str"] = configService.GlobalStringConfigs
|
c.RenderArgs["str"] = configService.GlobalStringConfigs
|
||||||
c.RenderArgs["map"] = configService.GlobalMapConfigs
|
c.RenderArgs["map"] = configService.GlobalMapConfigs
|
||||||
|
|
||||||
return c.RenderTemplate("admin/email/emailDialog.html");
|
return c.RenderTemplate("admin/email/emailDialog.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminEmail) SendToUsers(userFilterEmail, userFilterWhiteList, userFilterBlackList, latestEmailSubject, latestEmailBody string, verified, saveAsOldEmail bool) revel.Result {
|
func (c AdminEmail) SendToUsers(userFilterEmail, userFilterWhiteList, userFilterBlackList, latestEmailSubject, latestEmailBody string, verified, saveAsOldEmail bool) revel.Result {
|
||||||
@@ -193,19 +195,19 @@ func (c AdminEmail) SendToUsers(userFilterEmail, userFilterWhiteList, userFilter
|
|||||||
if saveAsOldEmail {
|
if saveAsOldEmail {
|
||||||
oldEmails := configService.GetGlobalMapConfig("oldEmails")
|
oldEmails := configService.GetGlobalMapConfig("oldEmails")
|
||||||
oldEmails[latestEmailSubject] = latestEmailBody
|
oldEmails[latestEmailSubject] = latestEmailBody
|
||||||
configService.UpdateGlobalMapConfig(c.GetUserId(), "oldEmails", oldEmails);
|
configService.UpdateGlobalMapConfig(c.GetUserId(), "oldEmails", oldEmails)
|
||||||
}
|
}
|
||||||
|
|
||||||
users := userService.GetAllUserByFilter(userFilterEmail, userFilterWhiteList, userFilterBlackList, verified)
|
users := userService.GetAllUserByFilter(userFilterEmail, userFilterWhiteList, userFilterBlackList, verified)
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,10 +226,10 @@ func (c AdminEmail) DeleteEmails(ids string) revel.Result {
|
|||||||
|
|
||||||
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.RenderArgs["pageInfo"] = pageInfo
|
||||||
c.RenderArgs["emails"] = emails
|
c.RenderArgs["emails"] = emails
|
||||||
c.RenderArgs["keywords"] = keywords
|
c.RenderArgs["keywords"] = keywords
|
||||||
return c.RenderTemplate("admin/email/list.html");
|
return c.RenderTemplate("admin/email/list.html")
|
||||||
}
|
}
|
||||||
@@ -2,10 +2,10 @@ package admin
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
|
"fmt"
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
"strings"
|
"strings"
|
||||||
"fmt"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// admin 首页
|
// admin 首页
|
||||||
@@ -25,7 +25,7 @@ func (c AdminSetting) Blog() revel.Result {
|
|||||||
newTags := configService.GetGlobalArrayConfig("newTags")
|
newTags := configService.GetGlobalArrayConfig("newTags")
|
||||||
c.RenderArgs["recommendTags"] = strings.Join(recommendTags, ",")
|
c.RenderArgs["recommendTags"] = strings.Join(recommendTags, ",")
|
||||||
c.RenderArgs["newTags"] = strings.Join(newTags, ",")
|
c.RenderArgs["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 {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
@@ -42,7 +42,7 @@ func (c AdminSetting) ShareNote(registerSharedUserId string,
|
|||||||
registerSharedNotebookIds, registerSharedNoteIds, registerCopyNoteIds []string) revel.Result {
|
registerSharedNotebookIds, registerSharedNoteIds, registerCopyNoteIds []string) revel.Result {
|
||||||
|
|
||||||
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,14 +51,18 @@ func (c AdminSetting) ShareNote(registerSharedUserId string,
|
|||||||
func (c AdminSetting) Demo() revel.Result {
|
func (c AdminSetting) Demo() revel.Result {
|
||||||
c.RenderArgs["demoUsername"] = configService.GetGlobalStringConfig("demoUsername")
|
c.RenderArgs["demoUsername"] = configService.GetGlobalStringConfig("demoUsername")
|
||||||
c.RenderArgs["demoPassword"] = configService.GetGlobalStringConfig("demoPassword")
|
c.RenderArgs["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 {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
|
|
||||||
userInfo := authService.Login(demoUsername, demoPassword)
|
userInfo, err := authService.Login(demoUsername, demoPassword)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println(err)
|
||||||
|
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)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,15 +73,15 @@ func (c AdminSetting) DoDemo(demoUsername, demoPassword string) revel.Result {
|
|||||||
return c.RenderJson(re)
|
return c.RenderJson(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToImage
|
func (c AdminSetting) ExportPdf(path string) revel.Result {
|
||||||
// 长微博的bin路径phantomJs
|
|
||||||
func (c AdminSetting) ToImage() revel.Result {
|
|
||||||
c.RenderArgs["toImageBinPath"] = configService.GetGlobalStringConfig("toImageBinPath")
|
|
||||||
return c.RenderTemplate("admin/setting/toImage.html");
|
|
||||||
}
|
|
||||||
func (c AdminSetting) 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(), "exportPdfBinPath", path)
|
||||||
|
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)
|
return c.RenderJson(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,7 +94,7 @@ func (c AdminSetting) SubDomain() revel.Result {
|
|||||||
c.RenderArgs["blogSubDomain"] = configService.GetGlobalStringConfig("blogSubDomain")
|
c.RenderArgs["blogSubDomain"] = configService.GetGlobalStringConfig("blogSubDomain")
|
||||||
c.RenderArgs["leaSubDomain"] = configService.GetGlobalStringConfig("leaSubDomain")
|
c.RenderArgs["leaSubDomain"] = configService.GetGlobalStringConfig("leaSubDomain")
|
||||||
|
|
||||||
return c.RenderTemplate("admin/setting/subDomain.html");
|
return c.RenderTemplate("admin/setting/subDomain.html")
|
||||||
}
|
}
|
||||||
func (c AdminSetting) DoSubDomain(noteSubDomain, blogSubDomain, leaSubDomain, blackSubDomains, allowCustomDomain, blackCustomDomains string) revel.Result {
|
func (c AdminSetting) DoSubDomain(noteSubDomain, blogSubDomain, leaSubDomain, blackSubDomains, allowCustomDomain, blackCustomDomains string) revel.Result {
|
||||||
re := info.NewRe()
|
re := info.NewRe()
|
||||||
|
|||||||
@@ -2,9 +2,9 @@ package admin
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
// "io/ioutil"
|
// "io/ioutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Upgrade controller
|
// Upgrade controller
|
||||||
@@ -14,7 +14,7 @@ type AdminUpgrade struct {
|
|||||||
|
|
||||||
func (c AdminUpgrade) UpgradeBlog() revel.Result {
|
func (c AdminUpgrade) UpgradeBlog() revel.Result {
|
||||||
upgradeService.UpgradeBlog()
|
upgradeService.UpgradeBlog()
|
||||||
return nil;
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminUpgrade) UpgradeBetaToBeta2() revel.Result {
|
func (c AdminUpgrade) UpgradeBetaToBeta2() revel.Result {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package admin
|
package admin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
|
||||||
. "github.com/leanote/leanote/app/lea"
|
. "github.com/leanote/leanote/app/lea"
|
||||||
// "time"
|
"github.com/revel/revel"
|
||||||
|
// "time"
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -15,32 +15,33 @@ type AdminUser struct {
|
|||||||
|
|
||||||
// admin 主页
|
// admin 主页
|
||||||
var userPageSize = 10
|
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 userPageSize == 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.RenderArgs["pageInfo"] = pageInfo
|
||||||
c.RenderArgs["users"] = users
|
c.RenderArgs["users"] = users
|
||||||
c.RenderArgs["keywords"] = keywords
|
c.RenderArgs["keywords"] = keywords
|
||||||
return c.RenderTemplate("admin/user/list.html");
|
return c.RenderTemplate("admin/user/list.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminUser) Add() revel.Result {
|
func (c AdminUser) Add() revel.Result {
|
||||||
return c.RenderTemplate("admin/user/add.html");
|
return c.RenderTemplate("admin/user/add.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加
|
// 添加
|
||||||
func (c AdminUser) Register(email, pwd string) revel.Result {
|
func (c AdminUser) Register(email, pwd string) revel.Result {
|
||||||
re := info.NewRe();
|
re := info.NewRe()
|
||||||
|
|
||||||
if re.Ok, re.Msg = Vd("email", email); !re.Ok {
|
if re.Ok, re.Msg = Vd("email", email); !re.Ok {
|
||||||
return c.RenderRe(re);
|
return c.RenderRe(re)
|
||||||
}
|
}
|
||||||
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
||||||
return c.RenderRe(re);
|
return c.RenderRe(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册
|
// 注册
|
||||||
@@ -53,13 +54,13 @@ 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.RenderArgs["userInfo"] = userInfo
|
||||||
return c.RenderTemplate("admin/user/reset_pwd.html");
|
return c.RenderTemplate("admin/user/reset_pwd.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c AdminUser) DoResetPwd(userId, pwd string) revel.Result {
|
func (c AdminUser) DoResetPwd(userId, pwd string) revel.Result {
|
||||||
re := info.NewRe();
|
re := info.NewRe()
|
||||||
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
if re.Ok, re.Msg = Vd("password", pwd); !re.Ok {
|
||||||
return c.RenderRe(re);
|
return c.RenderRe(re)
|
||||||
}
|
}
|
||||||
re.Ok, re.Msg = userService.ResetPwd(c.GetUserId(), userId, pwd)
|
re.Ok, re.Msg = userService.ResetPwd(c.GetUserId(), userId, pwd)
|
||||||
return c.RenderRe(re)
|
return c.RenderRe(re)
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
package admin
|
package admin
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/service"
|
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
"github.com/leanote/leanote/app/service"
|
||||||
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "strings"
|
// "strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
var userService *service.UserService
|
var userService *service.UserService
|
||||||
@@ -42,7 +42,7 @@ var commonUrl = map[string]map[string]bool{"Index": map[string]bool{"Index": tru
|
|||||||
"FindPassword2": true,
|
"FindPassword2": true,
|
||||||
"FindPasswordUpdate": true,
|
"FindPasswordUpdate": true,
|
||||||
"Suggestion": true,
|
"Suggestion": true,
|
||||||
},
|
},
|
||||||
"Blog": map[string]bool{"Index": true,
|
"Blog": map[string]bool{"Index": true,
|
||||||
"View": true,
|
"View": true,
|
||||||
"AboutMe": true,
|
"AboutMe": true,
|
||||||
@@ -50,12 +50,13 @@ var commonUrl = map[string]map[string]bool{"Index": map[string]bool{"Index": tru
|
|||||||
},
|
},
|
||||||
// 用户的激活与修改邮箱都不需要登录, 通过链接地址
|
// 用户的激活与修改邮箱都不需要登录, 通过链接地址
|
||||||
"User": map[string]bool{"UpdateEmail": true,
|
"User": map[string]bool{"UpdateEmail": true,
|
||||||
"ActiveEmail":true,
|
"ActiveEmail": true,
|
||||||
},
|
},
|
||||||
"Oauth": map[string]bool{"GithubCallback": true},
|
"Oauth": map[string]bool{"GithubCallback": true},
|
||||||
"File": map[string]bool{"OutputImage": true, "OutputFile": true},
|
"File": map[string]bool{"OutputImage": true, "OutputFile": true},
|
||||||
"Attach": map[string]bool{"Download": true, "DownloadAll": true},
|
"Attach": map[string]bool{"Download": true, "DownloadAll": true},
|
||||||
}
|
}
|
||||||
|
|
||||||
func needValidate(controller, method string) bool {
|
func needValidate(controller, method string) bool {
|
||||||
// 在里面
|
// 在里面
|
||||||
if v, ok := commonUrl[controller]; ok {
|
if v, ok := commonUrl[controller]; ok {
|
||||||
@@ -66,7 +67,7 @@ func needValidate(controller, method string) bool {
|
|||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
// controller不在这里的, 肯定要验证
|
// controller不在这里的, 肯定要验证
|
||||||
return true;
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func AuthInterceptor(c *revel.Controller) revel.Result {
|
func AuthInterceptor(c *revel.Controller) revel.Result {
|
||||||
@@ -110,7 +111,7 @@ func InitService() {
|
|||||||
tokenService = service.TokenS
|
tokenService = service.TokenS
|
||||||
noteImageService = service.NoteImageS
|
noteImageService = service.NoteImageS
|
||||||
fileService = service.FileS
|
fileService = service.FileS
|
||||||
albumService= service.AlbumS
|
albumService = service.AlbumS
|
||||||
attachService = service.AttachS
|
attachService = service.AttachS
|
||||||
pwdService = service.PwdS
|
pwdService = service.PwdS
|
||||||
suggestionService = service.SuggestionS
|
suggestionService = service.SuggestionS
|
||||||
|
|||||||
@@ -24,8 +24,8 @@ type ApiAuth struct {
|
|||||||
func (c ApiAuth) Login(email, pwd string) revel.Result {
|
func (c ApiAuth) Login(email, pwd string) revel.Result {
|
||||||
var msg = ""
|
var msg = ""
|
||||||
|
|
||||||
userInfo := authService.Login(email, pwd)
|
userInfo, err := authService.Login(email, pwd)
|
||||||
if userInfo.Email != "" {
|
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})
|
||||||
|
|||||||
@@ -4,11 +4,11 @@ import (
|
|||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
|
||||||
"github.com/leanote/leanote/app/controllers"
|
"github.com/leanote/leanote/app/controllers"
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
|
. "github.com/leanote/leanote/app/lea"
|
||||||
"os"
|
"os"
|
||||||
// "fmt"
|
// "fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
// "fmt"
|
// "fmt"
|
||||||
// "math"
|
// "math"
|
||||||
@@ -43,7 +43,7 @@ func (c ApiBaseContrller) getUserInfo() info.User {
|
|||||||
|
|
||||||
// 上传附件
|
// 上传附件
|
||||||
func (c ApiBaseContrller) uploadAttach(name string, noteId string) (ok bool, msg string, id string) {
|
func (c ApiBaseContrller) uploadAttach(name string, noteId string) (ok bool, msg string, id string) {
|
||||||
userId := c.getUserId();
|
userId := c.getUserId()
|
||||||
|
|
||||||
// 判断是否有权限为笔记添加附件
|
// 判断是否有权限为笔记添加附件
|
||||||
// 如果笔记还没有添加是不是会有问题
|
// 如果笔记还没有添加是不是会有问题
|
||||||
@@ -64,17 +64,20 @@ func (c ApiBaseContrller) uploadAttach(name string, noteId string) (ok bool, msg
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
// > 5M?
|
// > 5M?
|
||||||
maxFileSize := configService.GetUploadSize("uploadAttachSize");
|
maxFileSize := configService.GetUploadSize("uploadAttachSize")
|
||||||
if maxFileSize <= 0 {
|
if maxFileSize <= 0 {
|
||||||
maxFileSize = 1000
|
maxFileSize = 1000
|
||||||
}
|
}
|
||||||
if(float64(len(data)) > maxFileSize * float64(1024*1024)) {
|
if float64(len(data)) > maxFileSize*float64(1024*1024) {
|
||||||
msg = "fileIsTooLarge"
|
msg = "fileIsTooLarge"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 生成上传路径
|
// 生成上传路径
|
||||||
filePath := "files/" + userId + "/attachs"
|
newGuid := NewGuid()
|
||||||
|
// filePath := "files/" + Digest3(userId) + "/" + userId + "/" + Digest2(newGuid) + "/attachs"
|
||||||
|
filePath := "files/" + GetRandomFilePath(userId, newGuid) + "/attachs"
|
||||||
|
|
||||||
dir := revel.BasePath + "/" + filePath
|
dir := revel.BasePath + "/" + filePath
|
||||||
err = os.MkdirAll(dir, 0755)
|
err = os.MkdirAll(dir, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -83,8 +86,8 @@ func (c ApiBaseContrller) uploadAttach(name string, noteId string) (ok bool, msg
|
|||||||
// 生成新的文件名
|
// 生成新的文件名
|
||||||
filename := handel.Filename
|
filename := handel.Filename
|
||||||
_, ext := SplitFilename(filename) // .doc
|
_, ext := SplitFilename(filename) // .doc
|
||||||
filename = NewGuid() + ext
|
filename = newGuid + ext
|
||||||
toPath := dir + "/" + filename;
|
toPath := dir + "/" + filename
|
||||||
err = ioutil.WriteFile(toPath, data, 0777)
|
err = ioutil.WriteFile(toPath, data, 0777)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@@ -124,8 +127,13 @@ func (c ApiBaseContrller) upload(name string, noteId string, isAttach bool) (ok
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
defer file.Close()
|
defer file.Close()
|
||||||
|
|
||||||
|
newGuid := NewGuid()
|
||||||
// 生成上传路径
|
// 生成上传路径
|
||||||
fileUrlPath := "files/" + c.getUserId() + "/images"
|
userId := c.getUserId()
|
||||||
|
// fileUrlPath := "files/" + Digest3(userId) + "/" + userId + "/" + Digest2(newGuid) + "/images"
|
||||||
|
fileUrlPath := "files/" + GetRandomFilePath(userId, newGuid) + "/images"
|
||||||
|
|
||||||
dir := revel.BasePath + "/" + fileUrlPath
|
dir := revel.BasePath + "/" + fileUrlPath
|
||||||
err = os.MkdirAll(dir, 0755)
|
err = os.MkdirAll(dir, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -134,29 +142,29 @@ 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)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
maxFileSize := configService.GetUploadSize("uploadImageSize");
|
maxFileSize := configService.GetUploadSize("uploadImageSize")
|
||||||
if maxFileSize <= 0 {
|
if maxFileSize <= 0 {
|
||||||
maxFileSize = 1000
|
maxFileSize = 1000
|
||||||
}
|
}
|
||||||
|
|
||||||
// > 2M?
|
// > 2M?
|
||||||
if(float64(len(data)) > maxFileSize * float64(1024*1024)) {
|
if float64(len(data)) > maxFileSize*float64(1024*1024) {
|
||||||
msg = "fileIsTooLarge"
|
msg = "fileIsTooLarge"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
toPath := dir + "/" + filename;
|
toPath := dir + "/" + filename
|
||||||
err = ioutil.WriteFile(toPath, data, 0777)
|
err = ioutil.WriteFile(toPath, data, 0777)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -3,18 +3,18 @@ package api
|
|||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
// "gopkg.in/mgo.v2/bson"
|
// "gopkg.in/mgo.v2/bson"
|
||||||
// "github.com/leanote/leanote/app/lea/netutil"
|
// "github.com/leanote/leanote/app/lea/netutil"
|
||||||
// "github.com/leanote/leanote/app/info"
|
// "github.com/leanote/leanote/app/info"
|
||||||
// "io/ioutil"
|
// "io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
// "strconv"
|
// "strconv"
|
||||||
"io"
|
|
||||||
"time"
|
|
||||||
"strings"
|
|
||||||
"archive/tar"
|
"archive/tar"
|
||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
|
"io"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 文件操作, 图片, 头像上传, 输出
|
// 文件操作, 图片, 头像上传, 输出
|
||||||
@@ -73,7 +73,7 @@ func (c ApiFile) GetImage(fileId string) revel.Result {
|
|||||||
// 下载附件
|
// 下载附件
|
||||||
// [OK]
|
// [OK]
|
||||||
func (c ApiFile) GetAttach(fileId string) revel.Result {
|
func (c ApiFile) GetAttach(fileId string) revel.Result {
|
||||||
attach := attachService.GetAttach(fileId, c.getUserId()); // 得到路径
|
attach := attachService.GetAttach(fileId, c.getUserId()) // 得到路径
|
||||||
path := attach.Path
|
path := attach.Path
|
||||||
if path == "" {
|
if path == "" {
|
||||||
return c.RenderText("No Such File")
|
return c.RenderText("No Such File")
|
||||||
@@ -154,11 +154,10 @@ func (c ApiFile) GetAllAttachs(noteId string) revel.Result {
|
|||||||
}
|
}
|
||||||
} // for
|
} // for
|
||||||
|
|
||||||
// tw.Close()
|
// tw.Close()
|
||||||
// gw.Close()
|
// gw.Close()
|
||||||
// fw.Close()
|
// fw.Close()
|
||||||
// file, _ := os.Open(dir + "/" + filename)
|
// file, _ := os.Open(dir + "/" + filename)
|
||||||
// fw.Seek(0, 0)
|
// fw.Seek(0, 0)
|
||||||
return c.RenderBinary(fw, filename, revel.Attachment, time.Now()) // revel.Attachment
|
return c.RenderBinary(fw, filename, revel.Attachment, time.Now()) // revel.Attachment
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6,7 +6,8 @@ import (
|
|||||||
"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"
|
||||||
"regexp"
|
"os"
|
||||||
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
// "github.com/leanote/leanote/app/types"
|
// "github.com/leanote/leanote/app/types"
|
||||||
@@ -70,6 +71,7 @@ func (c ApiNote) GetNotes(notebookId string) revel.Result {
|
|||||||
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))
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// get Note
|
// get Note
|
||||||
@@ -82,7 +84,6 @@ func (c ApiNote) GetTrashNotes() revel.Result {
|
|||||||
"Title": "asdfadsf--=",
|
"Title": "asdfadsf--=",
|
||||||
"Desc": "",
|
"Desc": "",
|
||||||
"Tags": [
|
"Tags": [
|
||||||
""
|
|
||||||
],
|
],
|
||||||
"Abstract": "",
|
"Abstract": "",
|
||||||
"Content": "",
|
"Content": "",
|
||||||
@@ -92,7 +93,7 @@ func (c ApiNote) GetTrashNotes() revel.Result {
|
|||||||
"Usn": 8,
|
"Usn": 8,
|
||||||
"Files": [
|
"Files": [
|
||||||
{
|
{
|
||||||
"FileId": "551975d599c37b970f000002",
|
"FileId": "551975d599c37b970f000000",
|
||||||
"LocalFileId": "",
|
"LocalFileId": "",
|
||||||
"Type": "",
|
"Type": "",
|
||||||
"Title": "",
|
"Title": "",
|
||||||
@@ -100,18 +101,18 @@ func (c ApiNote) GetTrashNotes() revel.Result {
|
|||||||
"IsAttach": false
|
"IsAttach": false
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"FileId": "551975de99c37b970f000003",
|
"FileId": "551975de99c37b970f000001",
|
||||||
"LocalFileId": "",
|
"LocalFileId": "",
|
||||||
"Type": "doc",
|
"Type": "doc",
|
||||||
"Title": "李铁-简历-ali-print-en.doc",
|
"Title": "李铁-print-en.doc",
|
||||||
"HasBody": false,
|
"HasBody": false,
|
||||||
"IsAttach": true
|
"IsAttach": true
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"FileId": "551975de99c37b970f000004",
|
"FileId": "551975de99c37b970f000002",
|
||||||
"LocalFileId": "",
|
"LocalFileId": "",
|
||||||
"Type": "doc",
|
"Type": "doc",
|
||||||
"Title": "李铁-简历-ali-print.doc",
|
"Title": "李铁-print.doc",
|
||||||
"HasBody": false,
|
"HasBody": false,
|
||||||
"IsAttach": true
|
"IsAttach": true
|
||||||
}
|
}
|
||||||
@@ -145,68 +146,10 @@ 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 = noteAndContent.Content
|
apiNote.Content = noteService.FixContent(noteAndContent.Content, noteAndContent.IsMarkdown)
|
||||||
return c.RenderJson(apiNote)
|
return c.RenderJson(apiNote)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理笔记内容数据 http://leanote.com/file/outputImage -> https://leanote.com/api/file/getImage
|
|
||||||
// 图片, 附件都替换
|
|
||||||
func (c ApiNote) fixContent(content string) string {
|
|
||||||
// TODO, 这个url需要从config中取
|
|
||||||
// baseUrl := "http://leanote.com"
|
|
||||||
baseUrl := configService.GetSiteUrl()
|
|
||||||
// baseUrl := "http://localhost:9000"
|
|
||||||
|
|
||||||
patterns := []map[string]string{
|
|
||||||
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/downloadAll", "param": "noteId", "to": "getAllAttachs?noteId="},
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, eachPattern := range patterns {
|
|
||||||
|
|
||||||
// src="http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1"
|
|
||||||
// href="http://leanote.com/attach/download?attachId=5504243a38f4111dcb00017d"
|
|
||||||
// href="http://leanote.com/attach/downloadAll?noteId=55041b6a38f4111dcb000159"
|
|
||||||
|
|
||||||
regImage, _ := regexp.Compile(eachPattern["src"] + `=('|")`+ baseUrl + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})("|')`)
|
|
||||||
findsImage := regImage.FindAllStringSubmatch(content, -1) // 查找所有的
|
|
||||||
|
|
||||||
// [[src='http://leanote.com/file/outputImage?fileId=54672e8d38f411286b000069" ' 54672e8d38f411286b000069 "] [src="http://leanote.com/file/outputImage?fileId=54672e8d38f411286b000069" " 54672e8d38f411286b000069 "] [src="http://leanote.com/file/outputImage?fileId=54672e8d38f411286b000069" " 54672e8d38f411286b000069 "] [src="http://leanote.com/file/outputImage?fileId=54672e8d38f411286b000069" " 54672e8d38f411286b000069 "]]
|
|
||||||
for _, eachFind := range findsImage {
|
|
||||||
// [src='http://leanote.com/file/outputImage?fileId=54672e8d38f411286b000069" ' 54672e8d38f411286b000069 "]
|
|
||||||
if len(eachFind) == 4 {
|
|
||||||
content = strings.Replace(content,
|
|
||||||
eachFind[0],
|
|
||||||
eachPattern["src"] + "=\"" + baseUrl + "/api/file/" + eachPattern["to"] + eachFind[2] + "\"",
|
|
||||||
1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// markdown处理
|
|
||||||
// 
|
|
||||||
// [selection 2.html](http://leanote.com/attach/download?attachId=5504262638f4111dcb00017f)
|
|
||||||
// [all.tar.gz](http://leanote.com/attach/downloadAll?noteId=5503b57d59f81b4eb4000000)
|
|
||||||
|
|
||||||
pre := "!" // 默认图片
|
|
||||||
if eachPattern["src"] == "href" { // 是attach
|
|
||||||
pre = ""
|
|
||||||
}
|
|
||||||
|
|
||||||
regImageMarkdown, _ := regexp.Compile(pre + `\[(.*?)\]\(`+ baseUrl + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})\)`)
|
|
||||||
findsImageMarkdown := regImageMarkdown.FindAllStringSubmatch(content, -1) // 查找所有的
|
|
||||||
// [[ 5503537b38f4111dcb0000d1] [ 5503537b38f4111dcb0000d1]]
|
|
||||||
for _, eachFind := range findsImageMarkdown {
|
|
||||||
// [ 你好啊, 我很好, 为什么? 5503537b38f4111dcb0000d1]
|
|
||||||
if len(eachFind) == 3 {
|
|
||||||
content = strings.Replace(content, eachFind[0], pre + "[" + eachFind[1] + "](" + baseUrl + "/api/file/" + eachPattern["to"] + eachFind[2] + ")", 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return content
|
|
||||||
}
|
|
||||||
|
|
||||||
// content里的image, attach链接是
|
// content里的image, attach链接是
|
||||||
// https://leanote.com/api/file/getImage?fileId=xx
|
// https://leanote.com/api/file/getImage?fileId=xx
|
||||||
// https://leanote.com/api/file/getAttach?fileId=xx
|
// https://leanote.com/api/file/getAttach?fileId=xx
|
||||||
@@ -219,19 +162,20 @@ func (c ApiNote) fixPostNotecontent(noteOrContent *info.ApiNote) {
|
|||||||
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)
|
noteOrContent.Content = strings.Replace(noteOrContent.Content, "fileId="+file.LocalFileId, "fileId="+file.FileId, -1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到内容
|
// 得到内容
|
||||||
// [OK]
|
|
||||||
func (c ApiNote) GetNoteContent(noteId string) revel.Result {
|
func (c ApiNote) GetNoteContent(noteId string) revel.Result {
|
||||||
|
userId := c.getUserId()
|
||||||
|
note := noteService.GetNote(noteId, userId)
|
||||||
// re := info.NewRe()
|
// re := info.NewRe()
|
||||||
noteContent := noteService.GetNoteContent(noteId, c.getUserId())
|
noteContent := noteService.GetNoteContent(noteId, userId)
|
||||||
if noteContent.Content != "" {
|
if noteContent.Content != "" {
|
||||||
noteContent.Content = c.fixContent(noteContent.Content)
|
noteContent.Content = noteService.FixContent(noteContent.Content, note.IsMarkdown)
|
||||||
}
|
}
|
||||||
|
|
||||||
apiNoteContent := info.ApiNoteContent{
|
apiNoteContent := info.ApiNoteContent{
|
||||||
@@ -240,7 +184,6 @@ func (c ApiNote) GetNoteContent(noteId string) revel.Result {
|
|||||||
Content: noteContent.Content,
|
Content: noteContent.Content,
|
||||||
}
|
}
|
||||||
|
|
||||||
// re.Item = noteContent
|
|
||||||
return c.RenderJson(apiNoteContent)
|
return c.RenderJson(apiNoteContent)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,6 +201,7 @@ func (c ApiNote) AddNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
*/
|
*/
|
||||||
// Log(noteOrContent.Title)
|
// Log(noteOrContent.Title)
|
||||||
// LogJ(noteOrContent)
|
// LogJ(noteOrContent)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
LogJ(c.Params)
|
LogJ(c.Params)
|
||||||
for name, _ := range c.Params.Files {
|
for name, _ := range c.Params.Files {
|
||||||
@@ -312,8 +256,8 @@ func (c ApiNote) AddNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
|
|
||||||
c.fixPostNotecontent(¬eOrContent)
|
c.fixPostNotecontent(¬eOrContent)
|
||||||
|
|
||||||
// Log("Add")
|
// Log("Add")
|
||||||
// LogJ(noteOrContent)
|
// LogJ(noteOrContent)
|
||||||
|
|
||||||
// return c.RenderJson(re)
|
// return c.RenderJson(re)
|
||||||
|
|
||||||
@@ -323,16 +267,21 @@ func (c ApiNote) AddNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
Title: noteOrContent.Title,
|
Title: noteOrContent.Title,
|
||||||
Tags: noteOrContent.Tags,
|
Tags: noteOrContent.Tags,
|
||||||
Desc: noteOrContent.Desc,
|
Desc: noteOrContent.Desc,
|
||||||
// ImgSrc: noteOrContent.ImgSrc,
|
// ImgSrc: noteOrContent.ImgSrc,
|
||||||
IsBlog: noteOrContent.IsBlog,
|
IsBlog: noteOrContent.IsBlog,
|
||||||
IsMarkdown: noteOrContent.IsMarkdown,
|
IsMarkdown: noteOrContent.IsMarkdown,
|
||||||
AttachNum: attachNum,
|
AttachNum: attachNum,
|
||||||
|
CreatedTime: noteOrContent.CreatedTime,
|
||||||
|
UpdatedTime: noteOrContent.UpdatedTime,
|
||||||
}
|
}
|
||||||
noteContent := info.NoteContent{NoteId: note.NoteId,
|
noteContent := info.NoteContent{NoteId: note.NoteId,
|
||||||
UserId: userId,
|
UserId: userId,
|
||||||
IsBlog: note.IsBlog,
|
IsBlog: note.IsBlog,
|
||||||
Content: noteOrContent.Content,
|
Content: noteOrContent.Content,
|
||||||
Abstract: noteOrContent.Abstract}
|
Abstract: noteOrContent.Abstract,
|
||||||
|
CreatedTime: noteOrContent.CreatedTime,
|
||||||
|
UpdatedTime: noteOrContent.UpdatedTime,
|
||||||
|
}
|
||||||
|
|
||||||
// 通过内容得到Desc, abstract
|
// 通过内容得到Desc, abstract
|
||||||
if noteOrContent.Abstract == "" {
|
if noteOrContent.Abstract == "" {
|
||||||
@@ -383,8 +332,8 @@ func (c ApiNote) UpdateNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
return c.RenderJson(re)
|
return c.RenderJson(re)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log("_____________")
|
// Log("_____________")
|
||||||
// LogJ(noteOrContent)
|
// LogJ(noteOrContent)
|
||||||
/*
|
/*
|
||||||
LogJ(c.Params.Files)
|
LogJ(c.Params.Files)
|
||||||
LogJ(c.Request.Header)
|
LogJ(c.Request.Header)
|
||||||
@@ -412,9 +361,9 @@ func (c ApiNote) UpdateNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
Log(v)
|
Log(v)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
// Log(c.Has("Files[0]"))
|
// Log(c.Has("Files[0]"))
|
||||||
if c.Has("Files[0][LocalFileId]") {
|
if c.Has("Files[0][LocalFileId]") {
|
||||||
// LogJ(c.Params.Files)
|
// LogJ(c.Params.Files)
|
||||||
if noteOrContent.Files != nil && len(noteOrContent.Files) > 0 {
|
if noteOrContent.Files != nil && len(noteOrContent.Files) > 0 {
|
||||||
for i, file := range noteOrContent.Files {
|
for i, file := range noteOrContent.Files {
|
||||||
if file.HasBody {
|
if file.HasBody {
|
||||||
@@ -442,8 +391,9 @@ func (c ApiNote) UpdateNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Log("after upload")
|
// Log("after upload")
|
||||||
// LogJ(noteOrContent.Files)
|
// LogJ(noteOrContent.Files)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 移到外面来, 删除最后一个file时也要处理, 不然总删不掉
|
// 移到外面来, 删除最后一个file时也要处理, 不然总删不掉
|
||||||
@@ -506,6 +456,8 @@ func (c ApiNote) UpdateNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
noteUpdate["UpdatedTime"] = noteOrContent.UpdatedTime
|
||||||
|
|
||||||
afterNoteUsn := 0
|
afterNoteUsn := 0
|
||||||
noteOk := false
|
noteOk := false
|
||||||
noteMsg := ""
|
noteMsg := ""
|
||||||
@@ -529,10 +481,16 @@ func (c ApiNote) UpdateNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
if noteOrContent.Abstract == "" {
|
if noteOrContent.Abstract == "" {
|
||||||
noteOrContent.Abstract = SubStringHTML(noteOrContent.Content, 200, "")
|
noteOrContent.Abstract = SubStringHTML(noteOrContent.Content, 200, "")
|
||||||
}
|
}
|
||||||
// Log("--------> afte fixed")
|
|
||||||
// Log(noteOrContent.Content)
|
// Log("--------> afte fixed")
|
||||||
|
// Log(noteOrContent.Content)
|
||||||
contentOk, contentMsg, afterContentUsn = noteService.UpdateNoteContent(c.getUserId(),
|
contentOk, contentMsg, afterContentUsn = noteService.UpdateNoteContent(c.getUserId(),
|
||||||
noteOrContent.NoteId, noteOrContent.Content, noteOrContent.Abstract, needUpdateNote, noteOrContent.Usn)
|
noteOrContent.NoteId,
|
||||||
|
noteOrContent.Content,
|
||||||
|
noteOrContent.Abstract,
|
||||||
|
needUpdateNote,
|
||||||
|
noteOrContent.Usn,
|
||||||
|
noteOrContent.UpdatedTime)
|
||||||
}
|
}
|
||||||
|
|
||||||
if needUpdateNote {
|
if needUpdateNote {
|
||||||
@@ -553,8 +511,8 @@ func (c ApiNote) UpdateNote(noteOrContent info.ApiNote) revel.Result {
|
|||||||
noteOrContent.Usn = re.Usn
|
noteOrContent.Usn = re.Usn
|
||||||
noteOrContent.UpdatedTime = time.Now()
|
noteOrContent.UpdatedTime = time.Now()
|
||||||
|
|
||||||
// Log("after upload")
|
// Log("after upload")
|
||||||
// LogJ(noteOrContent.Files)
|
// LogJ(noteOrContent.Files)
|
||||||
noteOrContent.UserId = c.getUserId()
|
noteOrContent.UserId = c.getUserId()
|
||||||
|
|
||||||
return c.RenderJson(noteOrContent)
|
return c.RenderJson(noteOrContent)
|
||||||
@@ -579,3 +537,82 @@ func (c ApiNote) GetHistories(noteId string) revel.Result {
|
|||||||
return c.RenderJson(re)
|
return c.RenderJson(re)
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// 0.2 新增
|
||||||
|
// 导出成PDF
|
||||||
|
func (c ApiNote) ExportPdf(noteId string) revel.Result {
|
||||||
|
re := info.NewApiRe()
|
||||||
|
userId := c.getUserId()
|
||||||
|
if noteId == "" {
|
||||||
|
re.Msg = "noteNotExists"
|
||||||
|
return c.RenderJson(re)
|
||||||
|
}
|
||||||
|
|
||||||
|
note := noteService.GetNoteById(noteId)
|
||||||
|
if note.NoteId == "" {
|
||||||
|
re.Msg = "noteNotExists"
|
||||||
|
return c.RenderJson(re)
|
||||||
|
}
|
||||||
|
|
||||||
|
noteUserId := note.UserId.Hex()
|
||||||
|
// 是否有权限
|
||||||
|
if noteUserId != userId {
|
||||||
|
// 是否是有权限协作的
|
||||||
|
if !note.IsBlog && !shareService.HasReadPerm(noteUserId, userId, noteId) {
|
||||||
|
re.Msg = "noteNotExists"
|
||||||
|
return c.RenderJson(re)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// path 判断是否需要重新生成之
|
||||||
|
guid := NewGuid()
|
||||||
|
fileUrlPath := "files/export_pdf"
|
||||||
|
dir := revel.BasePath + "/" + fileUrlPath
|
||||||
|
if !MkdirAll(dir) {
|
||||||
|
re.Msg = "noDir"
|
||||||
|
return c.RenderJson(re)
|
||||||
|
}
|
||||||
|
filename := guid + ".pdf"
|
||||||
|
path := dir + "/" + filename
|
||||||
|
|
||||||
|
appKey, _ := revel.Config.String("app.secretLeanote")
|
||||||
|
if appKey == "" {
|
||||||
|
appKey, _ = revel.Config.String("app.secret")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 生成之
|
||||||
|
binPath := configService.GetGlobalStringConfig("exportPdfBinPath")
|
||||||
|
// 默认路径
|
||||||
|
if binPath == "" {
|
||||||
|
binPath = "/usr/local/bin/wkhtmltopdf"
|
||||||
|
}
|
||||||
|
|
||||||
|
url := configService.GetSiteUrl() + "/note/toPdf?noteId=" + noteId + "&appKey=" + appKey
|
||||||
|
var cc string
|
||||||
|
if note.IsMarkdown {
|
||||||
|
cc = binPath + " --lowquality --window-status done \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\""
|
||||||
|
} else {
|
||||||
|
cc = binPath + " --lowquality \"" + url + "\" \"" + path + "\"" // \"" + cookieDomain + "\" \"" + cookieName + "\" \"" + cookieValue + "\""
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd := exec.Command("/bin/sh", "-c", cc)
|
||||||
|
_, err := cmd.Output()
|
||||||
|
if err != nil {
|
||||||
|
re.Msg = "sysError"
|
||||||
|
return c.RenderJson(re)
|
||||||
|
}
|
||||||
|
file, err := os.Open(path)
|
||||||
|
if err != nil {
|
||||||
|
re.Msg = "sysError"
|
||||||
|
return c.RenderJson(re)
|
||||||
|
}
|
||||||
|
|
||||||
|
filenameReturn := note.Title
|
||||||
|
filenameReturn = FixFilename(filenameReturn)
|
||||||
|
if filenameReturn == "" {
|
||||||
|
filenameReturn = "Untitled.pdf"
|
||||||
|
} else {
|
||||||
|
filenameReturn += ".pdf"
|
||||||
|
}
|
||||||
|
return c.RenderBinary(file, filenameReturn, revel.Attachment, time.Now()) // revel.Attachment
|
||||||
|
}
|
||||||
@@ -2,9 +2,9 @@ package api
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
|
. "github.com/leanote/leanote/app/lea"
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
|
||||||
// "io/ioutil"
|
// "io/ioutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -30,15 +30,15 @@ func (c ApiNotebook) fixNotebook(notebook *info.Notebook) info.ApiNotebook {
|
|||||||
return info.ApiNotebook{}
|
return info.ApiNotebook{}
|
||||||
}
|
}
|
||||||
return info.ApiNotebook{
|
return info.ApiNotebook{
|
||||||
NotebookId : notebook.NotebookId,
|
NotebookId: notebook.NotebookId,
|
||||||
UserId : notebook.UserId,
|
UserId: notebook.UserId,
|
||||||
ParentNotebookId : notebook.ParentNotebookId,
|
ParentNotebookId: notebook.ParentNotebookId,
|
||||||
Seq : notebook.Seq,
|
Seq: notebook.Seq,
|
||||||
Title : notebook.Title,
|
Title: notebook.Title,
|
||||||
UrlTitle : notebook.UrlTitle,
|
UrlTitle: notebook.UrlTitle,
|
||||||
IsBlog : notebook.IsBlog,
|
IsBlog: notebook.IsBlog,
|
||||||
CreatedTime : notebook.CreatedTime,
|
CreatedTime: notebook.CreatedTime,
|
||||||
UpdatedTime : notebook.UpdatedTime,
|
UpdatedTime: notebook.UpdatedTime,
|
||||||
Usn: notebook.Usn,
|
Usn: notebook.Usn,
|
||||||
IsDeleted: notebook.IsDeleted,
|
IsDeleted: notebook.IsDeleted,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package api
|
|||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
"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"
|
||||||
// "io/ioutil"
|
// "io/ioutil"
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ package api
|
|||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
"gopkg.in/mgo.v2/bson"
|
|
||||||
"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"
|
||||||
"time"
|
"time"
|
||||||
// "github.com/leanote/leanote/app/types"
|
// "github.com/leanote/leanote/app/types"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
@@ -82,7 +82,6 @@ func (c ApiUser) GetSyncState() revel.Result {
|
|||||||
return c.RenderJson(ret)
|
return c.RenderJson(ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 头像设置
|
// 头像设置
|
||||||
// 参数file=文件
|
// 参数file=文件
|
||||||
// 成功返回{Logo: url} 头像新url
|
// 成功返回{Logo: url} 头像新url
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ package api
|
|||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
"github.com/leanote/leanote/app/service"
|
"github.com/leanote/leanote/app/service"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
@@ -46,7 +46,7 @@ const (
|
|||||||
// 不需要拦截的url
|
// 不需要拦截的url
|
||||||
var commonUrl = map[string]map[string]bool{"ApiAuth": map[string]bool{"Login": true,
|
var commonUrl = map[string]map[string]bool{"ApiAuth": map[string]bool{"Login": true,
|
||||||
"Register": true,
|
"Register": true,
|
||||||
},
|
},
|
||||||
// 文件的操作也不用登录, userId会从session中获取
|
// 文件的操作也不用登录, userId会从session中获取
|
||||||
"ApiFile": map[string]bool{"GetImage": true,
|
"ApiFile": map[string]bool{"GetImage": true,
|
||||||
"GetAttach": true,
|
"GetAttach": true,
|
||||||
@@ -90,7 +90,7 @@ func AuthInterceptor(c *revel.Controller) revel.Result {
|
|||||||
if noToken && userId == "" {
|
if noToken && userId == "" {
|
||||||
// 从session中获取, api/file/getImage, api/file/getAttach, api/file/getAllAttach
|
// 从session中获取, api/file/getImage, api/file/getAttach, api/file/getAllAttach
|
||||||
// 客户端
|
// 客户端
|
||||||
userId, _ = c.Session["UserId"];
|
userId, _ = c.Session["UserId"]
|
||||||
}
|
}
|
||||||
c.Session["_userId"] = userId
|
c.Session["_userId"] = userId
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/service"
|
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
"github.com/leanote/leanote/app/lea/blog"
|
"github.com/leanote/leanote/app/lea/blog"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
"github.com/leanote/leanote/app/service"
|
||||||
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
@@ -48,7 +48,7 @@ var commonUrl = map[string]map[string]bool{"Index": map[string]bool{"Index": tru
|
|||||||
"FindPasswordUpdate": true,
|
"FindPasswordUpdate": true,
|
||||||
"Suggestion": true,
|
"Suggestion": true,
|
||||||
},
|
},
|
||||||
"Note": map[string]bool{"ToImage": true},
|
"Note": map[string]bool{"ToPdf": true},
|
||||||
"Blog": map[string]bool{"Index": true,
|
"Blog": map[string]bool{"Index": true,
|
||||||
"View": true,
|
"View": true,
|
||||||
"AboutMe": true,
|
"AboutMe": true,
|
||||||
@@ -68,7 +68,7 @@ var commonUrl = map[string]map[string]bool{"Index": map[string]bool{"Index": tru
|
|||||||
},
|
},
|
||||||
"Oauth": map[string]bool{"GithubCallback": true},
|
"Oauth": map[string]bool{"GithubCallback": true},
|
||||||
"File": map[string]bool{"OutputImage": true, "OutputFile": true},
|
"File": map[string]bool{"OutputImage": true, "OutputFile": true},
|
||||||
"Attach": map[string]bool{"Download": true, "DownloadAll": true},
|
"Attach": map[string]bool{"Download": true /*, "DownloadAll": true*/},
|
||||||
}
|
}
|
||||||
|
|
||||||
func needValidate(controller, method string) bool {
|
func needValidate(controller, method string) bool {
|
||||||
@@ -146,9 +146,10 @@ func init() {
|
|||||||
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Note{})
|
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Note{})
|
||||||
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Share{})
|
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Share{})
|
||||||
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &User{})
|
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &User{})
|
||||||
|
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Album{})
|
||||||
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &File{})
|
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &File{})
|
||||||
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Attach{})
|
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Attach{})
|
||||||
// revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Blog{})
|
// revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &Blog{})
|
||||||
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &NoteContentHistory{})
|
revel.InterceptFunc(AuthInterceptor, revel.BEFORE, &NoteContentHistory{})
|
||||||
|
|
||||||
revel.OnAppStart(func() {
|
revel.OnAppStart(func() {
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
package member
|
package member
|
||||||
|
|
||||||
import (
|
import (
|
||||||
// "github.com/revel/revel"
|
// "github.com/revel/revel"
|
||||||
// "gopkg.in/mgo.v2/bson"
|
// "gopkg.in/mgo.v2/bson"
|
||||||
// "encoding/json"
|
// "encoding/json"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
|
||||||
"github.com/leanote/leanote/app/controllers"
|
"github.com/leanote/leanote/app/controllers"
|
||||||
// "io/ioutil"
|
. "github.com/leanote/leanote/app/lea"
|
||||||
// "fmt"
|
// "io/ioutil"
|
||||||
// "math"
|
// "fmt"
|
||||||
// "strconv"
|
// "math"
|
||||||
|
// "strconv"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -20,23 +20,23 @@ type MemberBaseController struct {
|
|||||||
|
|
||||||
// 得到sorterField 和 isAsc
|
// 得到sorterField 和 isAsc
|
||||||
// okSorter = ['email', 'username']
|
// okSorter = ['email', 'username']
|
||||||
func (c MemberBaseController) getSorter(sorterField string, isAsc bool, okSorter []string) (string, bool){
|
func (c MemberBaseController) getSorter(sorterField string, isAsc bool, okSorter []string) (string, bool) {
|
||||||
sorter := ""
|
sorter := ""
|
||||||
c.Params.Bind(&sorter, "sorter")
|
c.Params.Bind(&sorter, "sorter")
|
||||||
if sorter == "" {
|
if sorter == "" {
|
||||||
return sorterField, isAsc;
|
return sorterField, isAsc
|
||||||
}
|
}
|
||||||
|
|
||||||
// sorter形式 email-up, email-down
|
// sorter形式 email-up, email-down
|
||||||
s2 := strings.Split(sorter, "-")
|
s2 := strings.Split(sorter, "-")
|
||||||
if len(s2) != 2 {
|
if len(s2) != 2 {
|
||||||
return sorterField, isAsc;
|
return sorterField, isAsc
|
||||||
}
|
}
|
||||||
|
|
||||||
// 必须是可用的sorter
|
// 必须是可用的sorter
|
||||||
if okSorter != nil && len(okSorter) > 0 {
|
if okSorter != nil && len(okSorter) > 0 {
|
||||||
if !InArray(okSorter, s2[0]) {
|
if !InArray(okSorter, s2[0]) {
|
||||||
return sorterField, isAsc;
|
return sorterField, isAsc
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -47,7 +47,7 @@ func (c MemberBaseController) getSorter(sorterField string, isAsc bool, okSorter
|
|||||||
isAsc = false
|
isAsc = false
|
||||||
}
|
}
|
||||||
c.RenderArgs["sorter"] = sorter
|
c.RenderArgs["sorter"] = sorter
|
||||||
return sorterField, isAsc;
|
return sorterField, isAsc
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberBaseController) updateConfig(keys []string) {
|
func (c MemberBaseController) updateConfig(keys []string) {
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ func (c MemberBlog) Index(sorter, keywords string) revel.Result {
|
|||||||
userInfo := userService.GetUserInfo(userId)
|
userInfo := userService.GetUserInfo(userId)
|
||||||
c.RenderArgs["userInfo"] = userInfo
|
c.RenderArgs["userInfo"] = userInfo
|
||||||
|
|
||||||
c.RenderArgs["title"] = "Posts"
|
c.RenderArgs["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)
|
||||||
@@ -85,6 +85,8 @@ func (c MemberBlog) Index(sorter, keywords string) revel.Result {
|
|||||||
userAndBlog := userService.GetUserAndBlog(c.GetUserId())
|
userAndBlog := userService.GetUserAndBlog(c.GetUserId())
|
||||||
c.RenderArgs["userAndBlog"] = userAndBlog
|
c.RenderArgs["userAndBlog"] = userAndBlog
|
||||||
|
|
||||||
|
c.common()
|
||||||
|
|
||||||
return c.RenderTemplate("member/blog/list.html")
|
return c.RenderTemplate("member/blog/list.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,7 +99,8 @@ func (c MemberBlog) UpdateBlogUrlTitle(noteId, urlTitle string) revel.Result {
|
|||||||
|
|
||||||
// 修改笔记的urlTitle
|
// 修改笔记的urlTitle
|
||||||
func (c MemberBlog) UpdateBlogAbstract(noteId string) revel.Result {
|
func (c MemberBlog) UpdateBlogAbstract(noteId string) revel.Result {
|
||||||
c.RenderArgs["title"] = "Update Post Abstract"
|
c.common()
|
||||||
|
c.RenderArgs["title"] = c.Message("Update Post Abstract")
|
||||||
note := noteService.GetNoteAndContent(noteId, c.GetUserId())
|
note := noteService.GetNoteAndContent(noteId, c.GetUserId())
|
||||||
if !note.Note.IsBlog {
|
if !note.Note.IsBlog {
|
||||||
return c.E404()
|
return c.E404()
|
||||||
@@ -107,7 +110,6 @@ func (c MemberBlog) UpdateBlogAbstract(noteId string) revel.Result {
|
|||||||
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)
|
||||||
@@ -116,24 +118,24 @@ func (c MemberBlog) DoUpdateBlogAbstract(noteId, imgSrc, desc, abstract string)
|
|||||||
// 基本信息设置
|
// 基本信息设置
|
||||||
func (c MemberBlog) Base() revel.Result {
|
func (c MemberBlog) Base() revel.Result {
|
||||||
c.common()
|
c.common()
|
||||||
c.RenderArgs["title"] = "Blog Base Info"
|
c.RenderArgs["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"] = "Comment"
|
c.RenderArgs["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"] = "Paging"
|
c.RenderArgs["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"] = "Cate"
|
c.RenderArgs["title"] = c.Message("Category")
|
||||||
|
|
||||||
notebooks := blogService.ListBlogNotebooks(c.GetUserId())
|
notebooks := blogService.ListBlogNotebooks(c.GetUserId())
|
||||||
notebooksMap := map[string]info.Notebook{}
|
notebooksMap := map[string]info.Notebook{}
|
||||||
@@ -190,10 +192,10 @@ func (c MemberBlog) DoAddOrUpdateSingle(singleId, title, content string) revel.R
|
|||||||
}
|
}
|
||||||
func (c MemberBlog) AddOrUpdateSingle(singleId string) revel.Result {
|
func (c MemberBlog) AddOrUpdateSingle(singleId string) revel.Result {
|
||||||
c.common()
|
c.common()
|
||||||
c.RenderArgs["title"] = "Add Single"
|
c.RenderArgs["title"] = c.Message("Add Single")
|
||||||
c.RenderArgs["singleId"] = singleId
|
c.RenderArgs["singleId"] = singleId
|
||||||
if singleId != "" {
|
if singleId != "" {
|
||||||
c.RenderArgs["title"] = "Update Single"
|
c.RenderArgs["title"] = c.Message("Update Single")
|
||||||
c.RenderArgs["single"] = blogService.GetSingle(singleId)
|
c.RenderArgs["single"] = blogService.GetSingle(singleId)
|
||||||
}
|
}
|
||||||
return c.RenderTemplate("member/blog/add_single.html")
|
return c.RenderTemplate("member/blog/add_single.html")
|
||||||
@@ -219,7 +221,7 @@ func (c MemberBlog) UpdateSingleUrlTitle(singleId, urlTitle string) revel.Result
|
|||||||
|
|
||||||
func (c MemberBlog) Single() revel.Result {
|
func (c MemberBlog) Single() revel.Result {
|
||||||
c.common()
|
c.common()
|
||||||
c.RenderArgs["title"] = "Cate"
|
c.RenderArgs["title"] = c.Message("Single")
|
||||||
c.RenderArgs["singles"] = blogService.GetSingles(c.GetUserId())
|
c.RenderArgs["singles"] = blogService.GetSingles(c.GetUserId())
|
||||||
|
|
||||||
return c.RenderTemplate("member/blog/single.html")
|
return c.RenderTemplate("member/blog/single.html")
|
||||||
@@ -234,7 +236,7 @@ func (c MemberBlog) Theme() revel.Result {
|
|||||||
|
|
||||||
c.RenderArgs["optionThemes"] = themeService.GetDefaultThemes()
|
c.RenderArgs["optionThemes"] = themeService.GetDefaultThemes()
|
||||||
|
|
||||||
c.RenderArgs["title"] = "Theme"
|
c.RenderArgs["title"] = c.Message("Theme")
|
||||||
return c.RenderTemplate("member/blog/theme.html")
|
return c.RenderTemplate("member/blog/theme.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -251,7 +253,7 @@ func (c MemberBlog) UpdateTheme(themeId string, isNew int) revel.Result {
|
|||||||
}
|
}
|
||||||
|
|
||||||
c.common()
|
c.common()
|
||||||
c.RenderArgs["title"] = "Upate Theme"
|
c.RenderArgs["title"] = c.Message("Update Theme")
|
||||||
c.RenderArgs["isNew"] = isNew
|
c.RenderArgs["isNew"] = isNew
|
||||||
|
|
||||||
// 先复制之
|
// 先复制之
|
||||||
@@ -443,8 +445,8 @@ func (c MemberBlog) ImportTheme() revel.Result {
|
|||||||
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()
|
||||||
// 生成上传路径
|
// 生成上传路径
|
||||||
userId := c.GetUserId()
|
userId := c.GetUserId()
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package member
|
package member
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
|
"github.com/revel/revel"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 分组管理
|
// 分组管理
|
||||||
@@ -14,9 +14,9 @@ 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"] = "My Group"
|
c.RenderArgs["title"] = c.Message("My Group")
|
||||||
c.RenderArgs["groups"] = groupService.GetGroupsAndUsers(c.GetUserId())
|
c.RenderArgs["groups"] = groupService.GetGroupsAndUsers(c.GetUserId())
|
||||||
return c.RenderTemplate("member/group/index.html");
|
return c.RenderTemplate("member/group/index.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加分组
|
// 添加分组
|
||||||
|
|||||||
@@ -13,14 +13,14 @@ type MemberIndex struct {
|
|||||||
// admin 主页
|
// admin 主页
|
||||||
func (c MemberIndex) Index() revel.Result {
|
func (c MemberIndex) Index() revel.Result {
|
||||||
c.SetUserInfo()
|
c.SetUserInfo()
|
||||||
c.RenderArgs["title"] = "Leanote Member Center"
|
c.RenderArgs["title"] = c.Message("Leanote Member Center")
|
||||||
|
|
||||||
c.RenderArgs["countNote"] = noteService.CountNote(c.GetUserId())
|
c.RenderArgs["countNote"] = noteService.CountNote(c.GetUserId())
|
||||||
c.RenderArgs["countBlog"] = noteService.CountBlog(c.GetUserId())
|
c.RenderArgs["countBlog"] = noteService.CountBlog(c.GetUserId())
|
||||||
|
|
||||||
c.SetLocale()
|
c.SetLocale()
|
||||||
|
|
||||||
return c.RenderTemplate("member/index.html");
|
return c.RenderTemplate("member/index.html")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 模板
|
// 模板
|
||||||
@@ -33,5 +33,5 @@ func (c MemberIndex) T(t string) revel.Result {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c MemberIndex) GetView(view string) revel.Result {
|
func (c MemberIndex) GetView(view string) revel.Result {
|
||||||
return c.RenderTemplate("admin/" + view);
|
return c.RenderTemplate("admin/" + view)
|
||||||
}
|
}
|
||||||
@@ -13,34 +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"] = "Username"
|
c.RenderArgs["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"] = "Email"
|
c.RenderArgs["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"] = "Password"
|
c.RenderArgs["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"] = "Avatar"
|
c.RenderArgs["title"] = c.Message("Avatar")
|
||||||
c.RenderArgs["globalConfigs"] = configService.GetGlobalConfigForUser()
|
c.RenderArgs["globalConfigs"] = configService.GetGlobalConfigForUser()
|
||||||
return c.RenderTemplate("member/user/avatar.html");
|
return c.RenderTemplate("member/user/avatar.html")
|
||||||
}
|
|
||||||
func (c MemberUser) AddAccount() revel.Result {
|
|
||||||
c.SetUserInfo()
|
|
||||||
c.SetLocale()
|
|
||||||
c.RenderArgs["title"] = "Add Account"
|
|
||||||
return c.RenderTemplate("member/user/add_account.html");
|
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package member
|
package member
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/service"
|
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
"github.com/leanote/leanote/app/service"
|
||||||
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "strings"
|
// "strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
var userService *service.UserService
|
var userService *service.UserService
|
||||||
@@ -44,7 +44,7 @@ var commonUrl = map[string]map[string]bool{"Index": map[string]bool{"Index": tru
|
|||||||
"FindPassword2": true,
|
"FindPassword2": true,
|
||||||
"FindPasswordUpdate": true,
|
"FindPasswordUpdate": true,
|
||||||
"Suggestion": true,
|
"Suggestion": true,
|
||||||
},
|
},
|
||||||
"Blog": map[string]bool{"Index": true,
|
"Blog": map[string]bool{"Index": true,
|
||||||
"View": true,
|
"View": true,
|
||||||
"AboutMe": true,
|
"AboutMe": true,
|
||||||
@@ -52,12 +52,13 @@ var commonUrl = map[string]map[string]bool{"Index": map[string]bool{"Index": tru
|
|||||||
},
|
},
|
||||||
// 用户的激活与修改邮箱都不需要登录, 通过链接地址
|
// 用户的激活与修改邮箱都不需要登录, 通过链接地址
|
||||||
"User": map[string]bool{"UpdateEmail": true,
|
"User": map[string]bool{"UpdateEmail": true,
|
||||||
"ActiveEmail":true,
|
"ActiveEmail": true,
|
||||||
},
|
},
|
||||||
"Oauth": map[string]bool{"GithubCallback": true},
|
"Oauth": map[string]bool{"GithubCallback": true},
|
||||||
"File": map[string]bool{"OutputImage": true, "OutputFile": true},
|
"File": map[string]bool{"OutputImage": true, "OutputFile": true},
|
||||||
"Attach": map[string]bool{"Download": true, "DownloadAll": true},
|
"Attach": map[string]bool{"Download": true, "DownloadAll": true},
|
||||||
}
|
}
|
||||||
|
|
||||||
func needValidate(controller, method string) bool {
|
func needValidate(controller, method string) bool {
|
||||||
// 在里面
|
// 在里面
|
||||||
if v, ok := commonUrl[controller]; ok {
|
if v, ok := commonUrl[controller]; ok {
|
||||||
@@ -68,7 +69,7 @@ func needValidate(controller, method string) bool {
|
|||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
// controller不在这里的, 肯定要验证
|
// controller不在这里的, 肯定要验证
|
||||||
return true;
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
func AuthInterceptor(c *revel.Controller) revel.Result {
|
func AuthInterceptor(c *revel.Controller) revel.Result {
|
||||||
@@ -113,7 +114,7 @@ func InitService() {
|
|||||||
tokenService = service.TokenS
|
tokenService = service.TokenS
|
||||||
noteImageService = service.NoteImageS
|
noteImageService = service.NoteImageS
|
||||||
fileService = service.FileS
|
fileService = service.FileS
|
||||||
albumService= service.AlbumS
|
albumService = service.AlbumS
|
||||||
attachService = service.AttachS
|
attachService = service.AttachS
|
||||||
pwdService = service.PwdS
|
pwdService = service.PwdS
|
||||||
suggestionService = service.SuggestionS
|
suggestionService = service.SuggestionS
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
包括基本信息设置
|
|
||||||
博客设置
|
|
||||||
+245
-1
@@ -2,10 +2,11 @@ package db
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/revel/revel"
|
|
||||||
. "github.com/leanote/leanote/app/lea"
|
. "github.com/leanote/leanote/app/lea"
|
||||||
|
"github.com/revel/revel"
|
||||||
"gopkg.in/mgo.v2"
|
"gopkg.in/mgo.v2"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Init mgo and the common DAO
|
// Init mgo and the common DAO
|
||||||
@@ -62,10 +63,26 @@ func Init(url, dbname string) {
|
|||||||
config := revel.Config
|
config := revel.Config
|
||||||
if url == "" {
|
if url == "" {
|
||||||
url, ok = config.String("db.url")
|
url, ok = config.String("db.url")
|
||||||
|
if !ok {
|
||||||
|
url, ok = config.String("db.urlEnv")
|
||||||
|
if ok {
|
||||||
|
Log("get db conf from urlEnv: " + url)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Log("get db conf from db.url: " + url)
|
||||||
|
}
|
||||||
|
|
||||||
|
if ok {
|
||||||
|
// get dbname from urlEnv
|
||||||
|
urls := strings.Split(url, "/")
|
||||||
|
dbname = urls[len(urls)-1]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if dbname == "" {
|
if dbname == "" {
|
||||||
dbname, _ = config.String("db.dbname")
|
dbname, _ = config.String("db.dbname")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// get db config from host, port, username, password
|
||||||
if !ok {
|
if !ok {
|
||||||
host, _ := revel.Config.String("db.host")
|
host, _ := revel.Config.String("db.host")
|
||||||
port, _ := revel.Config.String("db.port")
|
port, _ := revel.Config.String("db.port")
|
||||||
@@ -149,6 +166,216 @@ func Init(url, dbname string) {
|
|||||||
|
|
||||||
// session
|
// session
|
||||||
Sessions = Session.DB(dbname).C("sessions")
|
Sessions = Session.DB(dbname).C("sessions")
|
||||||
|
|
||||||
|
collectionNames, err := Session.DB(dbname).CollectionNames()
|
||||||
|
|
||||||
|
// 如果没有表, 则表示是第一次安装
|
||||||
|
if (err != nil || len(collectionNames) == 0) {
|
||||||
|
Log("init db index")
|
||||||
|
initIndex(dbname)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func initIndex(dbname string) {
|
||||||
|
// 索引
|
||||||
|
indexes := map[string][]mgo.Index{
|
||||||
|
"notebooks": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"notes": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"IsTrash"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UrlTitle"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"IsBlog"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"CreatedTime"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UpdatedTime"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"PublicTime"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"RecommendTime"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"NotebookId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId", "IsBlog"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"note_contents": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"note_content_histories": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"share_notes": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"ToUserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"share_notebooks": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"ToUserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"has_share_notes": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId", "ToUserId"},
|
||||||
|
Background: true,
|
||||||
|
Unique: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"users": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"Email"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"Username"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"groups": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"group_users": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"GroupId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"tags": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"note_tags": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId", "TagId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"tag_count": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"blog_singles": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"blog_likes": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"NoteId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"blog_comments": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"NoteId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"themes": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"note_images": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"ImageId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"NoteId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"albums": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"files": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"UserId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"attachs": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"NoteId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"sessions": []mgo.Index{
|
||||||
|
mgo.Index{
|
||||||
|
Key: []string{"SessionId"},
|
||||||
|
Background: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
for collection, ins := range indexes {
|
||||||
|
col := Session.DB(dbname).C(collection)
|
||||||
|
for _, in := range ins {
|
||||||
|
col.EnsureIndex(in)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func close() {
|
func close() {
|
||||||
@@ -338,3 +565,20 @@ func Err(err error) bool {
|
|||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 检查mognodb是否lost connection
|
||||||
|
// 每个请求之前都要检查!!
|
||||||
|
func CheckMongoSessionLost() {
|
||||||
|
// fmt.Println("检查CheckMongoSessionLostErr")
|
||||||
|
err := Session.Ping()
|
||||||
|
if err != nil {
|
||||||
|
Log("Lost connection to db!")
|
||||||
|
Session.Refresh()
|
||||||
|
err = Session.Ping()
|
||||||
|
if err == nil {
|
||||||
|
Log("Reconnect to db successful.")
|
||||||
|
} else {
|
||||||
|
Log("重连失败!!!! 警告")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,91 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"os"
|
|
||||||
"bufio"
|
|
||||||
"strings"
|
|
||||||
"encoding/json"
|
|
||||||
)
|
|
||||||
|
|
||||||
// convert revel msg to js msg
|
|
||||||
|
|
||||||
var msgBasePath = "/Users/life/Documents/Go/package2/src/github.com/leanote/leanote/messages/"
|
|
||||||
var targetBasePath = "/Users/life/Documents/Go/package2/src/github.com/leanote/leanote/public/js/i18n/"
|
|
||||||
func parse(filename string) {
|
|
||||||
file, err := os.Open(msgBasePath + filename)
|
|
||||||
reader := bufio.NewReader(file)
|
|
||||||
msg := map[string]string{}
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
for true {
|
|
||||||
line, _, err := reader.ReadLine()
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(line) == 0 {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
// 对每一行进行处理
|
|
||||||
if line[0] == '#' || line[1] == '#' {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
lineStr := string(line)
|
|
||||||
|
|
||||||
// 找到第一个=位置
|
|
||||||
pos := strings.Index(lineStr, "=")
|
|
||||||
|
|
||||||
if pos < 0 {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
key := string(line[0:pos])
|
|
||||||
value := string(line[pos+1:])
|
|
||||||
|
|
||||||
// fmt.Println(lineStr)
|
|
||||||
// fmt.Println(value)
|
|
||||||
|
|
||||||
msg[key] = value
|
|
||||||
}
|
|
||||||
|
|
||||||
// JSON
|
|
||||||
b, _ := json.Marshal(msg)
|
|
||||||
str := string(b)
|
|
||||||
fmt.Println(str);
|
|
||||||
|
|
||||||
targetName := targetBasePath + filename + ".js"
|
|
||||||
file2, err2 := os.OpenFile(targetName, os.O_RDWR|os.O_CREATE, 0644)
|
|
||||||
if err2 != nil {
|
|
||||||
file2, err2 = os.Create(targetName)
|
|
||||||
}
|
|
||||||
file2.WriteString("var MSG = " + str + ";" + `
|
|
||||||
function getMsg(key, data) {
|
|
||||||
var msg = MSG[key]
|
|
||||||
if(msg) {
|
|
||||||
if(data) {
|
|
||||||
if(!isArray(data)) {
|
|
||||||
data = [data];
|
|
||||||
}
|
|
||||||
for(var i = 0; i < data.length; ++i) {
|
|
||||||
msg = msg.replace("%s", data[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return msg;
|
|
||||||
}
|
|
||||||
return key;
|
|
||||||
}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 生成js的i18n文件
|
|
||||||
func main() {
|
|
||||||
parse("msg.en")
|
|
||||||
parse("msg.zh")
|
|
||||||
parse("msg.fr")
|
|
||||||
parse("blog.zh")
|
|
||||||
parse("blog.en")
|
|
||||||
parse("blog.fr")
|
|
||||||
}
|
|
||||||
+6
-6
@@ -1,8 +1,8 @@
|
|||||||
package info
|
package info
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"time"
|
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
//---------
|
//---------
|
||||||
@@ -22,12 +22,12 @@ type ApiNote struct {
|
|||||||
UserId string
|
UserId string
|
||||||
Title string
|
Title string
|
||||||
Desc string
|
Desc string
|
||||||
// ImgSrc string
|
// ImgSrc string
|
||||||
Tags []string
|
Tags []string
|
||||||
Abstract string
|
Abstract string
|
||||||
Content string
|
Content string
|
||||||
IsMarkdown bool
|
IsMarkdown bool
|
||||||
// FromUserId string // 为共享而新建
|
// FromUserId string // 为共享而新建
|
||||||
IsBlog bool // 是否是blog, 更新note不需要修改, 添加note时才有可能用到, 此时需要判断notebook是否设为Blog
|
IsBlog bool // 是否是blog, 更新note不需要修改, 添加note时才有可能用到, 此时需要判断notebook是否设为Blog
|
||||||
IsTrash bool
|
IsTrash bool
|
||||||
IsDeleted bool
|
IsDeleted bool
|
||||||
@@ -38,7 +38,6 @@ type ApiNote struct {
|
|||||||
PublicTime time.Time
|
PublicTime time.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 内容
|
// 内容
|
||||||
type ApiNoteContent struct {
|
type ApiNoteContent struct {
|
||||||
NoteId bson.ObjectId `bson:"_id,omitempty"`
|
NoteId bson.ObjectId `bson:"_id,omitempty"`
|
||||||
@@ -46,8 +45,8 @@ type ApiNoteContent struct {
|
|||||||
|
|
||||||
Content string `Content`
|
Content string `Content`
|
||||||
|
|
||||||
// CreatedTime time.Time `CreatedTime`
|
// CreatedTime time.Time `CreatedTime`
|
||||||
// UpdatedTime time.Time `UpdatedTime`
|
// UpdatedTime time.Time `UpdatedTime`
|
||||||
}
|
}
|
||||||
|
|
||||||
// 转换
|
// 转换
|
||||||
@@ -114,6 +113,7 @@ type ReUpdate struct {
|
|||||||
Msg string
|
Msg string
|
||||||
Usn int
|
Usn int
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewReUpdate() ReUpdate {
|
func NewReUpdate() ReUpdate {
|
||||||
return ReUpdate{Ok: false}
|
return ReUpdate{Ok: false}
|
||||||
}
|
}
|
||||||
@@ -37,6 +37,7 @@ type Post struct {
|
|||||||
LikeNum int
|
LikeNum int
|
||||||
IsMarkdown bool
|
IsMarkdown bool
|
||||||
}
|
}
|
||||||
|
|
||||||
// 归档
|
// 归档
|
||||||
type ArchiveMonth struct {
|
type ArchiveMonth struct {
|
||||||
Month int
|
Month int
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ type UserBlogBase struct {
|
|||||||
Logo string `Logo`
|
Logo string `Logo`
|
||||||
Title string `Title` // 标题
|
Title string `Title` // 标题
|
||||||
SubTitle string `SubTitle` // 副标题
|
SubTitle string `SubTitle` // 副标题
|
||||||
// AboutMe string `AboutMe` // 关于我
|
// AboutMe string `AboutMe` // 关于我
|
||||||
}
|
}
|
||||||
|
|
||||||
type UserBlogComment struct {
|
type UserBlogComment struct {
|
||||||
|
|||||||
@@ -80,3 +80,24 @@ type NoteContentHistory struct {
|
|||||||
UserId bson.ObjectId `bson:"UserId"` // 所属者
|
UserId bson.ObjectId `bson:"UserId"` // 所属者
|
||||||
Histories []EachHistory `Histories`
|
Histories []EachHistory `Histories`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 为了NoteController接收参数
|
||||||
|
|
||||||
|
// 更新note或content
|
||||||
|
// 肯定会传userId(谁的), NoteId
|
||||||
|
// 会传Title, Content, Tags, 一种或几种
|
||||||
|
type NoteOrContent struct {
|
||||||
|
NotebookId string
|
||||||
|
NoteId string
|
||||||
|
UserId string
|
||||||
|
Title string
|
||||||
|
Desc string
|
||||||
|
ImgSrc string
|
||||||
|
Tags string
|
||||||
|
Content string
|
||||||
|
Abstract string
|
||||||
|
IsNew bool
|
||||||
|
IsMarkdown bool
|
||||||
|
FromUserId string // 为共享而新建
|
||||||
|
IsBlog bool // 是否是blog, 更新note不需要修改, 添加note时才有可能用到, 此时需要判断notebook是否设为Blog
|
||||||
|
}
|
||||||
+1
-2
@@ -1,7 +1,6 @@
|
|||||||
package info
|
package info
|
||||||
|
|
||||||
import (
|
import ()
|
||||||
)
|
|
||||||
|
|
||||||
// controller ajax返回
|
// controller ajax返回
|
||||||
type Re struct {
|
type Re struct {
|
||||||
|
|||||||
@@ -70,6 +70,13 @@ type UserAccount struct {
|
|||||||
MaxPerAttachSize int `bson:"MaxPerAttachSize" json:"-"` // 单个附件大小
|
MaxPerAttachSize int `bson:"MaxPerAttachSize" json:"-"` // 单个附件大小
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// note主页需要
|
||||||
|
type UserAndBlogUrl struct {
|
||||||
|
User
|
||||||
|
BlogUrl string `BlogUrl`
|
||||||
|
PostUrl string `PostUrl`
|
||||||
|
}
|
||||||
|
|
||||||
// 用户与博客信息结合, 公开
|
// 用户与博客信息结合, 公开
|
||||||
type UserAndBlog struct {
|
type UserAndBlog struct {
|
||||||
UserId bson.ObjectId `bson:"_id,omitempty"` // 必须要设置bson:"_id" 不然mgo不会认为是主键
|
UserId bson.ObjectId `bson:"_id,omitempty"` // 必须要设置bson:"_id" 不然mgo不会认为是主键
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import (
|
|||||||
"math"
|
"math"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
// 分页数据
|
// 分页数据
|
||||||
type Page struct {
|
type Page struct {
|
||||||
CurPage int // 当前页码
|
CurPage int // 当前页码
|
||||||
|
|||||||
+59
-41
@@ -1,27 +1,26 @@
|
|||||||
package app
|
package app
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"encoding/json"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
|
||||||
"github.com/leanote/leanote/app/service"
|
|
||||||
"github.com/leanote/leanote/app/db"
|
|
||||||
"github.com/leanote/leanote/app/controllers"
|
|
||||||
"github.com/leanote/leanote/app/controllers/api"
|
|
||||||
"github.com/leanote/leanote/app/controllers/admin"
|
|
||||||
"github.com/leanote/leanote/app/controllers/member"
|
|
||||||
_ "github.com/leanote/leanote/app/lea/binder"
|
|
||||||
// "github.com/leanote/leanote/app/lea/session"
|
|
||||||
// "github.com/leanote/leanote/app/lea/memcache"
|
|
||||||
"github.com/leanote/leanote/app/lea/route"
|
|
||||||
"reflect"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/leanote/leanote/app/controllers"
|
||||||
|
"github.com/leanote/leanote/app/controllers/admin"
|
||||||
|
"github.com/leanote/leanote/app/controllers/api"
|
||||||
|
"github.com/leanote/leanote/app/controllers/member"
|
||||||
|
"github.com/leanote/leanote/app/db"
|
||||||
|
. "github.com/leanote/leanote/app/lea"
|
||||||
|
_ "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/service"
|
||||||
|
"github.com/revel/revel"
|
||||||
"html/template"
|
"html/template"
|
||||||
"math"
|
"math"
|
||||||
"strings"
|
|
||||||
"strconv"
|
|
||||||
"time"
|
|
||||||
"encoding/json"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
|
"reflect"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
@@ -42,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.
|
||||||
@@ -64,16 +64,16 @@ func init() {
|
|||||||
return str
|
return str
|
||||||
}
|
}
|
||||||
revel.TemplateFuncs["add"] = func(i int) string {
|
revel.TemplateFuncs["add"] = func(i int) string {
|
||||||
i = i + 1;
|
i = i + 1
|
||||||
return fmt.Sprintf("%v", i)
|
return fmt.Sprintf("%v", i)
|
||||||
}
|
}
|
||||||
revel.TemplateFuncs["sub"] = func(i int) int {
|
revel.TemplateFuncs["sub"] = func(i int) int {
|
||||||
i = i - 1;
|
i = i - 1
|
||||||
return i
|
return i
|
||||||
}
|
}
|
||||||
// 增加或减少
|
// 增加或减少
|
||||||
revel.TemplateFuncs["incr"] = func(n, i int) int {
|
revel.TemplateFuncs["incr"] = func(n, i int) int {
|
||||||
n = n + i;
|
n = n + i
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
revel.TemplateFuncs["join"] = func(arr []string) template.HTML {
|
revel.TemplateFuncs["join"] = func(arr []string) template.HTML {
|
||||||
@@ -149,8 +149,8 @@ func init() {
|
|||||||
|
|
||||||
classes += " label-post"
|
classes += " label-post"
|
||||||
var url = tagPostUrl + "/" + url.QueryEscape(tag)
|
var url = tagPostUrl + "/" + url.QueryEscape(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 += " "
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -174,14 +174,32 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
classes += " label-post"
|
classes += " label-post"
|
||||||
tagStr += "<span class=\"" + classes + "\" >" + str + "</span>";
|
tagStr += "<span class=\"" + classes + "\" >" + str + "</span>"
|
||||||
if i != lenTags - 1 {
|
if i != lenTags-1 {
|
||||||
tagStr += " "
|
tagStr += " "
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
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.CurrentLocaleRenderArg].(string)
|
||||||
|
if !ok {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return template.HTML(i18n.Message(str, message, args...))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 不用revel的msg
|
||||||
|
revel.TemplateFuncs["leaMsg"] = func(renderArgs map[string]interface{}, key string) template.HTML {
|
||||||
|
locale, _ := renderArgs[revel.CurrentLocaleRenderArg].(string)
|
||||||
|
str := i18n.Message(locale, key)
|
||||||
|
if strings.HasPrefix(str, "???") {
|
||||||
|
str = key
|
||||||
|
}
|
||||||
|
return template.HTML(str)
|
||||||
|
}
|
||||||
|
|
||||||
// lea++
|
// lea++
|
||||||
revel.TemplateFuncs["blogTagsLea"] = func(renderArgs map[string]interface{}, tags []string, typeStr string) template.HTML {
|
revel.TemplateFuncs["blogTagsLea"] = func(renderArgs map[string]interface{}, tags []string, typeStr string) template.HTML {
|
||||||
if tags == nil || len(tags) == 0 {
|
if tags == nil || len(tags) == 0 {
|
||||||
@@ -193,11 +211,11 @@ func init() {
|
|||||||
|
|
||||||
tagPostUrl := "http://lea.leanote.com/"
|
tagPostUrl := "http://lea.leanote.com/"
|
||||||
if typeStr == "recommend" {
|
if typeStr == "recommend" {
|
||||||
tagPostUrl += "?tag=";
|
tagPostUrl += "?tag="
|
||||||
} else if typeStr == "latest" {
|
} else if typeStr == "latest" {
|
||||||
tagPostUrl += "latest?tag=";
|
tagPostUrl += "latest?tag="
|
||||||
} else {
|
} else {
|
||||||
tagPostUrl += "subscription?tag=";
|
tagPostUrl += "subscription?tag="
|
||||||
}
|
}
|
||||||
|
|
||||||
for i, tag := range tags {
|
for i, tag := range tags {
|
||||||
@@ -213,8 +231,8 @@ func init() {
|
|||||||
}
|
}
|
||||||
classes += " label-post"
|
classes += " label-post"
|
||||||
var url = tagPostUrl + url.QueryEscape(tag)
|
var url = tagPostUrl + url.QueryEscape(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 += " "
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -247,12 +265,12 @@ func init() {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
// str连接
|
// str连接
|
||||||
revel.TemplateFuncs["urlConcat"] = func(url string, v... interface{}) string {
|
revel.TemplateFuncs["urlConcat"] = func(url string, v ...interface{}) string {
|
||||||
html := ""
|
html := ""
|
||||||
for i := 0; i < len(v); i = i + 2 {
|
for i := 0; i < len(v); i = i + 2 {
|
||||||
item := v[i]
|
item := v[i]
|
||||||
if i+1 == len(v) {
|
if i+1 == len(v) {
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
value := v[i+1]
|
value := v[i+1]
|
||||||
if item != nil && value != nil {
|
if item != nil && value != nil {
|
||||||
@@ -309,23 +327,23 @@ func init() {
|
|||||||
if sorterI != nil {
|
if sorterI != nil {
|
||||||
sorter, _ = sorterI.(string)
|
sorter, _ = sorterI.(string)
|
||||||
}
|
}
|
||||||
html := "data-url=\"" + url + "\" data-sorter=\"" + sorterField + "\"";
|
html := "data-url=\"" + url + "\" data-sorter=\"" + sorterField + "\""
|
||||||
html += " class=\"th-sortable ";
|
html += " class=\"th-sortable "
|
||||||
if sorter == sorterField + "-up" {
|
if sorter == sorterField+"-up" {
|
||||||
html += "th-sort-up\"";
|
html += "th-sort-up\""
|
||||||
} else if(sorter == sorterField + "-down") {
|
} else if sorter == sorterField+"-down" {
|
||||||
html += "th-sort-down";
|
html += "th-sort-down"
|
||||||
}
|
}
|
||||||
html += "\"";
|
html += "\""
|
||||||
return template.HTMLAttr(html)
|
return template.HTMLAttr(html)
|
||||||
}
|
}
|
||||||
|
|
||||||
// pagination
|
// pagination
|
||||||
revel.TemplateFuncs["page"] = func(urlBase string, page, pageSize, count int) template.HTML {
|
revel.TemplateFuncs["page"] = func(urlBase string, page, pageSize, count int) template.HTML {
|
||||||
if count == 0 {
|
if count == 0 {
|
||||||
return "";
|
return ""
|
||||||
}
|
}
|
||||||
totalPage := int(math.Ceil(float64(count)/float64(pageSize)))
|
totalPage := int(math.Ceil(float64(count) / float64(pageSize)))
|
||||||
|
|
||||||
preClass := ""
|
preClass := ""
|
||||||
prePage := page - 1
|
prePage := page - 1
|
||||||
|
|||||||
+1
-1
@@ -2,8 +2,8 @@ package lea
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"github.com/revel/revel"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"github.com/revel/revel"
|
||||||
)
|
)
|
||||||
|
|
||||||
func Log(i interface{}) {
|
func Log(i interface{}) {
|
||||||
|
|||||||
+8
-6
@@ -1,10 +1,11 @@
|
|||||||
package lea
|
package lea
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/revel/revel"
|
||||||
"net/smtp"
|
"net/smtp"
|
||||||
"strings"
|
"strings"
|
||||||
"github.com/revel/revel"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// 发送邮件
|
// 发送邮件
|
||||||
var host = "smtp.ym.163.com"
|
var host = "smtp.ym.163.com"
|
||||||
var port = "25"
|
var port = "25"
|
||||||
@@ -12,7 +13,7 @@ var username = "noreply@leanote.com"
|
|||||||
var password = "---"
|
var password = "---"
|
||||||
|
|
||||||
func InitEmail() {
|
func InitEmail() {
|
||||||
config := revel.Config;
|
config := revel.Config
|
||||||
host, _ = config.String("email.host")
|
host, _ = config.String("email.host")
|
||||||
port, _ = config.String("email.port")
|
port, _ = config.String("email.port")
|
||||||
username, _ = config.String("email.username")
|
username, _ = config.String("email.username")
|
||||||
@@ -56,6 +57,7 @@ var bodyTpl = `
|
|||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
`
|
`
|
||||||
|
|
||||||
func SendEmailOld(to, subject, body string) bool {
|
func SendEmailOld(to, subject, body string) bool {
|
||||||
hp := strings.Split(host, ":")
|
hp := strings.Split(host, ":")
|
||||||
auth := smtp.PlainAuth("", username, password, hp[0])
|
auth := smtp.PlainAuth("", username, password, hp[0])
|
||||||
@@ -64,15 +66,15 @@ func SendEmailOld(to, subject, body string) bool {
|
|||||||
|
|
||||||
mailtype := "html"
|
mailtype := "html"
|
||||||
if mailtype == "html" {
|
if mailtype == "html" {
|
||||||
content_type = "Content-Type: text/"+ mailtype + "; charset=UTF-8"
|
content_type = "Content-Type: text/" + mailtype + "; charset=UTF-8"
|
||||||
} else{
|
} else {
|
||||||
content_type = "Content-Type: text/plain" + "; charset=UTF-8"
|
content_type = "Content-Type: text/plain" + "; charset=UTF-8"
|
||||||
}
|
}
|
||||||
|
|
||||||
//body = strings.Replace(bodyTpl, "$body", body, 1)
|
//body = strings.Replace(bodyTpl, "$body", body, 1)
|
||||||
//body = strings.Replace(body, "$title", title, 1)
|
//body = strings.Replace(body, "$title", title, 1)
|
||||||
|
|
||||||
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+":"+port, auth, username, send_to, msg)
|
err := smtp.SendMail(host+":"+port, auth, username, send_to, msg)
|
||||||
|
|
||||||
@@ -85,5 +87,5 @@ func SendEmailOld(to, subject, body string) bool {
|
|||||||
|
|
||||||
func SendToLeanoteOld(subject, title, body string) {
|
func SendToLeanoteOld(subject, title, body string) {
|
||||||
to := "leanote@leanote.com"
|
to := "leanote@leanote.com"
|
||||||
SendEmailOld(to, subject, body);
|
SendEmailOld(to, subject, body)
|
||||||
}
|
}
|
||||||
+2
-2
@@ -116,13 +116,13 @@ func CopyDir(source string, dest string) (err error) {
|
|||||||
// create sub-directories - recursively
|
// create sub-directories - recursively
|
||||||
err = CopyDir(sourcefilepointer, destinationfilepointer)
|
err = CopyDir(sourcefilepointer, destinationfilepointer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// fmt.Println(err)
|
// fmt.Println(err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// perform copy
|
// perform copy
|
||||||
_, err = CopyFile(sourcefilepointer, destinationfilepointer)
|
_, err = CopyFile(sourcefilepointer, destinationfilepointer)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
// fmt.Println(err)
|
// fmt.Println(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,22 @@
|
|||||||
|
package lea
|
||||||
|
|
||||||
|
// 对比密码是否一致
|
||||||
|
// 因为之前密码是用md5加密的, 所以通过密码长度来判断
|
||||||
|
// rawPwd 原始, 用户输入的密码
|
||||||
|
func ComparePwd(rawPwd, dbPwd string) bool {
|
||||||
|
if len(dbPwd) == 32 {
|
||||||
|
return Md5(rawPwd) == dbPwd
|
||||||
|
}
|
||||||
|
|
||||||
|
hex := []byte(dbPwd)
|
||||||
|
return CompareHash(hex, rawPwd)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 加密
|
||||||
|
func GenPwd(rawPwd string) string {
|
||||||
|
digest, err := GenerateHash(rawPwd)
|
||||||
|
if err != nil {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return string(digest)
|
||||||
|
}
|
||||||
+151
-56
@@ -1,17 +1,19 @@
|
|||||||
package lea
|
package lea
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"bytes"
|
||||||
"regexp"
|
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"io"
|
"fmt"
|
||||||
|
"github.com/PuerkitoBio/goquery"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
"time"
|
"io"
|
||||||
"strings"
|
|
||||||
math_rand "math/rand"
|
math_rand "math/rand"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 字符串
|
// 字符串
|
||||||
@@ -23,6 +25,22 @@ func Md5(s string) string {
|
|||||||
return hex.EncodeToString(h.Sum(nil))
|
return hex.EncodeToString(h.Sum(nil))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 3位数的转换, 为了用bson.id -> 3位数
|
||||||
|
func Digest3(str string) string {
|
||||||
|
var b rune = 0
|
||||||
|
for _, k := range str {
|
||||||
|
b += k
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%d", b%1000)
|
||||||
|
}
|
||||||
|
func Digest2(str string) string {
|
||||||
|
var b rune = 0
|
||||||
|
for _, k := range str {
|
||||||
|
b += k
|
||||||
|
}
|
||||||
|
return fmt.Sprintf("%d", b%100)
|
||||||
|
}
|
||||||
|
|
||||||
// Guid
|
// Guid
|
||||||
func NewGuid() string {
|
func NewGuid() string {
|
||||||
b := make([]byte, 48)
|
b := make([]byte, 48)
|
||||||
@@ -124,73 +142,48 @@ func ReplaceAll(oldStr, pattern, newStr string) string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 获取纯文本
|
// 获取纯文本
|
||||||
func SubStringHTMLToRaw(param string, length int) (result string) {
|
func SubStringHTMLToRaw(param string, length int) string {
|
||||||
if param == "" {
|
if param == "" {
|
||||||
return ""
|
return param
|
||||||
}
|
}
|
||||||
result = ""
|
|
||||||
n := 0
|
n := 0
|
||||||
var temp rune // 中文问题, 用rune来解决
|
var temp rune // 中文问题, 用rune来解决
|
||||||
rStr := []rune(param)
|
rStr := []rune(param)
|
||||||
|
lenStr := len(rStr)
|
||||||
isCode := false
|
isCode := false
|
||||||
for i := 0; i < len(rStr); i++ {
|
|
||||||
|
resultRune := make([]rune, length)
|
||||||
|
// s := ""
|
||||||
|
for i := 0; i < lenStr; i++ {
|
||||||
temp = rStr[i]
|
temp = rStr[i]
|
||||||
if temp == '<' {
|
if temp == '<' {
|
||||||
isCode = true
|
isCode = true
|
||||||
continue
|
continue
|
||||||
} else if temp == '>' {
|
} else if temp == '>' {
|
||||||
isCode = false
|
isCode = false
|
||||||
result += " "; // 空格
|
resultRune[n] = ' '
|
||||||
|
|
||||||
|
n++
|
||||||
|
if n >= length {
|
||||||
|
break
|
||||||
|
}
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if !isCode {
|
if !isCode {
|
||||||
result += string(temp)
|
resultRune[n] = temp
|
||||||
|
// s += string(temp)
|
||||||
n++
|
n++
|
||||||
if n >= length {
|
if n >= length {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return
|
result := string(resultRune[0:n])
|
||||||
|
return strings.Trim(result, " ")
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取摘要, HTML
|
// 自带方法补全html
|
||||||
func SubStringHTML(param string, length int, end string) string {
|
func fixHtml(result string) string {
|
||||||
if param == "" {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
|
|
||||||
// 先取出<pre></pre>占位..
|
|
||||||
result := ""
|
|
||||||
|
|
||||||
// 1
|
|
||||||
n := 0
|
|
||||||
var temp rune // 中文问题, 用rune来解决
|
|
||||||
isCode := false //是不是HTML代码
|
|
||||||
isHTML := false //是不是HTML特殊字符,如
|
|
||||||
rStr := []rune(param)
|
|
||||||
for i := 0; i < len(rStr); i++ {
|
|
||||||
temp = rStr[i]
|
|
||||||
if temp == '<' {
|
|
||||||
isCode = true
|
|
||||||
} else if temp == '&' {
|
|
||||||
isHTML = true
|
|
||||||
} else if temp == '>' && isCode {
|
|
||||||
n = n - 1
|
|
||||||
isCode = false
|
|
||||||
} else if temp == ';' && isHTML {
|
|
||||||
isHTML = false
|
|
||||||
}
|
|
||||||
if !isCode && !isHTML {
|
|
||||||
n = n + 1
|
|
||||||
}
|
|
||||||
result += string(temp)
|
|
||||||
if n >= length {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
result += end
|
|
||||||
|
|
||||||
// 取出所有标签
|
// 取出所有标签
|
||||||
tempResult := ReplaceAll(result, "(>)[^<>]*(<?)", "$1$2") // 把标签中间的所有内容都去掉了
|
tempResult := ReplaceAll(result, "(>)[^<>]*(<?)", "$1$2") // 把标签中间的所有内容都去掉了
|
||||||
|
|
||||||
@@ -205,7 +198,7 @@ func SubStringHTML(param string, length int, end string) string {
|
|||||||
p, _ := regexp.Compile("<(/?[a-zA-Z]+)[^<>]*>") // 得到所有的<div>, </div>...
|
p, _ := regexp.Compile("<(/?[a-zA-Z]+)[^<>]*>") // 得到所有的<div>, </div>...
|
||||||
strs := p.FindAllString(tempResult, -1)
|
strs := p.FindAllString(tempResult, -1)
|
||||||
|
|
||||||
// fmt.Println(strs)
|
// fmt.Println(strs)
|
||||||
stack := make([]string, len(strs))
|
stack := make([]string, len(strs))
|
||||||
stackP := -1
|
stackP := -1
|
||||||
for _, each := range strs {
|
for _, each := range strs {
|
||||||
@@ -233,6 +226,71 @@ func SubStringHTML(param string, length int, end string) string {
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取摘要, HTML
|
||||||
|
func SubStringHTML(param string, length int, end string) string {
|
||||||
|
if param == "" {
|
||||||
|
return param
|
||||||
|
}
|
||||||
|
result := ""
|
||||||
|
|
||||||
|
rStr := []rune(param)
|
||||||
|
lenStr := len(rStr)
|
||||||
|
|
||||||
|
if lenStr <= length {
|
||||||
|
result = param
|
||||||
|
} else {
|
||||||
|
// 1
|
||||||
|
n := 0
|
||||||
|
var temp rune // 中文问题, 用rune来解决
|
||||||
|
isCode := false //是不是HTML代码
|
||||||
|
isHTML := false //是不是HTML特殊字符,如
|
||||||
|
var i = 0
|
||||||
|
for ; i < lenStr; i++ {
|
||||||
|
temp = rStr[i]
|
||||||
|
if temp == '<' {
|
||||||
|
isCode = true
|
||||||
|
} else if temp == '&' {
|
||||||
|
isHTML = true
|
||||||
|
} else if temp == '>' && isCode {
|
||||||
|
// n = n - 1
|
||||||
|
isCode = false
|
||||||
|
} else if temp == ';' && isHTML {
|
||||||
|
isHTML = false
|
||||||
|
}
|
||||||
|
if !isCode && !isHTML {
|
||||||
|
n = n + 1
|
||||||
|
}
|
||||||
|
// 每一次都相加, 速度非常慢!, 重新分配内存, 7倍的差距
|
||||||
|
// result += string(temp)
|
||||||
|
if n >= length {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
result = string(rStr[0:i])
|
||||||
|
|
||||||
|
if end != "" {
|
||||||
|
result += end
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 使用goquery来取出html, 为了补全html
|
||||||
|
htmlReader := bytes.NewBufferString(result)
|
||||||
|
dom, err1 := goquery.NewDocumentFromReader(htmlReader)
|
||||||
|
if err1 == nil {
|
||||||
|
html, _ := dom.Html()
|
||||||
|
html = strings.Replace(html, "<html><head></head><body>", "", 1)
|
||||||
|
html = strings.Replace(html, "</body></html>", "", 1)
|
||||||
|
|
||||||
|
// TODO 把style="float: left"去掉
|
||||||
|
return html
|
||||||
|
|
||||||
|
// 如果有错误, 则使用自己的方法补全, 有风险
|
||||||
|
} else {
|
||||||
|
return fixHtml(result)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 是否是合格的密码
|
// 是否是合格的密码
|
||||||
func IsGoodPwd(pwd string) (bool, string) {
|
func IsGoodPwd(pwd string) (bool, string) {
|
||||||
if pwd == "" {
|
if pwd == "" {
|
||||||
@@ -247,16 +305,16 @@ func IsGoodPwd(pwd string) (bool, string) {
|
|||||||
// 是否是email
|
// 是否是email
|
||||||
func IsEmail(email string) bool {
|
func IsEmail(email string) bool {
|
||||||
if email == "" {
|
if email == "" {
|
||||||
return false;
|
return false
|
||||||
}
|
}
|
||||||
ok, _ := regexp.MatchString(`^([a-zA-Z0-9]+[_|\_|\.|\-]?)*[a-z\-A-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.|\-]?)*[a-zA-Z0-9\-]+\.[0-9a-zA-Z]{2,3}$`, email)
|
ok, _ := regexp.MatchString(`^([a-zA-Z0-9]+[_|\_|\.|\-]?)*[_a-z\-A-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.|\-]?)*[a-zA-Z0-9\-]+\.[0-9a-zA-Z]{2,6}$`, email)
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
// 是否只包含数字, 字母 -, _
|
// 是否只包含数字, 字母 -, _
|
||||||
func IsUsername(username string) bool {
|
func IsUsername(username string) bool {
|
||||||
if username == "" {
|
if username == "" {
|
||||||
return false;
|
return false
|
||||||
}
|
}
|
||||||
ok, _ := regexp.MatchString(`[^0-9a-zA-Z_\-]`, username)
|
ok, _ := regexp.MatchString(`[^0-9a-zA-Z_\-]`, username)
|
||||||
return !ok
|
return !ok
|
||||||
@@ -293,7 +351,7 @@ func RandomPwd(num int) string {
|
|||||||
chars[j] = byte(i)
|
chars[j] = byte(i)
|
||||||
j++
|
j++
|
||||||
}
|
}
|
||||||
j--;
|
j--
|
||||||
|
|
||||||
str := ""
|
str := ""
|
||||||
math_rand.Seed(time.Now().UnixNano())
|
math_rand.Seed(time.Now().UnixNano())
|
||||||
@@ -321,14 +379,14 @@ func InArray(arr []string, str string) bool {
|
|||||||
func FixFilename(filename string) string {
|
func FixFilename(filename string) string {
|
||||||
if filename != "" {
|
if filename != "" {
|
||||||
// 把特殊字段给替换掉
|
// 把特殊字段给替换掉
|
||||||
// str := `life "%&()+,/:;<>=?@\|`
|
// str := `life "%&()+,/:;<>=?@\|`
|
||||||
// . == \\.
|
// . == \\.
|
||||||
// $ === \\$
|
// $ === \\$
|
||||||
reg, _ := regexp.Compile("\\.|/|#|\\$|!|\\^|\\*|'| |\"|%|&|\\(|\\)|\\+|\\,|/|:|;|<|>|=|\\?|@|\\||\\\\")
|
reg, _ := regexp.Compile("\\.|/|#|\\$|!|\\^|\\*|'| |\"|%|&|\\(|\\)|\\+|\\,|/|:|;|<|>|=|\\?|@|\\||\\\\")
|
||||||
filename = reg.ReplaceAllString(filename, "-")
|
filename = reg.ReplaceAllString(filename, "-")
|
||||||
filename = strings.Trim(filename, "-") // 左右单独的-去掉
|
filename = strings.Trim(filename, "-") // 左右单独的-去掉
|
||||||
// 把空格替换成-
|
// 把空格替换成-
|
||||||
// filename = strings.Replace(filename, " ", "-", -1)
|
// filename = strings.Replace(filename, " ", "-", -1)
|
||||||
for strings.Index(filename, "--") >= 0 { // 防止出现连续的--
|
for strings.Index(filename, "--") >= 0 { // 防止出现连续的--
|
||||||
filename = strings.Replace(filename, "--", "-", -1)
|
filename = strings.Replace(filename, "--", "-", -1)
|
||||||
}
|
}
|
||||||
@@ -336,3 +394,40 @@ func FixFilename(filename string) string {
|
|||||||
}
|
}
|
||||||
return filename
|
return filename
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 是否是合法的时间
|
||||||
|
// 不是, 0001-01-01T00:00:00Z, 且比今天小
|
||||||
|
func IsValidTime(t time.Time) bool {
|
||||||
|
if t.Year() > 20 {
|
||||||
|
now := time.Now()
|
||||||
|
Log("------")
|
||||||
|
Log(t)
|
||||||
|
Log(now)
|
||||||
|
if t.Before(now) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// url传过来的时间没有时区信息, 转到本地时间
|
||||||
|
func ToLocalTime(t time.Time) time.Time {
|
||||||
|
return time.Date(t.Year(), t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second(), 0, time.Local)
|
||||||
|
}
|
||||||
|
|
||||||
|
// 修复传过来的时间, 如果比今天大, 则设为现在
|
||||||
|
func FixUrlTime(t time.Time) time.Time {
|
||||||
|
localTime := ToLocalTime(t)
|
||||||
|
if IsValidTime(localTime) {
|
||||||
|
return localTime
|
||||||
|
}
|
||||||
|
return time.Now()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 得到用户的随机文件路径 3位/userId/2位
|
||||||
|
func GetRandomFilePath(userId, uuid string) string {
|
||||||
|
if uuid == "" {
|
||||||
|
uuid = NewGuid()
|
||||||
|
}
|
||||||
|
return Digest3(userId) + "/" + userId + "/" + Digest2(uuid)
|
||||||
|
}
|
||||||
+11
-11
@@ -2,8 +2,8 @@ package lea
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"strconv"
|
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strconv"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 验证
|
// 验证
|
||||||
@@ -38,15 +38,15 @@ var rulesStr = `{
|
|||||||
`
|
`
|
||||||
var rulesMap map[string][]map[string]string
|
var rulesMap map[string][]map[string]string
|
||||||
|
|
||||||
var rules = map[string]func(string, map[string]string)(bool, string) {
|
var rules = map[string]func(string, map[string]string) (bool, string){
|
||||||
"required": func(value string, rule map[string]string)(ok bool, msg string) {
|
"required": func(value string, rule map[string]string) (ok bool, msg string) {
|
||||||
if value == "" {
|
if value == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ok = true
|
ok = true
|
||||||
return
|
return
|
||||||
},
|
},
|
||||||
"minLength": func(value string, rule map[string]string)(ok bool, msg string) {
|
"minLength": func(value string, rule map[string]string) (ok bool, msg string) {
|
||||||
if value == "" {
|
if value == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -55,7 +55,7 @@ var rules = map[string]func(string, map[string]string)(bool, string) {
|
|||||||
ok = len(value) >= dataI
|
ok = len(value) >= dataI
|
||||||
return
|
return
|
||||||
},
|
},
|
||||||
"min": func(value string, rule map[string]string)(ok bool, msg string) {
|
"min": func(value string, rule map[string]string) (ok bool, msg string) {
|
||||||
if value == "" {
|
if value == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -66,7 +66,7 @@ var rules = map[string]func(string, map[string]string)(bool, string) {
|
|||||||
return
|
return
|
||||||
},
|
},
|
||||||
|
|
||||||
"sortField": func(value string, rule map[string]string)(ok bool, msg string) {
|
"sortField": func(value string, rule map[string]string) (ok bool, msg string) {
|
||||||
if value == "" {
|
if value == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -75,21 +75,21 @@ var rules = map[string]func(string, map[string]string)(bool, string) {
|
|||||||
return
|
return
|
||||||
},
|
},
|
||||||
|
|
||||||
"password": func(value string, rule map[string]string)(ok bool, msg string) {
|
"password": func(value string, rule map[string]string) (ok bool, msg string) {
|
||||||
if value == "" {
|
if value == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ok = len(value) >= 6
|
ok = len(value) >= 6
|
||||||
return
|
return
|
||||||
},
|
},
|
||||||
"email": func(value string, rule map[string]string)(ok bool, msg string) {
|
"email": func(value string, rule map[string]string) (ok bool, msg string) {
|
||||||
if value == "" {
|
if value == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ok = IsEmail(value)
|
ok = IsEmail(value)
|
||||||
return
|
return
|
||||||
},
|
},
|
||||||
"noSpecialChars": func(value string, rule map[string]string)(ok bool, msg string) {
|
"noSpecialChars": func(value string, rule map[string]string) (ok bool, msg string) {
|
||||||
if value == "" {
|
if value == "" {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -98,7 +98,7 @@ var rules = map[string]func(string, map[string]string)(bool, string) {
|
|||||||
},
|
},
|
||||||
// www.baidu.com
|
// www.baidu.com
|
||||||
//
|
//
|
||||||
"domain": func(value string, rule map[string]string)(ok bool, msg string) {
|
"domain": func(value string, rule map[string]string) (ok bool, msg string) {
|
||||||
if value == "" {
|
if value == "" {
|
||||||
ok = true
|
ok = true
|
||||||
return // 可为空
|
return // 可为空
|
||||||
@@ -112,7 +112,7 @@ var rules = map[string]func(string, map[string]string)(bool, string) {
|
|||||||
return
|
return
|
||||||
},
|
},
|
||||||
// abcd
|
// abcd
|
||||||
"subDomain": func(value string, rule map[string]string)(ok bool, msg string) {
|
"subDomain": func(value string, rule map[string]string) (ok bool, msg string) {
|
||||||
if value == "" {
|
if value == "" {
|
||||||
ok = true
|
ok = true
|
||||||
return // 可为空
|
return // 可为空
|
||||||
|
|||||||
+14
-14
@@ -28,7 +28,7 @@ func main() {
|
|||||||
//UnTarGz("/home/ty4z2008/1.tar.gz", "/home/ty4z2008") //解压
|
//UnTarGz("/home/ty4z2008/1.tar.gz", "/home/ty4z2008") //解压
|
||||||
os.RemoveAll("/home/ty4z2008/tar")
|
os.RemoveAll("/home/ty4z2008/tar")
|
||||||
*/
|
*/
|
||||||
// TaZip("/Users/life/Desktop/j", "/Users/life/Desktop/aaa.tar.gz")
|
// TaZip("/Users/life/Desktop/j", "/Users/life/Desktop/aaa.tar.gz")
|
||||||
Zip("/Users/life/Desktop/j", "/Users/life/Desktop/aaa.zip")
|
Zip("/Users/life/Desktop/j", "/Users/life/Desktop/aaa.zip")
|
||||||
fmt.Println("ok")
|
fmt.Println("ok")
|
||||||
}
|
}
|
||||||
@@ -67,11 +67,11 @@ func TarGz(srcDirPath string, destFilePath string) (ok bool) {
|
|||||||
}
|
}
|
||||||
if fi.IsDir() {
|
if fi.IsDir() {
|
||||||
// handle source directory
|
// handle source directory
|
||||||
// fmt.Println("Cerating tar.gz from directory...")
|
// fmt.Println("Cerating tar.gz from directory...")
|
||||||
tarGzDir(srcDirPath, path.Base(srcDirPath), tw)
|
tarGzDir(srcDirPath, path.Base(srcDirPath), tw)
|
||||||
} else {
|
} else {
|
||||||
// handle file directly
|
// handle file directly
|
||||||
// fmt.Println("Cerating tar.gz from " + fi.Name() + "...")
|
// fmt.Println("Cerating tar.gz from " + fi.Name() + "...")
|
||||||
tarGzFile(srcDirPath, fi.Name(), tw, fi)
|
tarGzFile(srcDirPath, fi.Name(), tw, fi)
|
||||||
}
|
}
|
||||||
ok = true
|
ok = true
|
||||||
@@ -102,11 +102,11 @@ func tarGzDir(srcDirPath string, recPath string, tw *tar.Writer) {
|
|||||||
if fi.IsDir() {
|
if fi.IsDir() {
|
||||||
// Directory
|
// Directory
|
||||||
// (Directory won't add unitl all subfiles are added)
|
// (Directory won't add unitl all subfiles are added)
|
||||||
// fmt.Printf("Adding path...%s\n", curPath)
|
// fmt.Printf("Adding path...%s\n", curPath)
|
||||||
tarGzDir(curPath, recPath+"/"+fi.Name(), tw)
|
tarGzDir(curPath, recPath+"/"+fi.Name(), tw)
|
||||||
} else {
|
} else {
|
||||||
// File
|
// File
|
||||||
// fmt.Printf("Adding file...%s\n", curPath)
|
// fmt.Printf("Adding file...%s\n", curPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
tarGzFile(curPath, recPath+"/"+fi.Name(), tw, fi)
|
tarGzFile(curPath, recPath+"/"+fi.Name(), tw, fi)
|
||||||
@@ -116,18 +116,18 @@ func tarGzDir(srcDirPath string, recPath string, tw *tar.Writer) {
|
|||||||
// Deal with files
|
// Deal with files
|
||||||
func tarGzFile(srcFile string, recPath string, tw *tar.Writer, fi os.FileInfo) {
|
func tarGzFile(srcFile string, recPath string, tw *tar.Writer, fi os.FileInfo) {
|
||||||
if fi.IsDir() {
|
if fi.IsDir() {
|
||||||
// fmt.Println("??")
|
// fmt.Println("??")
|
||||||
// Create tar header
|
// Create tar header
|
||||||
hdr := new(tar.Header)
|
hdr := new(tar.Header)
|
||||||
// if last character of header name is '/' it also can be directory
|
// if last character of header name is '/' it also can be directory
|
||||||
// but if you don't set Typeflag, error will occur when you untargz
|
// but if you don't set Typeflag, error will occur when you untargz
|
||||||
hdr.Name = recPath // + "/"
|
hdr.Name = recPath // + "/"
|
||||||
// fmt.Println(hdr.Name)
|
// fmt.Println(hdr.Name)
|
||||||
hdr.Typeflag = tar.TypeDir
|
hdr.Typeflag = tar.TypeDir
|
||||||
// hdr.Size = 0
|
// hdr.Size = 0
|
||||||
//hdr.Mode = 0755 | c_ISDIR
|
//hdr.Mode = 0755 | c_ISDIR
|
||||||
// hdr.Mode = int64(fi.Mode()) // 加这个会有错误!!!
|
// hdr.Mode = int64(fi.Mode()) // 加这个会有错误!!!
|
||||||
// hdr.ModTime = fi.ModTime() // 加这个会有错误!!
|
// hdr.ModTime = fi.ModTime() // 加这个会有错误!!
|
||||||
|
|
||||||
// Write hander
|
// Write hander
|
||||||
err := tw.WriteHeader(hdr)
|
err := tw.WriteHeader(hdr)
|
||||||
@@ -145,7 +145,7 @@ func tarGzFile(srcFile string, recPath string, tw *tar.Writer, fi os.FileInfo) {
|
|||||||
// Create tar header
|
// Create tar header
|
||||||
hdr := new(tar.Header)
|
hdr := new(tar.Header)
|
||||||
hdr.Name = recPath
|
hdr.Name = recPath
|
||||||
// fmt.Println(hdr.Name)
|
// fmt.Println(hdr.Name)
|
||||||
hdr.Size = fi.Size()
|
hdr.Size = fi.Size()
|
||||||
hdr.Mode = int64(fi.Mode())
|
hdr.Mode = int64(fi.Mode())
|
||||||
hdr.ModTime = fi.ModTime()
|
hdr.ModTime = fi.ModTime()
|
||||||
@@ -167,7 +167,7 @@ func tarGzFile(srcFile string, recPath string, tw *tar.Writer, fi os.FileInfo) {
|
|||||||
// Ungzip and untar from source file to destination directory
|
// Ungzip and untar from source file to destination directory
|
||||||
// you need check file exist before you call this function
|
// you need check file exist before you call this function
|
||||||
func UnTarGz(srcFilePath string, destDirPath string) {
|
func UnTarGz(srcFilePath string, destDirPath string) {
|
||||||
// fmt.Println("UnTarGzing " + srcFilePath + "...")
|
// fmt.Println("UnTarGzing " + srcFilePath + "...")
|
||||||
// Create destination directory
|
// Create destination directory
|
||||||
os.Mkdir(destDirPath, os.ModePerm)
|
os.Mkdir(destDirPath, os.ModePerm)
|
||||||
|
|
||||||
@@ -194,7 +194,7 @@ func UnTarGz(srcFilePath string, destDirPath string) {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
//handleError(err)
|
//handleError(err)
|
||||||
// fmt.Println("UnTarGzing file..." + hdr.Name)
|
// fmt.Println("UnTarGzing file..." + hdr.Name)
|
||||||
// Check if it is diretory or file
|
// Check if it is diretory or file
|
||||||
if hdr.Typeflag != tar.TypeDir {
|
if hdr.Typeflag != tar.TypeDir {
|
||||||
// Get files from archive
|
// Get files from archive
|
||||||
@@ -211,7 +211,7 @@ func UnTarGz(srcFilePath string, destDirPath string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// fmt.Println("Well done!")
|
// fmt.Println("Well done!")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copyfile
|
// Copyfile
|
||||||
|
|||||||
+15
-15
@@ -3,10 +3,10 @@ package archive
|
|||||||
import (
|
import (
|
||||||
"archive/zip"
|
"archive/zip"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// main functions shows how to TarGz a directory/file and
|
// main functions shows how to TarGz a directory/file and
|
||||||
@@ -43,11 +43,11 @@ func Zip(srcDirPath string, destFilePath string) (ok bool) {
|
|||||||
}
|
}
|
||||||
if fi.IsDir() {
|
if fi.IsDir() {
|
||||||
// handle source directory
|
// handle source directory
|
||||||
// fmt.Println("Cerating tar.gz from directory...")
|
// fmt.Println("Cerating tar.gz from directory...")
|
||||||
zipDir(srcDirPath, path.Base(srcDirPath), tw)
|
zipDir(srcDirPath, path.Base(srcDirPath), tw)
|
||||||
} else {
|
} else {
|
||||||
// handle file directly
|
// handle file directly
|
||||||
// fmt.Println("Cerating tar.gz from " + fi.Name() + "...")
|
// fmt.Println("Cerating tar.gz from " + fi.Name() + "...")
|
||||||
zipFile(srcDirPath, fi.Name(), tw, fi)
|
zipFile(srcDirPath, fi.Name(), tw, fi)
|
||||||
}
|
}
|
||||||
ok = true
|
ok = true
|
||||||
@@ -78,11 +78,11 @@ func zipDir(srcDirPath string, recPath string, tw *zip.Writer) {
|
|||||||
if fi.IsDir() {
|
if fi.IsDir() {
|
||||||
// Directory
|
// Directory
|
||||||
// (Directory won't add unitl all subfiles are added)
|
// (Directory won't add unitl all subfiles are added)
|
||||||
// fmt.Printf("Adding path...%s\n", curPath)
|
// fmt.Printf("Adding path...%s\n", curPath)
|
||||||
zipDir(curPath, recPath+"/"+fi.Name(), tw)
|
zipDir(curPath, recPath+"/"+fi.Name(), tw)
|
||||||
} else {
|
} else {
|
||||||
// File
|
// File
|
||||||
// fmt.Printf("Adding file...%s\n", curPath)
|
// fmt.Printf("Adding file...%s\n", curPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
zipFile(curPath, recPath+"/"+fi.Name(), tw, fi)
|
zipFile(curPath, recPath+"/"+fi.Name(), tw, fi)
|
||||||
@@ -92,7 +92,7 @@ func zipDir(srcDirPath string, recPath string, tw *zip.Writer) {
|
|||||||
// Deal with files
|
// Deal with files
|
||||||
func zipFile(srcFile string, recPath string, tw *zip.Writer, fi os.FileInfo) {
|
func zipFile(srcFile string, recPath string, tw *zip.Writer, fi os.FileInfo) {
|
||||||
if fi.IsDir() {
|
if fi.IsDir() {
|
||||||
// fmt.Println("??")
|
// fmt.Println("??")
|
||||||
// Create tar header
|
// Create tar header
|
||||||
/*
|
/*
|
||||||
fh, err := zip.FileInfoHeader(fi)
|
fh, err := zip.FileInfoHeader(fi)
|
||||||
@@ -138,15 +138,15 @@ func Unzip(srcFilePath string, destDirPath string) (ok bool, msg string) {
|
|||||||
}()
|
}()
|
||||||
|
|
||||||
os.Mkdir(destDirPath, os.ModePerm)
|
os.Mkdir(destDirPath, os.ModePerm)
|
||||||
r, err := zip.OpenReader(srcFilePath);
|
r, err := zip.OpenReader(srcFilePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
defer r.Close();
|
defer r.Close()
|
||||||
for _, f := range r.File {
|
for _, f := range r.File {
|
||||||
// fmt.Println("FileName : ", f.Name); // j/aaa.zip
|
// fmt.Println("FileName : ", f.Name); // j/aaa.zip
|
||||||
rc, err := f.Open();
|
rc, err := f.Open()
|
||||||
if err!=nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -155,7 +155,7 @@ func Unzip(srcFilePath string, destDirPath string) (ok bool, msg string) {
|
|||||||
prePath := ""
|
prePath := ""
|
||||||
filename := ""
|
filename := ""
|
||||||
l := len(paths)
|
l := len(paths)
|
||||||
// fmt.Println(l)
|
// fmt.Println(l)
|
||||||
if l > 1 {
|
if l > 1 {
|
||||||
// 去掉第1个文件夹
|
// 去掉第1个文件夹
|
||||||
if l == 2 {
|
if l == 2 {
|
||||||
@@ -167,16 +167,16 @@ func Unzip(srcFilePath string, destDirPath string) (ok bool, msg string) {
|
|||||||
} else {
|
} else {
|
||||||
filename = f.Name
|
filename = f.Name
|
||||||
}
|
}
|
||||||
// fmt.Println(prePath)
|
// fmt.Println(prePath)
|
||||||
|
|
||||||
// 相对于目标文件件下的路径
|
// 相对于目标文件件下的路径
|
||||||
destPath := destDirPath + "/" + filename
|
destPath := destDirPath + "/" + filename
|
||||||
if prePath != "" {
|
if prePath != "" {
|
||||||
os.MkdirAll(destDirPath + "/" + prePath, os.ModePerm)
|
os.MkdirAll(destDirPath+"/"+prePath, os.ModePerm)
|
||||||
destPath = destDirPath + "/" + prePath + "/" + filename
|
destPath = destDirPath + "/" + prePath + "/" + filename
|
||||||
}
|
}
|
||||||
// Write data to file
|
// Write data to file
|
||||||
// fmt.Println(destPath)
|
// fmt.Println(destPath)
|
||||||
fw, _ := os.Create(destPath)
|
fw, _ := os.Create(destPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
|
|||||||
+27
-27
@@ -1,10 +1,9 @@
|
|||||||
package binder
|
package binder
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
"github.com/leanote/leanote/app/controllers"
|
"github.com/revel/revel"
|
||||||
// "github.com/leanote/leanote/app/controllers/api"
|
// "github.com/leanote/leanote/app/controllers/api"
|
||||||
"fmt"
|
"fmt"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
@@ -54,35 +53,36 @@ func nextKey(key string) string {
|
|||||||
}
|
}
|
||||||
return key[:fieldLen]
|
return key[:fieldLen]
|
||||||
}
|
}
|
||||||
|
|
||||||
var leanoteStructBinder = revel.Binder{
|
var leanoteStructBinder = revel.Binder{
|
||||||
// name == "noteOrContent"
|
// name == "noteOrContent"
|
||||||
Bind: func(params *revel.Params, name string, typ reflect.Type) reflect.Value {
|
Bind: func(params *revel.Params, name string, typ reflect.Type) reflect.Value {
|
||||||
result := reflect.New(typ).Elem() // 创建一个该类型的, 然后其field从所有的param去取
|
result := reflect.New(typ).Elem() // 创建一个该类型的, 然后其field从所有的param去取
|
||||||
fieldValues := make(map[string]reflect.Value)
|
fieldValues := make(map[string]reflect.Value)
|
||||||
// fmt.Println(name)
|
// fmt.Println(name)
|
||||||
// fmt.Println(typ) // api.NoteFiles
|
// fmt.Println(typ) // api.NoteFiles
|
||||||
// name = files[0], files[1], noteContent
|
// name = files[0], files[1], noteContent
|
||||||
// fmt.Println(params.Values)
|
// fmt.Println(params.Values)
|
||||||
/*
|
/*
|
||||||
map[Title:[test1] METHOD:[POST] NotebookId:[54c4f51705fcd14031000002]
|
map[Title:[test1] METHOD:[POST] NotebookId:[54c4f51705fcd14031000002]
|
||||||
files[1][FileId]:[]
|
files[1][FileId]:[]
|
||||||
controller:[note]
|
controller:[note]
|
||||||
files[1][LocalFileId]:[54c7ae27d98d0329dd000000] files[1][HasBody]:[true] files[0][FileId]:[] files[0][LocalFileId]:[54c7ae855e94ea2dba000000] action:[addNote] Content:[<p>lifedddddd</p><p><img src="app://leanote/data/54bdc65599c37b0da9000002/images/1422368307147_2.png" alt="" data-mce-src="app://leanote/data/54bdc65599c37b0da9000002/images/1422368307147_2.png" style="display: block; margin-left: auto; margin-right: auto;"></p><p><img src="http://127.0.0.1:8008/api/file/getImage?fileId=54c7ae27d98d0329dd000000" alt="" data-mce-src="http://127.0.0.1:8008/api/file/getImg?fileId=54c7ae27d98d0329dd000000"></p><p><br></p><p><img src="http://127.0.0.1:8008/api/file/getImage?fileId=54c7ae855e94ea2dba000000" alt="" data-mce-src="http://127.0.0.1:8008/api/file/getImage?fileId=54c7ae855e94ea2dba000000" style="display: block; margin-left: auto; margin-right: auto;"></p><p><br></p><p><br></p>] IsBlog:[false] token:[user1]
|
files[1][LocalFileId]:[54c7ae27d98d0329dd000000] files[1][HasBody]:[true] files[0][FileId]:[] files[0][LocalFileId]:[54c7ae855e94ea2dba000000] action:[addNote] Content:[<p>lifedddddd</p><p><img src="app://leanote/data/54bdc65599c37b0da9000002/images/1422368307147_2.png" alt="" data-mce-src="app://leanote/data/54bdc65599c37b0da9000002/images/1422368307147_2.png" style="display: block; margin-left: auto; margin-right: auto;"></p><p><img src="http://127.0.0.1:8008/api/file/getImage?fileId=54c7ae27d98d0329dd000000" alt="" data-mce-src="http://127.0.0.1:8008/api/file/getImg?fileId=54c7ae27d98d0329dd000000"></p><p><br></p><p><img src="http://127.0.0.1:8008/api/file/getImage?fileId=54c7ae855e94ea2dba000000" alt="" data-mce-src="http://127.0.0.1:8008/api/file/getImage?fileId=54c7ae855e94ea2dba000000" style="display: block; margin-left: auto; margin-right: auto;"></p><p><br></p><p><br></p>] IsBlog:[false] token:[user1]
|
||||||
files[0][HasBody]:[true]]
|
files[0][HasBody]:[true]]
|
||||||
*/
|
*/
|
||||||
nameIsSlice := strings.Contains(name, "[")
|
nameIsSlice := strings.Contains(name, "[")
|
||||||
// fmt.Println(params.Values["files[1]"])
|
// fmt.Println(params.Values["files[1]"])
|
||||||
// fmt.Println(params.Values["Title"])
|
// fmt.Println(params.Values["Title"])
|
||||||
for key, _ := range params.Values {// Title, Content, Files
|
for key, _ := range params.Values { // Title, Content, Files
|
||||||
// 这里, 如果没有点, 默认就是a.
|
// 这里, 如果没有点, 默认就是a.
|
||||||
// life
|
// life
|
||||||
// fmt.Println("key:" + key); // files[0][LocalFileId]
|
// fmt.Println("key:" + key); // files[0][LocalFileId]
|
||||||
// fmt.Println("name:" + name); // files[0][LocalFileId]
|
// fmt.Println("name:" + name); // files[0][LocalFileId]
|
||||||
var suffix string
|
var suffix string
|
||||||
var noPrefix = false
|
var noPrefix = false
|
||||||
if nameIsSlice && strings.HasPrefix(key, name) {
|
if nameIsSlice && strings.HasPrefix(key, name) {
|
||||||
suffix = key[len(name)+1:len(key)-1] // files[0][LocalFileId] 去掉 => LocalFileId
|
suffix = key[len(name)+1 : len(key)-1] // files[0][LocalFileId] 去掉 => LocalFileId
|
||||||
} else if !strings.HasPrefix(key, name + ".") {
|
} else if !strings.HasPrefix(key, name+".") {
|
||||||
noPrefix = true
|
noPrefix = true
|
||||||
suffix = key
|
suffix = key
|
||||||
// continue
|
// continue
|
||||||
@@ -91,18 +91,18 @@ files[0][HasBody]:[true]]
|
|||||||
// Strip off the prefix. e.g. foo.bar.baz => bar.baz
|
// Strip off the prefix. e.g. foo.bar.baz => bar.baz
|
||||||
suffix = key[len(name)+1:]
|
suffix = key[len(name)+1:]
|
||||||
}
|
}
|
||||||
// fmt.Println(suffix);
|
// fmt.Println(suffix);
|
||||||
|
|
||||||
fieldName := nextKey(suffix) // e.g. bar => "bar", bar.baz => "bar", bar[0] => "bar"
|
fieldName := nextKey(suffix) // e.g. bar => "bar", bar.baz => "bar", bar[0] => "bar"
|
||||||
// fmt.Println(fieldName);
|
// fmt.Println(fieldName);
|
||||||
fieldLen := len(fieldName)
|
fieldLen := len(fieldName)
|
||||||
|
|
||||||
if _, ok := fieldValues[fieldName]; !ok {
|
if _, ok := fieldValues[fieldName]; !ok {
|
||||||
// Time to bind this field. Get it and make sure we can set it.
|
// Time to bind this field. Get it and make sure we can set it.
|
||||||
fieldName = strings.Title(fieldName) // 传过来title, 但struct是Title
|
fieldName = strings.Title(fieldName) // 传过来title, 但struct是Title
|
||||||
// fmt.Println("xx: " + fieldName)
|
// fmt.Println("xx: " + fieldName)
|
||||||
fieldValue := result.FieldByName(fieldName)
|
fieldValue := result.FieldByName(fieldName)
|
||||||
// fmt.Println(fieldValue)
|
// fmt.Println(fieldValue)
|
||||||
if !fieldValue.IsValid() {
|
if !fieldValue.IsValid() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -111,14 +111,14 @@ files[0][HasBody]:[true]]
|
|||||||
}
|
}
|
||||||
var boundVal reflect.Value
|
var boundVal reflect.Value
|
||||||
// 没有name前缀
|
// 没有name前缀
|
||||||
if(noPrefix) {
|
if noPrefix {
|
||||||
// life
|
// life
|
||||||
// fmt.Println("<<")
|
// fmt.Println("<<")
|
||||||
// fmt.Println(strings.Title(key[:fieldLen]));
|
// fmt.Println(strings.Title(key[:fieldLen]));
|
||||||
boundVal = revel.Bind(params, key[:fieldLen], fieldValue.Type())
|
boundVal = revel.Bind(params, key[:fieldLen], fieldValue.Type())
|
||||||
} else {
|
} else {
|
||||||
// fmt.Println("final")
|
// fmt.Println("final")
|
||||||
// fmt.Println(key[:len(name)+1+fieldLen]) // files[0][HasBody
|
// fmt.Println(key[:len(name)+1+fieldLen]) // files[0][HasBody
|
||||||
if nameIsSlice {
|
if nameIsSlice {
|
||||||
fieldLen += 1
|
fieldLen += 1
|
||||||
}
|
}
|
||||||
@@ -150,7 +150,7 @@ func init() {
|
|||||||
revel.TypeBinders[reflect.TypeOf(info.UserBlogStyle{})] = leanoteStructBinder
|
revel.TypeBinders[reflect.TypeOf(info.UserBlogStyle{})] = leanoteStructBinder
|
||||||
revel.TypeBinders[reflect.TypeOf(info.Notebook{})] = leanoteStructBinder
|
revel.TypeBinders[reflect.TypeOf(info.Notebook{})] = leanoteStructBinder
|
||||||
revel.TypeBinders[reflect.TypeOf(info.UserAccount{})] = leanoteStructBinder
|
revel.TypeBinders[reflect.TypeOf(info.UserAccount{})] = leanoteStructBinder
|
||||||
revel.TypeBinders[reflect.TypeOf(controllers.NoteOrContent{})] = leanoteStructBinder
|
revel.TypeBinders[reflect.TypeOf(info.NoteOrContent{})] = leanoteStructBinder
|
||||||
revel.TypeBinders[reflect.TypeOf(info.ApiNote{})] = leanoteStructBinder
|
revel.TypeBinders[reflect.TypeOf(info.ApiNote{})] = leanoteStructBinder
|
||||||
revel.TypeBinders[reflect.TypeOf(info.NoteFile{})] = leanoteStructBinder
|
revel.TypeBinders[reflect.TypeOf(info.NoteFile{})] = leanoteStructBinder
|
||||||
}
|
}
|
||||||
@@ -6,8 +6,8 @@ import (
|
|||||||
"html/template"
|
"html/template"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
// "os"
|
// "os"
|
||||||
"fmt"
|
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
"regexp"
|
"regexp"
|
||||||
@@ -139,7 +139,7 @@ func Init() {
|
|||||||
fileBytes, _ := ioutil.ReadFile(revel.ViewsPath + "/Blog/" + path)
|
fileBytes, _ := ioutil.ReadFile(revel.ViewsPath + "/Blog/" + path)
|
||||||
fileStr := string(fileBytes)
|
fileStr := string(fileBytes)
|
||||||
path := "blog/" + path
|
path := "blog/" + path
|
||||||
// path := path
|
// path := path
|
||||||
BlogTplObject.PathContent[path] = fileStr
|
BlogTplObject.PathContent[path] = fileStr
|
||||||
BlogTplObject.Template.New(path).Parse(fileStr) // 以blog为根
|
BlogTplObject.Template.New(path).Parse(fileStr) // 以blog为根
|
||||||
}
|
}
|
||||||
@@ -157,7 +157,7 @@ func RenderTemplate(name string, args map[string]interface{}, basePath string, i
|
|||||||
// 都不会为空的
|
// 都不会为空的
|
||||||
if basePath == "" {
|
if basePath == "" {
|
||||||
path := "blog/" + name
|
path := "blog/" + name
|
||||||
// path := name
|
// path := name
|
||||||
t := BlogTplObject.Template.Lookup(path)
|
t := BlogTplObject.Template.Lookup(path)
|
||||||
r = &RenderTemplateResult{
|
r = &RenderTemplateResult{
|
||||||
Template: t,
|
Template: t,
|
||||||
@@ -181,7 +181,7 @@ func RenderTemplate(name string, args map[string]interface{}, basePath string, i
|
|||||||
files := ListDir(basePath)
|
files := ListDir(basePath)
|
||||||
for _, t := range files {
|
for _, t := range files {
|
||||||
if !strings.Contains(t, ".html") {
|
if !strings.Contains(t, ".html") {
|
||||||
continue;
|
continue
|
||||||
}
|
}
|
||||||
fileBytes, err := ioutil.ReadFile(basePath + "/" + t)
|
fileBytes, err := ioutil.ReadFile(basePath + "/" + t)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -211,11 +211,9 @@ func RenderTemplate(name string, args map[string]interface{}, basePath string, i
|
|||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////
|
////////////////////
|
||||||
//
|
//
|
||||||
|
|
||||||
|
|
||||||
type ErrorResult struct {
|
type ErrorResult struct {
|
||||||
RenderArgs map[string]interface{}
|
RenderArgs map[string]interface{}
|
||||||
Error error
|
Error error
|
||||||
@@ -240,7 +238,7 @@ func (r ErrorResult) Apply(req *revel.Request, resp *revel.Response) {
|
|||||||
var err error
|
var err error
|
||||||
templatePath := fmt.Sprintf("errors/%d.%s", status, format)
|
templatePath := fmt.Sprintf("errors/%d.%s", status, format)
|
||||||
err = nil
|
err = nil
|
||||||
// tmpl, err := revel.MainTemplateLoader.Template("index.html") // 这里找到错误页面主题
|
// tmpl, err := revel.MainTemplateLoader.Template("index.html") // 这里找到错误页面主题
|
||||||
|
|
||||||
// This func shows a plaintext error message, in case the template rendering
|
// This func shows a plaintext error message, in case the template rendering
|
||||||
// doesn't work.
|
// doesn't work.
|
||||||
|
|||||||
@@ -1,15 +1,16 @@
|
|||||||
package captcha
|
package captcha
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
crand "crypto/rand"
|
||||||
"image"
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
"image/png"
|
"image/png"
|
||||||
"io"
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
crand "crypto/rand"
|
|
||||||
"time"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
stdWidth = 100
|
stdWidth = 100
|
||||||
stdHeight = 40
|
stdHeight = 40
|
||||||
@@ -132,7 +133,8 @@ type Image struct {
|
|||||||
height int //a digit height
|
height int //a digit height
|
||||||
dotsize int
|
dotsize int
|
||||||
}
|
}
|
||||||
func init(){
|
|
||||||
|
func init() {
|
||||||
rand.Seed(int64(time.Second))
|
rand.Seed(int64(time.Second))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
// contains two cryptographic functions for both storing and comparing passwords.
|
||||||
|
package lea
|
||||||
|
|
||||||
|
import (
|
||||||
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
)
|
||||||
|
|
||||||
|
// GenerateHash generates bcrypt hash from plaintext password
|
||||||
|
func GenerateHash(password string) ([]byte, error) {
|
||||||
|
hex := []byte(password)
|
||||||
|
hashedPassword, err := bcrypt.GenerateFromPassword(hex, 10)
|
||||||
|
if err != nil {
|
||||||
|
return hashedPassword, err
|
||||||
|
}
|
||||||
|
return hashedPassword, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// CompareHash compares bcrypt password with a plaintext one. Returns true if passwords match
|
||||||
|
// and false if they do not.
|
||||||
|
func CompareHash(digest []byte, password string) bool {
|
||||||
|
hex := []byte(password)
|
||||||
|
if err := bcrypt.CompareHashAndPassword(digest, hex); err == nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
@@ -7,4 +7,3 @@ import (
|
|||||||
func Html2Image(userInfo info.User, note info.Note, content, toPath string) bool {
|
func Html2Image(userInfo info.User, note info.Note, content, toPath string) bool {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,223 @@
|
|||||||
|
package i18n
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/revel/revel"
|
||||||
|
"github.com/robfig/config"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
CurrentLocaleRenderArg = "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.RenderArgs[CurrentLocaleRenderArg] = 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,66 +0,0 @@
|
|||||||
package memcache
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/robfig/gomemcache/memcache"
|
|
||||||
"encoding/json"
|
|
||||||
"strconv"
|
|
||||||
)
|
|
||||||
|
|
||||||
var client *memcache.Client
|
|
||||||
|
|
||||||
// onAppStart后调用
|
|
||||||
func InitMemcache() {
|
|
||||||
client = memcache.New("localhost:11211")
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------
|
|
||||||
// map
|
|
||||||
|
|
||||||
func SetMap(key string, value map[string]string, expiration int32) {
|
|
||||||
// 把value转成byte
|
|
||||||
bytes, _ := json.Marshal(value)
|
|
||||||
if expiration == -1 {
|
|
||||||
expiration = 30 * 24 * 60 * 60 // 30天
|
|
||||||
}
|
|
||||||
client.Set(&memcache.Item{Key: key, Value: bytes, Expiration: expiration})
|
|
||||||
}
|
|
||||||
|
|
||||||
func GetMap(key string) map[string]string {
|
|
||||||
item, err := client.Get(key)
|
|
||||||
if err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
m := map[string]string{}
|
|
||||||
json.Unmarshal(item.Value, &m)
|
|
||||||
return m
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------
|
|
||||||
// string
|
|
||||||
func GetString(key string) string {
|
|
||||||
item, err := client.Get(key)
|
|
||||||
if err != nil {
|
|
||||||
return ""
|
|
||||||
}
|
|
||||||
return string(item.Value)
|
|
||||||
}
|
|
||||||
func SetString(key string, value string, expiration int32) {
|
|
||||||
if expiration == -1 {
|
|
||||||
expiration = 30 * 24 * 60 * 60 // 30天
|
|
||||||
}
|
|
||||||
client.Set(&memcache.Item{Key: key, Value: []byte(value), Expiration: expiration})
|
|
||||||
}
|
|
||||||
|
|
||||||
//-------------------------
|
|
||||||
// int, 是通过转成string来存的
|
|
||||||
|
|
||||||
func GetInt(key string) int {
|
|
||||||
str := GetString(key)
|
|
||||||
i, _ := strconv.Atoi(str)
|
|
||||||
return i
|
|
||||||
}
|
|
||||||
func SetInt(key string, value int, expiration int32) {
|
|
||||||
str := strconv.Itoa(value)
|
|
||||||
SetString(key, str, expiration)
|
|
||||||
}
|
|
||||||
+18
-17
@@ -1,12 +1,13 @@
|
|||||||
package netutil
|
package netutil
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"strings"
|
|
||||||
"os"
|
"os"
|
||||||
// "path/filepath"
|
"strings"
|
||||||
|
// "path/filepath"
|
||||||
|
. "github.com/leanote/leanote/app/lea"
|
||||||
|
"io/ioutil"
|
||||||
"net"
|
"net"
|
||||||
"net/http"
|
"net/http"
|
||||||
"io/ioutil"
|
|
||||||
. "github.com/leanote/leanote/app/lea"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// net的util
|
// net的util
|
||||||
@@ -16,11 +17,11 @@ import (
|
|||||||
// 返回文件的完整目录
|
// 返回文件的完整目录
|
||||||
func WriteUrl(url string, toPath string) (length int64, newFilename, path string, ok bool) {
|
func WriteUrl(url string, toPath string) (length int64, newFilename, path string, ok bool) {
|
||||||
if url == "" {
|
if url == "" {
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
content, err := GetContent(url)
|
content, err := GetContent(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
length = int64(len(content))
|
length = int64(len(content))
|
||||||
@@ -31,7 +32,7 @@ func WriteUrl(url string, toPath string) (length int64, newFilename, path string
|
|||||||
if toPath == "" {
|
if toPath == "" {
|
||||||
toPath = "/tmp"
|
toPath = "/tmp"
|
||||||
}
|
}
|
||||||
// dir := filepath.Dir(toPath)
|
// dir := filepath.Dir(toPath)
|
||||||
newFilename = NewGuid() + ext
|
newFilename = NewGuid() + ext
|
||||||
fullPath := toPath + "/" + newFilename
|
fullPath := toPath + "/" + newFilename
|
||||||
|
|
||||||
@@ -53,7 +54,7 @@ func GetContent(url string) (content []byte, err error) {
|
|||||||
var resp *http.Response
|
var resp *http.Response
|
||||||
resp, err = http.Get(url)
|
resp, err = http.Get(url)
|
||||||
Log(err)
|
Log(err)
|
||||||
if(resp != nil && resp.Body != nil) {
|
if resp != nil && resp.Body != nil {
|
||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
@@ -63,33 +64,33 @@ func GetContent(url string) (content []byte, err error) {
|
|||||||
|
|
||||||
var buf []byte
|
var buf []byte
|
||||||
buf, err = ioutil.ReadAll(resp.Body)
|
buf, err = ioutil.ReadAll(resp.Body)
|
||||||
if(err != nil) {
|
if err != nil {
|
||||||
Log(err)
|
Log(err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
content = buf;
|
content = buf
|
||||||
err = nil
|
err = nil
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 将url ?, #后面的字符串去掉
|
// 将url ?, #后面的字符串去掉
|
||||||
func trimQueryParams(url string) string {
|
func trimQueryParams(url string) string {
|
||||||
pos := strings.Index(url, "?");
|
pos := strings.Index(url, "?")
|
||||||
if pos != -1 {
|
if pos != -1 {
|
||||||
url = Substr(url, 0, pos);
|
url = Substr(url, 0, pos)
|
||||||
}
|
}
|
||||||
|
|
||||||
pos = strings.Index(url, "#");
|
pos = strings.Index(url, "#")
|
||||||
if pos != -1 {
|
if pos != -1 {
|
||||||
url = Substr(url, 0, pos);
|
url = Substr(url, 0, pos)
|
||||||
}
|
}
|
||||||
|
|
||||||
pos = strings.Index(url, "!");
|
pos = strings.Index(url, "!")
|
||||||
if pos != -1 {
|
if pos != -1 {
|
||||||
url = Substr(url, 0, pos);
|
url = Substr(url, 0, pos)
|
||||||
}
|
}
|
||||||
return url;
|
return url
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通过domain得到ip
|
// 通过domain得到ip
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package route
|
package route
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"github.com/leanote/leanote/app/db"
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
// "github.com/leanote/leanote/app/service"
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
|
||||||
"net/url"
|
"net/url"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
@@ -11,6 +11,7 @@ import (
|
|||||||
// overwite revel RouterFilter
|
// overwite revel RouterFilter
|
||||||
// /api/user/Info => ApiUser.Info()
|
// /api/user/Info => ApiUser.Info()
|
||||||
var staticPrefix = []string{"/public", "/favicon.ico", "/css", "/js", "/images", "/tinymce", "/upload", "/fonts"}
|
var staticPrefix = []string{"/public", "/favicon.ico", "/css", "/js", "/images", "/tinymce", "/upload", "/fonts"}
|
||||||
|
|
||||||
func RouterFilter(c *revel.Controller, fc []revel.Filter) {
|
func RouterFilter(c *revel.Controller, fc []revel.Filter) {
|
||||||
// 补全controller部分
|
// 补全controller部分
|
||||||
path := c.Request.Request.URL.Path
|
path := c.Request.Request.URL.Path
|
||||||
@@ -42,10 +43,14 @@ func RouterFilter(c *revel.Controller, fc []revel.Filter) {
|
|||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
if route.ControllerName != "Static" {
|
if route.ControllerName != "Static" {
|
||||||
|
|
||||||
|
// 检查mongodb 是否lost
|
||||||
|
db.CheckMongoSessionLost()
|
||||||
|
|
||||||
// api设置
|
// api设置
|
||||||
// leanote.com/api/user/get => ApiUser::Get
|
// leanote.com/api/user/get => ApiUser::Get
|
||||||
//* /api/login ApiAuth.Login, 这里的设置, 其实已经转成了ApiAuth了
|
//* /api/login ApiAuth.Login, 这里的设置, 其实已经转成了ApiAuth了
|
||||||
if strings.HasPrefix(path, "/api") && !strings.HasPrefix(route.ControllerName, "Api"){
|
if strings.HasPrefix(path, "/api") && !strings.HasPrefix(route.ControllerName, "Api") {
|
||||||
route.ControllerName = "Api" + route.ControllerName
|
route.ControllerName = "Api" + route.ControllerName
|
||||||
} else if strings.HasPrefix(path, "/member") && !strings.HasPrefix(route.ControllerName, "Member") {
|
} else if strings.HasPrefix(path, "/member") && !strings.HasPrefix(route.ControllerName, "Member") {
|
||||||
// member设置
|
// member设置
|
||||||
@@ -80,4 +85,3 @@ func RouterFilter(c *revel.Controller, fc []revel.Filter) {
|
|||||||
|
|
||||||
fc[0](c, fc[1:])
|
fc[0](c, fc[1:])
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,38 +0,0 @@
|
|||||||
package session
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/revel/revel"
|
|
||||||
"github.com/leanote/leanote/app/lea/memcache"
|
|
||||||
. "github.com/leanote/leanote/app/lea"
|
|
||||||
)
|
|
||||||
|
|
||||||
// 使用filter
|
|
||||||
// 很巧妙就使用了memcache来处理session
|
|
||||||
// revel的session(cookie)只存sessionId, 其它信息存在memcache中
|
|
||||||
|
|
||||||
func MSessionFilter(c *revel.Controller, fc []revel.Filter) {
|
|
||||||
sessionId := c.Session.Id()
|
|
||||||
|
|
||||||
// 从memcache中得到cache, 赋给session
|
|
||||||
cache := revel.Session(memcache.GetMap(sessionId))
|
|
||||||
|
|
||||||
Log("memcache")
|
|
||||||
LogJ(cache)
|
|
||||||
if cache == nil {
|
|
||||||
cache = revel.Session{}
|
|
||||||
cache.Id()
|
|
||||||
}
|
|
||||||
c.Session = cache
|
|
||||||
|
|
||||||
// Make session vars available in templates as {{.session.xyz}}
|
|
||||||
c.RenderArgs["session"] = c.Session
|
|
||||||
|
|
||||||
fc[0](c, fc[1:])
|
|
||||||
|
|
||||||
// 再把session保存之
|
|
||||||
LogJ(c.Session)
|
|
||||||
memcache.SetMap(sessionId, c.Session, -1)
|
|
||||||
|
|
||||||
// 只留下sessionId
|
|
||||||
c.Session = revel.Session{revel.SESSION_ID_KEY: sessionId}
|
|
||||||
}
|
|
||||||
@@ -1,208 +0,0 @@
|
|||||||
package session
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/revel/revel"
|
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
|
||||||
"crypto/rand"
|
|
||||||
"encoding/hex"
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// 主要修改revel的cookie, 设置Domain
|
|
||||||
// 为了使sub domain共享cookie
|
|
||||||
// cookie.domain = leanote.com
|
|
||||||
|
|
||||||
// A signed cookie (and thus limited to 4kb in size).
|
|
||||||
// Restriction: Keys may not have a colon in them.
|
|
||||||
type Session map[string]string
|
|
||||||
|
|
||||||
const (
|
|
||||||
SESSION_ID_KEY = "_ID"
|
|
||||||
TIMESTAMP_KEY = "_TS"
|
|
||||||
)
|
|
||||||
|
|
||||||
// expireAfterDuration is the time to live, in seconds, of a session cookie.
|
|
||||||
// It may be specified in config as "session.expires". Values greater than 0
|
|
||||||
// set a persistent cookie with a time to live as specified, and the value 0
|
|
||||||
// sets a session cookie.
|
|
||||||
var expireAfterDuration time.Duration
|
|
||||||
var cookieDomain = "" // life
|
|
||||||
func init() {
|
|
||||||
// Set expireAfterDuration, default to 30 days if no value in config
|
|
||||||
revel.OnAppStart(func() {
|
|
||||||
var err error
|
|
||||||
if expiresString, ok := revel.Config.String("session.expires"); !ok {
|
|
||||||
expireAfterDuration = 30 * 24 * time.Hour
|
|
||||||
} else if expiresString == "session" {
|
|
||||||
expireAfterDuration = 0
|
|
||||||
} else if expireAfterDuration, err = time.ParseDuration(expiresString); err != nil {
|
|
||||||
panic(fmt.Errorf("session.expires invalid: %s", err))
|
|
||||||
}
|
|
||||||
|
|
||||||
cookieDomain, _ = revel.Config.String("cookie.domain")
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// Id retrieves from the cookie or creates a time-based UUID identifying this
|
|
||||||
// session.
|
|
||||||
func (s Session) Id() string {
|
|
||||||
if sessionIdStr, ok := s[SESSION_ID_KEY]; ok {
|
|
||||||
return sessionIdStr
|
|
||||||
}
|
|
||||||
|
|
||||||
buffer := make([]byte, 32)
|
|
||||||
if _, err := rand.Read(buffer); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
s[SESSION_ID_KEY] = hex.EncodeToString(buffer)
|
|
||||||
return s[SESSION_ID_KEY]
|
|
||||||
}
|
|
||||||
|
|
||||||
// getExpiration return a time.Time with the session's expiration date.
|
|
||||||
// If previous session has set to "session", remain it
|
|
||||||
func (s Session) getExpiration() time.Time {
|
|
||||||
if expireAfterDuration == 0 || s[TIMESTAMP_KEY] == "session" {
|
|
||||||
// Expire after closing browser
|
|
||||||
return time.Time{}
|
|
||||||
}
|
|
||||||
return time.Now().Add(expireAfterDuration)
|
|
||||||
}
|
|
||||||
|
|
||||||
// cookie returns an http.Cookie containing the signed session.
|
|
||||||
func (s Session) cookie() *http.Cookie {
|
|
||||||
var sessionValue string
|
|
||||||
ts := s.getExpiration()
|
|
||||||
s[TIMESTAMP_KEY] = getSessionExpirationCookie(ts)
|
|
||||||
for key, value := range s {
|
|
||||||
if strings.ContainsAny(key, ":\x00") {
|
|
||||||
panic("Session keys may not have colons or null bytes")
|
|
||||||
}
|
|
||||||
if strings.Contains(value, "\x00") {
|
|
||||||
panic("Session values may not have null bytes")
|
|
||||||
}
|
|
||||||
sessionValue += "\x00" + key + ":" + value + "\x00"
|
|
||||||
}
|
|
||||||
|
|
||||||
sessionData := url.QueryEscape(sessionValue)
|
|
||||||
cookie := http.Cookie{
|
|
||||||
Name: revel.CookiePrefix + "_SESSION",
|
|
||||||
Value: revel.Sign(sessionData) + "-" + sessionData,
|
|
||||||
Path: "/",
|
|
||||||
HttpOnly: revel.CookieHttpOnly,
|
|
||||||
Secure: revel.CookieSecure,
|
|
||||||
Expires: ts.UTC(),
|
|
||||||
}
|
|
||||||
|
|
||||||
if cookieDomain != "" {
|
|
||||||
cookie.Domain = cookieDomain
|
|
||||||
}
|
|
||||||
|
|
||||||
return &cookie
|
|
||||||
}
|
|
||||||
|
|
||||||
// sessionTimeoutExpiredOrMissing returns a boolean of whether the session
|
|
||||||
// cookie is either not present or present but beyond its time to live; i.e.,
|
|
||||||
// whether there is not a valid session.
|
|
||||||
func sessionTimeoutExpiredOrMissing(session Session) bool {
|
|
||||||
if exp, present := session[TIMESTAMP_KEY]; !present {
|
|
||||||
return true
|
|
||||||
} else if exp == "session" {
|
|
||||||
return false
|
|
||||||
} else if expInt, _ := strconv.Atoi(exp); int64(expInt) < time.Now().Unix() {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// getSessionFromCookie returns a Session struct pulled from the signed
|
|
||||||
// session cookie.
|
|
||||||
func getSessionFromCookie(cookie *http.Cookie) Session {
|
|
||||||
session := make(Session)
|
|
||||||
|
|
||||||
// Separate the data from the signature.
|
|
||||||
hyphen := strings.Index(cookie.Value, "-")
|
|
||||||
if hyphen == -1 || hyphen >= len(cookie.Value)-1 {
|
|
||||||
return session
|
|
||||||
}
|
|
||||||
sig, data := cookie.Value[:hyphen], cookie.Value[hyphen+1:]
|
|
||||||
|
|
||||||
// Verify the signature.
|
|
||||||
if !revel.Verify(data, sig) {
|
|
||||||
revel.INFO.Println("Session cookie signature failed")
|
|
||||||
return session
|
|
||||||
}
|
|
||||||
|
|
||||||
revel.ParseKeyValueCookie(data, func(key, val string) {
|
|
||||||
session[key] = val
|
|
||||||
})
|
|
||||||
|
|
||||||
if sessionTimeoutExpiredOrMissing(session) {
|
|
||||||
session = make(Session)
|
|
||||||
}
|
|
||||||
|
|
||||||
return session
|
|
||||||
}
|
|
||||||
|
|
||||||
// SessionFilter is a Revel Filter that retrieves and sets the session cookie.
|
|
||||||
// Within Revel, it is available as a Session attribute on Controller instances.
|
|
||||||
// The name of the Session cookie is set as CookiePrefix + "_SESSION".
|
|
||||||
func SessionFilter(c *revel.Controller, fc []revel.Filter) {
|
|
||||||
session := restoreSession(c.Request.Request)
|
|
||||||
// c.Session, 重新生成一个revel.Session给controller!!!
|
|
||||||
// Log("sessoin--------")
|
|
||||||
// LogJ(session)
|
|
||||||
revelSession := revel.Session(session) // 强制转换 还是同一个对象, 但有个问题, 这样Session.Id()方法是用revel的了
|
|
||||||
c.Session = revelSession
|
|
||||||
// 生成sessionId
|
|
||||||
c.Session.Id()
|
|
||||||
sessionWasEmpty := len(c.Session) == 0
|
|
||||||
|
|
||||||
// Make session vars available in templates as {{.session.xyz}}
|
|
||||||
c.RenderArgs["session"] = c.Session
|
|
||||||
|
|
||||||
fc[0](c, fc[1:])
|
|
||||||
|
|
||||||
// Store the signed session if it could have changed.
|
|
||||||
if len(c.Session) > 0 || !sessionWasEmpty {
|
|
||||||
// 转换成lea.Session
|
|
||||||
session = Session(c.Session)
|
|
||||||
c.SetCookie(session.cookie())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// restoreSession returns either the current session, retrieved from the
|
|
||||||
// session cookie, or a new session.
|
|
||||||
func restoreSession(req *http.Request) Session {
|
|
||||||
cookie, err := req.Cookie(revel.CookiePrefix + "_SESSION")
|
|
||||||
if err != nil {
|
|
||||||
return make(Session)
|
|
||||||
} else {
|
|
||||||
return getSessionFromCookie(cookie)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// getSessionExpirationCookie retrieves the cookie's time to live as a
|
|
||||||
// string of either the number of seconds, for a persistent cookie, or
|
|
||||||
// "session".
|
|
||||||
func getSessionExpirationCookie(t time.Time) string {
|
|
||||||
if t.IsZero() {
|
|
||||||
return "session"
|
|
||||||
}
|
|
||||||
return strconv.FormatInt(t.Unix(), 10)
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetNoExpiration sets session to expire when browser session ends
|
|
||||||
func (s Session) SetNoExpiration() {
|
|
||||||
s[TIMESTAMP_KEY] = "session"
|
|
||||||
}
|
|
||||||
|
|
||||||
// SetDefaultExpiration sets session to expire after default duration
|
|
||||||
func (s Session) SetDefaultExpiration() {
|
|
||||||
delete(s, TIMESTAMP_KEY)
|
|
||||||
}
|
|
||||||
+17
-17
@@ -2,11 +2,11 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"io/ioutil"
|
|
||||||
"strings"
|
"strings"
|
||||||
// "time"
|
// "time"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -54,13 +54,13 @@ func compressJs(filename string) {
|
|||||||
to := base + filename + "-min.js"
|
to := base + filename + "-min.js"
|
||||||
cmd := exec.Command(cmdPath, source, "-o", to)
|
cmd := exec.Command(cmdPath, source, "-o", to)
|
||||||
_, err := cmd.CombinedOutput()
|
_, err := cmd.CombinedOutput()
|
||||||
fmt.Println(source);
|
fmt.Println(source)
|
||||||
cmdError(err)
|
cmdError(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func combineJs() {
|
func combineJs() {
|
||||||
// 生成一个总文件
|
// 生成一个总文件
|
||||||
cmd := exec.Command("rm", base + "js/all.js")
|
cmd := exec.Command("rm", base+"js/all.js")
|
||||||
_, err := cmd.CombinedOutput()
|
_, err := cmd.CombinedOutput()
|
||||||
cmdError(err)
|
cmdError(err)
|
||||||
|
|
||||||
@@ -70,10 +70,10 @@ func combineJs() {
|
|||||||
compressJs(js)
|
compressJs(js)
|
||||||
|
|
||||||
// 每个压缩后的文件放入之
|
// 每个压缩后的文件放入之
|
||||||
cmd2 := exec.Command("/bin/sh", "-c", "cat " + to + " >> " + base + "js/all.js")
|
cmd2 := exec.Command("/bin/sh", "-c", "cat "+to+" >> "+base+"js/all.js")
|
||||||
_, err := cmd2.CombinedOutput()
|
_, err := cmd2.CombinedOutput()
|
||||||
cmdError(err)
|
cmdError(err)
|
||||||
cmd2 = exec.Command("/bin/sh", "-c", "cat \n >> " + base + "js/all.js")
|
cmd2 = exec.Command("/bin/sh", "-c", "cat \n >> "+base+"js/all.js")
|
||||||
_, err = cmd2.CombinedOutput()
|
_, err = cmd2.CombinedOutput()
|
||||||
cmdError(err)
|
cmdError(err)
|
||||||
}
|
}
|
||||||
@@ -108,28 +108,28 @@ func dev() {
|
|||||||
content = strings.Replace(content, key, value, -1)
|
content = strings.Replace(content, key, value, -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
// var time = time.Now().Unix() % 1000
|
// var time = time.Now().Unix() % 1000
|
||||||
|
|
||||||
// content = strings.Replace(content, "-min.js", fmt.Sprintf("-min.js?r=%d", time), -1)
|
// content = strings.Replace(content, "-min.js", fmt.Sprintf("-min.js?r=%d", time), -1)
|
||||||
// content = strings.Replace(content, "default{{end}}.css", fmt.Sprintf("default{{end}}.css?r=%d", time), 1)
|
// content = strings.Replace(content, "default{{end}}.css", fmt.Sprintf("default{{end}}.css?r=%d", time), 1)
|
||||||
// content = strings.Replace(content, "writting-overwrite.css", fmt.Sprintf("writting-overwrite.css?r=%d", time), 1)
|
// content = strings.Replace(content, "writting-overwrite.css", fmt.Sprintf("writting-overwrite.css?r=%d", time), 1)
|
||||||
|
|
||||||
ioutil.WriteFile(target, []byte(content), os.ModeAppend)
|
ioutil.WriteFile(target, []byte(content), os.ModeAppend)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 压缩js成一块
|
// 压缩js成一块
|
||||||
func tinymce() {
|
func tinymce() {
|
||||||
// cmdStr := "node_modules/jake/bin/cli.js minify bundle[themes:modern,plugins:table,paste,advlist,autolink,link,image,lists,charmap,hr,searchreplace,visualblocks,visualchars,code,nav,tabfocus,contextmenu,directionality,codemirror,codesyntax,textcolor,fullpage]"
|
// cmdStr := "node_modules/jake/bin/cli.js minify bundle[themes:modern,plugins:table,paste,advlist,autolink,link,image,lists,charmap,hr,searchreplace,visualblocks,visualchars,code,nav,tabfocus,contextmenu,directionality,codemirror,codesyntax,textcolor,fullpage]"
|
||||||
// cmd := exec.Command("/Users/life/Documents/eclipse-workspace/go/leanote_release/tinymce-master/node_modules/jake/bin/cli.js", "minify", "bundle[themes:modern,plugins:table,paste,advlist,autolink,link,image,lists,charmap,hr,searchreplace,visualblocks,visualchars,code,nav,tabfocus,contextmenu,directionality,codemirror,codesyntax,textcolor,fullpage]")
|
// cmd := exec.Command("/Users/life/Documents/eclipse-workspace/go/leanote_release/tinymce-master/node_modules/jake/bin/cli.js", "minify", "bundle[themes:modern,plugins:table,paste,advlist,autolink,link,image,lists,charmap,hr,searchreplace,visualblocks,visualchars,code,nav,tabfocus,contextmenu,directionality,codemirror,codesyntax,textcolor,fullpage]")
|
||||||
cmd := exec.Command("/bin/sh", "-c", "grunt minify");
|
cmd := exec.Command("/bin/sh", "-c", "grunt minify")
|
||||||
cmd.Dir = base + "/tinymce_4.1.9"
|
cmd.Dir = base + "/tinymce_4.1.9"
|
||||||
|
|
||||||
fmt.Println("正在build tinymce");
|
fmt.Println("正在build tinymce")
|
||||||
|
|
||||||
// 必须要先删除
|
// 必须要先删除
|
||||||
cmd2 := exec.Command("/bin/sh", "-c", "rm " + cmd.Dir + "/js/tinymce/tinymce.dev.js")
|
cmd2 := exec.Command("/bin/sh", "-c", "rm "+cmd.Dir+"/js/tinymce/tinymce.dev.js")
|
||||||
cmd2.CombinedOutput()
|
cmd2.CombinedOutput()
|
||||||
cmd2 = exec.Command("/bin/sh", "-c", "rm " + cmd.Dir + "/js/tinymce/tinymce.jquery.dev.js")
|
cmd2 = exec.Command("/bin/sh", "-c", "rm "+cmd.Dir+"/js/tinymce/tinymce.jquery.dev.js")
|
||||||
c, _ := cmd2.CombinedOutput()
|
c, _ := cmd2.CombinedOutput()
|
||||||
fmt.Println(string(c))
|
fmt.Println(string(c))
|
||||||
|
|
||||||
@@ -141,7 +141,7 @@ func main() {
|
|||||||
// 压缩tinymce
|
// 压缩tinymce
|
||||||
// tinymce()
|
// tinymce()
|
||||||
|
|
||||||
dev();
|
dev()
|
||||||
|
|
||||||
// 其它零散的需要压缩的js
|
// 其它零散的需要压缩的js
|
||||||
otherJss := []string{"js/main", "js/app/page", "js/contextmenu/jquery.contextmenu",
|
otherJss := []string{"js/main", "js/app/page", "js/contextmenu/jquery.contextmenu",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ package service
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
"time"
|
"time"
|
||||||
|
|||||||
@@ -63,11 +63,20 @@ func (this *AttachService) updateNoteAttachNum(noteId bson.ObjectId, addNum int)
|
|||||||
// list attachs
|
// list attachs
|
||||||
func (this *AttachService) ListAttachs(noteId, userId string) []info.Attach {
|
func (this *AttachService) ListAttachs(noteId, userId string) []info.Attach {
|
||||||
attachs := []info.Attach{}
|
attachs := []info.Attach{}
|
||||||
// 判断是否有权限为笔记添加附件
|
|
||||||
if !shareService.HasUpdateNotePerm(noteId, userId) {
|
// 判断是否有权限为笔记添加附件, userId为空时表示是分享笔记的附件
|
||||||
|
if userId != "" && !shareService.HasUpdateNotePerm(noteId, userId) {
|
||||||
return attachs
|
return attachs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 笔记是否是自己的
|
||||||
|
note := noteService.GetNoteByIdAndUserId(noteId, userId)
|
||||||
|
if note.NoteId == "" {
|
||||||
|
return attachs
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO 这里, 优化权限控制
|
||||||
|
|
||||||
db.ListByQ(db.Attachs, bson.M{"NoteId": bson.ObjectIdHex(noteId)}, &attachs)
|
db.ListByQ(db.Attachs, bson.M{"NoteId": bson.ObjectIdHex(noteId)}, &attachs)
|
||||||
|
|
||||||
return attachs
|
return attachs
|
||||||
@@ -114,7 +123,7 @@ 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)
|
||||||
|
|
||||||
if(attach.AttachId != "") {
|
if attach.AttachId != "" {
|
||||||
// 判断是否有权限为笔记添加附件
|
// 判断是否有权限为笔记添加附件
|
||||||
if !shareService.HasUpdateNotePerm(attach.NoteId.Hex(), userId) {
|
if !shareService.HasUpdateNotePerm(attach.NoteId.Hex(), userId) {
|
||||||
return false, "No Perm"
|
return false, "No Perm"
|
||||||
|
|||||||
+30
-22
@@ -2,26 +2,31 @@ package service
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
// "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/revel/revel"
|
// "github.com/revel/revel"
|
||||||
"strings"
|
"errors"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
. "github.com/leanote/leanote/app/lea"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 登录与权限
|
// 登录与权限 Login & Register
|
||||||
|
|
||||||
type AuthService struct {
|
type AuthService struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// pwd已md5了
|
// 使用bcrypt认证或者Md5认证
|
||||||
func (this *AuthService) Login(emailOrUsername, pwd string) info.User {
|
// Use bcrypt (Md5 depreciated)
|
||||||
|
func (this *AuthService) Login(emailOrUsername, pwd string) (info.User, error) {
|
||||||
emailOrUsername = strings.Trim(emailOrUsername, " ")
|
emailOrUsername = strings.Trim(emailOrUsername, " ")
|
||||||
// pwd = strings.Trim(pwd, " ")
|
// pwd = strings.Trim(pwd, " ")
|
||||||
userInfo := userService.LoginGetUserInfo(emailOrUsername, Md5(pwd))
|
userInfo := userService.GetUserInfoByName(emailOrUsername)
|
||||||
return userInfo
|
if userInfo.UserId == "" || !ComparePwd(pwd, userInfo.Pwd) {
|
||||||
|
return userInfo, errors.New("wrong username or password")
|
||||||
|
}
|
||||||
|
return userInfo, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注册
|
// 注册
|
||||||
@@ -40,18 +45,21 @@ func (this *AuthService) Register(email, pwd, fromUserId string) (bool, string)
|
|||||||
if userService.IsExistsUser(email) {
|
if userService.IsExistsUser(email) {
|
||||||
return false, "userHasBeenRegistered-" + email
|
return false, "userHasBeenRegistered-" + email
|
||||||
}
|
}
|
||||||
user := info.User{UserId: bson.NewObjectId(), Email: email, Username: email, Pwd: Md5(pwd)}
|
passwd := GenPwd(pwd)
|
||||||
|
if passwd == "" {
|
||||||
|
return false, "GenerateHash error"
|
||||||
|
}
|
||||||
|
user := info.User{UserId: bson.NewObjectId(), Email: email, Username: email, Pwd: passwd}
|
||||||
if fromUserId != "" && IsObjectId(fromUserId) {
|
if fromUserId != "" && IsObjectId(fromUserId) {
|
||||||
user.FromUserId = bson.ObjectIdHex(fromUserId)
|
user.FromUserId = bson.ObjectIdHex(fromUserId)
|
||||||
}
|
}
|
||||||
LogJ(user)
|
|
||||||
return this.register(user)
|
return this.register(user)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *AuthService) register(user info.User) (bool, string) {
|
func (this *AuthService) register(user info.User) (bool, string) {
|
||||||
if userService.AddUser(user) {
|
if userService.AddUser(user) {
|
||||||
// 添加笔记本, 生活, 学习, 工作
|
// 添加笔记本, 生活, 学习, 工作
|
||||||
userId := user.UserId.Hex();
|
userId := user.UserId.Hex()
|
||||||
notebook := info.Notebook{
|
notebook := info.Notebook{
|
||||||
Seq: -1,
|
Seq: -1,
|
||||||
UserId: user.UserId}
|
UserId: user.UserId}
|
||||||
@@ -60,12 +68,12 @@ func (this *AuthService) register(user info.User) (bool, string) {
|
|||||||
notebook.Title = title
|
notebook.Title = title
|
||||||
notebook.NotebookId = objectId
|
notebook.NotebookId = objectId
|
||||||
notebook.UserId = user.UserId
|
notebook.UserId = user.UserId
|
||||||
notebookService.AddNotebook(notebook);
|
notebookService.AddNotebook(notebook)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加leanote -> 该用户的共享
|
// 添加leanote -> 该用户的共享
|
||||||
registerSharedUserId := configService.GetGlobalStringConfig("registerSharedUserId")
|
registerSharedUserId := configService.GetGlobalStringConfig("registerSharedUserId")
|
||||||
if(registerSharedUserId != "") {
|
if registerSharedUserId != "" {
|
||||||
registerSharedNotebooks := configService.GetGlobalArrMapConfig("registerSharedNotebooks")
|
registerSharedNotebooks := configService.GetGlobalArrMapConfig("registerSharedNotebooks")
|
||||||
registerSharedNotes := configService.GetGlobalArrMapConfig("registerSharedNotes")
|
registerSharedNotes := configService.GetGlobalArrMapConfig("registerSharedNotes")
|
||||||
registerCopyNoteIds := configService.GetGlobalArrayConfig("registerCopyNoteIds")
|
registerCopyNoteIds := configService.GetGlobalArrayConfig("registerCopyNoteIds")
|
||||||
@@ -73,21 +81,21 @@ func (this *AuthService) register(user info.User) (bool, string) {
|
|||||||
// 添加共享笔记本
|
// 添加共享笔记本
|
||||||
for _, notebook := range registerSharedNotebooks {
|
for _, notebook := range registerSharedNotebooks {
|
||||||
perm, _ := strconv.Atoi(notebook["perm"])
|
perm, _ := strconv.Atoi(notebook["perm"])
|
||||||
shareService.AddShareNotebookToUserId(notebook["notebookId"], perm, registerSharedUserId, userId);
|
shareService.AddShareNotebookToUserId(notebook["notebookId"], perm, registerSharedUserId, userId)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加共享笔记
|
// 添加共享笔记
|
||||||
for _, note := range registerSharedNotes {
|
for _, note := range registerSharedNotes {
|
||||||
perm, _ := strconv.Atoi(note["perm"])
|
perm, _ := strconv.Atoi(note["perm"])
|
||||||
shareService.AddShareNoteToUserId(note["noteId"], perm, registerSharedUserId, userId);
|
shareService.AddShareNoteToUserId(note["noteId"], perm, registerSharedUserId, userId)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 复制笔记
|
// 复制笔记
|
||||||
for _, noteId := range registerCopyNoteIds {
|
for _, noteId := range registerCopyNoteIds {
|
||||||
note := noteService.CopySharedNote(noteId, title2Id["life"].Hex(), registerSharedUserId, user.UserId.Hex());
|
note := noteService.CopySharedNote(noteId, title2Id["life"].Hex(), registerSharedUserId, user.UserId.Hex())
|
||||||
// Log(noteId)
|
// Log(noteId)
|
||||||
// Log("Copy")
|
// Log("Copy")
|
||||||
// LogJ(note)
|
// LogJ(note)
|
||||||
noteUpdate := bson.M{"IsBlog": false} // 不要是博客
|
noteUpdate := bson.M{"IsBlog": false} // 不要是博客
|
||||||
noteService.UpdateNote(user.UserId.Hex(), note.NoteId.Hex(), noteUpdate, -1)
|
noteService.UpdateNote(user.UserId.Hex(), note.NoteId.Hex(), noteUpdate, -1)
|
||||||
}
|
}
|
||||||
@@ -115,7 +123,7 @@ func (this *AuthService) register(user info.User) (bool, string) {
|
|||||||
func (this *AuthService) getUsername(thirdType, thirdUsername string) (username string) {
|
func (this *AuthService) getUsername(thirdType, thirdUsername string) (username string) {
|
||||||
username = thirdType + "-" + thirdUsername
|
username = thirdType + "-" + thirdUsername
|
||||||
i := 1
|
i := 1
|
||||||
for ;; {
|
for {
|
||||||
if !userService.IsExistsUserByUsername(username) {
|
if !userService.IsExistsUserByUsername(username) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
+26
-12
@@ -45,7 +45,9 @@ func (this *BlogService) GetBlogByIdAndUrlTitle(userId string, noteIdOrUrlTitle
|
|||||||
return this.GetBlog(noteIdOrUrlTitle)
|
return this.GetBlog(noteIdOrUrlTitle)
|
||||||
}
|
}
|
||||||
note := info.Note{}
|
note := info.Note{}
|
||||||
db.GetByQ(db.Notes, bson.M{"UserId": bson.ObjectIdHex(userId), "UrlTitle": encodeValue(noteIdOrUrlTitle), "IsBlog": true, "IsTrash": false}, ¬e)
|
db.GetByQ(db.Notes, bson.M{"UserId": bson.ObjectIdHex(userId), "UrlTitle": encodeValue(noteIdOrUrlTitle),
|
||||||
|
"IsBlog": true,
|
||||||
|
"IsTrash": false, "IsDeleted": false}, ¬e)
|
||||||
return this.GetBlogItem(note)
|
return this.GetBlogItem(note)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -56,7 +58,7 @@ func (this *BlogService) GetBlog(noteId string) (blog info.BlogItem) {
|
|||||||
}
|
}
|
||||||
func (this *BlogService) GetBlogItem(note info.Note) (blog info.BlogItem) {
|
func (this *BlogService) GetBlogItem(note info.Note) (blog info.BlogItem) {
|
||||||
if note.NoteId == "" || !note.IsBlog {
|
if note.NoteId == "" || !note.IsBlog {
|
||||||
return
|
return info.BlogItem{}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 内容
|
// 内容
|
||||||
@@ -131,7 +133,8 @@ func (this *BlogService) ListBlogs(userId, notebookId string, page, pageSize int
|
|||||||
func (this *BlogService) GetBlogTags(userId string) []info.TagCount {
|
func (this *BlogService) GetBlogTags(userId string) []info.TagCount {
|
||||||
// 得到所有博客
|
// 得到所有博客
|
||||||
tagCounts := []info.TagCount{}
|
tagCounts := []info.TagCount{}
|
||||||
query := bson.M{"UserId": bson.ObjectIdHex(userId), "IsBlog": true}
|
// tag不能为空
|
||||||
|
query := bson.M{"UserId": bson.ObjectIdHex(userId), "IsBlog": true, "Tag": bson.M{"$ne": ""}}
|
||||||
db.TagCounts.Find(query).Sort("-Count").All(&tagCounts)
|
db.TagCounts.Find(query).Sort("-Count").All(&tagCounts)
|
||||||
return tagCounts
|
return tagCounts
|
||||||
}
|
}
|
||||||
@@ -142,7 +145,7 @@ func (this *BlogService) ReCountBlogTags(userId string) bool {
|
|||||||
// 得到所有博客
|
// 得到所有博客
|
||||||
notes := []info.Note{}
|
notes := []info.Note{}
|
||||||
userIdO := bson.ObjectIdHex(userId)
|
userIdO := bson.ObjectIdHex(userId)
|
||||||
query := bson.M{"UserId": userIdO, "IsTrash": false, "IsBlog": true}
|
query := bson.M{"UserId": userIdO, "IsTrash": false, "IsDeleted": false, "IsBlog": true}
|
||||||
db.ListByQWithFields(db.Notes, query, []string{"Tags"}, ¬es)
|
db.ListByQWithFields(db.Notes, query, []string{"Tags"}, ¬es)
|
||||||
|
|
||||||
db.DeleteAll(db.TagCounts, bson.M{"UserId": userIdO, "IsBlog": true})
|
db.DeleteAll(db.TagCounts, bson.M{"UserId": userIdO, "IsBlog": true})
|
||||||
@@ -184,7 +187,7 @@ Posts: []
|
|||||||
*/
|
*/
|
||||||
func (this *BlogService) ListBlogsArchive(userId, notebookId string, year, month int, sortField string, isAsc bool) []info.Archive {
|
func (this *BlogService) ListBlogsArchive(userId, notebookId string, year, month int, sortField string, isAsc bool) []info.Archive {
|
||||||
// _, notes := noteService.ListNotes(userId, notebookId, false, 1, 99999, sortField, isAsc, true);
|
// _, notes := noteService.ListNotes(userId, notebookId, false, 1, 99999, sortField, isAsc, true);
|
||||||
q := bson.M{"UserId": bson.ObjectIdHex(userId), "IsBlog": true, "IsTrash": false}
|
q := bson.M{"UserId": bson.ObjectIdHex(userId), "IsBlog": true, "IsTrash": false, "IsDeleted": false}
|
||||||
if notebookId != "" {
|
if notebookId != "" {
|
||||||
q["NotebookId"] = bson.ObjectIdHex(notebookId)
|
q["NotebookId"] = bson.ObjectIdHex(notebookId)
|
||||||
}
|
}
|
||||||
@@ -292,6 +295,7 @@ func (this *BlogService) SearchBlogByTags(tags []string, userId string, pageNumb
|
|||||||
// 不是trash的
|
// 不是trash的
|
||||||
query := bson.M{"UserId": bson.ObjectIdHex(userId),
|
query := bson.M{"UserId": bson.ObjectIdHex(userId),
|
||||||
"IsTrash": false,
|
"IsTrash": false,
|
||||||
|
"IsDeleted": false,
|
||||||
"IsBlog": true,
|
"IsBlog": true,
|
||||||
"Tags": bson.M{"$all": tags}}
|
"Tags": bson.M{"$all": tags}}
|
||||||
|
|
||||||
@@ -393,10 +397,12 @@ func (this *BlogService) PreNextBlog(userId string, sorterField string, isAsc bo
|
|||||||
sortFieldR2 = sorterField
|
sortFieldR2 = sorterField
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 1
|
||||||
// 上一篇, 比基时间要小, 但是是最后一篇, 所以是降序
|
// 上一篇, 比基时间要小, 但是是最后一篇, 所以是降序
|
||||||
note := info.Note{}
|
note := info.Note{}
|
||||||
query := bson.M{"UserId": userIdO,
|
query := bson.M{"UserId": userIdO,
|
||||||
"IsTrash": false,
|
"IsTrash": false,
|
||||||
|
"IsDeleted": false,
|
||||||
"IsBlog": true,
|
"IsBlog": true,
|
||||||
"_id": bson.M{"$ne": bson.ObjectIdHex(noteId)},
|
"_id": bson.M{"$ne": bson.ObjectIdHex(noteId)},
|
||||||
sorterField: sortFieldT1,
|
sorterField: sortFieldT1,
|
||||||
@@ -430,7 +436,7 @@ func (this *BlogService) ListAllBlogs(userId, tag string, keywords string, isRec
|
|||||||
skipNum, sortFieldR := parsePageAndSort(page, pageSize, sorterField, isAsc)
|
skipNum, sortFieldR := parsePageAndSort(page, pageSize, sorterField, isAsc)
|
||||||
|
|
||||||
// 不是trash的
|
// 不是trash的
|
||||||
query := bson.M{"IsTrash": false, "IsBlog": true, "Title": bson.M{"$ne": "欢迎来到leanote!"}}
|
query := bson.M{"IsTrash": false, "IsDeleted": false, "IsBlog": true, "Title": bson.M{"$ne": "欢迎来到leanote!"}}
|
||||||
if tag != "" {
|
if tag != "" {
|
||||||
query["Tags"] = bson.M{"$in": []string{tag}}
|
query["Tags"] = bson.M{"$in": []string{tag}}
|
||||||
}
|
}
|
||||||
@@ -496,6 +502,9 @@ func (this *BlogService) ListAllBlogs(userId, tag string, keywords string, isRec
|
|||||||
content = noteContent.Abstract
|
content = noteContent.Abstract
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
if len(note.Tags) == 1 && note.Tags[0] == "" {
|
||||||
|
note.Tags = nil
|
||||||
|
}
|
||||||
blogs[i] = info.BlogItem{note, "", content, hasMore, userMap[note.UserId]}
|
blogs[i] = info.BlogItem{note, "", content, hasMore, userMap[note.UserId]}
|
||||||
}
|
}
|
||||||
pageInfo = info.NewPage(page, pageSize, count, nil)
|
pageInfo = info.NewPage(page, pageSize, count, nil)
|
||||||
@@ -509,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 == "" {
|
||||||
@@ -910,7 +919,7 @@ func (this *BlogService) UpateCateUrlTitle(userId string, cateId, urlTitle strin
|
|||||||
"UrlTitle": "",
|
"UrlTitle": "",
|
||||||
})
|
})
|
||||||
*/
|
*/
|
||||||
url = GetUrTitle(userId, urlTitle, "notebook")
|
url = GetUrTitle(userId, urlTitle, "notebook", cateId)
|
||||||
ok = db.UpdateByIdAndUserIdMap(db.Notebooks, cateId, userId, bson.M{
|
ok = db.UpdateByIdAndUserIdMap(db.Notebooks, cateId, userId, bson.M{
|
||||||
"UrlTitle": url,
|
"UrlTitle": url,
|
||||||
})
|
})
|
||||||
@@ -926,7 +935,7 @@ func (this *BlogService) UpateBlogUrlTitle(userId string, noteId, urlTitle strin
|
|||||||
ok = db.UpdateByIdAndUserIdMap(db.Notes, noteId, userId, bson.M{
|
ok = db.UpdateByIdAndUserIdMap(db.Notes, noteId, userId, bson.M{
|
||||||
"UrlTitle": "",
|
"UrlTitle": "",
|
||||||
})
|
})
|
||||||
url = GetUrTitle(userId, urlTitle, "note")
|
url = GetUrTitle(userId, urlTitle, "note", noteId)
|
||||||
ok = db.UpdateByIdAndUserIdMap(db.Notes, noteId, userId, bson.M{
|
ok = db.UpdateByIdAndUserIdMap(db.Notes, noteId, userId, bson.M{
|
||||||
"UrlTitle": url,
|
"UrlTitle": url,
|
||||||
})
|
})
|
||||||
@@ -1027,7 +1036,7 @@ func (this *BlogService) UpdateSingleUrlTitle(userId, singleId, urlTitle string)
|
|||||||
"UrlTitle": "",
|
"UrlTitle": "",
|
||||||
})
|
})
|
||||||
*/
|
*/
|
||||||
url = GetUrTitle(userId, urlTitle, "single")
|
url = GetUrTitle(userId, urlTitle, "single", singleId)
|
||||||
ok = db.UpdateByIdAndUserIdMap(db.BlogSingles, singleId, userId, bson.M{
|
ok = db.UpdateByIdAndUserIdMap(db.BlogSingles, singleId, userId, bson.M{
|
||||||
"UrlTitle": url,
|
"UrlTitle": url,
|
||||||
})
|
})
|
||||||
@@ -1061,7 +1070,7 @@ func (this *BlogService) AddOrUpdateSingle(userId, singleId, title, content stri
|
|||||||
UserId: bson.ObjectIdHex(userId),
|
UserId: bson.ObjectIdHex(userId),
|
||||||
Title: title,
|
Title: title,
|
||||||
Content: content,
|
Content: content,
|
||||||
UrlTitle: GetUrTitle(userId, title, "single"),
|
UrlTitle: GetUrTitle(userId, title, "single", singleId),
|
||||||
CreatedTime: time.Now(),
|
CreatedTime: time.Now(),
|
||||||
}
|
}
|
||||||
page.UpdatedTime = page.CreatedTime
|
page.UpdatedTime = page.CreatedTime
|
||||||
@@ -1099,6 +1108,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)
|
||||||
@@ -1109,12 +1119,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)
|
||||||
@@ -1135,6 +1148,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 := ""
|
||||||
@@ -1153,7 +1167,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,
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"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"
|
||||||
"github.com/leanote/leanote/app/db"
|
|
||||||
"gopkg.in/mgo.v2/bson"
|
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
"time"
|
"gopkg.in/mgo.v2/bson"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"fmt"
|
|
||||||
"strings"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 配置服务
|
// 配置服务
|
||||||
@@ -27,6 +27,7 @@ type ConfigService struct {
|
|||||||
GlobalMapConfigs map[string]map[string]string
|
GlobalMapConfigs map[string]map[string]string
|
||||||
GlobalArrMapConfigs map[string][]map[string]string
|
GlobalArrMapConfigs map[string][]map[string]string
|
||||||
}
|
}
|
||||||
|
|
||||||
// appStart时 将全局的配置从数据库中得到作为全局
|
// appStart时 将全局的配置从数据库中得到作为全局
|
||||||
func (this *ConfigService) InitGlobalConfigs() bool {
|
func (this *ConfigService) InitGlobalConfigs() bool {
|
||||||
this.GlobalAllConfigs = map[string]interface{}{}
|
this.GlobalAllConfigs = map[string]interface{}{}
|
||||||
@@ -66,11 +67,21 @@ 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 {
|
||||||
return this.siteUrl;
|
s := this.GetGlobalStringConfig("siteUrl")
|
||||||
|
if s != "" {
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.siteUrl
|
||||||
}
|
}
|
||||||
func (this *ConfigService) GetAdminUsername() string {
|
func (this *ConfigService) GetAdminUsername() string {
|
||||||
return this.adminUsername
|
return this.adminUsername
|
||||||
@@ -92,7 +103,7 @@ func (this *ConfigService) updateGlobalConfig(userId, key string, value interfac
|
|||||||
IsArrMap: isArrMap,
|
IsArrMap: isArrMap,
|
||||||
UpdatedTime: time.Now(),
|
UpdatedTime: time.Now(),
|
||||||
}
|
}
|
||||||
if(isArr) {
|
if isArr {
|
||||||
v, _ := value.([]string)
|
v, _ := value.([]string)
|
||||||
config.ValueArr = v
|
config.ValueArr = v
|
||||||
this.GlobalArrayConfigs[key] = v
|
this.GlobalArrayConfigs[key] = v
|
||||||
@@ -113,7 +124,7 @@ func (this *ConfigService) updateGlobalConfig(userId, key string, value interfac
|
|||||||
} else {
|
} else {
|
||||||
i := bson.M{"UpdatedTime": time.Now()}
|
i := bson.M{"UpdatedTime": time.Now()}
|
||||||
this.GlobalAllConfigs[key] = value
|
this.GlobalAllConfigs[key] = value
|
||||||
if(isArr) {
|
if isArr {
|
||||||
v, _ := value.([]string)
|
v, _ := value.([]string)
|
||||||
i["ValueArr"] = v
|
i["ValueArr"] = v
|
||||||
this.GlobalArrayConfigs[key] = v
|
this.GlobalArrayConfigs[key] = v
|
||||||
@@ -177,6 +188,7 @@ func (this *ConfigService) GetGlobalArrMapConfig(key string) []map[string]string
|
|||||||
func (this *ConfigService) IsOpenRegister() bool {
|
func (this *ConfigService) IsOpenRegister() bool {
|
||||||
return this.GetGlobalStringConfig("openRegister") != ""
|
return this.GetGlobalStringConfig("openRegister") != ""
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------
|
//-------
|
||||||
// 修改共享笔记的配置
|
// 修改共享笔记的配置
|
||||||
func (this *ConfigService) UpdateShareNoteConfig(registerSharedUserId string,
|
func (this *ConfigService) UpdateShareNoteConfig(registerSharedUserId string,
|
||||||
@@ -188,7 +200,7 @@ func (this *ConfigService) UpdateShareNoteConfig(registerSharedUserId string,
|
|||||||
ok = false
|
ok = false
|
||||||
msg = fmt.Sprint(err)
|
msg = fmt.Sprint(err)
|
||||||
}
|
}
|
||||||
}();
|
}()
|
||||||
|
|
||||||
// 用户是否存在?
|
// 用户是否存在?
|
||||||
if registerSharedUserId == "" {
|
if registerSharedUserId == "" {
|
||||||
@@ -222,7 +234,7 @@ func (this *ConfigService) UpdateShareNoteConfig(registerSharedUserId string,
|
|||||||
msg = "The user has no such notebook: " + notebookId
|
msg = "The user has no such notebook: " + notebookId
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
perm := "0";
|
perm := "0"
|
||||||
if registerSharedNotebookPerms[i] == 1 {
|
if registerSharedNotebookPerms[i] == 1 {
|
||||||
perm = "1"
|
perm = "1"
|
||||||
}
|
}
|
||||||
@@ -247,7 +259,7 @@ func (this *ConfigService) UpdateShareNoteConfig(registerSharedUserId string,
|
|||||||
msg = "The user has no such note: " + noteId
|
msg = "The user has no such note: " + noteId
|
||||||
return
|
return
|
||||||
} else {
|
} else {
|
||||||
perm := "0";
|
perm := "0"
|
||||||
if registerSharedNotePerms[i] == 1 {
|
if registerSharedNotePerms[i] == 1 {
|
||||||
perm = "1"
|
perm = "1"
|
||||||
}
|
}
|
||||||
@@ -298,7 +310,7 @@ func (this *ConfigService) getBackupDirname() string {
|
|||||||
}
|
}
|
||||||
func (this *ConfigService) Backup(remark string) (ok bool, msg string) {
|
func (this *ConfigService) Backup(remark string) (ok bool, msg string) {
|
||||||
binPath := configService.GetGlobalStringConfig("mongodumpPath")
|
binPath := configService.GetGlobalStringConfig("mongodumpPath")
|
||||||
config := revel.Config;
|
config := revel.Config
|
||||||
dbname, _ := config.String("db.dbname")
|
dbname, _ := config.String("db.dbname")
|
||||||
host, _ := revel.Config.String("db.host")
|
host, _ := revel.Config.String("db.host")
|
||||||
port, _ := revel.Config.String("db.port")
|
port, _ := revel.Config.String("db.port")
|
||||||
@@ -320,7 +332,7 @@ func (this *ConfigService) Backup(remark string) (ok bool, msg string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cmd := exec.Command("/bin/sh", "-c", binPath)
|
cmd := exec.Command("/bin/sh", "-c", binPath)
|
||||||
Log(binPath);
|
Log(binPath)
|
||||||
b, err := cmd.Output()
|
b, err := cmd.Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
msg = fmt.Sprintf("%v", err)
|
msg = fmt.Sprintf("%v", err)
|
||||||
@@ -332,6 +344,7 @@ func (this *ConfigService) Backup(remark string) (ok bool, msg string) {
|
|||||||
ok = configService.AddBackup(dir, remark)
|
ok = configService.AddBackup(dir, remark)
|
||||||
return ok, msg
|
return ok, msg
|
||||||
}
|
}
|
||||||
|
|
||||||
// 还原
|
// 还原
|
||||||
func (this *ConfigService) Restore(createdTime string) (ok bool, msg string) {
|
func (this *ConfigService) Restore(createdTime string) (ok bool, msg string) {
|
||||||
backups := this.GetGlobalArrMapConfig("backups") // [{}, {}]
|
backups := this.GetGlobalArrMapConfig("backups") // [{}, {}]
|
||||||
@@ -339,7 +352,7 @@ func (this *ConfigService) Restore(createdTime string) (ok bool, msg string) {
|
|||||||
var backup map[string]string
|
var backup map[string]string
|
||||||
for i, backup = range backups {
|
for i, backup = range backups {
|
||||||
if backup["createdTime"] == createdTime {
|
if backup["createdTime"] == createdTime {
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if i == len(backups) {
|
if i == len(backups) {
|
||||||
@@ -347,14 +360,14 @@ func (this *ConfigService) Restore(createdTime string) (ok bool, msg string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 先备份当前
|
// 先备份当前
|
||||||
ok, msg = this.Backup("Auto backup when restore from " + backup["createdTime"] )
|
ok, msg = this.Backup("Auto backup when restore from " + backup["createdTime"])
|
||||||
if !ok {
|
if !ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// mongorestore -h localhost -d leanote --directoryperdb /home/user1/gopackage/src/github.com/leanote/leanote/mongodb_backup/leanote_install_data/
|
// mongorestore -h localhost -d leanote --directoryperdb /home/user1/gopackage/src/github.com/leanote/leanote/mongodb_backup/leanote_install_data/
|
||||||
binPath := configService.GetGlobalStringConfig("mongorestorePath")
|
binPath := configService.GetGlobalStringConfig("mongorestorePath")
|
||||||
config := revel.Config;
|
config := revel.Config
|
||||||
dbname, _ := config.String("db.dbname")
|
dbname, _ := config.String("db.dbname")
|
||||||
host, _ := revel.Config.String("db.host")
|
host, _ := revel.Config.String("db.host")
|
||||||
port, _ := revel.Config.String("db.port")
|
port, _ := revel.Config.String("db.port")
|
||||||
@@ -375,7 +388,7 @@ func (this *ConfigService) Restore(createdTime string) (ok bool, msg string) {
|
|||||||
binPath += " " + path
|
binPath += " " + path
|
||||||
|
|
||||||
cmd := exec.Command("/bin/sh", "-c", binPath)
|
cmd := exec.Command("/bin/sh", "-c", binPath)
|
||||||
Log(binPath);
|
Log(binPath)
|
||||||
b, err := cmd.Output()
|
b, err := cmd.Output()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
msg = fmt.Sprintf("%v", err)
|
msg = fmt.Sprintf("%v", err)
|
||||||
@@ -393,7 +406,7 @@ func (this *ConfigService) DeleteBackup(createdTime string) (bool, string) {
|
|||||||
var backup map[string]string
|
var backup map[string]string
|
||||||
for i, backup = range backups {
|
for i, backup = range backups {
|
||||||
if backup["createdTime"] == createdTime {
|
if backup["createdTime"] == createdTime {
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if i == len(backups) {
|
if i == len(backups) {
|
||||||
@@ -419,13 +432,13 @@ func (this *ConfigService) UpdateBackupRemark(createdTime, remark string) (bool,
|
|||||||
var backup map[string]string
|
var backup map[string]string
|
||||||
for i, backup = range backups {
|
for i, backup = range backups {
|
||||||
if backup["createdTime"] == createdTime {
|
if backup["createdTime"] == createdTime {
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if i == len(backups) {
|
if i == len(backups) {
|
||||||
return false, "Backup Not Found"
|
return false, "Backup Not Found"
|
||||||
}
|
}
|
||||||
backup["remark"] = remark;
|
backup["remark"] = remark
|
||||||
|
|
||||||
ok := this.UpdateGlobalArrMapConfig(this.adminUserId, "backups", backups)
|
ok := this.UpdateGlobalArrMapConfig(this.adminUserId, "backups", backups)
|
||||||
return ok, ""
|
return ok, ""
|
||||||
@@ -438,7 +451,7 @@ func (this *ConfigService) GetBackup(createdTime string) (map[string]string, boo
|
|||||||
var backup map[string]string
|
var backup map[string]string
|
||||||
for i, backup = range backups {
|
for i, backup = range backups {
|
||||||
if backup["createdTime"] == createdTime {
|
if backup["createdTime"] == createdTime {
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if i == len(backups) {
|
if i == len(backups) {
|
||||||
@@ -487,49 +500,36 @@ func init() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *ConfigService) GetSchema() string {
|
func (this *ConfigService) GetSchema() string {
|
||||||
return schema;
|
return schema
|
||||||
}
|
}
|
||||||
|
|
||||||
// 默认
|
// 默认
|
||||||
func (this *ConfigService) GetDefaultDomain() string {
|
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()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *ConfigService) GetUserUrl(domain string) string {
|
func (this *ConfigService) GetUserUrl(domain string) string {
|
||||||
@@ -543,6 +543,7 @@ func (this *ConfigService) GetUserSubUrl(subDomain string) string {
|
|||||||
func (this *ConfigService) AllowCustomDomain() bool {
|
func (this *ConfigService) AllowCustomDomain() bool {
|
||||||
return configService.GetGlobalStringConfig("allowCustomDomain") != ""
|
return configService.GetGlobalStringConfig("allowCustomDomain") != ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// 是否是好的自定义域名
|
// 是否是好的自定义域名
|
||||||
func (this *ConfigService) IsGoodCustomDomain(domain string) bool {
|
func (this *ConfigService) IsGoodCustomDomain(domain string) bool {
|
||||||
blacks := this.GetGlobalArrayConfig("blackCustomDomains")
|
blacks := this.GetGlobalArrayConfig("blackCustomDomains")
|
||||||
@@ -567,20 +568,29 @@ func (this *ConfigService) IsGoodSubDomain(domain string) bool {
|
|||||||
// 上传大小
|
// 上传大小
|
||||||
func (this *ConfigService) GetUploadSize(key string) float64 {
|
func (this *ConfigService) GetUploadSize(key string) float64 {
|
||||||
f, _ := strconv.ParseFloat(this.GetGlobalStringConfig(key), 64)
|
f, _ := strconv.ParseFloat(this.GetGlobalStringConfig(key), 64)
|
||||||
return f;
|
return f
|
||||||
|
}
|
||||||
|
func (this *ConfigService) GetInt64(key string) int64 {
|
||||||
|
f, _ := strconv.ParseInt(this.GetGlobalStringConfig(key), 10, 64)
|
||||||
|
return f
|
||||||
|
}
|
||||||
|
func (this *ConfigService) GetInt32(key string) int32 {
|
||||||
|
f, _ := strconv.ParseInt(this.GetGlobalStringConfig(key), 10, 32)
|
||||||
|
return int32(f)
|
||||||
}
|
}
|
||||||
func (this *ConfigService) GetUploadSizeLimit() map[string]float64 {
|
func (this *ConfigService) GetUploadSizeLimit() map[string]float64 {
|
||||||
return map[string]float64{
|
return map[string]float64{
|
||||||
"uploadImageSize": this.GetUploadSize("uploadImageSize"),
|
"uploadImageSize": this.GetUploadSize("uploadImageSize"),
|
||||||
"uploadBlogLogoSize":this.GetUploadSize("uploadBlogLogoSize"),
|
"uploadBlogLogoSize": this.GetUploadSize("uploadBlogLogoSize"),
|
||||||
"uploadAttachSize":this.GetUploadSize("uploadAttachSize"),
|
"uploadAttachSize": this.GetUploadSize("uploadAttachSize"),
|
||||||
"uploadAvatarSize":this.GetUploadSize("uploadAvatarSize"),
|
"uploadAvatarSize": this.GetUploadSize("uploadAvatarSize"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 为用户得到全局的配置
|
// 为用户得到全局的配置
|
||||||
// NoteController调用
|
// NoteController调用
|
||||||
func (this *ConfigService) GetGlobalConfigForUser() map[string]interface{} {
|
func (this *ConfigService) GetGlobalConfigForUser() map[string]interface{} {
|
||||||
uploadSizeConfigs := this.GetUploadSizeLimit();
|
uploadSizeConfigs := this.GetUploadSizeLimit()
|
||||||
config := map[string]interface{}{}
|
config := map[string]interface{}{}
|
||||||
for k, v := range uploadSizeConfigs {
|
for k, v := range uploadSizeConfigs {
|
||||||
config[k] = v
|
config[k] = v
|
||||||
@@ -594,5 +604,5 @@ func (this *ConfigService) HomePageIsAdminsBlog() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *ConfigService) GetVersion() string {
|
func (this *ConfigService) GetVersion() string {
|
||||||
return "1.0-beta.4"
|
return "2.0"
|
||||||
}
|
}
|
||||||
+46
-46
@@ -1,17 +1,17 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/info"
|
"bytes"
|
||||||
|
"fmt"
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
|
"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"
|
"html/template"
|
||||||
"strings"
|
|
||||||
"net/smtp"
|
"net/smtp"
|
||||||
"strconv"
|
"strconv"
|
||||||
"fmt"
|
"strings"
|
||||||
"html/template"
|
"time"
|
||||||
"bytes"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
// 发送邮件
|
// 发送邮件
|
||||||
@@ -20,7 +20,7 @@ type EmailService struct {
|
|||||||
tpls map[string]*template.Template
|
tpls map[string]*template.Template
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewEmailService() (*EmailService) {
|
func NewEmailService() *EmailService {
|
||||||
return &EmailService{tpls: map[string]*template.Template{}}
|
return &EmailService{tpls: map[string]*template.Template{}}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,12 +50,12 @@ func (this *EmailService) SendEmail(to, subject, body string) (ok bool, e string
|
|||||||
|
|
||||||
mailtype := "html"
|
mailtype := "html"
|
||||||
if mailtype == "html" {
|
if mailtype == "html" {
|
||||||
content_type = "Content-Type: text/"+ mailtype + "; charset=UTF-8"
|
content_type = "Content-Type: text/" + mailtype + "; charset=UTF-8"
|
||||||
} else{
|
} else {
|
||||||
content_type = "Content-Type: text/plain" + "; charset=UTF-8"
|
content_type = "Content-Type: text/plain" + "; charset=UTF-8"
|
||||||
}
|
}
|
||||||
|
|
||||||
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)
|
err := smtp.SendMail(host+":"+emailPort, auth, username, send_to, msg)
|
||||||
|
|
||||||
@@ -75,10 +75,10 @@ func (this *EmailService) RegisterSendActiveEmail(userInfo info.User, email stri
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
subject := configService.GetGlobalStringConfig("emailTemplateRegisterSubject");
|
subject := configService.GetGlobalStringConfig("emailTemplateRegisterSubject")
|
||||||
tpl := configService.GetGlobalStringConfig("emailTemplateRegister");
|
tpl := configService.GetGlobalStringConfig("emailTemplateRegister")
|
||||||
|
|
||||||
if(tpl == "") {
|
if tpl == "" {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -118,8 +118,8 @@ func (this *EmailService) UpdateEmailSendActiveEmail(userInfo info.User, email s
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
subject := configService.GetGlobalStringConfig("emailTemplateUpdateEmailSubject");
|
subject := configService.GetGlobalStringConfig("emailTemplateUpdateEmailSubject")
|
||||||
tpl := configService.GetGlobalStringConfig("emailTemplateUpdateEmail");
|
tpl := configService.GetGlobalStringConfig("emailTemplateUpdateEmail")
|
||||||
|
|
||||||
// 发送邮件
|
// 发送邮件
|
||||||
tokenUrl := configService.GetSiteUrl() + "/user/updateEmail?token=" + token
|
tokenUrl := configService.GetSiteUrl() + "/user/updateEmail?token=" + token
|
||||||
@@ -144,8 +144,8 @@ func (this *EmailService) UpdateEmailSendActiveEmail(userInfo info.User, email s
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *EmailService) FindPwdSendEmail(token, email string) (ok bool, msg string) {
|
func (this *EmailService) FindPwdSendEmail(token, email string) (ok bool, msg string) {
|
||||||
subject := configService.GetGlobalStringConfig("emailTemplateFindPasswordSubject");
|
subject := configService.GetGlobalStringConfig("emailTemplateFindPasswordSubject")
|
||||||
tpl := configService.GetGlobalStringConfig("emailTemplateFindPassword");
|
tpl := configService.GetGlobalStringConfig("emailTemplateFindPassword")
|
||||||
|
|
||||||
// 发送邮件
|
// 发送邮件
|
||||||
tokenUrl := configService.GetSiteUrl() + "/findPassword/" + token
|
tokenUrl := configService.GetSiteUrl() + "/findPassword/" + token
|
||||||
@@ -164,8 +164,8 @@ func (this *EmailService) FindPwdSendEmail(token, email string) (ok bool, msg st
|
|||||||
|
|
||||||
// 发送邀请链接
|
// 发送邀请链接
|
||||||
func (this *EmailService) SendInviteEmail(userInfo info.User, email, content string) bool {
|
func (this *EmailService) SendInviteEmail(userInfo info.User, email, content string) bool {
|
||||||
subject := configService.GetGlobalStringConfig("emailTemplateInviteSubject");
|
subject := configService.GetGlobalStringConfig("emailTemplateInviteSubject")
|
||||||
tpl := configService.GetGlobalStringConfig("emailTemplateInvite");
|
tpl := configService.GetGlobalStringConfig("emailTemplateInvite")
|
||||||
|
|
||||||
token2Value := map[string]interface{}{"siteUrl": configService.GetSiteUrl(),
|
token2Value := map[string]interface{}{"siteUrl": configService.GetSiteUrl(),
|
||||||
"registerUrl": configService.GetSiteUrl() + "/register?from=" + userInfo.Username,
|
"registerUrl": configService.GetSiteUrl() + "/register?from=" + userInfo.Username,
|
||||||
@@ -187,8 +187,8 @@ func (this *EmailService) SendInviteEmail(userInfo info.User, email, content str
|
|||||||
|
|
||||||
// 发送评论
|
// 发送评论
|
||||||
func (this *EmailService) SendCommentEmail(note info.Note, comment info.BlogComment, userId, content string) bool {
|
func (this *EmailService) SendCommentEmail(note info.Note, comment info.BlogComment, userId, content string) bool {
|
||||||
subject := configService.GetGlobalStringConfig("emailTemplateCommentSubject");
|
subject := configService.GetGlobalStringConfig("emailTemplateCommentSubject")
|
||||||
tpl := configService.GetGlobalStringConfig("emailTemplateComment");
|
tpl := configService.GetGlobalStringConfig("emailTemplateComment")
|
||||||
|
|
||||||
// title := "评论提醒"
|
// title := "评论提醒"
|
||||||
|
|
||||||
@@ -257,17 +257,16 @@ func (this *EmailService) SendCommentEmail(note info.Note, comment info.BlogComm
|
|||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 验证模板是否正确
|
// 验证模板是否正确
|
||||||
func (this *EmailService) ValidTpl(str string) (ok bool, msg string){
|
func (this *EmailService) ValidTpl(str string) (ok bool, msg string) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := recover(); err != nil {
|
if err := recover(); err != nil {
|
||||||
ok = false
|
ok = false
|
||||||
msg = fmt.Sprint(err)
|
msg = fmt.Sprint(err)
|
||||||
}
|
}
|
||||||
}();
|
}()
|
||||||
header := configService.GetGlobalStringConfig("emailTemplateHeader");
|
header := configService.GetGlobalStringConfig("emailTemplateHeader")
|
||||||
footer := configService.GetGlobalStringConfig("emailTemplateFooter");
|
footer := configService.GetGlobalStringConfig("emailTemplateFooter")
|
||||||
str = strings.Replace(str, "{{header}}", header, -1)
|
str = strings.Replace(str, "{{header}}", header, -1)
|
||||||
str = strings.Replace(str, "{{footer}}", footer, -1)
|
str = strings.Replace(str, "{{footer}}", footer, -1)
|
||||||
_, err := template.New("tpl name").Parse(str)
|
_, err := template.New("tpl name").Parse(str)
|
||||||
@@ -280,13 +279,13 @@ func (this *EmailService) ValidTpl(str string) (ok bool, msg string){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ok, msg, subject, tpl
|
// ok, msg, subject, tpl
|
||||||
func (this *EmailService) getTpl(str string) (ok bool, msg string, tpl *template.Template){
|
func (this *EmailService) getTpl(str string) (ok bool, msg string, tpl *template.Template) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if err := recover(); err != nil {
|
if err := recover(); err != nil {
|
||||||
ok = false
|
ok = false
|
||||||
msg = fmt.Sprint(err)
|
msg = fmt.Sprint(err)
|
||||||
}
|
}
|
||||||
}();
|
}()
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
var has bool
|
var has bool
|
||||||
@@ -312,16 +311,16 @@ func (this *EmailService) renderEmail(subject, body string, values map[string]in
|
|||||||
ok = false
|
ok = false
|
||||||
msg = fmt.Sprint(err) // 这里的err其实就是panic传入的内容,
|
msg = fmt.Sprint(err) // 这里的err其实就是panic传入的内容,
|
||||||
}
|
}
|
||||||
}();
|
}()
|
||||||
|
|
||||||
var tpl *template.Template
|
var tpl *template.Template
|
||||||
|
|
||||||
values["siteUrl"] = configService.GetSiteUrl();
|
values["siteUrl"] = configService.GetSiteUrl()
|
||||||
|
|
||||||
// subject
|
// subject
|
||||||
if subject != "" {
|
if subject != "" {
|
||||||
ok, msg, tpl = this.getTpl(subject)
|
ok, msg, tpl = this.getTpl(subject)
|
||||||
if(!ok) {
|
if !ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var buffer bytes.Buffer
|
var buffer bytes.Buffer
|
||||||
@@ -336,13 +335,13 @@ func (this *EmailService) renderEmail(subject, body string, values map[string]in
|
|||||||
}
|
}
|
||||||
|
|
||||||
// content
|
// content
|
||||||
header := configService.GetGlobalStringConfig("emailTemplateHeader");
|
header := configService.GetGlobalStringConfig("emailTemplateHeader")
|
||||||
footer := configService.GetGlobalStringConfig("emailTemplateFooter");
|
footer := configService.GetGlobalStringConfig("emailTemplateFooter")
|
||||||
body = strings.Replace(body, "{{header}}", header, -1)
|
body = strings.Replace(body, "{{header}}", header, -1)
|
||||||
body = strings.Replace(body, "{{footer}}", footer, -1)
|
body = strings.Replace(body, "{{footer}}", footer, -1)
|
||||||
values["subject"] = o
|
values["subject"] = o
|
||||||
ok, msg, tpl = this.getTpl(body)
|
ok, msg, tpl = this.getTpl(body)
|
||||||
if(!ok) {
|
if !ok {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
var buffer2 bytes.Buffer
|
var buffer2 bytes.Buffer
|
||||||
@@ -359,14 +358,14 @@ func (this *EmailService) renderEmail(subject, body string, values map[string]in
|
|||||||
// 发送email给用户
|
// 发送email给用户
|
||||||
// 需要记录
|
// 需要记录
|
||||||
func (this *EmailService) SendEmailToUsers(users []info.User, subject, body string) (ok bool, msg string) {
|
func (this *EmailService) SendEmailToUsers(users []info.User, subject, body string) (ok bool, msg string) {
|
||||||
if(users == nil || len(users) == 0) {
|
if users == nil || len(users) == 0 {
|
||||||
msg = "no users"
|
msg = "no users"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 尝试renderHtml
|
// 尝试renderHtml
|
||||||
ok, msg, _, _ = this.renderEmail(subject, body, map[string]interface{}{})
|
ok, msg, _, _ = this.renderEmail(subject, body, map[string]interface{}{})
|
||||||
if(!ok) {
|
if !ok {
|
||||||
Log(msg)
|
Log(msg)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -381,8 +380,8 @@ func (this *EmailService) SendEmailToUsers(users []info.User, subject, body stri
|
|||||||
ok2, msg2, subject2, body2 := this.renderEmail(subject, body, m)
|
ok2, msg2, subject2, body2 := this.renderEmail(subject, body, m)
|
||||||
ok = ok2
|
ok = ok2
|
||||||
msg = msg2
|
msg = msg2
|
||||||
if(ok2) {
|
if ok2 {
|
||||||
sendOk, msg := this.SendEmail(user.Email, subject2, body2);
|
sendOk, msg := this.SendEmail(user.Email, subject2, body2)
|
||||||
this.AddEmailLog(user.Email, subject, body, sendOk, msg) // 把模板记录下
|
this.AddEmailLog(user.Email, subject, body, sendOk, msg) // 把模板记录下
|
||||||
// 记录到Email Log
|
// 记录到Email Log
|
||||||
if sendOk {
|
if sendOk {
|
||||||
@@ -400,19 +399,19 @@ func (this *EmailService) SendEmailToUsers(users []info.User, subject, body stri
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *EmailService) SendEmailToEmails(emails []string, subject, body string) (ok bool, msg string) {
|
func (this *EmailService) SendEmailToEmails(emails []string, subject, body string) (ok bool, msg string) {
|
||||||
if(emails == nil || len(emails) == 0) {
|
if emails == nil || len(emails) == 0 {
|
||||||
msg = "no emails"
|
msg = "no emails"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 尝试renderHtml
|
// 尝试renderHtml
|
||||||
ok, msg, _, _ = this.renderEmail(subject, body, map[string]interface{}{})
|
ok, msg, _, _ = this.renderEmail(subject, body, map[string]interface{}{})
|
||||||
if(!ok) {
|
if !ok {
|
||||||
Log(msg)
|
Log(msg)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// go func() {
|
// go func() {
|
||||||
for _, email := range emails {
|
for _, email := range emails {
|
||||||
if email == "" {
|
if email == "" {
|
||||||
continue
|
continue
|
||||||
@@ -420,8 +419,8 @@ func (this *EmailService) SendEmailToEmails(emails []string, subject, body strin
|
|||||||
m := map[string]interface{}{}
|
m := map[string]interface{}{}
|
||||||
m["email"] = email
|
m["email"] = email
|
||||||
ok, msg, subject, body = this.renderEmail(subject, body, m)
|
ok, msg, subject, body = this.renderEmail(subject, body, m)
|
||||||
if(ok) {
|
if ok {
|
||||||
sendOk, msg := this.SendEmail(email, subject, body);
|
sendOk, msg := this.SendEmail(email, subject, body)
|
||||||
this.AddEmailLog(email, subject, body, sendOk, msg)
|
this.AddEmailLog(email, subject, body, sendOk, msg)
|
||||||
// 记录到Email Log
|
// 记录到Email Log
|
||||||
if sendOk {
|
if sendOk {
|
||||||
@@ -430,10 +429,10 @@ func (this *EmailService) SendEmailToEmails(emails []string, subject, body strin
|
|||||||
Log("no " + email)
|
Log("no " + email)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Log(msg);
|
Log(msg)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// }()
|
// }()
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -443,6 +442,7 @@ func (this *EmailService) AddEmailLog(email, subject, body string, ok bool, msg
|
|||||||
log := info.EmailLog{LogId: bson.NewObjectId(), Email: email, Subject: subject, Body: body, Ok: ok, Msg: msg, CreatedTime: time.Now()}
|
log := info.EmailLog{LogId: bson.NewObjectId(), Email: email, Subject: subject, Body: body, Ok: ok, Msg: msg, CreatedTime: time.Now()}
|
||||||
db.Insert(db.EmailLogs, log)
|
db.Insert(db.EmailLogs, log)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 展示邮件日志
|
// 展示邮件日志
|
||||||
|
|
||||||
func (this *EmailService) DeleteEmails(ids []string) bool {
|
func (this *EmailService) DeleteEmails(ids []string) bool {
|
||||||
@@ -461,7 +461,7 @@ func (this *EmailService) ListEmailLogs(pageNumber, pageSize int, sortField stri
|
|||||||
if email != "" {
|
if email != "" {
|
||||||
query["Email"] = bson.M{"$regex": bson.RegEx{".*?" + email + ".*", "i"}}
|
query["Email"] = bson.M{"$regex": bson.RegEx{".*?" + email + ".*", "i"}}
|
||||||
}
|
}
|
||||||
q := db.EmailLogs.Find(query);
|
q := db.EmailLogs.Find(query)
|
||||||
// 总记录数
|
// 总记录数
|
||||||
count, _ := q.Count()
|
count, _ := q.Count()
|
||||||
// 列表
|
// 列表
|
||||||
|
|||||||
+70
-17
@@ -1,14 +1,18 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/base64"
|
||||||
|
"fmt"
|
||||||
|
"github.com/leanote/leanote/app/db"
|
||||||
|
"github.com/leanote/leanote/app/info"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
. "github.com/leanote/leanote/app/lea"
|
||||||
"github.com/revel/revel"
|
"github.com/revel/revel"
|
||||||
"github.com/leanote/leanote/app/info"
|
|
||||||
"github.com/leanote/leanote/app/db"
|
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
"time"
|
"io/ioutil"
|
||||||
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
const DEFAULT_ALBUM_ID = "52d3e8ac99c37b7f0d000001"
|
const DEFAULT_ALBUM_ID = "52d3e8ac99c37b7f0d000001"
|
||||||
@@ -39,7 +43,7 @@ func (this *FileService) ListImagesWithPage(userId, albumId, key string, pageNum
|
|||||||
|
|
||||||
q := bson.M{"UserId": bson.ObjectIdHex(userId), "Type": ""} // life
|
q := bson.M{"UserId": bson.ObjectIdHex(userId), "Type": ""} // life
|
||||||
if albumId != "" {
|
if albumId != "" {
|
||||||
q["AlbumId"] = bson.ObjectIdHex(albumId);
|
q["AlbumId"] = bson.ObjectIdHex(albumId)
|
||||||
} else {
|
} else {
|
||||||
q["IsDefaultAlbum"] = true
|
q["IsDefaultAlbum"] = true
|
||||||
}
|
}
|
||||||
@@ -47,9 +51,9 @@ func (this *FileService) ListImagesWithPage(userId, albumId, key string, pageNum
|
|||||||
q["Title"] = bson.M{"$regex": bson.RegEx{".*?" + key + ".*", "i"}}
|
q["Title"] = bson.M{"$regex": bson.RegEx{".*?" + key + ".*", "i"}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// LogJ(q)
|
// LogJ(q)
|
||||||
|
|
||||||
count := db.Count(db.Files, q);
|
count := db.Count(db.Files, q)
|
||||||
|
|
||||||
db.Files.
|
db.Files.
|
||||||
Find(q).
|
Find(q).
|
||||||
@@ -88,7 +92,7 @@ func (this *FileService) DeleteImage(userId, fileId string) (bool, string) {
|
|||||||
file := info.File{}
|
file := info.File{}
|
||||||
db.GetByIdAndUserId(db.Files, fileId, userId, &file)
|
db.GetByIdAndUserId(db.Files, fileId, userId, &file)
|
||||||
|
|
||||||
if(file.FileId != "") {
|
if file.FileId != "" {
|
||||||
if db.DeleteByIdAndUserId(db.Files, fileId, userId) {
|
if db.DeleteByIdAndUserId(db.Files, fileId, userId) {
|
||||||
// delete image
|
// delete image
|
||||||
// TODO
|
// TODO
|
||||||
@@ -115,6 +119,53 @@ func (this *FileService) UpdateImage(userId, fileId, title string) bool {
|
|||||||
return db.UpdateByIdAndUserIdField(db.Files, fileId, userId, "Title", title)
|
return db.UpdateByIdAndUserIdField(db.Files, fileId, userId, "Title", title)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *FileService) GetFileBase64(userId, fileId string) (str string, mine string) {
|
||||||
|
defer func() { // 必须要先声明defer,否则不能捕获到panic异常
|
||||||
|
if err := recover(); err != nil {
|
||||||
|
fmt.Println(err) // 这里的err其实就是panic传入的内容,55
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
path := this.GetFile(userId, fileId)
|
||||||
|
|
||||||
|
if path == "" {
|
||||||
|
return "", ""
|
||||||
|
}
|
||||||
|
|
||||||
|
path = revel.BasePath + "/" + strings.TrimLeft(path, "/")
|
||||||
|
|
||||||
|
ff, err := ioutil.ReadFile(path)
|
||||||
|
if err != nil {
|
||||||
|
return "", ""
|
||||||
|
}
|
||||||
|
|
||||||
|
e64 := base64.StdEncoding
|
||||||
|
maxEncLen := e64.EncodedLen(len(ff))
|
||||||
|
encBuf := make([]byte, maxEncLen)
|
||||||
|
|
||||||
|
e64.Encode(encBuf, ff)
|
||||||
|
|
||||||
|
mime := http.DetectContentType(ff)
|
||||||
|
|
||||||
|
str = string(encBuf)
|
||||||
|
return str, mime
|
||||||
|
}
|
||||||
|
|
||||||
|
// 得到图片base64, 图片要在之前添加data:image/png;base64,
|
||||||
|
func (this *FileService) GetImageBase64(userId, fileId string) string {
|
||||||
|
|
||||||
|
str, mime := this.GetFileBase64(userId, fileId)
|
||||||
|
if str == "" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
switch mime {
|
||||||
|
case "image/gif", "image/jpeg", "image/pjpeg", "image/png", "image/tiff":
|
||||||
|
return fmt.Sprintf("data:%s;base64,%s", mime, str)
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
return "data:image/png;base64," + str
|
||||||
|
}
|
||||||
|
|
||||||
// 获取文件路径
|
// 获取文件路径
|
||||||
// 要判断是否具有权限
|
// 要判断是否具有权限
|
||||||
// userId是否具有fileId的访问权限
|
// userId是否具有fileId的访问权限
|
||||||
@@ -152,7 +203,7 @@ func (this *FileService) GetFile(userId, fileId string) string {
|
|||||||
for _, noteId := range noteIds {
|
for _, noteId := range noteIds {
|
||||||
note := noteService.GetNoteById(noteId.Hex())
|
note := noteService.GetNoteById(noteId.Hex())
|
||||||
if shareService.HasReadPerm(note.UserId.Hex(), userId, noteId.Hex()) {
|
if shareService.HasReadPerm(note.UserId.Hex(), userId, noteId.Hex()) {
|
||||||
return path;
|
return path
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
@@ -191,17 +242,17 @@ func (this *FileService) GetFile(userId, fileId string) string {
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 复制共享的笔记时, 复制其中的图片到我本地
|
||||||
// 复制图片
|
// 复制图片
|
||||||
func (this *FileService) CopyImage(userId, fileId, toUserId string) (bool, string) {
|
func (this *FileService) CopyImage(userId, fileId, toUserId string) (bool, string) {
|
||||||
// 是否已经复制过了
|
// 是否已经复制过了
|
||||||
file2 := info.File{}
|
file2 := info.File{}
|
||||||
db.GetByQ(db.Files, bson.M{"UserId": bson.ObjectIdHex(toUserId), "FromFileId": bson.ObjectIdHex(fileId)}, &file2)
|
db.GetByQ(db.Files, bson.M{"UserId": bson.ObjectIdHex(toUserId), "FromFileId": bson.ObjectIdHex(fileId)}, &file2)
|
||||||
if file2.FileId != "" {
|
if file2.FileId != "" {
|
||||||
return true, file2.FileId.Hex();
|
return true, file2.FileId.Hex()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 复制之
|
// 复制之
|
||||||
|
|
||||||
file := info.File{}
|
file := info.File{}
|
||||||
db.GetByIdAndUserId(db.Files, fileId, userId, &file)
|
db.GetByIdAndUserId(db.Files, fileId, userId, &file)
|
||||||
|
|
||||||
@@ -210,18 +261,20 @@ func (this *FileService) CopyImage(userId, fileId, toUserId string) (bool, strin
|
|||||||
}
|
}
|
||||||
|
|
||||||
_, ext := SplitFilename(file.Name)
|
_, ext := SplitFilename(file.Name)
|
||||||
newFilename := NewGuid() + ext
|
guid := NewGuid()
|
||||||
|
newFilename := guid + ext
|
||||||
|
|
||||||
dir := "files/" + toUserId + "/images"
|
// TODO 统一目录格式
|
||||||
|
// dir := "files/" + toUserId + "/images"
|
||||||
|
dir := "files/" + GetRandomFilePath(toUserId, guid) + "/images"
|
||||||
filePath := dir + "/" + newFilename
|
filePath := dir + "/" + newFilename
|
||||||
err := os.MkdirAll(dir, 0755)
|
err := os.MkdirAll(revel.BasePath+dir, 0755)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, ""
|
return false, ""
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err = CopyFile(revel.BasePath + "/" + file.Path, revel.BasePath + "/" + filePath)
|
_, err = CopyFile(revel.BasePath+"/"+file.Path, revel.BasePath+"/"+filePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
Log(err)
|
|
||||||
return false, ""
|
return false, ""
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,7 +283,7 @@ func (this *FileService) CopyImage(userId, fileId, toUserId string) (bool, strin
|
|||||||
Path: filePath,
|
Path: filePath,
|
||||||
Size: file.Size,
|
Size: file.Size,
|
||||||
FromFileId: file.FileId}
|
FromFileId: file.FileId}
|
||||||
id := bson.NewObjectId();
|
id := bson.NewObjectId()
|
||||||
fileInfo.FileId = id
|
fileInfo.FileId = id
|
||||||
fileId = id.Hex()
|
fileId = id.Hex()
|
||||||
Ok, _ := this.AddImage(fileInfo, "", toUserId, false)
|
Ok, _ := this.AddImage(fileInfo, "", toUserId, false)
|
||||||
@@ -245,7 +298,7 @@ func (this *FileService) CopyImage(userId, fileId, toUserId string) (bool, strin
|
|||||||
func (this *FileService) IsMyFile(userId, fileId string) bool {
|
func (this *FileService) IsMyFile(userId, fileId string) bool {
|
||||||
// 如果有问题会panic
|
// 如果有问题会panic
|
||||||
if !bson.IsObjectIdHex(fileId) || !bson.IsObjectIdHex(userId) {
|
if !bson.IsObjectIdHex(fileId) || !bson.IsObjectIdHex(userId) {
|
||||||
return false;
|
return false
|
||||||
}
|
}
|
||||||
return db.Has(db.Files, bson.M{"UserId": bson.ObjectIdHex(userId), "_id": bson.ObjectIdHex(fileId)})
|
return db.Has(db.Files, bson.M{"UserId": bson.ObjectIdHex(userId), "_id": bson.ObjectIdHex(fileId)})
|
||||||
}
|
}
|
||||||
+24
-22
@@ -1,12 +1,12 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/info"
|
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
"github.com/leanote/leanote/app/info"
|
||||||
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
"time"
|
"time"
|
||||||
// "strings"
|
// "strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 用户组, 用户组用户管理
|
// 用户组, 用户组用户管理
|
||||||
@@ -16,7 +16,7 @@ type GroupService struct {
|
|||||||
|
|
||||||
// 添加分组
|
// 添加分组
|
||||||
func (this *GroupService) AddGroup(userId, title string) (bool, info.Group) {
|
func (this *GroupService) AddGroup(userId, title string) (bool, info.Group) {
|
||||||
group := info.Group {
|
group := info.Group{
|
||||||
GroupId: bson.NewObjectId(),
|
GroupId: bson.NewObjectId(),
|
||||||
UserId: bson.ObjectIdHex(userId),
|
UserId: bson.ObjectIdHex(userId),
|
||||||
Title: title,
|
Title: title,
|
||||||
@@ -24,6 +24,7 @@ func (this *GroupService) AddGroup(userId, title string) (bool, info.Group) {
|
|||||||
}
|
}
|
||||||
return db.Insert(db.Groups, group), group
|
return db.Insert(db.Groups, group), group
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除分组
|
// 删除分组
|
||||||
// 判断是否有好友
|
// 判断是否有好友
|
||||||
func (this *GroupService) DeleteGroup(userId, groupId string) (ok bool, msg string) {
|
func (this *GroupService) DeleteGroup(userId, groupId string) (ok bool, msg string) {
|
||||||
@@ -38,8 +39,8 @@ func (this *GroupService) DeleteGroup(userId, groupId string) (ok bool, msg stri
|
|||||||
|
|
||||||
// 删除分组后, 需要删除所有用户分享到该组的笔记本, 笔记
|
// 删除分组后, 需要删除所有用户分享到该组的笔记本, 笔记
|
||||||
|
|
||||||
shareService.DeleteAllShareNotebookGroup(groupId);
|
shareService.DeleteAllShareNotebookGroup(groupId)
|
||||||
shareService.DeleteAllShareNoteGroup(groupId);
|
shareService.DeleteAllShareNoteGroup(groupId)
|
||||||
|
|
||||||
db.DeleteAll(db.GroupUsers, bson.M{"GroupId": bson.ObjectIdHex(groupId)})
|
db.DeleteAll(db.GroupUsers, bson.M{"GroupId": bson.ObjectIdHex(groupId)})
|
||||||
return db.DeleteByIdAndUserId(db.Groups, groupId, userId), ""
|
return db.DeleteByIdAndUserId(db.Groups, groupId, userId), ""
|
||||||
@@ -53,14 +54,14 @@ func (this *GroupService) UpdateGroupTitle(userId, groupId, title string) (ok bo
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 得到用户的所有分组(包括下的所有用户)
|
// 得到用户的所有分组(包括下的所有用户)
|
||||||
func (this *GroupService) GetGroupsAndUsers(userId string) ([]info.Group) {
|
func (this *GroupService) GetGroupsAndUsers(userId string) []info.Group {
|
||||||
/*
|
/*
|
||||||
// 得到我的分组
|
// 得到我的分组
|
||||||
groups := []info.Group{}
|
groups := []info.Group{}
|
||||||
db.ListByQ(db.Groups, bson.M{"UserId": bson.ObjectIdHex(userId)}, &groups)
|
db.ListByQ(db.Groups, bson.M{"UserId": bson.ObjectIdHex(userId)}, &groups)
|
||||||
*/
|
*/
|
||||||
// 我的分组, 及我所属的分组
|
// 我的分组, 及我所属的分组
|
||||||
groups := this.GetGroupsContainOf(userId);
|
groups := this.GetGroupsContainOf(userId)
|
||||||
|
|
||||||
// 得到其下的用户
|
// 得到其下的用户
|
||||||
for i, group := range groups {
|
for i, group := range groups {
|
||||||
@@ -69,8 +70,9 @@ func (this *GroupService) GetGroupsAndUsers(userId string) ([]info.Group) {
|
|||||||
}
|
}
|
||||||
return groups
|
return groups
|
||||||
}
|
}
|
||||||
|
|
||||||
// 仅仅得到所有分组
|
// 仅仅得到所有分组
|
||||||
func (this *GroupService) GetGroups(userId string) ([]info.Group) {
|
func (this *GroupService) GetGroups(userId string) []info.Group {
|
||||||
// 得到分组s
|
// 得到分组s
|
||||||
groups := []info.Group{}
|
groups := []info.Group{}
|
||||||
db.ListByQ(db.Groups, bson.M{"UserId": bson.ObjectIdHex(userId)}, &groups)
|
db.ListByQ(db.Groups, bson.M{"UserId": bson.ObjectIdHex(userId)}, &groups)
|
||||||
@@ -78,7 +80,7 @@ func (this *GroupService) GetGroups(userId string) ([]info.Group) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 得到我的和我所属组的ids
|
// 得到我的和我所属组的ids
|
||||||
func (this *GroupService) GetMineAndBelongToGroupIds(userId string) ([]bson.ObjectId) {
|
func (this *GroupService) GetMineAndBelongToGroupIds(userId string) []bson.ObjectId {
|
||||||
// 所属组
|
// 所属组
|
||||||
groupIds := this.GetBelongToGroupIds(userId)
|
groupIds := this.GetBelongToGroupIds(userId)
|
||||||
|
|
||||||
@@ -126,7 +128,7 @@ func (this *GroupService) GetGroupsContainOf(userId string) []info.Group {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 得到分组, shareService用
|
// 得到分组, shareService用
|
||||||
func (this *GroupService) GetGroup(userId, groupId string) (info.Group) {
|
func (this *GroupService) GetGroup(userId, groupId string) info.Group {
|
||||||
// 得到分组s
|
// 得到分组s
|
||||||
group := info.Group{}
|
group := info.Group{}
|
||||||
db.GetByIdAndUserId(db.Groups, groupId, userId, &group)
|
db.GetByIdAndUserId(db.Groups, groupId, userId, &group)
|
||||||
@@ -134,7 +136,7 @@ func (this *GroupService) GetGroup(userId, groupId string) (info.Group) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 得到某分组下的用户
|
// 得到某分组下的用户
|
||||||
func (this *GroupService) GetUsers(groupId string) ([]info.User) {
|
func (this *GroupService) GetUsers(groupId string) []info.User {
|
||||||
// 得到UserIds
|
// 得到UserIds
|
||||||
groupUsers := []info.GroupUser{}
|
groupUsers := []info.GroupUser{}
|
||||||
db.ListByQWithFields(db.GroupUsers, bson.M{"GroupId": bson.ObjectIdHex(groupId)}, []string{"UserId"}, &groupUsers)
|
db.ListByQWithFields(db.GroupUsers, bson.M{"GroupId": bson.ObjectIdHex(groupId)}, []string{"UserId"}, &groupUsers)
|
||||||
@@ -150,7 +152,7 @@ func (this *GroupService) GetUsers(groupId string) ([]info.User) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 得到我所属的所有分组ids
|
// 得到我所属的所有分组ids
|
||||||
func (this *GroupService) GetBelongToGroupIds(userId string) ([]bson.ObjectId) {
|
func (this *GroupService) GetBelongToGroupIds(userId string) []bson.ObjectId {
|
||||||
// 得到UserIds
|
// 得到UserIds
|
||||||
groupUsers := []info.GroupUser{}
|
groupUsers := []info.GroupUser{}
|
||||||
db.ListByQWithFields(db.GroupUsers, bson.M{"UserId": bson.ObjectIdHex(userId)}, []string{"GroupId"}, &groupUsers)
|
db.ListByQWithFields(db.GroupUsers, bson.M{"UserId": bson.ObjectIdHex(userId)}, []string{"GroupId"}, &groupUsers)
|
||||||
@@ -183,16 +185,16 @@ func (this *GroupService) AddUser(ownUserId, groupId, userId string) (ok bool, m
|
|||||||
// groupId是否是ownUserId的?
|
// groupId是否是ownUserId的?
|
||||||
/*
|
/*
|
||||||
if !this.IsExistsGroupUser(ownUserId, groupId) {
|
if !this.IsExistsGroupUser(ownUserId, groupId) {
|
||||||
return false, "forbidden"
|
return false, "forbiddenNotMyGroup"
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
if !this.isMyGroup(ownUserId, groupId) {
|
if !this.isMyGroup(ownUserId, groupId) {
|
||||||
return false, "forbidden"
|
return false, "forbiddenNotMyGroup"
|
||||||
}
|
}
|
||||||
|
|
||||||
// 是否已存在
|
// 是否已存在
|
||||||
if db.Has(db.GroupUsers, bson.M{"GroupId": bson.ObjectIdHex(groupId), "UserId": bson.ObjectIdHex(userId)}) {
|
if db.Has(db.GroupUsers, bson.M{"GroupId": bson.ObjectIdHex(groupId), "UserId": bson.ObjectIdHex(userId)}) {
|
||||||
return false, "hasUsers"
|
return false, "userExistsInGroup"
|
||||||
}
|
}
|
||||||
|
|
||||||
return db.Insert(db.GroupUsers, info.GroupUser{
|
return db.Insert(db.GroupUsers, info.GroupUser{
|
||||||
@@ -208,16 +210,16 @@ func (this *GroupService) DeleteUser(ownUserId, groupId, userId string) (ok bool
|
|||||||
// groupId是否是ownUserId的?
|
// groupId是否是ownUserId的?
|
||||||
/*
|
/*
|
||||||
if !this.IsExistsGroupUser(ownUserId, groupId) {
|
if !this.IsExistsGroupUser(ownUserId, groupId) {
|
||||||
return false, "forbidden"
|
return false, "forbiddenNotMyGroup"
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
if !this.isMyGroup(ownUserId, groupId) {
|
if !this.isMyGroup(ownUserId, groupId) {
|
||||||
return false, "forbidden"
|
return false, "forbiddenNotMyGroup"
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除该用户分享到本组的笔记本, 笔记
|
// 删除该用户分享到本组的笔记本, 笔记
|
||||||
shareService.DeleteShareNotebookGroupWhenDeleteGroupUser(userId, groupId);
|
shareService.DeleteShareNotebookGroupWhenDeleteGroupUser(userId, groupId)
|
||||||
shareService.DeleteShareNoteGroupWhenDeleteGroupUser(userId, groupId);
|
shareService.DeleteShareNoteGroupWhenDeleteGroupUser(userId, groupId)
|
||||||
|
|
||||||
return db.Delete(db.GroupUsers, bson.M{"GroupId": bson.ObjectIdHex(groupId), "UserId": bson.ObjectIdHex(userId)}), ""
|
return db.Delete(db.GroupUsers, bson.M{"GroupId": bson.ObjectIdHex(groupId), "UserId": bson.ObjectIdHex(userId)}), ""
|
||||||
}
|
}
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/info"
|
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
"github.com/leanote/leanote/app/info"
|
||||||
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
// "time"
|
// "time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 历史记录
|
// 历史记录
|
||||||
|
|||||||
@@ -1,19 +1,19 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/info"
|
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
|
"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"
|
||||||
"regexp"
|
"regexp"
|
||||||
// "time"
|
// "time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type NoteImageService struct {
|
type NoteImageService struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通过id, userId得到noteIds
|
// 通过id, userId得到noteIds
|
||||||
func (this *NoteImageService) GetNoteIds(imageId string) ([]bson.ObjectId) {
|
func (this *NoteImageService) GetNoteIds(imageId string) []bson.ObjectId {
|
||||||
noteImages := []info.NoteImage{}
|
noteImages := []info.NoteImage{}
|
||||||
db.ListByQWithFields(db.NoteImages, bson.M{"ImageId": bson.ObjectIdHex(imageId)}, []string{"NoteId"}, ¬eImages)
|
db.ListByQWithFields(db.NoteImages, bson.M{"ImageId": bson.ObjectIdHex(imageId)}, []string{"NoteId"}, ¬eImages)
|
||||||
|
|
||||||
@@ -73,17 +73,13 @@ func (this *NoteImageService) UpdateNoteImages(userId, noteId, imgSrc, content s
|
|||||||
|
|
||||||
// 复制图片, 把note的图片都copy给我, 且修改noteContent图片路径
|
// 复制图片, 把note的图片都copy给我, 且修改noteContent图片路径
|
||||||
func (this *NoteImageService) CopyNoteImages(fromNoteId, fromUserId, newNoteId, content, toUserId string) string {
|
func (this *NoteImageService) CopyNoteImages(fromNoteId, fromUserId, newNoteId, content, toUserId string) string {
|
||||||
|
/* 弃用之
|
||||||
// 得到fromNoteId的noteImages, 如果为空, 则直接返回content
|
// 得到fromNoteId的noteImages, 如果为空, 则直接返回content
|
||||||
noteImages := []info.NoteImage{}
|
noteImages := []info.NoteImage{}
|
||||||
db.ListByQWithFields(db.NoteImages, bson.M{"NoteId": bson.ObjectIdHex(fromNoteId)}, []string{"ImageId"}, ¬eImages)
|
db.ListByQWithFields(db.NoteImages, bson.M{"NoteId": bson.ObjectIdHex(fromNoteId)}, []string{"ImageId"}, ¬eImages)
|
||||||
|
|
||||||
if len(noteImages) == 0 {
|
if len(noteImages) == 0 {
|
||||||
return content;
|
return content;
|
||||||
}
|
}
|
||||||
|
|
||||||
// <img src="/file/outputImage?fileId=12323232" />
|
|
||||||
// 把fileId=1232替换成新的
|
|
||||||
replaceMap := map[string]string{}
|
|
||||||
for _, noteImage := range noteImages {
|
for _, noteImage := range noteImages {
|
||||||
imageId := noteImage.ImageId.Hex()
|
imageId := noteImage.ImageId.Hex()
|
||||||
ok, newImageId := fileService.CopyImage(fromUserId, imageId, toUserId)
|
ok, newImageId := fileService.CopyImage(fromUserId, imageId, toUserId)
|
||||||
@@ -91,21 +87,45 @@ func (this *NoteImageService) CopyNoteImages(fromNoteId, fromUserId, newNoteId,
|
|||||||
replaceMap[imageId] = newImageId
|
replaceMap[imageId] = newImageId
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
if len(replaceMap) > 0 {
|
// 因为很多图片上传就会删除, 所以直接从内容中查看图片id进行复制
|
||||||
// 替换之
|
|
||||||
reg, _ := regexp.Compile("outputImage\\?fileId=([a-z0-9A-Z]{24})")
|
// <img src="/file/outputImage?fileId=12323232" />
|
||||||
|
// 把fileId=1232替换成新的
|
||||||
|
replaceMap := map[string]string{}
|
||||||
|
|
||||||
|
reg, _ := regexp.Compile("(outputImage|getImage)\\?fileId=([a-z0-9A-Z]{24})")
|
||||||
content = reg.ReplaceAllStringFunc(content, func(each string) string {
|
content = reg.ReplaceAllStringFunc(content, func(each string) string {
|
||||||
// each=outputImage?fileId=541bd2f599c37b4f3r000003
|
// each = outputImage?fileId=541bd2f599c37b4f3r000003
|
||||||
|
// each = getImage?fileId=541bd2f599c37b4f3r000003
|
||||||
|
|
||||||
fileId := each[len(each)-24:] // 得到后24位, 也即id
|
fileId := each[len(each)-24:] // 得到后24位, 也即id
|
||||||
if replaceFileId, ok := replaceMap[fileId]; ok {
|
|
||||||
|
if _, ok := replaceMap[fileId]; !ok {
|
||||||
|
if bson.IsObjectIdHex(fileId) {
|
||||||
|
ok2, newImageId := fileService.CopyImage(fromUserId, fileId, toUserId)
|
||||||
|
if ok2 {
|
||||||
|
replaceMap[fileId] = newImageId
|
||||||
|
} else {
|
||||||
|
replaceMap[fileId] = ""
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
replaceMap[fileId] = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
replaceFileId := replaceMap[fileId]
|
||||||
|
if replaceFileId != "" {
|
||||||
|
if each[0] == 'o' {
|
||||||
return "outputImage?fileId=" + replaceFileId
|
return "outputImage?fileId=" + replaceFileId
|
||||||
}
|
}
|
||||||
return each
|
return "getImage?fileId=" + replaceFileId
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
return each
|
||||||
|
})
|
||||||
|
|
||||||
return content;
|
return content
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|||||||
+318
-66
@@ -1,10 +1,12 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/info"
|
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
|
"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"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -17,20 +19,35 @@ func (this *NoteService) GetNote(noteId, userId string) (note info.Note) {
|
|||||||
db.GetByIdAndUserId(db.Notes, noteId, userId, ¬e)
|
db.GetByIdAndUserId(db.Notes, noteId, userId, ¬e)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// fileService调用
|
// fileService调用
|
||||||
// 不能是已经删除了的, life bug, 客户端删除后, 竟然还能在web上打开
|
// 不能是已经删除了的, life bug, 客户端删除后, 竟然还能在web上打开
|
||||||
func (this *NoteService) GetNoteById(noteId string) (note info.Note) {
|
func (this *NoteService) GetNoteById(noteId string) (note info.Note) {
|
||||||
note = info.Note{}
|
note = info.Note{}
|
||||||
|
if noteId == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
db.GetByQ(db.Notes, bson.M{"_id": bson.ObjectIdHex(noteId), "IsDeleted": false}, ¬e)
|
db.GetByQ(db.Notes, bson.M{"_id": bson.ObjectIdHex(noteId), "IsDeleted": false}, ¬e)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
func (this *NoteService) GetNoteByIdAndUserId(noteId, userId string) (note info.Note) {
|
||||||
|
note = info.Note{}
|
||||||
|
if noteId == "" || userId == "" {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
db.GetByQ(db.Notes, bson.M{"_id": bson.ObjectIdHex(noteId), "UserId": bson.ObjectIdHex(userId), "IsDeleted": false}, ¬e)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// 得到blog, blogService用
|
// 得到blog, blogService用
|
||||||
// 不要传userId, 因为是公开的
|
// 不要传userId, 因为是公开的
|
||||||
func (this *NoteService) GetBlogNote(noteId string) (note info.Note) {
|
func (this *NoteService) GetBlogNote(noteId string) (note info.Note) {
|
||||||
note = info.Note{}
|
note = info.Note{}
|
||||||
db.GetByQ(db.Notes, bson.M{"_id": bson.ObjectIdHex(noteId), "IsBlog": true, "IsTrash": false}, ¬e)
|
db.GetByQ(db.Notes, bson.M{"_id": bson.ObjectIdHex(noteId),
|
||||||
|
"IsBlog": true, "IsTrash": false, "IsDeleted": false}, ¬e)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 通过id, userId得到noteContent
|
// 通过id, userId得到noteContent
|
||||||
func (this *NoteService) GetNoteContent(noteContentId, userId string) (noteContent info.NoteContent) {
|
func (this *NoteService) GetNoteContent(noteContentId, userId string) (noteContent info.NoteContent) {
|
||||||
noteContent = info.NoteContent{}
|
noteContent = info.NoteContent{}
|
||||||
@@ -52,7 +69,7 @@ func (this *NoteService) GetSyncNotes(userId string, afterUsn, maxEntry int) []i
|
|||||||
q := db.Notes.Find(bson.M{
|
q := db.Notes.Find(bson.M{
|
||||||
"UserId": bson.ObjectIdHex(userId),
|
"UserId": bson.ObjectIdHex(userId),
|
||||||
"Usn": bson.M{"$gt": afterUsn},
|
"Usn": bson.M{"$gt": afterUsn},
|
||||||
});
|
})
|
||||||
q.Sort("Usn").Limit(maxEntry).All(¬es)
|
q.Sort("Usn").Limit(maxEntry).All(¬es)
|
||||||
|
|
||||||
return this.ToApiNotes(notes)
|
return this.ToApiNotes(notes)
|
||||||
@@ -63,7 +80,7 @@ func (this *NoteService) ToApiNotes(notes []info.Note) []info.ApiNote {
|
|||||||
// 2, 得到所有图片, 附件信息
|
// 2, 得到所有图片, 附件信息
|
||||||
// 查images表, attachs表
|
// 查images表, attachs表
|
||||||
if len(notes) > 0 {
|
if len(notes) > 0 {
|
||||||
noteIds := make([]bson.ObjectId, len(notes));
|
noteIds := make([]bson.ObjectId, len(notes))
|
||||||
for i, note := range notes {
|
for i, note := range notes {
|
||||||
noteIds[i] = note.NoteId
|
noteIds[i] = note.NoteId
|
||||||
}
|
}
|
||||||
@@ -80,23 +97,22 @@ func (this *NoteService) ToApiNotes(notes []info.Note) []info.ApiNote {
|
|||||||
return []info.ApiNote{}
|
return []info.ApiNote{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// note与apiNote的转换
|
// note与apiNote的转换
|
||||||
func (this *NoteService) ToApiNote(note *info.Note, files []info.NoteFile) info.ApiNote {
|
func (this *NoteService) ToApiNote(note *info.Note, files []info.NoteFile) info.ApiNote {
|
||||||
apiNote := info.ApiNote{
|
apiNote := info.ApiNote{
|
||||||
NoteId: note.NoteId.Hex(),
|
NoteId: note.NoteId.Hex(),
|
||||||
NotebookId: note.NotebookId.Hex(),
|
NotebookId: note.NotebookId.Hex(),
|
||||||
UserId : note.UserId.Hex(),
|
UserId: note.UserId.Hex(),
|
||||||
Title : note.Title,
|
Title: note.Title,
|
||||||
Tags : note.Tags,
|
Tags: note.Tags,
|
||||||
IsMarkdown : note.IsMarkdown,
|
IsMarkdown: note.IsMarkdown,
|
||||||
IsBlog : note.IsBlog,
|
IsBlog: note.IsBlog,
|
||||||
IsTrash : note.IsTrash,
|
IsTrash: note.IsTrash,
|
||||||
IsDeleted : note.IsDeleted,
|
IsDeleted: note.IsDeleted,
|
||||||
Usn : note.Usn,
|
Usn: note.Usn,
|
||||||
CreatedTime : note.CreatedTime,
|
CreatedTime: note.CreatedTime,
|
||||||
UpdatedTime : note.UpdatedTime,
|
UpdatedTime: note.UpdatedTime,
|
||||||
PublicTime : note.PublicTime,
|
PublicTime: note.PublicTime,
|
||||||
Files: files,
|
Files: files,
|
||||||
}
|
}
|
||||||
return apiNote
|
return apiNote
|
||||||
@@ -109,7 +125,7 @@ func (this *NoteService) ToApiNote(note *info.Note, files []info.NoteFile) info.
|
|||||||
// 查images表, attachs表
|
// 查images表, attachs表
|
||||||
// [待测]
|
// [待测]
|
||||||
func (this *NoteService) getFiles(noteIds []bson.ObjectId) map[string][]info.NoteFile {
|
func (this *NoteService) getFiles(noteIds []bson.ObjectId) map[string][]info.NoteFile {
|
||||||
noteImages := noteImageService.getImagesByNoteIds(noteIds);
|
noteImages := noteImageService.getImagesByNoteIds(noteIds)
|
||||||
noteAttachs := attachService.getAttachsByNoteIds(noteIds)
|
noteAttachs := attachService.getAttachsByNoteIds(noteIds)
|
||||||
|
|
||||||
noteFilesMap := map[string][]info.NoteFile{}
|
noteFilesMap := map[string][]info.NoteFile{}
|
||||||
@@ -123,7 +139,7 @@ func (this *NoteService) getFiles(noteIds []bson.ObjectId) map[string][]info.Not
|
|||||||
noteFiles = append(noteFiles, info.NoteFile{
|
noteFiles = append(noteFiles, info.NoteFile{
|
||||||
FileId: image.FileId.Hex(),
|
FileId: image.FileId.Hex(),
|
||||||
Type: image.Type,
|
Type: image.Type,
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -135,7 +151,7 @@ func (this *NoteService) getFiles(noteIds []bson.ObjectId) map[string][]info.Not
|
|||||||
Type: attach.Type,
|
Type: attach.Type,
|
||||||
Title: attach.Title,
|
Title: attach.Title,
|
||||||
IsAttach: true,
|
IsAttach: true,
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -161,7 +177,7 @@ func (this *NoteService) ListNotes(userId, notebookId string,
|
|||||||
query["NotebookId"] = bson.ObjectIdHex(notebookId)
|
query["NotebookId"] = bson.ObjectIdHex(notebookId)
|
||||||
}
|
}
|
||||||
|
|
||||||
q := db.Notes.Find(query);
|
q := db.Notes.Find(query)
|
||||||
|
|
||||||
// 总记录数
|
// 总记录数
|
||||||
count, _ = q.Count()
|
count, _ = q.Count()
|
||||||
@@ -189,6 +205,7 @@ func (this *NoteService) ListNotesByNoteIdsWithPageSort(noteIds []bson.ObjectId,
|
|||||||
All(¬es)
|
All(¬es)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// shareService调用
|
// shareService调用
|
||||||
func (this *NoteService) ListNotesByNoteIds(noteIds []bson.ObjectId) (notes []info.Note) {
|
func (this *NoteService) ListNotesByNoteIds(noteIds []bson.ObjectId) (notes []info.Note) {
|
||||||
notes = []info.Note{}
|
notes = []info.Note{}
|
||||||
@@ -198,6 +215,7 @@ func (this *NoteService) ListNotesByNoteIds(noteIds []bson.ObjectId) (notes []in
|
|||||||
All(¬es)
|
All(¬es)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// blog需要
|
// blog需要
|
||||||
func (this *NoteService) ListNoteContentsByNoteIds(noteIds []bson.ObjectId) (notes []info.NoteContent) {
|
func (this *NoteService) ListNoteContentsByNoteIds(noteIds []bson.ObjectId) (notes []info.NoteContent) {
|
||||||
notes = []info.NoteContent{}
|
notes = []info.NoteContent{}
|
||||||
@@ -207,6 +225,7 @@ func (this *NoteService) ListNoteContentsByNoteIds(noteIds []bson.ObjectId) (not
|
|||||||
All(¬es)
|
All(¬es)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 只得到abstract, 不需要content
|
// 只得到abstract, 不需要content
|
||||||
func (this *NoteService) ListNoteAbstractsByNoteIds(noteIds []bson.ObjectId) (notes []info.NoteContent) {
|
func (this *NoteService) ListNoteAbstractsByNoteIds(noteIds []bson.ObjectId) (notes []info.NoteContent) {
|
||||||
notes = []info.NoteContent{}
|
notes = []info.NoteContent{}
|
||||||
@@ -224,15 +243,18 @@ func (this *NoteService) ListNoteContentByNoteIds(noteIds []bson.ObjectId) (note
|
|||||||
// [ok]
|
// [ok]
|
||||||
|
|
||||||
func (this *NoteService) AddNote(note info.Note, fromApi bool) info.Note {
|
func (this *NoteService) AddNote(note info.Note, fromApi bool) info.Note {
|
||||||
if(note.NoteId.Hex() == "") {
|
if note.NoteId.Hex() == "" {
|
||||||
noteId := bson.NewObjectId();
|
noteId := bson.NewObjectId()
|
||||||
note.NoteId = noteId;
|
note.NoteId = noteId
|
||||||
}
|
}
|
||||||
note.CreatedTime = time.Now()
|
|
||||||
note.UpdatedTime = note.CreatedTime
|
// 关于创建时间, 可能是客户端发来, 此时判断时间是否有
|
||||||
|
note.CreatedTime = FixUrlTime(note.CreatedTime)
|
||||||
|
note.UpdatedTime = FixUrlTime(note.UpdatedTime)
|
||||||
|
|
||||||
note.IsTrash = false
|
note.IsTrash = false
|
||||||
note.UpdatedUserId = note.UserId
|
note.UpdatedUserId = note.UserId
|
||||||
note.UrlTitle = GetUrTitle(note.UserId.Hex(), note.Title, "note")
|
note.UrlTitle = GetUrTitle(note.UserId.Hex(), note.Title, "note", note.NoteId.Hex())
|
||||||
note.Usn = userService.IncrUsn(note.UserId.Hex())
|
note.Usn = userService.IncrUsn(note.UserId.Hex())
|
||||||
|
|
||||||
notebookId := note.NotebookId.Hex()
|
notebookId := note.NotebookId.Hex()
|
||||||
@@ -242,9 +264,9 @@ func (this *NoteService) AddNote(note info.Note, fromApi bool) info.Note {
|
|||||||
// 设为blog
|
// 设为blog
|
||||||
note.IsBlog = notebookService.IsBlog(notebookId)
|
note.IsBlog = notebookService.IsBlog(notebookId)
|
||||||
}
|
}
|
||||||
// if note.IsBlog {
|
// if note.IsBlog {
|
||||||
note.PublicTime = note.UpdatedTime
|
note.PublicTime = note.UpdatedTime
|
||||||
// }
|
// }
|
||||||
|
|
||||||
db.Insert(db.Notes, note)
|
db.Insert(db.Notes, note)
|
||||||
|
|
||||||
@@ -267,19 +289,20 @@ func (this *NoteService) AddSharedNote(note info.Note, myUserId bson.ObjectId) i
|
|||||||
return info.Note{}
|
return info.Note{}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 添加笔记本内容
|
// 添加笔记本内容
|
||||||
// [ok]
|
// [ok]
|
||||||
func (this *NoteService) AddNoteContent(noteContent info.NoteContent) info.NoteContent {
|
func (this *NoteService) AddNoteContent(noteContent info.NoteContent) info.NoteContent {
|
||||||
noteContent.CreatedTime = time.Now()
|
|
||||||
noteContent.UpdatedTime = noteContent.CreatedTime
|
noteContent.CreatedTime = FixUrlTime(noteContent.CreatedTime)
|
||||||
|
noteContent.UpdatedTime = FixUrlTime(noteContent.UpdatedTime)
|
||||||
|
|
||||||
noteContent.UpdatedUserId = noteContent.UserId
|
noteContent.UpdatedUserId = noteContent.UserId
|
||||||
db.Insert(db.NoteContents, noteContent)
|
db.Insert(db.NoteContents, noteContent)
|
||||||
|
|
||||||
// 更新笔记图片
|
// 更新笔记图片
|
||||||
noteImageService.UpdateNoteImages(noteContent.UserId.Hex(), noteContent.NoteId.Hex(), "", noteContent.Content)
|
noteImageService.UpdateNoteImages(noteContent.UserId.Hex(), noteContent.NoteId.Hex(), "", noteContent.Content)
|
||||||
|
|
||||||
return noteContent;
|
return noteContent
|
||||||
}
|
}
|
||||||
|
|
||||||
// API, abstract, desc需要这里获取
|
// API, abstract, desc需要这里获取
|
||||||
@@ -336,10 +359,10 @@ func (this *NoteService) AddNoteAndContentForController(note info.Note, noteCont
|
|||||||
Log("HAS AUTH -----------")
|
Log("HAS AUTH -----------")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return this.AddNoteAndContent(note, noteContent, bson.ObjectIdHex(updatedUserId));
|
return this.AddNoteAndContent(note, noteContent, bson.ObjectIdHex(updatedUserId))
|
||||||
}
|
}
|
||||||
func (this *NoteService) AddNoteAndContent(note info.Note, noteContent info.NoteContent, myUserId bson.ObjectId) info.Note {
|
func (this *NoteService) AddNoteAndContent(note info.Note, noteContent info.NoteContent, myUserId bson.ObjectId) info.Note {
|
||||||
if(note.NoteId.Hex() == "") {
|
if note.NoteId.Hex() == "" {
|
||||||
noteId := bson.NewObjectId()
|
noteId := bson.NewObjectId()
|
||||||
note.NoteId = noteId
|
note.NoteId = noteId
|
||||||
}
|
}
|
||||||
@@ -356,7 +379,7 @@ func (this *NoteService) AddNoteAndContent(note info.Note, noteContent info.Note
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (this *NoteService) AddNoteAndContentApi(note info.Note, noteContent info.NoteContent, myUserId bson.ObjectId) info.Note {
|
func (this *NoteService) AddNoteAndContentApi(note info.Note, noteContent info.NoteContent, myUserId bson.ObjectId) info.Note {
|
||||||
if(note.NoteId.Hex() == "") {
|
if note.NoteId.Hex() == "" {
|
||||||
noteId := bson.NewObjectId()
|
noteId := bson.NewObjectId()
|
||||||
note.NoteId = noteId
|
note.NoteId = noteId
|
||||||
}
|
}
|
||||||
@@ -402,36 +425,60 @@ func (this *NoteService) UpdateNote(updatedUserId, noteId string, needUpdate bso
|
|||||||
delete(needUpdate, "Desc")
|
delete(needUpdate, "Desc")
|
||||||
}
|
}
|
||||||
|
|
||||||
needUpdate["UpdatedUserId"] = bson.ObjectIdHex(updatedUserId);
|
needUpdate["UpdatedUserId"] = bson.ObjectIdHex(updatedUserId)
|
||||||
needUpdate["UpdatedTime"] = time.Now();
|
|
||||||
afterUsn := userService.IncrUsn(userId);
|
// 可以将时间传过来
|
||||||
|
updatedTime, ok := needUpdate["UpdatedTime"].(time.Time)
|
||||||
|
if ok {
|
||||||
|
needUpdate["UpdatedTime"] = FixUrlTime(updatedTime)
|
||||||
|
} else {
|
||||||
|
needUpdate["UpdatedTime"] = time.Now()
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
if isBlog, ok := needUpdate["IsBlog"]; ok {
|
if isBlog, ok := needUpdate["IsBlog"]; ok {
|
||||||
isBlog2 := isBlog.(bool)
|
isBlog2 := isBlog.(bool)
|
||||||
if note.IsBlog != isBlog2 {
|
if note.IsBlog != isBlog2 {
|
||||||
db.UpdateByIdAndUserIdMap(db.NoteContents, noteId, userId, bson.M{"IsBlog": isBlog2})
|
this.UpdateNoteContentIsBlog(noteId, userId, isBlog2)
|
||||||
|
|
||||||
// 重新发布成博客
|
// 重新发布成博客
|
||||||
if !note.IsBlog {
|
if !note.IsBlog {
|
||||||
needUpdate["PublicTime"] = needUpdate["UpdatedTime"]
|
needUpdate["PublicTime"] = needUpdate["UpdatedTime"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
needRecountTags = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ok := db.UpdateByIdAndUserIdMap(db.Notes, noteId, userId, needUpdate)
|
// 添加tag2
|
||||||
|
// TODO 这个tag去掉, 添加tag另外添加, 不要这个
|
||||||
|
if tags, ok := needUpdate["Tags"]; ok {
|
||||||
|
tagService.AddTagsI(userId, tags)
|
||||||
|
|
||||||
|
// 如果是博客, 标签改了, 那么重新计算
|
||||||
|
if note.IsBlog {
|
||||||
|
needRecountTags = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ok = db.UpdateByIdAndUserIdMap(db.Notes, noteId, userId, needUpdate)
|
||||||
if !ok {
|
if !ok {
|
||||||
return ok, "", 0
|
return ok, "", 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if needRecountTags {
|
||||||
|
// 重新计算tags
|
||||||
|
go (func() {
|
||||||
|
blogService.ReCountBlogTags(userId)
|
||||||
|
})()
|
||||||
|
}
|
||||||
|
|
||||||
// 重新获取之
|
// 重新获取之
|
||||||
note = this.GetNoteById(noteId)
|
note = this.GetNoteById(noteId)
|
||||||
|
|
||||||
@@ -444,14 +491,19 @@ func (this *NoteService) UpdateNote(updatedUserId, noteId string, needUpdate bso
|
|||||||
notebookId := notebookIdI.(bson.ObjectId)
|
notebookId := notebookIdI.(bson.ObjectId)
|
||||||
if notebookId != "" {
|
if notebookId != "" {
|
||||||
notebookService.ReCountNotebookNumberNotes(note.NotebookId.Hex())
|
notebookService.ReCountNotebookNumberNotes(note.NotebookId.Hex())
|
||||||
hasRecount = true
|
|
||||||
notebookService.ReCountNotebookNumberNotes(notebookId.Hex())
|
notebookService.ReCountNotebookNumberNotes(notebookId.Hex())
|
||||||
|
hasRecount = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 不要多次更新, isTrash = false, = true都要重新统计
|
// 不要多次更新, isTrash = false, = true都要重新统计
|
||||||
|
if isTrashI, ok := needUpdate["IsTrash"]; ok {
|
||||||
|
// 如果是垃圾, 则删除之共享
|
||||||
|
isTrash := isTrashI.(bool)
|
||||||
|
if isTrash {
|
||||||
|
shareService.DeleteShareNoteAll(noteId, userId)
|
||||||
|
}
|
||||||
if !hasRecount {
|
if !hasRecount {
|
||||||
if _, ok := needUpdate["IsTrash"]; ok {
|
|
||||||
notebookService.ReCountNotebookNumberNotes(note.NotebookId.Hex())
|
notebookService.ReCountNotebookNumberNotes(note.NotebookId.Hex())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -459,6 +511,11 @@ func (this *NoteService) UpdateNote(updatedUserId, noteId string, needUpdate bso
|
|||||||
return true, "", afterUsn
|
return true, "", afterUsn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 当设置/取消了笔记为博客
|
||||||
|
func (this *NoteService) UpdateNoteContentIsBlog(noteId, userId string, isBlog bool) {
|
||||||
|
db.UpdateByIdAndUserIdMap(db.NoteContents, noteId, userId, bson.M{"IsBlog": isBlog})
|
||||||
|
}
|
||||||
|
|
||||||
// 附件修改, 增加noteIncr
|
// 附件修改, 增加noteIncr
|
||||||
func (this *NoteService) IncrNoteUsn(noteId, userId string) int {
|
func (this *NoteService) IncrNoteUsn(noteId, userId string) int {
|
||||||
afterUsn := userService.IncrUsn(userId)
|
afterUsn := userService.IncrUsn(userId)
|
||||||
@@ -486,7 +543,9 @@ func (this *NoteService) UpdateNoteTitle(userId, updatedUserId, noteId, title st
|
|||||||
// [ok] TODO perm未测
|
// [ok] TODO perm未测
|
||||||
// hasBeforeUpdateNote 之前是否更新过note其它信息, 如果有更新, usn不用更新
|
// hasBeforeUpdateNote 之前是否更新过note其它信息, 如果有更新, usn不用更新
|
||||||
// TODO abstract这里生成
|
// TODO abstract这里生成
|
||||||
func (this *NoteService) UpdateNoteContent(updatedUserId, noteId, content, abstract string, hasBeforeUpdateNote bool, usn int) (bool, string, int) {
|
func (this *NoteService) UpdateNoteContent(updatedUserId, noteId, content, abstract string,
|
||||||
|
hasBeforeUpdateNote bool,
|
||||||
|
usn int, updatedTime time.Time) (bool, string, int) {
|
||||||
// 是否已自定义
|
// 是否已自定义
|
||||||
note := this.GetNoteById(noteId)
|
note := this.GetNoteById(noteId)
|
||||||
if note.NoteId == "" {
|
if note.NoteId == "" {
|
||||||
@@ -501,11 +560,13 @@ func (this *NoteService) UpdateNoteContent(updatedUserId, noteId, content, abstr
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updatedTime = FixUrlTime(updatedTime)
|
||||||
|
|
||||||
// abstract重置
|
// abstract重置
|
||||||
data := bson.M{"UpdatedUserId": bson.ObjectIdHex(updatedUserId),
|
data := bson.M{"UpdatedUserId": bson.ObjectIdHex(updatedUserId),
|
||||||
"Content": content,
|
"Content": content,
|
||||||
"Abstract": abstract,
|
"Abstract": abstract,
|
||||||
"UpdatedTime": time.Now()}
|
"UpdatedTime": updatedTime}
|
||||||
|
|
||||||
if note.IsBlog && note.HasSelfDefined {
|
if note.IsBlog && note.HasSelfDefined {
|
||||||
delete(data, "Abstract")
|
delete(data, "Abstract")
|
||||||
@@ -572,6 +633,8 @@ func (this *NoteService) ToBlog(userId, noteId string, isBlog, isTop bool) bool
|
|||||||
ok := db.UpdateByIdAndUserIdMap(db.Notes, noteId, userId, noteUpdate)
|
ok := db.UpdateByIdAndUserIdMap(db.Notes, noteId, userId, noteUpdate)
|
||||||
// 重新计算tags
|
// 重新计算tags
|
||||||
go (func() {
|
go (func() {
|
||||||
|
this.UpdateNoteContentIsBlog(noteId, userId, isBlog)
|
||||||
|
|
||||||
blogService.ReCountBlogTags(userId)
|
blogService.ReCountBlogTags(userId)
|
||||||
})()
|
})()
|
||||||
return ok
|
return ok
|
||||||
@@ -604,7 +667,7 @@ func (this *NoteService) MoveNote(noteId, notebookId, userId string) info.Note {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.GetNote(noteId, userId);
|
return this.GetNote(noteId, userId)
|
||||||
}
|
}
|
||||||
return info.Note{}
|
return info.Note{}
|
||||||
}
|
}
|
||||||
@@ -624,10 +687,11 @@ func (this *NoteService) updateToNotebookBlog(noteId, notebookId, userId string)
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// 判断是否是blog
|
// 判断是否是blog
|
||||||
func (this *NoteService) IsBlog(noteId string) bool {
|
func (this *NoteService) IsBlog(noteId string) bool {
|
||||||
note := info.Note{}
|
note := info.Note{}
|
||||||
db.GetByQWithFields(db.Notes, bson.M{"_id": bson.ObjectIdHex(noteId)}, []string{"IsBlog"}, ¬e);
|
db.GetByQWithFields(db.Notes, bson.M{"_id": bson.ObjectIdHex(noteId)}, []string{"IsBlog"}, ¬e)
|
||||||
return note.IsBlog
|
return note.IsBlog
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -641,11 +705,11 @@ func (this *NoteService) CopyNote(noteId, notebookId, userId string) info.Note {
|
|||||||
noteContent := this.GetNoteContent(noteId, userId)
|
noteContent := this.GetNoteContent(noteId, userId)
|
||||||
|
|
||||||
// 重新生成noteId
|
// 重新生成noteId
|
||||||
note.NoteId = bson.NewObjectId();
|
note.NoteId = bson.NewObjectId()
|
||||||
note.NotebookId = bson.ObjectIdHex(notebookId)
|
note.NotebookId = bson.ObjectIdHex(notebookId)
|
||||||
|
|
||||||
noteContent.NoteId = note.NoteId
|
noteContent.NoteId = note.NoteId
|
||||||
this.AddNoteAndContent(note, noteContent, note.UserId);
|
note = this.AddNoteAndContent(note, noteContent, note.UserId)
|
||||||
|
|
||||||
// 更新blog状态
|
// 更新blog状态
|
||||||
isBlog := this.updateToNotebookBlog(note.NoteId.Hex(), notebookId, userId)
|
isBlog := this.updateToNotebookBlog(note.NoteId.Hex(), notebookId, userId)
|
||||||
@@ -664,10 +728,9 @@ func (this *NoteService) CopyNote(noteId, notebookId, userId string) info.Note {
|
|||||||
// 复制别人的共享笔记给我
|
// 复制别人的共享笔记给我
|
||||||
// 将别人可用的图片转为我的图片, 复制图片
|
// 将别人可用的图片转为我的图片, 复制图片
|
||||||
func (this *NoteService) CopySharedNote(noteId, notebookId, fromUserId, myUserId string) info.Note {
|
func (this *NoteService) CopySharedNote(noteId, notebookId, fromUserId, myUserId string) info.Note {
|
||||||
// Log(shareService.HasSharedNote(noteId, myUserId) || shareService.HasSharedNotebook(noteId, myUserId, fromUserId))
|
|
||||||
// 判断是否共享了给我
|
// 判断是否共享了给我
|
||||||
if notebookService.IsMyNotebook(notebookId, myUserId) &&
|
// Log(notebookService.IsMyNotebook(notebookId, myUserId))
|
||||||
(shareService.HasSharedNote(noteId, myUserId) || shareService.HasSharedNotebook(noteId, myUserId, fromUserId)) {
|
if notebookService.IsMyNotebook(notebookId, myUserId) && shareService.HasReadPerm(fromUserId, myUserId, noteId) {
|
||||||
note := this.GetNote(noteId, fromUserId)
|
note := this.GetNote(noteId, fromUserId)
|
||||||
if note.NoteId == "" {
|
if note.NoteId == "" {
|
||||||
return info.Note{}
|
return info.Note{}
|
||||||
@@ -675,7 +738,7 @@ func (this *NoteService) CopySharedNote(noteId, notebookId, fromUserId, myUserId
|
|||||||
noteContent := this.GetNoteContent(noteId, fromUserId)
|
noteContent := this.GetNoteContent(noteId, fromUserId)
|
||||||
|
|
||||||
// 重新生成noteId
|
// 重新生成noteId
|
||||||
note.NoteId = bson.NewObjectId();
|
note.NoteId = bson.NewObjectId()
|
||||||
note.NotebookId = bson.ObjectIdHex(notebookId)
|
note.NotebookId = bson.ObjectIdHex(notebookId)
|
||||||
note.UserId = bson.ObjectIdHex(myUserId)
|
note.UserId = bson.ObjectIdHex(myUserId)
|
||||||
note.IsTop = false
|
note.IsTop = false
|
||||||
@@ -694,7 +757,7 @@ func (this *NoteService) CopySharedNote(noteId, notebookId, fromUserId, myUserId
|
|||||||
attachService.CopyAttachs(noteId, note.NoteId.Hex(), myUserId)
|
attachService.CopyAttachs(noteId, note.NoteId.Hex(), myUserId)
|
||||||
|
|
||||||
// 添加之
|
// 添加之
|
||||||
note = this.AddNoteAndContent(note, noteContent, note.UserId);
|
note = this.AddNoteAndContent(note, noteContent, note.UserId)
|
||||||
|
|
||||||
// 更新blog状态
|
// 更新blog状态
|
||||||
isBlog := this.updateToNotebookBlog(note.NoteId.Hex(), notebookId, myUserId)
|
isBlog := this.updateToNotebookBlog(note.NoteId.Hex(), notebookId, myUserId)
|
||||||
@@ -734,12 +797,13 @@ func (this *NoteService) SearchNote(key, userId string, pageNumber, pageSize int
|
|||||||
// 不是trash的
|
// 不是trash的
|
||||||
query := bson.M{"UserId": bson.ObjectIdHex(userId),
|
query := bson.M{"UserId": bson.ObjectIdHex(userId),
|
||||||
"IsTrash": false,
|
"IsTrash": false,
|
||||||
|
"IsDeleted": false, // 不能搜索已删除了的
|
||||||
"$or": orQ,
|
"$or": orQ,
|
||||||
}
|
}
|
||||||
if isBlog {
|
if isBlog {
|
||||||
query["IsBlog"] = true
|
query["IsBlog"] = true
|
||||||
}
|
}
|
||||||
q := db.Notes.Find(query);
|
q := db.Notes.Find(query)
|
||||||
|
|
||||||
// 总记录数
|
// 总记录数
|
||||||
count, _ = q.Count()
|
count, _ = q.Count()
|
||||||
@@ -764,7 +828,11 @@ func (this *NoteService) searchNoteFromContent(notes []info.Note, userId, key st
|
|||||||
noteIds[i] = note.NoteId
|
noteIds[i] = note.NoteId
|
||||||
}
|
}
|
||||||
noteContents := []info.NoteContent{}
|
noteContents := []info.NoteContent{}
|
||||||
query := bson.M{"_id": bson.M{"$nin": noteIds}, "UserId": bson.ObjectIdHex(userId), "Content": bson.M{"$regex": bson.RegEx{".*?" + key + ".*", "i"}}}
|
query := bson.M{
|
||||||
|
"_id": bson.M{"$nin": noteIds},
|
||||||
|
"UserId": bson.ObjectIdHex(userId),
|
||||||
|
"Content": bson.M{"$regex": bson.RegEx{".*?" + key + ".*", "i"}},
|
||||||
|
}
|
||||||
if isBlog {
|
if isBlog {
|
||||||
query["IsBlog"] = true
|
query["IsBlog"] = true
|
||||||
}
|
}
|
||||||
@@ -775,7 +843,7 @@ func (this *NoteService) searchNoteFromContent(notes []info.Note, userId, key st
|
|||||||
Select(bson.M{"_id": true}).
|
Select(bson.M{"_id": true}).
|
||||||
All(¬eContents)
|
All(¬eContents)
|
||||||
var lenContent = len(noteContents)
|
var lenContent = len(noteContents)
|
||||||
if(lenContent == 0) {
|
if lenContent == 0 {
|
||||||
return notes
|
return notes
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -804,7 +872,7 @@ func (this *NoteService) SearchNoteByTags(tags []string, userId string, pageNumb
|
|||||||
"IsTrash": false,
|
"IsTrash": false,
|
||||||
"Tags": bson.M{"$all": tags}}
|
"Tags": bson.M{"$all": tags}}
|
||||||
|
|
||||||
q := db.Notes.Find(query);
|
q := db.Notes.Find(query)
|
||||||
|
|
||||||
// 总记录数
|
// 总记录数
|
||||||
count, _ = q.Count()
|
count, _ = q.Count()
|
||||||
@@ -819,14 +887,14 @@ func (this *NoteService) SearchNoteByTags(tags []string, userId string, pageNumb
|
|||||||
//------------
|
//------------
|
||||||
// 统计
|
// 统计
|
||||||
func (this *NoteService) CountNote(userId string) int {
|
func (this *NoteService) CountNote(userId string) int {
|
||||||
q := bson.M{"IsTrash": false}
|
q := bson.M{"IsTrash": false, "IsDeleted": false}
|
||||||
if userId != "" {
|
if userId != "" {
|
||||||
q["UserId"] = bson.ObjectIdHex(userId)
|
q["UserId"] = bson.ObjectIdHex(userId)
|
||||||
}
|
}
|
||||||
return db.Count(db.Notes, q)
|
return db.Count(db.Notes, q)
|
||||||
}
|
}
|
||||||
func (this *NoteService) CountBlog(userId string) int {
|
func (this *NoteService) CountBlog(userId string) int {
|
||||||
q := bson.M{"IsBlog": true, "IsTrash": false}
|
q := bson.M{"IsBlog": true, "IsTrash": false, "IsDeleted": false}
|
||||||
if userId != "" {
|
if userId != "" {
|
||||||
q["UserId"] = bson.ObjectIdHex(userId)
|
q["UserId"] = bson.ObjectIdHex(userId)
|
||||||
}
|
}
|
||||||
@@ -839,7 +907,7 @@ func (this *NoteService) CountNoteByTag(userId string, tag string) int {
|
|||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
query := bson.M{"UserId": bson.ObjectIdHex(userId),
|
query := bson.M{"UserId": bson.ObjectIdHex(userId),
|
||||||
// "IsTrash": false,
|
// "IsTrash": false,
|
||||||
"IsDeleted": false,
|
"IsDeleted": false,
|
||||||
"Tags": bson.M{"$in": []string{tag}}}
|
"Tags": bson.M{"$in": []string{tag}}}
|
||||||
return db.Count(db.Notes, query)
|
return db.Count(db.Notes, query)
|
||||||
@@ -862,7 +930,7 @@ func (this *NoteService) UpdateNoteToDeleteTag(userId string, targetTag string)
|
|||||||
if tag == targetTag {
|
if tag == targetTag {
|
||||||
tags = tags
|
tags = tags
|
||||||
tags = append(tags[:i], tags[i+1:]...)
|
tags = append(tags[:i], tags[i+1:]...)
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
usn := userService.IncrUsn(userId)
|
usn := userService.IncrUsn(userId)
|
||||||
@@ -871,3 +939,187 @@ func (this *NoteService) UpdateNoteToDeleteTag(userId string, targetTag string)
|
|||||||
}
|
}
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// api
|
||||||
|
|
||||||
|
// 得到笔记的内容, 此时将笔记内的链接转成标准的Leanote Url
|
||||||
|
// 将笔记的图片, 附件链接转换成 site.url/file/getImage?fileId=xxx, site.url/file/getAttach?fileId=xxxx
|
||||||
|
func (this *NoteService) FixContentBad(content string, isMarkdown bool) string {
|
||||||
|
baseUrl := configService.GetSiteUrl()
|
||||||
|
|
||||||
|
baseUrlPattern := baseUrl
|
||||||
|
|
||||||
|
// 避免https的url
|
||||||
|
if baseUrl[0:8] == "https://" {
|
||||||
|
baseUrlPattern = strings.Replace(baseUrl, "https://", "https*://", 1)
|
||||||
|
} else {
|
||||||
|
baseUrlPattern = strings.Replace(baseUrl, "http://", "https*://", 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
patterns := []map[string]string{
|
||||||
|
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/downloadAll", "param": "noteId", "to": "getAllAttachs?noteId="},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, eachPattern := range patterns {
|
||||||
|
|
||||||
|
if !isMarkdown {
|
||||||
|
|
||||||
|
// 富文本处理
|
||||||
|
|
||||||
|
// <img src="http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1">
|
||||||
|
// <a href="http://leanote.com/attach/download?attachId=5504243a38f4111dcb00017d"></a>
|
||||||
|
|
||||||
|
var reg *regexp.Regexp
|
||||||
|
if eachPattern["src"] == "src" {
|
||||||
|
reg, _ = regexp.Compile("<img(?:[^>]+?)(" + eachPattern["src"] + `=['"]*` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})["']*)[^>]*>`)
|
||||||
|
} else {
|
||||||
|
reg, _ = regexp.Compile("<a(?:[^>]+?)(" + eachPattern["src"] + `=['"]*` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})["']*)[^>]*>`)
|
||||||
|
}
|
||||||
|
|
||||||
|
finds := reg.FindAllStringSubmatch(content, -1) // 查找所有的
|
||||||
|
|
||||||
|
for _, eachFind := range finds {
|
||||||
|
if len(eachFind) == 3 {
|
||||||
|
// 这一行会非常慢!, content是全部的内容, 多次replace导致
|
||||||
|
content = strings.Replace(content,
|
||||||
|
eachFind[1],
|
||||||
|
eachPattern["src"]+"=\""+baseUrl+"/api/file/"+eachPattern["to"]+eachFind[2]+"\"",
|
||||||
|
1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// markdown处理
|
||||||
|
// 
|
||||||
|
// [selection 2.html](http://leanote.com/attach/download?attachId=5504262638f4111dcb00017f)
|
||||||
|
// [all.tar.gz](http://leanote.com/attach/downloadAll?noteId=5503b57d59f81b4eb4000000)
|
||||||
|
|
||||||
|
pre := "!" // 默认图片
|
||||||
|
if eachPattern["src"] == "href" { // 是attach
|
||||||
|
pre = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
regImageMarkdown, _ := regexp.Compile(pre + `\[([^]]*?)\]\(` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})\)`)
|
||||||
|
findsImageMarkdown := regImageMarkdown.FindAllStringSubmatch(content, -1) // 查找所有的
|
||||||
|
// [[ 5503537b38f4111dcb0000d1] [ 5503537b38f4111dcb0000d1]]
|
||||||
|
for _, eachFind := range findsImageMarkdown {
|
||||||
|
// [ 你好啊, 我很好, 为什么? 5503537b38f4111dcb0000d1]
|
||||||
|
if len(eachFind) == 3 {
|
||||||
|
content = strings.Replace(content, eachFind[0], pre+"["+eachFind[1]+"]("+baseUrl+"/api/file/"+eachPattern["to"]+eachFind[2]+")", 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return content
|
||||||
|
}
|
||||||
|
|
||||||
|
// 性能更好, 5倍的差距
|
||||||
|
func (this *NoteService) FixContent(content string, isMarkdown bool) string {
|
||||||
|
baseUrl := configService.GetSiteUrl()
|
||||||
|
|
||||||
|
baseUrlPattern := baseUrl
|
||||||
|
|
||||||
|
// 避免https的url
|
||||||
|
if baseUrl[0:8] == "https://" {
|
||||||
|
baseUrlPattern = strings.Replace(baseUrl, "https://", "https*://", 1)
|
||||||
|
} else {
|
||||||
|
baseUrlPattern = strings.Replace(baseUrl, "http://", "https*://", 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
patterns := []map[string]string{
|
||||||
|
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/downloadAll", "param": "noteId", "to": "getAllAttachs?noteId="},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, eachPattern := range patterns {
|
||||||
|
|
||||||
|
if !isMarkdown {
|
||||||
|
|
||||||
|
// 富文本处理
|
||||||
|
|
||||||
|
// <img src="http://leanote.com/file/outputImage?fileId=5503537b38f4111dcb0000d1">
|
||||||
|
// <a href="http://leanote.com/attach/download?attachId=5504243a38f4111dcb00017d"></a>
|
||||||
|
|
||||||
|
var reg *regexp.Regexp
|
||||||
|
var reg2 *regexp.Regexp
|
||||||
|
if eachPattern["src"] == "src" {
|
||||||
|
reg, _ = regexp.Compile("<img(?:[^>]+?)(?:" + eachPattern["src"] + `=['"]*` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=(?:[a-z0-9A-Z]{24})["']*)[^>]*>`)
|
||||||
|
reg2, _ = regexp.Compile("<img(?:[^>]+?)(" + eachPattern["src"] + `=['"]*` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})["']*)[^>]*>`)
|
||||||
|
} else {
|
||||||
|
reg, _ = 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})["']*)[^>]*>`)
|
||||||
|
}
|
||||||
|
|
||||||
|
content = reg.ReplaceAllStringFunc(content, func(str string) string {
|
||||||
|
// str=这样的
|
||||||
|
// <img src="http://localhost:9000/file/outputImage?fileId=563d706e99c37b48e0000001" alt="" data-mce-src="http://localhost:9000/file/outputImage?fileId=563d706e99c37b48e0000002">
|
||||||
|
|
||||||
|
eachFind := reg2.FindStringSubmatch(str)
|
||||||
|
str = strings.Replace(str,
|
||||||
|
eachFind[1],
|
||||||
|
eachPattern["src"]+"=\""+baseUrl+"/api/file/"+eachPattern["to"]+eachFind[2]+"\"",
|
||||||
|
1)
|
||||||
|
|
||||||
|
// fmt.Println(str)
|
||||||
|
return str
|
||||||
|
})
|
||||||
|
/*
|
||||||
|
finds := reg.FindAllStringSubmatch(content, -1) // 查找所有的
|
||||||
|
|
||||||
|
for _, eachFind := range finds {
|
||||||
|
if len(eachFind) == 3 {
|
||||||
|
// 这一行会非常慢!, content是全部的内容, 多次replace导致
|
||||||
|
content = strings.Replace(content,
|
||||||
|
eachFind[1],
|
||||||
|
eachPattern["src"]+"=\""+baseUrl+"/api/file/"+eachPattern["to"]+eachFind[2]+"\"",
|
||||||
|
1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
} else {
|
||||||
|
|
||||||
|
// markdown处理
|
||||||
|
// 
|
||||||
|
// [selection 2.html](http://leanote.com/attach/download?attachId=5504262638f4111dcb00017f)
|
||||||
|
// [all.tar.gz](http://leanote.com/attach/downloadAll?noteId=5503b57d59f81b4eb4000000)
|
||||||
|
|
||||||
|
pre := "!" // 默认图片
|
||||||
|
if eachPattern["src"] == "href" { // 是attach
|
||||||
|
pre = ""
|
||||||
|
}
|
||||||
|
|
||||||
|
regImageMarkdown, _ := regexp.Compile(pre + `\[(?:[^]]*?)\]\(` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=(?:[a-z0-9A-Z]{24})\)`)
|
||||||
|
regImageMarkdown2, _ := regexp.Compile(pre + `\[([^]]*?)\]\(` + baseUrlPattern + eachPattern["middle"] + `\?` + eachPattern["param"] + `=([a-z0-9A-Z]{24})\)`)
|
||||||
|
|
||||||
|
content = regImageMarkdown.ReplaceAllStringFunc(content, func(str string) string {
|
||||||
|
// str=这样的
|
||||||
|
// <img src="http://localhost:9000/file/outputImage?fileId=563d706e99c37b48e0000001" alt="" data-mce-src="http://localhost:9000/file/outputImage?fileId=563d706e99c37b48e0000002">
|
||||||
|
|
||||||
|
eachFind := regImageMarkdown2.FindStringSubmatch(str)
|
||||||
|
str = strings.Replace(str, eachFind[0], pre+"["+eachFind[1]+"]("+baseUrl+"/api/file/"+eachPattern["to"]+eachFind[2]+")", 1)
|
||||||
|
|
||||||
|
// fmt.Println(str)
|
||||||
|
return str
|
||||||
|
})
|
||||||
|
|
||||||
|
/*
|
||||||
|
findsImageMarkdown := regImageMarkdown.FindAllStringSubmatch(content, -1) // 查找所有的
|
||||||
|
// [[ 5503537b38f4111dcb0000d1] [ 5503537b38f4111dcb0000d1]]
|
||||||
|
for _, eachFind := range findsImageMarkdown {
|
||||||
|
// [ 你好啊, 我很好, 为什么? 5503537b38f4111dcb0000d1]
|
||||||
|
if len(eachFind) == 3 {
|
||||||
|
content = strings.Replace(content, eachFind[0], pre+"["+eachFind[1]+"]("+baseUrl+"/api/file/"+eachPattern["to"]+eachFind[2]+")", 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return content
|
||||||
|
}
|
||||||
@@ -1,15 +1,15 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
// "fmt"
|
// "fmt"
|
||||||
"gopkg.in/mgo.v2/bson"
|
|
||||||
"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"
|
||||||
"sort"
|
"sort"
|
||||||
"time"
|
|
||||||
"strings"
|
"strings"
|
||||||
// "html"
|
"time"
|
||||||
|
// "html"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 笔记本
|
// 笔记本
|
||||||
@@ -42,8 +42,8 @@ func ParseAndSortNotebooks(userNotebooks []info.Notebook, noParentDelete, needSo
|
|||||||
for _, each := range userNotebooks {
|
for _, each := range userNotebooks {
|
||||||
newNotebooks := info.Notebooks{Subs: info.SubNotebooks{}}
|
newNotebooks := info.Notebooks{Subs: info.SubNotebooks{}}
|
||||||
newNotebooks.NotebookId = each.NotebookId
|
newNotebooks.NotebookId = each.NotebookId
|
||||||
newNotebooks.Title = each.Title;
|
newNotebooks.Title = each.Title
|
||||||
// newNotebooks.Title = html.EscapeString(each.Title)
|
// newNotebooks.Title = html.EscapeString(each.Title)
|
||||||
newNotebooks.Title = strings.Replace(strings.Replace(each.Title, "<script>", "", -1), "</script", "", -1)
|
newNotebooks.Title = strings.Replace(strings.Replace(each.Title, "<script>", "", -1), "</script", "", -1)
|
||||||
newNotebooks.Seq = each.Seq
|
newNotebooks.Seq = each.Seq
|
||||||
newNotebooks.UserId = each.UserId
|
newNotebooks.UserId = each.UserId
|
||||||
@@ -116,9 +116,9 @@ func (this *NotebookService) GetNotebookByUserIdAndUrlTitle(userId, notebookIdOr
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 同步的方法
|
// 同步的方法
|
||||||
func (this *NotebookService) GeSyncNotebooks(userId string, afterUsn, maxEntry int) ([]info.Notebook) {
|
func (this *NotebookService) GeSyncNotebooks(userId string, afterUsn, maxEntry int) []info.Notebook {
|
||||||
notebooks := []info.Notebook{}
|
notebooks := []info.Notebook{}
|
||||||
q := db.Notebooks.Find(bson.M{"UserId": bson.ObjectIdHex(userId), "Usn": bson.M{"$gt": afterUsn}});
|
q := db.Notebooks.Find(bson.M{"UserId": bson.ObjectIdHex(userId), "Usn": bson.M{"$gt": afterUsn}})
|
||||||
q.Sort("Usn").Limit(maxEntry).All(¬ebooks)
|
q.Sort("Usn").Limit(maxEntry).All(¬ebooks)
|
||||||
return notebooks
|
return notebooks
|
||||||
}
|
}
|
||||||
@@ -156,9 +156,13 @@ func (this *NotebookService) GetNotebooksByNotebookIds(notebookIds []bson.Object
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 添加
|
// 添加
|
||||||
// [ok]
|
|
||||||
func (this *NotebookService) AddNotebook(notebook info.Notebook) (bool, info.Notebook) {
|
func (this *NotebookService) AddNotebook(notebook info.Notebook) (bool, info.Notebook) {
|
||||||
notebook.UrlTitle = GetUrTitle(notebook.UserId.Hex(), notebook.Title, "notebook")
|
|
||||||
|
if notebook.NotebookId == "" {
|
||||||
|
notebook.NotebookId = bson.NewObjectId()
|
||||||
|
}
|
||||||
|
|
||||||
|
notebook.UrlTitle = GetUrTitle(notebook.UserId.Hex(), notebook.Title, "notebook", notebook.NotebookId.Hex())
|
||||||
notebook.Usn = userService.IncrUsn(notebook.UserId.Hex())
|
notebook.Usn = userService.IncrUsn(notebook.UserId.Hex())
|
||||||
now := time.Now()
|
now := time.Now()
|
||||||
notebook.CreatedTime = now
|
notebook.CreatedTime = now
|
||||||
@@ -169,6 +173,7 @@ func (this *NotebookService) AddNotebook(notebook info.Notebook) (bool, info.Not
|
|||||||
}
|
}
|
||||||
return true, notebook
|
return true, notebook
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新笔记, api
|
// 更新笔记, api
|
||||||
func (this *NotebookService) UpdateNotebookApi(userId, notebookId, title, parentNotebookId string, seq, usn int) (bool, string, info.Notebook) {
|
func (this *NotebookService) UpdateNotebookApi(userId, notebookId, title, parentNotebookId string, seq, usn int) (bool, string, info.Notebook) {
|
||||||
if notebookId == "" {
|
if notebookId == "" {
|
||||||
@@ -183,16 +188,16 @@ func (this *NotebookService) UpdateNotebookApi(userId, notebookId, title, parent
|
|||||||
} else if notebook.Usn != usn {
|
} else if notebook.Usn != usn {
|
||||||
return false, "conflict", notebook
|
return false, "conflict", notebook
|
||||||
}
|
}
|
||||||
notebook.Usn = userService.IncrUsn(userId);
|
notebook.Usn = userService.IncrUsn(userId)
|
||||||
notebook.Title = title;
|
notebook.Title = title
|
||||||
|
|
||||||
updates := bson.M{"Title": title, "Usn": notebook.Usn, "Seq": seq, "UpdatedTime": time.Now()};
|
updates := bson.M{"Title": title, "Usn": notebook.Usn, "Seq": seq, "UpdatedTime": time.Now()}
|
||||||
if(parentNotebookId != "" && bson.IsObjectIdHex(parentNotebookId)) {
|
if parentNotebookId != "" && bson.IsObjectIdHex(parentNotebookId) {
|
||||||
updates["ParentNotebookId"] = bson.ObjectIdHex(parentNotebookId);
|
updates["ParentNotebookId"] = bson.ObjectIdHex(parentNotebookId)
|
||||||
} else {
|
} else {
|
||||||
updates["ParentNotebookId"] = "";
|
updates["ParentNotebookId"] = ""
|
||||||
}
|
}
|
||||||
ok := db.UpdateByIdAndUserIdMap(db.Notebooks, notebookId, userId, updates);
|
ok := db.UpdateByIdAndUserIdMap(db.Notebooks, notebookId, userId, updates)
|
||||||
if ok {
|
if ok {
|
||||||
return ok, "", this.GetNotebookById(notebookId)
|
return ok, "", this.GetNotebookById(notebookId)
|
||||||
}
|
}
|
||||||
@@ -202,7 +207,7 @@ func (this *NotebookService) UpdateNotebookApi(userId, notebookId, title, parent
|
|||||||
// 判断是否是blog
|
// 判断是否是blog
|
||||||
func (this *NotebookService) IsBlog(notebookId string) bool {
|
func (this *NotebookService) IsBlog(notebookId string) bool {
|
||||||
notebook := info.Notebook{}
|
notebook := info.Notebook{}
|
||||||
db.GetByQWithFields(db.Notebooks, bson.M{"_id": bson.ObjectIdHex(notebookId)}, []string{"IsBlog"}, ¬ebook);
|
db.GetByQWithFields(db.Notebooks, bson.M{"_id": bson.ObjectIdHex(notebookId)}, []string{"IsBlog"}, ¬ebook)
|
||||||
return notebook.IsBlog
|
return notebook.IsBlog
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -228,13 +233,13 @@ func (this *NotebookService) UpdateNotebookTitle(notebookId, userId, title strin
|
|||||||
|
|
||||||
// 更新notebook
|
// 更新notebook
|
||||||
func (this *NotebookService) UpdateNotebook(userId, notebookId string, needUpdate bson.M) bool {
|
func (this *NotebookService) UpdateNotebook(userId, notebookId string, needUpdate bson.M) bool {
|
||||||
needUpdate["UpdatedTime"] = time.Now();
|
needUpdate["UpdatedTime"] = time.Now()
|
||||||
needUpdate["Usn"] = userService.IncrUsn(userId)
|
needUpdate["Usn"] = userService.IncrUsn(userId)
|
||||||
return db.UpdateByIdAndUserIdMap(db.Notebooks, notebookId, userId, needUpdate)
|
return db.UpdateByIdAndUserIdMap(db.Notebooks, notebookId, userId, needUpdate)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ToBlog or Not
|
// ToBlog or Not
|
||||||
func (this *NotebookService) ToBlog(userId, notebookId string, isBlog bool) (bool) {
|
func (this *NotebookService) ToBlog(userId, notebookId string, isBlog bool) bool {
|
||||||
updates := bson.M{"IsBlog": isBlog, "Usn": userService.IncrUsn(userId)}
|
updates := bson.M{"IsBlog": isBlog, "Usn": userService.IncrUsn(userId)}
|
||||||
// 笔记本
|
// 笔记本
|
||||||
db.UpdateByIdAndUserIdMap(db.Notebooks, notebookId, userId, updates)
|
db.UpdateByIdAndUserIdMap(db.Notebooks, notebookId, userId, updates)
|
||||||
@@ -275,15 +280,19 @@ func (this *NotebookService) ToBlog(userId, notebookId string, isBlog bool) (boo
|
|||||||
// 查看是否有子notebook
|
// 查看是否有子notebook
|
||||||
// 先查看该notebookId下是否有notes, 没有则删除
|
// 先查看该notebookId下是否有notes, 没有则删除
|
||||||
func (this *NotebookService) DeleteNotebook(userId, notebookId string) (bool, string) {
|
func (this *NotebookService) DeleteNotebook(userId, notebookId string) (bool, string) {
|
||||||
if db.Count(db.Notebooks, bson.M{"ParentNotebookId": bson.ObjectIdHex(notebookId),
|
if db.Count(db.Notebooks, bson.M{
|
||||||
"UserId": bson.ObjectIdHex(userId)}) == 0 { // 无
|
"ParentNotebookId": bson.ObjectIdHex(notebookId),
|
||||||
|
"UserId": bson.ObjectIdHex(userId),
|
||||||
|
"IsDeleted": false,
|
||||||
|
}) == 0 { // 无
|
||||||
if db.Count(db.Notes, bson.M{"NotebookId": bson.ObjectIdHex(notebookId),
|
if db.Count(db.Notes, bson.M{"NotebookId": bson.ObjectIdHex(notebookId),
|
||||||
"UserId": bson.ObjectIdHex(userId),
|
"UserId": bson.ObjectIdHex(userId),
|
||||||
"IsTrash": false}) == 0 { // 不包含trash
|
"IsTrash": false,
|
||||||
|
"IsDeleted": false}) == 0 { // 不包含trash
|
||||||
// 不是真删除 1/20, 为了同步笔记本
|
// 不是真删除 1/20, 为了同步笔记本
|
||||||
ok := db.UpdateByQMap(db.Notebooks, bson.M{"_id": bson.ObjectIdHex(notebookId)}, bson.M{"IsDeleted": true, "Usn": userService.IncrUsn(userId)})
|
ok := db.UpdateByQMap(db.Notebooks, bson.M{"_id": bson.ObjectIdHex(notebookId)}, bson.M{"IsDeleted": true, "Usn": userService.IncrUsn(userId)})
|
||||||
return ok, ""
|
return ok, ""
|
||||||
// return db.DeleteByIdAndUserId(db.Notebooks, notebookId, userId), ""
|
// return db.DeleteByIdAndUserId(db.Notebooks, notebookId, userId), ""
|
||||||
}
|
}
|
||||||
return false, "笔记本下有笔记"
|
return false, "笔记本下有笔记"
|
||||||
} else {
|
} else {
|
||||||
@@ -325,10 +334,10 @@ func (this *NotebookService) SortNotebooks(userId string, notebookId2Seqs map[st
|
|||||||
func (this *NotebookService) DragNotebooks(userId string, curNotebookId string, parentNotebookId string, siblings []string) bool {
|
func (this *NotebookService) DragNotebooks(userId string, curNotebookId string, parentNotebookId string, siblings []string) bool {
|
||||||
ok := false
|
ok := false
|
||||||
// 如果没parentNotebookId, 则parentNotebookId设空
|
// 如果没parentNotebookId, 则parentNotebookId设空
|
||||||
if(parentNotebookId == "") {
|
if parentNotebookId == "" {
|
||||||
ok = db.UpdateByIdAndUserIdMap(db.Notebooks, curNotebookId, userId, bson.M{"ParentNotebookId": "", "Usn": userService.IncrUsn(userId)});
|
ok = db.UpdateByIdAndUserIdMap(db.Notebooks, curNotebookId, userId, bson.M{"ParentNotebookId": "", "Usn": userService.IncrUsn(userId)})
|
||||||
} else {
|
} else {
|
||||||
ok = db.UpdateByIdAndUserIdMap(db.Notebooks, curNotebookId, userId, bson.M{"ParentNotebookId": bson.ObjectIdHex(parentNotebookId), "Usn": userService.IncrUsn(userId)});
|
ok = db.UpdateByIdAndUserIdMap(db.Notebooks, curNotebookId, userId, bson.M{"ParentNotebookId": bson.ObjectIdHex(parentNotebookId), "Usn": userService.IncrUsn(userId)})
|
||||||
}
|
}
|
||||||
|
|
||||||
if !ok {
|
if !ok {
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gopkg.in/mgo.v2/bson"
|
|
||||||
"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"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 找回密码
|
// 找回密码
|
||||||
@@ -34,6 +34,7 @@ func (this *PwdService) FindPwd(email string) (ok bool, msg string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 重置密码时
|
||||||
// 修改密码
|
// 修改密码
|
||||||
// 先验证
|
// 先验证
|
||||||
func (this *PwdService) UpdatePwd(token, pwd string) (bool, string) {
|
func (this *PwdService) UpdatePwd(token, pwd string) (bool, string) {
|
||||||
@@ -46,8 +47,13 @@ func (this *PwdService) UpdatePwd(token, pwd string) (bool, string) {
|
|||||||
return ok, msg
|
return ok, msg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
passwd := GenPwd(pwd)
|
||||||
|
if passwd == "" {
|
||||||
|
return false, "GenerateHash error"
|
||||||
|
}
|
||||||
|
|
||||||
// 修改密码之
|
// 修改密码之
|
||||||
ok = db.UpdateByQField(db.Users, bson.M{"_id": tokenInfo.UserId}, "Pwd", Md5(pwd))
|
ok = db.UpdateByQField(db.Users, bson.M{"_id": tokenInfo.UserId}, "Pwd", passwd)
|
||||||
|
|
||||||
// 删除token
|
// 删除token
|
||||||
tokenService.DeleteToken(tokenInfo.UserId.Hex(), info.TokenPwd)
|
tokenService.DeleteToken(tokenInfo.UserId.Hex(), info.TokenPwd)
|
||||||
|
|||||||
@@ -1,12 +1,12 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/info"
|
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
|
"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"
|
||||||
// "strings"
|
// "strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Session存储到mongodb中
|
// Session存储到mongodb中
|
||||||
@@ -17,6 +17,7 @@ func (this *SessionService) Update(sessionId, key string, value interface{}) boo
|
|||||||
return db.UpdateByQMap(db.Sessions, bson.M{"SessionId": sessionId},
|
return db.UpdateByQMap(db.Sessions, bson.M{"SessionId": sessionId},
|
||||||
bson.M{key: value, "UpdatedTime": time.Now()})
|
bson.M{key: value, "UpdatedTime": time.Now()})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 注销时清空session
|
// 注销时清空session
|
||||||
func (this *SessionService) Clear(sessionId string) bool {
|
func (this *SessionService) Clear(sessionId string) bool {
|
||||||
return db.Delete(db.Sessions, bson.M{"SessionId": sessionId})
|
return db.Delete(db.Sessions, bson.M{"SessionId": sessionId})
|
||||||
@@ -45,14 +46,16 @@ func (this *SessionService) LoginTimesIsOver(sessionId string) bool {
|
|||||||
session := this.Get(sessionId)
|
session := this.Get(sessionId)
|
||||||
return session.LoginTimes > 5
|
return session.LoginTimes > 5
|
||||||
}
|
}
|
||||||
|
|
||||||
// 登录成功后清空错误次数
|
// 登录成功后清空错误次数
|
||||||
func (this *SessionService) ClearLoginTimes(sessionId string) bool {
|
func (this *SessionService) ClearLoginTimes(sessionId string) bool {
|
||||||
return this.Update(sessionId, "LoginTimes", 0)
|
return this.Update(sessionId, "LoginTimes", 0)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 增加错误次数
|
// 增加错误次数
|
||||||
func (this *SessionService) IncrLoginTimes(sessionId string) bool {
|
func (this *SessionService) IncrLoginTimes(sessionId string) bool {
|
||||||
session := this.Get(sessionId)
|
session := this.Get(sessionId)
|
||||||
return this.Update(sessionId, "LoginTimes", session.LoginTimes + 1)
|
return this.Update(sessionId, "LoginTimes", session.LoginTimes+1)
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------
|
//----------
|
||||||
|
|||||||
+54
-52
@@ -1,12 +1,12 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/info"
|
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
|
"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"
|
|
||||||
"sort"
|
"sort"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 共享Notebook, Note服务
|
// 共享Notebook, Note服务
|
||||||
@@ -45,7 +45,7 @@ func (this *ShareService) getOrQ(userId string) bson.M {
|
|||||||
// 不是trash的
|
// 不是trash的
|
||||||
q["$or"] = orQ
|
q["$or"] = orQ
|
||||||
} else {
|
} else {
|
||||||
q["ToUserId"] = bson.ObjectIdHex(userId);
|
q["ToUserId"] = bson.ObjectIdHex(userId)
|
||||||
}
|
}
|
||||||
return q
|
return q
|
||||||
}
|
}
|
||||||
@@ -68,12 +68,12 @@ func (this *ShareService) GetShareNotebooks(userId string) (info.ShareNotebooksB
|
|||||||
|
|
||||||
userIds := append(userIds1, userIds2...)
|
userIds := append(userIds1, userIds2...)
|
||||||
|
|
||||||
userInfos := userService.GetUserInfosOrderBySeq(userIds);
|
userInfos := userService.GetUserInfosOrderBySeq(userIds)
|
||||||
// 不要我的id
|
// 不要我的id
|
||||||
for i, userInfo := range userInfos {
|
for i, userInfo := range userInfos {
|
||||||
if userInfo.UserId.Hex() == myUserId {
|
if userInfo.UserId.Hex() == myUserId {
|
||||||
userInfos = append(userInfos[:i], userInfos[i+1:]...)
|
userInfos = append(userInfos[:i], userInfos[i+1:]...)
|
||||||
break;
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -109,13 +109,13 @@ func (this *ShareService) GetShareNotebooks(userId string) (info.ShareNotebooksB
|
|||||||
subShareNotebooks := this.parseToSubShareNotebooks(&subNotebooks, &shareNotebooksMap)
|
subShareNotebooks := this.parseToSubShareNotebooks(&subNotebooks, &shareNotebooksMap)
|
||||||
|
|
||||||
// 3 按用户进行分组成ShareNotebooksByUser
|
// 3 按用户进行分组成ShareNotebooksByUser
|
||||||
shareNotebooksByUsersMap := map[bson.ObjectId] []info.ShareNotebooks{}
|
shareNotebooksByUsersMap := map[bson.ObjectId][]info.ShareNotebooks{}
|
||||||
// 先建立userId => []
|
// 先建立userId => []
|
||||||
for _, eachSub := range subShareNotebooks {
|
for _, eachSub := range subShareNotebooks {
|
||||||
userId := eachSub.Notebook.UserId
|
userId := eachSub.Notebook.UserId
|
||||||
// 我自己的, 算了
|
// 我自己的, 算了
|
||||||
if userId.Hex() == myUserId {
|
if userId.Hex() == myUserId {
|
||||||
continue;
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, ok := shareNotebooksByUsersMap[userId]; ok {
|
if _, ok := shareNotebooksByUsersMap[userId]; ok {
|
||||||
@@ -124,7 +124,7 @@ func (this *ShareService) GetShareNotebooks(userId string) (info.ShareNotebooksB
|
|||||||
shareNotebooksByUsersMap[userId] = []info.ShareNotebooks{eachSub}
|
shareNotebooksByUsersMap[userId] = []info.ShareNotebooks{eachSub}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
shareNotebooksByUser := info.ShareNotebooksByUser{};
|
shareNotebooksByUser := info.ShareNotebooksByUser{}
|
||||||
for userId, eachShareNotebooks := range shareNotebooksByUsersMap {
|
for userId, eachShareNotebooks := range shareNotebooksByUsersMap {
|
||||||
// 4, 按用户排序
|
// 4, 按用户排序
|
||||||
shareNotebooksByUser[userId.Hex()] = sortSubShareNotebooks(eachShareNotebooks)
|
shareNotebooksByUser[userId.Hex()] = sortSubShareNotebooks(eachShareNotebooks)
|
||||||
@@ -173,11 +173,11 @@ func (this *ShareService) parseToSubShareNotebooks(subNotebooks *info.SubNoteboo
|
|||||||
|
|
||||||
// 得到共享笔记本下的notes
|
// 得到共享笔记本下的notes
|
||||||
func (this *ShareService) ListShareNotesByNotebookId(notebookId, myUserId, sharedUserId string,
|
func (this *ShareService) ListShareNotesByNotebookId(notebookId, myUserId, sharedUserId string,
|
||||||
page, pageSize int, sortField string, isAsc bool) ([]info.ShareNoteWithPerm) {
|
page, pageSize int, sortField string, isAsc bool) []info.ShareNoteWithPerm {
|
||||||
// 1 首先判断是否真的sharedUserId 共享了 notebookId 给 myUserId
|
// 1 首先判断是否真的sharedUserId 共享了 notebookId 给 myUserId
|
||||||
q := this.getOrQ(myUserId)
|
q := this.getOrQ(myUserId)
|
||||||
q["NotebookId"] = bson.ObjectIdHex(notebookId);
|
q["NotebookId"] = bson.ObjectIdHex(notebookId)
|
||||||
q["UserId"] = bson.ObjectIdHex(sharedUserId);
|
q["UserId"] = bson.ObjectIdHex(sharedUserId)
|
||||||
shareNotebook := info.ShareNotebook{}
|
shareNotebook := info.ShareNotebook{}
|
||||||
db.GetByQ(db.ShareNotebooks,
|
db.GetByQ(db.ShareNotebooks,
|
||||||
q,
|
q,
|
||||||
@@ -190,7 +190,7 @@ func (this *ShareService) ListShareNotesByNotebookId(notebookId, myUserId, share
|
|||||||
perm := shareNotebook.Perm
|
perm := shareNotebook.Perm
|
||||||
|
|
||||||
// 2 得到该notebook下分页显示所有的notes
|
// 2 得到该notebook下分页显示所有的notes
|
||||||
_, notes := noteService.ListNotes(sharedUserId, notebookId, false, page, pageSize, sortField, isAsc, false);
|
_, notes := noteService.ListNotes(sharedUserId, notebookId, false, page, pageSize, sortField, isAsc, false)
|
||||||
|
|
||||||
// 3 添加权限信息
|
// 3 添加权限信息
|
||||||
// 3.1 如果该notebook自己有其它权限信息, 比如1, 那么覆盖notebook的权限信息
|
// 3.1 如果该notebook自己有其它权限信息, 比如1, 那么覆盖notebook的权限信息
|
||||||
@@ -210,12 +210,12 @@ func (this *ShareService) ListShareNotesByNotebookId(notebookId, myUserId, share
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log("笔记权限")
|
Log("笔记权限")
|
||||||
LogJ(notePerms);
|
LogJ(notePerms)
|
||||||
|
|
||||||
// 3.2 组合
|
// 3.2 组合
|
||||||
notesWithPerm := make([]info.ShareNoteWithPerm, len(notes))
|
notesWithPerm := make([]info.ShareNoteWithPerm, len(notes))
|
||||||
for i, each := range notes {
|
for i, each := range notes {
|
||||||
thisPerm := perm;
|
thisPerm := perm
|
||||||
if selfPerm, ok := notePerms[each.NoteId]; ok {
|
if selfPerm, ok := notePerms[each.NoteId]; ok {
|
||||||
thisPerm = selfPerm
|
thisPerm = selfPerm
|
||||||
}
|
}
|
||||||
@@ -247,13 +247,13 @@ func (this *ShareService) ListShareNotesByNotebookId(notebookId, myUserId, share
|
|||||||
// 可以这样! 到时将零散的共享noteId放在用户基本数据中
|
// 可以这样! 到时将零散的共享noteId放在用户基本数据中
|
||||||
// 这里不好排序
|
// 这里不好排序
|
||||||
func (this *ShareService) ListShareNotes(myUserId, sharedUserId string,
|
func (this *ShareService) ListShareNotes(myUserId, sharedUserId string,
|
||||||
pageNumber, pageSize int, sortField string, isAsc bool) ([]info.ShareNoteWithPerm) {
|
pageNumber, pageSize int, sortField string, isAsc bool) []info.ShareNoteWithPerm {
|
||||||
|
|
||||||
skipNum, _ := parsePageAndSort(pageNumber, pageSize, sortField, isAsc)
|
skipNum, _ := parsePageAndSort(pageNumber, pageSize, sortField, isAsc)
|
||||||
shareNotes := []info.ShareNote{}
|
shareNotes := []info.ShareNote{}
|
||||||
|
|
||||||
q := this.getOrQ(myUserId)
|
q := this.getOrQ(myUserId)
|
||||||
q["UserId"] = bson.ObjectIdHex(sharedUserId);
|
q["UserId"] = bson.ObjectIdHex(sharedUserId)
|
||||||
|
|
||||||
db.ShareNotes.
|
db.ShareNotes.
|
||||||
Find(q).
|
Find(q).
|
||||||
@@ -297,7 +297,7 @@ func (this *ShareService) notes2NotesWithPerm(notes []info.Note) {
|
|||||||
// [ok]
|
// [ok]
|
||||||
func (this *ShareService) AddShareNotebook1(shareNotebook info.ShareNotebook) bool {
|
func (this *ShareService) AddShareNotebook1(shareNotebook info.ShareNotebook) bool {
|
||||||
// 添加一条记录说明两者存在关系
|
// 添加一条记录说明两者存在关系
|
||||||
this.AddHasShareNote(shareNotebook.UserId.Hex(), shareNotebook.ToUserId.Hex());
|
this.AddHasShareNote(shareNotebook.UserId.Hex(), shareNotebook.ToUserId.Hex())
|
||||||
|
|
||||||
shareNotebook.CreatedTime = time.Now()
|
shareNotebook.CreatedTime = time.Now()
|
||||||
return db.Insert(db.ShareNotebooks, shareNotebook)
|
return db.Insert(db.ShareNotebooks, shareNotebook)
|
||||||
@@ -316,13 +316,13 @@ func (this *ShareService) AddShareNotebook(notebookId string, perm int, userId,
|
|||||||
// 第三方注册时没有email
|
// 第三方注册时没有email
|
||||||
func (this *ShareService) AddShareNotebookToUserId(notebookId string, perm int, userId, toUserId string) (bool, string, string) {
|
func (this *ShareService) AddShareNotebookToUserId(notebookId string, perm int, userId, toUserId string) (bool, string, string) {
|
||||||
// 添加一条记录说明两者存在关系
|
// 添加一条记录说明两者存在关系
|
||||||
this.AddHasShareNote(userId, toUserId);
|
this.AddHasShareNote(userId, toUserId)
|
||||||
|
|
||||||
// 先删除之
|
// 先删除之
|
||||||
db.Delete(db.ShareNotebooks, bson.M{"NotebookId": bson.ObjectIdHex(notebookId),
|
db.Delete(db.ShareNotebooks, bson.M{"NotebookId": bson.ObjectIdHex(notebookId),
|
||||||
"UserId": bson.ObjectIdHex(userId),
|
"UserId": bson.ObjectIdHex(userId),
|
||||||
"ToUserId": bson.ObjectIdHex(toUserId),
|
"ToUserId": bson.ObjectIdHex(toUserId),
|
||||||
});
|
})
|
||||||
|
|
||||||
shareNotebook := info.ShareNotebook{NotebookId: bson.ObjectIdHex(notebookId),
|
shareNotebook := info.ShareNotebook{NotebookId: bson.ObjectIdHex(notebookId),
|
||||||
UserId: bson.ObjectIdHex(userId),
|
UserId: bson.ObjectIdHex(userId),
|
||||||
@@ -353,13 +353,13 @@ func (this *ShareService) AddShareNote(noteId string, perm int, userId, email st
|
|||||||
// 第三方测试没有userId
|
// 第三方测试没有userId
|
||||||
func (this *ShareService) AddShareNoteToUserId(noteId string, perm int, userId, toUserId string) (bool, string, string) {
|
func (this *ShareService) AddShareNoteToUserId(noteId string, perm int, userId, toUserId string) (bool, string, string) {
|
||||||
// 添加一条记录说明两者存在关系
|
// 添加一条记录说明两者存在关系
|
||||||
this.AddHasShareNote(userId, toUserId);
|
this.AddHasShareNote(userId, toUserId)
|
||||||
|
|
||||||
// 先删除之
|
// 先删除之
|
||||||
db.Delete(db.ShareNotes, bson.M{"NoteId": bson.ObjectIdHex(noteId),
|
db.Delete(db.ShareNotes, bson.M{"NoteId": bson.ObjectIdHex(noteId),
|
||||||
"UserId": bson.ObjectIdHex(userId),
|
"UserId": bson.ObjectIdHex(userId),
|
||||||
"ToUserId": bson.ObjectIdHex(toUserId),
|
"ToUserId": bson.ObjectIdHex(toUserId),
|
||||||
});
|
})
|
||||||
|
|
||||||
shareNote := info.ShareNote{NoteId: bson.ObjectIdHex(noteId),
|
shareNote := info.ShareNote{NoteId: bson.ObjectIdHex(noteId),
|
||||||
UserId: bson.ObjectIdHex(userId),
|
UserId: bson.ObjectIdHex(userId),
|
||||||
@@ -370,7 +370,6 @@ func (this *ShareService) AddShareNoteToUserId(noteId string, perm int, userId,
|
|||||||
return db.Insert(db.ShareNotes, shareNote), "", toUserId
|
return db.Insert(db.ShareNotes, shareNote), "", toUserId
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// updatedUserId是否有查看userId noteId的权限?
|
// updatedUserId是否有查看userId noteId的权限?
|
||||||
// userId是所有者
|
// userId是所有者
|
||||||
func (this *ShareService) HasReadPerm(userId, updatedUserId, noteId string) bool {
|
func (this *ShareService) HasReadPerm(userId, updatedUserId, noteId string) bool {
|
||||||
@@ -443,13 +442,14 @@ func (this *ShareService) HasUpdateNotebookPerm(userId, updatedUserId, notebookI
|
|||||||
// 共享note, notebook时使用
|
// 共享note, notebook时使用
|
||||||
func (this *ShareService) AddHasShareNote(userId, toUserId string) bool {
|
func (this *ShareService) AddHasShareNote(userId, toUserId string) bool {
|
||||||
db.Insert(db.HasShareNotes, info.HasShareNote{UserId: bson.ObjectIdHex(userId), ToUserId: bson.ObjectIdHex(toUserId)})
|
db.Insert(db.HasShareNotes, info.HasShareNote{UserId: bson.ObjectIdHex(userId), ToUserId: bson.ObjectIdHex(toUserId)})
|
||||||
return true;
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// userId是否被共享了noteId
|
// userId是否被共享了noteId
|
||||||
func (this *ShareService) HasSharedNote(noteId, myUserId string) bool {
|
func (this *ShareService) HasSharedNote(noteId, myUserId string) bool {
|
||||||
return db.Has(db.ShareNotes, bson.M{"ToUserId": bson.ObjectIdHex(myUserId), "NoteId": bson.ObjectIdHex(noteId)})
|
return db.Has(db.ShareNotes, bson.M{"ToUserId": bson.ObjectIdHex(myUserId), "NoteId": bson.ObjectIdHex(noteId)})
|
||||||
}
|
}
|
||||||
|
|
||||||
// noteId的notebook是否共享了给我
|
// noteId的notebook是否共享了给我
|
||||||
func (this *ShareService) HasSharedNotebook(noteId, myUserId, sharedUserId string) bool {
|
func (this *ShareService) HasSharedNotebook(noteId, myUserId, sharedUserId string) bool {
|
||||||
notebookId := noteService.GetNotebookId(noteId)
|
notebookId := noteService.GetNotebookId(noteId)
|
||||||
@@ -468,11 +468,12 @@ func (this *ShareService) GetShareNoteContent(noteId, myUserId, sharedUserId str
|
|||||||
noteContent = info.NoteContent{}
|
noteContent = info.NoteContent{}
|
||||||
// 是否单独共享了该notebook
|
// 是否单独共享了该notebook
|
||||||
// 或者, 其notebook共享了我
|
// 或者, 其notebook共享了我
|
||||||
// Log(this.HasSharedNote(noteId, myUserId))
|
// Log(this.HasSharedNote(noteId, myUserId))
|
||||||
// Log(this.HasSharedNotebook(noteId, myUserId, sharedUserId))
|
// Log(this.HasSharedNotebook(noteId, myUserId, sharedUserId))
|
||||||
Log(this.HasReadPerm(sharedUserId, myUserId, noteId))
|
// Log(this.HasReadPerm(sharedUserId, myUserId, noteId))
|
||||||
|
|
||||||
if this.HasReadPerm(sharedUserId, myUserId, noteId) {
|
if this.HasReadPerm(sharedUserId, myUserId, noteId) {
|
||||||
// if this.HasSharedNote(noteId, myUserId) || this.HasSharedNotebook(noteId, myUserId, sharedUserId) {
|
// if this.HasSharedNote(noteId, myUserId) || this.HasSharedNotebook(noteId, myUserId, sharedUserId) {
|
||||||
db.Get(db.NoteContents, noteId, ¬eContent)
|
db.Get(db.NoteContents, noteId, ¬eContent)
|
||||||
} else {
|
} else {
|
||||||
}
|
}
|
||||||
@@ -493,8 +494,8 @@ func (this *ShareService) ListNoteShareUserInfo(noteId, userId string) []info.Sh
|
|||||||
"ToGroupId": bson.M{"$exists": false},
|
"ToGroupId": bson.M{"$exists": false},
|
||||||
}, &shareNotes, 100)
|
}, &shareNotes, 100)
|
||||||
|
|
||||||
// Log("<<>>>>")
|
// Log("<<>>>>")
|
||||||
// Log(len(shareNotes))
|
// Log(len(shareNotes))
|
||||||
|
|
||||||
if len(shareNotes) == 0 {
|
if len(shareNotes) == 0 {
|
||||||
return nil
|
return nil
|
||||||
@@ -591,7 +592,6 @@ func (this *ShareService) ListNotebookShareUserInfo(notebookId, userId string) [
|
|||||||
return shareUserInfos
|
return shareUserInfos
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//----------------
|
//----------------
|
||||||
// 改变note share权限
|
// 改变note share权限
|
||||||
func (this *ShareService) UpdateShareNotePerm(noteId string, perm int, userId, toUserId string) bool {
|
func (this *ShareService) UpdateShareNotePerm(noteId string, perm int, userId, toUserId string) bool {
|
||||||
@@ -622,6 +622,7 @@ func (this *ShareService) DeleteShareNoteAll(noteId string, userId string) bool
|
|||||||
return db.DeleteAll(db.ShareNotes,
|
return db.DeleteAll(db.ShareNotes,
|
||||||
bson.M{"NoteId": bson.ObjectIdHex(noteId), "UserId": bson.ObjectIdHex(userId)})
|
bson.M{"NoteId": bson.ObjectIdHex(noteId), "UserId": bson.ObjectIdHex(userId)})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除share notebook
|
// 删除share notebook
|
||||||
func (this *ShareService) DeleteShareNotebook(notebookId string, userId, toUserId string) bool {
|
func (this *ShareService) DeleteShareNotebook(notebookId string, userId, toUserId string) bool {
|
||||||
return db.DeleteAll(db.ShareNotebooks,
|
return db.DeleteAll(db.ShareNotebooks,
|
||||||
@@ -631,9 +632,9 @@ func (this *ShareService) DeleteShareNotebook(notebookId string, userId, toUserI
|
|||||||
// 删除userId分享给toUserId的所有
|
// 删除userId分享给toUserId的所有
|
||||||
func (this *ShareService) DeleteUserShareNoteAndNotebook(userId, toUserId string) bool {
|
func (this *ShareService) DeleteUserShareNoteAndNotebook(userId, toUserId string) bool {
|
||||||
query := bson.M{"UserId": bson.ObjectIdHex(userId), "ToUserId": bson.ObjectIdHex(toUserId)}
|
query := bson.M{"UserId": bson.ObjectIdHex(userId), "ToUserId": bson.ObjectIdHex(toUserId)}
|
||||||
db.DeleteAll(db.ShareNotebooks, query);
|
db.DeleteAll(db.ShareNotebooks, query)
|
||||||
db.DeleteAll(db.ShareNotes, query);
|
db.DeleteAll(db.ShareNotes, query)
|
||||||
db.DeleteAll(db.HasShareNotes, query);
|
db.DeleteAll(db.HasShareNotes, query)
|
||||||
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -641,10 +642,10 @@ func (this *ShareService) DeleteUserShareNoteAndNotebook(userId, toUserId string
|
|||||||
// 用户userId是否有修改noteId的权限
|
// 用户userId是否有修改noteId的权限
|
||||||
func (this *ShareService) HasUpdateNotePerm(noteId, userId string) bool {
|
func (this *ShareService) HasUpdateNotePerm(noteId, userId string) bool {
|
||||||
if noteId == "" || userId == "" {
|
if noteId == "" || userId == "" {
|
||||||
return false;
|
return false
|
||||||
}
|
}
|
||||||
note := noteService.GetNoteById(noteId)
|
note := noteService.GetNoteById(noteId)
|
||||||
LogJ(note);
|
LogJ(note)
|
||||||
if note.UserId != "" {
|
if note.UserId != "" {
|
||||||
noteUserId := note.UserId.Hex()
|
noteUserId := note.UserId.Hex()
|
||||||
if noteUserId != userId {
|
if noteUserId != userId {
|
||||||
@@ -652,20 +653,20 @@ func (this *ShareService) HasUpdateNotePerm(noteId, userId string) bool {
|
|||||||
if this.HasUpdatePerm(noteUserId, userId, noteId) {
|
if this.HasUpdatePerm(noteUserId, userId, noteId) {
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户userId是否有查看noteId的权限
|
// 用户userId是否有查看noteId的权限
|
||||||
func (this *ShareService) HasReadNotePerm(noteId, userId string) bool {
|
func (this *ShareService) HasReadNotePerm(noteId, userId string) bool {
|
||||||
if noteId == "" || userId == "" {
|
if noteId == "" || userId == "" {
|
||||||
return false;
|
return false
|
||||||
}
|
}
|
||||||
note := noteService.GetNoteById(noteId)
|
note := noteService.GetNoteById(noteId)
|
||||||
if note.UserId != "" {
|
if note.UserId != "" {
|
||||||
@@ -675,13 +676,13 @@ func (this *ShareService) HasReadNotePerm(noteId, userId string) bool {
|
|||||||
if this.HasReadPerm(noteUserId, userId, noteId) {
|
if this.HasReadPerm(noteUserId, userId, noteId) {
|
||||||
return true
|
return true
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -695,7 +696,7 @@ func (this *ShareService) GetNoteShareGroups(noteId, userId string) []info.Share
|
|||||||
// 得到有分享的分组
|
// 得到有分享的分组
|
||||||
shares := []info.ShareNote{}
|
shares := []info.ShareNote{}
|
||||||
db.ListByQ(db.ShareNotes,
|
db.ListByQ(db.ShareNotes,
|
||||||
bson.M{"NoteId": bson.ObjectIdHex(noteId), "UserId": bson.ObjectIdHex(userId), "ToGroupId": bson.M{"$exists":true}}, &shares)
|
bson.M{"NoteId": bson.ObjectIdHex(noteId), "UserId": bson.ObjectIdHex(userId), "ToGroupId": bson.M{"$exists": true}}, &shares)
|
||||||
mapShares := map[bson.ObjectId]info.ShareNote{}
|
mapShares := map[bson.ObjectId]info.ShareNote{}
|
||||||
for _, share := range shares {
|
for _, share := range shares {
|
||||||
mapShares[share.ToGroupId] = share
|
mapShares[share.ToGroupId] = share
|
||||||
@@ -708,7 +709,7 @@ func (this *ShareService) GetNoteShareGroups(noteId, userId string) []info.Share
|
|||||||
if !ok {
|
if !ok {
|
||||||
share = info.ShareNote{}
|
share = info.ShareNote{}
|
||||||
}
|
}
|
||||||
share.ToGroup = group;
|
share.ToGroup = group
|
||||||
shares2[i] = share
|
shares2[i] = share
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -716,7 +717,7 @@ func (this *ShareService) GetNoteShareGroups(noteId, userId string) []info.Share
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 共享笔记给分组
|
// 共享笔记给分组
|
||||||
func (this *ShareService) AddShareNoteGroup(userId, noteId, groupId string, perm int) (bool) {
|
func (this *ShareService) AddShareNoteGroup(userId, noteId, groupId string, perm int) bool {
|
||||||
if !groupService.IsExistsGroupUser(userId, groupId) {
|
if !groupService.IsExistsGroupUser(userId, groupId) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -738,7 +739,7 @@ func (this *ShareService) DeleteShareNoteGroup(userId, noteId, groupId string) b
|
|||||||
return db.Delete(db.ShareNotes, bson.M{"NoteId": bson.ObjectIdHex(noteId),
|
return db.Delete(db.ShareNotes, bson.M{"NoteId": bson.ObjectIdHex(noteId),
|
||||||
"UserId": bson.ObjectIdHex(userId),
|
"UserId": bson.ObjectIdHex(userId),
|
||||||
"ToGroupId": bson.ObjectIdHex(groupId),
|
"ToGroupId": bson.ObjectIdHex(groupId),
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
//-------
|
//-------
|
||||||
@@ -750,7 +751,7 @@ func (this *ShareService) GetNotebookShareGroups(notebookId, userId string) []in
|
|||||||
// 得到有分享的分组
|
// 得到有分享的分组
|
||||||
shares := []info.ShareNotebook{}
|
shares := []info.ShareNotebook{}
|
||||||
db.ListByQ(db.ShareNotebooks,
|
db.ListByQ(db.ShareNotebooks,
|
||||||
bson.M{"NotebookId": bson.ObjectIdHex(notebookId), "UserId": bson.ObjectIdHex(userId), "ToGroupId": bson.M{"$exists":true}}, &shares)
|
bson.M{"NotebookId": bson.ObjectIdHex(notebookId), "UserId": bson.ObjectIdHex(userId), "ToGroupId": bson.M{"$exists": true}}, &shares)
|
||||||
mapShares := map[bson.ObjectId]info.ShareNotebook{}
|
mapShares := map[bson.ObjectId]info.ShareNotebook{}
|
||||||
for _, share := range shares {
|
for _, share := range shares {
|
||||||
mapShares[share.ToGroupId] = share
|
mapShares[share.ToGroupId] = share
|
||||||
@@ -764,14 +765,15 @@ func (this *ShareService) GetNotebookShareGroups(notebookId, userId string) []in
|
|||||||
if !ok {
|
if !ok {
|
||||||
share = info.ShareNotebook{}
|
share = info.ShareNotebook{}
|
||||||
}
|
}
|
||||||
share.ToGroup = group;
|
share.ToGroup = group
|
||||||
shares2[i] = share
|
shares2[i] = share
|
||||||
}
|
}
|
||||||
|
|
||||||
return shares2
|
return shares2
|
||||||
}
|
}
|
||||||
|
|
||||||
// 共享笔记给分组
|
// 共享笔记给分组
|
||||||
func (this *ShareService) AddShareNotebookGroup(userId, notebookId, groupId string, perm int) (bool) {
|
func (this *ShareService) AddShareNotebookGroup(userId, notebookId, groupId string, perm int) bool {
|
||||||
if !groupService.IsExistsGroupUser(userId, groupId) {
|
if !groupService.IsExistsGroupUser(userId, groupId) {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -793,7 +795,7 @@ func (this *ShareService) DeleteShareNotebookGroup(userId, notebookId, groupId s
|
|||||||
return db.Delete(db.ShareNotebooks, bson.M{"NotebookId": bson.ObjectIdHex(notebookId),
|
return db.Delete(db.ShareNotebooks, bson.M{"NotebookId": bson.ObjectIdHex(notebookId),
|
||||||
"UserId": bson.ObjectIdHex(userId),
|
"UserId": bson.ObjectIdHex(userId),
|
||||||
"ToGroupId": bson.ObjectIdHex(groupId),
|
"ToGroupId": bson.ObjectIdHex(groupId),
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------
|
//--------------------
|
||||||
@@ -803,12 +805,12 @@ func (this *ShareService) DeleteShareNotebookGroup(userId, notebookId, groupId s
|
|||||||
func (this *ShareService) DeleteAllShareNotebookGroup(groupId string) bool {
|
func (this *ShareService) DeleteAllShareNotebookGroup(groupId string) bool {
|
||||||
return db.Delete(db.ShareNotebooks, bson.M{
|
return db.Delete(db.ShareNotebooks, bson.M{
|
||||||
"ToGroupId": bson.ObjectIdHex(groupId),
|
"ToGroupId": bson.ObjectIdHex(groupId),
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
func (this *ShareService) DeleteAllShareNoteGroup(groupId string) bool {
|
func (this *ShareService) DeleteAllShareNoteGroup(groupId string) bool {
|
||||||
return db.Delete(db.ShareNotes, bson.M{
|
return db.Delete(db.ShareNotes, bson.M{
|
||||||
"ToGroupId": bson.ObjectIdHex(groupId),
|
"ToGroupId": bson.ObjectIdHex(groupId),
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------
|
//--------------------
|
||||||
@@ -819,12 +821,12 @@ func (this *ShareService) DeleteShareNotebookGroupWhenDeleteGroupUser(userId, gr
|
|||||||
return db.Delete(db.ShareNotebooks, bson.M{
|
return db.Delete(db.ShareNotebooks, bson.M{
|
||||||
"UserId": bson.ObjectIdHex(userId),
|
"UserId": bson.ObjectIdHex(userId),
|
||||||
"ToGroupId": bson.ObjectIdHex(groupId),
|
"ToGroupId": bson.ObjectIdHex(groupId),
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *ShareService) DeleteShareNoteGroupWhenDeleteGroupUser(userId, groupId string) bool {
|
func (this *ShareService) DeleteShareNoteGroupWhenDeleteGroupUser(userId, groupId string) bool {
|
||||||
return db.Delete(db.ShareNotes, bson.M{
|
return db.Delete(db.ShareNotes, bson.M{
|
||||||
"UserId": bson.ObjectIdHex(userId),
|
"UserId": bson.ObjectIdHex(userId),
|
||||||
"ToGroupId": bson.ObjectIdHex(groupId),
|
"ToGroupId": bson.ObjectIdHex(groupId),
|
||||||
});
|
})
|
||||||
}
|
}
|
||||||
@@ -1,12 +1,12 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/info"
|
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
"github.com/leanote/leanote/app/info"
|
||||||
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
// "time"
|
// "time"
|
||||||
// "sort"
|
// "sort"
|
||||||
)
|
)
|
||||||
|
|
||||||
type SuggestionService struct {
|
type SuggestionService struct {
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/info"
|
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
// . "github.com/leanote/leanote/app/lea"
|
"github.com/leanote/leanote/app/info"
|
||||||
|
// . "github.com/leanote/leanote/app/lea"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@@ -60,7 +60,7 @@ func (this *TagService) AddOrUpdateTag(userId string, tag string) info.NoteTag {
|
|||||||
count := noteService.CountNoteByTag(userId, tag)
|
count := noteService.CountNoteByTag(userId, tag)
|
||||||
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而已
|
||||||
db.UpdateByIdAndUserId(db.NoteTags, noteTag.TagId.Hex(), userId, noteTag)
|
db.UpdateByIdAndUserId(db.NoteTags, noteTag.TagId.Hex(), userId, noteTag)
|
||||||
return noteTag
|
return noteTag
|
||||||
}
|
}
|
||||||
@@ -83,7 +83,7 @@ func (this *TagService) AddOrUpdateTag(userId string, tag string) info.NoteTag {
|
|||||||
func (this *TagService) GetTags(userId string) []info.NoteTag {
|
func (this *TagService) GetTags(userId string) []info.NoteTag {
|
||||||
tags := []info.NoteTag{}
|
tags := []info.NoteTag{}
|
||||||
query := bson.M{"UserId": bson.ObjectIdHex(userId), "IsDeleted": false}
|
query := bson.M{"UserId": bson.ObjectIdHex(userId), "IsDeleted": false}
|
||||||
q := db.NoteTags.Find(query);
|
q := db.NoteTags.Find(query)
|
||||||
sortFieldR := "-UpdatedTime"
|
sortFieldR := "-UpdatedTime"
|
||||||
q.Sort(sortFieldR).All(&tags)
|
q.Sort(sortFieldR).All(&tags)
|
||||||
return tags
|
return tags
|
||||||
@@ -95,7 +95,7 @@ func (this *TagService) GetTags(userId string) []info.NoteTag {
|
|||||||
func (this *TagService) DeleteTag(userId string, tag string) map[string]int {
|
func (this *TagService) DeleteTag(userId string, tag string) map[string]int {
|
||||||
usn := userService.IncrUsn(userId)
|
usn := userService.IncrUsn(userId)
|
||||||
if db.UpdateByQMap(db.NoteTags, bson.M{"UserId": bson.ObjectIdHex(userId), "Tag": tag}, bson.M{"Usn": usn, "IsDeleted": true}) {
|
if db.UpdateByQMap(db.NoteTags, bson.M{"UserId": bson.ObjectIdHex(userId), "Tag": tag}, bson.M{"Usn": usn, "IsDeleted": true}) {
|
||||||
return noteService.UpdateNoteToDeleteTag(userId, tag);
|
return noteService.UpdateNoteToDeleteTag(userId, tag)
|
||||||
}
|
}
|
||||||
return map[string]int{}
|
return map[string]int{}
|
||||||
}
|
}
|
||||||
@@ -124,14 +124,14 @@ func (this *TagService) reCountTagCount(userId string, tags []string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
for _, tag := range tags {
|
for _, tag := range tags {
|
||||||
this.AddOrUpdateTag(userId, tag);
|
this.AddOrUpdateTag(userId, tag)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 同步用
|
// 同步用
|
||||||
func (this *TagService) GeSyncTags(userId string, afterUsn, maxEntry int) ([]info.NoteTag) {
|
func (this *TagService) GeSyncTags(userId string, afterUsn, maxEntry int) []info.NoteTag {
|
||||||
noteTags := []info.NoteTag{}
|
noteTags := []info.NoteTag{}
|
||||||
q := db.NoteTags.Find(bson.M{"UserId": bson.ObjectIdHex(userId), "Usn": bson.M{"$gt": afterUsn}});
|
q := db.NoteTags.Find(bson.M{"UserId": bson.ObjectIdHex(userId), "Usn": bson.M{"$gt": afterUsn}})
|
||||||
q.Sort("Usn").Limit(maxEntry).All(¬eTags)
|
q.Sort("Usn").Limit(maxEntry).All(¬eTags)
|
||||||
return noteTags
|
return noteTags
|
||||||
}
|
}
|
||||||
+41
-34
@@ -1,20 +1,20 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/revel/revel"
|
"encoding/json"
|
||||||
"github.com/leanote/leanote/app/info"
|
"fmt"
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
|
"github.com/leanote/leanote/app/info"
|
||||||
. "github.com/leanote/leanote/app/lea"
|
. "github.com/leanote/leanote/app/lea"
|
||||||
"github.com/leanote/leanote/app/lea/archive"
|
"github.com/leanote/leanote/app/lea/archive"
|
||||||
|
"github.com/revel/revel"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
"time"
|
|
||||||
"strings"
|
|
||||||
"os"
|
|
||||||
"fmt"
|
|
||||||
"html/template"
|
"html/template"
|
||||||
"regexp"
|
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"encoding/json"
|
"os"
|
||||||
|
"regexp"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 主题
|
// 主题
|
||||||
@@ -29,6 +29,7 @@ var fixedStyle = "blog_left_fixed"
|
|||||||
func (this *ThemeService) getDefaultThemeBasePath() string {
|
func (this *ThemeService) getDefaultThemeBasePath() string {
|
||||||
return revel.BasePath + "/public/blog/themes"
|
return revel.BasePath + "/public/blog/themes"
|
||||||
}
|
}
|
||||||
|
|
||||||
// 默认主题路径
|
// 默认主题路径
|
||||||
func (this *ThemeService) getDefaultThemePath(style string) string {
|
func (this *ThemeService) getDefaultThemePath(style string) string {
|
||||||
if style == elegantStyle {
|
if style == elegantStyle {
|
||||||
@@ -39,6 +40,7 @@ func (this *ThemeService) getDefaultThemePath(style string) string {
|
|||||||
return this.getDefaultThemeBasePath() + "/default"
|
return this.getDefaultThemeBasePath() + "/default"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// blogService用
|
// blogService用
|
||||||
func (this *ThemeService) GetDefaultThemePath(style string) string {
|
func (this *ThemeService) GetDefaultThemePath(style string) string {
|
||||||
if style == elegantStyle {
|
if style == elegantStyle {
|
||||||
@@ -85,13 +87,13 @@ func (this *ThemeService) getDefaultTheme(style string) info.Theme {
|
|||||||
|
|
||||||
// 用户的主题路径设置
|
// 用户的主题路径设置
|
||||||
func (this *ThemeService) getUserThemeBasePath(userId string) string {
|
func (this *ThemeService) getUserThemeBasePath(userId string) string {
|
||||||
return revel.BasePath + "/public/upload/" + userId + "/themes"
|
return revel.BasePath + "/public/upload/" + Digest3(userId) + "/" + userId + "/themes"
|
||||||
}
|
}
|
||||||
func (this *ThemeService) getUserThemePath(userId, themeId string) string {
|
func (this *ThemeService) getUserThemePath(userId, themeId string) string {
|
||||||
return this.getUserThemeBasePath(userId) + "/" + themeId
|
return this.getUserThemeBasePath(userId) + "/" + themeId
|
||||||
}
|
}
|
||||||
func (this *ThemeService) getUserThemePath2(userId, themeId string) string {
|
func (this *ThemeService) getUserThemePath2(userId, themeId string) string {
|
||||||
return "public/upload/" + userId + "/themes/" + themeId
|
return "public/upload/" + Digest3(userId) + "/" + userId + "/themes/" + themeId
|
||||||
}
|
}
|
||||||
|
|
||||||
// 新建主题
|
// 新建主题
|
||||||
@@ -141,7 +143,7 @@ func (this *ThemeService) NewTheme(userId string) (ok bool, themeId string) {
|
|||||||
themeService.NewThemeForFirst(userBlog)
|
themeService.NewThemeForFirst(userBlog)
|
||||||
}
|
}
|
||||||
// 再copy一个默认主题
|
// 再copy一个默认主题
|
||||||
userBlog.Style = "defaultStyle";
|
userBlog.Style = "defaultStyle"
|
||||||
ok, themeId = this.CopyDefaultTheme(userBlog)
|
ok, themeId = this.CopyDefaultTheme(userBlog)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -223,11 +225,11 @@ func (this *ThemeService) GetUserThemes(userId string) (theme info.Theme, themes
|
|||||||
theme = info.Theme{}
|
theme = info.Theme{}
|
||||||
themes = []info.Theme{}
|
themes = []info.Theme{}
|
||||||
|
|
||||||
// db.ListByQ(db.Themes, bson.M{"UserId": bson.ObjectIdHex(userId)}, &themes)
|
// db.ListByQ(db.Themes, bson.M{"UserId": bson.ObjectIdHex(userId)}, &themes)
|
||||||
|
|
||||||
// 创建时间逆序
|
// 创建时间逆序
|
||||||
query := bson.M{"UserId": bson.ObjectIdHex(userId)}
|
query := bson.M{"UserId": bson.ObjectIdHex(userId)}
|
||||||
q := db.Themes.Find(query);
|
q := db.Themes.Find(query)
|
||||||
q.Sort("-CreatedTime").All(&themes)
|
q.Sort("-CreatedTime").All(&themes)
|
||||||
if len(themes) == 0 {
|
if len(themes) == 0 {
|
||||||
userBlog := blogService.GetUserBlog(userId)
|
userBlog := blogService.GetUserBlog(userId)
|
||||||
@@ -285,6 +287,7 @@ func (this *ThemeService) GetThemePath(userId, themeId string) string {
|
|||||||
}
|
}
|
||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
// 更新模板内容
|
// 更新模板内容
|
||||||
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) {
|
||||||
basePath := this.GetThemeAbsolutePath(userId, themeId)
|
basePath := this.GetThemeAbsolutePath(userId, themeId)
|
||||||
@@ -361,7 +364,7 @@ func (this *ThemeService) ActiveTheme(userId, themeId string) (ok bool) {
|
|||||||
|
|
||||||
// 删除主题
|
// 删除主题
|
||||||
func (this *ThemeService) DeleteTheme(userId, themeId string) (ok bool) {
|
func (this *ThemeService) DeleteTheme(userId, themeId string) (ok bool) {
|
||||||
return db.Delete(db.Themes,bson.M{"_id": bson.ObjectIdHex(themeId), "UserId": bson.ObjectIdHex(userId), "IsActive": false})
|
return db.Delete(db.Themes, bson.M{"_id": bson.ObjectIdHex(themeId), "UserId": bson.ObjectIdHex(userId), "IsActive": false})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 公开主题, 只有管理员才有权限, 之前没公开的变成公开
|
// 公开主题, 只有管理员才有权限, 之前没公开的变成公开
|
||||||
@@ -375,7 +378,6 @@ func (this *ThemeService) PublicTheme(userId, themeId string) (ok bool) {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// 导出主题
|
// 导出主题
|
||||||
func (this *ThemeService) ExportTheme(userId, themeId string) (ok bool, path string) {
|
func (this *ThemeService) ExportTheme(userId, themeId string) (ok bool, path string) {
|
||||||
theme := this.GetThemeById(themeId)
|
theme := this.GetThemeById(themeId)
|
||||||
@@ -406,16 +408,25 @@ func (this *ThemeService) ExportTheme(userId, themeId string) (ok bool, path str
|
|||||||
|
|
||||||
return true, targetName
|
return true, targetName
|
||||||
}
|
}
|
||||||
|
|
||||||
// 导入主题
|
// 导入主题
|
||||||
// path == /llllllll/..../public/upload/.../aa.zip, 绝对路径
|
// path == /llllllll/..../public/upload/.../aa.zip, 绝对路径
|
||||||
func (this *ThemeService) ImportTheme(userId, path string) (ok bool, msg string) {
|
func (this *ThemeService) ImportTheme(userId, path string) (ok bool, msg string) {
|
||||||
themeIdO := bson.NewObjectId()
|
themeIdO := bson.NewObjectId()
|
||||||
themeId := themeIdO.Hex()
|
themeId := themeIdO.Hex()
|
||||||
targetPath := this.getUserThemePath(userId, themeId) // revel.BasePath + "/public/upload/" + userId + "/themes/" + themeId
|
targetPath := this.getUserThemePath(userId, themeId) // revel.BasePath + "/public/upload/" + userId + "/themes/" + themeId
|
||||||
if ok, msg = archive.Unzip(path, targetPath); !ok {
|
|
||||||
DeleteFile(targetPath)
|
err := os.MkdirAll(targetPath, 0755)
|
||||||
|
if err != nil {
|
||||||
|
msg = "error"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if ok, msg = archive.Unzip(path, targetPath); !ok {
|
||||||
|
DeleteFile(targetPath)
|
||||||
|
Log("oh no")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// 主题验证
|
// 主题验证
|
||||||
if ok, msg = this.ValidateTheme(targetPath, "", ""); !ok {
|
if ok, msg = this.ValidateTheme(targetPath, "", ""); !ok {
|
||||||
DeleteFile(targetPath)
|
DeleteFile(targetPath)
|
||||||
@@ -517,7 +528,7 @@ func (this *ThemeService) InstallTheme(userId, themeId string) (ok bool) {
|
|||||||
ok = db.Insert(db.Themes, theme)
|
ok = db.Insert(db.Themes, theme)
|
||||||
|
|
||||||
// 激活之
|
// 激活之
|
||||||
this.ActiveTheme(userId, themeId);
|
this.ActiveTheme(userId, themeId)
|
||||||
|
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
@@ -530,10 +541,10 @@ func (this *ThemeService) ValidateTheme(path string, filename, newContent string
|
|||||||
// 建立一个有向图
|
// 建立一个有向图
|
||||||
// 将该path下的所有文件提出, 得到文件的引用情况
|
// 将该path下的所有文件提出, 得到文件的引用情况
|
||||||
files := ListDir(path)
|
files := ListDir(path)
|
||||||
LogJ(files);
|
LogJ(files)
|
||||||
size := len(files)
|
size := len(files)
|
||||||
if(size > 100) {
|
if size > 100 {
|
||||||
ok = false;
|
ok = false
|
||||||
msg = "tooManyFiles"
|
msg = "tooManyFiles"
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@@ -551,7 +562,7 @@ func (this *ThemeService) ValidateTheme(path string, filename, newContent string
|
|||||||
// 得到文件内容, 和建立索引, 每个文件都有一个index, 对应数组位置
|
// 得到文件内容, 和建立索引, 每个文件都有一个index, 对应数组位置
|
||||||
for _, t := range files {
|
for _, t := range files {
|
||||||
if !strings.Contains(t, ".html") {
|
if !strings.Contains(t, ".html") {
|
||||||
continue;
|
continue
|
||||||
}
|
}
|
||||||
if t != filename {
|
if t != filename {
|
||||||
fileBytes, err := ioutil.ReadFile(path + "/" + t)
|
fileBytes, err := ioutil.ReadFile(path + "/" + t)
|
||||||
@@ -559,7 +570,7 @@ func (this *ThemeService) ValidateTheme(path string, filename, newContent string
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
fileIndexMap[t] = index;
|
fileIndexMap[t] = index
|
||||||
// html内容
|
// html内容
|
||||||
fileStr := string(fileBytes)
|
fileStr := string(fileBytes)
|
||||||
fileContent[t] = fileStr
|
fileContent[t] = fileStr
|
||||||
@@ -575,7 +586,7 @@ func (this *ThemeService) ValidateTheme(path string, filename, newContent string
|
|||||||
thisIndex := fileIndexMap[filename]
|
thisIndex := fileIndexMap[filename]
|
||||||
finds := reg.FindAllStringSubmatch(content, -1) // 子匹配
|
finds := reg.FindAllStringSubmatch(content, -1) // 子匹配
|
||||||
LogJ(finds)
|
LogJ(finds)
|
||||||
// Log(content)
|
// Log(content)
|
||||||
if finds != nil && len(finds) > 0 {
|
if finds != nil && len(finds) > 0 {
|
||||||
for _, includes := range finds {
|
for _, includes := range finds {
|
||||||
include := includes[1]
|
include := includes[1]
|
||||||
@@ -599,7 +610,7 @@ func (this *ThemeService) ValidateTheme(path string, filename, newContent string
|
|||||||
} else {
|
} else {
|
||||||
ok = true
|
ok = true
|
||||||
}
|
}
|
||||||
return;
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 检测有向图是否有环, DFS
|
// 检测有向图是否有环, DFS
|
||||||
@@ -607,9 +618,7 @@ func (this *ThemeService) hasRound(vector [][]int, size int) (ok bool) {
|
|||||||
for i := 0; i < size; i++ {
|
for i := 0; i < size; i++ {
|
||||||
visited := make([]int, size)
|
visited := make([]int, size)
|
||||||
if this.hasRoundEach(vector, i, size, visited) {
|
if this.hasRoundEach(vector, i, size, visited) {
|
||||||
Log(">>")
|
return true
|
||||||
Log(i);
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
@@ -618,17 +627,15 @@ func (this *ThemeService) hasRound(vector [][]int, size int) (ok bool) {
|
|||||||
// 从每个节点出发, 判断是否有环
|
// 从每个节点出发, 判断是否有环
|
||||||
func (this *ThemeService) hasRoundEach(vector [][]int, index int, size int, visited []int) (ok bool) {
|
func (this *ThemeService) hasRoundEach(vector [][]int, index int, size int, visited []int) (ok bool) {
|
||||||
if visited[index] > 0 {
|
if visited[index] > 0 {
|
||||||
Log("<")
|
|
||||||
Log(index)
|
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
visited[index] = 1;
|
visited[index] = 1
|
||||||
// 遍历它的孩子
|
// 遍历它的孩子
|
||||||
for i := 0; i < size; i++ {
|
for i := 0; i < size; i++ {
|
||||||
if vector[index][i] > 0 {
|
if vector[index][i] > 0 {
|
||||||
return this.hasRoundEach(vector, i, size, visited);
|
return this.hasRoundEach(vector, i, size, visited)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
visited[index] = 0;
|
visited[index] = 0
|
||||||
return false;
|
return false
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gopkg.in/mgo.v2/bson"
|
|
||||||
"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"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gopkg.in/mgo.v2/bson"
|
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
"github.com/leanote/leanote/app/info"
|
"github.com/leanote/leanote/app/info"
|
||||||
|
"gopkg.in/mgo.v2/bson"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 回收站
|
// 回收站
|
||||||
@@ -25,6 +25,12 @@ type TrashService struct {
|
|||||||
// 应该放在回收站里
|
// 应该放在回收站里
|
||||||
// 有trashService
|
// 有trashService
|
||||||
func (this *TrashService) DeleteNote(noteId, userId string) bool {
|
func (this *TrashService) DeleteNote(noteId, userId string) bool {
|
||||||
|
note := noteService.GetNote(noteId, userId)
|
||||||
|
// 如果是垃圾, 则彻底删除
|
||||||
|
if note.IsTrash {
|
||||||
|
return this.DeleteTrash(noteId, userId)
|
||||||
|
}
|
||||||
|
|
||||||
// 首先删除其共享
|
// 首先删除其共享
|
||||||
if shareService.DeleteShareNoteAll(noteId, userId) {
|
if shareService.DeleteShareNoteAll(noteId, userId) {
|
||||||
// 更新note isTrash = true
|
// 更新note isTrash = true
|
||||||
@@ -36,13 +42,15 @@ func (this *TrashService) DeleteNote(noteId, userId string) bool {
|
|||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除别人共享给我的笔记
|
// 删除别人共享给我的笔记
|
||||||
// 先判断我是否有权限, 笔记是否是我创建的
|
// 先判断我是否有权限, 笔记是否是我创建的
|
||||||
func (this *TrashService) DeleteSharedNote(noteId, userId, myUserId string) bool {
|
func (this *TrashService) DeleteSharedNote(noteId, myUserId string) bool {
|
||||||
note := noteService.GetNote(noteId, userId)
|
note := noteService.GetNoteById(noteId)
|
||||||
|
userId := note.UserId.Hex()
|
||||||
if shareService.HasUpdatePerm(userId, myUserId, noteId) && note.CreatedUserId.Hex() == myUserId {
|
if shareService.HasUpdatePerm(userId, myUserId, noteId) && note.CreatedUserId.Hex() == myUserId {
|
||||||
return db.UpdateByIdAndUserId(db.Notes, noteId, userId, bson.M{"$set": bson.M{"IsTrash": true, "Usn": userService.IncrUsn(userId)}})
|
return db.UpdateByIdAndUserId(db.Notes, noteId, userId, bson.M{"$set": bson.M{"IsTrash": true, "Usn": userService.IncrUsn(userId)}})
|
||||||
}
|
}
|
||||||
@@ -55,12 +63,12 @@ func (this *TrashService) recoverNote(noteId, notebookId, userId string) bool {
|
|||||||
bson.M{"$set": bson.M{"IsTrash": false,
|
bson.M{"$set": bson.M{"IsTrash": false,
|
||||||
"Usn": userService.IncrUsn(userId),
|
"Usn": userService.IncrUsn(userId),
|
||||||
"NotebookId": bson.ObjectIdHex(notebookId)}})
|
"NotebookId": bson.ObjectIdHex(notebookId)}})
|
||||||
return re;
|
return re
|
||||||
}
|
}
|
||||||
|
|
||||||
// 删除trash
|
// 删除trash
|
||||||
func (this *TrashService) DeleteTrash(noteId, userId string) bool {
|
func (this *TrashService) DeleteTrash(noteId, userId string) bool {
|
||||||
note := noteService.GetNote(noteId, userId);
|
note := noteService.GetNote(noteId, userId)
|
||||||
if note.NoteId == "" {
|
if note.NoteId == "" {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@@ -72,11 +80,14 @@ func (this *TrashService) DeleteTrash(noteId, userId string) bool {
|
|||||||
bson.M{"IsDeleted": true,
|
bson.M{"IsDeleted": true,
|
||||||
"Usn": userService.IncrUsn(userId)})
|
"Usn": userService.IncrUsn(userId)})
|
||||||
// delete note
|
// delete note
|
||||||
// ok = db.DeleteByIdAndUserId(db.Notes, noteId, userId)
|
// ok = db.DeleteByIdAndUserId(db.Notes, noteId, userId)
|
||||||
|
|
||||||
// delete content
|
// delete content
|
||||||
ok = db.DeleteByIdAndUserId(db.NoteContents, noteId, userId)
|
ok = db.DeleteByIdAndUserId(db.NoteContents, noteId, userId)
|
||||||
|
|
||||||
|
// 删除content history
|
||||||
|
ok = db.DeleteByIdAndUserId(db.NoteContentHistories, noteId, userId)
|
||||||
|
|
||||||
// 重新统计tag's count
|
// 重新统计tag's count
|
||||||
// TODO 这里会改变tag's Usn
|
// TODO 这里会改变tag's Usn
|
||||||
tagService.reCountTagCount(userId, note.Tags)
|
tagService.reCountTagCount(userId, note.Tags)
|
||||||
@@ -107,6 +118,13 @@ func (this *TrashService) DeleteTrashApi(noteId, userId string, usn int) (bool,
|
|||||||
// delete content
|
// delete content
|
||||||
ok = db.DeleteByIdAndUserId(db.NoteContents, noteId, userId)
|
ok = db.DeleteByIdAndUserId(db.NoteContents, noteId, userId)
|
||||||
|
|
||||||
|
// 删除content history
|
||||||
|
ok = db.DeleteByIdAndUserId(db.NoteContentHistories, noteId, userId)
|
||||||
|
|
||||||
|
// 一个BUG, iOS删除直接调用这个API, 结果没有重新recount
|
||||||
|
// recount notebooks' notes number
|
||||||
|
notebookService.ReCountNotebookNumberNotes(note.NotebookId.Hex())
|
||||||
|
|
||||||
return ok, "", afterUsn
|
return ok, "", afterUsn
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"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"
|
||||||
"github.com/leanote/leanote/app/db"
|
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
type UpgradeService struct {
|
type UpgradeService struct {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,7 +65,7 @@ func (this *UpgradeService) UpgradeBetaToBeta2(userId string) (ok bool, msg stri
|
|||||||
data["RecommendTime"] = note.UpdatedTime
|
data["RecommendTime"] = note.UpdatedTime
|
||||||
Log("Time " + noteId)
|
Log("Time " + noteId)
|
||||||
}
|
}
|
||||||
data["UrlTitle"] = GetUrTitle(note.UserId.Hex(), note.Title, "note")
|
data["UrlTitle"] = GetUrTitle(note.UserId.Hex(), note.Title, "note", noteId)
|
||||||
db.UpdateByIdAndUserIdMap2(db.Notes, note.NoteId, note.UserId, data)
|
db.UpdateByIdAndUserIdMap2(db.Notes, note.NoteId, note.UserId, data)
|
||||||
Log(noteId)
|
Log(noteId)
|
||||||
}
|
}
|
||||||
@@ -78,7 +77,7 @@ func (this *UpgradeService) UpgradeBetaToBeta2(userId string) (ok bool, msg stri
|
|||||||
for _, notebook := range notebooks {
|
for _, notebook := range notebooks {
|
||||||
notebookId := notebook.NotebookId.Hex()
|
notebookId := notebook.NotebookId.Hex()
|
||||||
data := bson.M{}
|
data := bson.M{}
|
||||||
data["UrlTitle"] = GetUrTitle(notebook.UserId.Hex(), notebook.Title, "notebook")
|
data["UrlTitle"] = GetUrTitle(notebook.UserId.Hex(), notebook.Title, "notebook", notebookId)
|
||||||
db.UpdateByIdAndUserIdMap2(db.Notebooks, notebook.NotebookId, notebook.UserId, data)
|
db.UpdateByIdAndUserIdMap2(db.Notebooks, notebook.NotebookId, notebook.UserId, data)
|
||||||
Log(notebookId)
|
Log(notebookId)
|
||||||
}
|
}
|
||||||
@@ -164,17 +163,17 @@ func (this *UpgradeService) Api(userId string) (ok bool, msg string) {
|
|||||||
|
|
||||||
// notebook
|
// notebook
|
||||||
db.UpdateByQField(db.Notebooks, bson.M{}, "IsDeleted", false)
|
db.UpdateByQField(db.Notebooks, bson.M{}, "IsDeleted", false)
|
||||||
this.setNotebookUsn();
|
this.setNotebookUsn()
|
||||||
|
|
||||||
// note
|
// note
|
||||||
// 1-N
|
// 1-N
|
||||||
db.UpdateByQField(db.Notes, bson.M{}, "IsDeleted", false)
|
db.UpdateByQField(db.Notes, bson.M{}, "IsDeleted", false)
|
||||||
this.setNoteUsn();
|
this.setNoteUsn()
|
||||||
|
|
||||||
// tag
|
// tag
|
||||||
// 1-N
|
// 1-N
|
||||||
/// tag, 要重新插入, 将之前的Tag表迁移到NoteTag中
|
/// tag, 要重新插入, 将之前的Tag表迁移到NoteTag中
|
||||||
this.moveTag();
|
this.moveTag()
|
||||||
|
|
||||||
configService.UpdateGlobalStringConfig(userId, "UpgradeBetaToBeta4", "1")
|
configService.UpdateGlobalStringConfig(userId, "UpgradeBetaToBeta4", "1")
|
||||||
|
|
||||||
|
|||||||
+70
-46
@@ -1,12 +1,12 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/leanote/leanote/app/info"
|
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
|
"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"
|
|
||||||
"strings"
|
"strings"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
type UserService struct {
|
type UserService struct {
|
||||||
@@ -23,7 +23,7 @@ func (this *UserService) IncrUsn(userId string) int {
|
|||||||
Log("inc Usn")
|
Log("inc Usn")
|
||||||
db.UpdateByQField(db.Users, query, "Usn", usn)
|
db.UpdateByQField(db.Users, query, "Usn", usn)
|
||||||
return usn
|
return usn
|
||||||
// return db.Update(db.Notes, bson.M{"_id": bson.ObjectIdHex(noteId)}, bson.M{"$inc": bson.M{"ReadNum": 1}})
|
// return db.Update(db.Notes, bson.M{"_id": bson.ObjectIdHex(noteId)}, bson.M{"$inc": bson.M{"ReadNum": 1}})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (this *UserService) GetUsn(userId string) int {
|
func (this *UserService) GetUsn(userId string) int {
|
||||||
@@ -47,8 +47,8 @@ func (this *UserService) AddUser(user info.User) bool {
|
|||||||
go func() {
|
go func() {
|
||||||
emailService.RegisterSendActiveEmail(user, user.Email)
|
emailService.RegisterSendActiveEmail(user, user.Email)
|
||||||
// 发送给我 life@leanote.com
|
// 发送给我 life@leanote.com
|
||||||
emailService.SendEmail("life@leanote.com", "新增用户", "{header}用户名" + user.Email + "{footer}");
|
// emailService.SendEmail("life@leanote.com", "新增用户", "{header}用户名"+user.Email+"{footer}")
|
||||||
}();
|
}()
|
||||||
}
|
}
|
||||||
|
|
||||||
return db.Insert(db.Users, user)
|
return db.Insert(db.Users, user)
|
||||||
@@ -69,6 +69,13 @@ func (this *UserService) GetUsername(userId string) string {
|
|||||||
return user.Username
|
return user.Username
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 得到用户名
|
||||||
|
func (this *UserService) GetUsernameById(userId bson.ObjectId) string {
|
||||||
|
user := info.User{}
|
||||||
|
db.GetByQWithFields(db.Users, bson.M{"_id": userId}, []string{"Username"}, &user)
|
||||||
|
return user.Username
|
||||||
|
}
|
||||||
|
|
||||||
// 是否存在该用户 email
|
// 是否存在该用户 email
|
||||||
func (this *UserService) IsExistsUser(email string) bool {
|
func (this *UserService) IsExistsUser(email string) bool {
|
||||||
if this.GetUserId(email) == "" {
|
if this.GetUserId(email) == "" {
|
||||||
@@ -103,10 +110,17 @@ 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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 仅得到用户
|
||||||
|
func (this *UserService) GetUser(userId string) info.User {
|
||||||
|
user := info.User{}
|
||||||
|
db.Get(db.Users, userId, &user)
|
||||||
|
return user
|
||||||
|
}
|
||||||
|
|
||||||
// 得到用户信息 userId
|
// 得到用户信息 userId
|
||||||
func (this *UserService) GetUserInfo(userId string) info.User {
|
func (this *UserService) GetUserInfo(userId string) info.User {
|
||||||
user := info.User{}
|
user := info.User{}
|
||||||
@@ -115,6 +129,7 @@ func (this *UserService) GetUserInfo(userId string) info.User {
|
|||||||
this.setUserLogo(&user)
|
this.setUserLogo(&user)
|
||||||
return user
|
return user
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到用户信息 email
|
// 得到用户信息 email
|
||||||
func (this *UserService) GetUserInfoByEmail(email string) info.User {
|
func (this *UserService) GetUserInfoByEmail(email string) info.User {
|
||||||
user := info.User{}
|
user := info.User{}
|
||||||
@@ -123,6 +138,7 @@ func (this *UserService) GetUserInfoByEmail(email string) info.User {
|
|||||||
this.setUserLogo(&user)
|
this.setUserLogo(&user)
|
||||||
return user
|
return user
|
||||||
}
|
}
|
||||||
|
|
||||||
// 得到用户信息 username
|
// 得到用户信息 username
|
||||||
func (this *UserService) GetUserInfoByUsername(username string) info.User {
|
func (this *UserService) GetUserInfoByUsername(username string) info.User {
|
||||||
user := info.User{}
|
user := info.User{}
|
||||||
@@ -149,6 +165,7 @@ func (this *UserService) ListUserInfosByEmails(emails []string) []info.User {
|
|||||||
db.ListByQ(db.Users, bson.M{"Email": bson.M{"$in": emails}}, &users)
|
db.ListByQ(db.Users, bson.M{"Email": bson.M{"$in": emails}}, &users)
|
||||||
return users
|
return users
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户信息即可
|
// 用户信息即可
|
||||||
func (this *UserService) MapUserInfoByUserIds(userIds []bson.ObjectId) map[bson.ObjectId]info.User {
|
func (this *UserService) MapUserInfoByUserIds(userIds []bson.ObjectId) map[bson.ObjectId]info.User {
|
||||||
users := []info.User{}
|
users := []info.User{}
|
||||||
@@ -161,6 +178,7 @@ func (this *UserService) MapUserInfoByUserIds(userIds []bson.ObjectId) map[bson.
|
|||||||
}
|
}
|
||||||
return userMap
|
return userMap
|
||||||
}
|
}
|
||||||
|
|
||||||
// 用户信息和博客设置信息
|
// 用户信息和博客设置信息
|
||||||
func (this *UserService) MapUserInfoAndBlogInfosByUserIds(userIds []bson.ObjectId) map[bson.ObjectId]info.User {
|
func (this *UserService) MapUserInfoAndBlogInfosByUserIds(userIds []bson.ObjectId) map[bson.ObjectId]info.User {
|
||||||
return this.MapUserInfoByUserIds(userIds)
|
return this.MapUserInfoByUserIds(userIds)
|
||||||
@@ -202,6 +220,20 @@ func (this *UserService) MapUserAndBlogByUserIds(userIds []bson.ObjectId) map[st
|
|||||||
return userAndBlogMap
|
return userAndBlogMap
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 得到用户信息+博客主页
|
||||||
|
func (this *UserService) GetUserAndBlogUrl(userId string) info.UserAndBlogUrl {
|
||||||
|
user := this.GetUserInfo(userId)
|
||||||
|
userBlog := blogService.GetUserBlog(userId)
|
||||||
|
|
||||||
|
blogUrls := blogService.GetBlogUrls(&userBlog, &user)
|
||||||
|
|
||||||
|
return info.UserAndBlogUrl{
|
||||||
|
User: user,
|
||||||
|
BlogUrl: blogUrls.IndexUrl,
|
||||||
|
PostUrl: blogUrls.PostUrl,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 得到userAndBlog公开信息
|
// 得到userAndBlog公开信息
|
||||||
func (this *UserService) GetUserAndBlog(userId string) info.UserAndBlog {
|
func (this *UserService) GetUserAndBlog(userId string) info.UserAndBlog {
|
||||||
user := this.GetUserInfo(userId)
|
user := this.GetUserInfo(userId)
|
||||||
@@ -221,7 +253,7 @@ func (this *UserService) GetUserAndBlog(userId string) info.UserAndBlog {
|
|||||||
// 通过ids得到users, 按id的顺序组织users
|
// 通过ids得到users, 按id的顺序组织users
|
||||||
func (this *UserService) GetUserInfosOrderBySeq(userIds []bson.ObjectId) []info.User {
|
func (this *UserService) GetUserInfosOrderBySeq(userIds []bson.ObjectId) []info.User {
|
||||||
users := []info.User{}
|
users := []info.User{}
|
||||||
db.ListByQ(db.Users, bson.M{"_id": bson.M{"$in": userIds}}, &users);
|
db.ListByQ(db.Users, bson.M{"_id": bson.M{"$in": userIds}}, &users)
|
||||||
|
|
||||||
usersMap := map[bson.ObjectId]info.User{}
|
usersMap := map[bson.ObjectId]info.User{}
|
||||||
for _, user := range users {
|
for _, user := range users {
|
||||||
@@ -229,7 +261,7 @@ func (this *UserService) GetUserInfosOrderBySeq(userIds []bson.ObjectId) []info.
|
|||||||
}
|
}
|
||||||
|
|
||||||
hasAppend := map[bson.ObjectId]bool{} // 为了防止userIds有重复的
|
hasAppend := map[bson.ObjectId]bool{} // 为了防止userIds有重复的
|
||||||
users2 := []info.User{};
|
users2 := []info.User{}
|
||||||
for _, userId := range userIds {
|
for _, userId := range userIds {
|
||||||
if user, ok := usersMap[userId]; ok && !hasAppend[userId] {
|
if user, ok := usersMap[userId]; ok && !hasAppend[userId] {
|
||||||
hasAppend[userId] = true
|
hasAppend[userId] = true
|
||||||
@@ -239,15 +271,15 @@ func (this *UserService) GetUserInfosOrderBySeq(userIds []bson.ObjectId) []info.
|
|||||||
return users2
|
return users2
|
||||||
}
|
}
|
||||||
|
|
||||||
// 使用email(username), pwd得到用户信息
|
// 使用email(username), 得到用户信息
|
||||||
func (this *UserService) LoginGetUserInfo(emailOrUsername, md5Pwd string) info.User {
|
func (this *UserService) GetUserInfoByName(emailOrUsername string) info.User {
|
||||||
emailOrUsername = strings.ToLower(emailOrUsername)
|
emailOrUsername = strings.ToLower(emailOrUsername)
|
||||||
|
|
||||||
user := info.User{}
|
user := info.User{}
|
||||||
if strings.Contains(emailOrUsername, "@") {
|
if strings.Contains(emailOrUsername, "@") {
|
||||||
db.GetByQ(db.Users, bson.M{"Email": emailOrUsername, "Pwd": md5Pwd}, &user)
|
db.GetByQ(db.Users, bson.M{"Email": emailOrUsername}, &user)
|
||||||
} else {
|
} else {
|
||||||
db.GetByQ(db.Users, bson.M{"Username": emailOrUsername, "Pwd": md5Pwd}, &user)
|
db.GetByQ(db.Users, bson.M{"Username": emailOrUsername}, &user)
|
||||||
}
|
}
|
||||||
this.setUserLogo(&user)
|
this.setUserLogo(&user)
|
||||||
return user
|
return user
|
||||||
@@ -272,7 +304,7 @@ func (this *UserService) UpdateUsername(userId, username string) (bool, string)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 修改头像
|
// 修改头像
|
||||||
func (this *UserService) UpdateAvatar(userId, avatarPath string) (bool) {
|
func (this *UserService) UpdateAvatar(userId, avatarPath string) bool {
|
||||||
userIdO := bson.ObjectIdHex(userId)
|
userIdO := bson.ObjectIdHex(userId)
|
||||||
return db.UpdateByQField(db.Users, bson.M{"_id": userIdO}, "Logo", avatarPath)
|
return db.UpdateByQField(db.Users, bson.M{"_id": userIdO}, "Logo", avatarPath)
|
||||||
}
|
}
|
||||||
@@ -281,10 +313,16 @@ func (this *UserService) UpdateAvatar(userId, avatarPath string) (bool) {
|
|||||||
// 已经登录了的用户修改密码
|
// 已经登录了的用户修改密码
|
||||||
func (this *UserService) UpdatePwd(userId, oldPwd, pwd string) (bool, string) {
|
func (this *UserService) UpdatePwd(userId, oldPwd, pwd string) (bool, string) {
|
||||||
userInfo := this.GetUserInfo(userId)
|
userInfo := this.GetUserInfo(userId)
|
||||||
if userInfo.Pwd != Md5(oldPwd) {
|
if !ComparePwd(oldPwd, userInfo.Pwd) {
|
||||||
return false, "oldPasswordError"
|
return false, "oldPasswordError"
|
||||||
}
|
}
|
||||||
ok := db.UpdateByQField(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)}, "Pwd", Md5(pwd))
|
|
||||||
|
passwd := GenPwd(pwd)
|
||||||
|
if passwd == "" {
|
||||||
|
return false, "GenerateHash error"
|
||||||
|
}
|
||||||
|
|
||||||
|
ok := db.UpdateByQField(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)}, "Pwd", passwd)
|
||||||
return ok, ""
|
return ok, ""
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -293,12 +331,17 @@ func (this *UserService) ResetPwd(adminUserId, userId, pwd string) (ok bool, msg
|
|||||||
if configService.GetAdminUserId() != adminUserId {
|
if configService.GetAdminUserId() != adminUserId {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
ok = db.UpdateByQField(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)}, "Pwd", Md5(pwd))
|
|
||||||
|
passwd := GenPwd(pwd)
|
||||||
|
if passwd == "" {
|
||||||
|
return false, "GenerateHash error"
|
||||||
|
}
|
||||||
|
ok = db.UpdateByQField(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)}, "Pwd", passwd)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// 修改主题
|
// 修改主题
|
||||||
func (this *UserService) UpdateTheme(userId, theme string) (bool) {
|
func (this *UserService) UpdateTheme(userId, theme string) bool {
|
||||||
ok := db.UpdateByQField(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)}, "Theme", theme)
|
ok := db.UpdateByQField(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)}, "Theme", theme)
|
||||||
return ok
|
return ok
|
||||||
}
|
}
|
||||||
@@ -351,7 +394,7 @@ func (this *UserService) UpdateEmail(token string) (ok bool, msg, email string)
|
|||||||
tokenInfo := info.Token{}
|
tokenInfo := info.Token{}
|
||||||
if ok, msg, tokenInfo = tokenService.VerifyToken(token, info.TokenUpdateEmail); ok {
|
if ok, msg, tokenInfo = tokenService.VerifyToken(token, info.TokenUpdateEmail); ok {
|
||||||
// 修改之后的邮箱
|
// 修改之后的邮箱
|
||||||
email = tokenInfo.Email
|
email = strings.ToLower(tokenInfo.Email)
|
||||||
// 先验证该email是否被注册了
|
// 先验证该email是否被注册了
|
||||||
if userService.IsExistsUser(email) {
|
if userService.IsExistsUser(email) {
|
||||||
ok = false
|
ok = false
|
||||||
@@ -369,36 +412,17 @@ func (this *UserService) UpdateEmail(token string) (ok bool, msg, email string)
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------
|
|
||||||
// 第三方添加账号
|
|
||||||
func (this *UserService) ThirdAddUser(userId, email, pwd string) (ok bool, msg string) {
|
|
||||||
// 判断该用户是否已有了帐户
|
|
||||||
userInfo := this.GetUserInfo(userId)
|
|
||||||
if userInfo.Email != "" {
|
|
||||||
msg = "你已有帐户"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// 判断email是否存在
|
|
||||||
if this.IsExistsUser(email) {
|
|
||||||
msg = "该用户已存在"
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
ok = db.UpdateByQMap(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)}, bson.M{"Email": email, "Pwd": Md5(pwd)})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//------------
|
//------------
|
||||||
// 偏好设置
|
// 偏好设置
|
||||||
|
|
||||||
// 宽度
|
// 宽度
|
||||||
func (this *UserService)UpdateColumnWidth(userId string, notebookWidth, noteListWidth, mdEditorWidth int) bool {
|
func (this *UserService) UpdateColumnWidth(userId string, notebookWidth, noteListWidth, mdEditorWidth int) bool {
|
||||||
return db.UpdateByQMap(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)},
|
return db.UpdateByQMap(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)},
|
||||||
bson.M{"NotebookWidth": notebookWidth, "NoteListWidth": noteListWidth, "MdEditorWidth": mdEditorWidth})
|
bson.M{"NotebookWidth": notebookWidth, "NoteListWidth": noteListWidth, "MdEditorWidth": mdEditorWidth})
|
||||||
}
|
}
|
||||||
|
|
||||||
// 左侧是否隐藏
|
// 左侧是否隐藏
|
||||||
func (this *UserService)UpdateLeftIsMin(userId string, leftIsMin bool) bool {
|
func (this *UserService) UpdateLeftIsMin(userId string, leftIsMin bool) bool {
|
||||||
return db.UpdateByQMap(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)}, bson.M{"LeftIsMin": leftIsMin})
|
return db.UpdateByQMap(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)}, bson.M{"LeftIsMin": leftIsMin})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -415,7 +439,7 @@ func (this *UserService) ListUsers(pageNumber, pageSize int, sortField string, i
|
|||||||
}
|
}
|
||||||
query["$or"] = orQ
|
query["$or"] = orQ
|
||||||
}
|
}
|
||||||
q := db.Users.Find(query);
|
q := db.Users.Find(query)
|
||||||
// 总记录数
|
// 总记录数
|
||||||
count, _ := q.Count()
|
count, _ := q.Count()
|
||||||
// 列表
|
// 列表
|
||||||
@@ -440,9 +464,9 @@ func (this *UserService) GetAllUserByFilter(userFilterEmail, userFilterWhiteList
|
|||||||
bson.M{"Username": bson.M{"$regex": bson.RegEx{".*?" + userFilterEmail + ".*", "i"}}},
|
bson.M{"Username": bson.M{"$regex": bson.RegEx{".*?" + userFilterEmail + ".*", "i"}}},
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
if(userFilterWhiteList != "") {
|
if userFilterWhiteList != "" {
|
||||||
userFilterWhiteList = strings.Replace(userFilterWhiteList, "\r", "", -1)
|
userFilterWhiteList = strings.Replace(userFilterWhiteList, "\r", "", -1)
|
||||||
emails := strings.Split(userFilterWhiteList, "\n");
|
emails := strings.Split(userFilterWhiteList, "\n")
|
||||||
orQ = append(orQ, bson.M{"Email": bson.M{"$in": emails}})
|
orQ = append(orQ, bson.M{"Email": bson.M{"$in": emails}})
|
||||||
}
|
}
|
||||||
if len(orQ) > 0 {
|
if len(orQ) > 0 {
|
||||||
@@ -450,16 +474,16 @@ func (this *UserService) GetAllUserByFilter(userFilterEmail, userFilterWhiteList
|
|||||||
}
|
}
|
||||||
|
|
||||||
emailQ := bson.M{}
|
emailQ := bson.M{}
|
||||||
if(userFilterBlackList != "") {
|
if userFilterBlackList != "" {
|
||||||
userFilterWhiteList = strings.Replace(userFilterBlackList, "\r", "", -1)
|
userFilterWhiteList = strings.Replace(userFilterBlackList, "\r", "", -1)
|
||||||
bEmails := strings.Split(userFilterBlackList, "\n");
|
bEmails := strings.Split(userFilterBlackList, "\n")
|
||||||
emailQ["$nin"] = bEmails
|
emailQ["$nin"] = bEmails
|
||||||
query["Email"] = emailQ
|
query["Email"] = emailQ
|
||||||
}
|
}
|
||||||
|
|
||||||
LogJ(query)
|
LogJ(query)
|
||||||
users := []info.User{}
|
users := []info.User{}
|
||||||
q := db.Users.Find(query);
|
q := db.Users.Find(query)
|
||||||
q.All(&users)
|
q.All(&users)
|
||||||
Log(len(users))
|
Log(len(users))
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import ()
|
||||||
)
|
|
||||||
|
|
||||||
// service 通用方法
|
// service 通用方法
|
||||||
|
|
||||||
|
|||||||
+36
-8
@@ -1,13 +1,14 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"regexp"
|
|
||||||
"strings"
|
|
||||||
"net/url"
|
|
||||||
"strconv"
|
|
||||||
"gopkg.in/mgo.v2"
|
|
||||||
"github.com/leanote/leanote/app/db"
|
"github.com/leanote/leanote/app/db"
|
||||||
|
. "github.com/leanote/leanote/app/lea"
|
||||||
|
"gopkg.in/mgo.v2"
|
||||||
"gopkg.in/mgo.v2/bson"
|
"gopkg.in/mgo.v2/bson"
|
||||||
|
"net/url"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// init service, for share service bettween services
|
// init service, for share service bettween services
|
||||||
@@ -99,16 +100,17 @@ func encodeValue(val string) string {
|
|||||||
v.Set("", val)
|
v.Set("", val)
|
||||||
return v.Encode()[1:]
|
return v.Encode()[1:]
|
||||||
}
|
}
|
||||||
|
|
||||||
// 添加笔记时通过title得到urlTitle
|
// 添加笔记时通过title得到urlTitle
|
||||||
func fixUrlTitle(urlTitle string) string {
|
func fixUrlTitle(urlTitle string) string {
|
||||||
if urlTitle != "" {
|
if urlTitle != "" {
|
||||||
// 把特殊字段给替换掉
|
// 把特殊字段给替换掉
|
||||||
// str := `life "%&()+,/:;<>=?@\|`
|
// str := `life "%&()+,/:;<>=?@\|`
|
||||||
reg, _ := regexp.Compile("/|#|\\$|!|\\^|\\*|'| |\"|%|&|\\(|\\)|\\+|\\,|/|:|;|<|>|=|\\?|@|\\||\\\\")
|
reg, _ := regexp.Compile("/|#|\\$|!|\\^|\\*|'| |\"|%|&|\\(|\\)|\\+|\\,|/|:|;|<|>|=|\\?|@|\\||\\\\")
|
||||||
urlTitle = reg.ReplaceAllString(urlTitle, "-")
|
urlTitle = reg.ReplaceAllString(urlTitle, "-")
|
||||||
urlTitle = strings.Trim(urlTitle, "-") // 左右单独的-去掉
|
urlTitle = strings.Trim(urlTitle, "-") // 左右单独的-去掉
|
||||||
// 把空格替换成-
|
// 把空格替换成-
|
||||||
// urlTitle = strings.Replace(urlTitle, " ", "-", -1)
|
// urlTitle = strings.Replace(urlTitle, " ", "-", -1)
|
||||||
for strings.Index(urlTitle, "--") >= 0 { // 防止出现连续的--
|
for strings.Index(urlTitle, "--") >= 0 { // 防止出现连续的--
|
||||||
urlTitle = strings.Replace(urlTitle, "--", "-", -1)
|
urlTitle = strings.Replace(urlTitle, "--", "-", -1)
|
||||||
}
|
}
|
||||||
@@ -119,6 +121,15 @@ func fixUrlTitle(urlTitle string) string {
|
|||||||
|
|
||||||
func getUniqueUrlTitle(userId string, urlTitle string, types string, padding int) string {
|
func getUniqueUrlTitle(userId string, urlTitle string, types string, padding int) string {
|
||||||
urlTitle2 := urlTitle
|
urlTitle2 := urlTitle
|
||||||
|
|
||||||
|
// 判断urlTitle是不是过长, 过长则截断, 300
|
||||||
|
// 不然生成index有问题
|
||||||
|
// it will not index a single field with more than 1024 bytes.
|
||||||
|
// If you're indexing a field that is 2.5MB, it's not really indexing it, it's being skipped.
|
||||||
|
if len(urlTitle2) > 320 {
|
||||||
|
urlTitle2 = urlTitle2[:300] // 为什么要少些, 因为怕无限循环, 因为把padding截了
|
||||||
|
}
|
||||||
|
|
||||||
if padding > 1 {
|
if padding > 1 {
|
||||||
urlTitle2 = urlTitle + "-" + strconv.Itoa(padding)
|
urlTitle2 = urlTitle + "-" + strconv.Itoa(padding)
|
||||||
}
|
}
|
||||||
@@ -139,12 +150,29 @@ func getUniqueUrlTitle(userId string, urlTitle string, types string, padding int
|
|||||||
|
|
||||||
return urlTitle2
|
return urlTitle2
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 截取id 24位变成12位
|
||||||
|
// 先md5, 再取12位
|
||||||
|
func subIdHalf(id string) string {
|
||||||
|
idMd5 := Md5(id)
|
||||||
|
return idMd5[:12]
|
||||||
|
}
|
||||||
|
|
||||||
// types == note,notebook,single
|
// types == note,notebook,single
|
||||||
func GetUrTitle(userId string, title string, types string) string {
|
// id noteId, notebookId, singleId 当title没的时候才有用, 用它来替换
|
||||||
|
func GetUrTitle(userId string, title string, types string, id string) string {
|
||||||
urlTitle := strings.Trim(title, " ")
|
urlTitle := strings.Trim(title, " ")
|
||||||
if urlTitle == "" {
|
if urlTitle == "" {
|
||||||
|
if id == "" {
|
||||||
urlTitle = "Untitled-" + userId
|
urlTitle = "Untitled-" + userId
|
||||||
|
} else {
|
||||||
|
urlTitle = subIdHalf(id)
|
||||||
}
|
}
|
||||||
|
// 不允许title是ObjectId
|
||||||
|
} else if bson.IsObjectIdHex(title) {
|
||||||
|
urlTitle = subIdHalf(id)
|
||||||
|
}
|
||||||
|
|
||||||
urlTitle = fixUrlTitle(urlTitle)
|
urlTitle = fixUrlTitle(urlTitle)
|
||||||
return getUniqueUrlTitle(userId, urlTitle, types, 1)
|
return getUniqueUrlTitle(userId, urlTitle, types, 1)
|
||||||
}
|
}
|
||||||
Loaded 100 of 1354 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user