家庭共享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 < #{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); }