上節內容介紹了後臺管理頁面統計功能開發(1),從功能介紹,到接口請求分析和歸類,最後是代碼設計。通過上節內容的介紹,已經將業務邏輯和開發邏輯解釋清楚,本節內容側重於編程代碼實現具體的功能。golang
經過瀏覽器工具調試會發現,當日增加功能和近7日增加數據使用的請求接口相同,只是傳值較爲特殊。以當日用戶增加請求爲例,當日用戶增加數據請求接口以下:sql
/statis/user/NaN-NaN-NaN/count
可見,傳遞的值爲NaN-NaN-NaN。數據庫
進而查看近七日增加數據請求。仍以用戶增加請求爲例,近七日中的某天數據增加請求接口以下:編程
/statis/user/2019-04-08/count
綜合上述兩種狀況的分析,當日請求與近七日請求url相同,只是傳值不一樣。所以,在程序開發實現時,能夠將當日增加數據和7日增加數據請求合併開發,僅對當日數據增加請求作單獨的處理便可。瀏覽器
咱們已經定義過了StatisController結構體,用來實現統計數據的功能請求,以下所示:session
type StatisController struct {
//上下文環境對象
Ctx iris.Context
//統計功能的服務實現接口
Service service.StatisService
//session
Session *sessions.Session
}
路由組解析統計接口 咱們已經分析過接口,能夠發現管理員,用戶,及訂單,三者的請求形式相同,所以能夠採用路由組的方式解析統計接口,咱們定義解析的路由組以下:數據結構
app.Party("/statis/{model}/{date}/")
定義統計接口 根據咱們分析的接口的規則,咱們能夠在StatisController結構體中定義GetCount方法用來處理,GetCount方法定義以下:mvc
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提供。在本節內容中,咱們以用戶數據增加接口請求爲例,代碼實現以下:app
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
}
其餘兩個功能模塊的實現相同,查詢數據表不一樣。詳細內容在課程配套視頻和源碼中提供。工具
在該功能中,日期字段在數據結構體定義中使用的是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
}
本節內容開發完畢實現效果以下所示,具體代碼在課程配套中提供: