169 lines
3.5 KiB
Go
169 lines
3.5 KiB
Go
package util
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/eiannone/keyboard"
|
|
"math/rand"
|
|
"reflect"
|
|
"regexp"
|
|
"strconv"
|
|
"time"
|
|
)
|
|
|
|
const (
|
|
// RED 红色
|
|
RED = "\033[31m"
|
|
// GREEN 绿色
|
|
GREEN = "\033[32m"
|
|
// YELLOW 黄色
|
|
YELLOW = "\033[33m"
|
|
// BLUE 蓝色
|
|
BLUE = "\033[34m"
|
|
// FUCHSIA 紫红色
|
|
FUCHSIA = "\033[35m"
|
|
// CYAN 青色
|
|
CYAN = "\033[36m"
|
|
// WHITE 白色
|
|
WHITE = "\033[37m"
|
|
// RESET 重置颜色
|
|
RESET = "\033[0m"
|
|
// LETTER 大小写英文字母常量
|
|
LETTER = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
|
// DIGITS 数字常量
|
|
DIGITS = "0123456789"
|
|
// SPECIALS 特殊字符常量
|
|
SPECIALS = "~=+%^*/()[]{}/!@#$?|"
|
|
// ALL 全部字符常量
|
|
ALL = LETTER + DIGITS + SPECIALS
|
|
)
|
|
|
|
// IsInteger 判断字符串是否为整数
|
|
func IsInteger(input string) bool {
|
|
_, err := strconv.Atoi(input)
|
|
return err == nil
|
|
}
|
|
|
|
// RandString 随机字符串
|
|
func RandString(length int, source string) string {
|
|
var runes = []rune(source)
|
|
b := make([]rune, length)
|
|
rand.New(rand.NewSource(time.Now().UnixNano()))
|
|
for i := range b {
|
|
b[i] = runes[rand.Intn(len(runes))]
|
|
}
|
|
return string(b)
|
|
}
|
|
|
|
// VerifyEmailFormat 邮箱验证
|
|
func VerifyEmailFormat(email string) bool {
|
|
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}$`
|
|
reg := regexp.MustCompile(pattern)
|
|
return reg.MatchString(email)
|
|
}
|
|
|
|
func getChar(str string) string {
|
|
err := keyboard.Open()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
defer keyboard.Close()
|
|
fmt.Print(str)
|
|
char, _, _ := keyboard.GetKey()
|
|
fmt.Printf("%c\n", char)
|
|
if char == 0 {
|
|
return ""
|
|
}
|
|
return string(char)
|
|
}
|
|
|
|
// LoopInput 循环输入选择, 或者直接回车退出
|
|
func LoopInput(tip string, choices interface{}, singleRowPrint bool) int {
|
|
reflectValue := reflect.ValueOf(choices)
|
|
if reflectValue.Kind() != reflect.Slice && reflectValue.Kind() != reflect.Array {
|
|
fmt.Println("only support slice or array type!")
|
|
return -1
|
|
}
|
|
length := reflectValue.Len()
|
|
if reflectValue.Type().String() == "[]string" {
|
|
if singleRowPrint {
|
|
for i := 0; i < length; i++ {
|
|
fmt.Printf("%d.%s\n\n", i+1, reflectValue.Index(i).Interface())
|
|
}
|
|
} else {
|
|
for i := 0; i < length; i++ {
|
|
if i%2 == 0 {
|
|
fmt.Printf("%d.%-15s\t", i+1, reflectValue.Index(i).Interface())
|
|
} else {
|
|
fmt.Printf("%d.%-15s\n\n", i+1, reflectValue.Index(i).Interface())
|
|
}
|
|
}
|
|
}
|
|
}
|
|
for {
|
|
inputString := ""
|
|
if length < 10 {
|
|
inputString = getChar(tip)
|
|
} else {
|
|
fmt.Print(tip)
|
|
_, _ = fmt.Scanln(&inputString)
|
|
}
|
|
if inputString == "" {
|
|
return -1
|
|
} else if !IsInteger(inputString) {
|
|
fmt.Println("输入有误,请重新输入")
|
|
continue
|
|
}
|
|
number, _ := strconv.Atoi(inputString)
|
|
if number <= length && number > 0 {
|
|
return number
|
|
}
|
|
fmt.Println("输入数字越界,请重新输入")
|
|
}
|
|
}
|
|
|
|
// Input 读取终端用户输入
|
|
func Input(tip string, defaultValue string) string {
|
|
input := ""
|
|
fmt.Print(tip)
|
|
_, _ = fmt.Scanln(&input)
|
|
if input == "" && defaultValue != "" {
|
|
input = defaultValue
|
|
}
|
|
return input
|
|
}
|
|
|
|
// Red 红色
|
|
func Red(str string) string {
|
|
return RED + str + RESET
|
|
}
|
|
|
|
// Green 绿色
|
|
func Green(str string) string {
|
|
return GREEN + str + RESET
|
|
}
|
|
|
|
// Yellow 黄色
|
|
func Yellow(str string) string {
|
|
return YELLOW + str + RESET
|
|
}
|
|
|
|
// Blue 蓝色
|
|
func Blue(str string) string {
|
|
return BLUE + str + RESET
|
|
}
|
|
|
|
// Fuchsia 紫红色
|
|
func Fuchsia(str string) string {
|
|
return FUCHSIA + str + RESET
|
|
}
|
|
|
|
// Cyan 青色
|
|
func Cyan(str string) string {
|
|
return CYAN + str + RESET
|
|
}
|
|
|
|
// White 白色
|
|
func White(str string) string {
|
|
return WHITE + str + RESET
|
|
}
|