123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526 |
- package lib
- import (
- "Yunlot/lib/TcpServerLib"
- "Yunlot/logs"
- "Yunlot/models/Account"
- "bytes"
- "crypto/sha256"
- "encoding/hex"
- "encoding/json"
- "fmt"
- "github.com/nats-io/nats.go"
- "github.com/thinkeridea/go-extend/exunicode/exutf8"
- "github.com/yosssi/gmq/mqtt"
- "github.com/yosssi/gmq/mqtt/client"
- "golang.org/x/text/encoding/simplifiedchinese"
- "golang.org/x/text/transform"
- "io/ioutil"
- "math/rand"
- "plugin"
- "reflect"
- "runtime"
- "strconv"
- "strings"
- "time"
- "unicode/utf8"
- )
- var Nats *nats.Conn
- var MqttClient *client.Client
- var TopicMap map[string]bool
- var PluginMap map[string]*plugin.Plugin
- var TcpMap map[string]*TcpServerLib.Session
- func init() {
- TopicMap = make(map[string]bool)
- PluginMap = make(map[string]*plugin.Plugin)
- TcpMap = make(map[string]*TcpServerLib.Session)
- }
- const Success = 200
- const Error = 201
- type JSONR struct {
- //必须的大写开头
- Code int16
- Msg string
- Data interface{} // 泛型
- }
- type JSONS struct {
- //必须的大写开头
- List interface{}
- Total int16
- PageIndex int
- PageSize int
- }
- func C_Page(list interface{}, PageIndex, PageSize int, Total int64) (Jsons JSONS) {
- Jsons.List = list
- Jsons.Total = int16(Total)
- Jsons.PageIndex = PageIndex
- Jsons.PageSize = PageSize
- //Jsons.PageSize = int16(math.Ceil(float64(Total) / float64(PageSize)))
- return Jsons
- }
- func Strval(value interface{}) string {
- var key string
- if value == nil {
- return key
- }
- switch value.(type) {
- case float64:
- ft := value.(float64)
- key = strconv.FormatFloat(ft, 'f', -1, 64)
- case float32:
- ft := value.(float32)
- key = strconv.FormatFloat(float64(ft), 'f', -1, 64)
- case int:
- it := value.(int)
- key = strconv.Itoa(it)
- case uint:
- it := value.(uint)
- key = strconv.Itoa(int(it))
- case int8:
- it := value.(int8)
- key = strconv.Itoa(int(it))
- case uint8:
- it := value.(uint8)
- key = strconv.Itoa(int(it))
- case int16:
- it := value.(int16)
- key = strconv.Itoa(int(it))
- case uint16:
- it := value.(uint16)
- key = strconv.Itoa(int(it))
- case int32:
- it := value.(int32)
- key = strconv.Itoa(int(it))
- case uint32:
- it := value.(uint32)
- key = strconv.Itoa(int(it))
- case int64:
- it := value.(int64)
- key = strconv.FormatInt(it, 10)
- case uint64:
- it := value.(uint64)
- key = strconv.FormatUint(it, 10)
- case string:
- key = value.(string)
- case []byte:
- key = string(value.([]byte))
- default:
- newValue, _ := json.Marshal(value)
- key = string(newValue)
- }
- return key
- }
- func To_int(value interface{}) int {
- var key int
- if value == nil {
- return key
- }
- switch value.(type) {
- case float64:
- key = int(value.(float64))
- case float32:
- key = int(value.(float32))
- case int:
- key = int(value.(int))
- case uint:
- key = int(value.(uint))
- case int8:
- key = int(value.(int8))
- case uint8:
- key = int(value.(uint8))
- case int16:
- key = int(value.(int16))
- case uint16:
- key = int(value.(uint16))
- case int32:
- key = int(value.(int32))
- case uint32:
- key = int(value.(uint32))
- case int64:
- key = int(value.(int64))
- case uint64:
- key = int(value.(uint64))
- case string:
- key, _ = strconv.Atoi(value.(string))
- case []byte:
- key, _ = strconv.Atoi(string(value.([]byte)))
- default:
- newValue, _ := json.Marshal(value)
- key, _ = strconv.Atoi(string(newValue))
- }
- return key
- }
- func To_int64(value interface{}) int64 {
- var key int64
- if value == nil {
- return key
- }
- switch value.(type) {
- case float64:
- key = int64(value.(float64))
- case float32:
- key = int64(value.(float32))
- case int:
- key = int64(value.(int))
- case uint:
- key = int64(value.(uint))
- case int8:
- key = int64(value.(int8))
- case uint8:
- key = int64(value.(uint8))
- case int16:
- key = int64(value.(int16))
- case uint16:
- key = int64(value.(uint16))
- case int32:
- key = int64(value.(int32))
- case uint32:
- key = int64(value.(uint32))
- case int64:
- key = int64(value.(int64))
- case uint64:
- key = int64(value.(uint64))
- case string:
- key, _ = strconv.ParseInt(value.(string), 10, 64)
- case []byte:
- key, _ = strconv.ParseInt(string(value.([]byte)), 10, 64)
- default:
- newValue, _ := json.Marshal(value)
- key, _ = strconv.ParseInt(string(newValue), 10, 64)
- }
- return key
- }
- func To_float32(value interface{}) float32 {
- var key float32
- if value == nil {
- return key
- }
- switch value.(type) {
- case float64:
- key = float32(value.(float64))
- case float32:
- key = float32(value.(float32))
- case int:
- key = float32(value.(int))
- case uint:
- key = float32(value.(uint))
- case int8:
- key = float32(value.(int8))
- case uint8:
- key = float32(value.(uint8))
- case int16:
- key = float32(value.(int16))
- case uint16:
- key = float32(value.(uint16))
- case int32:
- key = float32(value.(int32))
- case uint32:
- key = float32(value.(uint32))
- case int64:
- key = float32(value.(int64))
- case uint64:
- key = float32(value.(uint64))
- case string:
- key_float64, _ := strconv.ParseFloat(value.(string), 32/64)
- key = float32(key_float64)
- case []byte:
- key_float64, _ := strconv.ParseFloat(string(value.([]byte)), 32/64)
- key = float32(key_float64)
- default:
- newValue, _ := json.Marshal(value)
- key_float64, _ := strconv.ParseFloat(string(newValue), 32/64)
- key = float32(key_float64)
- }
- key_float64, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", key), 32/64)
- key = float32(key_float64)
- return key
- }
- func To_string(value interface{}) string {
- var key string
- if value == nil {
- return key
- }
- switch value.(type) {
- case float64:
- ft := value.(float64)
- key = strconv.FormatFloat(ft, 'f', -1, 64)
- case float32:
- ft := value.(float32)
- key = strconv.FormatFloat(float64(ft), 'f', -1, 64)
- case int:
- it := value.(int)
- key = strconv.Itoa(it)
- case uint:
- it := value.(uint)
- key = strconv.Itoa(int(it))
- case int8:
- it := value.(int8)
- key = strconv.Itoa(int(it))
- case uint8:
- it := value.(uint8)
- key = strconv.Itoa(int(it))
- case int16:
- it := value.(int16)
- key = strconv.Itoa(int(it))
- case uint16:
- it := value.(uint16)
- key = strconv.Itoa(int(it))
- case int32:
- it := value.(int32)
- key = strconv.Itoa(int(it))
- case uint32:
- it := value.(uint32)
- key = strconv.Itoa(int(it))
- case int64:
- it := value.(int64)
- key = strconv.FormatInt(it, 10)
- case uint64:
- it := value.(uint64)
- key = strconv.FormatUint(it, 10)
- case string:
- key = value.(string)
- case []byte:
- key = string(value.([]byte))
- default:
- newValue, _ := json.Marshal(value)
- key = string(newValue)
- }
- return key
- }
- func Random(min, max int) int {
- rand.Seed(time.Now().Unix()) //Seed生成的随机数
- return rand.Intn(max-min) + min
- }
- // 取文本(字符串)中间
- func GetBetweenStr(str, start, end string) string {
- n := strings.Index(str, start)
- if n == -1 {
- n = 0
- } else {
- n = n + len(start) // 增加了else,不加的会把start带上
- }
- str = string([]byte(str)[n:])
- m := strings.Index(str, end)
- if m == -1 {
- m = len(str)
- }
- str = string([]byte(str)[:m])
- return str
- }
- // getYearMonthToDay 查询指定年份指定月份有多少天
- // @params year int 指定年份
- // @params month int 指定月份
- func GetYearMonthToDay(year int, month int) int {
- // 有31天的月份
- day31 := map[int]bool{
- 1: true,
- 3: true,
- 5: true,
- 7: true,
- 8: true,
- 10: true,
- 12: true,
- }
- if day31[month] == true {
- return 31
- }
- // 有30天的月份
- day30 := map[int]bool{
- 4: true,
- 6: true,
- 9: true,
- 11: true,
- }
- if day30[month] == true {
- return 30
- }
- // 计算是平年还是闰年
- if (year%4 == 0 && year%100 != 0) || year%400 == 0 {
- // 得出2月的天数
- return 29
- }
- // 得出2月的天数
- return 28
- }
- func Decimal(value float64) float64 {
- value, _ = strconv.ParseFloat(fmt.Sprintf("%.1f", value), 64)
- return value
- }
- func Strconv_Atoi(string string) int {
- int, _ := strconv.Atoi(string)
- return int
- }
- // 获取正在运行的函数名
- func FuncName() string {
- pc := make([]uintptr, 1)
- runtime.Callers(2, pc)
- f := runtime.FuncForPC(pc[0])
- return f.Name()
- }
- func Limit_len(str string, lenx int) string {
- if utf8.RuneCountInString(str) > lenx {
- return exutf8.RuneSubString(str, 0, lenx-3) + "..."
- }
- return exutf8.RuneSubString(str, 0, lenx)
- }
- func Utf8ToGbk(s []byte) ([]byte, error) {
- reader := transform.NewReader(bytes.NewReader(s), simplifiedchinese.GBK.NewEncoder())
- d, e := ioutil.ReadAll(reader)
- if e != nil {
- return nil, e
- }
- return d, nil
- }
- // #取得随机字符串:通过打乱slice来操作
- func GetRandstring(length int, char string, rand_x int64) string {
- if length < 1 {
- return ""
- }
- if len(char) <= 6 || len(char) <= length {
- char = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
- }
- charArr := strings.Split(char, "")
- ran := rand.New(rand.NewSource(time.Now().Unix() + rand_x))
- l := len(charArr)
- for i := l - 1; i > 0; i-- {
- r := ran.Intn(i)
- charArr[r], charArr[i] = charArr[i], charArr[r]
- }
- rchar := charArr[:length]
- return strings.Join(rchar, "")
- }
- // Sha256加密
- func Sha256(src string) string {
- m := sha256.New()
- m.Write([]byte(src))
- res := hex.EncodeToString(m.Sum(nil))
- return res
- }
- // 判断时间是当年的第几周
- func WeekByDate() string {
- t := time.Now()
- yearDay := t.YearDay()
- yearFirstDay := t.AddDate(0, 0, -yearDay+1)
- firstDayInWeek := int(yearFirstDay.Weekday())
- //今年第一周有几天
- firstWeekDays := 1
- if firstDayInWeek != 0 {
- firstWeekDays = 7 - firstDayInWeek + 1
- }
- var week int
- if yearDay <= firstWeekDays {
- week = 1
- } else {
- week = (yearDay-firstWeekDays)/7 + 2
- }
- return fmt.Sprintf("%d%02d", t.Year(), week) // 202253
- }
- // 登录验证
- func Verification(GetCookie string, GetString string) (bool, Account.User) {
- // 自适应 参数
- User_tokey := GetCookie
- if len(User_tokey) == 0 {
- User_tokey = GetString
- }
- if len(User_tokey) == 0 {
- return false, Account.User{}
- }
- T_uuid, is := Account.Redis_Tokey_Get(User_tokey)
- if !is {
- return false, Account.User{}
- }
- admin_r := Account.User{T_uuid: T_uuid}
- if !admin_r.Read() {
- return false, Account.User{}
- }
- //log.Println("登录 Admin_name 为:", admin_r.Admin_name)
- return true, admin_r
- }
- // 发送数据
- func Mqtt_publish(topic string, b []byte) {
- TopicMap[topic] = true
- // Publish a message.
- err := MqttClient.Publish(&client.PublishOptions{
- QoS: mqtt.QoS0,
- TopicName: []byte(topic),
- Message: b,
- })
- logs.PrintlnMqtt("Mqtt-> " + topic + ":" + string(b))
- if err != nil {
- logs.PrintlnError("MqttServer", "发送消息失败 [Mqtt_publish]", "-> "+topic+" "+string(b))
- }
- }
- // 获取json指定参数 [AAAA BBBB],0,JSON !!!如果失败,返回已找到的全部json
- func Json_key(topicNameList []string, topicNameI int, articleSlide map[string]interface{}) interface{} {
- if len(topicNameList) > topicNameI {
- a, is := articleSlide[topicNameList[topicNameI]]
- if !is {
- return articleSlide
- }
- if reflect.TypeOf(a).String() == "map[string]interface {}" {
- return Json_key(topicNameList, topicNameI+1, a.(map[string]interface{}))
- }
- }
- if len(topicNameList) == topicNameI {
- return articleSlide
- }
- return articleSlide[topicNameList[topicNameI]]
- }
- // 发送数据
- func TCP_publish(T_sn string, byte_r []byte) {
- logs.PrintlnMqtt("TCP-> " + T_sn + ":" + string(byte_r))
- if v, is := TcpMap[T_sn]; is {
- err := v.Send(string(byte_r))
- if err != nil {
- logs.PrintlnError("TCP", "发送消息失败 [TCP_publish]", "-> "+T_sn+" "+string(byte_r))
- }
- } else {
- logs.PrintlnError("TCP", "TcpMap[T_sn] 不存在,发送消息失败 [TCP_publish]", "-> "+T_sn+" "+string(byte_r))
- }
- }
|