Apply .gitignore rules
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
package sensitiveWordsMgr
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
// type Persion struct {
|
||||
// name string
|
||||
// }
|
||||
|
||||
// 屏蔽字详细信息
|
||||
func Test1(t *testing.T) {
|
||||
//启动获取敏感字
|
||||
refreshSensitiveWord()
|
||||
|
||||
words, pos, exist := SensitiveWords("测试,测试")
|
||||
if exist {
|
||||
t.Log(words, pos)
|
||||
}
|
||||
|
||||
t.Log("END")
|
||||
}
|
||||
@@ -0,0 +1,377 @@
|
||||
package utils
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"compress/flate"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"goutil/logUtilPlus"
|
||||
"io/ioutil"
|
||||
"math/rand"
|
||||
"net/http"
|
||||
"runtime/debug"
|
||||
"strconv"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
// 定义常量
|
||||
var MinDateTime = time.Date(2000, 1, 1, 0, 0, 0, 0, time.Local)
|
||||
var MaxDateTime = time.Date(3000, 1, 1, 0, 0, 0, 0, time.Local)
|
||||
var GuidEmpty = "00000000-0000-0000-0000-000000000000"
|
||||
|
||||
// IsTrue
|
||||
// @description: 是否为true
|
||||
// parameter:
|
||||
// @data: []byte格式的bool信息
|
||||
// return:
|
||||
// @bool: 返回布尔值
|
||||
func IsTrue(data []byte) bool {
|
||||
|
||||
if data == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
if len(data) == 0 {
|
||||
return false
|
||||
}
|
||||
|
||||
if data[0] == 0 {
|
||||
return false
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
// ConvertBooleanToBytes
|
||||
// @description: bool型转换成byte数组
|
||||
// parameter:
|
||||
// @status: 状态
|
||||
// return:
|
||||
// @[]byte: 返回字节数组
|
||||
func ConvertBooleanToBytes(status bool) []byte {
|
||||
|
||||
if status == false {
|
||||
return []byte{0}
|
||||
} else {
|
||||
return []byte{1}
|
||||
}
|
||||
}
|
||||
|
||||
// StrSliceJoinToStr
|
||||
// @description: 将[]string组装成字符串
|
||||
// parameter:
|
||||
// @numArray: 源int32数组
|
||||
// @sep: 分割字符串
|
||||
// return:
|
||||
// @string: 组成的字符串
|
||||
func StrSliceJoinToStr(numArray []string, sep string) string {
|
||||
str := ""
|
||||
if numArray == nil || len(numArray) == 0 {
|
||||
return str
|
||||
}
|
||||
|
||||
for _, n := range numArray {
|
||||
str += fmt.Sprintf("%s%s", n, sep)
|
||||
}
|
||||
|
||||
str = strings.TrimSuffix(str, sep)
|
||||
|
||||
return str
|
||||
}
|
||||
|
||||
// Int32SliceJoinToStr
|
||||
// @description: 将[]int32转换成字符串
|
||||
// parameter:
|
||||
// @source: 资源
|
||||
// @sep: 分隔符
|
||||
// return:
|
||||
// @result: 字符串
|
||||
func Int32SliceJoinToStr(source []int32, sep string) (result string) {
|
||||
if source == nil || len(source) == 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
for _, s := range source {
|
||||
result += fmt.Sprintf("%d%s", s, sep)
|
||||
}
|
||||
|
||||
result = strings.TrimRight(result, sep)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// SplitToStrSlice
|
||||
// @description: 将字符串切割为[]string
|
||||
// parameter:
|
||||
// @s: 输入字符串
|
||||
// @sep: 分割字符串
|
||||
// @removeEmpty: 是否去除空字符串
|
||||
// return:
|
||||
// @resultSlice: 字符串列表
|
||||
func SplitToStrSlice(s, sep string, removeEmpty bool) (resultSlice []string) {
|
||||
if len(s) == 0 {
|
||||
return make([]string, 0)
|
||||
}
|
||||
|
||||
// 先按照分隔符进行切割
|
||||
strSlice := strings.Split(s, sep)
|
||||
|
||||
for _, value := range strSlice {
|
||||
if removeEmpty {
|
||||
// 去除空格
|
||||
if value = strings.TrimSpace(value); value == "" {
|
||||
continue
|
||||
}
|
||||
}
|
||||
|
||||
resultSlice = append(resultSlice, value)
|
||||
}
|
||||
|
||||
return resultSlice
|
||||
}
|
||||
|
||||
// ParseTimeString
|
||||
// @description: 解析时间字符串
|
||||
// parameter:
|
||||
// @timeStr: 时间字符串,例:12:33:12
|
||||
// return:
|
||||
// @hour: 小时
|
||||
// @minute: 分钟
|
||||
// @second: 秒数
|
||||
func ParseTimeString(timeStr string) (hour int, minute int, second int) {
|
||||
timeSlice := strings.Split(timeStr, ":")
|
||||
if len(timeSlice) != 3 {
|
||||
return
|
||||
}
|
||||
|
||||
hour, _ = strconv.Atoi(timeSlice[0])
|
||||
minute, _ = strconv.Atoi(timeSlice[1])
|
||||
second, _ = strconv.Atoi(timeSlice[2])
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Rm_duplicate_string
|
||||
// @description: 去重
|
||||
// parameter:
|
||||
// @list: 列表
|
||||
// return:
|
||||
// @[]string: 去重后的数据
|
||||
func Rm_duplicate_string(list []string) []string {
|
||||
var x []string = []string{}
|
||||
for _, i := range list {
|
||||
if len(x) == 0 {
|
||||
x = append(x, i)
|
||||
} else {
|
||||
for k, v := range x {
|
||||
if i == v {
|
||||
break
|
||||
}
|
||||
if k == len(x)-1 {
|
||||
x = append(x, i)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return x
|
||||
}
|
||||
|
||||
// Rm_duplicate_int32
|
||||
// @description: 去重
|
||||
// parameter:
|
||||
// @list: 列表数据
|
||||
// return:
|
||||
// @[]int32: 去重后的结果
|
||||
func Rm_duplicate_int32(list []int32) []int32 {
|
||||
var x []int32 = []int32{}
|
||||
for _, i := range list {
|
||||
if len(x) == 0 {
|
||||
x = append(x, i)
|
||||
} else {
|
||||
for k, v := range x {
|
||||
if i == v {
|
||||
break
|
||||
}
|
||||
if k == len(x)-1 {
|
||||
x = append(x, i)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return x
|
||||
}
|
||||
|
||||
// RandomAarrayOfInt32
|
||||
// @description: int32数组乱序
|
||||
// parameter:
|
||||
// @arr: 数组
|
||||
// return:
|
||||
func RandomAarrayOfInt32(arr []int32) {
|
||||
|
||||
if arr == nil {
|
||||
return
|
||||
}
|
||||
|
||||
if len(arr) <= 0 {
|
||||
return
|
||||
}
|
||||
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
|
||||
for i := len(arr) - 1; i > 0; i-- {
|
||||
num := rand.Intn(i + 1)
|
||||
arr[i], arr[num] = arr[num], arr[i]
|
||||
}
|
||||
}
|
||||
|
||||
// RandomAarrayOfString
|
||||
// @description: string数组乱序
|
||||
// parameter:
|
||||
// @arr: 数组
|
||||
// return:
|
||||
func RandomAarrayOfString(arr []string) {
|
||||
|
||||
if arr == nil {
|
||||
return
|
||||
}
|
||||
|
||||
if len(arr) <= 0 {
|
||||
return
|
||||
}
|
||||
|
||||
rand.Seed(time.Now().UnixNano())
|
||||
|
||||
for i := len(arr) - 1; i > 0; i-- {
|
||||
num := rand.Intn(i + 1)
|
||||
arr[i], arr[num] = arr[num], arr[i]
|
||||
}
|
||||
}
|
||||
|
||||
// LogErrorRecover
|
||||
// @description: 记录错误
|
||||
// parameter:
|
||||
// return:
|
||||
func LogErrorRecover() {
|
||||
if err := recover(); err != nil {
|
||||
tmsg := fmt.Sprintf("err msg:%s stack:%s", err, debug.Stack())
|
||||
logUtilPlus.ErrorLog(tmsg)
|
||||
}
|
||||
}
|
||||
|
||||
// LogReqErrorRecover
|
||||
// @description: 记录错误
|
||||
// parameter:
|
||||
// @r:
|
||||
// return:
|
||||
func LogReqErrorRecover(r *http.Request) {
|
||||
if err := recover(); err != nil {
|
||||
b, err := json.Marshal(r)
|
||||
reqStr := ""
|
||||
if err == nil {
|
||||
reqStr = string(b)
|
||||
}
|
||||
tmsg := fmt.Sprintf("RequestInfo:%s .err msg:%s stack:%s", reqStr, err, debug.Stack())
|
||||
logUtilPlus.ErrorLog(tmsg)
|
||||
}
|
||||
}
|
||||
|
||||
// StringSliceIsExists
|
||||
// @description: StringSliceIsExists
|
||||
// parameter:
|
||||
// @strList: strList
|
||||
// @val: val
|
||||
// return:
|
||||
// @bool: 是否存在
|
||||
func StringSliceIsExists(strList []string, val string) bool {
|
||||
|
||||
if strList == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
for _, v := range strList {
|
||||
if v == val {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// Int64SliceIsExists
|
||||
// @description: Int64SliceIsExists
|
||||
// parameter:
|
||||
// @strList: strList
|
||||
// @val: val
|
||||
// return:
|
||||
// @bool: 是否存在
|
||||
func Int64SliceIsExists(strList []int64, val int64) bool {
|
||||
|
||||
if strList == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
for _, v := range strList {
|
||||
if v == val {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// SliceIsExists
|
||||
// @description: SliceIsExists
|
||||
// parameter:
|
||||
// @n: n
|
||||
// @f: f
|
||||
// return:
|
||||
// @bool: 是否存在
|
||||
func SliceIsExists(n int, f func(int) bool) bool {
|
||||
|
||||
for i := 0; i < n; i++ {
|
||||
if f(i) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// FlateEncode
|
||||
// @description: 压缩字符串
|
||||
// parameter:
|
||||
// @input: 输入字符列表
|
||||
// return:
|
||||
// @result: 结果字符列表
|
||||
// @err: 错误信息
|
||||
func FlateEncode(input []byte) (result []byte, err error) {
|
||||
var buf bytes.Buffer
|
||||
w, err := flate.NewWriter(&buf, flate.DefaultCompression)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 无法使用defer close使用无法拿到结果
|
||||
_, err = w.Write(input)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
w.Close()
|
||||
|
||||
result = buf.Bytes()
|
||||
return
|
||||
}
|
||||
|
||||
// FlateDecode
|
||||
// @description: FlateDecode
|
||||
// parameter:
|
||||
// @input: 输入字符列表
|
||||
// return:
|
||||
// @result: 结果字符列表
|
||||
// @err: 错误信息
|
||||
func FlateDecode(input []byte) (result []byte, err error) {
|
||||
result, err = ioutil.ReadAll(flate.NewReader(bytes.NewReader(input)))
|
||||
return
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package admin
|
||||
|
||||
import (
|
||||
"common/connection"
|
||||
)
|
||||
|
||||
func init() {
|
||||
//注册数据库
|
||||
connection.RegisterDBModel(&Admin{})
|
||||
}
|
||||
|
||||
type Admin struct {
|
||||
ID int64 `gorm:"column:id;primary_key;comment:管理员id;autoIncrementIncrement" json:"id"`
|
||||
//账号
|
||||
Account string `gorm:"column:account;comment:账号" json:"account"`
|
||||
Name string `gorm:"column:name;comment:管理员名称" json:"name"`
|
||||
Password string `gorm:"column:password;comment:管理员密码" json:"password"`
|
||||
//性别
|
||||
Sex int32 `gorm:"column:sex;comment:性别" json:"sex"`
|
||||
//生日
|
||||
Birthday string `gorm:"column:birthday;comment:生日" json:"birthday"`
|
||||
//手机
|
||||
Phone int64 `gorm:"column:phone;comment:手机" json:"phone"`
|
||||
//邮箱
|
||||
Email string `gorm:"column:email;comment:邮箱" json:"email"`
|
||||
//微信群【方便发送通知】
|
||||
WechatGroup string `gorm:"column:wechat_group;comment:微信群" json:"wechat_group"`
|
||||
//备注
|
||||
Describe string `gorm:"column:describe;comment:备注" json:"describe"`
|
||||
}
|
||||
|
||||
func (Admin) TableName() string {
|
||||
return "admin"
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
package validationUtil
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
// 身份证测试
|
||||
func TestIdCard(t *testing.T) {
|
||||
idno := "450325197410077393"
|
||||
if IsValideIdno(idno) == false {
|
||||
t.Error("身份证验证出错:", idno)
|
||||
t.Fail()
|
||||
}
|
||||
idno = "36062219701120774X"
|
||||
if IsValideIdno(idno) == false {
|
||||
t.Error("身份证验证出错:", idno)
|
||||
t.Fail()
|
||||
}
|
||||
idno = "450325197410071111"
|
||||
if IsValideIdno(idno) == false {
|
||||
t.Error("身份证验证出错:", idno)
|
||||
t.Fail()
|
||||
}
|
||||
idno = "3123123123"
|
||||
if IsValideIdno(idno) == true {
|
||||
t.Error("身份证验证出错:", idno)
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
// 邮箱测试
|
||||
func TestMail(t *testing.T) {
|
||||
mail := "nihao@qq.com"
|
||||
if IsValideEmail(mail) == false {
|
||||
t.Error("邮箱验证出错:", mail)
|
||||
t.Fail()
|
||||
}
|
||||
mail = "111@qq.com"
|
||||
if IsValideEmail(mail) == false {
|
||||
t.Error("邮箱验证出错:", mail)
|
||||
t.Fail()
|
||||
}
|
||||
mail = "111_@qq.com"
|
||||
if IsValideEmail(mail) == false {
|
||||
t.Error("邮箱验证出错:", mail)
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
|
||||
// 验证中国的手机号
|
||||
func TestChinesePhone(t *testing.T) {
|
||||
phoneNum := "15111111111"
|
||||
if IsValideChinesePhoneNum(phoneNum) == false {
|
||||
t.Error("手机号验证出错:", phoneNum)
|
||||
t.Fail()
|
||||
}
|
||||
phoneNum = "11111"
|
||||
if IsValideChinesePhoneNum(phoneNum) == true {
|
||||
t.Error("手机号验证出错:", phoneNum)
|
||||
t.Fail()
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,137 @@
|
||||
package mysqlUtil
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"fmt"
|
||||
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"goutil/logUtil"
|
||||
)
|
||||
|
||||
// 打开数据库连接
|
||||
// connectionString:数据库连接字符串,格式:root:moqikaka3306@tcp(10.1.0.10:3306)/gameserver_data?charset=utf8&parseTime=true&loc=Local&timeout=60s||MaxOpenConns=10||MaxIdleConns=5
|
||||
// 返回值:
|
||||
// 数据库对象
|
||||
// 错误对象
|
||||
func OpenMysqlConnection(connectionString string) (dbObj *sql.DB, err error) {
|
||||
dbConfigObj, err1 := NewDBConfig2(connectionString)
|
||||
if err1 != nil {
|
||||
err = err1
|
||||
return
|
||||
}
|
||||
|
||||
dbObj, err = OpenMysqlConnection3(dbConfigObj)
|
||||
return
|
||||
}
|
||||
|
||||
// 打开数据库连接
|
||||
// connectionString:数据库连接字符串
|
||||
// maxOpenConns:最大打开的连接数
|
||||
// maxIdleConns:最大处于闲置状态的连接数
|
||||
// 返回值:
|
||||
// 数据库对象
|
||||
// 错误对象
|
||||
func OpenMysqlConnection2(connectionString string, maxOpenConns, maxIdleConns int) (dbObj *sql.DB, err error) {
|
||||
dbConfigObj := NewDBConfig(connectionString, maxOpenConns, maxIdleConns)
|
||||
dbObj, err = OpenMysqlConnection3(dbConfigObj)
|
||||
return
|
||||
}
|
||||
|
||||
// 建立Mysql数据库连接
|
||||
// dbConfigObj:数据库配置对象
|
||||
// 返回值:
|
||||
// 数据库对象
|
||||
// 错误对象
|
||||
func OpenMysqlConnection3(dbConfigObj *DBConfig) (dbObj *sql.DB, err error) {
|
||||
// 建立数据库连接
|
||||
logUtil.DebugLog("开始连接Mysql数据库")
|
||||
dbObj, err = sql.Open("mysql", dbConfigObj.ConnectionString)
|
||||
if err != nil {
|
||||
err = fmt.Errorf("打开游戏数据库失败,连接字符串为:%s", dbConfigObj.ConnectionString)
|
||||
return
|
||||
}
|
||||
logUtil.DebugLog("连接Mysql数据库成功")
|
||||
|
||||
if dbConfigObj.MaxOpenConns > 0 && dbConfigObj.MaxIdleConns > 0 {
|
||||
dbObj.SetMaxOpenConns(dbConfigObj.MaxOpenConns)
|
||||
dbObj.SetMaxIdleConns(dbConfigObj.MaxIdleConns)
|
||||
}
|
||||
|
||||
if err = dbObj.Ping(); err != nil {
|
||||
err = fmt.Errorf("Ping数据库失败,连接字符串为:%s,错误信息为:%s", dbConfigObj.ConnectionString, err)
|
||||
return
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// 测试数据库连接
|
||||
// dbObj:数据库连对象
|
||||
// 返回值:
|
||||
// 错误对象
|
||||
func TestConnection(dbObj *sql.DB) error {
|
||||
command := "SHOW DATABASES;"
|
||||
rows, err := dbObj.Query(command)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
defer rows.Close()
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// 开始事务
|
||||
// db:数据库对象
|
||||
// 返回值:
|
||||
// 事务对象
|
||||
// 错误对象
|
||||
func BeginTransaction(dbObj *sql.DB) (*sql.Tx, error) {
|
||||
tx, err := dbObj.Begin()
|
||||
if err != nil {
|
||||
logUtil.Log(fmt.Sprintf("开启事务失败,错误信息:%s", err), logUtil.Error, true)
|
||||
}
|
||||
|
||||
return tx, err
|
||||
}
|
||||
|
||||
// 提交事务
|
||||
// tx:事务对象
|
||||
// 返回值:
|
||||
// 错误对象
|
||||
func CommitTransaction(tx *sql.Tx) error {
|
||||
err := tx.Commit()
|
||||
if err != nil {
|
||||
logUtil.Log(fmt.Sprintf("提交事务失败,错误信息:%s", err), logUtil.Error, true)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
// 记录Prepare错误
|
||||
// command:执行的SQL语句
|
||||
// err:错误对象
|
||||
func WritePrepareError(command string, err error) {
|
||||
logUtil.Log(fmt.Sprintf("Prepare失败,错误信息:%s,command:%s", err, command), logUtil.Error, true)
|
||||
}
|
||||
|
||||
// 记录Query错误
|
||||
// command:执行的SQL语句
|
||||
// err:错误对象
|
||||
func WriteQueryError(command string, err error) {
|
||||
logUtil.Log(fmt.Sprintf("Query失败,错误信息:%s,command:%s", err, command), logUtil.Error, true)
|
||||
}
|
||||
|
||||
// 记录Exec错误
|
||||
// command:执行的SQL语句
|
||||
// err:错误对象
|
||||
func WriteExecError(command string, err error) {
|
||||
logUtil.Log(fmt.Sprintf("Exec失败,错误信息:%s,command:%s", err, command), logUtil.Error, true)
|
||||
}
|
||||
|
||||
// 记录Scan错误
|
||||
// command:执行的SQL语句
|
||||
// err:错误对象
|
||||
func WriteScanError(command string, err error) {
|
||||
logUtil.Log(fmt.Sprintf("Scan失败,错误信息:%s,command:%s", err, command), logUtil.Error, true)
|
||||
}
|
||||
Reference in New Issue
Block a user