一.登录功能流程图

  • 用户登录后判断帐号和密码是否正确,其中帐号可以是用户名、电话、邮箱.
  • 服务器端判断后返回EgoResult结构体对应的JSON数据,其中Status=200表示成功,成功后页面跳转到/index,Status只要不为200都表示登录失败,页面给出提示框告诉用户登录失败
  • 流程图

二.登录代码实现

  • 在src下新建user目录
  • 在user下新建TbUser.go文件,编写实体
  1. package user
  2. //对应数据库中用户表
  3. type TbUser struct {
  4. //属性首字母大写:1. 要转换为json 2. 可能出现跨包访问
  5. Id int64
  6. Username string
  7. Password string
  8. Phone string
  9. Email string
  10. Created string
  11. Updated string
  12. }
  • 在user下新建TbUserDao.go文件,编写数据访问代码
  1. package user
  2. import (
  3. "commons"
  4. "fmt"
  5. )
  6. //根据用户名和密码查询,如果返回值为nil表示查询失败,否则成功
  7. func SelByUnPwdDao(un, pwd string) *TbUser{
  8. sql := "select * from tb_user where username=? and password=? or email=? and password=? or phone=? and password=?"
  9. rows,err:=commons.Dql(sql, un, pwd, un, pwd, un, pwd)
  10. if err!=nil{
  11. fmt.Println(err)
  12. return nil
  13. }
  14. if rows.Next(){
  15. user:=new(TbUser)
  16. rows.Scan(&user.Id,&user.Username,&user.Password,&user.Phone,&user.Email,&user.Created,&user.Updated)
  17. commons.CloseConn()
  18. return user
  19. }
  20. return nil
  21. }
  • 在user下新建TbUserService.go 编写业务逻辑代码
  1. package user
  2. import "commons"
  3. func LoginService(un,pwd string) (er commons.EgoResult){
  4. u:=SelByUnPwdDao(un,pwd)
  5. if u!=nil{
  6. er.Status=200
  7. }else{
  8. er.Status=400
  9. }
  10. return
  11. }
  • 在user下新建TbUserController.go编写控制器代码
  1. package user
  2. import (
  3. "net/http"
  4. "encoding/json"
  5. )
  6. //所有user模块的handler
  7. func UserHandler() {
  8. http.HandleFunc("/login", loginController)
  9. }
  10. //登录
  11. func loginController(w http.ResponseWriter, r *http.Request) {
  12. username := r.FormValue("username")
  13. password := r.FormValue("password")
  14. er := LoginService(username, password)
  15. //把结构体转换为json数据
  16. b, _ := json.Marshal(er)
  17. //设置响应内容为json
  18. w.Header().Set("Content-Type", "application/json;charset=utf-8")
  19. w.Write(b)
  20. }
  • 在main.go中引用UserHandler()让user模块所有控制器生效
  1. func main() {
  2. s := http.Server{Addr: ":80"}
  3. http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("static"))))
  4. http.HandleFunc("/", welcome)
  5. //用户相关
  6. user.UserHandler()
  7. s.ListenAndServe()
  8. }