vote功能开发随想

vote功能开发随想

开发中忽略的地方:

  1. unmarshal前没有检查数据是否符合模型

  2. 没有基于报名情况查看哪些项目能够修改

  3. 要用时间来判断投票状态

 

遇到的挑战:

  1. 一开始对开发时数据是如何传入、返回以及相关格式不了解

  2. 对数据的转化理解和掌握都有欠缺

  3. 不会拼接返回的数据

  4. 不了解各种检验机制:加密、权限检验等等

 

收获:

  1. 前端传入的数据类型一般为int和string两种,其余的需要unmarshal方法从string中转换。具体对应关系要在建立结构体时用"form:"""指定。数据从前端传入后直接用shouBind方法绑定(感觉十分方便)

    var form JWBVoteForm
    if err := c.ShouldBind(&form); err != nil {
       ...
    }
  2. 积累了unmarshal方法的操作经验,对其有了更深刻的理解。在使用marshal/unmarshal方法后需要对其返回的结果进行判断,如果转换有误需要报错。序列化和反序列化的数据交互都是[]类型(为了标准化)

    type Marshaler interface {
    MarshalJSON() ([]byte, error)
    }

    type Unmarshaler interface {
    UnmarshalJSON([]byte) error
    }

     

  3. 对投票机制有了更深入的理解:投票模板中存入的是多个cover:title键值对,需要查询时将他们提取出来转换为一个list,再对其进行遍历就能获取所有的信息。

  4. 查询单个选项的投票人数可以用sql语句直接完成——利用group,查询出来后存入相应的结构体就可以了。

    db.Model(&JWBVoteFormLog{}).Select(count(*) as count , choice as choice).Where("form_id = ? and del = 0",formIDINT).Group(choice).Find(&voteData)
  5. 用户投票时,选项对应的是一个int值,该值为模板中投票选项list的index值,后续只要将用户选项(int)和投票选项的index对应起来就能查到投票的title和cover。

  6. 活动起止时间入库时要注意时区的转换,数据入库时会参照数据库服务器时间,比北京时间慢8h,所以处理每天的统计量时需要对开始时间处理一下

    标准化时间格式

    cstlocGlobal *time.Location
    start, err := time.ParseInLocation("2006-01-02 15:04", start, cstlocaGlobal)
posted @ 2021-12-15 11:27  临卓  阅读(38)  评论(0编辑  收藏  举报