|
@@ -1,206 +1,231 @@
|
|
|
package jyutil
|
|
|
|
|
|
import (
|
|
|
- "app.yhyue.com/moapp/jypkg/compatible"
|
|
|
- "encoding/json"
|
|
|
- "fmt"
|
|
|
- "io/ioutil"
|
|
|
- "jy/src/jfw/config"
|
|
|
- "log"
|
|
|
- "net/http"
|
|
|
- "reflect"
|
|
|
- "regexp"
|
|
|
- "sort"
|
|
|
- "strings"
|
|
|
- "time"
|
|
|
+ "app.yhyue.com/moapp/jybase/go-xweb/httpsession"
|
|
|
+ "app.yhyue.com/moapp/jypkg/compatible"
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+ "io/ioutil"
|
|
|
+ "jy/src/jfw/config"
|
|
|
+ "log"
|
|
|
+ "net/http"
|
|
|
+ "reflect"
|
|
|
+ "regexp"
|
|
|
+ "sort"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+ "time"
|
|
|
|
|
|
- util "app.yhyue.com/moapp/jybase/common"
|
|
|
- "app.yhyue.com/moapp/jybase/encrypt"
|
|
|
- . "app.yhyue.com/moapp/jybase/mongodb"
|
|
|
- "app.yhyue.com/moapp/jybase/redis"
|
|
|
- "app.yhyue.com/moapp/jypkg/public"
|
|
|
+ util "app.yhyue.com/moapp/jybase/common"
|
|
|
+ "app.yhyue.com/moapp/jybase/encrypt"
|
|
|
+ . "app.yhyue.com/moapp/jybase/mongodb"
|
|
|
+ "app.yhyue.com/moapp/jybase/redis"
|
|
|
+ "app.yhyue.com/moapp/jypkg/public"
|
|
|
)
|
|
|
|
|
|
-var mongodb = public.MQFW
|
|
|
-var se = &encrypt.SimpleEncrypt{Key: "topnet2015topnet2015"}
|
|
|
+var (
|
|
|
+ mongodb = public.MQFW
|
|
|
+ se = &encrypt.SimpleEncrypt{Key: "topnet2015topnet2015"}
|
|
|
+ Compatible = compatible.NewCompatible(&mongodb, public.BaseMysql, public.Mysql, config.Middleground)
|
|
|
+ AC = &encrypt.AES_CBC{
|
|
|
+ Key: "mGlAgnIBB8bx2nch",
|
|
|
+ Iv: "1389461544135476",
|
|
|
+ }
|
|
|
+ KeepLoginTimeKey = "keeplogin_%s"
|
|
|
+ KeepLoginCookieName = "klcn_value"
|
|
|
+)
|
|
|
|
|
|
-var Compatible = compatible.NewCompatible(&mongodb, public.BaseMysql, public.Mysql, config.Middleground)
|
|
|
-var AC = &encrypt.AES_CBC{
|
|
|
- Key: "mGlAgnIBB8bx2nch",
|
|
|
- Iv: "1389461544135476",
|
|
|
+// SetCookieValueForAutoLogin 为延长用户登录时间 往cookie 中加入标识,在过滤器判断是否自动登录
|
|
|
+func SetCookieValueForAutoLogin(rw http.ResponseWriter, baseUserId int64) {
|
|
|
+ log.Println("-----111--------;", rw.Header())
|
|
|
+ http.SetCookie(rw, func() *http.Cookie {
|
|
|
+ expiresHour := util.IntAll(config.Sysconfig["setSessionTimeout"])
|
|
|
+ maxAge := int(time.Hour * time.Duration(expiresHour) / time.Second) //30天,单位秒
|
|
|
+ expires := time.Now().Add(time.Duration(expiresHour) * time.Hour)
|
|
|
+ cookie := &http.Cookie{
|
|
|
+ Name: KeepLoginCookieName,
|
|
|
+ Value: se.EncodeString(strconv.FormatInt(baseUserId, 10)),
|
|
|
+ Path: "/",
|
|
|
+ HttpOnly: false,
|
|
|
+ MaxAge: maxAge,
|
|
|
+ Expires: expires,
|
|
|
+ Domain: httpsession.Domain,
|
|
|
+ }
|
|
|
+ return cookie
|
|
|
+ }())
|
|
|
}
|
|
|
|
|
|
-//
|
|
|
+// FindMyShareId 分享id
|
|
|
func FindMyShareId(activecode, openid string) string {
|
|
|
- defer util.Catch()
|
|
|
- ret, bres := mongodb.Find("person_share", "{'s_openid':'"+openid+"','s_businesscode':'"+activecode+"'}", `{"l_timestamp":-1}`, nil, true, -1, -1)
|
|
|
- var shareid string
|
|
|
- if bres {
|
|
|
- var shareData = make(map[string]interface{})
|
|
|
- var str = ""
|
|
|
- for _, v := range *ret {
|
|
|
- str = util.ObjToString(v["i_shareid"])
|
|
|
- }
|
|
|
- var tt = `^\d+$`
|
|
|
- a, _ := regexp.Compile(tt)
|
|
|
- if str == "" || a.MatchString(str) {
|
|
|
- data := make(map[string]interface{})
|
|
|
- data["s_openid"] = openid
|
|
|
- data["s_businesscode"] = activecode
|
|
|
- data["i_shareid"] = se.EncodeString(openid + "---" + activecode)
|
|
|
- data["l_timestamp"] = time.Now().Unix()
|
|
|
- mongodb.Save("person_share", data)
|
|
|
- shareid = openid + "---" + activecode
|
|
|
- } else {
|
|
|
- shareid = se.DecodeString(str)
|
|
|
- }
|
|
|
- odata := redis.Get("sso", "p_shareData_"+shareid)
|
|
|
- if odata == nil {
|
|
|
- shareData["action"] = "32"
|
|
|
- redis.Put("sso", "p_shareData_"+shareid, shareData, 24*60*60)
|
|
|
- }
|
|
|
- }
|
|
|
- return shareid
|
|
|
+ defer util.Catch()
|
|
|
+ ret, bres := mongodb.Find("person_share", "{'s_openid':'"+openid+"','s_businesscode':'"+activecode+"'}", `{"l_timestamp":-1}`, nil, true, -1, -1)
|
|
|
+ var shareid string
|
|
|
+ if bres {
|
|
|
+ var shareData = make(map[string]interface{})
|
|
|
+ var str = ""
|
|
|
+ for _, v := range *ret {
|
|
|
+ str = util.ObjToString(v["i_shareid"])
|
|
|
+ }
|
|
|
+ var tt = `^\d+$`
|
|
|
+ a, _ := regexp.Compile(tt)
|
|
|
+ if str == "" || a.MatchString(str) {
|
|
|
+ data := make(map[string]interface{})
|
|
|
+ data["s_openid"] = openid
|
|
|
+ data["s_businesscode"] = activecode
|
|
|
+ data["i_shareid"] = se.EncodeString(openid + "---" + activecode)
|
|
|
+ data["l_timestamp"] = time.Now().Unix()
|
|
|
+ mongodb.Save("person_share", data)
|
|
|
+ shareid = openid + "---" + activecode
|
|
|
+ } else {
|
|
|
+ shareid = se.DecodeString(str)
|
|
|
+ }
|
|
|
+ odata := redis.Get("sso", "p_shareData_"+shareid)
|
|
|
+ if odata == nil {
|
|
|
+ shareData["action"] = "32"
|
|
|
+ redis.Put("sso", "p_shareData_"+shareid, shareData, 24*60*60)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return shareid
|
|
|
}
|
|
|
|
|
|
//获取用户openid
|
|
|
func Getopenid(code string) (openid string) {
|
|
|
- defer util.Catch()
|
|
|
- recturl := fmt.Sprintf(config.Wxoauthinfo, code)
|
|
|
- resp, err := http.Get(recturl)
|
|
|
- if err != nil {
|
|
|
- log.Println(err.Error())
|
|
|
- return
|
|
|
- }
|
|
|
- defer resp.Body.Close()
|
|
|
- bs, _ := ioutil.ReadAll(resp.Body)
|
|
|
- data := map[string]interface{}{}
|
|
|
- json.Unmarshal(bs, &data)
|
|
|
- openid, _ = data["openid"].(string)
|
|
|
- return
|
|
|
+ defer util.Catch()
|
|
|
+ recturl := fmt.Sprintf(config.Wxoauthinfo, code)
|
|
|
+ resp, err := http.Get(recturl)
|
|
|
+ if err != nil {
|
|
|
+ log.Println(err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ defer resp.Body.Close()
|
|
|
+ bs, _ := ioutil.ReadAll(resp.Body)
|
|
|
+ data := map[string]interface{}{}
|
|
|
+ json.Unmarshal(bs, &data)
|
|
|
+ openid, _ = data["openid"].(string)
|
|
|
+ return
|
|
|
}
|
|
|
|
|
|
//
|
|
|
func GetSessionVal(q map[string]interface{}) (*map[string]interface{}, map[string]interface{}) {
|
|
|
- person, ok := public.MQFW.FindOneByField("user", q, `{"_id":1,"i_shareknow":1,"s_m_openid":1,"s_nickname":1,"s_headimage":1,"s_headimageurl":1,"s_phone":1,"s_m_phone":1,"l_registedate":1,"i_ispush":1,"i_unlimited":1,"s_jyname":1,"base_user_id":1}`)
|
|
|
- sessionVal := make(map[string]interface{})
|
|
|
- if !ok || person == nil || len(*person) == 0 {
|
|
|
- return nil, sessionVal
|
|
|
- }
|
|
|
- sessionVal["user"] = *person
|
|
|
- if (*person)["i_shareknow"] != nil {
|
|
|
- sessionVal["shareknow"] = (*person)["i_shareknow"]
|
|
|
- }
|
|
|
- sessionVal["userId"] = BsonIdToSId((*person)["_id"])
|
|
|
- sessionVal["mgoUserId"] = sessionVal["userId"]
|
|
|
- nickName, _ := (*person)["s_nickname"].(string)
|
|
|
- phone := util.ObjToString((*person)["s_phone"])
|
|
|
- if nickName == "" {
|
|
|
- if phone != "" && len(phone) > 3 {
|
|
|
- nickName = string(phone[0:3]) + "****" + string(phone[len(phone)-4:])
|
|
|
- }
|
|
|
- }
|
|
|
- if util.ObjToString((*person)["s_jyname"]) != "" {
|
|
|
- sessionVal["s_jyname"] = util.ObjToString((*person)["s_jyname"])
|
|
|
- }
|
|
|
- sessionVal["s_nickname"] = nickName
|
|
|
- sessionVal["nickname"] = nickName
|
|
|
- avatar, _ := (*person)["s_headimageurl"].(string)
|
|
|
- if avatar == "" {
|
|
|
- avatar, _ = (*person)["s_headimage"].(string)
|
|
|
- }
|
|
|
- sessionVal["s_avatar"] = strings.Replace(avatar, "http://", "https://", 1)
|
|
|
- sessionVal["s_m_openid"], _ = (*person)["s_m_openid"].(string)
|
|
|
- sessionVal["openid"] = sessionVal["s_m_openid"]
|
|
|
- if phone == "" {
|
|
|
- phone = util.ObjToString((*person)["s_m_phone"])
|
|
|
- }
|
|
|
- sessionVal["phone"] = phone
|
|
|
- sessionVal["i_unlimited"] = util.IntAll((*person)["i_unlimited"])
|
|
|
- sessionVal["base_user_id"] = util.IntAll((*person)["base_user_id"]) //用户中台的uid
|
|
|
- return person, sessionVal
|
|
|
+ person, ok := public.MQFW.FindOneByField("user", q, `{"_id":1,"i_shareknow":1,"s_m_openid":1,"s_nickname":1,"s_headimage":1,"s_headimageurl":1,"s_phone":1,"s_m_phone":1,"l_registedate":1,"i_ispush":1,"i_unlimited":1,"s_jyname":1,"base_user_id":1}`)
|
|
|
+ sessionVal := make(map[string]interface{})
|
|
|
+ if !ok || person == nil || len(*person) == 0 {
|
|
|
+ return nil, sessionVal
|
|
|
+ }
|
|
|
+ sessionVal["user"] = *person
|
|
|
+ if (*person)["i_shareknow"] != nil {
|
|
|
+ sessionVal["shareknow"] = (*person)["i_shareknow"]
|
|
|
+ }
|
|
|
+ sessionVal["userId"] = BsonIdToSId((*person)["_id"])
|
|
|
+ sessionVal["mgoUserId"] = sessionVal["userId"]
|
|
|
+ nickName, _ := (*person)["s_nickname"].(string)
|
|
|
+ phone := util.ObjToString((*person)["s_phone"])
|
|
|
+ if nickName == "" {
|
|
|
+ if phone != "" && len(phone) > 3 {
|
|
|
+ nickName = string(phone[0:3]) + "****" + string(phone[len(phone)-4:])
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if util.ObjToString((*person)["s_jyname"]) != "" {
|
|
|
+ sessionVal["s_jyname"] = util.ObjToString((*person)["s_jyname"])
|
|
|
+ }
|
|
|
+ sessionVal["s_nickname"] = nickName
|
|
|
+ sessionVal["nickname"] = nickName
|
|
|
+ avatar, _ := (*person)["s_headimageurl"].(string)
|
|
|
+ if avatar == "" {
|
|
|
+ avatar, _ = (*person)["s_headimage"].(string)
|
|
|
+ }
|
|
|
+ sessionVal["s_avatar"] = strings.Replace(avatar, "http://", "https://", 1)
|
|
|
+ sessionVal["s_m_openid"], _ = (*person)["s_m_openid"].(string)
|
|
|
+ sessionVal["openid"] = sessionVal["s_m_openid"]
|
|
|
+ if phone == "" {
|
|
|
+ phone = util.ObjToString((*person)["s_m_phone"])
|
|
|
+ }
|
|
|
+ sessionVal["phone"] = phone
|
|
|
+ sessionVal["i_unlimited"] = util.IntAll((*person)["i_unlimited"])
|
|
|
+ sessionVal["base_user_id"] = util.IntAll((*person)["base_user_id"]) //用户中台的uid
|
|
|
+ return person, sessionVal
|
|
|
}
|
|
|
|
|
|
//value 用户sessionid
|
|
|
func LoginRedisKey(userid string) string {
|
|
|
- return fmt.Sprintf("login_%s", userid)
|
|
|
+ return fmt.Sprintf("login_%s", userid)
|
|
|
}
|
|
|
|
|
|
// 排序 排序键必须为数字类型
|
|
|
type SortBy struct {
|
|
|
- Data []map[string]interface{}
|
|
|
- Sortkey string
|
|
|
+ Data []map[string]interface{}
|
|
|
+ Sortkey string
|
|
|
}
|
|
|
|
|
|
func (a SortBy) Len() int { return len(a.Data) }
|
|
|
|
|
|
func (a SortBy) Swap(i, j int) {
|
|
|
- a.Data[i], a.Data[j] = a.Data[j], a.Data[i]
|
|
|
+ a.Data[i], a.Data[j] = a.Data[j], a.Data[i]
|
|
|
}
|
|
|
|
|
|
func (a SortBy) Less(i, j int) bool {
|
|
|
- //return Float64(a.Data[i][a.Sortkey]) < Float64(a.Data[j][a.Sortkey])
|
|
|
- m := a.Data[i][a.Sortkey]
|
|
|
- n := a.Data[j][a.Sortkey]
|
|
|
- w := reflect.ValueOf(m)
|
|
|
- v := reflect.ValueOf(n)
|
|
|
- switch v.Kind() {
|
|
|
- case reflect.String:
|
|
|
- return w.String() < v.String()
|
|
|
- case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
|
- return w.Int() < v.Int()
|
|
|
- case reflect.Float64, reflect.Float32:
|
|
|
- return w.Float() < v.Float()
|
|
|
- default:
|
|
|
- return fmt.Sprintf("%v", w) < fmt.Sprintf("%v", v)
|
|
|
- }
|
|
|
+ //return Float64(a.Data[i][a.Sortkey]) < Float64(a.Data[j][a.Sortkey])
|
|
|
+ m := a.Data[i][a.Sortkey]
|
|
|
+ n := a.Data[j][a.Sortkey]
|
|
|
+ w := reflect.ValueOf(m)
|
|
|
+ v := reflect.ValueOf(n)
|
|
|
+ switch v.Kind() {
|
|
|
+ case reflect.String:
|
|
|
+ return w.String() < v.String()
|
|
|
+ case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
|
|
+ return w.Int() < v.Int()
|
|
|
+ case reflect.Float64, reflect.Float32:
|
|
|
+ return w.Float() < v.Float()
|
|
|
+ default:
|
|
|
+ return fmt.Sprintf("%v", w) < fmt.Sprintf("%v", v)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
// ture 倒序3, 2, 1
|
|
|
//fmt.Println(m)
|
|
|
func SortData(data interface{}, sortkey string, reverse bool) {
|
|
|
- //func SortData(data interface{}, sortkey string, reverse bool) {
|
|
|
- var db []map[string]interface{}
|
|
|
- err := Bind(data, &db)
|
|
|
- if err != nil {
|
|
|
- fmt.Println(err)
|
|
|
- return
|
|
|
- }
|
|
|
- stb := SortBy{db, sortkey}
|
|
|
- if !reverse {
|
|
|
- sort.Sort(stb)
|
|
|
- } else {
|
|
|
- sort.Sort(sort.Reverse(stb))
|
|
|
- }
|
|
|
- err = Bind(stb.Data, data)
|
|
|
- if err != nil {
|
|
|
- fmt.Println(err)
|
|
|
- }
|
|
|
+ //func SortData(data interface{}, sortkey string, reverse bool) {
|
|
|
+ var db []map[string]interface{}
|
|
|
+ err := Bind(data, &db)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ stb := SortBy{db, sortkey}
|
|
|
+ if !reverse {
|
|
|
+ sort.Sort(stb)
|
|
|
+ } else {
|
|
|
+ sort.Sort(sort.Reverse(stb))
|
|
|
+ }
|
|
|
+ err = Bind(stb.Data, data)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ }
|
|
|
|
|
|
}
|
|
|
|
|
|
// data 转换成ret
|
|
|
func Bind(data interface{}, ret interface{}) error {
|
|
|
- v := reflect.ValueOf(ret)
|
|
|
- if v.Kind() != reflect.Ptr {
|
|
|
- return fmt.Errorf("ptr input ret needed as type as input type %s", v.Kind())
|
|
|
- }
|
|
|
- havdata := false
|
|
|
- var bk interface{}
|
|
|
- if v.Elem().Kind() == reflect.Slice {
|
|
|
- t := reflect.Zero(reflect.TypeOf(v.Elem().Interface()))
|
|
|
- bk = v.Elem().Interface()
|
|
|
- v.Elem().Set(t)
|
|
|
- havdata = true
|
|
|
- }
|
|
|
- _data, _ := json.MarshalIndent(data, "", " ")
|
|
|
- err := json.Unmarshal(_data, ret)
|
|
|
- if err != nil {
|
|
|
- fmt.Println(err)
|
|
|
- if havdata {
|
|
|
- v.Elem().Set(reflect.ValueOf(bk))
|
|
|
- }
|
|
|
- return err
|
|
|
- }
|
|
|
- return nil
|
|
|
+ v := reflect.ValueOf(ret)
|
|
|
+ if v.Kind() != reflect.Ptr {
|
|
|
+ return fmt.Errorf("ptr input ret needed as type as input type %s", v.Kind())
|
|
|
+ }
|
|
|
+ havdata := false
|
|
|
+ var bk interface{}
|
|
|
+ if v.Elem().Kind() == reflect.Slice {
|
|
|
+ t := reflect.Zero(reflect.TypeOf(v.Elem().Interface()))
|
|
|
+ bk = v.Elem().Interface()
|
|
|
+ v.Elem().Set(t)
|
|
|
+ havdata = true
|
|
|
+ }
|
|
|
+ _data, _ := json.MarshalIndent(data, "", " ")
|
|
|
+ err := json.Unmarshal(_data, ret)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println(err)
|
|
|
+ if havdata {
|
|
|
+ v.Elem().Set(reflect.ValueOf(bk))
|
|
|
+ }
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return nil
|
|
|
}
|