// FindAll 支持多页翻看 func (TopicLogic) FindAll(ctx context.Context, paginator *Paginator, orderBy string, querystring string, args ...interface{}) []map[string]interface{} { objLog := GetLogger(ctx) topicInfos := make([]*model.TopicInfo, 0) session := MasterDB.Join("INNER", "topics_ex", "topics.tid=topics_ex.tid") if querystring != "" { session.Where(querystring, args...) } err := session.OrderBy(orderBy).Limit(paginator.PerPage(), paginator.Offset()).Find(&topicInfos) if err != nil { objLog.Errorln("TopicLogic FindAll error:", err) return nil } uidSet := set.New(set.NonThreadSafe) nidSet := set.New(set.NonThreadSafe) for _, topicInfo := range topicInfos { uidSet.Add(topicInfo.Uid) if topicInfo.Lastreplyuid != 0 { uidSet.Add(topicInfo.Lastreplyuid) } nidSet.Add(topicInfo.Nid) } usersMap := DefaultUser.FindUserInfos(ctx, set.IntSlice(uidSet)) // 获取节点信息 nodes := GetNodesName(set.IntSlice(nidSet)) data := make([]map[string]interface{}, len(topicInfos)) for i, topicInfo := range topicInfos { dest := make(map[string]interface{}) // 有人回复 if topicInfo.Lastreplyuid != 0 { if user, ok := usersMap[topicInfo.Lastreplyuid]; ok { dest["lastreplyusername"] = user.Username } } structs.FillMap(topicInfo.Topic, dest) structs.FillMap(topicInfo.TopicEx, dest) dest["user"] = usersMap[topicInfo.Uid] dest["node"] = nodes[topicInfo.Nid] data[i] = dest } return data }
// FindOne 某个wiki页面详细信息 func (WikiLogic) FindOne(ctx context.Context, uri string) *model.Wiki { objLog := GetLogger(ctx) wiki := &model.Wiki{} if _, err := MasterDB.Where("uri=?", uri).Get(wiki); err != nil { objLog.Errorln("wiki logic FindOne error:", err) return nil } if wiki.Id == 0 { return nil } uidSet := set.New(set.NonThreadSafe) uidSet.Add(wiki.Uid) if wiki.Cuid != "" { cuids := strings.Split(wiki.Cuid, ",") for _, cuid := range cuids { uidSet.Add(goutils.MustInt(cuid)) } } wiki.Users = DefaultUser.FindUserInfos(ctx, set.IntSlice(uidSet)) return wiki }
// FindBy 获取 wiki 列表(分页) func (WikiLogic) FindBy(ctx context.Context, limit int, lastIds ...int) []*model.Wiki { objLog := GetLogger(ctx) dbSession := MasterDB.OrderBy("id DESC") if len(lastIds) > 0 && lastIds[0] > 0 { dbSession.Where("id<?", lastIds[0]) } wikis := make([]*model.Wiki, 0) err := dbSession.Limit(limit).Find(&wikis) if err != nil { objLog.Errorln("WikiLogic FindBy Error:", err) return nil } uidSet := set.New(set.NonThreadSafe) for _, wiki := range wikis { uidSet.Add(wiki.Uid) } usersMap := DefaultUser.FindUserInfos(ctx, set.IntSlice(uidSet)) for _, wiki := range wikis { wiki.Users = map[int]*model.User{wiki.Uid: usersMap[wiki.Uid]} } return wikis }
// FindByCatid 获得某个分类的资源列表,分页 func (ResourceLogic) FindByCatid(ctx context.Context, paginator *Paginator, catid int) (resources []map[string]interface{}, total int64) { objLog := GetLogger(ctx) var ( count = paginator.PerPage() resourceInfos = make([]*model.ResourceInfo, 0) ) err := MasterDB.Join("INNER", "resource_ex", "resource.id=resource_ex.id").Where("catid=?", catid). Desc("resource.mtime").Limit(count, paginator.Offset()).Find(&resourceInfos) if err != nil { objLog.Errorln("ResourceLogic FindByCatid error:", err) return } total, err = MasterDB.Where("catid=?", catid).Count(new(model.Resource)) if err != nil { objLog.Errorln("ResourceLogic FindByCatid count error:", err) return } uidSet := set.New(set.NonThreadSafe) for _, resourceInfo := range resourceInfos { uidSet.Add(resourceInfo.Uid) } usersMap := DefaultUser.FindUserInfos(ctx, set.IntSlice(uidSet)) resources = make([]map[string]interface{}, len(resourceInfos)) for i, resourceInfo := range resourceInfos { dest := make(map[string]interface{}) structs.FillMap(resourceInfo.Resource, dest) structs.FillMap(resourceInfo.ResourceEx, dest) dest["user"] = usersMap[resourceInfo.Uid] // 链接的host if resourceInfo.Form == model.LinkForm { urlObj, err := url.Parse(resourceInfo.Url) if err == nil { dest["host"] = urlObj.Host } } else { dest["url"] = "/resources/" + strconv.Itoa(resourceInfo.Resource.Id) } resources[i] = dest } return }
// fillObjinfos 填充评论对应的主体信息 func (CommentLogic) fillObjinfos(comments []*model.Comment, cmtObj CommentObjecter) { if len(comments) == 0 { return } count := len(comments) commentMap := make(map[int][]*model.Comment, count) idSet := set.New(set.NonThreadSafe) for _, comment := range comments { if _, ok := commentMap[comment.Objid]; !ok { commentMap[comment.Objid] = make([]*model.Comment, 0, count) } commentMap[comment.Objid] = append(commentMap[comment.Objid], comment) idSet.Add(comment.Objid) } cmtObj.SetObjinfo(set.IntSlice(idSet), commentMap) }