feat: 分页查询部标设备列表

This commit is contained in:
ydajiang
2025-06-02 20:34:41 +08:00
parent e388528c2e
commit e5c235a3a4
3 changed files with 54 additions and 8 deletions

11
api.go
View File

@@ -123,13 +123,14 @@ func withJsonParams[T any](f func(params T, w http.ResponseWriter, req *http.Req
func withJsonResponse[T any](f func(params T, w http.ResponseWriter, req *http.Request) (interface{}, error), params interface{}) func(http.ResponseWriter, *http.Request) {
return func(w http.ResponseWriter, req *http.Request) {
if err := HttpDecodeJSONBody(w, req, params); err != nil {
newParams := new(T)
if err := HttpDecodeJSONBody(w, req, newParams); err != nil {
Sugar.Errorf("解析请求体失败 err: %s path: %s", err.Error(), req.URL.Path)
httpResponseError(w, err.Error())
return
}
responseBody, err := f(params.(T), w, req)
responseBody, err := f(*newParams, w, req)
if err != nil {
httpResponseError(w, err.Error())
} else {
@@ -174,6 +175,7 @@ func startApiServer(addr string) {
apiServer.router.HandleFunc("/api/v1/jt/device/add", withJsonResponse(apiServer.OnVirtualDeviceAdd, &JTDeviceModel{}))
apiServer.router.HandleFunc("/api/v1/jt/device/edit", withJsonResponse(apiServer.OnVirtualDeviceEdit, &JTDeviceModel{}))
apiServer.router.HandleFunc("/api/v1/jt/device/remove", withJsonResponse(apiServer.OnVirtualDeviceRemove, &JTDeviceModel{}))
apiServer.router.HandleFunc("/api/v1/jt/device/list", withJsonResponse(apiServer.OnVirtualDeviceList, &PageQuery{}))
apiServer.router.HandleFunc("/api/v1/jt/channel/add", withJsonResponse(apiServer.OnVirtualChannelAdd, &Channel{}))
apiServer.router.HandleFunc("/api/v1/jt/channel/edit", withJsonResponse(apiServer.OnVirtualChannelEdit, &Channel{}))
@@ -456,11 +458,6 @@ func (api *ApiServer) OnCloseStream(v *StreamIDParams, w http.ResponseWriter, r
func (api *ApiServer) OnDeviceList(v *PageQuery, w http.ResponseWriter, r *http.Request) (interface{}, error) {
Sugar.Infof("查询设备列表 %v", *v)
defer func() {
// debug发现指针v会重复利用,但是成员变量还是上次的... 手动重置为空值
// *v = PageQuery{}
}()
if v.PageNumber == nil {
var defaultPageNumber = 1
v.PageNumber = &defaultPageNumber

View File

@@ -2,6 +2,7 @@ package main
import (
"fmt"
"math"
"net/http"
)
@@ -179,7 +180,7 @@ func (api *ApiServer) OnVirtualChannelAdd(channel *Channel, w http.ResponseWrite
func (api *ApiServer) OnVirtualChannelEdit(channel *Channel, w http.ResponseWriter, r *http.Request) (interface{}, error) {
Sugar.Infof("edit virtual channel: %v", *channel)
oldChannel, err := ChannelDao.QueryChannelByID(channel.ID)
if err != nil {
Sugar.Errorf("query channel failed: %s", err.Error())
@@ -214,3 +215,33 @@ func (api *ApiServer) OnVirtualChannelRemove(channel *Channel, w http.ResponseWr
}
return nil, err
}
func (api *ApiServer) OnVirtualDeviceList(v *PageQuery, w http.ResponseWriter, r *http.Request) (interface{}, error) {
Sugar.Infof("query virtual device list: %v", *v)
if v.PageNumber == nil {
var defaultPageNumber = 1
v.PageNumber = &defaultPageNumber
}
if v.PageSize == nil {
var defaultPageSize = 10
v.PageSize = &defaultPageSize
}
devices, total, err := JTDeviceDao.QueryDevices(*v.PageNumber, *v.PageSize)
if err != nil {
Sugar.Errorf("查询设备列表失败 err: %s", err.Error())
return nil, err
}
query := &PageQuery{
PageNumber: v.PageNumber,
PageSize: v.PageSize,
TotalCount: total,
TotalPages: int(math.Ceil(float64(total) / float64(*v.PageSize))),
Data: devices,
}
return query, nil
}

View File

@@ -48,6 +48,8 @@ type DaoJTDevice interface {
SaveDevice(model *JTDeviceModel) error
UpdateDevice(model *JTDeviceModel) error
QueryDevices(page int, size int) ([]*JTDeviceModel, int, error)
}
type daoJTDevice struct {
@@ -127,3 +129,19 @@ func (d *daoJTDevice) UpdateDevice(model *JTDeviceModel) error {
return db.Save(model).Error
})
}
func (d *daoJTDevice) QueryDevices(page int, size int) ([]*JTDeviceModel, int, error) {
var devices []*JTDeviceModel
tx := db.Limit(size).Offset((page - 1) * size).Find(&devices)
if tx.Error != nil {
return nil, 0, tx.Error
}
var total int64
tx = db.Model(&JTDeviceModel{}).Count(&total)
if tx.Error != nil {
return nil, 0, tx.Error
}
return devices, int(total), nil
}