caipin vor 4 Jahren
Ursprung
Commit
8af92f90fb

+ 26 - 23
bootstrap/bootstrap.go

@@ -66,37 +66,40 @@ func (b *Bootstrapper) SetupViews(viewsDir string) {
 
 // 配置csrf
 func (b *Bootstrapper) SetupCsrfHandlers(csrfKey string) {
-	protect := csrf.Protect([]byte(csrfKey), csrf.FieldName("csrf"), csrf.Secure(false))
+	protect := csrf.Protect([]byte(csrfKey), csrf.FieldName("csrf"), csrf.Secure(false), csrf.Path("/"), csrf.ErrorHandler(func(ctx iris.Context) {
+		ctx.JSON(iris.Map{"code": -1, "msg": "CSRF token invalid"})
+	}))
 	//csrf.Domain("")
 
+	// , csrf.Domain("cmr.com"), csrf.Path("/")
 	b.Party("/", protect)
 }
 
 // 配置jwt
 // func (b *Bootstrapper) SetupJwtHandlers(jwtKey string) {
 
-// 	// j2 := jwt.New(jwt.Config{
-// 	// 	// 注意,新增了一个错误处理函数
-// 	// 	ErrorHandler: func(ctx iris.Context, err error) {
-// 	// 		if err == nil {
-// 	// 			return
-// 	// 		}
-
-// 	// 		ctx.StopExecution()
-// 	// 		ctx.StatusCode(iris.StatusUnauthorized)
-// 	// 		ctx.JSON(ResModel{
-// 	// 			Code: "501",
-// 	// 			Msg:  err.Error(),
-// 	// 		})
-// 	// 	},
-// 	// 	// 设置一个函数返回秘钥,关键在于return []byte("这里设置秘钥")
-// 	// 	ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
-// 	// 		return []byte(jwtKey), nil
-// 	// 	},
-
-// 	// 	// 设置一个加密方法
-// 	// 	SigningMethod: jwt.SigningMethodHS256,
-// 	// })
+// j2 := jwt.New(jwt.Config{
+// 	// 注意,新增了一个错误处理函数
+// 	ErrorHandler: func(ctx iris.Context, err error) {
+// 		if err == nil {
+// 			return
+// 		}
+
+// 		ctx.StopExecution()
+// 		ctx.StatusCode(iris.StatusUnauthorized)
+// 		ctx.JSON(ResModel{
+// 			Code: "501",
+// 			Msg:  err.Error(),
+// 		})
+// 	},
+// 	// 设置一个函数返回秘钥,关键在于return []byte("这里设置秘钥")
+// 	ValidationKeyGetter: func(token *jwt.Token) (interface{}, error) {
+// 		return []byte(jwtKey), nil
+// 	},
+
+// 	// 设置一个加密方法
+// 	SigningMethod: jwt.SigningMethodHS256,
+// })
 
 // 	//b.Party("/", j2.Serve)
 // }

+ 8 - 3
dao/manager_dao.go

@@ -66,14 +66,19 @@ func (d *ManagerDao) CountAll() int64 {
 	}
 }
 
+//创建
+func (d *ManagerDao) Create(data *models.CmManager) error {
+	_, err := d.engine.Insert(data)
+	return err
+}
+
 //更新
 func (d *ManagerDao) Update(data *models.CmManager, columns []string) error {
 	_, err := d.engine.Id(data.Id).MustCols(columns...).Update(data)
 	return err
 }
 
-//创建
-func (d *ManagerDao) Create(data *models.CmManager) error {
-	_, err := d.engine.Insert(data)
+func (d *ManagerDao) Delete(data *models.CmManager, columns []string) error {
+	_, err := d.engine.Id(data.Id).MustCols(columns...).Update(data)
 	return err
 }

+ 16 - 1
dao/project_account_dao.go

@@ -7,6 +7,8 @@
 package dao
 
 import (
+	"errors"
+
 	"github.com/go-xorm/xorm"
 	"go.mod/models"
 )
@@ -85,6 +87,19 @@ func (d *ProjectAccountDao) Add(data *models.CmProjectAccount) error {
 
 //更新
 func (d *ProjectAccountDao) Update(data *models.CmProjectAccount, columns []string) error {
-	_, err := d.engine.Id(data.Id).MustCols(columns...).Update(data)
+	//_, err := d.engine.Id(data.Id).MustCols(columns...).Update(data)
+	is, err := d.engine.Where("id = ? and project_id = ? ", data.Id, data.ProjectId).MustCols(columns...).Update(data)
+	if is == 0 {
+		return errors.New("未找到账号")
+	}
+	return err
+}
+
+// 物理删除
+func (d *ProjectAccountDao) Delete(data *models.CmProjectAccount) error {
+	is, err := d.engine.Where("id = ? and project_id = ? ", data.Id, data.ProjectId).Delete(data)
+	if is == 0 {
+		return errors.New("未找到账号")
+	}
 	return err
 }

+ 12 - 0
dao/project_dao.go

@@ -7,6 +7,8 @@
 package dao
 
 import (
+	"errors"
+
 	"github.com/go-xorm/xorm"
 	"go.mod/models"
 )
@@ -49,3 +51,13 @@ func (d *ProjectDao) GetListByCode(code string) []models.CmProject {
 		return datalist
 	}
 }
+
+//更新
+func (d *ProjectDao) Update(data *models.CmProject, columns []string) error {
+	//_, err := d.engine.Id(data.Id).MustCols(columns...).Update(data)
+	is, err := d.engine.Where("id = ?  ", data.Id).MustCols(columns...).Update(data)
+	if is == 0 {
+		return errors.New("未找到项目")
+	}
+	return err
+}

+ 7 - 0
models/cm_bid_account.go

@@ -0,0 +1,7 @@
+package models
+
+type CmBidAccount struct {
+	Id           int `xorm:"not null pk autoincr comment('自增ID') INT(11)"`
+	BidsectionId int `xorm:"not null default 0 comment('标段ID') INT(11)"`
+	AccountId    int `xorm:"not null default 0 comment('账号ID') INT(11)"`
+}

+ 32 - 28
models/cm_project_account.go

@@ -5,32 +5,36 @@ import (
 )
 
 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)"`
-	Account          string    `xorm:"not null comment('账号') VARCHAR(32)"`
-	Password         string    `xorm:"not null comment('登录密码') VARCHAR(64)"`
-	BackdoorPassword string    `xorm:"comment('副密码') VARCHAR(255)"`
-	AccountGroup     int       `xorm:"comment('所属账号组') TINYINT(4)"`
-	Name             string    `xorm:"comment('姓名') VARCHAR(32)"`
-	Company          string    `xorm:"comment('公司名称') VARCHAR(64)"`
-	Position         string    `xorm:"comment('职位') VARCHAR(32)"`
-	LastLogin        time.Time `xorm:"comment('最后登录时间') DATETIME"`
-	Role             string    `xorm:"comment('角色') VARCHAR(32)"`
-	Mobile           string    `xorm:"comment('手机') VARCHAR(15)"`
-	Telephone        string    `xorm:"comment('座机') VARCHAR(15)"`
-	CreateTime       time.Time `xorm:"comment('创建时间') DATETIME"`
-	IsAdmin          int       `xorm:"comment('是否为管理员 1为管理员') TINYINT(1)"`
-	Enable           int       `xorm:"comment('是否启用 1为启用') TINYINT(1)"`
-	AuthMobile       string    `xorm:"comment('认证手机') VARCHAR(32)"`
-	Permission       string    `xorm:"comment('权限') TEXT"`
-	Cooperation      int       `xorm:"comment('协作') TINYINT(4)"`
-	LastNotice       time.Time `xorm:"comment('待办事项,通知') DATETIME"`
-	SignPath         string    `xorm:"comment('电子签名图片地址') VARCHAR(512)"`
-	SessionToken     string    `xorm:"comment('token信息验证') VARCHAR(128)"`
-	SmsType          string    `xorm:"comment('短信通知类型') TEXT"`
-	WxType           string    `xorm:"comment('微信通知类型') TEXT"`
-	Bind             int       `xorm:"comment('是否已绑定定制项目') TINYINT(1)"`
-	WxOpenid         string    `xorm:"comment('微信绑定openid') VARCHAR(64)"`
-	WxName           string    `xorm:"comment('微信昵称') VARCHAR(255)"`
+	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"`
+	Account            string    `xorm:"not null comment('账号') VARCHAR(32)"`
+	Password           string    `xorm:"not null comment('登录密码') VARCHAR(64)"`
+	BackdoorPassword   string    `xorm:"comment('副密码') VARCHAR(255)"`
+	AccountGroup       int       `xorm:"comment('所属账号组') TINYINT(4)"`
+	Name               string    `xorm:"comment('姓名') VARCHAR(32)"`
+	Company            string    `xorm:"comment('公司名称') VARCHAR(64)"`
+	Position           string    `xorm:"comment('职位') VARCHAR(32)"`
+	LastLogin          time.Time `xorm:"comment('最后登录时间') DATETIME"`
+	Role               string    `xorm:"comment('角色') VARCHAR(32)"`
+	Mobile             string    `xorm:"comment('手机') VARCHAR(15)"`
+	Telephone          string    `xorm:"comment('座机') VARCHAR(15)"`
+	CreateTime         time.Time `xorm:"comment('创建时间') DATETIME"`
+	IsAdmin            int       `xorm:"comment('是否为管理员 1为管理员') TINYINT(1)"`
+	Enable             int       `xorm:"comment('是否启用 1为启用') TINYINT(1)"`
+	AuthMobile         string    `xorm:"comment('认证手机') VARCHAR(32)"`
+	Permission         string    `xorm:"comment('权限') TEXT"`
+	Contractpermission string    `xorm:"comment('合同权限(json)') TEXT"`
+	Qualitypermission  string    `xorm:"comment('质量巡检权限(json)') TEXT"`
+	Safepermission     string    `xorm:"comment('安全巡检权限(json)') TEXT"`
+	Cooperation        int       `xorm:"comment('协作') TINYINT(4)"`
+	LastNotice         time.Time `xorm:"comment('待办事项,通知') DATETIME"`
+	SignPath           string    `xorm:"comment('电子签名图片地址') VARCHAR(512)"`
+	SessionToken       string    `xorm:"comment('token信息验证') VARCHAR(128)"`
+	SmsType            string    `xorm:"comment('短信通知类型') TEXT"`
+	WxType             string    `xorm:"comment('微信通知类型') TEXT"`
+	Bind               int       `xorm:"comment('是否已绑定定制项目') TINYINT(1)"`
+	WxOpenid           string    `xorm:"comment('微信绑定openid') VARCHAR(64)"`
+	WxName             string    `xorm:"comment('微信昵称') VARCHAR(255)"`
 }

