现在我们就完成了登录、注册、聊天 C 端界面的构建工作:

文章插图

文章插图
③注册、登录和鉴权
之前我们提到过 , 对于注册、登录和好友关系管理 , 我们需要有一张 user 表来存储用户信息 。
我们使用 github.com/go-xorm/xorm 来操作 MySQL , 首先看一下 MySQL 表的设计:
app/model/user.go:
package modelimport "time"const (SexWomen = "W"SexMan = "M"SexUnknown = "U" )type User struct {Idint64`xorm:"pk autoincr bigint(64)" form:"id" json:"id"`Mobilestring`xorm:"varchar(20)" form:"mobile" json:"mobile"`Passwdstring `xorm:"varchar(40)" form:"passwd" json:"-"`// 用户密码 md5(passwd + salt)Avatarstring`xorm:"varchar(150)" form:"avatar" json:"avatar"`Sexstring`xorm:"varchar(2)" form:"sex" json:"sex"`Nicknamestring`xorm:"varchar(20)" form:"nickname" json:"nickname"`Saltstring`xorm:"varchar(10)" form:"salt" json:"-"`Onlineint`xorm:"int(10)" form:"online" json:"online"`//是否在线Tokenstring`xorm:"varchar(40)" form:"token" json:"token"`//用户鉴权Memostring`xorm:"varchar(140)" form:"memo" json:"memo"`Createattime.Time`xorm:"datetime" form:"createat" json:"createat"`//创建时间, 统计用户增量时使用 } 我们 user 表中存储了用户名、密码、头像、用户性别、手机号等一些重要的信息 , 比较重要的是我们也存储了 Token 标示用户在用户登录之后 , HTTP 协议升级为 WebSocket 协议进行鉴权 , 这个细节点我们前边提到过 , 下边会有代码演示 。接下来我们看一下 model 初始化要做的一些事情吧:
app/model/init.go:
package modelimport ("errors""fmt"_ "github.com/go-sql-driver/mysql""github.com/go-xorm/xorm""log" )var DbEngine *xorm.Enginefunc init() {driverName := "mysql"dsnName := "root:root@(127.0.0.1:3306)/chat?charset=utf8"err := errors.New("")DbEngine, err = xorm.NewEngine(driverName, dsnName)if err != nil && err.Error() != ""{log.Fatal(err)}DbEngine.ShowSQL(true)//设置数据库连接数DbEngine.SetMaxOpenConns(10)//自动创建数据库DbEngine.Sync(new(User), new(Community), new(Contact))fmt.Println("init database ok!") } 我们创建一个 DbEngine 全局 MySQL 连接对象 , 设置了一个大小为 10 的连接池 。Model 包里的 init 函数在程序加载的时候会先执行 , 对 Go 语言熟悉的同学应该知道这一点 。
我们还设置了一些额外的参数用于调试程序 , 比如:设置打印运行中的 SQL , 自动的同步数据表等 , 这些功能在生产环境中可以关闭 。
我们的 Model 初始化工作就做完了 , 非常简陋 , 在实际的项目中 , 像数据库的用户名、密码、连接数和其他的配置信息 , 建议设置到配置文件中 , 然后读取 , 而不像本文硬编码的程序中 。
注册是一个普通的 API 程序 , 对于 Go 语言来说 , 完成这件工作太简单了 , 我们来看一下代码:
############################ //app/controller/user.go ############################ ...... //用户注册 func UserRegister(writer http.ResponseWriter, request *http.Request) {var user model.Userutil.Bind(request, &user)user, err := UserService.UserRegister(user.Mobile, user.Passwd, user.Nickname, user.Avatar, user.Sex)if err != nil {util.RespFail(writer, err.Error())} else {util.RespOk(writer, user, "")} } ...... ############################ //app/service/user.go ############################ ...... type UserService struct{}//用户注册 func (s *UserService) UserRegister(mobile, plainPwd, nickname, avatar, sex string) (user model.User, err error) {registerUser := model.User{}_, err = model.DbEngine.Where("mobile=? ", mobile).Get(®isterUser)if err != nil {return registerUser, err}//如果用户已经注册,返回错误信息if registerUser.Id > 0 {return registerUser, errors.New("该手机号已注册")}registerUser.Mobile = mobileregisterUser.Avatar = avatarregisterUser.Nickname = nicknameregisterUser.Sex = sexregisterUser.Salt = fmt.Sprintf("%06d", rand.Int31n(10000))registerUser.Passwd = util.MakePasswd(plainPwd, registerUser.Salt)registerUser.Createat = time.Now()//插入用户信息_, err = model.DbEngine.InsertOne(®isterUser)return registerUser,err } ...... ############################ //main.go ############################ ...... func main() {http.HandleFunc("/user/register", controller.UserRegister) }
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 如何快速处理mysql连接数占满的问题?
- 快速剥蒜的小窍门
- 淘宝怎样升级最新版本 淘宝如何快速升级
- 7大面试技巧,让你成为“面霸”,快速找到心仪的工作
- 抗癌效果最好的几种茶,四大步骤教你如何简易而快速的冲泡百合花茶
- MySQL如何快速插入数据
- 十种最神奇的快速减肥偏方,揭密11种美容消脂茶饮的配方
- 如何将5G大文件快速传给对方?1个小软件2分钟搞定
- 如何防止买到假货?帮助你快速识别10个著名品牌真伪的技巧
- 淘宝特价红包怎么用 淘宝特价如何快速邀请
