github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/pkg/util/common.go (about)

     1  package util
     2  
     3  import (
     4  	"math/rand"
     5  	"path/filepath"
     6  	"regexp"
     7  	"strings"
     8  	"time"
     9  )
    10  
    11  func init() {
    12  	rand.Seed(time.Now().UnixNano())
    13  }
    14  
    15  // RandStringRunes 返回随机字符串
    16  func RandStringRunes(n int) string {
    17  	var letterRunes = []rune("1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ")
    18  
    19  	b := make([]rune, n)
    20  	for i := range b {
    21  		b[i] = letterRunes[rand.Intn(len(letterRunes))]
    22  	}
    23  	return string(b)
    24  }
    25  
    26  // ContainsUint 返回list中是否包含
    27  func ContainsUint(s []uint, e uint) bool {
    28  	for _, a := range s {
    29  		if a == e {
    30  			return true
    31  		}
    32  	}
    33  	return false
    34  }
    35  
    36  // IsInExtensionList 返回文件的扩展名是否在给定的列表范围内
    37  func IsInExtensionList(extList []string, fileName string) bool {
    38  	ext := strings.ToLower(filepath.Ext(fileName))
    39  	// 无扩展名时
    40  	if len(ext) == 0 {
    41  		return false
    42  	}
    43  
    44  	if ContainsString(extList, ext[1:]) {
    45  		return true
    46  	}
    47  
    48  	return false
    49  }
    50  
    51  // ContainsString 返回list中是否包含
    52  func ContainsString(s []string, e string) bool {
    53  	for _, a := range s {
    54  		if a == e {
    55  			return true
    56  		}
    57  	}
    58  	return false
    59  }
    60  
    61  // Replace 根据替换表执行批量替换
    62  func Replace(table map[string]string, s string) string {
    63  	for key, value := range table {
    64  		s = strings.Replace(s, key, value, -1)
    65  	}
    66  	return s
    67  }
    68  
    69  // BuildRegexp 构建用于SQL查询用的多条件正则
    70  func BuildRegexp(search []string, prefix, suffix, condition string) string {
    71  	var res string
    72  	for key, value := range search {
    73  		res += prefix + regexp.QuoteMeta(value) + suffix
    74  		if key < len(search)-1 {
    75  			res += condition
    76  		}
    77  	}
    78  	return res
    79  }
    80  
    81  // BuildConcat 根据数据库类型构建字符串连接表达式
    82  func BuildConcat(str1, str2 string, DBType string) string {
    83  	switch DBType {
    84  	case "mysql":
    85  		return "CONCAT(" + str1 + "," + str2 + ")"
    86  	default:
    87  		return str1 + "||" + str2
    88  	}
    89  }
    90  
    91  // SliceIntersect 求两个切片交集
    92  func SliceIntersect(slice1, slice2 []string) []string {
    93  	m := make(map[string]int)
    94  	nn := make([]string, 0)
    95  	for _, v := range slice1 {
    96  		m[v]++
    97  	}
    98  
    99  	for _, v := range slice2 {
   100  		times, _ := m[v]
   101  		if times == 1 {
   102  			nn = append(nn, v)
   103  		}
   104  	}
   105  	return nn
   106  }
   107  
   108  // SliceDifference 求两个切片差集
   109  func SliceDifference(slice1, slice2 []string) []string {
   110  	m := make(map[string]int)
   111  	nn := make([]string, 0)
   112  	inter := SliceIntersect(slice1, slice2)
   113  	for _, v := range inter {
   114  		m[v]++
   115  	}
   116  
   117  	for _, value := range slice1 {
   118  		times, _ := m[value]
   119  		if times == 0 {
   120  			nn = append(nn, value)
   121  		}
   122  	}
   123  	return nn
   124  }