models

package
v0.0.0-...-c9b56a8 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 9, 2021 License: MPL-2.0 Imports: 4 Imported by: 0

README

组队系统模型解释

组队流:【分别从招募者和寻募者的角度说明】

  • 招募者:进入首屏 => 选择新建招募 => 填写/完善 => 发布
  • 寻募者:进入首屏 => 浏览招募信息 => 与招募者交流 => 达成组队意向
Project

组队系统中的招募信息以项目Project为单位,在首屏中纵向展示的“招募信息卡片”与Project构成一一对应的关系,具体属性等信息详见 /pkg/team/models/project.go 中代码及相关注释

项目词条需要展示的信息:项目名称,标签(包括比赛标签和类别标签)【此处由于一个项目可以有多个比赛标签,因此有可能出现标签太多,卡片中预留区域装不下的情况,目前想到的解决方案:1. 添加合并算法,自动将如挑战杯等比赛合并为一个双创类比赛标签,此方案有可能出现难以合并的情况;2. 添加“展开效果”,此类情况下,卡片中标签数量可固定为2个,点击后可展开;3. 从缩略卡片中删去标签区域,原因是若是希望通过标签进行项目筛选的话,上方的筛选栏已具备类似功能,其次进入详情页后,同样可看到所有标签】

项目在首屏中展示顺序因素:基于double型变量优先度:Priority;该变量由:项目最后一次编辑时间、所勾选的隶属比赛(于对应比赛的开始时间挂钩)、由管理员设定的伸缩系数(基于此系数,可实现人为的操控特定项目获得更高的优先级;其余项目该值默认为1)、项目招募结束时间、项目所需人员与目前以达成意向人员的数目、等。(这里的“等”可继续补充)

类别Type:由于每个Project仅对应一个Type,且Type基本完全依附于Project,因此放在project.go 文件中。在已知Project的情况下,可直接通过属性TypeID直接对应到Type,Type与下方的Competition类似,当在任意地方点击类型标签后,会跳转至首屏,且筛选栏中类别项会自动变为所点击的标签对应的类别。此时筛选栏与项目卡片展示区域之间会增加一个特殊卡片介绍该类别。规定“类别介绍卡片”在“比赛介绍卡片”下方。【相比于比赛,类别可能并不是很需要被介绍】

Competition

因组队系统与比赛强关联, 且比赛模型本身结构较为简单,仅需词条式的信息展示与资料下载,并且根据实际情况,大多数比赛的报名等系统是由主办方自制且形式不一的,难以直接在系统中集成竞赛报名系统,因此不再将Competition分离,单独开发竞赛系统。具体属性等信息详见 /pkg/team/models/competition.go 中代码及相关注释

比赛与项目构成多对多映射关系,且需要有反向查询功能;

按照设计,当在任何地方点击代表某一个比赛的标签时,都会跳转至首屏,并且此时的首屏中“比赛/活动”条目已自动勾选,并且在“筛选选项栏”和“项目招募信息卡片展示区”中间会出现一个对应于比赛相关介绍的额外特殊选项卡。

Position

岗位逻辑:通过项目找到对应的Position => 通过Position找到对应的PositionTemplate => 通过PositionTemplate找到其他项目

岗位的名称是预置于系统中的,当招募者在创建招募条目的时候,仅可从预置的岗位名称中进行选择,但可以根据项目实际情况自拟岗位要求。岗位要求若未空则显示PositionTemplate中的默认描述

Comment

评论,位于每一个项目详情页的下方,可对项目留下评论,并可获得“点赞”,评论仅展示前5个,且可通过点击“更多评论”查看更多评论,评论根据点赞数与发布时间进行排序

Conversation

聊天,指进入某一项目详情页后,可点击“联系招募者”,以与招募者进行联系。产品设计上,要求只有双方在沟通并都点击了“达成合作意向”按钮后,才能算作合作成功

由于“寻募者”对于某一个项目的意向岗位与Conversation具有一对一的关系,因此将IntentionPositions属性直接加入Conversation模型,在使用逻辑上,要求使用者在点击“联系招募者”后,需要先勾选意向岗位后,才能与招募者进行联系沟通。【考虑后期可加入拉黑系统】

File

文件:由于文件系统具有一定的通用性,且具有独立作为一个系统的潜力,因此在组队系统中,仅以黑箱操作的形式,通过接口操纵封装好的文件系统。【由于目前文件系统还没有做,不清楚具体接口形式,故简化为保留名称与文件的下载链接Link】

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func CreateAwardByProjectIDandCompetitionID

func CreateAwardByProjectIDandCompetitionID(tx *gorm.DB, projectID int64, competitionName string,
	awardRanking string, proveImgURL string) (err error)

func CreateComment

func CreateComment(tx *gorm.DB, comment Comment) (err error)

func CreateCompetition

func CreateCompetition(tx *gorm.DB, competition Competition) error

创建比赛

func CreatePositionByProjectID

func CreatePositionByProjectID(tx *gorm.DB, projectID uint, name string,
	needPeople int64, describe string) (err error)

func CreatePositionTemplate

func CreatePositionTemplate(tx *gorm.DB, positionTemplate *PositionTemplate) (err error)

func CreateProject

func CreateProject(tx *gorm.DB, project Project) (projectID uint, err error)

创建项目

func CreateResumeBySenderIDAndPositionName

func CreateResumeBySenderIDAndPositionName(tx *gorm.DB, projectID int64, senderID int64, positionName string, content string) (err error)

func CreateType

func CreateType(tx *gorm.DB, typeNew Type) error

创建类型

func EditPositionByID

func EditPositionByID(tx *gorm.DB, positionID uint, needPeople int64, describe string) (err error)

func FindTypeIDByName

func FindTypeIDByName(tx *gorm.DB, typeName string) int64

func GetProjectNum

func GetProjectNum(tx *gorm.DB) int64

获取项目的个数

func UpdateAwardByProjectIDandCompetitionID

func UpdateAwardByProjectIDandCompetitionID(tx *gorm.DB, projectID int64, competitionID int64,
	awardRanking string, proveImgURL string) (err error)

func UpdateProjectByID

func UpdateProjectByID(tx *gorm.DB, projectID uint, key string, value string) (err error)

通过ID更新岗位

func UpdateResumeBySenderIAndPositionID

func UpdateResumeBySenderIAndPositionID(tx *gorm.DB, senderID int64, positionID int64, content string) (err error)

Types

type Comment

type Comment struct {
	gorm.Model

	//发送评论者的ID
	UserID int64
	//项目ID
	ProjectID int64
	//评论内容
	Content string
	//评论点赞数
	LinkNum int64
}

func FindCommentsByProjectID

func FindCommentsByProjectID(tx *gorm.DB, ProjectID int64) []Comment

type Competition

type Competition struct {
	gorm.Model
	//比赛名称;
	Name string `gorm:"unique"`
	//比赛介绍
	Description string
	//比赛图片, 一般为比赛的宣传海报;填写该图片的URL
	ImageURL string
	//比赛官网链接
	HomePageURL string
	//比赛时间,若有下一次比赛的具体时间,则更新为具体时间,否则为上一届的时间
	//这里用字符串而非time.Time的原因是比赛时间可能是较为复杂的多个时间点,如:提交立项申请书:6月10日~7月15日;初审答辩:7月中旬
	Time string
	//相关资料下载; 填写File的ID; 若有多个资料则用英文分号隔开
	//注意:由于无需通过文件查找有关比赛,因此不用定义反向引用
	Files []File
	//比赛下属项目,比赛与项目为多对多关系,可由此通过比赛进行项目的筛选
	Projects []*Project `gorm:"many2many:competition_projects"`
}

比赛Competition; 由管理员创建,使用者仅可从已有比赛中进行勾选

func FindAllCompetitions

func FindAllCompetitions(tx *gorm.DB) []Competition

查找所有比赛

func FindCompetitionByID

func FindCompetitionByID(tx *gorm.DB, competitionID int64) Competition

func FindCompetitionByName

func FindCompetitionByName(tx *gorm.DB, competitionName string) Competition

type CompetitionProject

type CompetitionProject struct {
	ProjectID     int64
	CompetitionID int64

	//奖项名次, 如一等奖就等于1,二等奖就等于2
	AwardRanking string
	//奖项证明链接
	ProveImgURL string
}

func FindCompetitionProjectByProjectID

func FindCompetitionProjectByProjectID(tx *gorm.DB, projectID int64) []CompetitionProject

func FindCompetitionProjectsByProjectID

func FindCompetitionProjectsByProjectID(tx *gorm.DB, projectID int64) []CompetitionProject

type Conversation

type Conversation struct {
	gorm.Model

	ProjectID int64
	//招募者ID
	RecruiterID int64
	//寻募者ID
	JobSeeker int64

	Messages []Message
	//意向岗位与聊天属于多对多关系,一个人可以有多个意向岗位,一个岗位可以有多个人有意愿
	IntentionPositions []*Position `gorm:"many2many:conversation_positions;"`
}

聊天逻辑:对于一个项目来说,每有一个“求募者”与“招募者”进行沟通,就会产生一个Conversation,每个Conversation对应若干个message 在Conversation模型中,加入IntentionPositions表示意向岗位

type File

type File struct {
	gorm.Model
	//一个项目对应多个文件,作为外键
	CompetitionID int64
	Name          string
	Link          string
}

资料,如下方的比赛资料等,文件下载系统与此系统独立,因此只需名称与下载链接

type Message

type Message struct {
	gorm.Model

	ConversationID int64

	//消息类型
	MessageType MessageType
	//消息内容,如果是文字消息,则为消息内容,若为图片消息则为图片地址URL
	Content string
}

一次Conversation的“元”,在前端以左右气泡的形式,以时间顺序排列

type MessageType

type MessageType = int
const (
	TextMessage  MessageType = 0
	ImageMessage MessageType = 1
)

约定如下:0-文字消息,1-图片消息,。。。

type Position

type Position struct {
	gorm.Model

	//岗位对应的项目ID,作为岗位-项目关系的foreignKey
	ProjectID int64

	//岗位介绍
	//岗位名称ID
	PositionTemplateID int64
	//岗位简介,若未空则显示对应PositionTemplate中的DefaultDescribe
	Describe string

	//目前该岗位已招募的人数(录用人数)
	NowPeople int64
	//需要招募的人数(需求人数)
	NeedPeople int64
	//对该岗位感兴趣的人数
	InterestPeople int64

	//对该岗位有兴趣的聊天
	Conversations []*Conversation `gorm:"many2many:conversation_positions;"`

	//该岗位的简历
	Resumes []Resume
}

岗位Position,即招募需求中,需要具有哪些方面能力的人才;举例:前端开发、后端开发、UI设计、UX设计等

func FindPositionByID

func FindPositionByID(tx *gorm.DB, positionID int64) Position

func FindPositionByProjectIDAndPositionName

func FindPositionByProjectIDAndPositionName(tx *gorm.DB, projectID int64, positionName string) Position

func FindPositionsByProjectID

func FindPositionsByProjectID(tx *gorm.DB, projectID int64) []Position

通过项目ID查找所有岗位ID

type PositionTemplate

type PositionTemplate struct {
	gorm.Model
	//岗位名称
	Name string
	//岗位对象,用于通过岗位名称查找相对应的岗位
	Positions []Position
	//默认岗位描述
	DefaultDescribe string
}

岗位模板,这里把岗位名称单拎出来是为了让岗位名称仅来自于从已有岗位名称中挑选,以方便首屏中依据岗位的筛选 附有默认的岗位描述,该内容可自定义,若用户未编写则未默认内容 同时Position未定死的原因是同一个岗位比如后端开发,在不同项目中的实际需求可能是不一样的

func FindAllPositionTemplates

func FindAllPositionTemplates(tx *gorm.DB) []PositionTemplate

获取所有岗位模板

func FindPositionTemplateByID

func FindPositionTemplateByID(tx *gorm.DB, positionTemplateID int64) PositionTemplate

通过项目ID查找所有岗位ID

func FindPositionTemplateByName

func FindPositionTemplateByName(tx *gorm.DB, positionTemplateName string) PositionTemplate

通过名称查找所有岗位模板

type Project

type Project struct {
	gorm.Model
	//是否可用,初始值为false,若项目已招募够需要的人数、或由招募者手动操作后,进入true状态;招募者可重新开启招募
	//解释:变量用途:1.用于展示优先度的计算;2.封存阶段仅可浏览、不可与招募者联系,可选择当招募再次开启时提醒
	IsAvailable bool `gorm:"default:true"`

	//创建者ID
	CreatorID int64

	//队员:项目与比赛为多对多关系,且比赛名次以项目为单位
	//获奖逻辑:
	//A项目获奖 - A项目关联比赛 - A项目在该比赛中名次;【项目创建者操作】
	//查看成员 - 获取成员关联项目 - 获取项目获奖情况;
	//查看项目 - 查看该项目的获奖情况
	//查看比赛 - 查看所有项目获奖情况;
	//查看competition_projects连接表 - 查看使用组队系统的所有项目的获奖情况
	Members []*models.User `gorm:"many2many:user_projects"`

	//比赛/活动:【在此系统中,比赛与活动视作一个类,下方将仅用“比赛”词代替“比赛/活动”】
	//注意此处功能设计上需要有:点击项目卡片上的比赛标签 => 进入带有设置了该比赛筛选的首屏
	Competitions []*Competition `gorm:"many2many:competition_projects"`

	//类别:
	//注意:此类别区别于”比赛“属性,其内容为:如:“校企合作”,“导师科研”,“学生自研”等
	//“比赛”为多选,”类别“为单选
	//类别ID,由于一个项目仅能对应一个类别,所以使用int64类型
	TypeID int64

	//项目介绍:
	//项目名称; 要求:不允许出现两个项目名称相同
	Name string `gorm:"unique"`
	//简短的文字介绍,用3~5句话讲清是做什么,用于首屏中卡片中简单介绍项目,以及详情页中的”简介“
	DescribeSimple string
	//详细的文字介绍,详细介绍项目是做什么,包括项目背景、目标、成果等等信息,用于详情页中的详细介绍项目
	DescribeDetail string
	//介绍链接URL,类似于微信”阅读原文“功能,如有交互式展示、图文消息等复杂形式的介绍,目前不做集成仅作跳转
	LinkURL string
	//项目招募结束时间,可作为首屏项目卡片排序的参照属性之一
	EndTime time.Time

	//项目需要的岗位,一对多关系
	Positions []Position
	//项目评论,一个项目可以有多个评论
	Comments []Comment

	//项目评论数
	CommentsNum int64 `gorm:"default:0"`
	//项目Star数
	StarNum int64 `gorm:"default:0"`
}

项目Project; 由招募者创建,并可进行二次编辑、选择封存、删除等

func FindAllProjects

func FindAllProjects(tx *gorm.DB) []Project

获取所有项目

func FindProjectByID

func FindProjectByID(tx *gorm.DB, projectID uint) Project

通过项目ID查找项目

func FindProjectByIDs

func FindProjectByIDs(tx *gorm.DB, projectID []int64) []Project

通过项目ID数组查找项目

type Resume

type Resume struct {
	gorm.Model

	PositionID int64

	PositionName string

	//投递简历者ID
	SenderID int64
	//简历内容
	Content string
}

简历

func FindResumesBySenderIAndProjectID

func FindResumesBySenderIAndProjectID(tx *gorm.DB, senderID int64, projectID int64) []Resume

type Type

type Type struct {
	gorm.Model
	//类别名称
	Name string
	//类别介绍
	Describe string
}

比赛类型,此类别区别于”比赛“属性,其内容为:如:“校企合作”,“导师科研”,“学生自研”等 + 讲座、沙龙

func FindAllTypes

func FindAllTypes(tx *gorm.DB) []Type

创建比赛

func FindTypeByID

func FindTypeByID(tx *gorm.DB, typeID int64) Type

通过ID查找类型

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL