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/ ...
随机推荐
- PAT (Basic Level) Practice 1018 锤子剪刀布 分数 20
大家应该都会玩"锤子剪刀布"的游戏:两人同时给出手势,胜负规则如图所示: 现给出两人的交锋记录,请统计双方的胜.平.负次数,并且给出双方分别出什么手势的胜算最大. 输入格式: 输入 ...
- numpy中的一些常用的关键字用法
1.np.full() 原型:numpy.full(shape, fill_value, dtype=None, order='C') eg: 2.np.flatten():该函数返回一个折叠成一维的 ...
- python中的多线程与多进程
线程概念: 线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包涵在进程之中,是进程中的实际运作单位. 线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其 ...
- SQL基础语句入门
SQL语句入门 起因 学校开设数据库相关的课程了,打算总结一篇关于基础SQL语句的文章. SQL介绍 SQL最早版本是由IBM开发的,一直发展到至今. SQL语言有如下几个部分: 数据定义语言DDL: ...
- 【编程学习】MATLAB
目录 一.MATLAB基础 1. 学会完成MATLAB的安装与启动 1.1 软件包下载 1.2 安装步骤 2. 矩阵的基本操作与运算 2.1 矩阵的简单输入与操作 2.2 矩阵的基本运算 2.2.1 ...
- 齐博x1非正常修改后台入口admin.php导致的问题
如果你不是从后台基础设置修改后台入口admin.php文件名的话,也即强行通过FTP修改admin.php文件的名的话,就会导致网站会运行异常 比如会出现不能上传文件之类的.如下图所示
- 【高并发】深度解析ScheduledThreadPoolExecutor类的源代码
在[高并发专题]的专栏中,我们深度分析了ThreadPoolExecutor类的源代码,而ScheduledThreadPoolExecutor类是ThreadPoolExecutor类的子类.今天我 ...
- 8.websocket slef概念
self代表当前用户客户端与服务端的连接对象,比如两客户端发来了两个连接,我们可以把两个连接放在一起 # 定义全局变量 CONN_List = [] class LiveConsumer(Websoc ...
- CentOS7虚拟机配置git仓库(配置虚拟机,网络,git仓库,windows端git访问)
想要达成的目的:从windows使用git访问CentOS7服务器上搭建的git仓库 用到的软件: (1)VMware-workstation-full-15.5.0-14665864.exe (2) ...
- DQL语句
DQL语句 DQL(Data QueryLanguage )数据查询语言,基本结构是由SELECT子句,FROM子句,WHERE子句组成的查询块. 一.DQL概述 1.1.什么是DQL DQL:数据查 ...