瀏覽代碼

修改二维码代码

renzheng 7 年之前
父節點
當前提交
24daed25c4
共有 4 個文件被更改,包括 189 次插入25 次删除
  1. 19 19
      src/jfw/front/front.go
  2. 136 4
      src/jfw/front/qrpool.go
  3. 30 0
      src/jfw/front/websocket.go
  4. 4 2
      src/main.go

+ 19 - 19
src/jfw/front/front.go

@@ -131,25 +131,25 @@ func init() {
 //从池中取二维码shareid
 func (f *Front) GetQR() error {
 	defer util.Catch()
-	pageType := f.GetString("pageType")
-	pngdataOne := QrPoolObj.GetQRCode()
-	var shareidOne = "0"
-	var shareidTwo = "0"
-	//log.Println(pageType, "---", pngdataOne.Qrcode, "-1--", len(*pngdataOne.Qrbyte), "--2-", pngdataOne.Starttime)
-	if pngdataOne != nil && pngdataOne.Qrbyte != nil && pngdataOne.Starttime != 0 {
-		shareidOne = pngdataOne.Qrcode
-	}
-	if pageType == "T" {
-		pngdataTwo := QrPoolObj.GetQRCode()
-		if pngdataTwo != nil && pngdataTwo.Qrbyte != nil && pngdataTwo.Starttime != 0 {
-			shareidTwo = pngdataTwo.Qrcode
-		}
-	}
-	//log.Println(shareidOne, "-------", shareidTwo)
-	f.ServeJson(map[string]string{
-		"num":   se.EncodeString(shareidOne),
-		"numot": se.EncodeString(shareidTwo),
-	})
+	//pageType := f.GetString("pageType")
+	//	pngdataOne := QrPoolObj.GetQRCode()
+	//	var shareidOne = "0"
+	//	var shareidTwo = "0"
+	//	//log.Println(pageType, "---", pngdataOne.Qrcode, "-1--", len(*pngdataOne.Qrbyte), "--2-", pngdataOne.Starttime)
+	//	if pngdataOne != nil && pngdataOne.Qrbyte != nil && pngdataOne.Starttime != 0 {
+	//		shareidOne = pngdataOne.Qrcode
+	//	}
+	//	if pageType == "T" {
+	//		pngdataTwo := QrPoolObj.GetQRCode()
+	//		if pngdataTwo != nil && pngdataTwo.Qrbyte != nil && pngdataTwo.Starttime != 0 {
+	//			shareidTwo = pngdataTwo.Qrcode
+	//		}
+	//	}
+	//	//log.Println(shareidOne, "-------", shareidTwo)
+	//	f.ServeJson(map[string]string{
+	//		"num":   se.EncodeString(shareidOne),
+	//		"numot": se.EncodeString(shareidTwo),
+	//	})
 	return nil
 }
 

+ 136 - 4
src/jfw/front/qrpool.go

@@ -2,15 +2,146 @@ package front
 
 import (
 	"fmt"
-	"jfw/tools"
-	"log"
-	"math/rand"
+	//	"jfw/tools"
+	//"log"
+	//"math/rand"
+	"qfw/util"
 	"qfw/util/redis"
-	"strconv"
+	//"strconv"
 	"sync"
 	"time"
 )
 
+var (
+	InvalidTime = int64(35 * 60) //定时任务判断二维码失效时间35分钟
+	ValidTime   = 30 * 60        //前端二维码有效时间30分钟
+	QrValid     = int64(28 * 86400)
+	PoolSize    = 100
+	RedisList   = "mylist"
+	QrGCList    = make([]*QrGC, PoolSize) //定义回收对象池
+)
+
+func init() {
+	//1.生成50个线程池
+	for i := 0; i < PoolSize; i++ {
+		q := &QrGC{make(chan string, 100), map[string]int64{}, &sync.Mutex{}, i}
+		go q.PoolGC()
+		go q.SetTimeGC()
+		QrGCList[i] = q
+	}
+}
+
+//二维码回收对象
+type QrGC struct {
+	CodePool chan string
+	CodeList map[string]int64
+	Lock     *sync.Mutex
+	Index    int
+}
+
+func (q *QrGC) Add(str string, t int64) {
+	q.Lock.Lock()
+	q.CodeList[str] = t
+	q.Lock.Unlock()
+}
+
+//二维码回收机制,定时回收
+func (q *QrGC) SetTimeGC() {
+	for {
+		time.Sleep(3 * time.Minute)
+		now := time.Now().Unix()
+		q.Lock.Lock()
+		for k, v := range q.CodeList {
+			if now-v > InvalidTime { //失效
+				delete(q.CodeList, k)
+				//补充逻辑
+			}
+		}
+		q.Lock.Unlock()
+	}
+}
+
+//二维码回收机制,使用完回收
+func (q *QrGC) PoolGC() {
+	for {
+		select {
+		case code := <-q.CodePool:
+			//调用回收逻辑
+			q.Lock.Lock()
+			delete(q.CodeList, code)
+			q.Lock.Unlock()
+			//删除redis中的参数,取出二维码的失效时间判断
+			//补充逻辑
+		}
+	}
+}
+
+//生成二维码串,定义24位串,返回时间,返回回收池索引
+var qrSimpleEncrypt = &util.SimpleEncrypt{"qrcode_jywx2017"}
+
+//生成二维码代码
+func NewQrCodeStr() (string, int64, int) {
+	now := time.Now()
+	str := fmt.Sprintf("A%s%d%s", util.GetLetterRandom(4), now.UnixNano()/1000, util.GetLetterRandom(3))
+	str = qrSimpleEncrypt.EncodeString(str)
+	return str, now.Unix(), HashVal(str) % PoolSize
+}
+
+//计算哈希值
+func HashVal(src string) int {
+	check := 0
+	for i := len(src) / 2; i < len(src); i++ {
+		check += int(src[i])
+	}
+	return check
+}
+
+//计算二维码
+func ComputeQrCode(str string) int64 {
+	str1 := qrSimpleEncrypt.DecodeString(str)
+	if len(str1) == 24 {
+		return util.Int64All(str1[5:15])
+	}
+	return 0
+}
+
+//获取二维码代码
+func GetQRCode() (code string) {
+	ret := redis.LPOP("sso", RedisList)
+	bnew := false
+	res := ""
+	if ret != nil {
+		res, _ = ret.(string)
+		if len(res) != 24 || time.Now().Unix()-ComputeQrCode(res) > QrValid { //过期
+			bnew = true
+		} else {
+			qrgc := QrGCList[HashVal(res)%PoolSize]
+			qrgc.Add(res, time.Now().Unix())
+		}
+	} else {
+		bnew = true
+	}
+	if bnew {
+		str, times, index := NewQrCodeStr()
+		qrgc := QrGCList[index]
+		qrgc.Add(str, times)
+		return str
+	}
+	return res
+}
+
+//获取二维码图片
+func GetQRData(code string) (pngdata *[]byte) {
+	tmp, err := redis.GetBytes("sso", "qr_"+code)
+	if err == nil {
+		if tmp == nil {
+
+		}
+	}
+	return nil
+}
+
+/**
 //var QrMap = map[string]*SingleQR{}
 //var QrMapLock = &sync.RWMutex{}
 
@@ -112,3 +243,4 @@ func WXQRData(shareid string) (pngdata *SingleQR) {
 	}
 	return
 }
+**/

+ 30 - 0
src/jfw/front/websocket.go

@@ -0,0 +1,30 @@
+package front
+
+import (
+	"log"
+	"net/http"
+	qutil "qfw/util"
+
+	"github.com/go-xweb/xweb"
+	"github.com/gorilla/websocket"
+)
+
+var upgrader = websocket.Upgrader{
+	ReadBufferSize:  1024,
+	WriteBufferSize: 1024,
+}
+
+func ServeWss(w http.ResponseWriter, r *http.Request) {
+	defer qutil.Catch()
+	conn, err := upgrader.Upgrade(w, r, nil)
+	if err := conn.WriteMessage(websocket.TextMessage, []byte(`{"hello":"ok"}`)); err != nil {
+		log.Println("socket send fail..", err)
+	}
+	sess := xweb.RootApp().SessionManager.Session(r, w)
+	log.Println(sess.Id())
+	if err != nil {
+		log.Println(err)
+		return
+	}
+	//conn.Ch = make(chan bool, 1)
+}

+ 4 - 2
src/main.go

@@ -19,7 +19,7 @@ import (
 
 	"github.com/go-xweb/httpsession"
 	"github.com/go-xweb/xweb"
-	"golang.org/x/net/websocket"
+	//"golang.org/x/net/websocket"
 )
 
 func init() {
@@ -55,7 +55,9 @@ func main() {
 			xweb.RunTLS(":"+Sysconfig["webport"].(string), config)
 		*/
 		mux1 := http.NewServeMux()
-		mux1.Handle("/ws", websocket.Handler(front.ServeWs))
+
+		//mux1.Handle("/ws", websocket.Handler(front.ServeWs))
+		mux1.Handle("/ws", front.ServeWss)
 		mux1.Handle("/qrToLab", websocket.Handler(front.QrToLab))
 		xweb.RunBase(":"+Sysconfig["webport"].(string), mux1)
 		//xweb.Run(":" + Sysconfig["webport"].(string))