day14-功能實現13

来源:https://www.cnblogs.com/liyuelian/archive/2023/01/03/17023158.html
-Advertisement-
Play Games

家居網購項目實現013 以下皆為部分代碼,詳見 https://github.com/liyuelian/furniture_mall.git 32.功能30-會員不能登錄後臺管理 32.1需求分析/圖解 管理員admin登錄後,可以訪問所有頁面 會員登錄後,不能訪問後臺管理相關頁面,其他頁面可以訪 ...


家居網購項目實現013

以下皆為部分代碼,詳見 https://github.com/liyuelian/furniture_mall.git

32.功能30-會員不能登錄後臺管理

32.1需求分析/圖解

  1. 管理員admin登錄後,可以訪問所有頁面
  2. 會員登錄後,不能訪問後臺管理相關頁面,其他頁面可以訪問
  3. 說明:假定管理員就是“admin”,其他皆為會員名

32.2思路分析

修改許可權驗證AutoFilter

添加邏輯:用戶已經登錄過了,但是用戶名不為admin且訪問的url中包含/manage/,就說明是非法用戶訪問後臺,將其轉發到首頁即可。

32.3代碼實現

AutoFilter:

image-20230103170852764
package com.li.furns.filter;

import com.google.gson.Gson;
import com.li.furns.entity.Member;
import com.li.furns.utils.WebUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;

/**
 * 這是用於許可權驗證的過濾器,對指定的url進行驗證
 * 如果登錄過,就放行;如果沒有登錄,就返回登錄頁面
 *
 * @author 李
 * @version 1.0
 */
public class AuthFilter implements Filter {
    //後面我們把要排除的url放入到excludedUrls中
    private List<String> excludedUrls;

    public void init(FilterConfig config) throws ServletException {
        //獲取到配置的excludedUrls
        String strExcludedUrls = config.getInitParameter("excludedUrls");
        //進行分割
        String[] splitUrl = strExcludedUrls.split(",");
        //將splitUrl轉成List,賦給excludedUrls
        excludedUrls = Arrays.asList(splitUrl);
        System.out.println("excludedUrls=>" + excludedUrls);
    }

    public void destroy() {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
        //許可權驗證
        HttpServletRequest req = (HttpServletRequest) request;
        //得到請求的url
        String url = req.getServletPath();

        //判斷是否要驗證
        if (!excludedUrls.contains(url)) {//如果url不在配置的規則中,就進行校驗
            //得到session中的member對象
            Member member = (Member) req.getSession().getAttribute("member");
            if (member == null) {//說明用戶沒有登錄過
                    ....
                    ....
                    ....
                }
                return;//返回
            } else {//否則說明用戶已經登錄過了
                if (!member.getUsername().equals("admin") && url.contains("/manage/")) {
                    //如果該用戶不是admin但請求的url屬於後臺管理,就將其轉發到首頁
                    req.getRequestDispatcher("/index.jsp").forward(request, response);
                    return;//返回
                }
            }
        }
        //否則就放行
        chain.doFilter(request, response);
    }
}

32.4完成測試

登錄普通用戶

image-20230103171258168

直接在地址欄訪問後臺資源,訪問失敗,頁面被轉發到首頁:

image-20230103171510136

33.功能31-解決圖片冗餘的問題

33.1需求分析/圖解

image-20230102214344799
  1. 家居圖片都放在一個文件夾,會越來越多,請嘗試在assets/images/product-image/目錄下 自動創建 年月日目錄,比如21001010,以天為單位來存放上傳圖片
  2. 當上傳新家居圖片,原來的圖片就沒有用了,應當刪除原來的家居圖片

33.2思路分析

  1. 創建年月日目錄按天存放圖片

    解決方案:在創建保存路徑時添加當天的時間即可

  2. 刪除原來的家居圖片

    解決方案:在保存新圖片的同時,在資料庫中獲取舊圖片的路徑,然後刪除舊圖片即可

33.3代碼實現

utils包WebUtils:

public static String getYearMonthDay() {
    //如何得到當前的日期
    LocalDateTime ldt = LocalDateTime.now();
    int year = ldt.getYear();
    int monthValue = ldt.getMonthValue();
    int dayOfMonth = ldt.getDayOfMonth();
    String yearMonthDay = "/" + year + "/" + monthValue + "/" + dayOfMonth;
    return yearMonthDay;
}

