go語言實戰教程之 後臺管理頁面統計功能開發(2)

上節內容介紹了後臺管理頁面統計功能開發(1),從功能介紹,到接口請求分析和歸類,最後是代碼設計。通過上節內容的介紹,已經將業務邏輯和開發邏輯解釋清楚,本節內容側重於編程代碼實現具體的功能。golang

當日增加數據功能、七日增加數據功能

經過瀏覽器工具調試會發現,當日增加功能和近7日增加數據使用的請求接口相同,只是傳值較爲特殊。以當日用戶增加請求爲例,當日用戶增加數據請求接口以下:sql

/statis/user/NaN-NaN-NaN/count複製代碼

可見,傳遞的值爲NaN-NaN-NaN數據庫

進而查看近七日增加數據請求。仍以用戶增加請求爲例,近七日中的某天數據增加請求接口以下:編程

/statis/user/2019-04-08/count複製代碼

綜合上述兩種狀況的分析,當日請求與近七日請求url相同,只是傳值不一樣。所以,在程序開發實現時,能夠將當日增加數據和7日增加數據請求合併開發,僅對當日數據增加請求作單獨的處理便可。瀏覽器

咱們已經定義過了StatisController結構體,用來實現統計數據的功能請求,以下所示:bash

type StatisController struct {
    //上下文環境對象
    Ctx iris.Context
​
    //統計功能的服務實現接口
    Service service.StatisService
​
    //session
    Session *sessions.Session
}複製代碼
  • 路由組解析統計接口 咱們已經分析過接口,能夠發現管理員,用戶,及訂單,三者的請求形式相同,所以能夠採用路由組的方式解析統計接口,咱們定義解析的路由組以下:session

app.Party("/statis/{model}/{date}/")複製代碼
  • 定義統計接口 根據咱們分析的接口的規則,咱們能夠在StatisController結構體中定義GetCount方法用來處理,GetCount方法定義以下:數據結構

    func (sc *StatisController) GetCount() mvc.Result {
        // /statis/user/2019-03-10/count
        path := sc.Ctx.Path()
      
        var pathSlice []string
        if path != "" {
            pathSlice = strings.Split(path, "/")
        }
      
        //不符合請求格式
        if len(pathSlice) != 5 {
            return mvc.Response{
                Object: map[string]interface{}{
                    "status": utils.RECODE_FAIL,
                    "count":  0,
                },
            }
        }
      
        //將最前面的去掉
        pathSlice = pathSlice[1:]
        model := pathSlice[1]
        date := pathSlice[2]
        var result int64
        switch model {
        case "user":
            iris.New().Logger().Error(date) //時間
            result = sc.Service.GetUserDailyCount(date)
        case "order":
            result = sc.Service.GetOrderDailyCount(date)
        case "admin":
            result = sc.Service.GetAdminDailyCount(date)
        }
      
        return mvc.Response{
            Object: map[string]interface{}{
                "status": utils.RECODE_OK,
                "count":  result,
            },
        }
      }
    ​複製代碼

GetCount方法經過解析請求URL,對不一樣的請求類型進行分類調用不一樣的功能方法,分別是:GetUserDailyCount,GetOrderDailyCount,GetAdminDailyCount。三者方法均由service.StatisService提供。在本節內容中,咱們以用戶數據增加接口請求爲例,代碼實現以下:mvc

func (ss *statisService) GetUserDailyCount(date string) int64 {
​
    if date == "NaN-NaN-NaN" { //當日增加數據請求
        date = time.Now().Format("2006-01-02")
    }
​
    startDate, err := time.Parse("2006-01-02", date)
    if err != nil {
        return 0
    }
​
    endDate := startDate.AddDate(0, 0, 1)
    result, err := ss.Engine.Where(" register_time between ? and ? and del_flag = 0 ", startDate.Format("2006-01-02 15:04:05"), endDate.Format("2006-01-02 15:04:05")).Count(model.User{})
    if err != nil {
        return 0
    }
    return result
}複製代碼

其餘兩個功能模塊的實現相同,查詢數據表不一樣。詳細內容在課程配套視頻和源碼中提供。app

SQL語句查詢

在該功能中,日期字段在數據結構體定義中使用的是time.Time類型,在數據庫中會被映射成DateTime類型。

  • 時間範圍查詢 在進行數據庫查詢時,時間的查詢使用的sql語句是between ... and...。本節內容的功能查詢語句爲:

    select count(*) from user where register_time between start and end and del_flag = 0  複製代碼
  • 日期格式 在golang語言中,日期格式使用time.Format方法來自定義時間的格式。可是,有一點須要注意,在輸入Format標準時間格式時,要求的時間點必須是2006-01-02 15:04:05。若是不是該時間點,格式化出來的時間就會出現錯誤,這是須要注意的一點。

數據總數功能開發

數據總記錄數功能請求是按照模塊的功能來進行開發的,以管理員數據總記錄請求爲例,請求url以下:

/admin/count複製代碼

在AdminController結構體中,定義GetCount方法用來獲取管理員總數,方法詳情以下:

func (ac *AdminController) GetCount() mvc.Result {
​
    count, err := ac.Service.GetAdminCount()
    if err != nil {
        return mvc.Response{
            Object: map[string]interface{}{
                "status":  utils.RECODE_FAIL,
                "message": utils.Recode2Text(utils.RESPMSG_ERRORADMINCOUNT),
                "count":   0,
            },
        }
    }
​
    return mvc.Response{
        Object: map[string]interface{}{
            "status": utils.RECODE_OK,
            "count":  count,
        },
    }
}複製代碼

在該控制器處理請求的過程當中,調用到了AdminService提供的查詢管理員總記錄數的功能,GetAdminCount方法實現以下:

func (ac *adminSevice) GetAdminCount() (int64, error) {
    count, err := ac.engine.Count(new(model.Admin))
​
    if err != nil {
        panic(err.Error())
        return 0, err
    }
    return count, nil
}複製代碼

本節內容開發完畢實現效果以下所示,具體代碼在課程配套中提供:

相關文章
相關標籤/搜索