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


    简介

    本短链接网站系统,短链接指将长链接网址转换固定长度的短链接
    短链接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

  • 相关阅读:
    SSM - Springboot - MyBatis-Plus 全栈体系(十五)
    做销售,如何实现快速初筛客户?
    【k8s相关资源api操作】
    C++的类和对象(一)
    hiveSql 相互关注问题
    AWS香港Web3方案日,防御云安全实践案例受关注
    (切换多语言)elementUI +vue-i18n 的国际化设置及使用
    MATLAB环境下简单的基于双向长短时记忆网络的时间序列预测
    软件开发、网络空间安全、人工智能三个方向的就业和前景怎么样?哪个方向更值得学习?
    Java Stream 的使用
  • 原文地址:https://blog.csdn.net/qq_44697754/article/details/126692880