tool.go 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889
  1. package tools
  2. import (
  3. "archive/zip"
  4. "bufio"
  5. "bytes"
  6. "encoding/base64"
  7. "encoding/binary"
  8. "errors"
  9. "fmt"
  10. "io"
  11. "io/fs"
  12. "io/ioutil"
  13. "log"
  14. "net"
  15. "net/http"
  16. "net/url"
  17. "os"
  18. "os/exec"
  19. "path"
  20. "path/filepath"
  21. "regexp"
  22. "runtime"
  23. "scd_check_tools/conf"
  24. "scd_check_tools/logger"
  25. "strconv"
  26. "strings"
  27. "sync"
  28. "time"
  29. "unicode"
  30. "golang.org/x/text/transform"
  31. "hash/crc32"
  32. "github.com/astaxie/beego/orm"
  33. "golang.org/x/text/encoding/simplifiedchinese"
  34. //"golang.org/x/text/transform"
  35. )
  36. var GlobalID int64
  37. 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}
  38. func NowTime() string {
  39. //大坑一个:必须使用这个时间格式化,忘记YYYY mm ss hh mi ss这些吧
  40. return time.Now().Format("2006-01-02 15:04:05")
  41. }
  42. func TimeSeq(bit ...int) int {
  43. if bit != nil && bit[0] == 13 {
  44. return int(time.Now().UnixNano() / 1e6)
  45. }
  46. return int(time.Now().Unix())
  47. }
  48. func Typeof(v interface{}) string {
  49. return fmt.Sprintf("%T", v)
  50. }
  51. //过滤特殊字符
  52. //chars:过滤指定的字符,多个字符使用逗号分隔
  53. func FilterSpecialChar(p string, chars ...string) string {
  54. if p == "" {
  55. return ""
  56. }
  57. v := "<|>|'"
  58. if len(chars) > 0 {
  59. v = strings.ReplaceAll(chars[0], ",", "|")
  60. }
  61. return regexp.MustCompile(v).ReplaceAllString(p, "")
  62. }
  63. func IsEmpty(p interface{}, defaultvalue ...string) string {
  64. if p == nil {
  65. if defaultvalue != nil && len(defaultvalue) > 0 {
  66. return defaultvalue[0]
  67. }
  68. return ""
  69. }
  70. objtype := Typeof(p)
  71. if objtype == "int" {
  72. return strconv.Itoa(p.(int))
  73. } else if objtype == "int32" {
  74. return strconv.FormatInt(int64(p.(int32)), 10)
  75. } else if objtype == "int64" {
  76. return strconv.FormatInt(p.(int64), 10)
  77. } else if objtype == "float64" {
  78. return strconv.FormatFloat(p.(float64), 'f', -1, 64)
  79. }
  80. v := p.(string)
  81. if v == "" {
  82. if defaultvalue != nil && len(defaultvalue) > 0 {
  83. return defaultvalue[0]
  84. }
  85. }
  86. return strings.Trim(v, " ")
  87. }
  88. func CheckErr(err error) {
  89. if err != nil {
  90. log.Println(err.Error())
  91. }
  92. }
  93. //多表达式分组匹配
  94. //多个表达式组时使用&分隔,每个分组表达式可使用()括起来,更加易读,且内部内容必须符合正则表过式规则
  95. //表达式样例1:(断路器)&(跳|合|闸){1,}&(位置)
  96. //表达式样例2:Ia1&A&保护
  97. func RexGroupTestMatch(regstr, soruce string) bool {
  98. if regstr == "" || soruce == "" {
  99. return false
  100. }
  101. regstrs := strings.Split(regstr, "&")
  102. if len(regstrs) > 1 {
  103. //未分组时,直接匹配
  104. fcdarex, err2 := regexp.Compile(regstr)
  105. if err2 != nil {
  106. logger.Logger.Error(err2, regstr)
  107. return false
  108. }
  109. return fcdarex.MatchString(soruce)
  110. }
  111. wg := sync.WaitGroup{}
  112. wg.Add(len(regstrs))
  113. wgResultFalse := map[string]bool{}
  114. for _, item := range regstrs {
  115. go func(item string) {
  116. fcdarex, err2 := regexp.Compile(item)
  117. if err2 != nil {
  118. logger.Logger.Error(err2, item)
  119. wgResultFalse["false"] = false
  120. } else if !fcdarex.MatchString(soruce) {
  121. wgResultFalse["false"] = false
  122. }
  123. wg.Done()
  124. }(item)
  125. }
  126. wg.Wait()
  127. matchSuccess := true
  128. if _, h := wgResultFalse["false"]; h {
  129. matchSuccess = false
  130. }
  131. return matchSuccess
  132. }
  133. //生成全局唯一ID序列
  134. func GetSeqID() int64 {
  135. if GlobalID == 0 {
  136. GlobalID = 1
  137. } else {
  138. GlobalID = GlobalID + 1
  139. }
  140. return GlobalID
  141. }
  142. //不建议使用。建议直接使用log包
  143. func Log(logdata interface{}) {
  144. if conf.GlobalConfig["loglevel"] == "4" || conf.GlobalConfig["loglevel"] == "5" {
  145. log.Println(logdata)
  146. }
  147. }
  148. //不建议使用。建议直接使用log包
  149. func Error(logdata interface{}) {
  150. log.Println(logdata)
  151. }
  152. func FormatFileSize(size int64) string {
  153. if size == 0 {
  154. return "0B"
  155. } else if size < 1024 {
  156. return fmt.Sprintf("%dB", size)
  157. } else if size < (1024 * 1024) {
  158. return fmt.Sprintf("%.2fKB", float64(size)/float64(1024))
  159. } else if size < (1024 * 1024 * 1024) {
  160. return fmt.Sprintf("%.2fMB", float64(size)/float64(1024*1024))
  161. } else if size < (1024 * 1024 * 1024 * 1024) {
  162. return fmt.Sprintf("%.2fGB", float64(size)/float64(1024*1024*1024))
  163. } else if size < (1024 * 1024 * 1024 * 1024 * 1024) {
  164. return fmt.Sprintf("%.2fTB", float64(size)/float64(1024*1024*1024*1024))
  165. } else {
  166. return ""
  167. }
  168. }
  169. func CalCheckCRC32(data string) string {
  170. return fmt.Sprintf("%X", crc32.ChecksumIEEE([]byte(data)))
  171. }
  172. func CalCheckXor(command16 string) string {
  173. var a int64 = 0
  174. for i := 0; i < len(command16); i++ {
  175. a1, _ := strconv.ParseInt(command16[i:i+2], 16, 16)
  176. a2, _ := strconv.ParseInt(command16[i+2:i+4], 16, 16)
  177. a = a ^ (a1 ^ a2)
  178. i = i + 3
  179. }
  180. h := fmt.Sprintf("%X", a)
  181. return h
  182. }
  183. func CalCheckCrc16_Modbus(data []byte) string {
  184. var crc16 uint16
  185. crc16 = 0xffff
  186. for _, v := range data {
  187. n := uint8(uint16(v) ^ crc16)
  188. crc16 >>= 8
  189. crc16 ^= MbTable[n]
  190. }
  191. int16buf := new(bytes.Buffer)
  192. binary.Write(int16buf, binary.LittleEndian, crc16)
  193. r := fmt.Sprintf("%+X", int16buf.Bytes())
  194. return r
  195. }
  196. func CalCheckCRC(commd string) (r string) {
  197. var i = 0
  198. var sum = 0
  199. for {
  200. h1 := commd[i : i+2]
  201. n, _ := strconv.ParseUint(h1, 16, 32)
  202. //fmt.Println(h1 + "=====" + strconv.Itoa(int(n)))
  203. sum = sum + int(n)
  204. i = i + 2
  205. if i >= len(commd) {
  206. break
  207. }
  208. }
  209. if sum > 256 {
  210. sum = sum - 256
  211. }
  212. var hexStr = strconv.FormatInt(int64(sum), 16)
  213. return hexStr
  214. }
  215. func GetNetPicBase64(picurl string) string {
  216. resp, err := http.Get(picurl)
  217. if err != nil {
  218. fmt.Println(err)
  219. return ""
  220. }
  221. defer resp.Body.Close()
  222. /*body, er := ioutil.ReadAll(resp.Body)
  223. if er != nil {
  224. fmt.Println(er)
  225. return ""
  226. }*/
  227. dir, _ := filepath.Abs(filepath.Dir(os.Args[0]))
  228. reader := bufio.NewReaderSize(resp.Body, 500*1024)
  229. fileName := path.Base(picurl)
  230. file, _ := os.Create(dir + "/tests/" + fileName)
  231. writer := bufio.NewWriter(file)
  232. io.Copy(writer, reader)
  233. defer file.Close()
  234. ff, _ := os.Open(dir + "/tests/" + fileName)
  235. defer ff.Close()
  236. sourcebuffer := make([]byte, 500*1024)
  237. n, _ := ff.Read(sourcebuffer)
  238. //base64压缩
  239. sourcestring := base64.StdEncoding.EncodeToString(sourcebuffer[:n])
  240. return sourcestring
  241. }
  242. func GetPicBase64(picpath string, saveas string) string {
  243. ff, _ := os.Open(picpath)
  244. defer ff.Close()
  245. sourcebuffer := make([]byte, 5*1024*1024)
  246. n, _ := ff.Read(sourcebuffer)
  247. //base64压缩
  248. sourcestring := base64.StdEncoding.EncodeToString(sourcebuffer[:n])
  249. if saveas != "" {
  250. os.WriteFile(saveas, []byte(sourcestring), fs.ModePerm)
  251. }
  252. return sourcestring
  253. }
  254. func Base64MakePic(base64str string, picPath string) error {
  255. //fmt.Println(base64str)
  256. ddd, _ := base64.StdEncoding.DecodeString(base64str[len("data:image/jpeg;base64,"):])
  257. return ioutil.WriteFile(picPath, ddd, 0666)
  258. }
  259. //解析datatable参数为Map对象
  260. func ParseDatatableParamByFormdata(reqStr url.Values) map[string]interface{} {
  261. var result = map[string]interface{}{"datatable": map[string]interface{}{}}
  262. 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]")}}
  263. for k, v := range reqStr {
  264. if strings.HasPrefix(k, "datatable") {
  265. if !strings.HasPrefix(k, "datatable[pagination]") && !strings.HasPrefix(k, "datatable[sort]") {
  266. newKey := strings.Replace(k, "datatable", "", 1)
  267. newKey = strings.Replace(newKey, "[", "", 1)
  268. newKey = strings.Replace(newKey, "]", "", 1)
  269. datatable[newKey], _ = url.QueryUnescape(v[0])
  270. }
  271. } else {
  272. datatable[k], _ = url.QueryUnescape(v[0])
  273. }
  274. }
  275. result["datatable"] = datatable
  276. return result
  277. }
  278. //解析datatable参数为Map对象
  279. func ParseFormParam(reqStr url.Values) map[string]interface{} {
  280. var result = map[string]interface{}{"datatable": map[string]interface{}{}}
  281. 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]")}}
  282. result["datatable"] = datatable
  283. for k, v := range reqStr {
  284. if strings.Index(k, "datatable") == -1 {
  285. result[k] = v[0]
  286. } else if strings.Index(k, "datatable[sort]") == -1 && strings.Index(k, "datatable[pagination]") == -1 {
  287. k1 := strings.ReplaceAll(k, "datatable[", "")
  288. k1 = strings.ReplaceAll(k1, "]", "")
  289. result[k1] = v[0]
  290. }
  291. }
  292. return result
  293. }
  294. func OriginalCode(password interface{}) string {
  295. var result string
  296. pwd := strings.Split(password.(string), "0000")
  297. if len(pwd) == 2 {
  298. password2 := pwd[1]
  299. password2 = password2[len(password2)-(len(password2)/3*3):] //去除前面多余的0
  300. for i := 0; i < len(password2)/3; i++ {
  301. number := password2[i*3 : (i+1)*3]
  302. p, _ := strconv.ParseInt(number, 16, 32)
  303. result += string(p)
  304. }
  305. }
  306. return result
  307. }
  308. //解析datatable参数为Map对象
  309. func ParseDatatableParam(reqStr string) map[string]interface{} {
  310. var result = map[string]interface{}{"datatable": map[string]interface{}{}}
  311. tmp, _ := url.QueryUnescape(reqStr)
  312. datatable := map[string]interface{}{"sort": map[string]interface{}{"sort": "", "field": ""}, "pagination": map[string]interface{}{"page": 1, "perpage": 20}}
  313. if strings.HasPrefix(tmp, "datatable") {
  314. pl := strings.Split(tmp, "&")
  315. for _, item := range pl {
  316. vs := strings.Split(item, "=")
  317. re, _ := regexp.Compile(`\[.*?\]`)
  318. all := re.FindAll([]byte(vs[0]), -1)
  319. if len(all) == 1 {
  320. key := strings.Replace(strings.Replace(string(all[0]), "[", "", 1), "]", "", 1)
  321. datatable[key] = vs[1]
  322. } else if len(all) == 2 {
  323. ele := strings.Replace(strings.Replace(string(all[0]), "[", "", 1), "]", "", 1)
  324. key := strings.Replace(strings.Replace(string(all[1]), "[", "", 1), "]", "", 1)
  325. if _, ok := datatable[ele]; ok {
  326. tmp := datatable[ele].(map[string]interface{})
  327. tmp[key] = vs[1]
  328. } else {
  329. datatable[ele] = map[string]interface{}{key: vs[1]}
  330. }
  331. }
  332. }
  333. result["datatable"] = datatable
  334. }
  335. return result
  336. }
  337. //从请求参数中解析分页数据,组装成SQL格式
  338. func ParsePaginationToSqlPart(param map[string]interface{}, alias ...string) (string, map[string]interface{}) {
  339. var limit = ""
  340. var hasfield bool
  341. var t_alias = ""
  342. var t_id_alias = "id"
  343. if alias != nil {
  344. t_alias = alias[0] + "."
  345. }
  346. if alias != nil && len(alias) > 1 {
  347. t_id_alias = alias[1]
  348. }
  349. var meta = map[string]interface{}{"field": "", "sort": "", "page": "1", "pages": "0", "perpage": "1000000", "total": "0"}
  350. if datatable, ok := param["datatable"]; ok {
  351. dt := datatable.(map[string]interface{})
  352. var field, sorttype interface{}
  353. if sort, hassort := dt["sort"]; hassort {
  354. sortmap := sort.(map[string]interface{})
  355. if field, hasfield = sortmap["field"]; !hasfield || IsEmpty(field) == "" {
  356. field = t_id_alias
  357. }
  358. if sorttype, hasfield = sortmap["sort"]; !hasfield || IsEmpty(field) == "" {
  359. sorttype = "desc"
  360. }
  361. meta["field"] = field
  362. meta["sort"] = sorttype
  363. limit = limit + " order by " + t_alias + field.(string) + " " + sorttype.(string)
  364. }
  365. if pagination, has := dt["pagination"]; has {
  366. paginationmap := pagination.(map[string]interface{})
  367. if limit == "" {
  368. if field, hasfield = paginationmap["field"]; hasfield && IsEmpty(field) != "" {
  369. if sorttype, hasfield = paginationmap["sort"]; !hasfield || IsEmpty(sorttype) != "" {
  370. meta["field"] = field
  371. meta["sort"] = sorttype
  372. limit = limit + " order by " + t_alias + field.(string) + " " + sorttype.(string)
  373. }
  374. }
  375. }
  376. var page, perpage interface{}
  377. if page, hasfield = paginationmap["page"]; !hasfield || IsEmpty(page) == "" {
  378. page = "1"
  379. }
  380. if perpage, hasfield = paginationmap["perpage"]; !hasfield || IsEmpty(perpage) == "" {
  381. perpage = "50"
  382. }
  383. var pageno, pagesize int
  384. if Typeof(page) == "int" {
  385. pageno = page.(int)
  386. } else {
  387. pageno, _ = strconv.Atoi(page.(string))
  388. }
  389. if Typeof(perpage) == "int" {
  390. pagesize = perpage.(int)
  391. } else {
  392. pagesize, _ = strconv.Atoi(perpage.(string))
  393. }
  394. meta["page"] = pageno
  395. meta["perpage"] = pagesize
  396. //limit = limit + " limit " + strconv.Itoa((pageno-1)*pagesize) + "," + strconv.Itoa(pageno*pagesize)
  397. limit = limit + " limit " + strconv.Itoa((pageno-1)*pagesize) + "," + strconv.Itoa(pagesize)
  398. } else {
  399. limit = limit + " limit 0,1000000"
  400. }
  401. }
  402. return limit, meta
  403. }
  404. //从请求参数中解析分页数据,组装成不包含排序的SQL格式
  405. func ParsePaginationToSqlPartNoOrderBY(param map[string]interface{}, alias ...string) (string, map[string]interface{}) {
  406. var limit = ""
  407. var hasfield bool
  408. var t_alias = ""
  409. var t_id_alias = ""
  410. if alias != nil {
  411. t_alias = alias[0] + "."
  412. }
  413. if alias != nil && len(alias) > 1 {
  414. t_id_alias = alias[1]
  415. }
  416. var meta = map[string]interface{}{"field": "", "sort": "", "page": "1", "pages": "0", "perpage": "1000000", "total": "0"}
  417. if datatable, ok := param["datatable"]; ok {
  418. dt := datatable.(map[string]interface{})
  419. var field, sorttype interface{}
  420. if sort, hassort := dt["sort"]; hassort {
  421. sortmap := sort.(map[string]interface{})
  422. if field, hasfield = sortmap["field"]; !hasfield || IsEmpty(field) == "" {
  423. field = t_id_alias
  424. }
  425. if sorttype, hasfield = sortmap["sort"]; !hasfield || IsEmpty(field) == "" {
  426. sorttype = "desc"
  427. }
  428. meta["field"] = field
  429. meta["sort"] = sorttype
  430. if field != "" {
  431. limit = limit + " order by " + t_alias + field.(string) + " " + sorttype.(string)
  432. }
  433. }
  434. if pagination, has := dt["pagination"]; has {
  435. paginationmap := pagination.(map[string]interface{})
  436. if limit == "" {
  437. if field, hasfield = paginationmap["field"]; hasfield && IsEmpty(field) != "" {
  438. if sorttype, hasfield = paginationmap["sort"]; !hasfield || IsEmpty(sorttype) != "" {
  439. meta["field"] = field
  440. meta["sort"] = sorttype
  441. if field != "" {
  442. limit = limit + " order by " + t_alias + field.(string) + " " + sorttype.(string)
  443. }
  444. }
  445. }
  446. }
  447. var page, perpage interface{}
  448. if page, hasfield = paginationmap["page"]; !hasfield || IsEmpty(page) == "" {
  449. page = "1"
  450. }
  451. if perpage, hasfield = paginationmap["perpage"]; !hasfield || IsEmpty(perpage) == "" {
  452. perpage = "50"
  453. }
  454. var pageno, pagesize int
  455. if Typeof(page) == "int" {
  456. pageno = page.(int)
  457. } else {
  458. pageno, _ = strconv.Atoi(page.(string))
  459. }
  460. if Typeof(perpage) == "int" {
  461. pagesize = perpage.(int)
  462. } else {
  463. pagesize, _ = strconv.Atoi(perpage.(string))
  464. }
  465. meta["page"] = pageno
  466. meta["perpage"] = pagesize
  467. //limit = limit + " limit " + strconv.Itoa((pageno-1)*pagesize) + "," + strconv.Itoa(pageno*pagesize)
  468. limit = " limit " + strconv.Itoa((pageno-1)*pagesize) + "," + strconv.Itoa(pagesize)
  469. } else {
  470. limit = limit + " limit 0,1000000"
  471. }
  472. }
  473. return limit, meta
  474. }
  475. func IsUTF8(data []byte) bool {
  476. var preNUm = func(data byte) int {
  477. str := fmt.Sprintf("%b", data)
  478. var i int = 0
  479. for i < len(str) {
  480. if str[i] != '1' {
  481. break
  482. }
  483. i++
  484. }
  485. return i
  486. }
  487. for i := 0; i < len(data); {
  488. if data[i]&0x80 == 0x00 {
  489. // 0XXX_XXXX
  490. i++
  491. continue
  492. } else if num := preNUm(data[i]); num > 2 {
  493. // 110X_XXXX 10XX_XXXX
  494. // 1110_XXXX 10XX_XXXX 10XX_XXXX
  495. // 1111_0XXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
  496. // 1111_10XX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
  497. // 1111_110X 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX 10XX_XXXX
  498. // preNUm() 返回首个字节的8个bits中首个0bit前面1bit的个数,该数量也是该字符所使用的字节数
  499. i++
  500. for j := 0; j < num-1; j++ {
  501. //判断后面的 num - 1 个字节是不是都是10开头
  502. if data[i]&0xc0 != 0x80 {
  503. return false
  504. }
  505. i++
  506. }
  507. } else {
  508. //其他情况说明不是utf-8
  509. return false
  510. }
  511. }
  512. return true
  513. }
  514. func IsGBK(data []byte) bool {
  515. length := len(data)
  516. var i int = 0
  517. for i < length {
  518. //fmt.Printf("for %x\n", data[i])
  519. if data[i] <= 0xff {
  520. //编码小于等于127,只有一个字节的编码,兼容ASCII吗
  521. i++
  522. continue
  523. } else {
  524. //大于127的使用双字节编码
  525. if data[i] >= 0x81 &&
  526. data[i] <= 0xfe &&
  527. data[i+1] >= 0x40 &&
  528. data[i+1] <= 0xfe &&
  529. data[i+1] != 0xf7 {
  530. i += 2
  531. continue
  532. } else {
  533. return false
  534. }
  535. }
  536. }
  537. return true
  538. }
  539. func HasChineseChar(str string) bool {
  540. for _, r := range str {
  541. if unicode.Is(unicode.Han, r) || (regexp.MustCompile("[\u3002\uff1b\uff0c\uff1a\u201c\u201d\uff08\uff09\u3001\uff1f\u300a\u300b]").MatchString(string(r))) {
  542. return true
  543. }
  544. }
  545. return false
  546. }
  547. //字节转换成字符,支持中文转换。
  548. //charset:GB18030|UTF-8
  549. func ConvertByte2String(byte []byte, charset string) string {
  550. var str string
  551. switch charset {
  552. case "GB18030":
  553. var decodeBytes, _ = simplifiedchinese.GB18030.NewDecoder().Bytes(byte)
  554. str = string(decodeBytes)
  555. case "UTF-8":
  556. fallthrough
  557. default:
  558. str = string(byte)
  559. }
  560. return str
  561. }
  562. //IP verify.支持通配符*
  563. func VerifyIPFormat(ip string) bool {
  564. if ip == "" {
  565. return false
  566. }
  567. ipParts := strings.Split(ip, ".")
  568. if len(ipParts) != 3 {
  569. return false
  570. }
  571. for _, v := range ipParts {
  572. if v != "*" {
  573. v1, e := strconv.Atoi(v)
  574. if e != nil {
  575. return false
  576. }
  577. if v1 < 0 || v1 > 255 {
  578. return false
  579. }
  580. }
  581. }
  582. return true
  583. }
  584. //email verify
  585. func VerifyEmailFormat(email string) bool {
  586. pattern := `\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*` //匹配电子邮箱
  587. //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}$`
  588. reg := regexp.MustCompile(pattern)
  589. return reg.MatchString(email)
  590. }
  591. //mobile verify
  592. func VerifyMobileFormat(mobileNum string) bool {
  593. 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}$"
  594. reg := regexp.MustCompile(regular)
  595. return reg.MatchString(mobileNum)
  596. }
  597. func Unzip(zipFile string, destDir string) error {
  598. zipReader, err := zip.OpenReader(zipFile)
  599. if err != nil {
  600. return err
  601. }
  602. defer zipReader.Close()
  603. decodeName := ""
  604. for _, f := range zipReader.File {
  605. if f.Flags == 1 {
  606. //如果标志为是 1 << 11也就是 2048 则是utf-8编码
  607. decodeName = f.Name
  608. } else {
  609. //如果标致位是0或其他 则是默认的本地编码 默认为gbk
  610. i := bytes.NewReader([]byte(f.Name))
  611. decoder := transform.NewReader(i, simplifiedchinese.GBK.NewDecoder())
  612. content, _ := ioutil.ReadAll(decoder)
  613. decodeName = string(content)
  614. }
  615. fpath := filepath.Join(destDir, decodeName)
  616. if f.FileInfo().IsDir() {
  617. os.MkdirAll(fpath, os.ModePerm)
  618. } else {
  619. if err = os.MkdirAll(filepath.Dir(fpath), os.ModePerm); err != nil {
  620. return err
  621. }
  622. inFile, err := f.Open()
  623. if err != nil {
  624. return err
  625. }
  626. defer inFile.Close()
  627. outFile, err := os.OpenFile(fpath, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode())
  628. if err != nil {
  629. return err
  630. }
  631. defer outFile.Close()
  632. _, err = io.Copy(outFile, inFile)
  633. if err != nil {
  634. return err
  635. }
  636. }
  637. }
  638. return nil
  639. }
  640. func Zip(srcFile string, destZip string) error {
  641. zipfile, err := os.Create(destZip)
  642. if err != nil {
  643. return err
  644. }
  645. defer zipfile.Close()
  646. archive := zip.NewWriter(zipfile)
  647. defer archive.Close()
  648. filepath.Walk(srcFile, func(path string, info os.FileInfo, err error) error {
  649. if err != nil {
  650. return err
  651. }
  652. header, err := zip.FileInfoHeader(info)
  653. if err != nil {
  654. return err
  655. }
  656. header.Name = strings.TrimPrefix(path, filepath.Dir(srcFile)+string(os.PathSeparator))
  657. // header.Name = path
  658. if info.IsDir() {
  659. header.Name += string(os.PathSeparator)
  660. } else {
  661. header.Method = zip.Deflate
  662. }
  663. writer, err := archive.CreateHeader(header)
  664. if err != nil {
  665. return err
  666. }
  667. if !info.IsDir() {
  668. file, err := os.Open(path)
  669. if err != nil {
  670. return err
  671. }
  672. defer file.Close()
  673. _, err = io.Copy(writer, file)
  674. }
  675. return err
  676. })
  677. return err
  678. }
  679. func ZipMutile(srcFileList []string, destZip string) error {
  680. zipfile, err := os.OpenFile(destZip, os.O_CREATE|os.O_RDWR|os.O_APPEND, fs.ModePerm)
  681. if err != nil {
  682. return err
  683. }
  684. defer zipfile.Close()
  685. //zipfile.Seek(0, os.SEEK_END)
  686. archive := zip.NewWriter(zipfile)
  687. defer archive.Close()
  688. for _, srcFile := range srcFileList {
  689. filepath.Walk(srcFile, func(path string, info os.FileInfo, err error) error {
  690. if err != nil {
  691. return err
  692. }
  693. header, err := zip.FileInfoHeader(info)
  694. if err != nil {
  695. return err
  696. }
  697. header.Name = strings.TrimPrefix(path, filepath.Dir(srcFile)+string(os.PathSeparator))
  698. // header.Name = path
  699. if info.IsDir() {
  700. header.Name += string(os.PathSeparator)
  701. } else {
  702. header.Method = zip.Deflate
  703. }
  704. writer, err := archive.CreateHeader(header)
  705. if err != nil {
  706. return err
  707. }
  708. if !info.IsDir() {
  709. file, err := os.Open(path)
  710. if err != nil {
  711. return err
  712. }
  713. defer file.Close()
  714. _, err = io.Copy(writer, file)
  715. }
  716. return err
  717. })
  718. }
  719. return err
  720. }
  721. func Utf8ToGBK(text string) (string, error) {
  722. dst := make([]byte, len(text)*2)
  723. tr := simplifiedchinese.GB18030.NewEncoder()
  724. nDst, _, err := tr.Transform(dst, []byte(text), true)
  725. if err != nil {
  726. return text, err
  727. }
  728. return string(dst[:nDst]), nil
  729. }
  730. //统一删除数据表记录
  731. func DeleteTableReorce(tableName, primaryField, Id string) error {
  732. o := orm.NewOrm()
  733. var sqlParameter []interface{}
  734. var sqlCommandText = "delete from " + tableName + " where " + primaryField + "=?;"
  735. sqlParameter = append(sqlParameter, Id)
  736. _, err := o.Raw(sqlCommandText, sqlParameter).Exec()
  737. return err
  738. }
  739. //获得单条数据记录
  740. func GetSingleRecord(tableName, primaryField, Id string) ([]orm.Params, error) {
  741. o := orm.NewOrm()
  742. var sqlParameter []interface{}
  743. var sqlCommandText string
  744. if tableName == "t_data_monitor_task" {
  745. 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 " +
  746. "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=?"
  747. sqlParameter = append(sqlParameter, Id)
  748. } else {
  749. sqlCommandText = "select * from " + tableName + " where " + primaryField + "=?;"
  750. sqlParameter = append(sqlParameter, Id)
  751. }
  752. var tableData []orm.Params
  753. _, err := o.Raw(sqlCommandText, sqlParameter).Values(&tableData)
  754. return tableData, err
  755. }
  756. func LocalIPv4() (string, error) {
  757. ifaces, err := net.Interfaces()
  758. if err != nil {
  759. return "", err
  760. }
  761. for _, iface := range ifaces {
  762. if iface.Flags&net.FlagUp == 0 {
  763. continue
  764. }
  765. if iface.Flags&net.FlagLoopback != 0 {
  766. continue
  767. }
  768. addrs, err := iface.Addrs()
  769. if err != nil {
  770. return "", err
  771. }
  772. for _, addr := range addrs {
  773. var ip net.IP
  774. switch v := addr.(type) {
  775. case *net.IPNet:
  776. ip = v.IP
  777. case *net.IPAddr:
  778. ip = v.IP
  779. }
  780. if ip == nil || ip.IsLoopback() {
  781. continue
  782. }
  783. ip = ip.To4()
  784. if ip == nil {
  785. continue
  786. }
  787. return ip.String(), nil
  788. }
  789. }
  790. return "", errors.New("未连接网络")
  791. }
  792. //获取当前运行程序版本号
  793. func GetVersion() string {
  794. exename := conf.GlobalConfig["appid"]
  795. if exename == "" {
  796. logger.Logger.Println("系统还未配置appid属性,请正确设置后再试!")
  797. os.Exit(0)
  798. return ""
  799. }
  800. if string(runtime.GOOS) == "windows" {
  801. exename = exename + ".exe"
  802. }
  803. f, err1 := os.Open(exename)
  804. if err1 != nil {
  805. logger.Logger.Println("获取版本号失败,请检查appid是否与程序名称匹配!")
  806. logger.Logger.Error(err1)
  807. os.Exit(0)
  808. return ""
  809. }
  810. fi, err2 := f.Stat()
  811. if err2 != nil {
  812. logger.Logger.Info("获取版本号失败:")
  813. logger.Logger.Error(err2)
  814. return ""
  815. }
  816. return fi.ModTime().Format("20060102-15")
  817. }
  818. func GetAppCurPath() string {
  819. file, _ := exec.LookPath(os.Args[0])
  820. execpath, _ := filepath.Abs(file)
  821. execpath = filepath.Dir(execpath)
  822. if execpath[len(execpath)-1:] != string(os.PathSeparator) {
  823. execpath = execpath + string(os.PathSeparator)
  824. }
  825. return execpath
  826. }