mirror of https://github.com/ouqiang/gocron
332 lines
8.3 KiB
Go
332 lines
8.3 KiB
Go
package user
|
|
|
|
import (
|
|
"github.com/go-macaron/captcha"
|
|
"github.com/go-macaron/session"
|
|
"github.com/ouqiang/gocron/models"
|
|
"github.com/ouqiang/gocron/modules/logger"
|
|
"github.com/ouqiang/gocron/modules/utils"
|
|
"github.com/ouqiang/gocron/routers/base"
|
|
"gopkg.in/macaron.v1"
|
|
"github.com/Unknwon/paginater"
|
|
"html/template"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
// @author qiang.ou<qingqianludao@gmail.com>
|
|
// @date 2017/4/23-14:16
|
|
|
|
// UserForm 用户表单
|
|
type UserForm struct {
|
|
Id int
|
|
Name string `binding:"Required;MaxSize(32)"` // 用户名
|
|
Password string // 密码
|
|
ConfirmPassword string // 确认密码
|
|
Email string `binding:"Required;MaxSize(50)"` // 邮箱
|
|
IsAdmin int8 // 是否是管理员 1:管理员 0:普通用户
|
|
Status models.Status
|
|
}
|
|
|
|
// Index 用户列表页
|
|
func Index(ctx *macaron.Context) {
|
|
queryParams := parseQueryParams(ctx)
|
|
userModel := new(models.User)
|
|
users, err := userModel.List(queryParams)
|
|
if err != nil {
|
|
logger.Error(err)
|
|
}
|
|
total, err := userModel.Total()
|
|
if err != nil {
|
|
logger.Error(err)
|
|
}
|
|
PageParams := fmt.Sprintf("page_size=%d", queryParams["PageSize"])
|
|
queryParams["PageParams"] = template.URL(PageParams)
|
|
p := paginater.New(int(total), queryParams["PageSize"].(int), queryParams["Page"].(int), 5)
|
|
ctx.Data["Pagination"] = p
|
|
ctx.Data["Params"] = queryParams
|
|
ctx.Data["Title"] = "用户列表"
|
|
ctx.Data["Users"] = users
|
|
ctx.HTML(200, "user/index")
|
|
}
|
|
|
|
// 解析查询参数
|
|
func parseQueryParams(ctx *macaron.Context) models.CommonMap {
|
|
var params models.CommonMap = models.CommonMap{}
|
|
base.ParsePageAndPageSize(ctx, params)
|
|
|
|
return params
|
|
}
|
|
|
|
// Create 新增用户页
|
|
func Create(ctx *macaron.Context) {
|
|
userModel := new(models.User)
|
|
userModel.Status = models.Enabled
|
|
userModel.IsAdmin = 0
|
|
ctx.Data["User"] = userModel
|
|
ctx.Data["Title"] = "添加用户"
|
|
ctx.HTML(200, "user/user_form")
|
|
}
|
|
|
|
// 编辑页面
|
|
func Edit(ctx *macaron.Context) {
|
|
ctx.Data["Title"] = "编辑用户"
|
|
userModel := new(models.User)
|
|
id := ctx.ParamsInt(":id")
|
|
err := userModel.Find(id)
|
|
if err != nil {
|
|
logger.Error(err)
|
|
}
|
|
ctx.Data["User"] = userModel
|
|
ctx.HTML(200, "user/user_form")
|
|
}
|
|
|
|
// 保存任务
|
|
func Store(ctx *macaron.Context, form UserForm) string {
|
|
form.Name = strings.TrimSpace(form.Name)
|
|
form.Email = strings.TrimSpace(form.Email)
|
|
form.Password = strings.TrimSpace(form.Password)
|
|
form.ConfirmPassword = strings.TrimSpace(form.ConfirmPassword)
|
|
json := utils.JsonResponse{}
|
|
userModel := models.User{}
|
|
nameExists, err := userModel.UsernameExists(form.Name, form.Id)
|
|
if err != nil {
|
|
return json.CommonFailure(utils.FailureContent, err)
|
|
}
|
|
if nameExists > 0 {
|
|
return json.CommonFailure("用户名已存在")
|
|
}
|
|
|
|
emailExists, err := userModel.EmailExists(form.Email, form.Id)
|
|
if err != nil {
|
|
return json.CommonFailure(utils.FailureContent, err)
|
|
}
|
|
if emailExists > 0 {
|
|
return json.CommonFailure("邮箱已存在")
|
|
}
|
|
|
|
if form.Id == 0 {
|
|
if form.Password == "" {
|
|
return json.CommonFailure("请输入密码")
|
|
}
|
|
if form.ConfirmPassword == "" {
|
|
return json.CommonFailure("请再次输入密码")
|
|
}
|
|
if form.Password != form.ConfirmPassword {
|
|
return json.CommonFailure("两次密码输入不一致")
|
|
}
|
|
}
|
|
userModel.Name = form.Name
|
|
userModel.Email = form.Email
|
|
userModel.Password = form.Password
|
|
userModel.IsAdmin = form.IsAdmin
|
|
userModel.Status = form.Status
|
|
|
|
if form.Id == 0 {
|
|
_, err = userModel.Create()
|
|
if err != nil {
|
|
return json.CommonFailure("添加失败", err)
|
|
}
|
|
} else {
|
|
_, err = userModel.Update(form.Id, models.CommonMap{
|
|
"name": form.Name,
|
|
"email": form.Email,
|
|
"status": form.Status,
|
|
"is_admin": form.IsAdmin,
|
|
})
|
|
if err != nil {
|
|
return json.CommonFailure("修改失败", err)
|
|
}
|
|
}
|
|
|
|
|
|
return json.Success("保存成功", nil)
|
|
}
|
|
|
|
// 删除用户
|
|
func Remove(ctx *macaron.Context) string {
|
|
id := ctx.ParamsInt(":id")
|
|
json := utils.JsonResponse{}
|
|
|
|
userModel := new(models.User)
|
|
_, err := userModel.Delete(id)
|
|
if err != nil {
|
|
return json.CommonFailure(utils.FailureContent, err)
|
|
}
|
|
|
|
return json.Success(utils.SuccessContent, nil)
|
|
}
|
|
|
|
// 激活用户
|
|
func Enable(ctx *macaron.Context) string {
|
|
return changeStatus(ctx, models.Enabled)
|
|
}
|
|
|
|
// 禁用用户
|
|
func Disable(ctx *macaron.Context) string {
|
|
return changeStatus(ctx, models.Disabled)
|
|
}
|
|
|
|
// 改变任务状态
|
|
func changeStatus(ctx *macaron.Context, status models.Status) string {
|
|
id := ctx.ParamsInt(":id")
|
|
json := utils.JsonResponse{}
|
|
userModel := new(models.User)
|
|
_, err := userModel.Update(id, models.CommonMap{
|
|
"Status": status,
|
|
})
|
|
if err != nil {
|
|
return json.CommonFailure(utils.FailureContent, err)
|
|
}
|
|
|
|
return json.Success(utils.SuccessContent, nil)
|
|
}
|
|
|
|
// Login 用户登录
|
|
func Login(ctx *macaron.Context) {
|
|
ctx.Data["Title"] = "用户登录"
|
|
ctx.HTML(200, "user/login")
|
|
}
|
|
|
|
// EditPassword 修改密码页面
|
|
func EditPassword(ctx *macaron.Context) {
|
|
id := ctx.ParamsInt(":id")
|
|
ctx.Data["Title"] = "修改密码"
|
|
ctx.Data["Id"] = id
|
|
ctx.HTML(200, "user/editPassword")
|
|
}
|
|
|
|
// UpdatePassword 更新我的密码
|
|
func UpdatePassword(ctx *macaron.Context) string {
|
|
id := ctx.ParamsInt(":id")
|
|
newPassword := ctx.QueryTrim("new_password")
|
|
confirmNewPassword := ctx.QueryTrim("confirm_new_password")
|
|
json := utils.JsonResponse{}
|
|
if newPassword == "" || confirmNewPassword == "" {
|
|
return json.CommonFailure("请输入密码")
|
|
}
|
|
userModel := new(models.User)
|
|
_, err := userModel.UpdatePassword(id, newPassword)
|
|
if err != nil {
|
|
return json.CommonFailure("修改失败")
|
|
}
|
|
|
|
return json.Success("修改成功", nil)
|
|
}
|
|
|
|
// EditMyPassword 修改我的密码页面
|
|
func EditMyPassword(ctx *macaron.Context) {
|
|
ctx.Data["Title"] = "修改密码"
|
|
ctx.HTML(200, "user/editMyPassword")
|
|
}
|
|
|
|
// UpdateMyPassword 更新我的密码
|
|
func UpdateMyPassword(ctx *macaron.Context, sess session.Store) string {
|
|
oldPassword := ctx.QueryTrim("old_password")
|
|
newPassword := ctx.QueryTrim("new_password")
|
|
confirmNewPassword := ctx.QueryTrim("confirm_new_password")
|
|
json := utils.JsonResponse{}
|
|
if oldPassword == "" || newPassword == "" || confirmNewPassword == "" {
|
|
return json.CommonFailure("原密码和新密码均不能为空")
|
|
}
|
|
if newPassword != confirmNewPassword {
|
|
return json.CommonFailure("两次输入密码不一致")
|
|
}
|
|
if oldPassword == newPassword {
|
|
return json.CommonFailure("原密码与新密码不能相同")
|
|
}
|
|
userModel := new(models.User)
|
|
if !userModel.Match(Username(sess), oldPassword) {
|
|
return json.CommonFailure("原密码输入错误")
|
|
}
|
|
_, err := userModel.UpdatePassword(Uid(sess), newPassword)
|
|
if err != nil {
|
|
return json.CommonFailure("修改失败")
|
|
}
|
|
|
|
return json.Success("修改成功", nil)
|
|
}
|
|
|
|
// ValidateLogin 验证用户登录
|
|
func ValidateLogin(ctx *macaron.Context, sess session.Store, cpt *captcha.Captcha) string {
|
|
username := ctx.QueryTrim("username")
|
|
password := ctx.QueryTrim("password")
|
|
json := utils.JsonResponse{}
|
|
if username == "" || password == "" {
|
|
return json.CommonFailure("用户名、密码不能为空")
|
|
}
|
|
userModel := new(models.User)
|
|
if !userModel.Match(username, password) {
|
|
return json.CommonFailure("用户名或密码错误")
|
|
}
|
|
if !cpt.VerifyReq(ctx.Req) {
|
|
return json.Failure(utils.CaptchaError, "验证码错误")
|
|
}
|
|
|
|
loginLogModel := new(models.LoginLog)
|
|
loginLogModel.Username = userModel.Name
|
|
loginLogModel.Ip = ctx.RemoteAddr()
|
|
_, err := loginLogModel.Create()
|
|
if err != nil {
|
|
logger.Error("记录用户登录日志失败", err)
|
|
}
|
|
|
|
sess.Set("username", userModel.Name)
|
|
sess.Set("uid", userModel.Id)
|
|
sess.Set("isAdmin", userModel.IsAdmin)
|
|
|
|
return json.Success("登录成功", nil)
|
|
}
|
|
|
|
// Logout 用户退出
|
|
func Logout(ctx *macaron.Context, sess session.Store) {
|
|
if IsLogin(sess) {
|
|
err := sess.Destory(ctx)
|
|
if err != nil {
|
|
logger.Error("用户退出登录失败", err)
|
|
}
|
|
}
|
|
|
|
Login(ctx)
|
|
}
|
|
|
|
// Username 获取session中的用户名
|
|
func Username(sess session.Store) string {
|
|
username, ok := sess.Get("username").(string)
|
|
if ok {
|
|
return username
|
|
}
|
|
|
|
return ""
|
|
}
|
|
|
|
// Uid 获取session中的Uid
|
|
func Uid(sess session.Store) int {
|
|
uid, ok := sess.Get("uid").(int)
|
|
if ok {
|
|
return uid
|
|
}
|
|
|
|
return 0
|
|
}
|
|
|
|
// IsLogin 判断用户是否已登录
|
|
func IsLogin(sess session.Store) bool {
|
|
uid, ok := sess.Get("uid").(int)
|
|
if ok && uid > 0 {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|
|
|
|
// IsAdmin 判断当前用户是否是管理员
|
|
func IsAdmin(sess session.Store) bool {
|
|
isAdmin, ok := sess.Get("isAdmin").(int8)
|
|
if ok && isAdmin > 0 {
|
|
return true
|
|
}
|
|
|
|
return false
|
|
}
|