网上搜的都比较浅显,咱们继续上一节从底层一步步往起搭。
大概可以分成这么几个部分:
1.Model设计和ORM框架
2.session和用户模块
3.商城首页信息和购物车模块
4.商品详情页(商品点赞和评论)
5.订单管理模块
6.商品秒杀模块
7.api调用控制模块
8.缓存
一、前端首页搭建
我比较喜欢先把前台搭出来。能看着个页面做东西才有思路。
从资源站上随便拔下来一个商城页面做demo。
(http://www.jq22.com/demo/BootstrapMoban201805062107/index.html)
右键另存为本地,全都不用改,把Vue框架里的index.html代码替换一下,资源文件夹放进去,直接启动就好。
二、用户Model
借鉴一下老哥的文档(https://www.cnblogs.com/suimei/p/6066645.html)
先建立三张表:用户表,用户详情表 ,用户授权表。
usermodel添加详情和授权表的字段,在gorm同步时会创建外键,如何定义类型在官方文档中也有介绍
(http://gorm.book.jasperxu.com/models.html#md)
//UserModel.go
package Model
import (
"time"
"github.com/jinzhu/gorm"
)
type UserModel struct {
gorm.Model //继承
UId string `gorm:"primary_key"` //Guid
UserName string
Avatar string //头像
Locked int //是否锁定
LastVisitTime time.Time //最后登录时间
RegisterTime time.Time //注册时间
Details UserDetailModel // One-To-One
Auths []UserAuthsModel // One-To-Many
}
type UserDetailModel struct {
UId string `gorm:"primary_key"` //Guid
Gender string //性别
RealName string //真实姓名
Email string
//以后再说
}
type UserAuthsModel struct {
AuthsID int `gorm:"primary_key"` //授权记录 自增就好
UId string //Guid
IdentityType string //登录类型:手机 邮箱 用户名 或第三方
Identifier string //标识:手机 邮箱 用户名或第三方的唯一标识
Credential string //密码凭证:密码或TOKEN
}
三、定义Model时使用了gorm框架,所以在main函数中也需要初始化一下gorm。
//main.go
func main() {
router := gin.Default()
RouterInit(router)
Helper.Dbinit()
router.Run(":8081")
}
//GormHelper.go
package Helper
import (
"../../GinMall/Model"
"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/mysql"
)
func Dbinit() *gorm.DB {
db := NewConn()
//SetMaxOpenConns用于设置最大打开的连接数
//SetMaxIdleConns用于设置闲置的连接数
db.DB().SetMaxIdleConns(10)
db.DB().SetMaxOpenConns(100)
// 启用Logger,显示详细日志
db.LogMode(true)
// 自动迁移模式
db.AutoMigrate(&Model.UserModel{},
&Model.UserDetailModel{},
&Model.UserAuthsModel{},
)
return db
}
func NewConn() *gorm.DB {
db, err := gorm.Open("mysql", "root:我的密码@/goweb?charset=utf8&parseTime=True&loc=Local")
if err != nil {
panic("连接数据库失败:" + err.Error())
}
return db
}
查了一下Go好像没有直接生成Guid的包,不过还好找到了现成代码。
//GuidHelper.go
package Helper
import (
"crypto/md5"
"crypto/rand"
"encoding/base64"
"encoding/hex"
"io"
)
//生成32位md5字串
func GetMd5String(s string) string {
h := md5.New()
h.Write([]byte(s))
return hex.EncodeToString(h.Sum(nil))
}
//生成Guid字串
func NewGuid() string {
b := make([]byte, 48)
if _, err := io.ReadFull(rand.Reader, b); err != nil {
return ""
}
return GetMd5String(base64.URLEncoding.EncodeToString(b))
}
网友评论