From 0f705f024934fd6bff20bb9d017e079f1bcc70ff Mon Sep 17 00:00:00 2001 From: lifei6671 Date: Mon, 12 Nov 2018 21:01:59 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=AE=9E=E7=8E=B0=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E5=9B=A2=E9=98=9F=E5=8A=A0=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conf/enumerate.go | 2 +- controllers/BookController.go | 63 +++++++++++++-- controllers/DocumentController.go | 7 +- controllers/ManagerController.go | 2 +- models/BookModel.go | 4 + models/BookResult.go | 44 +++++++---- models/Relationship.go | 3 + models/Team.go | 40 ++++++---- models/TeamMember.go | 35 +++++++-- models/TeamRelationship.go | 118 ++++++++++++++++++++--------- routers/filter.go | 8 +- views/book/team.tpl | 68 +++++++---------- views/manager/team_member_list.tpl | 8 +- 13 files changed, 278 insertions(+), 124 deletions(-) diff --git a/conf/enumerate.go b/conf/enumerate.go index 62850c6c..a0cca6f6 100644 --- a/conf/enumerate.go +++ b/conf/enumerate.go @@ -19,7 +19,7 @@ const CaptchaSessionName = "__captcha__" const RegexpEmail = "^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$" //允许用户名中出现点号 -const RegexpAccount = `^[a-zA-Z][a-zA-z0-9\.]{2,50}$` +const RegexpAccount = `^[a-zA-Z][a-zA-Z0-9\.]{2,50}$` // PageSize 默认分页条数. const PageSize = 10 diff --git a/controllers/BookController.go b/controllers/BookController.go index 8c94a101..69de0231 100644 --- a/controllers/BookController.go +++ b/controllers/BookController.go @@ -73,7 +73,9 @@ func (c *BookController) Dashboard() { if key == "" { c.Abort("404") } - + if c.Member == nil { + c.ShowErrorPage(500,"aaaa") + } book, err := models.NewBookResult().FindByIdentify(key, c.Member.MemberId) if err != nil { if err == models.ErrPermissionDenied { @@ -859,26 +861,69 @@ func (c *BookController) Team() { func (c *BookController) TeamAdd() { c.Prepare() - c.JsonResult(0, "OK") + teamId, _ := c.GetInt("teamId") + + book, err := c.IsPermission() + + if err != nil { + c.JsonResult(500, err.Error()) + } + + _, err = models.NewTeam().First(teamId, "team_id") + if err != nil { + if err == orm.ErrNoRows { + c.JsonResult(500, "团队不存在") + } + c.JsonResult(5002, err.Error()) + } + if _, err := models.NewTeamRelationship().FindByBookId(book.BookId, teamId); err == nil { + c.JsonResult(5003, "团队已加入当前项目") + } + teamRel := models.NewTeamRelationship() + teamRel.BookId = book.BookId + teamRel.TeamId = teamId + err = teamRel.Save() + if err != nil { + c.JsonResult(5004, "加入项目失败") + } + teamRel.Include() + + c.JsonResult(0, "OK", teamRel) } +//删除项目的团队. func (c *BookController) TeamDelete() { c.Prepare() + teamId, _ := c.GetInt("teamId") + + book, err := c.IsPermission() + + if err != nil { + c.JsonResult(500, err.Error()) + } + err = models.NewTeamRelationship().DeleteByBookId(book.BookId, teamId) + + if err != nil { + if err == orm.ErrNoRows { + c.JsonResult(500, "团队未加入项目") + } + c.JsonResult(500, err.Error()) + } c.JsonResult(0, "OK") } func (c *BookController) TeamSearch() { c.Prepare() - teamId, _ := c.GetInt("teamId") keyword := strings.TrimSpace(c.GetString("q")) - if teamId <= 0 { - c.JsonResult(500, "参数错误") - } + book, err := c.IsPermission() - searchResult, err := models.NewTeamRelationship().FindNotJoinBookByName(teamId, keyword, 10) + if err != nil { + c.JsonResult(500, err.Error()) + } + searchResult, err := models.NewTeamRelationship().FindNotJoinBookByBookIdentify(book.BookId, keyword, 10) if err != nil { c.JsonResult(500, err.Error()) @@ -890,6 +935,10 @@ func (c *BookController) TeamSearch() { func (c *BookController) IsPermission() (*models.BookResult, error) { identify := c.GetString("identify") + if identify == "" { + return nil, errors.New("参数错误") + } + book, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId) if err != nil { diff --git a/controllers/DocumentController.go b/controllers/DocumentController.go index ec8c2488..03a87eae 100644 --- a/controllers/DocumentController.go +++ b/controllers/DocumentController.go @@ -688,7 +688,7 @@ func (c *DocumentController) Content() { bookResult, err := models.NewBookResult().FindByIdentify(identify, c.Member.MemberId) if err != nil || bookResult.RoleId == conf.BookObserver { - beego.Error("FindByIdentify => ", err) + beego.Error("项目不存在或权限不足 -> ", err) c.JsonResult(6002, "项目不存在或权限不足") } @@ -885,7 +885,7 @@ func (c *DocumentController) Export() { c.Abort("200") } else if output == "pdf" || output == "epub" || output == "docx" || output == "mobi" { - if err := models.BackgroupConvert(c.CruSession.SessionID(), bookResult); err != nil && err != gopool.ErrHandlerIsExist { + if err := models.BackgroundConvert(c.CruSession.SessionID(), bookResult); err != nil && err != gopool.ErrHandlerIsExist { c.ShowErrorPage(500, "导出失败,请查看系统日志") } @@ -1319,6 +1319,9 @@ func isReadable(identify, token string, c *DocumentController) *models.BookResul bookResult.MemberId = rel.MemberId bookResult.RoleId = rel.RoleId bookResult.RelationshipId = rel.RelationshipId + } else { + //TODO 团队权限 + } } diff --git a/controllers/ManagerController.go b/controllers/ManagerController.go index d359b544..7469c89a 100644 --- a/controllers/ManagerController.go +++ b/controllers/ManagerController.go @@ -854,7 +854,7 @@ func (c *ManagerController) TeamDelete() { c.CheckJsonError(5001, err) - c.JsonResult(0, "") + c.JsonResult(0, "OK") } func (c *ManagerController) TeamMemberList() { diff --git a/models/BookModel.go b/models/BookModel.go index 80a99be3..4555a7a3 100644 --- a/models/BookModel.go +++ b/models/BookModel.go @@ -97,6 +97,10 @@ func (book *Book) TableNameWithPrefix() string { return conf.GetDatabasePrefix() + book.TableName() } +func (book *Book) QueryTable() orm.QuerySeter { + return orm.NewOrm().QueryTable(book.TableNameWithPrefix()) +} + func NewBook() *Book { return &Book{} } diff --git a/models/BookResult.go b/models/BookResult.go index 0460face..7c2048e2 100644 --- a/models/BookResult.go +++ b/models/BookResult.go @@ -55,6 +55,7 @@ type BookResult struct { HistoryCount int `json:"history_count"` RelationshipId int `json:"relationship_id"` + TeamRelationshipId int `json:"team_relationship_id"` RoleId conf.BookRole `json:"role_id"` RoleName string `json:"role_name"` Status int `json:"status"` @@ -71,8 +72,8 @@ func NewBookResult() *BookResult { return &BookResult{} } -func (b *BookResult) String() string { - ret, err := json.Marshal(*b) +func (m *BookResult) String() string { + ret, err := json.Marshal(*m) if err != nil { return "" @@ -87,23 +88,35 @@ func (m *BookResult) FindByIdentify(identify string, memberId int, cols ...strin } o := orm.NewOrm() - book := NewBook() + var book Book - err := o.QueryTable(book.TableNameWithPrefix()).Filter("identify", identify).One(book, cols...) + err := NewBook().QueryTable().Filter("identify", identify).One(&book) if err != nil { + beego.Error("获取项目失败 ->",err) return m, err } - relationship := NewRelationship() + var relationship Relationship + var teamMember *TeamMember - err = o.QueryTable(relationship.TableNameWithPrefix()).Filter("book_id", book.BookId).Filter("member_id", memberId).One(relationship) + err = NewRelationship().QueryTable().Filter("book_id", book.BookId).Filter("member_id", memberId).One(&relationship) if err != nil { - return m, err + if err == orm.ErrNoRows { + //未查到项目参与者 + teamMember,err = NewTeamMember().FindByBookIdAndMemberId(book.BookId,memberId) + if err != nil { + return m,err + } + err = nil + } else { + return m, err + } } var relationship2 Relationship + //查找项目创始人 err = o.QueryTable(relationship.TableNameWithPrefix()).Filter("book_id", book.BookId).Filter("role_id", 0).One(&relationship2) if err != nil { @@ -116,16 +129,21 @@ func (m *BookResult) FindByIdentify(identify string, memberId int, cols ...strin return m, err } - m = NewBookResult().ToBookResult(*book) + m.ToBookResult(book) + m.MemberId = memberId m.CreateName = member.Account + if member.RealName != "" { m.RealName = member.RealName } - m.MemberId = relationship.MemberId - m.RoleId = relationship.RoleId - m.RelationshipId = relationship.RelationshipId - + if teamMember != nil { + m.RoleId = teamMember.RoleId + m.TeamRelationshipId = teamMember.TeamMemberId + } else { + m.RoleId = relationship.RoleId + m.RelationshipId = relationship.RelationshipId + } if m.RoleId == conf.BookFounder { m.RoleName = "创始人" } else if m.RoleId == conf.BookAdmin { @@ -226,7 +244,7 @@ func (m *BookResult) ToBookResult(book Book) *BookResult { } //后台转换 -func BackgroupConvert(sessionId string, bookResult *BookResult) error { +func BackgroundConvert(sessionId string, bookResult *BookResult) error { if err := converter.CheckConvertCommand(); err != nil { beego.Error("检查转换程序失败 -> ", err) diff --git a/models/Relationship.go b/models/Relationship.go index d4f63eba..a7241963 100644 --- a/models/Relationship.go +++ b/models/Relationship.go @@ -35,6 +35,9 @@ func (u *Relationship) TableUnique() [][]string { } } +func (u *Relationship) QueryTable() orm.QuerySeter { + return orm.NewOrm().QueryTable(u.TableNameWithPrefix()) +} func NewRelationship() *Relationship { return &Relationship{} } diff --git a/models/Team.go b/models/Team.go index 57ed2814..0febd9f0 100644 --- a/models/Team.go +++ b/models/Team.go @@ -46,6 +46,11 @@ func (t *Team) First(id int, cols ...string) (*Team, error) { o := orm.NewOrm() err := o.QueryTable(t.TableNameWithPrefix()).Filter("team_id", id).One(t, cols...) + if err != nil { + beego.Error("查询团队失败 ->",id, err) + return nil,err + } + t.Include() return t, err } @@ -107,24 +112,31 @@ func (t *Team) FindToPager(pageIndex, pageSize int) (list []*Team, totalCount in } totalCount = int(c) - for i,item := range list { - if member,err := NewMember().Find(item.MemberId,"account","real_name"); err == nil { - if member.RealName != "" { - list[i].MemberName = member.RealName - } else { - list[i].MemberName = member.Account - } - } - if c,err := o.QueryTable(NewTeamRelationship().TableNameWithPrefix()).Filter("team_id", item.TeamId).Count(); err == nil { - list[i].BookCount = int(c) - } - if c,err := o.QueryTable(NewTeamMember().TableNameWithPrefix()).Filter("team_id", item.TeamId).Count(); err == nil { - list[i].MemberCount = int(c) - } + for _,item := range list { + item.Include() } return } +func (t *Team) Include() { + + o := orm.NewOrm() + + if member,err := NewMember().Find(t.MemberId,"account","real_name"); err == nil { + if member.RealName != "" { + t.MemberName = member.RealName + } else { + t.MemberName = member.Account + } + } + if c,err := o.QueryTable(NewTeamRelationship().TableNameWithPrefix()).Filter("team_id", t.TeamId).Count(); err == nil { + t.BookCount = int(c) + } + if c,err := o.QueryTable(NewTeamMember().TableNameWithPrefix()).Filter("team_id", t.TeamId).Count(); err == nil { + t.MemberCount = int(c) + } +} + //更新或添加一个团队. func (t *Team) Save(cols ... string) (err error) { if t.TeamName == "" { diff --git a/models/TeamMember.go b/models/TeamMember.go index c27b3a8e..a70cfc44 100644 --- a/models/TeamMember.go +++ b/models/TeamMember.go @@ -37,6 +37,10 @@ func (m *TeamMember) TableUnique() [][]string { return [][]string{{"team_id", "member_id"}} } +func (m *TeamMember) QueryTable() orm.QuerySeter { + return orm.NewOrm().QueryTable(m.TableNameWithPrefix()) +} + func NewTeamMember() *TeamMember { return &TeamMember{} } @@ -85,13 +89,13 @@ func (m *TeamMember) FindFirst(teamId, memberId int) (*TeamMember, error) { return nil, ErrInvalidParameter } o := orm.NewOrm() - err := o.QueryTable(m.TableNameWithPrefix()).Filter("team_id",teamId).Filter("member_id",memberId).One(m) + err := o.QueryTable(m.TableNameWithPrefix()).Filter("team_id", teamId).Filter("member_id", memberId).One(m) if err != nil { - beego.Error("查询团队用户失败 ->",err) - return nil,err + beego.Error("查询团队用户失败 ->", err) + return nil, err } - return m.Include(),nil + return m.Include(), nil } //更新或插入团队用户. @@ -114,7 +118,7 @@ func (m *TeamMember) Save(cols ...string) (err error) { } if m.TeamMemberId <= 0 { - if o.QueryTable(m.TableNameWithPrefix()).Filter("team_id",m.TeamId).Filter("member_id",m.MemberId).Exist() { + if o.QueryTable(m.TableNameWithPrefix()).Filter("team_id", m.TeamId).Filter("member_id", m.MemberId).Exist() { return errors.New("团队中已存在该用户") } _, err = o.Insert(m) @@ -229,3 +233,24 @@ limit ?;` return &result, err } + +func (m *TeamMember) FindByBookIdAndMemberId(bookId,memberId int) (*TeamMember, error) { + if bookId <= 0 || memberId <= 0 { + return nil,ErrInvalidParameter + } + //一个用户可能在多个团队中,且一个项目可能有多个团队参与。因此需要查询用户最大权限。 + sql := `select * +from md_team_member as team +where team.team_id in (select rel.team_id from md_team_relationship as rel where rel.book_id = ?) +and team.member_id = ? order by team.role_id asc limit 1;` + + o := orm.NewOrm() + + err := o.Raw(sql,bookId,memberId).QueryRow(m) + + if err != nil { + beego.Error("查询用户项目所在团队失败 ->bookId=",bookId," memberId=", memberId, err) + return nil,err + } + return m,nil +} diff --git a/models/TeamRelationship.go b/models/TeamRelationship.go index 1342472c..ffba768e 100644 --- a/models/TeamRelationship.go +++ b/models/TeamRelationship.go @@ -10,9 +10,11 @@ import ( type TeamRelationship struct { TeamRelationshipId int `orm:"column(team_relationship_id);pk;auto;unique;" json:"team_relationship_id"` - BookId int `orm:"column(book_id)"` - TeamId int `orm:"column(team_id)"` + BookId int `orm:"column(book_id)" json:"book_id"` + TeamId int `orm:"column(team_id)" json:"team_id"` CreateTime time.Time `orm:"column(create_time);type(datetime);auto_now_add" json:"create_time"` + TeamName string `orm:"-" json:"team_name"` + MemberCount int `orm:"-" json:"member_count"` BookMemberId int `orm:"-" json:"book_member_id"` BookMemberName string `orm:"-" json:"book_member_name"` BookName string `orm:"-" json:"book_name"` @@ -43,6 +45,39 @@ func NewTeamRelationship() *TeamRelationship { return &TeamRelationship{} } +func (m *TeamRelationship) First(teamId int, cols ...string) (*TeamRelationship, error) { + if teamId <= 0 { + return nil, ErrInvalidParameter + } + err := m.QueryTable().Filter("team_id", teamId).One(m, cols...) + if err != nil { + beego.Error("查询项目团队失败 ->", err) + } + return m, err +} + +//查找指定项目的指定团队. +func (m *TeamRelationship) FindByBookId(bookId int, teamId int) (*TeamRelationship, error) { + if teamId <= 0 || bookId <= 0 { + return nil, ErrInvalidParameter + } + err := m.QueryTable().Filter("team_id", teamId).Filter("book_id", bookId).One(m) + if err != nil { + beego.Error("查询项目团队失败 ->", err) + } + return m, err +} + +//删除指定项目的指定团队. +func (m *TeamRelationship) DeleteByBookId(bookId int, teamId int) error { + err := m.QueryTable().Filter("team_id", teamId).Filter("book_id", bookId).One(m) + if err != nil { + beego.Error("查询项目团队失败 ->", err) + return err + } + return m.Delete(teamId) +} + //保存团队项目. func (m *TeamRelationship) Save(cols ...string) (err error) { if m.TeamId <= 0 || m.BookId <= 0 { @@ -125,10 +160,17 @@ func (m *TeamRelationship) Include() (*TeamRelationship, error) { } } } + if m.TeamId > 0{ + team ,err := NewTeam().First(m.TeamId) + if err == nil { + m.TeamName = team.TeamName + m.MemberCount = team.MemberCount + } + } return m, nil } -//查询未加入团队的用户。 +//查询未加入团队的项目. func (m *TeamRelationship) FindNotJoinBookByName(teamId int, bookName string, limit int) (*SelectMemberResult, error) { if teamId <= 0 { return nil, ErrInvalidParameter @@ -163,10 +205,45 @@ and book.book_name like ? order by book_id desc limit ?;` return &result, err } -//查询指定项目的团队. -func (m *TeamRelationship) FindByBookToPager(bookId, pageIndex,pageSize int) (list []*TeamRelationship,totalCount int,err error) { +//查找指定项目中未加入的团队. +func (m *TeamRelationship) FindNotJoinBookByBookIdentify(bookId int, teamName string, limit int) (*SelectMemberResult, error) { + if bookId <= 0 || teamName == "" { + return nil, ErrInvalidParameter + } - if bookId <= 0{ + o := orm.NewOrm() + sql := `select * +from md_teams as team +where team.team_id not in (select rel.team_id from md_team_relationship as rel where rel.book_id = ?) +and team.team_name like ? +order by team.team_id desc limit ?;` + teams := make([]*Team, 0) + + _, err := o.Raw(sql, bookId, "%"+teamName+"%", limit).QueryRows(&teams) + + if err != nil { + beego.Error("查询团队项目时出错 ->", err) + return nil, err + } + + result := SelectMemberResult{} + items := make([]KeyValueItem, 0) + + for _, team := range teams { + item := KeyValueItem{} + item.Id = team.TeamId + item.Text = team.TeamName + items = append(items, item) + } + result.Result = items + + return &result, err +} + +//查询指定项目的团队. +func (m *TeamRelationship) FindByBookToPager(bookId, pageIndex, pageSize int) (list []*TeamRelationship, totalCount int, err error) { + + if bookId <= 0 { err = ErrInvalidParameter return } @@ -193,32 +270,3 @@ func (m *TeamRelationship) FindByBookToPager(bookId, pageIndex,pageSize int) (li } return } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/routers/filter.go b/routers/filter.go index a4eb1134..04062a00 100644 --- a/routers/filter.go +++ b/routers/filter.go @@ -45,9 +45,11 @@ func init() { var StartRouter = func(ctx *context.Context) { sessionId := ctx.Input.Cookie(beego.AppConfig.String("sessionname")) - //sessionId必须是数字字母组成,且最小32个字符,最大1024字符 - if ok, err := regexp.MatchString(`^[a-zA-z0-9]{32,1024}$`, sessionId); !ok || err != nil { - panic("401") + if sessionId != "" { + //sessionId必须是数字字母组成,且最小32个字符,最大1024字符 + if ok, err := regexp.MatchString(`^[a-zA-Z0-9]{32,512}$`, sessionId); !ok || err != nil { + panic("401") + } } } beego.InsertFilter("/*", beego.BeforeStatic, StartRouter, false) diff --git a/views/book/team.tpl b/views/book/team.tpl index f8f02d15..12217d74 100644 --- a/views/book/team.tpl +++ b/views/book/team.tpl @@ -27,11 +27,15 @@
@@ -41,7 +45,8 @@
团队管理 {{if eq .Member.Role 0}} - {{end}} @@ -57,8 +62,8 @@ 团队名称 - 成员数量 - 项目数量 + 成员数量 + 加入时间 操作 @@ -66,11 +71,8 @@ ${item.team_name} ${item.member_count} - ${item.book_count} + ${(new Date(item.create_time)).format("yyyy-MM-dd hh:mm:ss")} - 项目 - 成员 - @@ -90,8 +92,9 @@