家居網購項目實現03 8.功能07-後臺管理 顯示家居 8.1需求分析/圖解 給後臺管理提供獨立登錄頁面,管理員登錄地址不對外公開 管理員登錄成功後,顯示管理菜單頁面 管理員點擊家居管理,顯示所有家居信息 8.2思路分析 ps:實現管理員登錄功能,方案一是將管理員視為member,添加到member ...
家居網購項目實現03
8.功能07-後臺管理 顯示家居
8.1需求分析/圖解
![image-20221217170317222](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20221217170317222.png)
![image-20221217170426758](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20221217170426758.png)
- 給後臺管理提供獨立登錄頁面,管理員登錄地址不對外公開
- 管理員登錄成功後,顯示管理菜單頁面
- 管理員點擊家居管理,顯示所有家居信息
8.2思路分析
![](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/%E5%90%8E%E5%8F%B0%E6%98%BE%E7%A4%BA%E5%AE%B6%E5%B1%85%E6%A1%86%E6%9E%B6%E5%9B%BE.png)
ps:實現管理員登錄功能,方案一是將管理員視為member,添加到member表中,為了區別管理員和用戶的許可權,添加一個欄位即可;方案二是重新創建一張admin表,單獨存儲admin信息。
這裡採用方案二。
8.3代碼實現
8.3.1admin表和furn表
admin表:
-- 創建admin表
CREATE TABLE `admin`(
`id` INT PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(32) NOT NULL UNIQUE,
`password` VARCHAR(32) NOT NULL,
`email` VARCHAR(64)
)CHARSET utf8 ENGINE INNODB;
-- 插入測試數據
INSERT INTO admin (`username`,`password`,`email`)
VALUES('admin',MD5('admin'),'[email protected]');
SELECT * FROM admin;
furn表:
-- 設計家居表furn
-- 根據 需求-文檔-界面 設計欄位
-- 註意:id int(11), 11為顯示的寬度,配合零填充(zerofill)
-- int(2), 2表示的也是顯示寬度
-- 也就是說, int(11)和int(2)存儲的範圍是一樣的,兩者存放的數據範圍只和int相關
-- 例如,67890使用int(11)來存儲,顯示為 00000067890
-- 67890使用int(2)來存儲,顯示為 67890
-- 也就是說,當存儲的數據位數不夠時,使用0來填充剩下的寬度(零填充)
CREATE TABLE `furn`(
`id` INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, #id-使用無符號
`name` VARCHAR(64) NOT NULL, #家居名
`maker` VARCHAR(64) NOT NULL, #製造商
`price` DECIMAL(11,2) NOT NULL, #價格 建議用DECIMAL定點數
`sales` INT UNSIGNED NOT NULL, #銷量
`stock` INT UNSIGNED NOT NULL, #庫存
`img_path` VARCHAR(256) NOT NULL #存放圖片的路徑即可,不建議直接存放圖片到資料庫中
)CHARSET utf8 ENGINE INNODB;
-- 增加測試數據
INSERT INTO furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)
VALUES(NULL,'北歐風格小桌子','熊貓家居',180,666,7,'assets/images/product-image/6.jpg');
INSERT INTO furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)
VALUES(NULL,'簡約風格小椅子','熊貓家居',180,666,7,'assets/images/product-image/4.jpg');
INSERT INTO furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)
VALUES(NULL,'典雅風格小臺燈','螞蟻家居',180,666,7,'assets/images/product-image/14.jpg');
INSERT INTO furn(`id`,`name`,`maker`,`price`,`sales`,`stock`,`img_path`)
VALUES(NULL,'溫馨風格盆景架','螞蟻家居',180,666,7,'assets/images/product-image/16.jpg');
SELECT * FROM `furn`;
![image-20221217203226606](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20221217203226606.png)
8.3.2管理員登錄功能
管理員登錄功能實現參考:功能04-會員登錄
-
entity層增加Admin實體,進行admin表映射。
-
dao層增加AdminDAO介面,,由AdminDAOImpl實現該介面方法,同時AdminDAOImpl繼承BasicDAO,用於查詢資料庫中有無對應Admin用戶返回對應信息
-
utils包創建AdminDAOImplTest類並測試
-
Service層創建AdminService介面,AdminServiceImpl實現該介面
-
utils包中創建AdminServiceImplTest類並測試
-
web層創建AdminServlet並配置,該Servlet對接前端頁面。根據功能06-web層Servlet減肥中的方法,AdminServlet直接繼承BasicServlet,只需要在AdminServlet編寫業務代碼即可,不需要實現doPost方法。doPost由抽象父類BasicServlet使用反射+動態綁定回調
AdminServlet:
package com.li.furns.web; import com.li.furns.entity.Admin; import com.li.furns.service.AdminService; import com.li.furns.service.impl.AdminServiceImpl; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author 李 * @version 1.0 */ public class AdminServlet extends BasicServlet { private AdminService adminService = new AdminServiceImpl(); public void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //獲取用戶輸入的賬號密碼 String username = request.getParameter("username"); String password = request.getParameter("password"); //構建一個Admin對象 Admin admin = new Admin(null, username, password, null); if (adminService.login(admin) == null) { //登錄失敗,返回管理員登錄頁面並提示錯誤信息 request.setAttribute("errInfo", "登錄失敗,賬號信息有誤"); request.getRequestDispatcher("/views/manage/manage_login.jsp") .forward(request, response); } else { //登錄成功,跳轉到manage_menu.jsp request.getRequestDispatcher("/views/manage/manage_menu.jsp") .forward(request, response); } } }
-
修改前端頁面manage_login.jsp(登錄表單提交註意添加隱藏域)
8.3.3顯示家居功能
-
entity層增加Furn實體
這裡如果Furn實體的屬性名和對應表的欄位不一致,可以通過給查詢的欄位起別名的方法解決
-
dao層增加FurnDAO介面,由FurnDAOImpl實現該介面,同時繼承BasicDAO,用於查詢資料庫furn表中的所有信息
-
utils包創建FurnDAOImplTest類並測試
-
service層添加FurnService介面,由FurnServiceImpl實現該介面
-
utils包創建FurnServiceImplTest類並測試
-
web層創建FurnServlet並配置(配置的url為/manage/furnServlet,目的是為了之後使用過濾器可以更好地限制訪問許可權),該Servlet對接前端頁面。直接繼承BasicServlet,只需要在Servlet中編寫業務代碼即可。
package com.li.furns.web; import com.li.furns.entity.Furn; import com.li.furns.service.FurnService; import com.li.furns.service.impl.FurnServiceImpl; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.List; public class FurnServlet extends BasicServlet { private FurnService furnService = new FurnServiceImpl(); protected void list(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { List<Furn> furns = furnService.queryFurns(); //將furns集合放入到request域中 req.setAttribute("furns", furns); //請求轉發 req.getRequestDispatcher("/views/manage/furn_manage.jsp") .forward(req, resp); } }
-
在對接的前端頁面furn_manage.jsp,使用jstl將接收到的家居集合顯示出來
8.3.4整合管理員登錄和顯示家居功能
![image-20221217222810650](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20221217222810650.png)
上述兩個功能的流程為,管理員登錄後由AdminServlet請求轉發到manage_menu.jsp頁面,點擊頁面上的“家居管理”,FurnServlet請求轉發到furn_manage.jsp頁面,該頁面顯示所有家居信息。
8.4完成測試
![image-20221217194751739](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20221217194751739.png)
![image-20221217224154740](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20221217224154740.png)
![image-20221217224313664](https://liyuelian.oss-cn-shenzhen.aliyuncs.com/imgs/image-20221217224313664.png)