• 短链接网站系统设计与实践


    简介

    本短链接网站系统,短链接指将长链接网址转换固定长度的短链接
    短链接http://8.134.130.51:9999/material_short_link/7bEvim

    一、技术

    前端:Vue2、element-ui
    后端:Spring boot 、Mybatis-plus、Jwt、Redis

    二、项目流程

    登录

    在这里插入图片描述

    public Map<String,Object> authLogin(String account, String password) {
            SysUser sysUser = userService.getOne(Wrappers.lambdaQuery(SysUser.class)
                    .eq(SysUser::getAccount, account)
                    .eq(SysUser::getPassword, password));
            if (sysUser != null && sysUser.getStatus()) {
                Map<String,Object> map = new HashMap<>(2);
                String tokenFormat = StringUtils.format(RedisConstants.TOKEN_CATALOG, sysUser.getId());
                String menuFormat = StringUtils.format(RedisConstants.MENU_CATALOG, sysUser.getId());
                if (redisUtils.exists(tokenFormat) && redisUtils.exists(tokenFormat)) {
                    threadPoolTaskExecutor.execute(()->{
                        log.info("----------- Redis token 续命 -----------");
                        redisUtils.expire(tokenFormat,RedisConstants.TOKEN_OVERDUE_TIME);
                        redisUtils.expire(menuFormat,RedisConstants.TOKEN_OVERDUE_TIME);
                    });
                    String token = redisUtils.get(tokenFormat).toString();
                    List<SysMenu> menus = (List<SysMenu>) redisUtils.get(menuFormat);
                    map.put("token",token);
                    map.put("menu",menus);
                } else {
                    String token = TokenUtil.doGenerateToken(sysUser.getId().toString());
                    List<SysMenu> menus = sysMenuService.getMenuByUserId(sysUser.getId());
                    if (menus != null) {
                        threadPoolTaskExecutor.execute(()->{
                            log.info("----------- Redis token 存储 -----------");
                            redisUtils.set(tokenFormat,token ,RedisConstants.TOKEN_OVERDUE_TIME);
                            redisUtils.set(menuFormat,menus ,RedisConstants.TOKEN_OVERDUE_TIME);
                        });
                        map.put("token",token);
                        map.put("menu",menus);
                    }
                }
                return map;
            }
            return null;
        }
    
    • 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

    生成短连接

    在这里插入图片描述

    /**
         * 生成短连接接口
         * @param url URL
         * @return 短连接
         */
        @Override
        public String generateShortLink(String url) {
            lock.lock();
            try {
                if (url != null) {
                    String key = EncryptionLinkConstants.MD5_KEY;
                    String shortCode = ShortUrlUtils.genShortCode(url);
                    if (redisUtils.contain(shortCode)){
                        return this.baseMapper.selectOne(new LambdaQueryWrapper<ShortLinkInfo>().eq(ShortLinkInfo::getCode, shortCode)).getNewUrl();
                    }
                    String newUrl = baseProperties.getUrl()+shortCode;
                    ShortLinkInfo shortLinkInfo = new ShortLinkInfo();
                    // 雪花算法
                    shortLinkInfo.setId(SnowflakeIdWorkerUtils.getUUID()).
                            setOldUrl(url).setNewUrl(newUrl).setUrlKey(key).setCode(shortCode);
                    this.baseMapper.insert(shortLinkInfo);
                    redisUtils.put(shortCode);
                    return newUrl;
                }
            }catch (Exception e){
                log.error("生成URL数据异常:",e);
            } finally {
                lock.unlock();
            }
            return null;
        }
    
    • 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

    三、网站截图

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    四、演示地址

    地址:http://8.134.130.51:8086/#/
    账号: admin
    密码: 123456

    总结

    短链接的系统由本人开发,最近正在加急完善小功能,由于第一版功能简洁,在设计上可能不够完善,可能会出现些问题,欢迎大家在评论区留言指出,也可以提出问题和建议。

    开源地址

    地址:https://gitee.com/sdsdaasdad/material_cloud
    在这里插入图片描述
    网站设计参考文章:https://juejin.cn/post/7024055300449632269

  • 相关阅读:
    微信小程序开发实战-setData字段特别多时怎么办,试试动态遍历字段并提取赋值
    Hadoop MapReduce + Hadoop YARN
    【web自动化测试】
    Caldera(二)高级实战
    Kotlin基本语法
    【Springboot 入门培训】#14 WebJars 样式包BootStrap 5架构
    Windows及Centos系统升级curl
    工作≤4 年,小公司反复横跳,技术热情不足被当成纯资源、成长缓慢的人
    RL强化学习总结(四)——DQN算法
    美创科技获通信网络安全服务能力评定(应急响应一级)认证!
  • 原文地址:https://blog.csdn.net/qq_44697754/article/details/126692880