tool.go 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822
  1. package tools
  2. import (
  3. "scd_check_tools/conf"
  4. "scd_check_tools/logger"
  5. "archive/zip"
  6. "bufio"
  7. "bytes"
  8. "encoding/base64"
  9. "encoding/binary"
  10. "errors"
  11. "fmt"
  12. "io"
  13. "io/fs"
  14. "io/ioutil"
  15. "log"
  16. "net"
  17. "net/http"
  18. "net/url"
  19. "os"
  20. "os/exec"
  21. "path"
  22. "path/filepath"
  23. "regexp"
  24. "runtime"
  25. "strconv"
  26. "strings"
  27. "time"
  28. "unicode"
  29. "golang.org/x/text/transform"
  30. "hash/crc32"
  31. "github.com/astaxie/beego/orm"
  32. "golang.org/x/text/encoding/simplifiedchinese"
  33. //"golang.org/x/text/transform"
  34. )
  35. var GlobalID int64
  36. var MbTable = []uint16{0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241, 0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440, 0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40, 0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841, 0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40, 0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41, 0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641, 0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040, 0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240, 0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441, 0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41, 0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840, 0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41, 0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40, 0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640, 0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041, 0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240, 0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441, 0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41, 0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840, 0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41, 0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40, 0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640, 0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041, 0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241, 0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440, 0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40, 0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841, 0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40, 0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41, 0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641, 0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040}
  37. func NowTime() string {
  38. //大坑一个:必须使用这个时间格式化,忘记YYYY mm ss hh mi ss这些吧
  39. return time.Now().Format("2006-01-02 15:04:05")
  40. }
  41. func TimeSeq(bit ...int) int {
  42. if bit != nil && bit[0] == 13 {
  43. return int(time.Now().UnixNano() / 1e6)
  44. }
  45. return int(time.Now().Unix())
  46. }
  47. func Typeof(v interface{}) string {
  48. return fmt.Sprintf("%T", v)
  49. }
  50. //过滤特殊字符
  51. //chars:过滤指定的字符,多个字符使用逗号分隔
  52. func FilterSpecialChar(p string, chars ...string) string {
  53. if p == "" {
  54. return ""
  55. }
  56. v := "<|>|'"
  57. if len(chars) > 0 {
  58. v = strings.ReplaceAll(chars[0], ",", "|")
  59. }
  60. return regexp.MustCompile(v).ReplaceAllString(p, "")
  61. }
  62. func IsEmpty(p interface{}, defaultvalue ...string) string {
  63. if p == nil {
  64. if defaultvalue != nil && len(defaultvalue) > 0 {
  65. return defaultvalue[0]
  66. }
  67. return ""
  68. }
  69. objtype := Typeof(p)
  70. if objtype == "int" {
  71. return strconv.Itoa(p.(int))
  72. } else if objtype == "int64" {
  73. return strconv.FormatInt(p.(int64), 10)
  74. } else if objtype == "float64" {
  75. return strconv.FormatFloat(p.(float64), 'f', -1, 64)
  76. }
  77. v := p.(string)
  78. if v == "" {
  79. if defaultvalue != nil && len(defaultvalue) > 0 {
  80. return defaultvalue[0]
  81. }
  82. }
  83. return strings.Trim(v, " ")
  84. }
  85. func CheckErr(err error) {
  86. if err != nil {
  87. log.Println(err.Error())
  88. }
  89. }
  90. //生成全局唯一ID序列
  91. func GetSeqID() int64 {
  92. if GlobalID == 0 {
  93. GlobalID = 1
  94. } else {
  95. GlobalID = GlobalID + 1
  96. }
  97. return GlobalID
  98. }
  99. //不建议使用。建议直接使用log包
  100. func Log(logdata interface{}) {
  101. if conf.GlobalConfig["loglevel"] == "4" || conf.GlobalConfig["loglevel"] == "5" {
  102. log.Println(logdata)
  103. }
  104. }
  105. //不建议使用。建议直接使用log包
  106. func Error(logdata interface{}) {
  107. log.Println(logdata)
  108. }
  109. func FormatFileSize(size int64) string {
  110. if size == 0 {
  111. return "0B"
  112. } else if size < 1024 {
  113. return fmt.Sprintf("%dB", size)
  114. } else if size < (1024 * 1024) {
  115. return fmt.Sprintf("%.2fKB", float64(size)/float64(1024))
  116. } else if size < (1024 * 1024 * 1024) {
  117. return fmt.Sprintf("%.2fMB", float64(size)/float64(1024*1024))
  118. } else if size < (1024 * 1024 * 1024 * 1024) {
  119. return fmt.Sprintf("%.2fGB", float64(size)/float64(1024*1024*1024))
  120. } else if size < (1024 * 1024 * 1024 * 1024 * 1024) {
  121. return fmt.Sprintf("%.2fTB", float64(size)/float64(1024*1024*1024*1024))
  122. } else {
  123. return ""
  124. }
  125. }
  126. func CalCheckCRC32(data string) string {
  127. return fmt.Sprintf("%X", crc32.ChecksumIEEE([]byte(data)))
  128. }
  129. func CalCheckXor(command16 string) string {
  130. var a int64 = 0
  131. for i := 0; i < len(command16); i++ {
  132. a1, _ := strconv.ParseInt(command16[i:i+2], 16, 16)
  133. a2, _ := strconv.ParseInt(command16[i+2:i+4], 16, 16)
  134. a = a ^ (a1 ^ a2)
  135. i = i + 3
  136. }
  137. h := fmt.Sprintf("%X", a)
  138. return h
  139. }
  140. func CalCheckCrc16_Modbus(data []byte) string {
  141. var crc16 uint16
  142. crc16 = 0xffff
  143. for _, v := range data {
  144. n := uint8(uint16(v) ^ crc16)
  145. crc16 >>= 8
  146. crc16 ^= MbTable[n]
  147. }
  148. int16buf := new(bytes.Buffer)
  149. binary.Write(int16buf, binary.LittleEndian, crc16)
  150. r := fmt.Sprintf("%+X", int16buf.Bytes())
  151. return r
  152. }
  153. func CalCheckCRC(commd string) (r string) {
  154. var i = 0
  155. var sum = 0
  156. for {
  157. h1 := commd[i : i+2]
  158. n, _ := strconv.ParseUint(h1, 16, 32)
  159. //fmt.Println(h1 + "=====" + strconv.Itoa(int(n)))
  160. sum = sum + int(n)
  161. i = i + 2
  162. if i >= len(commd) {
  163. break
  164. }
  165. }
  166. if sum > 256 {
  167. sum = sum - 256
  168. }
  169. var hexStr = strconv.FormatInt(int64(sum), 16)
  170. return hexStr
  171. }
  172. func GetNetPicBase64(picurl string) string {
  173. resp, err := http.Get(picurl)
  174. if err != nil {
  175. fmt.Println(err)
  176. return ""
  177. }
  178. defer resp.Body.Close()
  179. /*body, er := ioutil.ReadAll(resp.Body)
  180. if er != nil {
  181. fmt.Println(er)
  182. return ""
  183. }*/
  184. dir, _ := filepath.Abs(filepath.Dir(os.Args[0]))
  185. reader := bufio.NewReaderSize(resp.Body, 500*1024)
  186. fileName := path.Base(picurl)
  187. file, _ := os.Create(dir + "/tests/" + fileName)
  188. writer := bufio.NewWriter(file)
  189. io.Copy(writer, reader)
  190. defer file.Close()
  191. ff, _ := os.Open(dir + "/tests/" + fileName)
  192. defer ff.Close()
  193. sourcebuffer := make([]byte, 500*1024)
  194. n, _ := ff.Read(sourcebuffer)
  195. //base64压缩
  196. sourcestring := base64.StdEncoding.EncodeToString(sourcebuffer[:n])
  197. return sourcestring
  198. }
  199. func GetPicBase64(picpath string, saveas string) string {
  200. ff, _ := os.Open(picpath)
  201. defer ff.Close()
  202. sourcebuffer := make([]byte, 5*1024*1024)
  203. n, _ := ff.Read(sourcebuffer)
  204. //base64压缩
  205. sourcestring := base64.StdEncoding.EncodeToString(sourcebuffer[:n])
  206. if saveas != "" {
  207. os.WriteFile(saveas, []byte(sourcestring), fs.ModePerm)
  208. }
  209. return sourcestring
  210. }
  211. func Base64MakePic(base64str string, picPath string) error {
  212. //fmt.Println(base64str)
  213. ddd, _ := base64.StdEncoding.DecodeString(base64str[len("data:image/jpeg;base64,"):])
  214. return ioutil.WriteFile(picPath, ddd, 0666)
  215. }
  216. //解析datatable参数为Map对象
  217. func ParseDatatableParamByFormdata(reqStr url.Values) map[string]interface{} {
  218. var result = map[string]interface{}{"datatable": map[string]interface{}{}}
  219. datatable := map[string]interface{}{"sort": map[string]interface{}{"sort": reqStr.Get("datatable[sort][sort]"), "field": reqStr.Get("datatable[sort][field]")}, "pagination": map[string]interface{}{"page": reqStr.Get("datatable[pagination][page]"), "perpage": reqStr.Get("datatable[pagination][perpage]")}}
  220. for k, v := range reqStr {
  221. if strings.HasPrefix(k, "datatable") {
  222. if !strings.HasPrefix(k, "datatable[pagination]") && !strings.HasPrefix(k, "datatable[sort]") {
  223. newKey := strings.Replace(k, "datatable", "", 1)
  224. newKey = strings.Replace(newKey, "[", "", 1)
  225. newKey = strings.Replace(newKey, "]", "", 1)
  226. datatable[newKey], _ = url.QueryUnescape(v[0])
  227. }
  228. } else {
  229. datatable[k], _ = url.QueryUnescape(v[0])
  230. }
  231. }
  232. result["datatable"] = datatable
  233. return result
  234. }
  235. //解析datatable参数为Map对象
  236. func ParseFormParam(reqStr url.Values) map[string]interface{} {
  237. var result = map[string]interface{}{"datatable": map[string]interface{}{}}
  238. datatable := map[string]interface{}{"sort": map[string]interface{}{"sort": reqStr.Get("datatable[sort][sort]"), "field": reqStr.Get("datatable[sort][field]")}, "pagination": map[string]interface{}{"page": reqStr.Get("datatable[pagination][page]"), "perpage": reqStr.Get("datatable[pagination][perpage]")}}
  239. result["datatable"] = datatable
  240. for k, v := range reqStr {
  241. if strings.Index(k, "datatable") == -1 {
  242. result[k] = v[0]
  243. } else if strings.Index(k, "datatable[sort]") == -1 && strings.Index(k, "datatable[pagination]") == -1 {
  244. k1 := strings.ReplaceAll(k, "datatable[", "")
  245. k1 = strings.ReplaceAll(k1, "]", "")
  246. result[k1] = v[0]
  247. }
  248. }
  249. return result
  250. }
  251. func OriginalCode(password interface{}) string {
  252. var result string
  253. pwd := strings.Split(password.(string), "0000")
  254. if len(pwd) == 2 {
  255. password2 := pwd[1]
  256. password2 = password2[len(password2)-(len(password2)/3*3):] //去除前面多余的0
  257. for i := 0; i < len(password2)/3; i++ {
  258. number := password2[i*3 : (i+1)*3]
  259. p, _ := strconv.ParseInt(number, 16, 32)
  260. result += string(p)
  261. }
  262. }
  263. return result
  264. }
  265. //解析datatable参数为Map对象
  266. func ParseDatatableParam(reqStr string) map[string]interface{} {
  267. var result = map[string]interface{}{"datatable": map[string]interface{}{}}
  268. tmp, _ := url.QueryUnescape(reqStr)
  269. datatable := map[string]interface{}{"sort": map[string]interface{}{"sort": "", "field": ""}, "pagination": map[string]interface{}{"page": 1, "perpage": 20}}
  270. if strings.HasPrefix(tmp, "datatable") {
  271. pl := strings.Split(tmp, "&")
  272. for _, item := range pl {
  273. vs := strings.Split(item, "=")
  274. re, _ := regexp.Compile(`\[.*?\]`)
  275. all := re.FindAll([]byte(vs[0]), -1)
  276. if len(all) == 1 {
  277. key := strings.Replace(strings.Replace(string(all[0]), "[", "", 1), "]", "", 1)
  278. datatable[key] = vs[1]
  279. } else if len(all) == 2 {
  280. ele := strings.Replace(strings.Replace(string(all[0]), "[", "", 1), "]", "", 1)
  281. key := strings.Replace(strings.Replace(string(all[1]), "[", "", 1), "]", "", 1)
  282. if _, ok := datatable[ele]; ok {
  283. tmp := datatable[ele].(map[string]interface{})
  284. tmp[key] = vs[1]
  285. } else {
  286. datatable[ele] = map[string]interface{}{key: vs[1]}
  287. }
  288. }
  289. }
  290. result["datatable"] = datatable
  291. }
  292. return result
  293. }
  294. //从请求参数中解析分页数据,组装成SQL格式
  295. func ParsePaginationToSqlPart(param map[string]interface{}, alias ...string) (string, map[string]interface{}) {
  296. var limit = ""
  297. var hasfield bool
  298. var t_alias = ""
  299. var t_id_alias = "id"
  300. if alias != nil {
  301. t_alias = alias[0] + "."
  302. }
  303. if alias != nil && len(alias) > 1 {
  304. t_id_alias = alias[1]
  305. }
  306. var meta = map[string]interface{}{"field": "", "sort": "", "page": "1", "pages": "0", "perpage": "1000000", "total": "0"}
  307. if datatable, ok := param["datatable"]; ok {
  308. dt := datatable.(map[string]interface{})
  309. var field, sorttype interface{}
  310. if sort, hassort := dt["sort"]; hassort {
  311. sortmap := sort.(map[string]interface{})
  312. if field, hasfield = sortmap["field"]; !hasfield || IsEmpty(field) == "" {
  313. field = t_id_alias
  314. }
  315. if sorttype, hasfield = sortmap["sort"]; !hasfield || IsEmpty(field) == "" {
  316. sorttype = "desc"
  317. }
  318. meta["field"] = field
  319. meta["sort"] = sorttype
  320. limit = limit + " order by " + t_alias + field.(string) + " " + sorttype.(string)
  321. }
  322. if pagination, has := dt["pagination"]; has {
  323. paginationmap := pagination.(map[string]interface{})
  324. if limit == "" {
  325. if field, hasfield = paginationmap["field"]; hasfield && IsEmpty(field) != "" {
  326. if sorttype, hasfield = paginationmap["sort"]; !hasfield || IsEmpty(sorttype) != "" {
  327. meta["field"] = field
  328. meta["sort"] = sorttype
  329. limit = limit + " order by " + t_alias + field.(string) + " " + sorttype.(string)
  330. }
  331. }
  332. }
  333. var page, perpage interface{}
  334. if page, hasfield = paginationmap["page"]; !hasfield || IsEmpty(page) == "" {
  335. page = "1"
  336. }
  337. if perpage, hasfield = paginationmap["perpage"]; !hasfield || IsEmpty(perpage) == "" {
  338. perpage = "50"
  339. }
  340. var pageno, pagesize int
  341. if Typeof(page) == "int" {
  342. pageno = page.(int)
  343. } else {
  344. pageno, _ = strconv.Atoi(page.(string))
  345. }
  346. if Typeof(perpage) == "int" {
  347. pagesize = perpage.(int)
  348. } else {
  349. pagesize, _ = strconv.Atoi(perpage.(string))
  350. }
  351. meta["page"] = pageno
  352. meta["perpage"] = pagesize
  353. //limit = limit + " limit " + strconv.Itoa((pageno-1)*pagesize) + "," + strconv.Itoa(pageno*pagesize)
  354. limit = limit + " limit " + strconv.Itoa((pageno-1)*pagesize) + "," + strconv.Itoa(pagesize)
  355. } else {
  356. limit = limit + " limit 0,1000000"
  357. }
  358. }
  359. return limit, meta
  360. }
  361. //从请求参数中解析分页数据,组装成不包含排序的SQL格式
  362. func ParsePaginationToSqlPartNoOrderBY(param map[string]interface{}, alias ...string) (string, map[string]interface{}) {
  363. var limit = ""
  364. var hasfield bool
  365. var t_alias = ""
  366. var t_id_alias = ""
  367. if alias != nil {
  368. t_alias = alias[0] + "."
  369. }
  370. if alias != nil && len(alias) > 1 {
  371. t_id_alias = alias[1]
  372. }
  373. var meta = map[string]interface{}{"field": "", "sort": "", "page": "1", "pages": "0", "perpage": "1000000", "total": "0"}
  374. if datatable, ok := param["datatable"]; ok {
  375. dt := datatable.(map[string]interface{})
  376. var field, sorttype interface{}
  377. if sort, hassort := dt["sort"]; hassort {
  378. sortmap := sort.(map[string]interface{})
  379. if field, hasfield = sortmap["field"]; !hasfield || IsEmpty(field) == "" {
  380. field = t_id_alias
  381. }
  382. if sorttype, hasfield = sortmap["sort"]; !hasfield || IsEmpty(field) == "" {
  383. sorttype = "desc"
  384. }
  385. meta["field"] = field
  386. meta["sort"] = sorttype
  387. if field != "" {
  388. limit = limit + " order by " + t_alias + field.(string) + " " + sorttype.(string)
  389. }
  390. }
  391. if pagination, has := dt["pagination"]; has {
  392. paginationmap := pagination.(map[string]interface{})
  393. if limit == "" {
  394. if field, hasfield = paginationmap["field"]; hasfield && IsEmpty(field) != "" {
  395. if sorttype, hasfield = paginationmap["sort"]; !hasfield || IsEmpty(sorttype) != "" {
  396. meta["field"] = field
  397. meta["sort"] = sorttype
  398. if field != "" {
  399. limit = limit + " order by " + t_alias + field.(string) + " " + sorttype.(string)
  400. }
  401. }
  402. }
  403. }
  404. var page, perpage interface{}
  405. if page, hasfield = paginationmap["page"]; !hasfield || IsEmpty(page) == "" {
  406. page = "1"
  407. }
  408. if perpage, hasfield = paginationmap["perpage"]; !hasfield || IsEmpty(perpage) == "" {
  409. perpage = "50"
  410. }
  411. var pageno, pagesize int
  412. if Typeof(page) == "int" {
  413. pageno = page.(int)
  414. } else {
  415. pageno, _ = strconv.Atoi(page.(string))
  416. }
  417. if Typeof(perpage) == "int" {
  418. pagesize = perpage.(int)
  419. } else {
  420. pagesize, _ = strconv.Atoi(perpage.(string))
  421. }
  422. meta["page"] = pageno
  423. meta["perpage"] = pagesize
  424. //limit = limit + " limit " + strconv.Itoa((pageno-1)*pagesize) + "," + strconv.Itoa(pageno*pagesize)
  425. limit = " limit " + strconv.Itoa((pageno-1)*pagesize) + "," + strconv.Itoa(pagesize)
  426. } else {
  427. limit = limit + " limit 0,1000000"
  428. }
  429. }
  430. return limit, meta
  431. }
  432. func IsUTF8(data []byte) bool {
  433. var preNUm = func(data byte) int {
  434. str := fmt.Sprintf("%b", data)
  435. var i int = 0
  436. for i < len(str) {
  437. if str[i] != '1' {
  438. break
  439. }
  440. i++
  441. }
  442. return i
  443. }
  444. for i := 0; i < len(data); {
  445. if data[i]&0x80 == 0x00 {
  446. // 0XXX_XXXX
  447. i++
  448. continue
  449. } else if num := preNUm(data[i]); num > 2 {
  450. // 110X_XXXX 10XX_XXXX
  451. // 1110_XXXX 10XX_XXXX 10XX_XXXX
  452. // 1111_0XXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
  453. // 1111_10XX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
  454. // 1111_110X 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
  455. // preNUm() 返回首个字节的8个bits中首个0bit前面1bit的个数,该数量也是该字符所使用的字节数
  456. i++
  457. for j := 0; j < num-1; j++ {
  458. //判断后面的 num - 1 个字节是不是都是10开头
  459. if data[i]&0xc0 != 0x80 {
  460. return false
  461. }
  462. i++
  463. }
  464. } else {
  465. //其他情况说明不是utf-8
  466. return false
  467. }
  468. }
  469. return true
  470. }
  471. func IsGBK(data []byte) bool {
  472. length := len(data)
  473. var i int = 0
  474. for i < length {
  475. //fmt.Printf("for %x\n", data[i])
  476. if data[i] <= 0xff {
  477. //编码小于等于127,只有一个字节的编码,兼容ASCII吗
  478. i++
  479. continue
  480. } else {
  481. //大于127的使用双字节编码
  482. if data[i] >= 0x81 &&
  483. data[i] <= 0xfe &&
  484. data[i+1] >= 0x40 &&
  485. data[i+1] <= 0xfe &&
  486. data[i+1] != 0xf7 {
  487. i += 2
  488. continue
  489. } else {
  490. return false
  491. }
  492. }
  493. }
  494. return true
  495. }
  496. func HasChineseChar(str string) bool {
  497. for _, r := range str {
  498. if unicode.Is(unicode.Han, r) || (regexp.MustCompile("[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b]").MatchString(string(r))) {
  499. return true
  500. }
  501. }
  502. return false
  503. }
  504. //字节转换成字符,支持中文转换。
  505. //charset:GB18030|UTF-8
  506. func ConvertByte2String(byte []byte, charset string) string {
  507. var str string
  508. switch charset {
  509. case "GB18030":
  510. var decodeBytes, _ = simplifiedchinese.GB18030.NewDecoder().Bytes(byte)
  511. str = string(decodeBytes)
  512. case "UTF-8":
  513. fallthrough
  514. default:
  515. str = string(byte)
  516. }
  517. return str
  518. }
  519. //email verify
  520. func VerifyEmailFormat(email string) bool {
  521. pattern := `\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*` //匹配电子邮箱
  522. //pattern := `^[0-9a-z][_.0-9a-z-]{0,31}@([0-9a-z][0-9a-z-]{0,30}[0-9a-z]\.){1,4}[a-z]{2,4}$`
  523. reg := regexp.MustCompile(pattern)
  524. return reg.MatchString(email)
  525. }
  526. //mobile verify
  527. func VerifyMobileFormat(mobileNum string) bool {
  528. regular := "^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$"
  529. reg := regexp.MustCompile(regular)
  530. return reg.MatchString(mobileNum)
  531. }
  532. func Unzip(zipFile string, destDir string) error {
  533. zipReader, err := zip.OpenReader(zipFile)
  534. if err != nil {
  535. return err
  536. }
  537. defer zipReader.Close()
  538. decodeName := ""
  539. for _, f := range zipReader.File {
  540. if f.Flags == 1 {
  541. //如果标志为是 1 << 11也就是 2048 则是utf-8编码
  542. decodeName = f.Name
  543. } else {
  544. //如果标致位是0或其他 则是默认的本地编码 默认为gbk
  545. i := bytes.NewReader([]byte(f.Name))
  546. decoder := transform.NewReader(i, simplifiedchinese.GBK.NewDecoder())
  547. content, _ := ioutil.ReadAll(decoder)
  548. decodeName = string(content)
  549. }
  550. fpath := filepath.Join(destDir, decodeName)
  551. if f.FileInfo().IsDir() {
  552. os.MkdirAll(fpath, os.ModePerm)
  553. } else {
  554. if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
  555. return err
  556. }
  557. inFile, err := f.Open()
  558. if err != nil {
  559. return err
  560. }
  561. defer inFile.Close()
  562. outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
  563. if err != nil {
  564. return err
  565. }
  566. defer outFile.Close()
  567. _, err = io.Copy(outFile, inFile)
  568. if err != nil {
  569. return err
  570. }
  571. }
  572. }
  573. return nil
  574. }
  575. func Zip(srcFile string, destZip string) error {
  576. zipfile, err := os.Create(destZip)
  577. if err != nil {
  578. return err
  579. }
  580. defer zipfile.Close()
  581. archive := zip.NewWriter(zipfile)
  582. defer archive.Close()
  583. filepath.Walk(srcFile, func(path string, info os.FileInfo, err error) error {
  584. if err != nil {
  585. return err
  586. }
  587. header, err := zip.FileInfoHeader(info)
  588. if err != nil {
  589. return err
  590. }
  591. header.Name = strings.TrimPrefix(path, filepath.Dir(srcFile)+string(os.PathSeparator))
  592. // header.Name = path
  593. if info.IsDir() {
  594. header.Name += string(os.PathSeparator)
  595. } else {
  596. header.Method = zip.Deflate
  597. }
  598. writer, err := archive.CreateHeader(header)
  599. if err != nil {
  600. return err
  601. }
  602. if !info.IsDir() {
  603. file, err := os.Open(path)
  604. if err != nil {
  605. return err
  606. }
  607. defer file.Close()
  608. _, err = io.Copy(writer, file)
  609. }
  610. return err
  611. })
  612. return err
  613. }
  614. func ZipMutile(srcFileList []string, destZip string) error {
  615. zipfile, err := os.OpenFile(destZip, os.O_CREATE|os.O_RDWR|os.O_APPEND, fs.ModePerm)
  616. if err != nil {
  617. return err
  618. }
  619. defer zipfile.Close()
  620. //zipfile.Seek(0, os.SEEK_END)
  621. archive := zip.NewWriter(zipfile)
  622. defer archive.Close()
  623. for _, srcFile := range srcFileList {
  624. filepath.Walk(srcFile, func(path string, info os.FileInfo, err error) error {
  625. if err != nil {
  626. return err
  627. }
  628. header, err := zip.FileInfoHeader(info)
  629. if err != nil {
  630. return err
  631. }
  632. header.Name = strings.TrimPrefix(path, filepath.Dir(srcFile)+string(os.PathSeparator))
  633. // header.Name = path
  634. if info.IsDir() {
  635. header.Name += string(os.PathSeparator)
  636. } else {
  637. header.Method = zip.Deflate
  638. }
  639. writer, err := archive.CreateHeader(header)
  640. if err != nil {
  641. return err
  642. }
  643. if !info.IsDir() {
  644. file, err := os.Open(path)
  645. if err != nil {
  646. return err
  647. }
  648. defer file.Close()
  649. _, err = io.Copy(writer, file)
  650. }
  651. return err
  652. })
  653. }
  654. return err
  655. }
  656. func Utf8ToGBK(text string) (string, error) {
  657. dst := make([]byte, len(text)*2)
  658. tr := simplifiedchinese.GB18030.NewEncoder()
  659. nDst, _, err := tr.Transform(dst, []byte(text), true)
  660. if err != nil {
  661. return text, err
  662. }
  663. return string(dst[:nDst]), nil
  664. }
  665. //统一删除数据表记录
  666. func DeleteTableReorce(tableName, primaryField, Id string) error {
  667. o := orm.NewOrm()
  668. var sqlParameter []interface{}
  669. var sqlCommandText = "delete from " + tableName + " where " + primaryField + "=?;"
  670. sqlParameter = append(sqlParameter, Id)
  671. _, err := o.Raw(sqlCommandText, sqlParameter).Exec()
  672. return err
  673. }
  674. //获得单条数据记录
  675. func GetSingleRecord(tableName, primaryField, Id string) ([]orm.Params, error) {
  676. o := orm.NewOrm()
  677. var sqlParameter []interface{}
  678. var sqlCommandText string
  679. if tableName == "t_data_monitor_task" {
  680. sqlCommandText = "select a.*,tr.path checkreport,u.name adminusername,s.name stationname,sc1.name switchgear_one_name,sc2.name switchgear_two_name,sc3.name switchgear_comp_name,(select tpl_name from t_data_config_tpl where id=a.tpl) tplname " +
  681. "from t_data_monitor_task a left join t_data_user u on a.adminuser=u.id inner join t_data_station s on a.stationid=s.stationid left join t_data_switchgear sc1 on a.switchgear_one=sc1.id left join t_data_switchgear sc2 on a.switchgear_two=sc2.id left join t_data_switchgear sc3 on a.switchgear_comp=sc3.id left join t_data_monitor_report tr on a.id=tr.taskid where a.id=?"
  682. sqlParameter = append(sqlParameter, Id)
  683. } else {
  684. sqlCommandText = "select * from " + tableName + " where " + primaryField + "=?;"
  685. sqlParameter = append(sqlParameter, Id)
  686. }
  687. var tableData []orm.Params
  688. _, err := o.Raw(sqlCommandText, sqlParameter).Values(&tableData)
  689. return tableData, err
  690. }
  691. func LocalIPv4() (string, error) {
  692. ifaces, err := net.Interfaces()
  693. if err != nil {
  694. return "", err
  695. }
  696. for _, iface := range ifaces {
  697. if iface.Flags&net.FlagUp == 0 {
  698. continue
  699. }
  700. if iface.Flags&net.FlagLoopback != 0 {
  701. continue
  702. }
  703. addrs, err := iface.Addrs()
  704. if err != nil {
  705. return "", err
  706. }
  707. for _, addr := range addrs {
  708. var ip net.IP
  709. switch v := addr.(type) {
  710. case *net.IPNet:
  711. ip = v.IP
  712. case *net.IPAddr:
  713. ip = v.IP
  714. }
  715. if ip == nil || ip.IsLoopback() {
  716. continue
  717. }
  718. ip = ip.To4()
  719. if ip == nil {
  720. continue
  721. }
  722. return ip.String(), nil
  723. }
  724. }
  725. return "", errors.New("未连接网络")
  726. }
  727. //获取当前运行程序版本号
  728. func GetVersion() string {
  729. exename := conf.GlobalConfig["appid"]
  730. if exename == "" {
  731. logger.Logger.Println("系统还未配置appid属性,请正确设置后再试!")
  732. os.Exit(0)
  733. return ""
  734. }
  735. if string(runtime.GOOS) == "windows" {
  736. exename = exename + ".exe"
  737. }
  738. f, err1 := os.Open(exename)
  739. if err1 != nil {
  740. logger.Logger.Println("获取版本号失败,请检查appid是否与程序名称匹配!")
  741. logger.Logger.Error(err1)
  742. os.Exit(0)
  743. return ""
  744. }
  745. fi, err2 := f.Stat()
  746. if err2 != nil {
  747. logger.Logger.Info("获取版本号失败:")
  748. logger.Logger.Error(err2)
  749. return ""
  750. }
  751. return fi.ModTime().Format("20060102-15")
  752. }
  753. func GetAppCurPath() string {
  754. file, _ := exec.LookPath(os.Args[0])
  755. execpath, _ := filepath.Abs(file)
  756. execpath = filepath.Dir(execpath)
  757. if execpath[len(execpath)-1:] != string(os.PathSeparator) {
  758. execpath = execpath + string(os.PathSeparator)
  759. }
  760. return execpath
  761. }