tank/code/user_controller.go
2019-04-26 03:15:34 +08:00

403 lines
10 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package code
import (
"net/http"
"regexp"
"strconv"
"tank/code/config"
result2 "tank/code/tool/result"
"tank/code/tool/util"
"time"
)
type UserController struct {
BaseController
}
//初始化方法
func (this *UserController) Init() {
this.BaseController.Init()
}
//注册自己的路由。
func (this *UserController) RegisterRoutes() map[string]func(writer http.ResponseWriter, request *http.Request) {
routeMap := make(map[string]func(writer http.ResponseWriter, request *http.Request))
//每个Controller需要主动注册自己的路由。
routeMap["/api/user/create"] = this.Wrap(this.Create, USER_ROLE_ADMINISTRATOR)
routeMap["/api/user/edit"] = this.Wrap(this.Edit, USER_ROLE_USER)
routeMap["/api/user/change/password"] = this.Wrap(this.ChangePassword, USER_ROLE_USER)
routeMap["/api/user/reset/password"] = this.Wrap(this.ResetPassword, USER_ROLE_ADMINISTRATOR)
routeMap["/api/user/login"] = this.Wrap(this.Login, USER_ROLE_GUEST)
routeMap["/api/user/logout"] = this.Wrap(this.Logout, USER_ROLE_GUEST)
routeMap["/api/user/detail"] = this.Wrap(this.Detail, USER_ROLE_USER)
routeMap["/api/user/page"] = this.Wrap(this.Page, USER_ROLE_ADMINISTRATOR)
routeMap["/api/user/disable"] = this.Wrap(this.Disable, USER_ROLE_ADMINISTRATOR)
routeMap["/api/user/enable"] = this.Wrap(this.Enable, USER_ROLE_ADMINISTRATOR)
return routeMap
}
//使用用户名和密码进行登录。
//参数:
// @email:邮箱
// @password:密码
func (this *UserController) Login(writer http.ResponseWriter, request *http.Request) *result2.WebResult {
email := request.FormValue("email")
password := request.FormValue("password")
if "" == email || "" == password {
panic(result2.BadRequest("请输入邮箱和密码"))
}
user := this.userDao.FindByEmail(email)
if user == nil {
panic(result2.BadRequest("邮箱或密码错误"))
} else {
if !util.MatchBcrypt(password, user.Password) {
panic(result2.BadRequest("邮箱或密码错误"))
}
}
//登录成功设置Cookie。有效期30天。
expiration := time.Now()
expiration = expiration.AddDate(0, 0, 30)
//持久化用户的session.
session := &Session{
UserUuid: user.Uuid,
Ip: util.GetIpAddress(request),
ExpireTime: expiration,
}
session.UpdateTime = time.Now()
session.CreateTime = time.Now()
session = this.sessionDao.Create(session)
//设置用户的cookie.
cookie := http.Cookie{
Name: config.COOKIE_AUTH_KEY,
Path: "/",
Value: session.Uuid,
Expires: expiration}
http.SetCookie(writer, &cookie)
//更新用户上次登录时间和ip
user.LastTime = time.Now()
user.LastIp = util.GetIpAddress(request)
this.userDao.Save(user)
return this.Success(user)
}
//创建一个用户
func (this *UserController) Create(writer http.ResponseWriter, request *http.Request) *result2.WebResult {
username := request.FormValue("username")
if m, _ := regexp.MatchString(`^[0-9a-zA-Z_]+$`, username); !m {
panic(`用户名必填,且只能包含字母,数字和'_''`)
}
password := request.FormValue("password")
if len(password) < 6 {
panic(`密码长度至少为6位`)
}
email := request.FormValue("email")
if email == "" {
panic("邮箱必填!")
}
avatarUrl := request.FormValue("avatarUrl")
phone := request.FormValue("phone")
gender := request.FormValue("gender")
role := request.FormValue("role")
city := request.FormValue("city")
//判断用户上传大小限制。
sizeLimitStr := request.FormValue("sizeLimit")
var sizeLimit int64 = 0
if sizeLimitStr == "" {
panic("用户上传限制必填!")
} else {
intsizeLimit, err := strconv.Atoi(sizeLimitStr)
if err != nil {
this.PanicError(err)
}
sizeLimit = int64(intsizeLimit)
}
//判断重名。
if this.userDao.CountByUsername(username) > 0 {
panic(username + "已经被其他用户占用。")
}
//判断邮箱重名
if this.userDao.CountByEmail(email) > 0 {
panic(email + "已经被其他用户占用。")
}
user := &User{
Role: GetRole(role),
Username: username,
Password: util.GetBcrypt(password),
Email: email,
Phone: phone,
Gender: gender,
City: city,
AvatarUrl: avatarUrl,
SizeLimit: sizeLimit,
Status: USER_STATUS_OK,
}
user = this.userDao.Create(user)
return this.Success(user)
}
//编辑一个用户的资料。
func (this *UserController) Edit(writer http.ResponseWriter, request *http.Request) *result2.WebResult {
avatarUrl := request.FormValue("avatarUrl")
uuid := request.FormValue("uuid")
phone := request.FormValue("phone")
gender := request.FormValue("gender")
city := request.FormValue("city")
currentUser := this.checkUser(writer, request)
user := this.userDao.CheckByUuid(uuid)
if currentUser.Role == USER_ROLE_ADMINISTRATOR {
//只有管理员可以改变用户上传的大小
//判断用户上传大小限制。
sizeLimitStr := request.FormValue("sizeLimit")
var sizeLimit int64 = 0
if sizeLimitStr == "" {
panic("用户上传限制必填!")
} else {
intsizeLimit, err := strconv.Atoi(sizeLimitStr)
if err != nil {
this.PanicError(err)
}
sizeLimit = int64(intsizeLimit)
}
user.SizeLimit = sizeLimit
} else {
if currentUser.Uuid != uuid {
panic(result2.Unauthorized("没有权限"))
}
}
user.AvatarUrl = avatarUrl
user.Phone = phone
user.Gender = GetGender(gender)
user.City = city
user = this.userDao.Save(user)
return this.Success(user)
}
//获取用户详情
func (this *UserController) Detail(writer http.ResponseWriter, request *http.Request) *result2.WebResult {
uuid := request.FormValue("uuid")
user := this.userDao.CheckByUuid(uuid)
return this.Success(user)
}
//退出登录
func (this *UserController) Logout(writer http.ResponseWriter, request *http.Request) *result2.WebResult {
//session置为过期
sessionCookie, err := request.Cookie(config.COOKIE_AUTH_KEY)
if err != nil {
return this.Success("已经退出登录了!")
}
sessionId := sessionCookie.Value
user := this.findUser(writer, request)
if user != nil {
session := this.sessionDao.FindByUuid(sessionId)
session.ExpireTime = time.Now()
this.sessionDao.Save(session)
}
//删掉session缓存
_, err = CONTEXT.SessionCache.Delete(sessionId)
if err != nil {
this.logger.Error("删除用户session缓存时出错")
}
//清空客户端的cookie.
expiration := time.Now()
expiration = expiration.AddDate(-1, 0, 0)
cookie := http.Cookie{
Name: config.COOKIE_AUTH_KEY,
Path: "/",
Value: sessionId,
Expires: expiration}
http.SetCookie(writer, &cookie)
return this.Success("退出成功!")
}
//获取用户列表 管理员的权限。
func (this *UserController) Page(writer http.ResponseWriter, request *http.Request) *result2.WebResult {
pageStr := request.FormValue("page")
pageSizeStr := request.FormValue("pageSize")
orderCreateTime := request.FormValue("orderCreateTime")
orderUpdateTime := request.FormValue("orderUpdateTime")
orderSort := request.FormValue("orderSort")
username := request.FormValue("username")
email := request.FormValue("email")
phone := request.FormValue("phone")
status := request.FormValue("status")
orderLastTime := request.FormValue("orderLastTime")
var page int
if pageStr != "" {
page, _ = strconv.Atoi(pageStr)
}
pageSize := 200
if pageSizeStr != "" {
tmp, err := strconv.Atoi(pageSizeStr)
if err == nil {
pageSize = tmp
}
}
sortArray := []OrderPair{
{
key: "create_time",
value: orderCreateTime,
},
{
key: "update_time",
value: orderUpdateTime,
},
{
key: "sort",
value: orderSort,
},
{
key: "last_time",
value: orderLastTime,
},
}
pager := this.userDao.Page(page, pageSize, username, email, phone, status, sortArray)
return this.Success(pager)
}
//禁用用户
func (this *UserController) Disable(writer http.ResponseWriter, request *http.Request) *result2.WebResult {
uuid := request.FormValue("uuid")
user := this.userDao.CheckByUuid(uuid)
loginUser := this.checkUser(writer, request)
if uuid == loginUser.Uuid {
panic(result2.BadRequest("你不能操作自己的状态。"))
}
if user.Status == USER_STATUS_DISABLED {
panic(result2.BadRequest("用户已经被禁用,操作无效。"))
}
user.Status = USER_STATUS_DISABLED
user = this.userDao.Save(user)
return this.Success(user)
}
//启用用户
func (this *UserController) Enable(writer http.ResponseWriter, request *http.Request) *result2.WebResult {
uuid := request.FormValue("uuid")
user := this.userDao.CheckByUuid(uuid)
loginUser := this.checkUser(writer, request)
if uuid == loginUser.Uuid {
panic(result2.BadRequest("你不能操作自己的状态。"))
}
if user.Status == USER_STATUS_OK {
panic(result2.BadRequest("用户已经是正常状态,操作无效。"))
}
user.Status = USER_STATUS_OK
user = this.userDao.Save(user)
return this.Success(user)
}
//用户修改密码
func (this *UserController) ChangePassword(writer http.ResponseWriter, request *http.Request) *result2.WebResult {
oldPassword := request.FormValue("oldPassword")
newPassword := request.FormValue("newPassword")
if oldPassword == "" || newPassword == "" {
panic(result2.BadRequest("旧密码和新密码都不能为空"))
}
user := this.checkUser(writer, request)
//如果是demo账号不提供修改密码的功能。
if user.Username == "demo" {
return this.Success(user)
}
if !util.MatchBcrypt(oldPassword, user.Password) {
panic(result2.BadRequest("旧密码不正确!"))
}
user.Password = util.GetBcrypt(newPassword)
user = this.userDao.Save(user)
return this.Success(user)
}
//管理员重置用户密码
func (this *UserController) ResetPassword(writer http.ResponseWriter, request *http.Request) *result2.WebResult {
userUuid := request.FormValue("userUuid")
password := request.FormValue("password")
if userUuid == "" {
panic(result2.BadRequest("用户不能为空"))
}
if password == "" {
panic(result2.BadRequest("密码不能为空"))
}
currentUser := this.checkUser(writer, request)
if currentUser.Role != USER_ROLE_ADMINISTRATOR {
panic(result2.Unauthorized("没有权限"))
}
user := this.userDao.CheckByUuid(userUuid)
user.Password = util.GetBcrypt(password)
user = this.userDao.Save(user)
return this.Success(currentUser)
}