day04-功能实现03
家居网购项目实现03
8.功能07-后台管理 显示家居
8.1需求分析/图解


- 给后台管理提供独立登录页面,管理员登录地址不对外公开
- 管理员登录成功后,显示管理菜单页面
- 管理员点击家居管理,显示所有家居信息
8.2思路分析

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'),'admin@qq.com');
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`;

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整合管理员登录和显示家居功能

上述两个功能的流程为,管理员登录后由AdminServlet请求转发到manage_menu.jsp页面,点击页面上的“家居管理”,FurnServlet请求转发到furn_manage.jsp页面,该页面显示所有家居信息。
8.4完成测试



day04-功能实现03的更多相关文章
- day01-4-订座功能
满汉楼01-4 4.功能实现03 4.5订座功能 4.5.1功能说明 如果该餐桌处于已经预定或者就餐状态时,不能进行预定,并给出相应提示 4.5.2思路分析 根据显示界面,要考虑以下两种状态 检测餐桌 ...
- 老男孩Python全栈第2期+课件笔记【高清完整92天整套视频教程】
点击了解更多Python课程>>> 老男孩Python全栈第2期+课件笔记[高清完整92天整套视频教程] 课程目录 ├─day01-python 全栈开发-基础篇 │ 01 pyth ...
- 关于Spring的核心组件以及概念
1.什么是企业级应用 大型企业级应用的结构是非常复杂的,涉及外部资源非常多,事务密集,数据规模大,用户数量多,有较强的安全性考虑和较高的性能要求. 2.Spring概念理解 Spring是一个轻量 ...
- S2---深入.NET平台和C#编程的完美总结
1.NET简单解说 l 面向对象提升 OOP(Object Oriented Programming)面向对象编程 AOP:(Aspache Oriented Programming):面向切面编 ...
- MODBUS-RTU通讯协议简介
MODBUS-RTU通讯协议简介 什么是MODBUS? MODBUS 是MODICON公司最先倡导的一种软的通讯规约,经过大多数公司 的实际应用,逐渐被认可,成为一种标准的通讯规约,只要按照这种规 ...
- 软件工程(FZU2015)增补作业
说明 张老师为FZU软件工程2015班级添加了一次增补作业,总分10分,deadline是2016/01/01-2016/01/03 前11次正式作业和练习的迭代评分见:http://www.cnbl ...
- ThinkPHP项目CMS内容管理系统开发视频教程【20课】(3.02GB)
ThinkPHP背景介绍: ThinkPHP是一个免费开源的,快速.简单的面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业级应用开发而诞生的. ...
- Modbus通信协议详解
附:http://www.360doc.com/content/14/0214/13/15800361_352436989.shtml 一.Modbus 协议简介 Modbus 协议是应用于电子控制器 ...
- MM-科目自动分配
SAP系统篇 MM自动记账解析之基本概念(01) https://blog.csdn.net/qq_33641781/article/details/78027802 MM自动记账解析之功能实现(02 ...
- 软件工程(FZU2015) 增补作业
SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 说明 张老师为FZU软件工程2015班级添加了一次增补作业,总分10分,deadline是2016/01/01-2016/ ...
随机推荐
- js读取excel进行批量操作
推荐这款插件 http://oss.sheetjs.com/js-xls/ 具体用法大家查看api! <!DOCTYPE html> <html> <head> & ...
- Rdt2.1 和 Rdt2.2的详细解释
Rdt2.1 和 Rdt2.2的详细解释 目录 Rdt2.1 和 Rdt2.2的详细解释 这俩为啥会出现? 解决之道 Rdt 2.1 Rdt2.2 可靠数据传递中Rdt1.0, Rdt2.0, Rdt ...
- react.js 实现音乐播放、下一曲、以及删除歌曲(仅播放列表)
import React, { Component } from 'react'; export default class Music extends Component { construct ...
- JavaScript函数式编程之函子
函子(Functor) 函子是一个特殊的容器,通过一个普通对象来实现,该对象具有map方法,map方法可以运行一个函数对值进行处理(变形关系),容器包含值和值变形关系(这个变形关系就是函数).函数式编 ...
- python关于Django搭建简单博客项目(教程)
由于csdn各种django blog博文都有或多或少的bug,所以我决定自己写一篇,先附上教程,详解在另一篇博文里,为了便于大家复制粘贴,本文代码尽量不使用图片. 源代码及解析文章请在我的githu ...
- 22.通用视图GenericAPIView、属性和方法
generics.ListCreateAPIView #源码 class ListCreateAPIView(mixins.ListModelMixin, mixins.CreateModelMixi ...
- 3.httprunner-extract/.env/Testcase
参数关联-extract 场景:上一个接口的返回值,传给下一个接口当请求参数 extract:提取变量 $变量名 :引用变量 假设我们有如下场景 用户A登录之后,返回值返回用户UID,我们需要查询该用 ...
- 前端监控系列4 | SDK 体积与性能优化实践
背景 字节各类业务拥有众多用户群,作为字节前端性能监控 SDK,自身若存在性能问题,则会影响到数以亿计的真实用户的体验.所以此类 SDK 自身的性能在设计之初,就必须达到一个非常极致的水准. 与此同时 ...
- Python 嵌入式打包 (图文)
Python嵌入式打包过程 目录 Python嵌入式打包过程 下载嵌入式包 解压和配置 安装pip和其他依赖 启动项目 python嵌入式打包:将python环境与项目代码打包到同一个文件夹中,在其他 ...
- Istio(十一):向istio服务网格中引入虚拟机
目录 一.模块概览 二.系统环境 三.虚拟机负载 3.1 虚拟机负载 3.2 单网络架构 3.3 多网络架构 3.4 Istio 中如何表示虚拟机工作负载? 四.实战:向istio Mesh中引入虚拟 ...