package utils import ( "fmt" "math" "math/rand" "strings" "time" ) type Misc struct{} func NewMisc() *Misc { return &Misc{} } func (m *Misc) RandString(strlen int) string { codes := "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789" codeLen := len(codes) data := make([]byte, strlen) rand.Seed(time.Now().UnixNano() + rand.Int63() + rand.Int63() + rand.Int63() + rand.Int63()) for i := 0; i < strlen; i++ { idx := rand.Intn(codeLen) data[i] = byte(codes[idx]) } return string(data) } //根据slice随机返回其中一个元素 func (m *Misc) RandSlice(slices []interface{}) interface{} { number := len(slices) rand.Seed(time.Now().Unix()) idx := rand.Intn(number) return slices[idx] } /** * 分页方法 * @param type $total 一共多少记录 * @param type $page 当前是第几页 * @param type $pagesize 每页多少 * @param type $url url是什么,url里面的{page}会被替换成页码 * @param array $order 分页条的组成,是一个数组,可以按着1-6的序号,选择分页条组成部分和每个部分的顺序 * @param int $a_count 分页条中a页码链接的总数量,不包含当前页的a标签,默认10个。 * @return type String * echo Sr::page(100,3,10,'?article/list/{page}',array(3,4,5,1,2,6)); */ func (m *Misc) Page(total, page, pagesize int, url string, args ...interface{}) string { order := []int{1, 2, 3, 4, 5, 6} a_count := 10 if len(args) >= 1 { order = args[0].([]int) } if len(args) >= 2 { a_count = args[1].(int) } a_num := a_count first := "首页" last := "尾页" pre := "上页" next := "下页" if a_num%2 == 0 { a_num++ } pages := int(math.Ceil(float64(total) / float64(pagesize))) curpage := page if curpage > pages || curpage <= 0 { curpage = 1 } body := `` prefix := "" subfix := "" start := curpage - ((a_num - 1) / 2) end := curpage + ((a_num - 1) / 2) if start <= 0 { start = 1 } if end > pages { end = pages } if pages >= a_num { if curpage <= (a_num-1)/2 { end = a_num } if end-curpage <= (a_num-1)/2 { start -= int(math.Floor(float64(a_num)/float64(2))) - (end - curpage) } } for i := start; i <= end; i++ { if i == curpage { body += fmt.Sprintf(`%d`, i) } else { body += fmt.Sprintf(`%d`, strings.Replace(url, "{page}", fmt.Sprintf("%d", i), 1), i) } } body += "" if curpage > 1 { prefix = fmt.Sprintf(`%s%s`, strings.Replace(url, "{page}", fmt.Sprintf("%d", 1), 1), first, strings.Replace(url, "{page}", fmt.Sprintf("%d", curpage-1), 1), pre) } if curpage != pages { subfix = fmt.Sprintf(`%s%s`, strings.Replace(url, "{page}", fmt.Sprintf("%d", curpage+1), 1), next, strings.Replace(url, "{page}", fmt.Sprintf("%d", pages), 1), last) } info := fmt.Sprintf(`第%d/%d页`, curpage, pages) id := fmt.Sprintf("gsd09fhas9d%d%d%d", rand.Intn(1000), rand.Intn(1000), rand.Intn(1000)) gostr := fmt.Sprintf(`转到`, id, pages, url, id, id) totalstr := fmt.Sprintf(`共%d条`, total) pagenation := []string{totalstr, info, prefix, body, subfix, gostr} output := []string{} for _, v := range order { if v-1 < len(pagenation) && v-1 >= 0 { output = append(output, pagenation[v-1]) } } if pages > 1 { return strings.Join(output, "") } return "" }