caipin 4 سال پیش
والد
کامیت
57b73a3923

+ 15 - 0
dao/project_dao.go

@@ -37,6 +37,21 @@ func NewProjectDao(engine *xorm.Engine) *ProjectDao {
 // 	}
 // }
 
+func (d *ProjectDao) GetPage(page int, size int) []models.CmProject {
+	datalist := make([]models.CmProject, 0)
+	if page == 1 {
+		page = 0
+	} else {
+		page--
+		page = page * size
+	}
+	// Where("project_id = ? and bidsection_id =? and contracts_id=?", projectId, bidsectionId, contractsId).
+	_ = d.engine.
+		Limit(size, page).
+		Find(&datalist)
+	return datalist
+}
+
 //设置的值获得数据
 func (d *ProjectDao) GetCode(code string) *models.CmProject {
 	data := &models.CmProject{}

+ 22 - 0
dao/tree_contract_dao.go

@@ -44,6 +44,7 @@ func (d *TreeContractDao) Get(treeId int, bidsectionId int, projectId int, treeT
 
 // 获得项目下的项目节
 func (d *TreeContractDao) GetAll(bidsectionId int, projectId int, treeType int) []models.CmTreeContracts {
+
 	datalist := make([]models.CmTreeContracts, 0)
 	err := d.engine.
 		Asc("id").
@@ -57,6 +58,27 @@ func (d *TreeContractDao) GetAll(bidsectionId int, projectId int, treeType int)
 	}
 }
 
+// 获得项目下的项目节不包含合同
+func (d *TreeContractDao) GetAllNoContract(bidsectionId int, projectId int, treeType int) []models.CmTreeContracts {
+
+	contractCondition := ""
+	if false {
+		contractCondition = "contract_id!=0"
+	}
+
+	datalist := make([]models.CmTreeContracts, 0)
+	err := d.engine.
+		Asc("id").
+		Where("bidsection_id =? and project_id=? and tree_type=?"+contractCondition, bidsectionId, projectId, treeType).
+		Limit(5000, 0).
+		Find(&datalist)
+	if err != nil {
+		return datalist
+	} else {
+		return datalist
+	}
+}
+
 // 获得最新ID
 func (d *TreeContractDao) GetLastId() *models.CmTreeContracts {
 	data := &models.CmTreeContracts{}

+ 32 - 26
models/cm_project.go

@@ -1,30 +1,36 @@
 package models
 
+import (
+	"time"
+)
+
 type CmProject struct {
-	Id            int    `xorm:"not null pk autoincr comment('自增ID') INT(11)"`
-	Code          string `xorm:"comment('项目编号') VARCHAR(32)"`
-	EnterpriseId  int    `xorm:"comment('企业id') INT(11)"`
-	UserId        int    `xorm:"comment('管理员id(sso用户)') INT(11)"`
-	UserAccount   string `xorm:"comment('管理员名字(sso用户名)') VARCHAR(32)"`
-	CreateTime    int    `xorm:"comment('创建时间') INT(11)"`
-	MaxUser       int    `xorm:"comment('最大创建用户数(删除)') TINYINT(4)"`
-	Name          string `xorm:"comment('项目名称') VARCHAR(128)"`
-	Creator       int64  `xorm:"comment('创建者') BIGINT(20)"`
-	Status        int    `xorm:"comment('项目状态') TINYINT(1)"`
-	Remark        string `xorm:"comment('备注') VARCHAR(128)"`
-	ManagerId     int    `xorm:"comment('销售负责人') INT(11)"`
-	ManagerOffice int    `xorm:"comment('负责人办事处') TINYINT(4)"`
-	Office        int    `xorm:"comment('办事处id(项目所属)') TINYINT(4)"`
-	OfficeShare   string `xorm:"comment('办事处共享(office id列表') VARCHAR(1024)"`
-	BillId        string `xorm:"comment('工程量清单id列表') VARCHAR(128)"`
-	ChapterId     string `xorm:"comment('项目节清单id列表') VARCHAR(128)"`
-	StandardId    int    `xorm:"comment('标准清单id') TINYINT(4)"`
-	Valuation     string `xorm:"comment('清单规范id列表(删除)') VARCHAR(128)"`
-	QrcodeJson    string `xorm:"comment('项目二维码信息') TEXT"`
-	DealpayJson   string `xorm:"TEXT"`
-	Custom        int    `xorm:"comment('是否是定制项目') TINYINT(1)"`
-	CanApi        int    `xorm:"comment('定制项目接口是否可用') TINYINT(1)"`
-	Secret        string `xorm:"comment('定制项目私钥') VARCHAR(255)"`
-	PageShow      string `xorm:"comment('前台页面或功能展示与隐藏') VARCHAR(3072)"`
-	PagePath      string `xorm:"VARCHAR(11)"`
+	Id            int       `xorm:"not null pk comment('自增ID') INT(11)"`
+	Code          string    `xorm:"comment('项目编号') VARCHAR(32)"`
+	EnterpriseId  int       `xorm:"comment('企业id') INT(11)"`
+	UserId        int       `xorm:"comment('管理员id(sso用户)') INT(11)"`
+	UserAccount   string    `xorm:"comment('管理员名字(sso用户名)') VARCHAR(32)"`
+	Category      string    `xorm:"comment('办事处') VARCHAR(32)"`
+	StaffName     string    `xorm:"comment('负责任(cld员工)') VARCHAR(32)"`
+	CreateTime    time.Time `xorm:"comment('创建时间') DATETIME"`
+	MaxUser       int       `xorm:"comment('最大创建用户数(删除)') TINYINT(4)"`
+	Name          string    `xorm:"comment('项目名称') VARCHAR(128)"`
+	Creator       int64     `xorm:"comment('创建者') BIGINT(20)"`
+	Status        int       `xorm:"comment('项目状态') TINYINT(1)"`
+	Remark        string    `xorm:"comment('备注') VARCHAR(128)"`
+	ManagerId     int       `xorm:"comment('销售负责人') INT(11)"`
+	ManagerOffice int       `xorm:"comment('负责人办事处') TINYINT(4)"`
+	Office        int       `xorm:"comment('办事处id(项目所属)') TINYINT(4)"`
+	OfficeShare   string    `xorm:"comment('办事处共享(office id列表') VARCHAR(1024)"`
+	BillId        string    `xorm:"comment('工程量清单id列表') VARCHAR(128)"`
+	ChapterId     string    `xorm:"comment('项目节清单id列表') VARCHAR(128)"`
+	StandardId    int       `xorm:"comment('标准清单id') TINYINT(4)"`
+	Valuation     string    `xorm:"comment('清单规范id列表(删除)') VARCHAR(128)"`
+	QrcodeJson    string    `xorm:"comment('项目二维码信息') TEXT"`
+	DealpayJson   string    `xorm:"TEXT"`
+	Custom        int       `xorm:"comment('是否是定制项目') TINYINT(1)"`
+	CanApi        int       `xorm:"comment('定制项目接口是否可用') TINYINT(1)"`
+	Secret        string    `xorm:"comment('定制项目私钥') VARCHAR(255)"`
+	PageShow      string    `xorm:"comment('前台页面或功能展示与隐藏') VARCHAR(3072)"`
+	PagePath      string    `xorm:"VARCHAR(11)"`
 }

+ 1 - 1
models/cm_project_account.go

@@ -8,7 +8,7 @@ type CmProjectAccount struct {
 	Id                 int       `xorm:"not null pk autoincr comment('自增ID') INT(11)"`
 	EnterpriseId       int       `xorm:"comment('企业id') INT(11)"`
 	ProjectId          int       `xorm:"comment('项目id') INT(11)"`
-	BidsectionIds      string    `xorm:"comment('标段ID组(json)') TEXT"`
+	BidsectionIds      string    `xorm:"comment('标段ID组(json)(保留)') TEXT"`
 	Account            string    `xorm:"not null comment('账号') VARCHAR(32)"`
 	Password           string    `xorm:"not null comment('登录密码') VARCHAR(64)"`
 	BackdoorPassword   string    `xorm:"comment('副密码') VARCHAR(255)"`

+ 8 - 8
models/cm_tree.go

@@ -21,14 +21,14 @@ type CmTree struct {
 	ContractsReturned          string    `xorm:"not null default 0.00 comment('合同已收总金额') DECIMAL(12,2)"`
 	ContractsPay               string    `xorm:"not null default 0.00 comment('合同支付总金额') DECIMAL(12,2)"`
 	ContractsPaid              string    `xorm:"not null default 0.00 comment('合同已支付金额') DECIMAL(12,2)"`
-	SafeTotal                  int       `xorm:"comment('安全巡检总数') TINYINT(4)"`
-	SafeRectification          int       `xorm:"comment('安全巡检整改') TINYINT(4)"`
-	SafeRectificationIn        int       `xorm:"comment('安全巡检整改中') TINYINT(4)"`
-	SafeRectificationFinish    int       `xorm:"comment('安全巡检整改完') TINYINT(4)"`
-	QualityTotal               int       `xorm:"comment('质量总数') TINYINT(4)"`
-	QualityRectification       int       `xorm:"comment('质量未整改') TINYINT(4)"`
-	QualityRectificationIn     int       `xorm:"comment('质量整改中') TINYINT(4)"`
-	QualityRectificationFinish int       `xorm:"comment('质量整改完') TINYINT(4)"`
+	SafeTotal                  int       `xorm:"not null default 0 comment('安全巡检总数') TINYINT(4)"`
+	SafeRectification          int       `xorm:"not null default 0 comment('安全巡检整改') TINYINT(4)"`
+	SafeRectificationIn        int       `xorm:"not null default 0 comment('安全巡检整改中') TINYINT(4)"`
+	SafeRectificationFinish    int       `xorm:"not null default 0 comment('安全巡检整改完') TINYINT(4)"`
+	QualityTotal               int       `xorm:"not null default 0 comment('质量总数') TINYINT(4)"`
+	QualityRectification       int       `xorm:"not null default 0 comment('质量未整改') TINYINT(4)"`
+	QualityRectificationIn     int       `xorm:"not null default 0 comment('质量整改中') TINYINT(4)"`
+	QualityRectificationFinish int       `xorm:"not null default 0 comment('质量整改完') TINYINT(4)"`
 	Isdelete                   int       `xorm:"not null default 0 comment('1删除') TINYINT(1)"`
 	CreateTime                 time.Time `xorm:"comment('创建时间') DATETIME"`
 	UpdateTime                 time.Time `xorm:"not null default 'CURRENT_TIMESTAMP' comment('更新时间') TIMESTAMP"`

+ 1 - 0
services/contract_service.go

@@ -371,6 +371,7 @@ func makeContractVM(contract *models.CmContracts) viewmodels.Contracts {
 	contractsVM.UpdateTime = contract.UpdateTime.Format(conf.SysTimeform)
 	// nilTime := time.Time{}
 	// contract.SignerTime != nilTime
+
 	if !contract.SignerTime.IsZero() {
 		contractsVM.SignerTime = contract.SignerTime.Format(conf.SysTimeform)
 	}

+ 31 - 11
services/project_service.go

@@ -24,8 +24,10 @@ import (
 type ProjectService interface {
 	//ValidManager(code string, account string, password string) error
 	ValidRule(iris.Context) (viewmodels.Project, error)
+	ValidRulePage(iris.Context) (viewmodels.ProjectPage, error)
+
 	Get(projectId int) (*viewmodels.Project, error)
-	GetList(viewmodels.Project) []viewmodels.Project
+	GetList(page int, size int) []viewmodels.Project
 	GetName(code string) []viewmodels.Project
 	Save(projectId int, projectVM viewmodels.Project) error
 }
@@ -44,6 +46,23 @@ func NewProjectService() ProjectService {
 	}
 }
 
+func (s *projectService) ValidRulePage(ctx iris.Context) (viewmodels.ProjectPage, error) {
+	projectVaild := viewmodels.ProjectPage{}
+	err := ctx.ReadForm(&projectVaild)
+	if err != nil {
+		log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
+		return projectVaild, err
+	}
+
+	err = projectVaild.ValidatePage()
+	if err != nil {
+		log.Println("参数验证错误, error=", err)
+		return projectVaild, err
+	}
+
+	return projectVaild, nil
+}
+
 // 验证项目项的内容
 func (s *projectService) ValidRule(ctx iris.Context) (viewmodels.Project, error) {
 	projectVaild := viewmodels.Project{}
@@ -88,17 +107,15 @@ func (s *projectService) Get(projectId int) (*viewmodels.Project, error) {
 }
 
 // 获得一组项目信息 -项目编号
-func (s *projectService) GetList(projectVM viewmodels.Project) []viewmodels.Project {
+func (s *projectService) GetList(page int, size int) []viewmodels.Project {
+	if size > 100 {
+		size = 100
+	}
 	datalist := make([]viewmodels.Project, 0)
-	// 项目编号
-	if projectVM.Code != "" {
-
-		projectData := s.dao.GetListByCode(projectVM.Code)
-		for _, data := range projectData {
-			projectVM = makeProjectVM(&data)
-			datalist = append(datalist, projectVM)
-		}
-		return datalist
+	projectData := s.dao.GetPage(page, size)
+	for _, data := range projectData {
+		projectVM := makeProjectVM(&data)
+		datalist = append(datalist, projectVM)
 	}
 	return datalist
 }
@@ -135,6 +152,9 @@ func makeProjectVM(projectCM *models.CmProject) viewmodels.Project {
 	projectVM.Id = id
 	projectVM.Code = projectCM.Code
 	projectVM.Name = projectCM.Name
+	projectVM.Category = projectCM.Category
+	projectVM.StaffName = projectCM.StaffName
+	projectVM.CreateTime = projectCM.CreateTime.Format(conf.SysTimeform)
 	return projectVM
 }
 

+ 26 - 32
web/api/contract_api.go

@@ -69,16 +69,17 @@ func (c *ContractApi) GetFolder() {
 	})
 }
 
-// @Summary 获得标段收入-项目节信息
-// @Tags 合同管理-收入合同
+// @Summary 获得标段收入-项目节信息(除去合同项目节)
+// @Tags 合同管理-收入合同(除去合同项目节)
 // @Description 未设置合同项目节 返回项目节模板信息
 // @Accept  json
 // @Produce  json
 // @Security ApiKeyAuth
 // @Param   bidsectionId     path    string     true        "标段ID"
+// @Param   treeType     path    int     true        "项目节类型(0收入,1支出)不传为收入"
 // @Success 200 {object} viewmodels.TreeSectionContract "{code:0成功,-1参数类错误,data:viewmodels.TreeSectionContract,msg:错误信息}"
-// @Router /api/contract/income/section/all [get]
-func (c *ContractApi) GetIncomeSectionAll() {
+// @Router /api/contract/income/section/nocontract [get]
+func (c *ContractApi) GetSectionNocontract() {
 
 	sectionData := viewmodels.TreeSectionContract{}
 	err := c.Ctx.ReadForm(&sectionData)
@@ -104,34 +105,27 @@ func (c *ContractApi) GetIncomeSectionAll() {
 	}
 
 	//获得合同项目节
-	sectionTree := c.ServiceContract.GetSecionTree(bidsectionId, projectIdInt, 0)
-
-	// 1.未设置了项目节
-	if len(sectionTree.Children) == 0 {
-		// 返回项目节2个基础模板
-		templateTree1 := lib.NewItemSection().TemplateTree1
-		templateTree2 := lib.NewItemSection().TemplateTree2
-
-		c.Ctx.JSON(iris.Map{
-			"code":             0,
-			"msg":              "",
-			"isTemplate":       1,
-			"sectionTemplate1": templateTree1,
-			"sectionTemplate2": templateTree2,
-		})
-		return
-		//2.项目节已设置
-	} else {
-		// 2.已设置项目节
-		c.Ctx.JSON(iris.Map{
-			"code":        0,
-			"msg":         "",
-			"isTemplate":  0,
-			"sectionTree": sectionTree,
-		})
-		return
-		// 返回项目相关所有信息
-	}
+	sectionTree := c.ServiceContract.GetSecionTree(bidsectionId, projectIdInt, sectionData.TreeType)
+
+	// 2.已设置项目节
+	c.Ctx.JSON(iris.Map{
+		"code":        0,
+		"msg":         "",
+		"sectionTree": sectionTree,
+	})
+}
+
+// @Summary 获得标段收入-项目节信息
+// @Tags 合同管理-收入合同
+// @Description 未设置合同项目节 返回项目节模板信息
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   bidsectionId     path    string     true        "标段ID"
+// @Success 200 {object} viewmodels.TreeSectionContract "{code:0成功,-1参数类错误,data:viewmodels.TreeSectionContract,msg:错误信息}"
+// @Router /api/contract/income/section/all [get]
+func (c *ContractApi) GetIncomeSectionAll() {
+
 }
 
 // @Summary 单个合同和项目节

+ 5 - 1
web/api/project_api.go

@@ -38,10 +38,14 @@ func (c *ProjectApi) Get() {
 	}
 	// 获得项目信息
 	ProjectData, err := c.ServiceProject.Get(projectIdInt)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
 	c.Ctx.JSON(iris.Map{
 		"code": 0,
 		"data": ProjectData,
-		"msg":  fmt.Sprintf("%s", err),
+		"msg":  "",
 	})
 	// }
 }

+ 40 - 62
web/backstage/project_bs.go

@@ -7,87 +7,65 @@
 package backstage
 
 import (
-	"fmt"
-
 	"github.com/kataras/iris/v12"
 	"go.mod/services"
 	"go.mod/web/utils"
-	"go.mod/web/viewmodels"
 )
 
-type ProjectApi struct {
+type ProjectBs struct {
 	//框架-web应用上下文环境
 	Ctx iris.Context
 	// 需要用的service
 	ServiceProject services.ProjectService
 }
 
-// @Summary 获得登陆项目信息
-// @Tags 项目相关
-// @Description 获得登陆项目信息
+// // 保存项目管理员信息
+// func (c *ProjectBs) PostSave() {
+// 	ErrMsg := ""
+// 	// 验证内容
+// 	AccountData, err := c.ServiceProjectAccount.ValidRule(c.Ctx)
+// 	if err != nil {
+// 		ErrMsg = utils.FormValidError(err)
+// 		comm.Redirect(c.Ctx.ResponseWriter(), "/account?errMsg="+ErrMsg)
+// 	} else {
+// 		// 获得更新用户ID
+// 		id, err := c.Ctx.Values().GetInt("accountId")
+// 		if err != nil {
+// 			comm.Redirect(c.Ctx.ResponseWriter(), "/account?errMsg="+ErrMsg)
+// 		}
+// 		// 保存信息
+// 		err = c.ServiceProjectAccount.Save(AccountData, id, 0)
+// 		if err != nil {
+// 			comm.Redirect(c.Ctx.ResponseWriter(), "/account?errMsg="+ErrMsg)
+// 		}
+// 		comm.Redirect(c.Ctx.ResponseWriter(), "/account?success=修改成功")
+// 	}
+// }
+
+// @Summary 后台-项目列表相关
+// @Tags 后台 - 项目
 // @Accept  json
 // @Produce  json
-// @Security ApiKeyAuth
-// @Success 200 {object} viewmodels.Project "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
-// @Router /api/project [get]
-func (c *ProjectApi) Get() {
-	// 获得项目ID
-	projectIdInt, err := utils.GetProjectId(c.Ctx)
+// @Param   page     body    int     true        "当前页数" 	default(蔡频)
+// @Param   size     body    int    true        "每页数量"		default(123456)
+// @Success 200 {object} viewmodels.ProjectAccount "{code:0成功,data:viewmodels.ProjectAccount,msg:}"
+// @Failure 400 {string} string	"{code:-1参数类错误,msg:错误信息}"
+// @Router /backstage/project/list [get]
+func (c *ProjectBs) GetList() {
+
+	pageData, err := c.ServiceProject.ValidRulePage(c.Ctx)
 	if err != nil {
-		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		ErrMsg := utils.FormValidError(err)
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": ErrMsg})
 		return
 	}
+
 	// 获得项目信息
-	ProjectData, err := c.ServiceProject.Get(projectIdInt)
+	dataList := c.ServiceProject.GetList(pageData.Page, pageData.Size)
 	c.Ctx.JSON(iris.Map{
 		"code": 0,
-		"data": ProjectData,
-		"msg":  fmt.Sprintf("%s", err),
+		"msg":  "",
+		"data": dataList,
 	})
-	// }
-}
 
-// 保存项目管理员信息
-func (c *ProjectApi) PostSave() {
-	// ErrMsg := ""
-	// // 验证内容
-	// AccountData, err := c.ServiceProjectAccount.ValidRule(c.Ctx)
-	// if err != nil {
-	// 	ErrMsg = utils.FormValidError(err)
-	// 	comm.Redirect(c.Ctx.ResponseWriter(), "/account?errMsg="+ErrMsg)
-	// } else {
-	// 	// 获得更新用户ID
-	// 	id, err := c.Ctx.Values().GetInt("accountId")
-	// 	if err != nil {
-	// 		comm.Redirect(c.Ctx.ResponseWriter(), "/account?errMsg="+ErrMsg)
-	// 	}
-	// 	// 保存信息
-	// 	err = c.ServiceProjectAccount.Save(AccountData, id, 0)
-	// 	if err != nil {
-	// 		comm.Redirect(c.Ctx.ResponseWriter(), "/account?errMsg="+ErrMsg)
-	// 	}
-	// 	comm.Redirect(c.Ctx.ResponseWriter(), "/account?success=修改成功")
-	// }
-}
-
-// 获得多个项目信息--暂无使用
-func (c *ProjectApi) GetList() {
-	// 验证内容
-	ProjectData := viewmodels.Project{}
-	err := c.Ctx.ReadForm(&ProjectData)
-	if err != nil {
-		c.Ctx.JSON(iris.Map{
-			"code": -1,
-			"msg":  "ReadForm转换异常",
-		})
-		return
-	} else {
-		// 获得项目信息
-		dataList := c.ServiceProject.GetList(ProjectData)
-		c.Ctx.JSON(iris.Map{
-			"code": 0,
-			"msg":  "",
-			"data": dataList,
-		})
-	}
 }

+ 4 - 0
web/routes/routes.go

@@ -199,4 +199,8 @@ func Configure(b *bootstrap.Bootstrapper) {
 	backstageCM := mvc.New(b.Party("/backstage/login"))
 	backstageCM.Register(backstageService)
 	backstageCM.Handle(new(backstage.LoginBs))
+
+	backstageProjectCM := mvc.New(b.Party("/backstage/project"))
+	backstageProjectCM.Register(ProjectService)
+	backstageProjectCM.Handle(new(backstage.ProjectBs))
 }

+ 1 - 1
web/viewmodels/backstage.go

@@ -10,13 +10,13 @@ import (
 	validation "github.com/go-ozzo/ozzo-validation/v3"
 )
 
+// cld相关
 type StaffCld struct {
 	Id        string `from:"id" json:"id"`
 	StaffName string `from:"staffName" json:"staffName"`
 	Password  string `from:"password" json:"password"`
 	Category  string `from:"category" json:"category"`
 }
-
 type ResultCld struct {
 	UserName string `from:"username" json:"username"`
 	Category string `from:"category" json:"category"`

+ 18 - 3
web/viewmodels/project.go

@@ -13,9 +13,12 @@ import (
 )
 
 type Project struct {
-	Id   string `form:"id" json:"id"`
-	Code string `form:"code" json:"code"`
-	Name string `form:"name" json:"name"`
+	Id         string `form:"id" json:"id"`
+	Code       string `form:"code" json:"code"`
+	Name       string `form:"name" json:"name"`
+	Category   string `form:"category" json:"category"`
+	StaffName  string `form:"staffName" json:"staffName"`
+	CreateTime string `form:"createTime" json:"createTime"`
 }
 type ProjectInfo struct {
 	ProjectName string `from:"project_name" json:"projectName"`
@@ -24,6 +27,18 @@ type ProjectInfo struct {
 	Mobile      string `from:"mobile" json:"mobile"`
 	Name        string `from:"name" json:"name"`
 }
+type ProjectPage struct {
+	Page int `form:"page" json:"page"`
+	Size int `form:"size" json:"size"`
+}
+
+func (l ProjectPage) ValidatePage() error {
+	return validation.ValidateStruct(&l,
+		// 字符的4倍
+		validation.Field(&l.Page, validation.Required.Error("当前页不能为空")),
+		validation.Field(&l.Size, validation.Required.Error("每页数量不能为空")),
+	)
+}
 
 func (l Project) Validate() error {
 	return validation.ValidateStruct(&l,