Skip to content

Commit

Permalink
添加管理员 #30
Browse files Browse the repository at this point in the history
  • Loading branch information
Jsharkc committed Oct 21, 2017
1 parent 018364f commit b621860
Show file tree
Hide file tree
Showing 3 changed files with 177 additions and 1 deletion.
99 changes: 99 additions & 0 deletions backend/controllers/admin.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package controllers

import (
"encoding/json"

"github.com/jinzhu/gorm"

"github.com/Jsharkc/TechTree/backend/general"
"github.com/Jsharkc/TechTree/backend/models"
"github.com/Jsharkc/TechTree/backend/utils"
"github.com/Jsharkc/TechTree/lib/log"
)

type AdminController struct {
BaseController
}

func (ac *AdminController) Add() {
var (
err error
admin models.Admin
flag bool
)

err = json.Unmarshal(ac.Ctx.Input.RequestBody, &admin)
if err != nil {
log.Logger.Error("Add admin json unmarshal err:", err)
ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrInvalidParams}
goto finish
}

flag, err = utils.GlobalValid.Valid(&admin)
if !flag {
for _, err := range utils.GlobalValid.Errors {
log.Logger.Error("the user key "+err.Key+" has err:", err)
}

ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrInvalidParams}
goto finish
}

err = models.AdminService.Add(&admin)
if err != nil {
log.Logger.Error("create user err:", err)
ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrMysql}
goto finish
}

ac.SetSession(general.SessionUserID, admin.UserName)
ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrSucceed}
log.Logger.Info("Login: Admin ID:%s", admin.UserName)
finish:
ac.ServeJSON(true)
}

func (ac *AdminController) Login() {
var (
err error
login models.Admin
userID string
flag bool
)

err = json.Unmarshal(ac.Ctx.Input.RequestBody, &login)
if err != nil {
log.Logger.Error("Admin login json unmarshal err:", err)
ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrInvalidParams}
goto finish
}

flag, err = utils.GlobalValid.Valid(&login)
if !flag {
for _, err := range utils.GlobalValid.Errors {
log.Logger.Error("the user key "+err.Key+" has err:", err)
}

ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrInvalidParams}
goto finish
}

userID, err = models.AdminService.Login(&login.UserName, &login.Password)
if err != nil {
if err == gorm.ErrRecordNotFound {
log.Logger.Error("Admin doesn't exist:", err)
ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrNotFound}
goto finish
}

log.Logger.Error("Admin login mysql err:", err)
ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrMysql}
goto finish
}

ac.SetSession(general.SessionUserID, userID)
ac.Data["json"] = map[string]interface{}{general.RespKeyStatus: general.ErrSucceed}
log.Logger.Info("Login: Admin ID:%s", userID)
finish:
ac.ServeJSON(true)
}
77 changes: 77 additions & 0 deletions backend/models/admin.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package models

import (
"errors"
"time"

"github.com/Jsharkc/TechTree/backend/general"
"github.com/Jsharkc/TechTree/backend/tidb"
"github.com/Jsharkc/TechTree/backend/utils"
)

type AdminServiceProvider struct {
}

var AdminService *AdminServiceProvider = &AdminServiceProvider{}

type Admin struct {
UserName string `json:"name" gorm:"column:name" valid:"Required; MinSize(6);MaxSize(128)"`
Password string `json:"pass" gorm:"column:pass" valid:"Required; MinSize(6);MaxSize(16)"`
Created time.Time `json:"created"`
Status int `json:"status"`
}

func (a Admin) TableName() string {
return "admin"
}

func (as *AdminServiceProvider) Add(a *Admin) error {
var (
db = tidb.Conn
tx = db.Begin()
err error
)

defer func() {
if err != nil {
err = tx.Rollback().Error
} else {
err = tx.Commit().Error
}
}()

err = tx.Create(&a).Error
if err != nil {
return err
}

hashcode, err := utils.GenerateHash(a.Password)
if err != nil {
return err
}

a.Password = string(hashcode)
a.Status = general.Active
a.Created = time.Now()

return err
}

func (as *AdminServiceProvider) Login(name, pass *string) (string, error) {
var (
a Admin
err error
)

db := tidb.Conn
err = db.Model(&Admin{}).Where("name = ?", *name).First(&a).Error
if err != nil {
return "", err
}

if !utils.CompareHash([]byte(a.Password), *pass) {
return "", errors.New("Password not right!")
}

return a.UserName, nil
}
2 changes: 1 addition & 1 deletion backend/models/user.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,7 @@ func (us *UserServiceProvider) Login(name, pass *string) (string, error) {
)

db := tidb.Conn
err = db.Where("name = ?", *name).First(&u).Error
err = db.Model(&User{}).Where("name = ?", *name).First(&u).Error
if err != nil {
return "", err
}
Expand Down

0 comments on commit b621860

Please sign in to comment.