非前後端分離的springboot項目實現“通過鏈接直接跳轉指定頁面並彈出詳情Dialog”功能

1、需求場景

用戶可以在某模塊某條數據詳情界面上覆制此詳情的鏈接,並將此鏈接引入到wiki或其他文檔中,其他用戶閱讀文檔時,可通過此鏈接直接查看某模塊某條數據詳情。

2020第一篇,就把某模塊稱爲“新年模塊”吧~~😊

 

2、功能點

①詳情中新增“複製鏈接”功能,此鏈接中包含新年編號作爲標識。

②用戶在瀏覽器地址欄直接訪問詳情鏈接,系統自動彈出此鏈接對應的新年詳情Dialog。

 

3、整體思路

因爲左側菜單和右側頁面都是包含在index中,所以可以通過index頁面入手。在index頁面創建隱藏文本框,用來存放新年編號,根據新年編號是否爲空來判斷是否需要彈出詳情框。

 

4、觸發狀態以及實現方式

根據需求,結合實際場景,此功能的觸發狀態可分爲兩種:用戶已登錄狀態、用戶未登錄狀態。

4.1、用戶已登錄狀態

①Controller中新增與鏈接中請求地址匹配的接口,可通過Get請求直接調用。接口中通過重定向,將請求重定向至/index,重定向過程中通過RedirectAttributes傳遞新年編號參數,在/index中接收新年編號參數,並將其通過ModelMap傳遞給index頁面。(若不用重定向,頁面中地址欄的信息會變成我們粘貼進的鏈接,導致每次使用F5刷新,都會彈出新年詳情)


// 系統首頁

@GetMapping("/index")

public String index(ModelMap mmap)

{

    // 取身份信息

    SysUser user = ShiroUtils.getSysUser();

    // 根據用戶id取出菜單

    List<SysMenu> menus = menuService.selectMenusByUser(user);

    mmap.put("menus", menus);

    mmap.put("user", user);

    mmap.put("copyrightYear", Global.getCopyrightYear());

    mmap.put("demoEnabled", Global.isDemoEnabled());

    //將新年編號傳給頁面

    mmap.put("newyearnunmber",mmap.get("newyearnunmber"));

    return "index";

}



// 已登陸狀態直接通過鏈接訪問新年詳情

@GetMapping("/system/newyear/detail/link/{id}")

public String indexlink(@PathVariable("id") Long newyearnumber, RedirectAttributes model)

{

    model.addFlashAttribute("newyearnunmber",newyearnumber);

    return "redirect:/index";

}

②給頁面body添加onload事件,頁面加載完成後,通過判斷新年編號文本框是否有值來判斷是否彈出詳情框。

記得給body綁定onload事件





<input name="newyearnunmber" id="newyearnunmber" type="hidden" th:value="${newyearnunmber}">



//body加載成功後,若newyearnunmber不爲undefined則自動彈出新年詳情

function newyeardetail() {

    let val = $("#newyearnunmber").val();

    if (val != undefined && val != null & val != "") {

        var options = {

            title: "新年詳情",

            width: 800,

            height: ($(window).height() - 50),

            url: ctx + "/system/newyear/detail/"+val,

            skin: 'layui-layer-gray',

            btn: ['關閉'],

            yes: function (index, layero) {

                layer.close(index);

            }

        };

        $.modal.openOptions(options);

    }

    $("#newyearnunmber").val('');

}

4.2、用戶未登錄狀態

實現方式與用戶已登錄狀態的大致相同,唯一不同的是用戶未登錄時訪問鏈接,由於未登錄會被攔截,跳轉至登錄頁面,所以在登陸的時候需要記住原請求地址,並在登錄成功後訪問原去請求地址。

所以在登錄接口上要稍作修改:

①登錄接口添加參數,用於重定向時參數傳遞。

 

②登錄成功後,檢測是否有原請求,若有跳轉至原請求,若沒有則直接跳轉至index。

//直接重定向訪問項目,若直接返回index跳轉,瀏覽器地址欄中會帶着ticket等信息,導致界面無法刷新

//shiro在跳轉前有記錄跳轉前的頁面。前沒有認證的用戶請求需要認證的鏈接時,
//shiro在跳轉前會把跳轉過來的頁面鏈接保存到session的attribute中,
//key的值叫shiroSavedRequest,我們可以能過WebUtils類拿到

SavedRequest savedRequest = WebUtils.getSavedRequest(request);

//若savedRequest != null則證明在訪問某請求時檢測到未登錄,而跳轉到登錄界面,登陸後需訪問原請求地址

if(savedRequest != null){

     String requestUrl = savedRequest.getRequestUrl();

     if(requestUrl.contains("/system/newyear/detail/link")){

          String[] split = requestUrl.split("/");

          //將newyearnunmber傳遞給下一個請求

          model.addFlashAttribute("newyearnunmber",split[split.length-1]);

          return "redirect:index";

       }

 }

4.3、“複製鏈接”功能

複製功能是通過document.execCommand("Copy")來實現的,但是隻針對非hidden的input和textarea。而我不想把鏈接展示在界面上,所以通過追加非hidden的input又給移除的方式實現的。

<p style="text-align: right"><a οnclick="copyUrl()">點擊複製此詳情鏈接</a></p>
 
function copyUrl() {
            var oInput = document.createElement('input');
            //協議+域名+請求地址+參數
            oInput.value = window.location.protocol+"//"+window.location.host+"/PMDHitchManager/system/hitch/detail/link/"+$("#hitchNumber").val();
            $(oInput).css({opacity:'0'});
            $(oInput).attr({name:"temp_link_input"});
            document.body.appendChild(oInput);
            oInput.select(); // 選擇對象
            document.execCommand("Copy"); // 執行瀏覽器複製命令
            oInput.className = 'oInput';
            alert('複製成功');
            $("input[name='temp_link_input']").remove();
    }

 

發佈了100 篇原創文章 · 獲贊 25 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章