web層修改FurnServlet.update()方法

/**
     * 處理修改家居的請求
     *
     * @param req
     * @param resp
     * @throws ServletException
     * @throws IOException
     */
protected void update(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //....略
    
    File fileRealPathDirectory =
    new File(fileRealPath + WebUtils.getYearMonthDay());//構建帶有日期的目錄
    if (!fileRealPathDirectory.exists()) {//如果文件目錄不存在
    fileRealPathDirectory.mkdirs();//創建
    }
    
     //....略
    
    //獲取舊的家居文件圖片路徑
    String oldImgPath = furn.getImgPath();
    //獲取舊圖片的絕對路徑
    String oldImgRealPath = req.getServletContext().getRealPath(oldImgPath);
    //刪除記憶體中舊的圖片,防止圖片占用空間過大
    File file = new File(oldImgRealPath);
    if (file.exists()) {
        file.delete();//刪除舊圖片
    }

    //更新資料庫中家居的圖片路徑
    furn.setImgPath(WebUtils.FURN_IMG_DIRECTORY + WebUtils.getYearMonthDay() + "/" + name);
 
	//....略
        
}

33.4完成測試

登錄後臺管理,修改家居圖片:

image-20230103180817176

寫入新的家居信息,點擊修改:

image-20230103180929371

成功修改了信息:

image-20230103181130535

伺服器按照年月日的目錄存放圖片,並且將舊圖片刪除:

image-20230103181138959

34.功能32-完成分頁導航條

34.1需求分析/圖解

image-20230102215431968
  1. 如果總頁數<=5,就顯示全部頁數
  2. 如果總頁數>5,就按照如下規則顯示:
    • 如果 當前頁數 是前3頁,就顯示1-5頁
    • 如果 當前頁數 是後3頁,就顯示最後5頁
    • 如果 當前頁數 是中間頁,就顯示 當前頁的前2頁,當前頁,當前頁的後2頁 即可

34.2思路分析

34.3代碼實現

furn_manage.jsp(部分)

<ul>
    <%--如果當前頁大於1,就顯示上一頁--%>
    <c:if test="${requestScope.page.pageNo>1}">
        <li><a href="manage/furnServlet?action=page&pageNo=${requestScope.page.pageNo-1}">上頁</a></li>
    </c:if>
    <%--   顯示所有的分頁數
          先確定開始頁數 begin 第一頁
          再確定結束頁數 end 第page.TotalCount頁
    --%>
    <%--
    1. 如果總頁數<=5,就顯示全部頁數
    2. 如果總頁數>5,就按照如下規則顯示:
    - 如果 當前頁數 是前3頁,就顯示1-5頁
    - 如果 當前頁數 是後3頁,就顯示最後5頁
    - 如果 當前頁數 是中間頁,就顯示 當前頁的前2頁,當前頁,當前頁的後2頁 即可

    這裡的關鍵就是要根據不同的情況來初始化begin,end
    --%>
    <c:choose>
        <%--如果總頁數<=5,就顯示全部頁數--%>
        <c:when test="${requestScope.page.pageTotalCount <= 5}">
            <c:set var="begin" value="1"/>
            <c:set var="end" value="${requestScope.page.pageTotalCount}"/>
        </c:when>
        <%--如果總頁數>5,就按照如下規則顯示--%>
        <c:when test="${requestScope.page.pageTotalCount > 5}">
            <c:choose>
                <%--如果 當前頁數 是前3頁,就顯示1-5頁--%>
                <c:when test="${requestScope.page.pageNo <= 3}">
                    <c:set var="begin" value="1"/>
                    <c:set var="end" value="5"/>
                </c:when>
                <%--如果 當前頁數 是後3頁,就顯示最後5頁--%>
                <c:when test="${requestScope.page.pageNo > requestScope.page.pageTotalCount -3}">
                    <c:set var="begin" value="${requestScope.page.pageTotalCount - 4}"/>
                    <c:set var="end" value="${requestScope.page.pageTotalCount}"/>
                </c:when>
                <%--如果 當前頁數 是中間頁,就顯示 當前頁的前2頁,當前頁,當前頁的後2頁 即可--%>
                <c:otherwise>
                    <c:set var="begin" value="${requestScope.page.pageNo - 2}"/>
                    <c:set var="end" value="${requestScope.page.pageNo + 2}"/>
                </c:otherwise>
            </c:choose>
        </c:when>
    </c:choose>

    <c:forEach begin="${begin}" end="${end}" var="i">
        <%--如果i為當前頁,就使用class=active來修飾--%>
        <c:if test="${i==requestScope.page.pageNo}">
            <li><a class="active" href="manage/furnServlet?action=page&pageNo=${i}">${i}</a></li>
        </c:if>
        <c:if test="${i!=requestScope.page.pageNo}">
            <li><a href="manage/furnServlet?action=page&pageNo=${i}">${i}</a></li>
        </c:if>
    </c:forEach>
    <%--  --%>
    <%--    如果當前頁小於總頁數,就往下一頁--%>
    <c:if test="${requestScope.page.pageNo < requestScope.page.pageTotalCount}">
        <li><a href="manage/furnServlet?action=page&pageNo=${requestScope.page.pageNo+1}">下頁</a></li>
    </c:if>
    <li><a>共${requestScope.page.pageTotalCount}頁</a></li>
    <li><a>共${requestScope.page.totalRow}記錄</a></li>
