当前位置: 首页 > news >正文

短链接day-06

http请求端口,当用户端需要请求一些有关短链接管理的接口时,我们不能让他直接请求写在8002里面的方法,而是需要用http请求到8001,做一个中台请求。

定义service:指向

http://127.0.0.1:8001
package com.nageoffer.shortlink.admin.remote.dto; import cn.hutool.http.HttpUtil; import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.TypeReference; import com.baomidou.mybatisplus.core.metadata.IPage; import com.nageoffer.shortlink.admin.convention.result.Result; import com.nageoffer.shortlink.admin.remote.dto.req.ShortLinkCreateReqDTO; import com.nageoffer.shortlink.admin.remote.dto.req.ShortLinkPageReqDTO; import com.nageoffer.shortlink.admin.remote.dto.resp.ShortLinkCreateRespDTO; import com.nageoffer.shortlink.admin.remote.dto.resp.ShortLinkPageRespDTO; import org.springframework.stereotype.Service; import java.util.HashMap; import java.util.Map; /** * 短链接中台远程调用服务 */ @Service public interface ShortLinkRemoteService { /** * 创建短链接 * @param shortLinkCreateReqDTO 创建短链接请求参数 * @return 创建响应 */ default Result<ShortLinkCreateRespDTO> createShortLink(ShortLinkCreateReqDTO shortLinkCreateReqDTO){ String post = HttpUtil.post("http://127.0.0.1:8001/api/short-link/v1/create", JSON.toJSONString(shortLinkCreateReqDTO)); return JSON.parseObject(post, new TypeReference<>(){}); }; /** * 分页查找短链接 * @param shortLinkPageReqDTO * @return */ default Result<IPage<ShortLinkPageRespDTO>> pageShortLink(ShortLinkPageReqDTO shortLinkPageReqDTO){ Map<String, Object> requestMap = new HashMap<>(); //第一步:创建查询条件 requestMap.put("gid", shortLinkPageReqDTO.getGid()); requestMap.put("current", shortLinkPageReqDTO.getCurrent()); requestMap.put("size", shortLinkPageReqDTO.getSize()); //第二步:http发送请求到中台,获取结果 String resultPageStr = HttpUtil.get("http://127.0.0.1:8001/api/short-link/v1/page", requestMap); //第三步:将结果转换成Result return JSON.parseObject(resultPageStr, new TypeReference<>(){}); } }

接着用controller调用即可。

然后还要设置yaml文件的url路径

url: jdbc:shardingsphere:classpath:shardingsphere-config-${database.env:dev}.yaml

在这里面增加了一个database.env:dev,意思是可以设置连接dev中的数据库地址和密码还是prod里的,默认是dev里的,如何配置:

统计分组下短链接总数接口:

@Override public List<ShortLinkCountQueryRespDTO> listGroupShortLinkCount(List<String> requestParam) { QueryWrapper<ShortLinkDO> queryWrapper = Wrappers.query(new ShortLinkDO()) .select("gid as gid, count(*) as shortLinkCount") .in("gid", requestParam) .eq("enable_status", 0) .groupBy("gid"); List<Map<String, Object>> shortLinkDOList = baseMapper.selectMaps(queryWrapper); return BeanUtil.copyToList(shortLinkDOList, ShortLinkCountQueryRespDTO.class); }

接着,将这个方法添加到之前的短链接分组集合查询中,增加数量显示。

@Override public List<ShortLinkGroupRespDTO> listGroups() { LambdaQueryWrapper<GroupDO> queryWrapper = Wrappers.lambdaQuery(GroupDO.class) .eq(GroupDO::getDelFlag, 0) .eq(GroupDO::getUsername, UserContext.getUsername()) .orderByDesc(GroupDO::getSortOrder, GroupDO::getUpdateTime); List<GroupDO> groupDOList = baseMapper.selectList(queryWrapper); //通过steam流获取每一个group的gid,然后用http请求拿到短链接数量 Result<List<ShortLinkCountQueryRespDTO>> listResult = shortLinkRemoteService .listGroupShortLinkCount(groupDOList.stream().map(GroupDO::getGid).toList()); List<ShortLinkGroupRespDTO> shortLinkGroupRespDTOList = BeanUtil.copyToList(groupDOList, ShortLinkGroupRespDTO.class); //遍历分组,把「短链接数量」填进去 shortLinkGroupRespDTOList.forEach(each -> { Optional<ShortLinkCountQueryRespDTO> first = listResult.getData().stream() //筛选出gid相同的 .filter(item -> Objects.equals(item.getGid(), each.getGid())) .findFirst(); first.ifPresent(item -> each.setShortLinkCount(first.get().getShortLinkCount())); }); return shortLinkGroupRespDTOList; }

在用户注册的方法里,也插入

userRegisterCachePenetrationBloomFilter.add(userRegisterReqDTO.getUsername()); UserInfoDTO UserInfoBuild = UserInfoDTO.builder() .username(userRegisterReqDTO.getUsername()) .build(); UserContext.setUser(UserInfoBuild); groupService.saveGroup("默认分组");

在注册的时候,将username存入线程中,使saveGroup能获取到username并创建默认分组

新增短链接

第一步:查询确认短链接是否存在

第二步:创建修改do

第三步:确认是否有修改gid,如果修改,则删除原来的,并更新一个新的分片路径指向新的短链接数据。

@Transactional(rollbackFor = Exception.class) @Override public void updateShortLink(ShortLinkUpdateReqDTO requestParam) { //第一步:查询确认是否存在短链接 LambdaQueryWrapper<ShortLinkDO> queryWrapper = Wrappers.lambdaQuery(ShortLinkDO.class) .eq(ShortLinkDO::getGid, requestParam.getGid()) .eq(ShortLinkDO::getFullShortUrl, requestParam.getFullShortUrl()) .eq(ShortLinkDO::getDelFlag, 0) .eq(ShortLinkDO::getEnableStatus, 0); ShortLinkDO hasShortLinkDO = baseMapper.selectOne(queryWrapper); if (hasShortLinkDO == null) { throw new ClientException("短链接记录不存在"); } //第二步:创建DO ShortLinkDO shortLinkDO = ShortLinkDO.builder() .domain(hasShortLinkDO.getDomain()) .shortUri(hasShortLinkDO.getShortUri()) .clickNum(hasShortLinkDO.getClickNum()) .favicon(hasShortLinkDO.getFavicon()) .createdType(hasShortLinkDO.getCreatedType()) .gid(requestParam.getGid()) .originUrl(requestParam.getOriginUrl()) .describe(requestParam.getDescribe()) .validDateType(requestParam.getValidDateType()) .validDate(requestParam.getValidDate()) .build(); //第三步:更新,确认分组一致,如果gid也修改了,则删掉原本的短链接,再生成新的短链接,实现分片 // TODO: 这里需要新建一个原始短链接用于查询,新增短链接用于修改短链接。 if (Objects.equals(hasShortLinkDO.getGid(), requestParam.getGid())) { LambdaUpdateWrapper<ShortLinkDO> updateWrapper = Wrappers.lambdaUpdate(ShortLinkDO.class) .eq(ShortLinkDO::getFullShortUrl, requestParam.getFullShortUrl()) .eq(ShortLinkDO::getGid, requestParam.getGid()) .eq(ShortLinkDO::getDelFlag, 0) .eq(ShortLinkDO::getEnableStatus, 0) .set(Objects.equals(requestParam.getValidDateType(), VailDateTypeEnum.PERMANENT.getType()), ShortLinkDO::getValidDate, null); baseMapper.update(shortLinkDO, updateWrapper); } else { LambdaUpdateWrapper<ShortLinkDO> updateWrapper = Wrappers.lambdaUpdate(ShortLinkDO.class) .eq(ShortLinkDO::getFullShortUrl, requestParam.getFullShortUrl()) .eq(ShortLinkDO::getGid, hasShortLinkDO.getGid()) .eq(ShortLinkDO::getDelFlag, 0) .eq(ShortLinkDO::getEnableStatus, 0); baseMapper.delete(updateWrapper); baseMapper.insert(shortLinkDO); } }

之后,在admin层用http请求写入修改的路径和方法。

http://www.jsqmd.com/news/604100/

相关文章:

  • 2026 RAG 全景落地教程(非常详细),从大模型基座到 Agent 记忆从入门到精通,收藏这一篇就够了!
  • 书匠策AI:解锁期刊论文“通关秘籍”,让学术写作像“搭积木”一样简单!
  • 实战解析:如何绕过exit()死亡函数实现PHP文件写入(附完整Payload)
  • Vivado硬件调试避坑指南:为什么你的ILA信号总被优化?(附解决方案)
  • 别再手写MCP适配层了!2024最新Python企业模板已内置SPI扩展点、链路追踪埋点与熔断降级策略
  • 编写程序实现瑜伽垫体位标记,精准定位,输出:家用瑜伽辅助,不用教练也标准。
  • Golang GORM怎么做Scopes复用_Golang GORM Scopes教程【推荐】
  • 018篇:选择器的秘密:为什么你的点击会失效?如何写出稳定的选择器
  • 【车载嵌入式C++算法优化黄金标准】:ISO 26262 ASIL-D合规下的零堆分配、确定性调度与L1/L2缓存亲和性调优全指南
  • 【深度】GPT-6 定档4月14日 × Claude 4小时攻破FreeBSD:CUDA转CANN迁移实战 + AI安全防御架构全解
  • Fluent仿真总发散?可能是Pressure Inlet的回流在捣鬼!手把手教你排查与修复
  • 阿里云千问大模型API申请避坑指南:从注册到调用的完整流程
  • AI赋能测试:让快马平台智能生成覆盖边界与异常的API测试套件
  • 网络安全学习笔记第一阶段之html网页基础
  • Python flask django大学生一体化服务系统 校园生活服务平台 选课 失物招领 自习室预约,实习系统y98ioc9x
  • 深入解析C语言位运算与操作符
  • 【实测】GitNexus实测:拖入GitHub链接秒出代码知识图谱,今天涨了857星
  • 告别论文 AI 痕迹 + 重复率双杀!Paperxie 四大功能硬核拆解,本科生闭眼冲
  • 告别龟速下载!用国内镜像5分钟搞定QT6在线安装(附命令行参数详解)
  • MCGS 基于PLC的风力发电控制系统 带解释的梯形图程序,接线图原理图图纸,io分配
  • 从零基础到上手:Trae AI编程编辑器新手入门实时预览网页文件
  • DDD 架构重构实践:AI Skills 如何赋能DDD设计与重构
  • 雀魂AI助手Akagi:革新麻将竞技的智能决策系统
  • RAG 不需要向量库?无向量检索新范式全攻略(非常硬核),大模型检索从入门到精通,收藏这一篇就够了!
  • OpenClaw+千问3.5-9B:个人日程智能管理系统
  • 效率提升:让快马ai为你生成鸿蒙pc版文件管理器的核心界面代码
  • 别再写runtime循环了!用constexpr生成LUT表的7步安全范式(含SPI驱动、FFT预计算、游戏状态机全场景代码模板)
  • 西门子S7_200PLC与MCGS组态在污水处理控制设计中的应用
  • 破局双检!Paperxie 四大核心:毕业论文降重 + 降 AIGC 双效突围,改写学术合规新生态
  • 嵌入式通信基础:同步、异步?全双工、半双工??