闲杂小记(四)

家庭共享api接口开发,广告后台完善和bug修改:


任务:

宝宝的关系列表 -- api/v1/baby/relation/list

  • 【模式】GET
  • 【HTTP HEADER】
    • Long BP-User-Id -- 用户id
  • 【URL Query参数】
    • String babyId -- 宝宝id。
    • Long offset -- 偏移量
    • int limit -- 获取个数
  • 【BODY JSON对应数据类型】无
  • 【返回JSON对应数据类型】WaterFallPage->UserBabyRelation

退出家庭共享 -- api/v1/baby/relation/quit/{babyId}

  • 【模式】DELETE
  • 【HTTP HEADER】
    • Long BP-User-Id -- 用户id
  • 【URL Query参数】无
  • 【BODY JSON对应数据类型】无
  • 【返回JSON对应数据类型】GeneralResponseData

邀请家人 -- api/v1/baby/relation/doAdd

  • 【模式】POST
  • 【HTTP HEADER】
    • Long BP-User-Id -- 用户id
  • 【URL Query参数】无
  • 【BODY JSON对应数据类型】
    • AddRelativeParam params -- 邀请家人信息。
  • 【返回JSON对应数据类型】GeneralResponseData

管理员取消家庭共享 -- api/v1/baby/relation/cancel/{babyId}

  • 【模式】DELETE
  • 【HTTP HEADER】
    • Long BP-User-Id -- 用户id
  • 【URL Query参数】
    • Long targetUid -- 被取消家庭共享的用户id
  • 【BODY JSON对应数据类型】无
  • 【返回JSON对应数据类型】GeneralResponseData

收获:

1:程序中多处用到的表达式最好设个变量,这样即使修改也比较简单且不会出错

int pageMax = limit + 1;
2:

//            List<UserBabyRelation> tempList=null; TODO: 16/8/5
//            List<UserBabyRelation> linealRelationList=null;
改为:

List<UserBabyRelation> tempList = null;
使用多个list但知识作为中转载体的时候,应该考虑使用一个temp集合,通过temp指向不同地址来达到中转载体的效果,这样可以节省内存

3:

if(null !=relationList && !relationList.isEmpty())
改为

if (!CollectionUtils.isEmpty(relationList))
常使用下面apache的这个

4:通过逻辑整理,把能抽取出来的代码尽量抽取出来,提高代码的简洁性

/**
 * 判断是否为管理员
 */
boolean isAdmin = ubrMapper.getIsAdmin(userID, babyId);
List<UserBabyRelationDTO> userBabyRelationDTOList = null;

/**
 * 管理员可以查看全部家人关系列表,非管理员只能查看已加入的家人关系列表
 */
Boolean onlyValid = null;
if (isAdmin == false) {  TODO: 16/8/4
    onlyValid = true; TODO: 16/8/5
}
 TODO: 16/8/4
/**
 *以offsize是否为null判断是否为第一次请求
 *      若为第一次请求时返回直系亲属列表(10个为准,不够用非直系填满)
 *      若为第二次请求则按原来标准即可
 */
int pageMax = limit + 1;
List<UserBabyRelation> relationList = new ArrayList<UserBabyRelation>(pageMax); TODO: 16/8/5
List<UserBabyRelation> tempList = null;
if (lastId == null) {
    //查出所有直系亲属
    tempList = ubrMapper.findLinealUserBabyRelationList(babyId, lastId, pageMax, onlyValid); TODO: 16/8/5
    if (!CollectionUtils.isEmpty(tempList)) { TODO: 16/8/5
        relationList.addAll(tempList);
    }
}
if (relationList.size() < pageMax) {
    //查出非直系亲属
    tempList = ubrMapper.findnNotLinealUserBabyRelationList(babyId, lastId, pageMax - relationList.size(), onlyValid);
}
if (!CollectionUtils.isEmpty(tempList)) { TODO: 16/8/5
    relationList.addAll(tempList);
}
5:一般只有两个值的变量使用boolean(Boolean值可以为null)类型,变量名is开头,有多个状态使用int(Integer值可以为null)类型

private Integer status; //状态  有三种:0 未发布,1 已删除,2 已发布

private boolean isEditable; //状态,是否可编辑
6:Google浏览器开发者工具使用

7:mysql数据库新认知

tinyint(1) 这里的1表示的是 最短显示一个字符。tinyint(2) 这里的2表示的是 最短显示两个字符,但这里光设置m是没有意义的,你还需要指定当数据少于长度m时用什么来填充,比如zerofill(表示有0填充)。设置tinyint(2) zerofill 你插入1时他会显示01。设置tinyint(4) zerofill 你插入1时他会显示0001。

8:两种分页方式:offsize和lastId

当按某个字段(id)倒叙的时候,在最上面有可能插入新数据时,使用offsize方式分页则会出现新插入的数据取不到,且会出现一个数据重复取出,比如:一组数据以id倒叙为6,5,4,3,2,1 此时offsize为3的话,第一次取出6,5,4 取完后插入一条id为7的数据,第二次取出的则是4,3,2 结果是7未被取出,且4重复啦;如果用lastId方式的话,第一次取完,lastId变成3,第二次取的时候仍然是3,2,1,结果是正确的。但一般正序排序的情况,还有不会出现取的时候发生新数据插入的时候offsize的使用还是不会出错的。

offiseze方案:

<select id="findBabyGrowInfoList" resultMap="BaseResultMap">
  SELECT
    <include refid="BaseColumnList" />
  FROM baby_grow_info bgi
  WHERE bgi.baby_id = #{babyId,jdbcType=VARCHAR}
  ORDER BY bgi.record_date DESC
  LIMIT
  <if test="offset != null and offset > 0">
    #{offset, jdbcType=BIGINT},
  </if>
  #{pageSize, jdbcType=INTEGER}
</select>
lastId方案:

<!--查询该宝宝相关的非直系家属(按id倒叙,后邀请的排在前面)-->
<select id="findnNotLinealUserBabyRelationList" resultMap="BaseResultMap">
    SELECT id,relationship,user_id
    FROM user_baby_relation
    WHERE baby_id = #{babyId,jdbcType=VARCHAR} AND is_lineal = false
    <if test="isValid != null">
        and is_valid= #{isValid, jdbcType=TINYINT}
    </if>
    <if test="lastId != null and lastId > 0">
        and id &lt; #{lastId, jdbcType=BIGINT}
    </if>
    ORDER BY id DESC
    LIMIT #{pageSize, jdbcType=INTEGER}
</select>
lastId方式分页实现原理:

public static <T extends CommonField> WaterFallPage<T> waterFallPageOrderById(List<T> list, int pageSize){
    return waterFallPageOrderById(list, pageSize, null);
}

/**
 * 生成WaterFallPage对象。nextOffset为最后一个元素的id。
 * @param list 对象列表。list需要冗余一个元素,用来判断是否为最后一页,该元素不会返回。
 * @param pageSize 每页获取的对象个数。
 * @param <T> 需要实现CommonField接口。
 * @return 瀑布流某页信息。
 */
public static <T extends CommonField> WaterFallPage<T> waterFallPageOrderById(List<T> list, int pageSize,
                                                                              Date requestTime){
    if(null == list || list.isEmpty()){
        return new WaterFallPage<T>(null, -1L, requestTime);
    }

    long nextOffset = -1L;

    int size = list.size();
    if(size > pageSize){
        nextOffset = list.get(size - 1 -1).getId();      //list最后一条,用来判断是否还有下一页。返回时需去掉。
        list = list.subList(0, size - 1);
    }
    return new WaterFallPage<T>(list, nextOffset, requestTime);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值