Sfoglia il codice sorgente

登录编写为完成

tangs 7 anni fa
parent
commit
8b5c8561a2
4 ha cambiato i file con 138 aggiunte e 8 eliminazioni
  1. 10 1
      src/config.conf
  2. 37 3
      src/ddpf/login/login.go
  3. 53 3
      src/ddpf/model/session/session.go
  4. 38 1
      src/ddpf/model/user/login.go

+ 10 - 1
src/config.conf

@@ -1,2 +1,11 @@
+# 数据库连接地址
 db_url=user:password@tcp(localhost:5555)/dbname?charset=utf8
-listen_port=:8090
+
+# 程序监听的端口号
+listen_port=:8090
+
+# 用户同时登录最大数
+max_session_num=10
+
+# 用户的session有效时长,单位毫秒
+valid_session_time=7776000000 #3个月

+ 37 - 3
src/ddpf/login/login.go

@@ -3,8 +3,10 @@ package login
 import (
 	"net/http"
 	"ddpf/response"
-	"github.com/Tangmz/go-tool/log"
-	"github.com/Tangmz/go-tool/util"
+	"github.com/tangs-drm/go-tool/log"
+	"github.com/tangs-drm/go-tool/util"
+	"ddpf/model/user"
+	"ddpf/model/session"
 )
 
 func Login(w http.ResponseWriter, r *http.Request) {
@@ -22,10 +24,42 @@ func Login(w http.ResponseWriter, r *http.Request) {
 		err = util.Error("username/password contain a empty value")
 		log.Error("Login receive invalid username/password ->(%v)", err)
 		code = 1
-		msg = "参数错误"
+		msg = "用户名/密码为空"
 		return
 	}
 
 	// check user if exists
+	var isExist bool
+	isExist, err = user.ExistUser(username)
+	if err != nil {
+		log.Error("Login receive username(%v) ExistUser error ->(%v)", username, err)
+		code = 2
+		msg = "系统错误"
+		return
+	}
+	if !isExist {
+		log.Debug("Login receive username(%v) is not exist", username)
+		code = 3
+		msg = "用户不存在"
+		return
+	}
+
+	// check user password
+	var isCorrect bool
+	isCorrect, err = user.CheckPassword(username, password)
+	if err != nil {
+		log.Error("Login receive username(%v) check password error ->(%v)", username, err)
+		code = 4
+		msg = "系统错误"
+		return
+	}
+	if !isCorrect {
+		log.Debug("Login receive username(%v) password is incorrect", username)
+		code = 5
+		msg = "密码错误"
+		return
+	}
 
+	// 写cookie
+	//session.CreateSession()
 }

+ 53 - 3
src/ddpf/model/session/session.go

@@ -3,19 +3,69 @@ package session
 import (
 	"ddpf/model/dbm"
 	"github.com/tangs-drm/go-tool/util"
+	"github.com/tangs-drm/go-tool/log"
 )
 
+var ShowLog bool
+
+var Max_Session_Num = 10
+var Valid_Session_Time = 2592000000 // 一个月
+
 // CreateSession create user session
 // 没有uid最多同时5个地方登陆
 func CreateSession(uid string) (*Session, error) {
-	sess := &Session{
-		Id:"",
+	session := &Session{
+		Id:util.UUID(),
 		Uid:uid,
-		Time:util.
+		Time:util.Now(),
+		LastTime:util.Now(),
 	}
 	var sqlString string = "INSERT INTO SESSION(ID,UID,TIME,LASTTIME) VALUE(?,?,?,?);"
 	stmt, err := dbm.Db().Prepare(sqlString)
 	if err != nil {
+		log.Error("CreateSession Prepare by session(%v) error ->(%v)", util.S2Json(session), err)
+		return nil, err
+	}
+	defer stmt.Close()
+	_, err = stmt.Exec(session.Id, session.Uid, session.Time, session.LastTime)
+	if err != nil {
+		log.Error("CreateSession Exec by session(%v) error ->(%v)", util.S2Json(session), err)
 		return nil, err
 	}
+
+	log.Debug("CreateSession by id(%v), uid(%v), lastTime(%v) success", session.Id, session.Uid, session.LastTime)
+	return session, nil
 }
+
+// CheckValidSession 是检查用户的session是否有效
+// 检查的指标有session是否存在,有效的session个数,session的有效时间
+func CheckValidSession(session string) (bool, error) {
+	if len(session) < 1 {
+		return false, nil
+	}
+	var sqlString = "SELECT ID, LASTTIME FROM (SELECT ID, LASTTIME FROM SESSION ORDER BY LASTTIME DESC LIMIT ?) WHERE ID = ?;"
+	rows, err := dbm.Db().Query(sqlString, Max_Session_Num, session)
+	if err != nil {
+		log.Error("CheckValidSession Query by session(%v), Max_Session_Num(%v) error ->(%v)", session, Max_Session_Num, err)
+		return false, err
+	}
+	defer rows.Close()
+
+	if !rows.Next() {
+		return false, nil
+	}
+
+	var id string
+	var lastTime int64
+	err = rows.Scan(&id, &lastTime)
+	if err != nil {
+		log.Error("CheckValidSession Scan result by session(%v) error ->(%v)", session)
+		return false, err
+	}
+
+	validTime := lastTime + Valid_Session_Time
+	if validTime < util.Now() {
+		return false, nil
+	}
+	return true, nil
+}

+ 38 - 1
src/ddpf/model/user/login.go

@@ -1,5 +1,42 @@
 package user
 
-func Login(username string, password string) {
+import (
+	"ddpf/model/dbm"
+	"github.com/tangs-drm/go-tool/util"
+	"github.com/tangs-drm/go-tool/log"
+)
 
+// ExistUser 判断用户是否存在
+func ExistUser(account string) (bool, error) {
+	if len(account) < 1 {
+		return false, util.Error("uid is empty")
+	}
+	var sqlString string = "SELECT ID FROM USER WHERE ACCOUNT = ?;"
+	rows, err := dbm.Db().Query(sqlString, account)
+	if err != nil {
+		log.Error("ExistUser find user by account(%v) error ->(%v)", account, err)
+		return false, err
+	}
+	defer rows.Close()
+
+	if !rows.Next() {
+		return false, nil
+	}
+	return true, nil
 }
+
+// CheckPassword 检查用户的账户密码是否正确
+func CheckPassword(account, password string) (*User, error) {
+	var sqlString string = "SELECT ID FROM USER WHERE ACCOUNT = ? AND PASSWORD = ?;"
+	rows, err := dbm.Db().Query(sqlString, account, password)
+	if err != nil {
+		log.Error("CheckPassword check account(%v) error ->(%v)", account, err)
+		return nil, err
+	}
+	defer rows.Close()
+
+	if !rows.Next() {
+		return nil, nil
+	}
+	return true, nil
+}