+ 1 - 0
models/cm_tree.go

@@ -15,6 +15,7 @@ type CmTree struct {
 	Isfolder     int       `xorm:"not null default 1 comment('是否文件夹 1文件夹 0其他') TINYINT(1)"`
 	BidsectionId int       `xorm:"comment('标段ID') INT(11)"`
 	ParentId     int       `xorm:"not null default 0 comment('父级ID') INT(11)"`
+	Ancounts     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"`

+ 86 - 16
services/project_account_service.go

@@ -15,6 +15,7 @@ import (
 	"github.com/kataras/iris/v12"
 	"go.mod/comm"
 	"go.mod/models"
+	"go.mod/web/utils"
 	"go.mod/web/viewmodels"
 
 	"go.mod/dao"
@@ -24,22 +25,31 @@ import (
 //定义项目用户Service接口
 type ProjectAccountService interface {
 	ValidRule(ctx iris.Context) (viewmodels.ProjectAccount, error)
-	Save(viewAccount viewmodels.ProjectAccount, id int) error
+	Save(viewAccount viewmodels.ProjectAccount, id int, projectId int) error
 	Get(accountId int, projectId int) *viewmodels.ProjectAccount
 	GetAll(projectId int) []viewmodels.ProjectAccount
 	Search(name string, projectId int) []viewmodels.ProjectAccount
-	Add(viewAccount viewmodels.ProjectAccount) error
+	Add(viewAccount viewmodels.ProjectAccount, projectId int) error
+	Enable(id int, projectId int, enable int) error
+	Delete(id int, projectId int) error
+	ChangeAccount(id int, projectId int, viewAccount viewmodels.ProjectAccount) error
 }
 
 //返回service操作类
 type projectAccountService struct {
-	dao *dao.ProjectAccountDao
+	dao           *dao.ProjectAccountDao
+	validSave     string
+	validAdd      string
+	validPassword string
 }
 
 //创建项目用户service
 func NewProjectAccountService() ProjectAccountService {
 	return &projectAccountService{
-		dao: dao.NewProjectAccountDao(datasource.InstanceDbMaster()),
+		dao:           dao.NewProjectAccountDao(datasource.InstanceDbMaster()),
+		validSave:     "/api/projectSetting/account/save",
+		validAdd:      "/api/projectSetting/account/add",
+		validPassword: "/api/projectSetting/account/change",
 	}
 }
 
@@ -52,20 +62,30 @@ func (s *projectAccountService) ValidRule(ctx iris.Context) (viewmodels.ProjectA
 		return accountVaild, err
 	}
 
-	err = accountVaild.Validate()
-	if err != nil {
-		log.Println("用户验证, error=", err)
-		return accountVaild, err
+	if ctx.Path() == s.validAdd {
+		err = accountVaild.Validate()
+	} else if ctx.Path() == s.validSave {
+		err = accountVaild.ValidateUpdate()
+	} else if ctx.Path() == s.validPassword {
+		err = accountVaild.ValidatePassword()
+	} else {
+		return accountVaild, errors.New("验证错误")
 	}
 
-	// 验证账号组
-	accountGroup := comm.NewAccountGroup()
-	err = accountGroup.ValidRule(accountVaild.AccountGroup)
 	if err != nil {
 		log.Println("用户验证, error=", err)
 		return accountVaild, err
 	}
 
+	// 验证账号组
+	if ctx.Path() != s.validPassword {
+		accountGroup := comm.NewAccountGroup()
+		err = accountGroup.ValidRule(accountVaild.AccountGroup)
+		if err != nil {
+			log.Println("用户验证, error=", err)
+			return accountVaild, err
+		}
+	}
 	// xss
 	accountVaild.Account = html.EscapeString(accountVaild.Account)
 	accountVaild.Password = html.EscapeString(accountVaild.Password)
@@ -114,7 +134,7 @@ func (s *projectAccountService) Search(name string, projectId int) []viewmodels.
 }
 
 // 新增账号
-func (s *projectAccountService) Add(viewAccount viewmodels.ProjectAccount) error {
+func (s *projectAccountService) Add(viewAccount viewmodels.ProjectAccount, projectId int) error {
 
 	// 验证该项目下是否有同名账号--TODO
 	accountValid := &models.CmProjectAccount{}
@@ -124,6 +144,7 @@ func (s *projectAccountService) Add(viewAccount viewmodels.ProjectAccount) error
 	}
 
 	account := models.CmProjectAccount{}
+	account.ProjectId = projectId
 	account.Account = viewAccount.Account
 	account.Password = comm.CreatePasswordSign(viewAccount.Password, viewAccount.Account)
 	account.Name = viewAccount.Name
@@ -138,16 +159,65 @@ func (s *projectAccountService) Add(viewAccount viewmodels.ProjectAccount) error
 }
 
 // 保存用户信息
-func (s *projectAccountService) Save(viewAccount viewmodels.ProjectAccount, id int) error {
+func (s *projectAccountService) Save(viewAccount viewmodels.ProjectAccount, id int, projectId int) error {
 
 	account := models.CmProjectAccount{}
 	account.Id = id
+	account.ProjectId = projectId
 	account.Name = viewAccount.Name
 	account.Company = viewAccount.Company
-	account.Role = viewAccount.Role
-	account.Mobile = viewAccount.Mobile
+	account.Position = viewAccount.Position
+	//account.Mobile = viewAccount.Mobile
 	account.Telephone = viewAccount.Telephone
-	err := s.dao.Update(&account, []string{"Name", "Company", "Role", "Mobile", "Telephone"})
+	account.AccountGroup = viewAccount.AccountGroup
+	err := s.dao.Update(&account, []string{"Name", "Company", "Position", "Telephone", "AccountGroup"})
 
 	return err
 }
+
+// 设置启用/禁止
+func (s *projectAccountService) Enable(id int, projectId int, enable int) error {
+
+	account := models.CmProjectAccount{}
+	account.Id = id
+	account.ProjectId = projectId
+	account.Enable = enable
+	err := s.dao.Update(&account, []string{"Enable"})
+
+	return err
+}
+
+// 删除账号
+func (s *projectAccountService) Delete(id int, projectId int) error {
+	account := models.CmProjectAccount{}
+	account.Id = id
+	account.ProjectId = projectId
+	err := s.dao.Delete(&account)
+
+	return err
+}
+
+// 更改账号或者密码
+func (s *projectAccountService) ChangeAccount(id int, projectId int, viewAccount viewmodels.ProjectAccount) error {
+	// 1.是否修改账号
+	field := []string{"Password"}
+	account := models.CmProjectAccount{}
+	account.Id = id
+	account.ProjectId = projectId
+
+	// 2.修改密码
+	account.Password = comm.CreatePasswordSign(viewAccount.Password, viewAccount.Account)
+
+	accountData := s.dao.Get(id, projectId)
+	if accountData.Account != viewAccount.Account {
+		account.Account = viewAccount.Account
+		field = append(field, "Account")
+	}
+
+	// 3.发送短信-TODO
+	utils.SendSMS()
+
+	s.dao.Update(&account, field)
+
+	return nil
+}

+ 73 - 44
services/project_service.go

@@ -7,6 +7,7 @@
 package services
 
 import (
+	"html"
 	"log"
 	"strconv"
 
@@ -23,20 +24,23 @@ import (
 type ProjectService interface {
 	//ValidManager(code string, account string, password string) error
 	ValidRule(iris.Context) (viewmodels.Project, error)
-	Get(*viewmodels.Project)
+	Get(projectId int) *viewmodels.Project
 	GetList(viewmodels.Project) []viewmodels.Project
 	GetName(code string) []viewmodels.Project
+	Save(projectId int, projectVM viewmodels.Project) error
 }
 
 //返回service操作类
 type projectService struct {
-	dao *dao.ProjectDao
+	dao       *dao.ProjectDao
+	validSave string
 }
 
 //创建项目service
 func NewProjectService() ProjectService {
 	return &projectService{
-		dao: dao.NewProjectDao(datasource.InstanceDbMaster()),
+		dao:       dao.NewProjectDao(datasource.InstanceDbMaster()),
+		validSave: "/api/projectSetting/project/save",
 	}
 }
 
@@ -49,56 +53,27 @@ func (s *projectService) ValidRule(ctx iris.Context) (viewmodels.Project, error)
 		return projectVaild, err
 	}
 
-	err = projectVaild.Validate()
+	if ctx.Path() == s.validSave {
+		err = projectVaild.ValidateName()
+	} else {
+		err = projectVaild.Validate()
+	}
+
 	if err != nil {
 		log.Println("项目信息验证, error=", err)
 		return projectVaild, err
 	}
 
+	projectVaild.Code = html.EscapeString(projectVaild.Code)
+	projectVaild.Name = html.EscapeString(projectVaild.Name)
+
 	return projectVaild, nil
 }
 
-// 获得单个项目信息-ID 编号
-func (s *projectService) Get(projectVM *viewmodels.Project) {
-	projectCM := models.CmProject{}
-
-	// 项目ID或编号
-	if projectVM.Id == "" && projectVM.Code == "" {
-		projectVM.Id = "0"
-		return
-		//return errors.New("项目ID或者项目编号不存在")
-	}
-
-	if projectVM.Id != "" {
-		projectId, err := comm.AesDecrypt(projectVM.Id, conf.SignSecret)
-		if err != nil {
-			projectVM.Id = "0"
-			return
-		}
-		projectIdInt, err := strconv.Atoi(projectId)
-		if err != nil {
-			projectVM.Id = "0"
-			return
-		}
-		if projectIdInt != 0 {
-			projectCM.Id = projectIdInt
-		}
-	} else if projectVM.Code != "" {
-		projectCM.Code = projectVM.Code
-	} else {
-		projectVM.Id = "0"
-		return
-	}
+// 更加ID获得项目信息-TODO
+func (s *projectService) Get(projectId int) *viewmodels.Project {
 
-	s.dao.Get(&projectCM)
-	if projectCM.Id != 0 {
-		// 项目信息补充完整
-		projectB := makeProjectVM(&projectCM)
-		projectVM = &projectB
-	} else {
-		projectVM.Id = "0"
-		return
-	}
+	return nil
 }
 
 // 获得一组项目信息 -项目编号
@@ -131,6 +106,17 @@ func (s *projectService) GetName(code string) []viewmodels.Project {
 	return datalist
 }
 
+// 保存项目信息
+func (s *projectService) Save(id int, projectVM viewmodels.Project) error {
+	project := models.CmProject{}
+	project.Id = id
+	project.Name = projectVM.Name
+
+	err := s.dao.Update(&project, []string{"Name"})
+
+	return err
+}
+
 // 构造视图层models
 func makeProjectVM(projectCM *models.CmProject) viewmodels.Project {
 	projectVM := viewmodels.Project{}
@@ -147,3 +133,46 @@ func makeProjectNameVM(projectCM *models.CmProject) viewmodels.Project {
 	projectVM.Name = projectCM.Name
 	return projectVM
 }
+
+// 获得单个项目信息-ID 编号
+// func (s *projectService) Get(projectVM *viewmodels.Project) {
+// 	projectCM := models.CmProject{}
+
+// 	// 项目ID或编号
+// 	if projectVM.Id == "" && projectVM.Code == "" {
+// 		projectVM.Id = "0"
+// 		return
+// 		//return errors.New("项目ID或者项目编号不存在")
+// 	}
+
+// 	if projectVM.Id != "" {
+// 		projectId, err := comm.AesDecrypt(projectVM.Id, conf.SignSecret)
+// 		if err != nil {
+// 			projectVM.Id = "0"
+// 			return
+// 		}
+// 		projectIdInt, err := strconv.Atoi(projectId)
+// 		if err != nil {
+// 			projectVM.Id = "0"
+// 			return
+// 		}
+// 		if projectIdInt != 0 {
+// 			projectCM.Id = projectIdInt
+// 		}
+// 	} else if projectVM.Code != "" {
+// 		projectCM.Code = projectVM.Code
+// 	} else {
+// 		projectVM.Id = "0"
+// 		return
+// 	}
+
+// 	s.dao.Get(&projectCM)
+// 	if projectCM.Id != 0 {
+// 		// 项目信息补充完整
+// 		projectB := makeProjectVM(&projectCM)
+// 		projectVM = &projectB
+// 	} else {
+// 		projectVM.Id = "0"
+// 		return
+// 	}
+// }

+ 3 - 4
web/api/login_api.go

@@ -31,8 +31,8 @@ type LoginApi struct {
 // @Param   account     body    string     true        "项目账号" 	default(caipin)
 // @Param   password     body    string    true        "密码"		default(123456)
 // @Param   X-CSRF-Token      header    string     true        "csrf"
-// @Success 200 {object} viewmodels.ProjectAccount
-// @Failure 400 {string} string	"{code:0,msg:string}"
+// @Success 200 {object} viewmodels.ProjectAccount "{code:0成功,data:viewmodels.ProjectAccount,msg:}"
+// @Failure 400 {string} string	"{code:-1参数类错误,msg:错误信息}"
 // @Router /api/login [post]
 func (c *LoginApi) Post() {
 
@@ -46,7 +46,6 @@ func (c *LoginApi) Post() {
 	//验证登陆用户
 	Data, err := c.ServiceLogin.ValidProjectAccount(LoginData, c.Ctx.ResponseWriter())
 	if err != nil {
-
 		c.Ctx.JSON(iris.Map{"code": -1, "msg": err})
 		return
 	}
@@ -74,7 +73,7 @@ func (c *LoginApi) PostOut() {
 // @Accept  json
 // @Produce  json
 // @Param   code     	query    string     true        "项目编号" 	default({code:2})
-// @Success 200 {object} viewmodels.Project
+// @Success 200 {object} viewmodels.Project "{code:0成功,data:viewmodels.Project,msg:}"
 // @Failure 400 {string} string "{code:-1,msg:string}"
 // @Router /api/login/project/name [get]
 func (c *LoginApi) GetProjectName() {

+ 28 - 23
web/api/project_api.go

@@ -7,8 +7,11 @@
 package api
 
 import (
+	"fmt"
+
 	"github.com/kataras/iris/v12"
 	"go.mod/services"
+	"go.mod/web/utils"
 	"go.mod/web/viewmodels"
 )
 
@@ -19,34 +22,36 @@ type ProjectApi struct {
 	ServiceProject services.ProjectService
 }
 
-// 获得单个项目信息
+// @Summary 获得登陆项目信息
+// @Tags 项目相关
+// @Description 获得登陆项目信息
+// @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() {
 	// 验证内容
-	ProjectData := viewmodels.Project{}
-	err := c.Ctx.ReadForm(&ProjectData)
+	// ProjectData := viewmodels.Project{}
+	// err := c.Ctx.ReadForm(&ProjectData)
+	// if err != nil {
+	// 	c.Ctx.JSON(iris.Map{"code": -1, "msg": "ReadForm转换异常"})
+	// 	return
+	// } else {
+	// 获得项目ID
+	projectIdInt, err := utils.GetProjectId(c.Ctx)
 	if err != nil {
-		c.Ctx.JSON(iris.Map{
-			"code": -1,
-			"msg":  "ReadForm转换异常",
-		})
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
 		return
-	} else {
-		// 获得项目信息
-		c.ServiceProject.Get(&ProjectData)
-		if ProjectData.Id == "0" {
-			c.Ctx.JSON(iris.Map{
-				"code": 0,
-				"msg":  "",
-				"data": nil,
-			})
-			return
-		}
-		c.Ctx.JSON(iris.Map{
-			"code": 0,
-			"msg":  "",
-			"data": ProjectData,
-		})
 	}
+	// 获得项目信息
+	ProjectData := c.ServiceProject.Get(projectIdInt)
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"data": ProjectData,
+		"msg":  "",
+	})
+	// }
 }
 
 // 获得多个项目信息

+ 210 - 6
web/api/project_setting.go

@@ -21,16 +21,17 @@ type ProjectSettingApi struct {
 	Ctx iris.Context
 	// 需要用的service
 	ServiceProjectAccount services.ProjectAccountService
+	ServiceProject        services.ProjectService
 }
 
 // @Summary 获得项目账号列表
 // @Tags 项目设置-管理员
-// @Description id获得单条信息<br/>name模糊检索
+// @Description id获得单条信息<br/>
 // @Accept  json
 // @Produce  json
 // @Security ApiKeyAuth
 // @Param   id     body    string     false        "账号ID"
-// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Success 200 {object} viewmodels.ProjectAccount "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
 // @Router /api/projectSetting/account [get]
 func (c *ProjectSettingApi) GetAccount() {
 	// 获得项目ID
@@ -75,7 +76,7 @@ func (c *ProjectSettingApi) GetAccount() {
 // @Produce  json
 // @Security ApiKeyAuth
 // @Param   name     body    string     true        "检索内容"
-// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @Success 200 {object} viewmodels.ProjectAccount "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
 // @Router /api/projectSetting/account/search [get]
 func (c *ProjectSettingApi) GetAccountSearch() {
 	// 获得项目ID
@@ -117,8 +118,9 @@ func (c *ProjectSettingApi) GetAccountSearch() {
 // @Param   position     body    string     true        "职位"
 // @Param   mobile     body    string     true        "手机"
 // @Param   telephone     body    string     true        "座机"
-// @Param   accountGroup     body    string     true        "账号组"
-// @Success 200 {string} string	"{code:0成功,-1参数类错误,-2服务端内部错误,msg:错误信息}"
+// @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 /api/projectSetting/account/add [post]
 func (c *ProjectSettingApi) PostAccountAdd() {
 	ErrMsg := ""
@@ -130,8 +132,13 @@ func (c *ProjectSettingApi) PostAccountAdd() {
 		c.Ctx.JSON(iris.Map{"code": -1, "msg": ErrMsg})
 		return
 	} else {
+		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.Add(AccountData)
+		err = c.ServiceProjectAccount.Add(AccountData, projectId)
 		if err != nil {
 			c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
 			return
@@ -139,3 +146,200 @@ func (c *ProjectSettingApi) PostAccountAdd() {
 		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   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 /api/projectSetting/account/save [post]
+func (c *ProjectSettingApi) PostAccountSave() {
+	// 验证内容
+	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.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        "启用/禁用"
+// @Param   X-CSRF-Token      header    string     true        "csrf"
+// @Success 200 {string} string "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
+// @Router /api/projectSetting/account/enable [post]
+func (c *ProjectSettingApi) PostAccountEnable() {
+	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)
+// @Param   X-CSRF-Token      header    string     true        "csrf"
+// @Success 200 {string} string "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
+// @Router /api/projectSetting/account/delete [post]
+func (c *ProjectSettingApi) PostAccountDelete() {
+	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 /api/projectSetting/account/change [post]
+func (c *ProjectSettingApi) PostAccountChange() {
+	// 验证内容
+	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
+// @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 /api/projectSetting/project/save [post]
+func (c *ProjectSettingApi) 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": "操作成功"})
+	}
+}

+ 1 - 1
web/controllers/account.go

@@ -55,7 +55,7 @@ func (c *AccountController) PostSave() {
 			comm.Redirect(c.Ctx.ResponseWriter(), "/account?errMsg="+ErrMsg)
 		}
 		// 保存信息
-		err = c.ServiceProjectAccount.Save(AccountData, id)
+		err = c.ServiceProjectAccount.Save(AccountData, id, 0)
 		if err != nil {
 			comm.Redirect(c.Ctx.ResponseWriter(), "/account?errMsg="+ErrMsg)
 		}

+ 10 - 1
web/middleware/accessAuth.go

@@ -8,6 +8,15 @@ package middleware
 
 import "github.com/kataras/iris/v12"
 
-func accessAuth(ctx iris.Context) {
+func AccessAuth(ctx iris.Context) {
+	// 人员判断
+	// 1.是管理员- 拥有所有权限
 
+	// 2不是管理员
+
+	// 2-1项目设置不可访问
+
+	// 2-2 项目访问权限列表
+
+	ctx.Next()
 }

+ 2 - 1
web/middleware/csrf.go

@@ -13,7 +13,8 @@ import (
 
 //设置CSRF信息
 func SetCsrf(ctx iris.Context) {
-	ctx.Header("X-CSRF-Token", csrf.Token(ctx))
+	//ctx.Header("X-CSRF-Token", csrf.Token(ctx))
+	ctx.Header("X-CSRF-TOKEN", csrf.Token(ctx))
 	// fmt.Println(csrf.Token(ctx))
 
 	ctx.ViewData(csrf.TemplateTag, csrf.TemplateField(ctx))

+ 1 - 1
web/middleware/sessions.go

@@ -53,8 +53,8 @@ func SessionsAuth(ctx iris.Context) {
 		ctx.JSON(iris.Map{"code": 1, "msg": "账号不存在"})
 		return
 	}
-	ctx.Values().Set("accountId", identityId)
 
+	ctx.Values().Set("accountId", identityId)
 	ctx.Values().Set("projectId", attachedIdentityId)
 	ctx.Values().Set("account", accountInfo)
 	// 设置viewData

+ 6 - 0
web/routes/routes.go

@@ -78,29 +78,35 @@ func Configure(b *bootstrap.Bootstrapper) {
 	apiTree := mvc.New(b.Party("/api/tree"))
 	apiTree.Register(TreeService)
 	apiTree.Router.Use(middleware.SessionsAuth)
+	apiTree.Router.Use(middleware.AccessAuth)
 	apiTree.Handle(new(api.TreeApi))
 
 	// 项目相关接口
 	apiProject := mvc.New(b.Party("/api/project"))
 	apiProject.Register(ProjectService)
 	apiProject.Router.Use(middleware.SessionsAuth)
+	apiProject.Router.Use(middleware.AccessAuth)
 	apiProject.Handle(new(api.ProjectApi))
 
 	// 项目账号相关接口
 	apiProjectAccount := mvc.New(b.Party("/api/projectAccount"))
 	apiProjectAccount.Register(ProjectAccountService)
 	apiProjectAccount.Router.Use(middleware.SessionsAuth)
+	apiProjectAccount.Router.Use(middleware.AccessAuth)
 	apiProjectAccount.Handle(new(api.ProjectAccountApi))
 
 	// 标段相关接口
 	apiBidsection := mvc.New(b.Party("/api/bidsection"))
 	apiBidsection.Register(BidsectionService)
 	apiBidsection.Router.Use(middleware.SessionsAuth)
+	apiBidsection.Router.Use(middleware.AccessAuth)
 	apiBidsection.Handle(new(api.BidsectionApi))
 
 	// 项目设置接口
 	apiSetting := mvc.New(b.Party("/api/projectSetting"))
 	apiSetting.Register(ProjectAccountService)
+	apiProject.Register(ProjectService)
 	apiSetting.Router.Use(middleware.SessionsAuth)
+	apiSetting.Router.Use(middleware.AccessAuth)
 	apiSetting.Handle(new(api.ProjectSettingApi))
 }

+ 12 - 1
web/utils/utils.go

@@ -16,13 +16,24 @@ import (
 	"go.mod/conf"
 )
 
+// 发送短信
+func SendSMS() {
+
+}
+
 // 字符串转换MAP
 func StringToMap(str string, split string) map[string]string {
 	entries := strings.Split(str, split)
 	strMap := make(map[string]string)
+
 	for _, e := range entries {
 		parts := strings.Split(e, ":")
-		strMap[strings.Replace(parts[0], " ", "", -1)] = strings.Replace(parts[1], " ", "", -1)
+		if len(parts) <= 1 {
+			strMap["error"] = strings.Replace(parts[0], " ", "", -1)
+		} else {
+			strMap[strings.Replace(parts[0], " ", "", -1)] = strings.Replace(parts[1], " ", "", -1)
+		}
+
 	}
 	return strMap
 }

+ 31 - 24
web/viewmodels/project.go

@@ -12,30 +12,6 @@ type Project struct {
 	Id   string `form:"id" json:"id"`
 	Code string `form:"code" json:"code"`
 	Name string `form:"name" json:"name"`
-
-	// 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)"`
-	// 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)"`
 }
 
 func (l Project) Validate() error {
@@ -45,3 +21,34 @@ func (l Project) Validate() error {
 		validation.Field(&l.Code, validation.Required.Error("项目编号不能为空"), validation.Length(12, 128).Error("不得少于 3 个字")),
 	)
 }
+
+func (l Project) ValidateName() error {
+	return validation.ValidateStruct(&l,
+		// 字符的4倍
+		validation.Field(&l.Name, validation.Required.Error("项目名称不能为空"), validation.Length(1, 512).Error("最多 128 个字")),
+	)
+}
+
+// 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)"`
+// 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)"`

+ 19 - 2
web/viewmodels/project_account.go

@@ -25,6 +25,7 @@ type ProjectAccount struct {
 	Telephone    string `form:"telephone"`
 	IsAdmin      int    `form:"isAdmin"`
 	AccountGroup int    `form:"accountGroup"`
+	Enable       int    `form:"enable"`
 
 	Csrf string `form:"csrf"`
 }
@@ -41,13 +42,29 @@ func (l ProjectAccount) Validate() error {
 	)
 }
 
+func (l ProjectAccount) ValidateUpdate() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.Name, validation.Required.Error("姓名不能为空")),
+		validation.Field(&l.Company, validation.Required.Error("单位不能为空")),
+		validation.Field(&l.Position, validation.Required.Error("职位不能为空")),
+		//validation.Field(&l.Mobile, validation.Required.Error("手机不能为空"), validation.Match(regexp.MustCompile("^([1][3,4,5,6,7,8,9])\\d{9}$")).Error("只支持英文数字组合")),
+		validation.Field(&l.AccountGroup, validation.Required.Error("账号组不能为空")),
+	)
+}
+
+func (l ProjectAccount) ValidatePassword() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.Account, validation.Required.Error("账号不能为空"), validation.Match(regexp.MustCompile("^[A-Za-z0-9]+$")).Error("只支持英文数字组合")),
+		validation.Field(&l.Password, validation.Required.Error("密码不能为空"), validation.Match(regexp.MustCompile("^[a-zA-Z]\\w{5,17}$")).Error("密码支持英文数字及符号,6~18之间")),
+	)
+}
+
 //MoveId string `form:"moveId"`
 // LastLogin    int       `xorm:"comment('最后登录时间') INT(11)"`
 
 // EnterpriseId     int       `xorm:"comment('企业id') INT(11)"`
 // CreateTime   int       `xorm:"comment('创建时间') INT(11)"`
-// IsAdmin      int       `xorm:"comment('是否为管理员 1为管理员') TINYINT(1)"`
-// Enable       int       `xorm:"comment('是否启用 1为启用') TINYINT(1)"`
+
 // AuthMobile   string    `xorm:"comment('认证手机') VARCHAR(32)"`
 // Permission   string    `xorm:"comment('权限') TEXT"`
 // Cooperation  int       `xorm:"comment('协作') TINYINT(4)"`