问题:为什么要分组?如何实现?
–解答:分组可以使用户更好的管理自己的短链接
问题:gid是全局唯一的吗?如何保证?
–解答:gid是全局唯一的。设计方案为:首先使用Hutool的工具生成一个长度为6的随机字符串,然后会去数据库中查询是否已经存在该gid,如果存在则重新生成gid,这个过程会一直循环,直至生成的gid唯一。
问题:分组分表时以什么作为分片件?
–解答:我选择的是username,这样可以保证同一个用户创建的分组在同一个表中。
实现代码:有很多地方写的不是很优雅,有时间再改进
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
|
@Service public class GroupServiceImpl extends ServiceImpl<GroupMapper, GroupDO>implements GroupService { @Resource private GroupMapper groupMapper;
public Result createGroup(GroupReqDTO group){ GroupDO groupDO = new GroupDO(); String gid; while(true){ gid = RandomUtil.randomString(6); if(!getGroup(gid)){ break; } } groupDO.setGid(gid); groupDO.setName(group.getName()); groupDO.setSortOrder(0); groupDO.setUsername(UserContext.get().getUsername());
save(groupDO); return Results.success(); }
public Result deleteGroupByGid(String gid){ LambdaQueryWrapper<GroupDO> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(GroupDO::getGid,gid); int delete = groupMapper.delete(queryWrapper); if(delete > 1){ return Results.failure(); }
return Results.success(true); }
public Result updateGroup(String name,String gid){ LambdaUpdateWrapper<GroupDO> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(GroupDO::getGid,gid).set(GroupDO::getName,name); boolean isSuccess = update(updateWrapper); if(!isSuccess){ return Results.failure(); } LambdaQueryWrapper<GroupDO> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(GroupDO::getGid,gid); GroupDO groupDO = groupMapper.selectOne(queryWrapper); GroupRespDTO groupRespDTO = BeanUtil.copyProperties(groupDO, GroupRespDTO.class);
return Results.success(groupRespDTO); }
public Result sortGroup(List<GroupSortReqDTO>groups){ String username = ""; for(GroupSortReqDTO group : groups){ username = group.getUsername(); String gid = group.getGid(); Integer sortOrder = group.getSortOrder();
LambdaUpdateWrapper<GroupDO> updateWrapper = new LambdaUpdateWrapper<>(); updateWrapper.eq(GroupDO::getGid,gid).set(GroupDO::getSortOrder,sortOrder); update(updateWrapper); }
LambdaQueryWrapper<GroupDO> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(GroupDO::getUsername,username).orderByDesc(GroupDO::getSortOrder); List<GroupDO> groupDOS = groupMapper.selectList(queryWrapper);
List<GroupRespDTO>res = new ArrayList<>(); for(GroupDO g : groupDOS){ res.add(BeanUtil.copyProperties(g, GroupRespDTO.class)); }
return Results.success(res); }
public boolean getGroup(String gid){ LambdaQueryWrapper<GroupDO> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(GroupDO::getGid,gid); GroupDO groupDO = getOne(queryWrapper); if(groupDO == null)return false; return true; } }
|