diff --git a/conf/app.ini b/conf/app.ini index ec7328b..e121ac3 100644 --- a/conf/app.ini +++ b/conf/app.ini @@ -27,3 +27,10 @@ Host = 0.0.0.0 Port = 5432 Name = shop TablePrefix = shop_ + +[redis] +Host = 127.0.0.1:6379 +Password = +MaxIdle = 30 +MaxActive = 30 +IdleTimeout = 200 \ No newline at end of file diff --git a/cron.go b/cron.go index 1b84c0c..5f1b3fd 100644 --- a/cron.go +++ b/cron.go @@ -13,7 +13,7 @@ func main() { c := cron.New() c.AddFunc("* * * * * *", func() { log.Println("Run models.CleanEmployee...") - models.CleaanAllEmployee() + models.CleanAllEmployee() }) c.Start() diff --git a/go.mod b/go.mod index 353b225..cb7a4fc 100644 --- a/go.mod +++ b/go.mod @@ -11,10 +11,11 @@ require ( github.com/go-openapi/spec v0.19.9 // indirect github.com/go-openapi/swag v0.19.9 // indirect github.com/go-playground/validator/v10 v10.3.0 // indirect + github.com/gomodule/redigo v2.0.0+incompatible github.com/jinzhu/gorm v1.9.16 github.com/lib/pq v1.2.0 // indirect github.com/mailru/easyjson v0.7.6 // indirect - github.com/robfig/cron v1.2.0 // indirect + github.com/robfig/cron v1.2.0 github.com/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 // indirect github.com/swaggo/gin-swagger v1.2.0 github.com/swaggo/swag v1.6.7 diff --git a/main.go b/main.go index 48c8cf2..ae951be 100644 --- a/main.go +++ b/main.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/gin-gonic/gin" "github.com/go-pripro/shop/models" + "github.com/go-pripro/shop/pkg/gredis" "github.com/go-pripro/shop/pkg/logging" "github.com/go-pripro/shop/pkg/setting" "github.com/go-pripro/shop/routers" @@ -15,6 +16,7 @@ func init() { setting.Setup() models.Setup() logging.Setup() + gredis.Setup() } func main() { diff --git a/models/employee.go b/models/employee.go index 19cc78c..6f7dea6 100644 --- a/models/employee.go +++ b/models/employee.go @@ -1,7 +1,10 @@ package models +import "github.com/jinzhu/gorm" + type Employee struct { Model + AvatarUrl string `json:"avatar_url"` Username string `json:"username"` Password string `json:"password"` @@ -20,15 +23,18 @@ func CheckEmployee(username, password string) bool { return false } -func ExistEmployeeByID(id int) bool { +func ExistEmployeeByID(id int) (bool, error) { var employee Employee - db.Select("id").Where("id = ?", id).First(&employee) - - if employee.ID > 0 { - return true + err := db.Select("id").Where("id = ? AND deleted_on = ?", id, 0).First(&employee).Error + if err != nil && err != gorm.ErrRecordNotFound { + return false, err } - return false + if employee.ID > 0 { + return true, nil + } + + return false, nil } func ExistEmployeeByUsername(username string) bool { @@ -40,40 +46,71 @@ func ExistEmployeeByUsername(username string) bool { return false } -func GetEmployeeTotal(maps interface{}) (count int) { - db.Model(&Employee{}).Where(maps).Count(&count) +func GetEmployeeTotal(maps interface{}) (int, error) { + var count int + if err := db.Model(&Employee{}).Where(maps).Count(&count).Error; err != nil { + return 0, err + } - return + return count, nil } -func GetEmployees(pageNum int, pageSize int, maps interface{}) (employees []Employee) { - db.Where(maps).Offset(pageNum).Limit(pageSize).Find(&employees) +func GetEmployees(pageNum int, pageSize int, maps interface{}) ([]*Employee, error) { + var employees []*Employee + err := db.Where(maps).Offset(pageNum).Limit(pageSize).Find(&employees).Error + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } - return + return employees, nil } -func GetEmployee(id int) (employee Employee) { - db.Where("id = ?", id).First(&employee) - return +func GetEmployee(id int) (*Employee, error) { + var employee Employee + err := db.Where("id = ? AND deleted_on = ? ", id, 0).First(&employee).Error + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + + err = db.Model(&employee).Error + if err != nil && err != gorm.ErrRecordNotFound { + return nil, err + } + + return &employee, nil } -func EditEmployee(id int, data interface{}) bool { - db.Model(&Employee{}).Where("id = ?", id).Updates(data) - return true +func EditEmployee(id int, data interface{}) error { + if err := db.Model(&Employee{}).Where("id = ? AND deleted_on = ?", id, 0).Updates(data).Error; err != nil { + return err + } + return nil } -func AddArticle(data map[string]interface{}) bool { - db.Create(&Employee{ +func AddEmployee(data map[string]interface{}) error { + employee := Employee{ AvatarUrl: data["avatar_url"].(string), Username: data["username"].(string), Password: data["password"].(string), Department: data["department"].(string), Position: data["position"].(string), - }) - return true + } + + if err := db.Create(&employee).Error; err != nil { + return err + } + return nil } -func CleaanAllEmployee() bool { +func DeleteEmployee(id int) error { + if err := db.Where("id = ?", id).Delete(Employee{}).Error; err != nil { + return err + } + + return nil +} + +func CleanAllEmployee() bool { db.Unscoped().Where("deleted_on != ?", 0).Delete(&Employee{}) return true diff --git a/models/models.go b/models/models.go index dc6ff03..dd1569b 100644 --- a/models/models.go +++ b/models/models.go @@ -15,7 +15,7 @@ type Model struct { ID int `gorm:"primary_key" json:"id"` CreatedOn int `json:"created_on"` ModifiedOn int `json:"modified_on"` - DeleteOn int `json:"deleted_on"` + DeletedOn int `json:"deleted_on"` } func Setup() { @@ -82,13 +82,13 @@ func deleteCallback(scope *gorm.Scope) { extraOption = fmt.Sprint(str) } - deleteOnField, hasDeleteOnField := scope.FieldByName("DeleteOn") + deletedOnField, hasDeletedOnField := scope.FieldByName("DeletedOn") - if !scope.Search.Unscoped && hasDeleteOnField { + if !scope.Search.Unscoped && hasDeletedOnField { scope.Raw(fmt.Sprintf( "update %v SET %v=%v%v%v", scope.QuotedTableName(), - scope.Quote(deleteOnField.DBName), + scope.Quote(deletedOnField.DBName), scope.AddToVars(time.Now().Unix()), addExtraSpaceIfExist(scope.CombinedConditionSql()), addExtraSpaceIfExist(extraOption), diff --git a/pkg/app/request.go b/pkg/app/request.go index 4879f7a..4b0f035 100644 --- a/pkg/app/request.go +++ b/pkg/app/request.go @@ -1 +1,14 @@ package app + +import ( + "github.com/astaxie/beego/validation" + "github.com/go-pripro/shop/pkg/logging" +) + +func MarkErrors(errors []*validation.Error) { + for _, err := range errors { + logging.Info(err.Key, err.Message) + } + + return +} \ No newline at end of file diff --git a/pkg/app/response.go b/pkg/app/response.go index 4879f7a..05460e7 100644 --- a/pkg/app/response.go +++ b/pkg/app/response.go @@ -1 +1,20 @@ package app + +import ( + "github.com/gin-gonic/gin" + "github.com/go-pripro/shop/pkg/e" +) + +type Gin struct { + C *gin.Context +} + +func (g *Gin) Response(httpCode, errCode int, data interface{}) { + g.C.JSON(httpCode, gin.H{ + "code" : errCode, + "msg" : e.GetMsg(errCode), + "data" : data, + }) + + return +} \ No newline at end of file diff --git a/pkg/e/cache.go b/pkg/e/cache.go index 67d58f2..4b3a334 100644 --- a/pkg/e/cache.go +++ b/pkg/e/cache.go @@ -1 +1,5 @@ package e + +const ( + CacheEmployee = "Employee" +) diff --git a/pkg/e/code.go b/pkg/e/code.go index 8af0e6c..e7ba6ec 100644 --- a/pkg/e/code.go +++ b/pkg/e/code.go @@ -12,6 +12,9 @@ const ( ErrorUploadCheckImageFail = 10006 ErrorUploadCheckImageFormat = 10007 - ErrorExistEmployee = 20001 - ErrorNotExistEmployee = 20002 + ErrorExistEmployee = 20001 + ErrorNotExistEmployee = 20002 + ErrorCheckExistEmployeeFail = 20003 + ErrorGetEmployeeFail = 20004 + ErrorCreatedEmployeeFail = 20005 ) diff --git a/pkg/e/msg.go b/pkg/e/msg.go index 1e6a002..76af52e 100644 --- a/pkg/e/msg.go +++ b/pkg/e/msg.go @@ -13,6 +13,9 @@ var MsgFlags = map[int]string{ ErrorUploadCheckImageFormat: "校验图片错误,图片格式或大小有问题", ErrorExistEmployee: "已存在该员工用户名", ErrorNotExistEmployee: "该员工不存在", + ErrorCheckExistEmployeeFail: "该员工信息缓存失败", + ErrorGetEmployeeFail: "获取员工信息缓存失败", + ErrorCreatedEmployeeFail: "创建员工失败,入数据库", } func GetMsg(code int) string { diff --git a/pkg/gredis/redis.go b/pkg/gredis/redis.go index e07d29d..c1306d8 100644 --- a/pkg/gredis/redis.go +++ b/pkg/gredis/redis.go @@ -1 +1,100 @@ package gredis + +import ( + "encoding/json" + "github.com/go-pripro/shop/pkg/setting" + "github.com/gomodule/redigo/redis" + "time" +) + +var RedisConn *redis.Pool + +func Setup() error { + RedisConn = &redis.Pool{ + Dial: func() (redis.Conn, error) { + c, err := redis.Dial("tcp", setting.RedisSetting.Host) + if err != nil { + return nil, err + } + if setting.RedisSetting.Password != "" { + if _, err := c.Do("AUTH", setting.RedisSetting.Password); err != nil { + c.Close() + return nil, err + } + } + return c, err + }, + TestOnBorrow: func(c redis.Conn, t time.Time) error { + _, err := c.Do("PING") + return err + }, + MaxIdle: setting.RedisSetting.MaxIdle, // 最大空闲连接数 + MaxActive: setting.RedisSetting.MaxActive, // 在给定时间内,允许分配的最大连接数 + IdleTimeout: setting.RedisSetting.IdleTimeout, // 在给定时间内将会保持空闲状态,若到达时间限制则关闭连接 + } + return nil +} + +func Set(key string, data interface{}, time int) error { + conn := RedisConn.Get() //在连接池中获取一个活跃连接 + defer conn.Close() + + value, err := json.Marshal(data) + if err != nil { + return err + } + + _, err = conn.Do("SET", key, value) //向redis服务器发送命令并返回收到的答复 + if err != nil { + return err + } + + _, err = conn.Do("EXPIRE", key, time) + if err != nil { + return err + } + + return nil +} + +func Exists(key string) bool { + conn := RedisConn.Get() + defer conn.Close() + exists, err := redis.Bool(conn.Do("EXISTS", key)) // 将命令返回转为布尔值 + if err != nil { + return false + } + return exists +} + +func Get(key string) ([]byte, error) { + conn := RedisConn.Get() + defer conn.Close() + reply, err := redis.Bytes(conn.Do("GET", key)) // 将命令返回转为Bytes + if err != nil { + return nil, err + } + return reply, nil +} + +func Delete(key string) (bool, error) { + conn := RedisConn.Get() + defer conn.Close() + return redis.Bool(conn.Do("DEL", key)) +} + +func LikeDeletes(key string) error { + conn := RedisConn.Get() + defer conn.Close() + keys, err := redis.Strings(conn.Do("KEYS", "*"+key+"*")) // 将命令返回转为[]string + if err != nil { + return err + } + for _, key := range keys { + _, err = Delete(key) + if err != nil { + return err + } + } + return nil +} diff --git a/pkg/setting/setting.go b/pkg/setting/setting.go index 4bcb3d8..503862b 100644 --- a/pkg/setting/setting.go +++ b/pkg/setting/setting.go @@ -45,6 +45,16 @@ type Database struct { var DatabaseSetting = &Database{} +type Redis struct { + Host string + Password string + MaxIdle int + MaxActive int + IdleTimeout time.Duration +} + +var RedisSetting = &Redis{} + func Setup() { Cfg, err := ini.Load("conf/app.ini") if err != nil { @@ -68,4 +78,11 @@ func Setup() { if err != nil { log.Fatalf("Cfg.MapTo DatabaseSetting err: %v", err) } + + err = Cfg.Section("redis").MapTo(RedisSetting) + if err != nil { + log.Fatalf("Cfg.MapTo DatabaseSetting err: %v", err) + } + + RedisSetting.IdleTimeout *= time.Second } diff --git a/routers/admin/v1/employee.go b/routers/admin/v1/employee.go index ab94811..1a59c6b 100644 --- a/routers/admin/v1/employee.go +++ b/routers/admin/v1/employee.go @@ -4,92 +4,15 @@ import ( "github.com/astaxie/beego/validation" "github.com/gin-gonic/gin" "github.com/go-pripro/shop/models" + "github.com/go-pripro/shop/pkg/app" "github.com/go-pripro/shop/pkg/e" - "github.com/go-pripro/shop/pkg/logging" "github.com/go-pripro/shop/pkg/setting" "github.com/go-pripro/shop/pkg/util" + "github.com/go-pripro/shop/service/employee_service" "github.com/unknwon/com" "net/http" ) -// @Summary 获取单个员工 -// @Tags employees -// @Description -// @Accept json -// @Produce json -// @Param Authorization header string true "auth by /admin/login" -// @Param id path int true "ID" -// @Success 200 {string} json "{"code": 200, "data": {}, "msg": "ok"}" -// @Router /admin/v1/employees/{id} [GET] -func GetEmployee(c *gin.Context) { - id := com.StrTo(c.Param("id")).MustInt() - - valid := validation.Validation{} - valid.Min(id, 1, "id").Message("ID必须大于0") - - code := e.InvalidParams - var data interface{} - if !valid.HasErrors() { - if models.ExistEmployeeByID(id) { - data = models.GetEmployee(id) - code = e.SUCCESS - } else { - code = e.ErrorNotExistEmployee - } - } else { - for _, err := range valid.Errors { - logging.Info("err.key: %s, err.message: %s", err.Key, err.Message) - } - } - - c.JSON(http.StatusOK, gin.H{ - "code" : code, - "msg" : e.GetMsg(code), - "data" : data, - }) -} - -// @Summary 获取员工列表 -// @Tags employees -// @Description -// @Accept json -// @Produce json -// @Param Authorization header string true "auth by /admin/login" -// @Param department query string false "Department" -// @Param position query string false "Position" -// @Param state query int false "State" -// @Success 200 {string} json "{"code": 200, "data": {}, "msg":"ok"}" -// @Router /admin/v1/employees [get] -func GetEmployees(c *gin.Context) { - data := make(map[string]interface{}) - maps := make(map[string]interface{}) - valid := validation.Validation{} - var state int = -1 - if arg := c.Query("state"); arg != "" { - state = com.StrTo(arg).MustInt() - maps["state"] = state - valid.Range(state, 0, 1, "state").Message("状态只允许0或1") - } - - code := e.InvalidParams - - if ! valid.HasErrors() { - code = e.SUCCESS - data["lists"] = models.GetEmployees(util.GetPage(c), setting.AppSetting.PageSize, maps) - data["total"] = models.GetEmployeeTotal(maps) - } else { - for _, err := range valid.Errors { - logging.Info(err.Key, err.Message) - //log.Printf("err.key: %s, err.message: %s", err.Key, err.Message) - } - } - c.JSON(http.StatusOK, gin.H{ - "code" : code, - "msg" : e.GetMsg(code), - "data" : data, - }) -} - // @Summary 新增员工 // @Tags employees // @Description @@ -104,6 +27,7 @@ func GetEmployees(c *gin.Context) { // @Success 200 {string} json "{"code": 200, "data":{}, "msg":"ok"}" // @Router /admin/v1/employees [post] func AddEmployee(c *gin.Context) { + appG := app.Gin{C: c} username := c.PostForm("username") password := c.PostForm("password") department := c.PostForm("department") @@ -116,32 +40,127 @@ func AddEmployee(c *gin.Context) { valid.Required(department, "department").Message("部门不能为空") valid.Required(position, "position").Message("职位不能为空") + if valid.HasErrors() { + app.MarkErrors(valid.Errors) + appG.Response(http.StatusOK, e.InvalidParams, nil) + return + } + + if models.ExistEmployeeByUsername(username) { + appG.Response(http.StatusInternalServerError, e.ErrorExistEmployee, nil) + } + + employeeService := employee_service.Employee{ + AvatarUrl: avatarUrl, + Username: username, + Password: password, + Department: department, + Position: position, + } + if err := employeeService.Add(); err == nil { + appG.Response(http.StatusOK, e.SUCCESS, employeeService) + } else { + appG.Response(http.StatusOK, e.ErrorCreatedEmployeeFail, employeeService) + } + +} + +// @Summary 获取单个员工 +// @Tags employees +// @Description +// @Accept json +// @Produce json +// @Param Authorization header string true "auth by /admin/login" +// @Param id path int true "ID" +// @Success 200 {string} json "{"code": 200, "data": {}, "msg": "ok"}" +// @Router /admin/v1/employees/{id} [GET] +func GetEmployee(c *gin.Context) { + appG := app.Gin{C: c} + id := com.StrTo(c.Param("id")).MustInt() + + valid := validation.Validation{} + valid.Min(id, 1, "id") + + // 验证参数 + if valid.HasErrors() { + app.MarkErrors(valid.Errors) + appG.Response(http.StatusOK, e.InvalidParams, nil) + return + } + + // 调用service对象存储数据 + employeeService := employee_service.Employee{ + ID: id, + } + + // 员工不存在的情况 + exists, err := employeeService.ExistByID() + if err != nil { + appG.Response(http.StatusInternalServerError, e.ErrorCheckExistEmployeeFail, nil) + } + + if !exists { + appG.Response(http.StatusOK, e.ErrorNotExistEmployee, nil) + return + } + + if employee, err := employeeService.Get(); err != nil{ + // 获取员工信息的过程中Get()出错 + appG.Response(http.StatusInternalServerError, e.ErrorGetEmployeeFail, employee) + } else { + appG.Response(http.StatusOK, e.SUCCESS, employee) + } +} + +// @Summary 获取员工列表 +// @Tags employees +// @Description +// @Accept json +// @Produce json +// @Param Authorization header string true "auth by /admin/login" +// @Param department query string false "Department" +// @Param position query string false "Position" +// @Param state query int false "State" +// @Success 200 {string} json "{"code": 200, "data": {}, "msg":"ok"}" +// @Router /admin/v1/employees [get] +func GetEmployees(c *gin.Context) { + appG := app.Gin{C: c} + valid := validation.Validation{} + + var state int = -1 + if arg := c.Query("state"); arg != "" { + state = com.StrTo(arg).MustInt() + valid.Range(state, 0, 1, "state").Message("状态只允许0或1") + } + + if valid.HasErrors() { + app.MarkErrors(valid.Errors) + appG.Response(http.StatusBadRequest, e.InvalidParams, nil) + } + + employeeService := employee_service.Employee{ + State: state, + PageNum: util.GetPage(c), + PageSize: setting.AppSetting.PageSize, + } + + total, err := employeeService.Count() + if err != nil { + appG.Response(http.StatusInternalServerError, e.InvalidParams, nil) + return + } + + employees, err := employeeService.GetAll() + if err != nil { + appG.Response(http.StatusInternalServerError, e.InvalidParams, nil) + return + } + data := make(map[string]interface{}) + data["lists"] = employees + data["total"] = total - code := e.InvalidParams - - if !valid.HasErrors() { - if !models.ExistEmployeeByUsername(username) { - data["username"] = username - data["password"] = password - data["department"] = department - data["position"] = position - data["avatar_url"] = avatarUrl - code = e.SUCCESS - } else { - code = e.ErrorExistEmployee - } - } - - if code == 200 { - models.AddArticle(data) - } - - c.JSON(http.StatusOK, gin.H{ - "code" : code, - "msg" : e.GetMsg(code), - "data" : data, - }) + appG.Response(http.StatusOK, e.SUCCESS, data) } // @Summary 更新员工 @@ -159,7 +178,7 @@ func AddEmployee(c *gin.Context) { // @Param state formData string false "员工状态" // @Success 200 {string} json "{"code": 200, "data":{}, "msg":"ok"}" // @Router /admin/v1/employees/{id} [put] -func EditEmployee(c *gin.Context) { +func EditEmployee(c *gin.Context) { id := com.StrTo(c.Param("id")).MustInt() avatarUrl := c.PostForm("avatar_url") username := c.PostForm("username") @@ -169,16 +188,16 @@ func EditEmployee(c *gin.Context) { state := com.StrTo(c.PostForm("state")).MustInt() valid := validation.Validation{} - valid.Min(id,1, "id").Message("必须是有效的员工id") + valid.Min(id, 1, "id").Message("必须是有效的员工id") valid.Range(state, 0, 1, "state").Message("状态只允许0或1") data := make(map[string]interface{}) code := e.InvalidParams - if ! valid.HasErrors() { - if models.ExistEmployeeByID(id) { + if !valid.HasErrors() { + if _, err := models.ExistEmployeeByID(id); err == nil { code = e.SUCCESS - if avatarUrl != "" { + if avatarUrl != "" { data["avatar_url"] = avatarUrl } if username != "" { @@ -202,13 +221,13 @@ func EditEmployee(c *gin.Context) { } if code == 200 { - models.EditEmployee(id, data) + models.EditEmployee(id, data) } c.JSON(http.StatusOK, gin.H{ - "code" : code, - "msg" : e.GetMsg(code), + "code": code, + "msg": e.GetMsg(code), "data": data, }) - -} \ No newline at end of file + +} diff --git a/service/cache_service/employee.go b/service/cache_service/employee.go index 8b74896..41e5196 100644 --- a/service/cache_service/employee.go +++ b/service/cache_service/employee.go @@ -1 +1,44 @@ package cache_service + +import ( + "github.com/go-pripro/shop/pkg/e" + "strconv" + "strings" +) + +type Employee struct { + ID int + State int + + PageNum int + PageSize int +} + +func (employee *Employee) GetEmployeeKey() string { + return e.CacheEmployee + "_" + strconv.Itoa(employee.ID) +} + +func (employee *Employee) GetEmployeesKey() string { + keys := []string{ + e.CacheEmployee, + "List", + } + + if employee.ID > 0 { + keys = append(keys, strconv.Itoa(employee.ID)) + } + + if employee.State >= 0 { + keys = append(keys, strconv.Itoa(employee.State)) + } + + if employee.PageNum > 0 { + keys = append(keys, strconv.Itoa(employee.PageNum)) + } + + if employee.PageSize > 0 { + keys = append(keys, strconv.Itoa(employee.PageSize)) + } + + return strings.Join(keys, "_") +} \ No newline at end of file diff --git a/service/employee_service/employee.go b/service/employee_service/employee.go index fb379d7..2bcec04 100644 --- a/service/employee_service/employee.go +++ b/service/employee_service/employee.go @@ -1 +1,133 @@ package employee_service + +import ( + "encoding/json" + "errors" + "github.com/go-pripro/shop/models" + "github.com/go-pripro/shop/pkg/gredis" + "github.com/go-pripro/shop/pkg/logging" + "github.com/go-pripro/shop/service/cache_service" +) + +type Employee struct { + ID int + CreatedOn int + ModifiedOn int + DeletedOn int + AvatarUrl string + Username string + Password string + Department string + Position string + State int + + PageNum int + PageSize int +} + +func (e *Employee) Add() error { + employee := map[string]interface{}{ + "avatar_url": e.AvatarUrl, + "username": e.Username, + "password": e.Password, + "department": e.Department, + "position": e.Position, + "state": e.State, + } + + if err := models.AddEmployee(employee); err != nil { + return err + } + + return nil +} + +func (e *Employee) Edit() error { + return models.EditEmployee(e.ID, map[string]interface{}{ + "avatar_url": e.AvatarUrl, + "username": e.Username, + "password": e.Password, + "department": e.Department, + "position": e.Position, + "state": e.State, + }) +} + +func (e *Employee) Get() (*models.Employee, error) { + var cacheEmployee *models.Employee + + cache := cache_service.Employee{ + ID: e.ID, + } + key := cache.GetEmployeeKey() + if gredis.Exists(key) { + data, err := gredis.Get(key) + if err != nil { + logging.Info(err) + return cacheEmployee, errors.New("从缓存中获取员工信息失败") + } else { + json.Unmarshal(data, &cacheEmployee) + return cacheEmployee, nil + } + } + + if employee, err := models.GetEmployee(e.ID); err != nil { + return nil, err + } else { + gredis.Set(key, employee, 3600) + //cacheEmployee.ID = employee.ID + return cacheEmployee, nil + } +} + +func (e *Employee) GetAll() ([]*models.Employee, error) { + var ( + employees, cacheEmployees []*models.Employee + ) + + cache := cache_service.Employee{ + State: e.State, + PageNum: e.PageNum, + PageSize: e.PageSize, + } + key := cache.GetEmployeesKey() + if gredis.Exists(key) { + data, err := gredis.Get(key) + if err != nil { + logging.Info(err) + } else { + json.Unmarshal(data, &cacheEmployees) + return cacheEmployees, nil + } + } + + employees, err := models.GetEmployees(e.PageNum, e.PageSize, e.getMaps()) + if err != nil { + return nil, err + } + + gredis.Set(key, employees, 3600) + return employees, nil +} + +func (a *Employee) Delete() error { + return models.DeleteEmployee(a.ID) +} + +func (e *Employee) ExistByID() (bool, error) { + return models.ExistEmployeeByID(e.ID) +} + +func (e *Employee) Count() (int, error) { + return models.GetEmployeeTotal(e.getMaps()) +} + +func (e *Employee) getMaps() map[string]interface{} { + maps := make(map[string]interface{}) + maps["deleted_on"] = 0 + if e.State != -1 { + maps["state"] = e.State + } + + return maps +}