在登陆系统中我们我们时常要去校验密码是否正确,而数据库中的密码是密文形式在Gin中我们需要自行去进行封装一个MD5加密的方法
在我们的框架(原来封装过得)中app/Common.go
// MD5 加密
func MD5(v string) string {
d := []byte(v)
m := md5.New()
m.Write(d)
return hex.EncodeToString(m.Sum(nil))
}
之后在逻辑层进行调用就ok
在展示数据的时候,gorm虽然可以自动帮你维护 created_at、updated_at、deleted_at这些关键时间字段,但是时间格式展示出来是
读取到的时间字段往往是这样:"2022-07-03T22:14:02.973528+08:00",带着时区和毫秒。不是我们想要得在这里我用两种方法来解决
a、返回的时间戳详解golang gorm中格式化时间问题 - 编程宝库 (codebaoku.com)
在服务层进行书写 app/service
import (
"time"
//"strconv"
"fmt"
"database/sql/driver"
"strconv"
)
type LocalTime struct {
time.Time
}
func (t LocalTime) MarshalJSON() ([]byte, error) {
//格式化秒
seconds := t.Unix()
return []byte(strconv.FormatInt(seconds, 10)), nil
}
func (t LocalTime) Value() (driver.Value, error) {
var zeroTime time.Time
if t.Time.UnixNano() == zeroTime.UnixNano() {
return nil, nil
}
return t.Time, nil
}
func (t *LocalTime) Scan(v interface{}) error {
value, ok := v.(time.Time)
if ok {
*t = LocalTime{Time: value}
return nil
}
return fmt.Errorf("can not convert %v to timestamp", v)
}
b、正常返回年月日时分秒GO项目实战 — Gorm格式化时间字段 - Go语言中文网 - Golang中文社区 (studygolang.com)
可以使用自带的sql.NullTime
可以自定义支持的时间格式
import (
"database/sql"
"database/sql/driver"
"time"
)
const (
YYYY_MM_DD = "2006-01-02"
YYYY_MM_DD_HH_MM_SS = "2006-01-02 15:04:05"
)
type WrapTime sql.NullTime
func (t *WrapTime) UnmarshalJSON(data []byte) (err error) {
if string(data) == "null" {
t.Valid = false
return nil
}
var now time.Time
if len(string(data)) == len(YYYY_MM_DD)+2 {
now, err = time.ParseInLocation(`"`+YYYY_MM_DD+`"`, string(data), time.Local)
t.Valid = true
t.Time = now
} else {
now, err = time.ParseInLocation(`"`+YYYY_MM_DD_HH_MM_SS+`"`, string(data), time.Local)
t.Valid = true
t.Time = now
}
return
}
func (t WrapTime) MarshalJSON() ([]byte, error) {
if !t.Valid {
return []byte("null"), nil
}
b := make([]byte, 0, len(YYYY_MM_DD_HH_MM_SS)+2)
b = append(b, '"')
b = t.Time.AppendFormat(b, YYYY_MM_DD_HH_MM_SS)
b = append(b, '"')
return b, nil
}
func (t WrapTime) String() string {
if !t.Valid {
return "null"
}
return t.Time.Format(YYYY_MM_DD_HH_MM_SS)
}
// Value insert timestamp into mysql need this function.
func (t WrapTime) Value() (driver.Value, error) {
if !t.Valid {
return nil, nil
}
return t.Time, nil
}
// Scan value time.Time
func (t *WrapTime) Scan(v interface{}) error {
return (*sql.NullTime)(t).Scan(v)
}
func NewWrapTime(t time.Time) WrapTime {
if t.IsZero() {
return WrapTime{Valid: false}
}
return WrapTime{Valid: true, Time: t}
}
models层数据格式需要修正 引入需要与上面app/service 定义的一致
希望对大家有帮助