/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.nageoffer.shortlink.project.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.UUID;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nageoffer.shortlink.project.common.convention.exception.ClientException;
import com.nageoffer.shortlink.project.common.convention.exception.ServiceException;
import com.nageoffer.shortlink.project.common.enums.VailDateTypeEnum;
import com.nageoffer.shortlink.project.config.GotoDomainWhiteListConfiguration;
import com.nageoffer.shortlink.project.dao.entity.ShortLinkDO;
import com.nageoffer.shortlink.project.dao.entity.ShortLinkGotoDO;
import com.nageoffer.shortlink.project.dao.mapper.ShortLinkGotoMapper;
import com.nageoffer.shortlink.project.dao.mapper.ShortLinkMapper;
import com.nageoffer.shortlink.project.dto.biz.ShortLinkStatsRecordDTO;
import com.nageoffer.shortlink.project.dto.req.ShortLinkBatchCreateReqDTO;
import com.nageoffer.shortlink.project.dto.req.ShortLinkCreateReqDTO;
import com.nageoffer.shortlink.project.dto.req.ShortLinkPageReqDTO;
import com.nageoffer.shortlink.project.dto.req.ShortLinkUpdateReqDTO;
import com.nageoffer.shortlink.project.dto.resp.ShortLinkBaseInfoRespDTO;
import com.nageoffer.shortlink.project.dto.resp.ShortLinkBatchCreateRespDTO;
import com.nageoffer.shortlink.project.dto.resp.ShortLinkCreateRespDTO;
import com.nageoffer.shortlink.project.dto.resp.ShortLinkGroupCountQueryRespDTO;
import com.nageoffer.shortlink.project.dto.resp.ShortLinkPageRespDTO;
import com.nageoffer.shortlink.project.mq.producer.ShortLinkStatsSaveProducer;
import com.nageoffer.shortlink.project.service.ShortLinkService;
import com.nageoffer.shortlink.project.toolkit.HashUtil;
import com.nageoffer.shortlink.project.toolkit.LinkUtil;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RLock;
import org.redisson.api.RReadWriteLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicReference;
import static com.nageoffer.shortlink.project.common.constant.RedisKeyConstant.GOTO_IS_NULL_SHORT_LINK_KEY;
import static com.nageoffer.shortlink.project.common.constant.RedisKeyConstant.GOTO_SHORT_LINK_KEY;
import static com.nageoffer.shortlink.project.common.constant.RedisKeyConstant.LOCK_GID_UPDATE_KEY;
import static com.nageoffer.shortlink.project.common.constant.RedisKeyConstant.LOCK_GOTO_SHORT_LINK_KEY;
import static com.nageoffer.shortlink.project.common.constant.RedisKeyConstant.SHORT_LINK_CREATE_LOCK_KEY;
import static com.nageoffer.shortlink.project.common.constant.RedisKeyConstant.SHORT_LINK_STATS_UIP_KEY;
import static com.nageoffer.shortlink.project.common.constant.RedisKeyConstant.SHORT_LINK_STATS_UV_KEY;
/**
* 短链接接口实现层
* 公众号:马丁玩编程,回复:加群,添加马哥微信(备注:link)获取项目资料
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class ShortLinkServiceImpl extends ServiceImpl<ShortLinkMapper, ShortLinkDO> implements ShortLinkService {
private final RBloomFilter<String> shortUriCreateCachePenetrationBloomFilter;
private final ShortLinkGotoMapper shortLinkGotoMapper;
private final StringRedisTemplate stringRedisTemplate;
private final RedissonClient redissonClient;
private final ShortLinkStatsSaveProducer shortLinkStatsSaveProducer;
private final GotoDomainWhiteListConfiguration gotoDomainWhiteListConfiguration;
@Value("${short-link.domain.default}")
private String createShortLinkDefaultDomain;
@Transactional(rollbackFor = Exception.class)
@Override
public ShortLinkCreateRespDTO createShortLink(ShortLinkCreateReqDTO requestParam) {
// 短链接接口的并发量有多少?如何测试?详情查看:https://nageoffer.com/shortlink/question
verificationWhitelist(requestParam.getOriginUrl());
String shortLinkSuffix = generateSuffix(requestParam);
String fullShortUrl = StrBuilder.create(createShortLinkDefaultDomain)
.append("/")
.append(shortLinkSuffix)
.toString();
ShortLinkDO shortLinkDO = ShortLinkDO.builder()
.domain(createShortLinkDefaultDomain)
.originUrl(requestParam.getOriginUrl())
.gid(requestParam.getGid())
.createdType(requestParam.getCreatedType())
.validDateType(requestParam.getValidDateType())
.validDate(requestParam.getValidDate())
.describe(requestParam.getDescribe())
.shortUri(shortLinkSuffix)
.enableStatus(0)
.totalPv(0)
.totalUv(0)
.totalUip(0)
.delTime(0L)
.fullShortUrl(fullShortUrl)
.favicon(getFavicon(requestParam.getOriginUrl()))
.build();
ShortLinkGotoDO linkGotoDO = ShortLinkGotoDO.builder()
.fullShortUrl(fullShortUrl)
.gid(requestParam.getGid())
.build();
try {
// 短链接项目有多少数据?如何解决海量数据存储?详情查看:https://nageoffer.com/shortlink/question
baseMapper.insert(shortLinkDO);
// 短链接数据库分片键是如何考虑的?详情查看:https://nageoffer.com/shortlink/question
shortLinkGotoMapper.insert(linkGotoDO);
} catch (DuplicateKeyException ex) {
// 首先判断是否存在布隆过滤器,如果不存在直接新增
if (!shortUriCreateCachePenetrationBloomFilter.contains(fullShortUrl)) {
shortUriCreateCachePenetrationBloomFilter.add(fullShortUrl);
没有合适的资源?快使用搜索试试~ 我知道了~
shortlink-推荐系统资源
共288个文件
java:186个
png:23个
vue:19个
0 下载量 173 浏览量
2024-07-01
12:43:10
上传
评论
收藏 1.71MB ZIP 举报
温馨提示
SaaS 12306
资源推荐
资源详情
资源评论
收起资源包目录
shortlink-推荐系统资源 (288个子文件)
.eslintrc.cjs 296B
mvnw.cmd 7KB
lombok.config 976B
base.css 2KB
main.css 551B
.env.development 150B
.gitignore 433B
.gitignore 302B
.gitignore 176B
notfound.html 2KB
index.html 357B
favicon.ico 3KB
ShortLinkServiceImpl.java 30KB
ShortLinkStatsServiceImpl.java 27KB
ShortLinkStatsSaveConsumer.java 11KB
LinkAccessLogsMapper.java 9KB
ShortLinkActualRemoteService.java 9KB
GroupServiceImpl.java 8KB
UserServiceImpl.java 8KB
LinkAccessStatsMapper.java 7KB
LinkUtil.java 6KB
RecycleBinServiceImpl.java 5KB
ShortLinkController.java 5KB
TokenValidateGatewayFilterFactory.java 5KB
UserController.java 4KB
RedisStreamConfiguration.java 4KB
GlobalExceptionHandler.java 4KB
DelayShortLinkStatsConsumer.java 4KB
ShortLinkStatsController.java 4KB
ShortLinkController.java 4KB
UserFlowRiskControlFilter.java 4KB
GlobalExceptionHandler.java 4KB
ShortLinkService.java 4KB
LinkLocaleStatsMapper.java 4KB
LinkBrowserStatsMapper.java 4KB
LinkNetworkStatsMapper.java 4KB
LinkDeviceStatsMapper.java 4KB
LinkOsStatsMapper.java 4KB
RecycleBinController.java 3KB
ShortLinkStatsController.java 3KB
GroupController.java 3KB
RecycleBinController.java 3KB
RecycleBinServiceImpl.java 3KB
ShortLinkDO.java 3KB
BaseErrorCode.java 3KB
MessageQueueIdempotentHandler.java 3KB
UserService.java 3KB
Results.java 3KB
Results.java 3KB
ShortLinkStatsService.java 3KB
BaseErrorCode.java 3KB
UserConfiguration.java 3KB
RedisKeyConstant.java 2KB
ShortLinkPageRespDTO.java 2KB
UserContext.java 2KB
UserContext.java 2KB
ShortLinkPageRespDTO.java 2KB
ShortLinkStatsRespDTO.java 2KB
ShortLinkStatsRespDTO.java 2KB
RecycleBinService.java 2KB
GroupService.java 2KB
RBloomFilterConfiguration.java 2KB
UserTransmitFilter.java 2KB
UserTransmitInterceptor.java 2KB
DelayShortLinkStatsProducer.java 2KB
UserTableShardingTest.java 2KB
EasyExcelWebUtil.java 2KB
ShortLinkMapper.java 2KB
HashUtil.java 2KB
ShortLinkStatsStreamInitializeTask.java 2KB
ServiceException.java 2KB
LinkStatsTodayMapper.java 2KB
ServiceException.java 2KB
ShortLinkStatsRecordDTO.java 2KB
ShortLinkStatsAccessRecordRespDTO.java 2KB
ShortLinkStatsAccessRecordRespDTO.java 2KB
LinkAccessLogsDO.java 2KB
ClientException.java 2KB
ClientException.java 2KB
UrlTitleServiceImpl.java 2KB
LinkLocaleStatsDO.java 2KB
LinkAccessStatsDO.java 2KB
ShortLinkCreateReqDTO.java 2KB
RandomGenerator.java 2KB
DataBaseConfiguration.java 2KB
SentinelRuleConfig.java 2KB
MyMetaObjectHandler.java 2KB
UrlTitleController.java 2KB
UrlTitleController.java 2KB
RemoteException.java 2KB
RemoteException.java 2KB
AbstractException.java 2KB
AbstractException.java 2KB
DataBaseConfiguration.java 2KB
UserConfiguration.java 2KB
ShortLinkBaseInfoRespDTO.java 2KB
LinkStatsTodayDO.java 2KB
ShortLinkBatchCreateReqDTO.java 2KB
ShortLinkCreateReqDTO.java 2KB
ShortLinkBatchCreateReqDTO.java 2KB
共 288 条
- 1
- 2
- 3
资源评论
lsx202406
- 粉丝: 1460
- 资源: 319
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功