家居网购项目实现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)