</ul>

index.jsp同理

34.4完成測試

image-20230103190456014 image-20230103190449129
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 時光飛逝,流年似水,讓我們倒帶 2022,迴首這跌宕起伏一年走過的 “升級之路”。 NutUI 表現如何? 成績單等著您打分! ...
  • 最近群里有這樣一個有意思的問題,大家在討論,使用 CSS 3D 能否實現如下所示的效果: 這裡的核心難點在於,如何利用 CSS 實現一個立體的數字?CSS 能做到嗎? 不是特別好實現,但是,如果僅僅只是在一定角度內,利用視覺障眼法,我們還是可以比較完美的還原上述效果的。 利用距離、角度及光影構建不一 ...
  • 在軟體研發過程中,往往隨著為了快速滿足業務要求的壓力,用戶需求的變更,軟體代碼的增多,以及版本的迭代,團隊成員的變化等等因素,導致一個軟體項目隨著時間推移,欠的技術債會越積越多,用戶使用容易出錯,部署流程也變得複雜。 ...
  • 摘要:究竟什麼樣的系統算是高併發系統?今天,我們就一起解密高併發業務場景下典型的秒殺系統的架構。 本文分享自華為雲社區《【高併發】秒殺系統架構解密,不是所有的秒殺都是秒殺(升級版)!!》,作者: 冰 河。 究竟什麼樣的系統算是高併發系統?今天,我們就一起解密高併發業務場景下典型的秒殺系統的架構。 電 ...
  • 流程式控制制 用戶交互Scanner Scanner類可以實現電腦與人的交互。java.util.Scanner 是 Java5 的新特征,我們可以通過 Scanner 類來獲取用戶的輸入。 Scanner 類的 next() 與 nextLine() 方法獲取輸入的字元串,在讀取前我們一般需要 使用 ...
  • 同步和非同步 同步和非同步是指程式的執行方式。在同步執行中,程式會按順序一個接一個地執行任務,直到當前任務完成。而在非同步執行中,程式會在等待當前任務完成的同時,執行其他任務。 同步執行意味著程式會阻塞,等待任務完成,而非同步執行則意味著程式不會阻塞,可以同時執行多個任務。 同步和非同步的選擇取決於你的程式需 ...
  • 摘要 本文主要講述了一個 http request 請求從發出到收到 response 的整個生命周期,希望可以通過對整個流程的一個描述來梳理清楚五層網路協議的定義以及各層之間是如何協作的。 使用Golang發起一個HTTP請求 對於後端來說通過 http 請求來進行遠程調用是再尋常不過的事了,以 ...
  • 1. 拷貝和拷貝構造函數 拷貝和複製是一個意思,對應的英文單詞都是copy。對於電腦來說,拷貝是指用一份原有的、已經存在的數據創建出一份新的數據,最終的結果是多了一份相同的數據。例如,將 Word 文檔拷貝到U盤去複印店列印,將 D 盤的圖片拷貝到桌面以方便瀏覽,將重要的文件上傳到百度網盤以防止丟 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...