2014-05-07 13:06:24 +08:00
|
|
|
package service
|
|
|
|
|
|
|
|
import (
|
2014-09-12 15:39:28 +08:00
|
|
|
"github.com/revel/revel"
|
2014-05-07 13:06:24 +08:00
|
|
|
"github.com/leanote/leanote/app/info"
|
|
|
|
"github.com/leanote/leanote/app/db"
|
|
|
|
. "github.com/leanote/leanote/app/lea"
|
2014-09-02 15:45:44 +08:00
|
|
|
"gopkg.in/mgo.v2/bson"
|
2014-05-07 13:06:24 +08:00
|
|
|
"time"
|
|
|
|
"strings"
|
|
|
|
"fmt"
|
|
|
|
)
|
|
|
|
|
|
|
|
type UserService struct {
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// 添加用户
|
|
|
|
func (this *UserService) AddUser(user info.User) bool {
|
|
|
|
if user.UserId == "" {
|
|
|
|
user.UserId = bson.NewObjectId()
|
|
|
|
}
|
|
|
|
user.CreatedTime = time.Now()
|
|
|
|
|
|
|
|
if user.Email != "" {
|
|
|
|
user.Email = strings.ToLower(user.Email)
|
|
|
|
|
|
|
|
// 发送验证邮箱
|
|
|
|
go func() {
|
|
|
|
this.RegisterSendActiveEmail(user.UserId.Hex(), user.Email)
|
|
|
|
}();
|
|
|
|
}
|
|
|
|
|
|
|
|
return db.Insert(db.Users, user)
|
|
|
|
}
|
|
|
|
|
|
|
|
// 通过email得到userId
|
|
|
|
func (this *UserService) GetUserId(email string) string {
|
|
|
|
email = strings.ToLower(email)
|
|
|
|
user := info.User{}
|
|
|
|
db.GetByQ(db.Users, bson.M{"Email": email}, &user)
|
|
|
|
return user.UserId.Hex()
|
|
|
|
}
|
|
|
|
|
|
|
|
// 是否存在该用户 email
|
|
|
|
func (this *UserService) IsExistsUser(email string) bool {
|
|
|
|
if this.GetUserId(email) == "" {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
// 是否存在该用户 username
|
|
|
|
func (this *UserService) IsExistsUserByUsername(username string) bool {
|
|
|
|
return db.Count(db.Users, bson.M{"Username": username}) >= 1
|
|
|
|
}
|
|
|
|
|
|
|
|
// 得到用户信息, userId, username, email
|
|
|
|
func (this *UserService) GetUserInfoByAny(idEmailUsername string) info.User {
|
|
|
|
if IsObjectId(idEmailUsername) {
|
|
|
|
return this.GetUserInfo(idEmailUsername)
|
|
|
|
}
|
|
|
|
|
|
|
|
if strings.Contains(idEmailUsername, "@") {
|
|
|
|
return this.GetUserInfoByEmail(idEmailUsername)
|
|
|
|
}
|
|
|
|
|
2014-09-15 19:37:24 +08:00
|
|
|
// username
|
2014-05-07 13:06:24 +08:00
|
|
|
return this.GetUserInfoByUsername(idEmailUsername)
|
|
|
|
}
|
|
|
|
|
|
|
|
// 得到用户信息 userId
|
|
|
|
func (this *UserService) GetUserInfo(userId string) info.User {
|
|
|
|
user := info.User{}
|
|
|
|
db.Get(db.Users, userId, &user)
|
|
|
|
return user
|
|
|
|
}
|
|
|
|
// 得到用户信息 email
|
|
|
|
func (this *UserService) GetUserInfoByEmail(email string) info.User {
|
|
|
|
user := info.User{}
|
|
|
|
db.GetByQ(db.Users, bson.M{"Email": email}, &user)
|
|
|
|
return user
|
|
|
|
}
|
|
|
|
// 得到用户信息 username
|
|
|
|
func (this *UserService) GetUserInfoByUsername(username string) info.User {
|
|
|
|
user := info.User{}
|
2014-09-15 19:37:24 +08:00
|
|
|
username = strings.ToLower(username)
|
2014-05-07 13:06:24 +08:00
|
|
|
db.GetByQ(db.Users, bson.M{"Username": username}, &user)
|
|
|
|
return user
|
|
|
|
}
|
|
|
|
|
|
|
|
func (this *UserService) GetUserInfoByThirdUserId(thirdUserId string) info.User {
|
|
|
|
user := info.User{}
|
|
|
|
db.GetByQ(db.Users, bson.M{"ThirdUserId": thirdUserId}, &user)
|
|
|
|
return user
|
|
|
|
}
|
|
|
|
func (this *UserService) ListUserInfosByUserIds(userIds []bson.ObjectId) []info.User {
|
|
|
|
users := []info.User{}
|
|
|
|
db.ListByQ(db.Users, bson.M{"_id": bson.M{"$in": userIds}}, &users)
|
|
|
|
return users
|
|
|
|
}
|
2014-09-24 22:24:52 +08:00
|
|
|
// 用户信息和博客设置信息
|
|
|
|
func (this *UserService) MapUserInfoAndBlogInfosByUserIds(userIds []bson.ObjectId) map[bson.ObjectId]info.User {
|
|
|
|
users := []info.User{}
|
|
|
|
db.ListByQ(db.Users, bson.M{"_id": bson.M{"$in": userIds}}, &users)
|
|
|
|
|
|
|
|
userBlogs := []info.UserBlog{}
|
|
|
|
db.ListByQWithFields(db.UserBlogs, bson.M{"_id": bson.M{"$in": userIds}}, []string{"Logo"}, &userBlogs)
|
|
|
|
|
|
|
|
userBlogMap := make(map[bson.ObjectId]info.UserBlog, len(userBlogs))
|
|
|
|
for _, user := range userBlogs {
|
|
|
|
userBlogMap[user.UserId] = user
|
|
|
|
}
|
|
|
|
|
|
|
|
userMap := make(map[bson.ObjectId]info.User, len(users))
|
|
|
|
for _, user := range users {
|
|
|
|
if userBlog, ok := userBlogMap[user.UserId]; ok {
|
|
|
|
user.Logo = userBlog.Logo
|
|
|
|
}
|
|
|
|
userMap[user.UserId] = user
|
|
|
|
}
|
|
|
|
|
|
|
|
return userMap
|
|
|
|
}
|
2014-05-07 13:06:24 +08:00
|
|
|
|
|
|
|
// 通过ids得到users, 按id的顺序组织users
|
|
|
|
func (this *UserService) GetUserInfosOrderBySeq(userIds []bson.ObjectId) []info.User {
|
|
|
|
users := []info.User{}
|
|
|
|
db.ListByQ(db.Users, bson.M{"_id": bson.M{"$in": userIds}}, &users);
|
|
|
|
|
|
|
|
usersMap := map[bson.ObjectId]info.User{}
|
|
|
|
for _, user := range users {
|
|
|
|
usersMap[user.UserId] = user
|
|
|
|
}
|
|
|
|
|
|
|
|
users2 := []info.User{};
|
|
|
|
for _, userId := range userIds {
|
|
|
|
if user, ok := usersMap[userId]; ok {
|
|
|
|
users2 = append(users2, user)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return users2
|
|
|
|
}
|
|
|
|
|
|
|
|
// 使用email(username), pwd得到用户信息
|
|
|
|
func (this *UserService) LoginGetUserInfo(emailOrUsername, md5Pwd string) info.User {
|
|
|
|
emailOrUsername = strings.ToLower(emailOrUsername)
|
|
|
|
|
|
|
|
user := info.User{}
|
|
|
|
if strings.Contains(emailOrUsername, "@") {
|
|
|
|
db.GetByQ(db.Users, bson.M{"Email": emailOrUsername, "Pwd": md5Pwd}, &user)
|
|
|
|
} else {
|
|
|
|
db.GetByQ(db.Users, bson.M{"Username": emailOrUsername, "Pwd": md5Pwd}, &user)
|
|
|
|
}
|
|
|
|
|
|
|
|
return user
|
|
|
|
}
|
|
|
|
|
|
|
|
// 更新username
|
|
|
|
func (this *UserService) UpdateUsername(userId, username string) (bool, string) {
|
2014-09-24 22:24:52 +08:00
|
|
|
if userId == "" || username == "" || username == "admin" { // admin用户是内置的, 不能设置
|
2014-05-07 13:06:24 +08:00
|
|
|
return false, "用户已存在"
|
|
|
|
}
|
|
|
|
usernameRaw := username // 原先的, 可能是同一个, 但有大小写
|
|
|
|
username = strings.ToLower(username)
|
|
|
|
|
|
|
|
// 先判断是否存在
|
|
|
|
userIdO := bson.ObjectIdHex(userId)
|
|
|
|
if db.Has(db.Users, bson.M{"Username": username, "_id": bson.M{"$ne": userIdO}}) {
|
|
|
|
return false, "用户已存在"
|
|
|
|
}
|
|
|
|
|
|
|
|
ok := db.UpdateByQMap(db.Users, bson.M{"_id": userIdO}, bson.M{"Username": username, "UsernameRaw": usernameRaw})
|
|
|
|
return ok, ""
|
|
|
|
}
|
|
|
|
|
|
|
|
//----------------------
|
|
|
|
// 已经登录了的用户修改密码
|
|
|
|
func (this *UserService) UpdatePwd(userId, oldPwd, pwd string) (bool, string) {
|
|
|
|
userInfo := this.GetUserInfo(userId)
|
|
|
|
if userInfo.Pwd != Md5(oldPwd) {
|
|
|
|
return false, "旧密码错误"
|
|
|
|
}
|
|
|
|
ok := db.UpdateByQField(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)}, "Pwd", Md5(pwd))
|
|
|
|
return ok, ""
|
|
|
|
}
|
|
|
|
|
|
|
|
// 修改主题
|
|
|
|
func (this *UserService) UpdateTheme(userId, theme string) (bool) {
|
|
|
|
ok := db.UpdateByQField(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)}, "Theme", theme)
|
|
|
|
return ok
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------------
|
|
|
|
// 修改email
|
|
|
|
|
|
|
|
// 发送激活邮件
|
|
|
|
|
|
|
|
// AddUser调用
|
|
|
|
// 可以使用一个goroutine
|
|
|
|
func (this *UserService) RegisterSendActiveEmail(userId string, email string) bool {
|
|
|
|
token := tokenService.NewToken(userId, email, info.TokenActiveEmail)
|
|
|
|
|
|
|
|
if token == "" {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
// 发送邮件
|
2014-09-12 15:39:28 +08:00
|
|
|
siteUrl, _ := revel.Config.String("site.url")
|
|
|
|
url := siteUrl + "/user/activeEmail?token=" + token
|
2014-05-07 13:06:24 +08:00
|
|
|
body := fmt.Sprintf("请点击链接验证邮箱: <a href='%v'>%v</a>. %v小时后过期.", url, url, tokenService.GetOverHours(info.TokenActiveEmail));
|
|
|
|
if !SendEmail(email, "leanote-验证邮箱", "验证邮箱", body) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
// 发送给我 life@leanote.com
|
|
|
|
SendEmail("life@leanote.com", "新增用户", "新增用户", "用户名" + email);
|
|
|
|
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
|
|
|
// 修改邮箱
|
|
|
|
func (this *UserService) UpdateEmailSendActiveEmail(userId, email string) (ok bool, msg string) {
|
|
|
|
// 先验证该email是否被注册了
|
|
|
|
if userService.IsExistsUser(email) {
|
|
|
|
ok = false
|
|
|
|
msg = "该邮箱已注册"
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
token := tokenService.NewToken(userId, email, info.TokenUpdateEmail)
|
|
|
|
|
|
|
|
if token == "" {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// 发送邮件
|
2014-09-12 15:39:28 +08:00
|
|
|
siteUrl, _ := revel.Config.String("site.url")
|
|
|
|
url := siteUrl + "/user/updateEmail?token=" + token
|
2014-05-07 13:06:24 +08:00
|
|
|
body := "邮箱验证后您的登录邮箱为: <b>" + email + "</b><br />";
|
|
|
|
body += fmt.Sprintf("请点击链接验证邮箱: <a href='%v'>%v</a>. %v小时后过期.", url, url, tokenService.GetOverHours(info.TokenUpdateEmail));
|
|
|
|
if !SendEmail(email, "leanote-验证邮箱", "验证邮箱", body) {
|
2014-05-27 11:37:03 +08:00
|
|
|
msg = "发送失败, 该邮箱存在?"
|
2014-05-07 13:06:24 +08:00
|
|
|
return
|
|
|
|
}
|
|
|
|
ok = true
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// 注册后验证邮箱
|
|
|
|
func (this *UserService) ActiveEmail(token string) (ok bool, msg, email string) {
|
|
|
|
tokenInfo := info.Token{}
|
|
|
|
if ok, msg, tokenInfo = tokenService.VerifyToken(token, info.TokenActiveEmail); ok {
|
|
|
|
// 修改之后的邮箱
|
|
|
|
email = tokenInfo.Email
|
|
|
|
userInfo := this.GetUserInfoByEmail(email)
|
|
|
|
if userInfo.UserId == "" {
|
|
|
|
ok = false
|
|
|
|
msg = "不存在该用户"
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// 修改之, 并将verified = true
|
|
|
|
ok = db.UpdateByQMap(db.Users, bson.M{"_id": userInfo.UserId}, bson.M{"Verified": true})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
ok = false
|
|
|
|
msg = "该链接已过期"
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// 修改邮箱
|
|
|
|
// 在此之前, 验证token是否过期
|
|
|
|
// 验证email是否有人注册了
|
|
|
|
func (this *UserService) UpdateEmail(token string) (ok bool, msg, email string) {
|
|
|
|
tokenInfo := info.Token{}
|
|
|
|
if ok, msg, tokenInfo = tokenService.VerifyToken(token, info.TokenUpdateEmail); ok {
|
|
|
|
// 修改之后的邮箱
|
|
|
|
email = tokenInfo.Email
|
|
|
|
// 先验证该email是否被注册了
|
|
|
|
if userService.IsExistsUser(email) {
|
|
|
|
ok = false
|
|
|
|
msg = "该邮箱已注册"
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// 修改之, 并将verified = true
|
|
|
|
ok = db.UpdateByQMap(db.Users, bson.M{"_id": tokenInfo.UserId}, bson.M{"Email": email, "Verified": true})
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
ok = false
|
|
|
|
msg = "该链接已过期"
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
//---------
|
|
|
|
// 第三方添加账号
|
|
|
|
func (this *UserService) ThirdAddUser(userId, email, pwd string) (ok bool, msg string) {
|
|
|
|
// 判断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 int) bool {
|
|
|
|
return db.UpdateByQMap(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)}, bson.M{"NotebookWidth": notebookWidth, "NoteListWidth": noteListWidth})
|
|
|
|
}
|
|
|
|
// 左侧是否隐藏
|
|
|
|
func (this *UserService)UpdateLeftIsMin(userId string, leftIsMin bool) bool {
|
|
|
|
return db.UpdateByQMap(db.Users, bson.M{"_id": bson.ObjectIdHex(userId)}, bson.M{"LeftIsMin": leftIsMin})
|
2014-09-24 22:24:52 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
//-------------
|
|
|
|
// user admin
|
|
|
|
func (this *UserService) ListUsers(pageNumber, pageSize int, sortField string, isAsc bool, email string) (page info.Page, users []info.User) {
|
|
|
|
users = []info.User{}
|
|
|
|
skipNum, sortFieldR := parsePageAndSort(pageNumber, pageSize, sortField, isAsc)
|
|
|
|
query := bson.M{}
|
|
|
|
if email != "" {
|
|
|
|
query["Email"] = bson.M{"$regex": bson.RegEx{".*?" + email + ".*", "i"}}
|
|
|
|
}
|
|
|
|
q := db.Users.Find(query);
|
|
|
|
// 总记录数
|
|
|
|
count, _ := q.Count()
|
|
|
|
// 列表
|
|
|
|
q.Sort(sortFieldR).
|
|
|
|
Skip(skipNum).
|
|
|
|
Limit(pageSize).
|
|
|
|
All(&users)
|
|
|
|
page = info.NewPage(pageNumber, pageSize, count, nil)
|
|
|
|
return
|
2014-05-27 11:37:03 +08:00
|
|
|
}
|