[ADD]为数据添加redis缓存
This commit is contained in:
parent
4181eb96d7
commit
17ce95596b
|
@ -27,3 +27,10 @@ Host = 0.0.0.0
|
||||||
Port = 5432
|
Port = 5432
|
||||||
Name = shop
|
Name = shop
|
||||||
TablePrefix = shop_
|
TablePrefix = shop_
|
||||||
|
|
||||||
|
[redis]
|
||||||
|
Host = 127.0.0.1:6379
|
||||||
|
Password =
|
||||||
|
MaxIdle = 30
|
||||||
|
MaxActive = 30
|
||||||
|
IdleTimeout = 200
|
2
cron.go
2
cron.go
|
@ -13,7 +13,7 @@ func main() {
|
||||||
c := cron.New()
|
c := cron.New()
|
||||||
c.AddFunc("* * * * * *", func() {
|
c.AddFunc("* * * * * *", func() {
|
||||||
log.Println("Run models.CleanEmployee...")
|
log.Println("Run models.CleanEmployee...")
|
||||||
models.CleaanAllEmployee()
|
models.CleanAllEmployee()
|
||||||
})
|
})
|
||||||
|
|
||||||
c.Start()
|
c.Start()
|
||||||
|
|
3
go.mod
3
go.mod
|
@ -11,10 +11,11 @@ require (
|
||||||
github.com/go-openapi/spec v0.19.9 // indirect
|
github.com/go-openapi/spec v0.19.9 // indirect
|
||||||
github.com/go-openapi/swag 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/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/jinzhu/gorm v1.9.16
|
||||||
github.com/lib/pq v1.2.0 // indirect
|
github.com/lib/pq v1.2.0 // indirect
|
||||||
github.com/mailru/easyjson v0.7.6 // 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/smartystreets/goconvey v0.0.0-20190731233626-505e41936337 // indirect
|
||||||
github.com/swaggo/gin-swagger v1.2.0
|
github.com/swaggo/gin-swagger v1.2.0
|
||||||
github.com/swaggo/swag v1.6.7
|
github.com/swaggo/swag v1.6.7
|
||||||
|
|
2
main.go
2
main.go
|
@ -4,6 +4,7 @@ import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/go-pripro/shop/models"
|
"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/logging"
|
||||||
"github.com/go-pripro/shop/pkg/setting"
|
"github.com/go-pripro/shop/pkg/setting"
|
||||||
"github.com/go-pripro/shop/routers"
|
"github.com/go-pripro/shop/routers"
|
||||||
|
@ -15,6 +16,7 @@ func init() {
|
||||||
setting.Setup()
|
setting.Setup()
|
||||||
models.Setup()
|
models.Setup()
|
||||||
logging.Setup()
|
logging.Setup()
|
||||||
|
gredis.Setup()
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
|
@ -1,7 +1,10 @@
|
||||||
package models
|
package models
|
||||||
|
|
||||||
|
import "github.com/jinzhu/gorm"
|
||||||
|
|
||||||
type Employee struct {
|
type Employee struct {
|
||||||
Model
|
Model
|
||||||
|
|
||||||
AvatarUrl string `json:"avatar_url"`
|
AvatarUrl string `json:"avatar_url"`
|
||||||
Username string `json:"username"`
|
Username string `json:"username"`
|
||||||
Password string `json:"password"`
|
Password string `json:"password"`
|
||||||
|
@ -20,15 +23,18 @@ func CheckEmployee(username, password string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func ExistEmployeeByID(id int) bool {
|
func ExistEmployeeByID(id int) (bool, error) {
|
||||||
var employee Employee
|
var employee Employee
|
||||||
db.Select("id").Where("id = ?", id).First(&employee)
|
err := db.Select("id").Where("id = ? AND deleted_on = ?", id, 0).First(&employee).Error
|
||||||
|
if err != nil && err != gorm.ErrRecordNotFound {
|
||||||
if employee.ID > 0 {
|
return false, err
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
if employee.ID > 0 {
|
||||||
|
return true, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func ExistEmployeeByUsername(username string) bool {
|
func ExistEmployeeByUsername(username string) bool {
|
||||||
|
@ -40,40 +46,71 @@ func ExistEmployeeByUsername(username string) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetEmployeeTotal(maps interface{}) (count int) {
|
func GetEmployeeTotal(maps interface{}) (int, error) {
|
||||||
db.Model(&Employee{}).Where(maps).Count(&count)
|
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) {
|
func GetEmployees(pageNum int, pageSize int, maps interface{}) ([]*Employee, error) {
|
||||||
db.Where(maps).Offset(pageNum).Limit(pageSize).Find(&employees)
|
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) {
|
func GetEmployee(id int) (*Employee, error) {
|
||||||
db.Where("id = ?", id).First(&employee)
|
var employee Employee
|
||||||
return
|
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 {
|
func EditEmployee(id int, data interface{}) error {
|
||||||
db.Model(&Employee{}).Where("id = ?", id).Updates(data)
|
if err := db.Model(&Employee{}).Where("id = ? AND deleted_on = ?", id, 0).Updates(data).Error; err != nil {
|
||||||
return true
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func AddArticle(data map[string]interface{}) bool {
|
func AddEmployee(data map[string]interface{}) error {
|
||||||
db.Create(&Employee{
|
employee := Employee{
|
||||||
AvatarUrl: data["avatar_url"].(string),
|
AvatarUrl: data["avatar_url"].(string),
|
||||||
Username: data["username"].(string),
|
Username: data["username"].(string),
|
||||||
Password: data["password"].(string),
|
Password: data["password"].(string),
|
||||||
Department: data["department"].(string),
|
Department: data["department"].(string),
|
||||||
Position: data["position"].(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{})
|
db.Unscoped().Where("deleted_on != ?", 0).Delete(&Employee{})
|
||||||
|
|
||||||
return true
|
return true
|
||||||
|
|
|
@ -15,7 +15,7 @@ type Model struct {
|
||||||
ID int `gorm:"primary_key" json:"id"`
|
ID int `gorm:"primary_key" json:"id"`
|
||||||
CreatedOn int `json:"created_on"`
|
CreatedOn int `json:"created_on"`
|
||||||
ModifiedOn int `json:"modified_on"`
|
ModifiedOn int `json:"modified_on"`
|
||||||
DeleteOn int `json:"deleted_on"`
|
DeletedOn int `json:"deleted_on"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func Setup() {
|
func Setup() {
|
||||||
|
@ -82,13 +82,13 @@ func deleteCallback(scope *gorm.Scope) {
|
||||||
extraOption = fmt.Sprint(str)
|
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(
|
scope.Raw(fmt.Sprintf(
|
||||||
"update %v SET %v=%v%v%v",
|
"update %v SET %v=%v%v%v",
|
||||||
scope.QuotedTableName(),
|
scope.QuotedTableName(),
|
||||||
scope.Quote(deleteOnField.DBName),
|
scope.Quote(deletedOnField.DBName),
|
||||||
scope.AddToVars(time.Now().Unix()),
|
scope.AddToVars(time.Now().Unix()),
|
||||||
addExtraSpaceIfExist(scope.CombinedConditionSql()),
|
addExtraSpaceIfExist(scope.CombinedConditionSql()),
|
||||||
addExtraSpaceIfExist(extraOption),
|
addExtraSpaceIfExist(extraOption),
|
||||||
|
|
|
@ -1 +1,14 @@
|
||||||
package app
|
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
|
||||||
|
}
|
|
@ -1 +1,20 @@
|
||||||
package app
|
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
|
||||||
|
}
|
|
@ -1 +1,5 @@
|
||||||
package e
|
package e
|
||||||
|
|
||||||
|
const (
|
||||||
|
CacheEmployee = "Employee"
|
||||||
|
)
|
||||||
|
|
|
@ -12,6 +12,9 @@ const (
|
||||||
ErrorUploadCheckImageFail = 10006
|
ErrorUploadCheckImageFail = 10006
|
||||||
ErrorUploadCheckImageFormat = 10007
|
ErrorUploadCheckImageFormat = 10007
|
||||||
|
|
||||||
ErrorExistEmployee = 20001
|
ErrorExistEmployee = 20001
|
||||||
ErrorNotExistEmployee = 20002
|
ErrorNotExistEmployee = 20002
|
||||||
|
ErrorCheckExistEmployeeFail = 20003
|
||||||
|
ErrorGetEmployeeFail = 20004
|
||||||
|
ErrorCreatedEmployeeFail = 20005
|
||||||
)
|
)
|
||||||
|
|
|
@ -13,6 +13,9 @@ var MsgFlags = map[int]string{
|
||||||
ErrorUploadCheckImageFormat: "校验图片错误,图片格式或大小有问题",
|
ErrorUploadCheckImageFormat: "校验图片错误,图片格式或大小有问题",
|
||||||
ErrorExistEmployee: "已存在该员工用户名",
|
ErrorExistEmployee: "已存在该员工用户名",
|
||||||
ErrorNotExistEmployee: "该员工不存在",
|
ErrorNotExistEmployee: "该员工不存在",
|
||||||
|
ErrorCheckExistEmployeeFail: "该员工信息缓存失败",
|
||||||
|
ErrorGetEmployeeFail: "获取员工信息缓存失败",
|
||||||
|
ErrorCreatedEmployeeFail: "创建员工失败,入数据库",
|
||||||
}
|
}
|
||||||
|
|
||||||
func GetMsg(code int) string {
|
func GetMsg(code int) string {
|
||||||
|
|
|
@ -1 +1,100 @@
|
||||||
package gredis
|
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
|
||||||
|
}
|
||||||
|
|
|
@ -45,6 +45,16 @@ type Database struct {
|
||||||
|
|
||||||
var DatabaseSetting = &Database{}
|
var DatabaseSetting = &Database{}
|
||||||
|
|
||||||
|
type Redis struct {
|
||||||
|
Host string
|
||||||
|
Password string
|
||||||
|
MaxIdle int
|
||||||
|
MaxActive int
|
||||||
|
IdleTimeout time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
var RedisSetting = &Redis{}
|
||||||
|
|
||||||
func Setup() {
|
func Setup() {
|
||||||
Cfg, err := ini.Load("conf/app.ini")
|
Cfg, err := ini.Load("conf/app.ini")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -68,4 +78,11 @@ func Setup() {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalf("Cfg.MapTo DatabaseSetting err: %v", err)
|
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
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,92 +4,15 @@ import (
|
||||||
"github.com/astaxie/beego/validation"
|
"github.com/astaxie/beego/validation"
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/go-pripro/shop/models"
|
"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/e"
|
||||||
"github.com/go-pripro/shop/pkg/logging"
|
|
||||||
"github.com/go-pripro/shop/pkg/setting"
|
"github.com/go-pripro/shop/pkg/setting"
|
||||||
"github.com/go-pripro/shop/pkg/util"
|
"github.com/go-pripro/shop/pkg/util"
|
||||||
|
"github.com/go-pripro/shop/service/employee_service"
|
||||||
"github.com/unknwon/com"
|
"github.com/unknwon/com"
|
||||||
"net/http"
|
"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 新增员工
|
// @Summary 新增员工
|
||||||
// @Tags employees
|
// @Tags employees
|
||||||
// @Description
|
// @Description
|
||||||
|
@ -104,6 +27,7 @@ func GetEmployees(c *gin.Context) {
|
||||||
// @Success 200 {string} json "{"code": 200, "data":{}, "msg":"ok"}"
|
// @Success 200 {string} json "{"code": 200, "data":{}, "msg":"ok"}"
|
||||||
// @Router /admin/v1/employees [post]
|
// @Router /admin/v1/employees [post]
|
||||||
func AddEmployee(c *gin.Context) {
|
func AddEmployee(c *gin.Context) {
|
||||||
|
appG := app.Gin{C: c}
|
||||||
username := c.PostForm("username")
|
username := c.PostForm("username")
|
||||||
password := c.PostForm("password")
|
password := c.PostForm("password")
|
||||||
department := c.PostForm("department")
|
department := c.PostForm("department")
|
||||||
|
@ -116,32 +40,127 @@ func AddEmployee(c *gin.Context) {
|
||||||
valid.Required(department, "department").Message("部门不能为空")
|
valid.Required(department, "department").Message("部门不能为空")
|
||||||
valid.Required(position, "position").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 := make(map[string]interface{})
|
||||||
|
data["lists"] = employees
|
||||||
|
data["total"] = total
|
||||||
|
|
||||||
code := e.InvalidParams
|
appG.Response(http.StatusOK, e.SUCCESS, data)
|
||||||
|
|
||||||
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,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// @Summary 更新员工
|
// @Summary 更新员工
|
||||||
|
@ -159,7 +178,7 @@ func AddEmployee(c *gin.Context) {
|
||||||
// @Param state formData string false "员工状态"
|
// @Param state formData string false "员工状态"
|
||||||
// @Success 200 {string} json "{"code": 200, "data":{}, "msg":"ok"}"
|
// @Success 200 {string} json "{"code": 200, "data":{}, "msg":"ok"}"
|
||||||
// @Router /admin/v1/employees/{id} [put]
|
// @Router /admin/v1/employees/{id} [put]
|
||||||
func EditEmployee(c *gin.Context) {
|
func EditEmployee(c *gin.Context) {
|
||||||
id := com.StrTo(c.Param("id")).MustInt()
|
id := com.StrTo(c.Param("id")).MustInt()
|
||||||
avatarUrl := c.PostForm("avatar_url")
|
avatarUrl := c.PostForm("avatar_url")
|
||||||
username := c.PostForm("username")
|
username := c.PostForm("username")
|
||||||
|
@ -169,16 +188,16 @@ func EditEmployee(c *gin.Context) {
|
||||||
state := com.StrTo(c.PostForm("state")).MustInt()
|
state := com.StrTo(c.PostForm("state")).MustInt()
|
||||||
|
|
||||||
valid := validation.Validation{}
|
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")
|
valid.Range(state, 0, 1, "state").Message("状态只允许0或1")
|
||||||
|
|
||||||
data := make(map[string]interface{})
|
data := make(map[string]interface{})
|
||||||
code := e.InvalidParams
|
code := e.InvalidParams
|
||||||
|
|
||||||
if ! valid.HasErrors() {
|
if !valid.HasErrors() {
|
||||||
if models.ExistEmployeeByID(id) {
|
if _, err := models.ExistEmployeeByID(id); err == nil {
|
||||||
code = e.SUCCESS
|
code = e.SUCCESS
|
||||||
if avatarUrl != "" {
|
if avatarUrl != "" {
|
||||||
data["avatar_url"] = avatarUrl
|
data["avatar_url"] = avatarUrl
|
||||||
}
|
}
|
||||||
if username != "" {
|
if username != "" {
|
||||||
|
@ -202,12 +221,12 @@ func EditEmployee(c *gin.Context) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if code == 200 {
|
if code == 200 {
|
||||||
models.EditEmployee(id, data)
|
models.EditEmployee(id, data)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.JSON(http.StatusOK, gin.H{
|
c.JSON(http.StatusOK, gin.H{
|
||||||
"code" : code,
|
"code": code,
|
||||||
"msg" : e.GetMsg(code),
|
"msg": e.GetMsg(code),
|
||||||
"data": data,
|
"data": data,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
|
@ -1 +1,44 @@
|
||||||
package cache_service
|
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, "_")
|
||||||
|
}
|
|
@ -1 +1,133 @@
|
||||||
package employee_service
|
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
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue