游戏思维开发社区问答系统的感受

2018-04-09 09:15:09 彬哥 Golang语言社区

社区订阅号:Golang语言社区
社区服务号:Golang技术社区
如有问题或建议,请公众号留言;社区Leaf实战服务器开发火热报名中

大家好,最近在开发社区的问答系统,公众账号文章由于志愿者相继有事情,近期就更新的比较少,请大家见谅。本篇给大家讲讲社区系统的部分功能说明,后面必然开源,。

问答系统 开发选型

作为一个项目或者一个产品,开始项目之前,我们都会做下来讨论下技术选型的事情,由于社区彬哥我主导社区的发展,而且社区系统开发人员就2人,所以技术上走简单的路线 选择前后端分离 如下:

前端:原生(js/html);由于功能不难,没有必要用框架;
后端:golang;
通信方式:长连接模拟短链接(由于考虑到社区系统一对一的实时在线交流而设计)
通信协议:自定义协议(传输方式json) 如下:

// --------------------------------------------------------------------------------
// 【发表评论】 C2S_WinXinPlayer_Comment_WT_Proto
// 用户提问
// 数据需要保存用户的绑定信息
type C2S_WinXinPlayer_Comment_WT struct {
   Protocol  uint32 // 主协议
   Protocol2 uint32 // 子协议
   WenTiID   string // 问答的ID
   OpenID    string // 提问者的openid
   PLOpenID  string // PLOpenID,评论问题的人的openid
   Data      string // 组合数据发过来--服务器只负责保存---评论的内容
   Type      string // 评论的类型--提问者选择的最佳的评论
}
// S2C_WinXinPlayer_Comment_WT_Proto
type S2C_WinXinPlayer_Comment_WT struct {
   Protocol  uint32 // 主协议
   Protocol2 uint32 // 子协议
   IS_Succ   bool   // 是否成功
}
// 数据更新操作的说明
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------
// 问答结构
type WenDaJG struct {
   Id      string
   OpenID  string
   Name    string
   Headurl string
   Data    string
   PicData string
   Coin    string
   State   string
   Time    string
}
// 【获取问答列表】 C2S_WinXinPlayer_GetList_WT_Proto
type C2S_WinXinPlayer_GetList_WT struct {
   Protocol  uint32 // 主协议
   Protocol2 uint32 // 子协议
   OpenID    string // 用户的唯一凭证
   PageNum   string // 第一次获取PageNum == ”0“  ; 后面的页面 PageNum == 每页的最小ID
}
// 服务器返回
// S2C_WinXinPlayer_GetList_WT_Proto
type S2C_WinXinPlayer_GetList_WT struct {
   Protocol  uint32              // 主协议
   Protocol2 uint32              // 子协议
   Data      map[string]*WenDaJG // 5个数据
}
// --------------------------------------------------------------------------------
// 【提问功能】 C2S_WinXinPlayer_TiWen_Proto
// 用户提问
// 数据需要保存用户的绑定信息
type C2S_WinXinPlayer_TiWen struct {
   Protocol  uint32 // 主协议
   Protocol2 uint32 // 子协议
   OpenID    string // 用户的唯一凭证
   Data      string // 组合数据发过来--服务器只负责保存
   PicData   string // 图片数据  base64数据;服务器存储
   Coin      string // 悬赏金币---由提问者自己选择多少,且大于1至少,最高100
}
// S2C_WinXinPlayer_TiWen_Proto
type S2C_WinXinPlayer_TiWen struct {
   Protocol  uint32 // 主协议
   Protocol2 uint32 // 子协议
   IS_Succ   bool   // 是否成功
}
// 数据更新操作的说明
// --------------------------------------------------------------------------------
// 【用户讲师申请】 C2S_WinXinPlayer_Apply_Teacher_Proto
// 用户讲师申请--普通用户申请为老师
// 需要提供社区资格(申请码)--微店购买价值1000元,目活动5折
type C2S_WinXinPlayer_Apply_Teacher struct {
   Protocol   uint32 // 主协议
   Protocol2  uint32 // 子协议
   OpenID     string // 申请人的微信的OpenID 数据--服务器判断用户的唯一
   Apply_Code string // 申请码  GM 系统生成
}
// S2C_WinXinPlayer_Apply_Teacher_Proto
type S2C_WinXinPlayer_Apply_Teacher struct {
   Protocol  uint32 // 主协议
   Protocol2 uint32 // 子协议
   Code      string // 1:表示邀请码已经使用,2:邀请码不存在,3:申请成功,4:已经申请中
}
//--------------------------------------------------------------------------------
// 【临时房间交流】 Room_AC_Broadcast_Proto
// 广播协议(针对房间内人员有效)--临时房间交流
type Room_AC_Broadcast struct {
   Protocol  uint32 // 主协议
   Protocol2 uint32 // 子协议
   RoomUID   string // 消息接收的房间UID
   Data      string // 组合数据--手机+服务器按照一定规则定制;同时包括解答问题结束
}
//--------------------------------------------------------------------------------
// 【广播协议】
// 更新所有客户端的老师的状态信息
type Teacher_State_Broadcast struct {
   Protocol  uint32 // 主协议
   Protocol2 uint32 // 子协议
   T_UID     string // 老师UID信息--服务器唯一ID
   T_State   string // t_1:表示空闲,t_2:忙碌,t_3:不在线,t_4:未知状态
}
//--------------------------------------------------------------------------------
// 【答题者选择---老师】 C2S_WinXinPlayer_Choose_T_Proto
//  手机请求
type C2S_WinXinPlayer_Choose_T struct {
   Protocol     uint32 // 主协议
   Protocol2    uint32 // 子协议
   T_PlayerUID  string // 提问者的UID
   T_TeacherUID string // 选择的讲师的UID信息
   T_Coin       string // 选择悬赏的金币的钱数 -----> 社区币;用户兑换活动费用等 1元=10个,用户答题使用;充值到数据
   T_Problem    string // 问题(问题描述)--->  暂时不支持  代码块提交;迭代版本中再优化
   T_IsPic      bool   // 是否有图片数据;  false:表示无; true :存在
   T_PicBase64  string // 图片base64数据;注:图片限制再90K传输;且只可以是1张
   T_IsZJ       bool   // 如果老师角色此题难度 超过提问者悬赏,当提问者设置可以追加后,老师可以点击付费增加
}
// 【答题者选择---老师】 S2C_WinXinPlayer_Choose_T_Proto
// 服务器返回
// 此协议同样需要广播给对应老师及提问者
type S2C_WinXinPlayer_Choose_T struct {
   Protocol     uint32                  // 主协议
   Protocol2    uint32                  // 子协议
   T_State      string                  // t_1:表示空闲,t_2:忙碌,t_3:不在线,t_4:未知状态  可以去除,但是为了校验可以保留(如果因为网络广播协议没有收到,以此标志位为准)
   TMP_RoomData map[string]*TEMP_RoomST // 服务器建立临时交流房间结构
}
//--------------------------------------------------------------------------------
// 用户在社区系统的结构数据
type WX_Player_Data struct {
   UID       string
   Name      string
   GroupType string // 用户组的权限,1:为问答者;2:为老师;3:为官方监督员(禁言用户权限,封号处理等)
   Lev       string // 用户的级别;包括老师星级
   Coin      string // 社区币;用户兑换活动费用等 1元=10个,用户答题使用;充值到数据
   Time      string // 注册时间
}
type WX_Player_DataDB struct {
   ID      string
   OpenID  string
   Name    string
   HeadUrl string
   XingJi  string
   Coin    string
   Type    string
   Time    string
}
// 【微信用户报名的协议】 S2C_Net_WinXin_OpenID_BaoMing_Proto
type S2C_Net_WinXin_OpenID_BaoMing struct {
   Protocol  uint32                       // 主协议
   Protocol2 uint32                       // 子协议
   Data      map[string]*WX_Player_DataDB // 微信用户绑定的系统的存储数据
}
// 【微信用户报名的协议】 C2S_Net_WinXin_OpenID_BaoMing_Proto
type C2S_Net_WinXin_OpenID_BaoMing struct {
   Protocol  uint32 // 主协议
   Protocol2 uint32 // 子协议
   Code      string // 微信授权的Code
}
//--------------------------------------------------------------------------------

部分研发截图:



最后,彬哥感谢所有的社区支持者;我会用我个人的想法给大家带来更多小工具等;我是闲不下来的人,也希望大家多多交流;相识于Golang,且行且珍惜;我同时也希望更多的人加入我们,期待您的加入。