caipin 4 years ago
parent
commit
b496757daf

+ 1 - 1
models/cm_project.go

@@ -5,7 +5,7 @@ import (
 )
 
 type CmProject struct {
-	Id               int       `xorm:"not null pk comment('自增ID') INT(11)"`
+	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)"`

+ 1 - 1
services/backstage_service.go

@@ -72,7 +72,7 @@ func (s *backstageService) ValidRuleProject(ctx iris.Context) (viewmodels.Projec
 
 	err = projectVaild.ValidateId()
 	if err != nil {
-		log.Println("登录验证, error=", err)
+		log.Println("验证项目, error=", err)
 		return projectVaild, err
 	}
 	return projectVaild, nil

+ 20 - 0
services/project_account_service.go

@@ -32,6 +32,7 @@ type ProjectAccountService interface {
 	ValidRulePermission(ctx iris.Context) (viewmodels.Permission, error)
 	ValidRuleAccount(ctx iris.Context) (viewmodels.ProjectAccount, error)
 	ValidGetPermission(ctx iris.Context) (viewmodels.Permission, error)
+	ValidRuleProjectId(ctx iris.Context) (viewmodels.ProjectAccount, error)
 	Get(accountId int, projectId int) *viewmodels.ProjectAccount
 	GetAll(projectId int) []viewmodels.ProjectAccount
 	GetBidAccount(bidsectionId int, projectId int, projectAccountId int, name string) []viewmodels.ProjectAccount
@@ -193,6 +194,25 @@ func (s *projectAccountService) ValidRuleAccount(ctx iris.Context) (viewmodels.P
 	return accountVaild, nil
 }
 
+// 验证用户项目ID
+func (s *projectAccountService) ValidRuleProjectId(ctx iris.Context) (viewmodels.ProjectAccount, error) {
+	accountVaild := viewmodels.ProjectAccount{}
+	err := ctx.ReadForm(&accountVaild)
+	if err != nil {
+		log.Println("account-ValidRule-ReadForm转换异常, error=", err)
+		return accountVaild, err
+	}
+
+	err = accountVaild.ValidateProjectId()
+
+	if err != nil {
+		log.Println("权限验证, error=", err)
+		return accountVaild, err
+	}
+
+	return accountVaild, nil
+}
+
 // 获得一个项目用户
 func (s *projectAccountService) Get(id int, projectId int) *viewmodels.ProjectAccount {
 	modelsAccount := s.dao.Get(id, projectId)

+ 28 - 7
services/project_service.go

@@ -27,13 +27,14 @@ type ProjectService interface {
 	//ValidManager(code string, account string, password string) error
 	ValidRule(iris.Context) (viewmodels.Project, error)
 	ValidRulePage(iris.Context) (viewmodels.ProjectPage, error)
+	ValidRuleId(ctx iris.Context) (viewmodels.Project, error)
 
 	Get(projectId int) (*viewmodels.Project, error)
 	GetList(page int, size int) []viewmodels.Project
 	GetName(code string) []viewmodels.Project
 	Save(projectId int, projectVM viewmodels.Project) error
 	Add(projectVM viewmodels.Project) error
-	SaveBs(projectVM viewmodels.Project) error
+	SaveBs(projectVM viewmodels.Project, id int) error
 }
 
 //返回service操作类
@@ -67,6 +68,23 @@ func (s *projectService) ValidRulePage(ctx iris.Context) (viewmodels.ProjectPage
 	return projectVaild, nil
 }
 
+// 验证项目
+func (s *projectService) ValidRuleId(ctx iris.Context) (viewmodels.Project, error) {
+	projectVaild := viewmodels.Project{}
+	err := ctx.ReadForm(&projectVaild)
+	if err != nil {
+		log.Println("ReadForm转换异常, error=", err)
+		return projectVaild, err
+	}
+
+	err = projectVaild.ValidateId()
+	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{}
@@ -171,20 +189,23 @@ func (s *projectService) Add(projectVM viewmodels.Project) error {
 }
 
 // 更新项目-后台
-func (s *projectService) SaveBs(projectVM viewmodels.Project) error {
+func (s *projectService) SaveBs(projectVM viewmodels.Project, id int) error {
 	project := &models.CmProject{}
+	project.Id = id
 	project.Name = projectVM.Name
-	project.Code = projectVM.Code
+	project.InsideCategoryid = projectVM.InsideCategoryId
+	project.InsideCategory = projectVM.InsideCategory
+
 	project.CategoryId = projectVM.CategoryId
 	project.Category = projectVM.Category
+
 	project.StaffId = projectVM.StaffId
 	project.StaffName = projectVM.StaffName
-	project.CreateTime = time.Now()
-	project.CreateName = projectVM.CreateName
-	project.CreateCategory = projectVM.CreateCategory
+
 	project.Remark = projectVM.Remark
 
-	err := s.dao.Add(project)
+	err := s.dao.Update(project, []string{"Name", "InsideCategoryid", "InsideCategory", "CategoryId", "Category", "StaffId", "StaffName", "Remark"})
+
 	return err
 }
 

+ 19 - 7
services/tree_service.go

@@ -273,17 +273,32 @@ func (s *treeService) GetAllContract(projectId int, account *models.CmProjectAcc
 	// dataLenght := len(data) + 4
 
 	s.filterFolder(node)
+
 	// 删除空目录
 	ChildrenShow := make([]*viewmodels.FolderContract, 0)
 	for _, item := range node.Children {
-		if item.IsHidden != 1 {
+		if item.IsHidden == 0 {
 			ChildrenShow = append(ChildrenShow, item)
 		}
 	}
 	node.Children = ChildrenShow
+
+	// node.Children = s.copyShowFolder(node.Children)
+	// fmt.Println(node)
 	return node
 }
 
+// 复制出需要展示的目录
+// func (s *treeService) copyShowFolder(children []*viewmodels.FolderContract) []*viewmodels.FolderContract {
+// 	ChildrenShow := make([]*viewmodels.FolderContract, 0)
+// 	for _, item := range children {
+// 		if item.IsHidden == 0 {
+// 			ChildrenShow = append(ChildrenShow, item)
+// 		}
+// 	}
+// 	return ChildrenShow
+// }
+
 func (s *treeService) filterFolder(node *viewmodels.FolderContract) {
 	if node == nil {
 		return
@@ -325,13 +340,14 @@ func (s *treeService) filterFolder(node *viewmodels.FolderContract) {
 						}
 					}
 				}
+				// 2-2-5 覆盖父亲节点的显示内容
+				node.Children[i].Children = ChildrenShow
 
+				// s.copyShowFolder(node.Children[i].Children)
 				// fmt.Println("==========filterFolder执行完成")
 				// fmt.Println(node.Children[i].Name)
 				// fmt.Println(fmt.Sprintf("删除:%d", node.Children[i].IsHidden))
 				// fmt.Println(node.Children[i].Children)
-				// 2-2-5 覆盖父亲节点的显示内容
-				node.Children[i].Children = ChildrenShow
 			}
 		}
 	}
@@ -345,10 +361,6 @@ func (s *treeService) filterFolder(node *viewmodels.FolderContract) {
 	}
 }
 
-func (s *treeService) postOrder() {
-
-}
-
 // 新增一个文件夹
 func (s *treeService) Create(data viewmodels.Tree) error {
 	// 类型校验

+ 402 - 0
web/backstage/project_account_bs.go

@@ -0,0 +1,402 @@
+/*
+ * @description: 项目设置相关--管理员可访问
+ * @Author: CP
+ * @Date: 2020-10-09 10:35:38
+ * @FilePath: \construction_management\web\backstage\project_account_bs.go
+ */
+package backstage
+
+import (
+	"fmt"
+
+	"github.com/kataras/iris/v12"
+	"go.mod/services"
+	"go.mod/web/utils"
+	"go.mod/web/viewmodels"
+)
+
+type ProjectAccountBs struct {
+	//框架-web应用上下文环境
+	Ctx iris.Context
+	// 需要用的service
+	ServiceProjectAccount services.ProjectAccountService
+	ServiceProject        services.ProjectService
+	ServiceBidAccount     services.BidAccountService
+	ServiceBackstage      services.BackstageService
+}
+
+// @Summary 获得项目账号列表
+// @Tags 后台 - 项目账号
+// @Description id获得单条信息<br/>projectId必须传
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   id     body    string     false        "账号ID"
+// @Param   projectId     body    string     false        "项目ID"
+// @Success 200 {object} viewmodels.ProjectAccount "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
+// @Router /backstage/account [get]
+func (c *ProjectAccountBs) Get() {
+
+	accountData, err := c.ServiceProjectAccount.ValidRuleProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	// 获得项目ID
+	projectIdInt, err := utils.GetDecryptId(accountData.ProjectId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	if accountData.Id == "" {
+		// 获得所有项目下的账号
+		dataList := c.ServiceProjectAccount.GetAll(projectIdInt)
+		c.Ctx.JSON(iris.Map{
+			"code": 0,
+			"msg":  "",
+			"data": dataList,
+		})
+	} else {
+		// 获得单个账号ID
+		id, err := utils.GetDecryptId(accountData.Id)
+		if err != nil {
+			c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+			return
+		}
+
+		accountData := c.ServiceProjectAccount.Get(id, projectIdInt)
+		c.Ctx.JSON(iris.Map{
+			"code": 0,
+			"msg":  "",
+			"data": accountData,
+		})
+	}
+}
+
+// @Summary 检索账号信息
+// @Tags 后台 - 项目账号
+// @Description 检索字段:账号 姓名 单位 手机 前匹配
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   name     body    string     true        "检索内容"
+// @Param   projectId     body    string     false        "项目ID"
+// @Success 200 {object} viewmodels.ProjectAccount "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
+// @Router /backstage/account/search [get]
+func (c *ProjectAccountBs) GetSearch() {
+	accountData, err := c.ServiceProjectAccount.ValidRuleProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	// 获得项目ID
+	projectIdInt, err := utils.GetDecryptId(accountData.ProjectId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	// 获得检索关键字
+	AccountData := viewmodels.ProjectAccount{}
+	err = c.Ctx.ReadForm(&AccountData)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("JSON转换异常, error=%s", err)})
+		return
+	}
+
+	// 检索
+	dataList := c.ServiceProjectAccount.Search(AccountData.Name, projectIdInt)
+	c.Ctx.JSON(iris.Map{
+		"code": 0, "msg": "",
+		"data": dataList,
+	})
+}
+
+// @Summary 创建账号
+// @Tags 项目设置-管理员
+// @Description 新增账号
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   projectId     body    string     true        "项目ID"
+// @Param   account     body    string     true        "账号"
+// @Param   password     body    string     true        "密码"
+// @Param   role     body    int     true        "角色ID"
+// @Param   name     body    string     true        "姓名"
+// @Param   company     body    string     true        "公司"
+// @Param   position     body    string     true        "职位"
+// @Param   mobile     body    string     true        "手机"
+// @Param   telephone     body    string     true        "座机"
+// @Param   accountGroup     body    int     true        "账号组"
+// @Success 200 {string} string "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
+// @Router /backstage/account/create [post]
+func (c *ProjectAccountBs) PostCreate() {
+	ErrMsg := ""
+	// 验证内容
+	AccountData, err := c.ServiceProjectAccount.ValidRule(c.Ctx)
+
+	if err != nil {
+		ErrMsg = utils.FormValidError(err)
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", ErrMsg)})
+		return
+	}
+
+	// 项目ID
+	if AccountData.ProjectId == "" {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "项目ID必填"})
+	}
+	projectId, err := utils.GetDecryptId(AccountData.ProjectId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 是否有该项目
+	_, err = c.ServiceProject.Get(projectId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "项目不存在"})
+		return
+	}
+
+	// 新增账号信息
+	err = c.ServiceProjectAccount.Add(AccountData, projectId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	c.Ctx.JSON(iris.Map{"code": 0, "msg": "新增成功"})
+
+}
+
+// @Summary 编辑账号
+// @Tags 项目设置-管理员
+// @Description 编辑账号
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   id     body    string     true        "账号ID" default(PcqqGsn1O0jBSmLqkuOTwQ)
+// @Param   projectId     body    string     true        "项目ID"
+// @Param   role     body    int     true        "角色ID"
+// @Param   name     body    string     true        "姓名"
+// @Param   company     body    string     true        "公司"
+// @Param   position     body    string     true        "职位"
+// @Param   telephone     body    string     true        "座机"
+// @Param   accountGroup     body    int     true        "账号组"
+// @Param   X-CSRF-Token      header    string     true        "csrf"
+// @Success 200 {string} string "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
+// @Router /backstage/account/save [post]
+func (c *ProjectAccountBs) PostSave() {
+
+	// TODO
+
+	// 验证内容
+	AccountData, err := c.ServiceProjectAccount.ValidRule(c.Ctx)
+	if err != nil {
+		ErrMsg := utils.FormValidError(err)
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": ErrMsg})
+		return
+	}
+	// 获得更新账号ID
+	id, err := utils.GetDecryptId(AccountData.Id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	projectId, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
+	err = c.ServiceProjectAccount.Save(AccountData, id, projectId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	c.Ctx.JSON(iris.Map{"code": 0, "msg": "编辑成功"})
+
+}
+
+// @Summary 账号启用/禁用
+// @Tags 项目设置-管理员
+// @Description 账号启用/禁用
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   id     body    string     true        "账号ID" default(PcqqGsn1O0jBSmLqkuOTwQ)
+// @Param   enable     body    int     true        "启用/禁用"
+// @Success 200 {string} string "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
+// @Router /backstage/account/enable [post]
+func (c *ProjectAccountBs) PostEnable() {
+	// 修改验证方式——TODO
+	accountVaild := viewmodels.ProjectAccount{}
+	err := c.Ctx.ReadJSON(&accountVaild)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "参数错误"})
+		return
+	}
+
+	// 账号ID校验
+	id, err := utils.GetDecryptId(accountVaild.Id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "账号异常"})
+		return
+	}
+	// 项目ID
+	projectId, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "账号异常"})
+		return
+	}
+
+	err = c.ServiceProjectAccount.Enable(id, projectId, accountVaild.Enable)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+		return
+	}
+	c.Ctx.JSON(iris.Map{"code": 0, "msg": "操作成功"})
+}
+
+// @Summary 删除账号
+// @Tags 项目设置-管理员
+// @Description 删除账号
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   id     body    string     true        "账号ID" default(PcqqGsn1O0jBSmLqkuOTwQ)
+// @Success 200 {string} string "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
+// @Router /backstage/account/delete [post]
+func (c *ProjectAccountBs) PostDelete() {
+	accountVaild := viewmodels.ProjectAccount{}
+	err := c.Ctx.ReadJSON(&accountVaild)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "参数错误"})
+		return
+	}
+	// 账号ID校验
+	id, err := utils.GetDecryptId(accountVaild.Id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "账号异常"})
+		return
+	}
+	// 项目ID
+	projectId, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": "账号异常"})
+		return
+	}
+
+	err = c.ServiceProjectAccount.Delete(id, projectId)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+		return
+	}
+	c.Ctx.JSON(iris.Map{"code": 0, "msg": "操作成功"})
+}
+
+// @Summary 设置账号密码
+// @Tags 项目设置-管理员
+// @Description 设置账号密码
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Param   id     body    string     true        "账号ID" default(PcqqGsn1O0jBSmLqkuOTwQ)
+// @Param   account     body    string     true        "账号" default(textoopd)
+// @Param   password     body    string     true        "密码" default(ww123456)
+// @Param   X-CSRF-Token      header    string     true        "csrf"
+// @Success 200 {string} string "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
+// @Router /backstage/account/change [post]
+func (c *ProjectAccountBs) PostChange() {
+	// 验证内容
+	AccountData, err := c.ServiceProjectAccount.ValidRule(c.Ctx)
+	if err != nil {
+		ErrMsg := utils.FormValidError(err)
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": ErrMsg})
+		return
+	} else {
+		// 获得更新账号ID
+		id, err := utils.GetDecryptId(AccountData.Id)
+		if err != nil {
+			c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+			return
+		}
+		projectId, err := utils.GetProjectId(c.Ctx)
+		if err != nil {
+			c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+			return
+		}
+
+		err = c.ServiceProjectAccount.ChangeAccount(id, projectId, AccountData)
+		if err != nil {
+			c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+			return
+		}
+		c.Ctx.JSON(iris.Map{"code": 0, "msg": "编辑成功"})
+	}
+}
+
+// // @Summary 获取项目信息
+// // @Tags 项目设置-管理员
+// // @Description 获取项目信息
+// // @Accept  json
+// // @Produce  json
+// // @Security ApiKeyAuth
+// // @Success 200 {string} string "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
+// // @Router /backstage/account/project [get]
+// func (c *ProjectAccountBs) GetProject() {
+// 	projectId, err := utils.GetProjectId(c.Ctx)
+// 	if err != nil {
+// 		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+// 		return
+// 	}
+// 	projectdata, err := c.ServiceProject.Get(projectId)
+// 	userId, _ := utils.GetDecryptId(projectdata.UserId)
+// 	accountData := c.ServiceProjectAccount.Get(userId, projectId)
+
+// 	data := make(map[string]interface{})
+// 	data["project"] = projectdata
+// 	data["account"] = accountData
+
+// 	if err != nil {
+// 		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+// 		return
+// 	} else {
+// 		c.Ctx.JSON(iris.Map{"code": 0, "msg": "操作成功", "data": data})
+// 	}
+// }
+
+// // @Summary 保存项目信息
+// // @Tags 项目设置-管理员
+// // @Description 保存项目信息
+// // @Accept  json
+// // @Produce  json
+// // @Security ApiKeyAuth
+// // @Param   name     body    string     true        "账号ID" default(红旗大桥)
+// // @Param   X-CSRF-Token      header    string     true        "csrf"
+// // @Success 200 {string} string "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
+// // @Router /backstage/account/project/save [post]
+// func (c *ProjectAccountBs) PostProjectSave() {
+
+// 	ProjectData, err := c.ServiceProject.ValidRule(c.Ctx)
+// 	if err != nil {
+// 		ErrMsg := utils.FormValidError(err)
+// 		c.Ctx.JSON(iris.Map{"code": -1, "msg": ErrMsg})
+// 		return
+// 	} else {
+// 		// 项目ID
+// 		projectId, err := utils.GetProjectId(c.Ctx)
+// 		if err != nil {
+// 			c.Ctx.JSON(iris.Map{"code": -1, "msg": "账号异常"})
+// 			return
+// 		}
+
+// 		err = c.ServiceProject.Save(projectId, ProjectData)
+// 		if err != nil {
+// 			c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
+// 			return
+// 		}
+// 		c.Ctx.JSON(iris.Map{"code": 0, "msg": "操作成功"})
+// 	}
+// }

+ 9 - 2
web/backstage/project_bs.go

@@ -223,8 +223,15 @@ func (c *ProjectBs) PostSave() {
 		return
 	}
 
+	// 解析项目ID
+	id, err := utils.GetDecryptId(projectData.Id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+
 	// 新增项目信息
-	err = c.ServiceProject.SaveBs(projectData)
+	err = c.ServiceProject.SaveBs(projectData, id)
 	if err != nil {
 		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
 		return
@@ -232,6 +239,6 @@ func (c *ProjectBs) PostSave() {
 	c.Ctx.JSON(iris.Map{
 		"code": 0,
 		"data": "",
-		"msg":  "新增成功",
+		"msg":  "编辑成功",
 	})
 }

+ 8 - 0
web/routes/routes.go

@@ -205,4 +205,12 @@ func Configure(b *bootstrap.Bootstrapper) {
 	backstageProjectCM.Register(backstageService)
 	backstageProjectCM.Router.Use(middleware.SessionsBackstageAuth)
 	backstageProjectCM.Handle(new(backstage.ProjectBs))
+
+	backstageAccountCM := mvc.New(b.Party("/backstage/account"))
+	backstageAccountCM.Register(ProjectAccountService)
+	backstageAccountCM.Register(ProjectService)
+	backstageAccountCM.Register(BidAccountService)
+	backstageAccountCM.Register(backstageService)
+	backstageAccountCM.Router.Use(middleware.SessionsBackstageAuth)
+	backstageAccountCM.Handle(new(backstage.ProjectAccountBs))
 }

+ 6 - 0
web/viewmodels/project_account.go

@@ -80,6 +80,12 @@ func (l ProjectAccount) ValidateAccount() error {
 	)
 }
 
+func (l ProjectAccount) ValidateProjectId() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.ProjectId, validation.Required.Error("项目ID不能为空")),
+	)
+}
+
 func (l AccountPassword) ValidateChangePassword() error {
 	return validation.ValidateStruct(&l,
 		validation.Field(&l.Password, validation.Required.Error("密码不能为空")),