2.课程设计内容和要求
首先先确定功能,创建数据库、数据表。
功能要求:注册、登录、注销、对数据库中数据的增删改查。
开发项目所需环境及软件:jdk、tomcat、oracle、plsql、idea。
准备jar包。
设置编码。
设置idea工作空间编码。
tomcat服务器编码。
jsp页面编码。
数据库编码。
实训提交内容。
项目源代码。
数据库的结构和数据。
实训报告。
3 系统需求分析
使用SSM框架完成项目构建
配置Tomcat服务器,部署Web项目
使用idea工具开发项目
使用maven管理项目
使用EL和JSTL显示页面内容
使用js操作页面元素完成交互效果
3.1 系统目标
注册
登录
商品展示
加入购物车
修改购物车中商品数量
删除购物车中商品
更新商品的信息
3.2 主体功能
对项目进行登录注册和增删改查
3.3 开发环境
JDK1.8 + Web + SSM + JS/jQuery + Ajax
4 系统总体设计
4.1 系统的功能模块划分
登录模块
注册模块
分页模块
更新模块
删除模块
添加模块
注销模块
4.2 系统流程图
4.3 数据库和表
5系统详细设计
5.1配置文件
第一步配置applicationcontext文件
<!--开启注解扫描-->
<context:component-scan base-package="sm.service"></context:component-scan>
<!--0......创建数据库连接信息-->
<context:property-placeholder location="classpath:sm/config/jdbc.properties"></context:property-placeholder>
<!--1......创建数据源,连接数据库-->
<bean id="datasource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${name}"/>
<property name="password" value="tiger"/>
</bean>
<!--2.......创建SqlSession工厂对象-->
<bean id="sqlsessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--注入数据源-->
<property name="dataSource" ref="datasource"/>
<!--指定mapper文件路径-->
<property name="mapperLocations">
<list>
<value>classpath:sm/dao/*Mapper.xml</value>
</list>
</property>
</bean>
<!--自********************动*******************装****************配-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="sm.dao"></property>
</bean>
<bean id="MyInterceptorinsert" class="sm.aop.MyInterceptorinsert"/>
<aop:config>
<aop:pointcut id="productserviceimplinsertcut" expression="@annotation(sm.aop.Annotationinsert)"/><!--插入功能区切入点-->
<aop:advisor advice-ref="MyInterceptorinsert" pointcut-ref="productserviceimplinsertcut"/> <!--编织,实现对插入功能区增强-->
</aop:config>
<bean id="Myinterceptorupdate" class="sm.aop.Myinterceptorupdate"/>
<aop:config>
<aop:pointcut id="productserviceimplupdatecut" expression="@annotation(sm.aop.Annotationupdate)"/>
<aop:advisor advice-ref="Myinterceptorupdate" pointcut-ref="productserviceimplupdatecut"/>
</aop:config>
<bean id="Myinterceptordelete" class="sm.aop.Myinterceptordelete"/>
<aop:config>
<aop:pointcut id="productserviceimpldeletecut" expression="@annotation(sm.aop.Annotationdelete)"/>
<aop:advisor advice-ref="Myinterceptordelete" pointcut-ref="productserviceimpldeletecut"/>
</aop:config>
</beans>
第二步配置jdbc.properties文件
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:orcl
name=scott
password=tiger
第三部配置springMVC-servlet.xml文件
<context:component-scan base-package=“sm.controller”></context:component-scan>
mvc:annotation-driven
mvc:message-converters
</mvc:message-converters>
</mvc:annotation-driven>
<!–mvc:interceptorsOracle - @localhost
mvc:interceptor
<mvc:mapping path="/admin/**"/>
<bean class="sm.Interceptor.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>-->
第四步配置web.xml文件 <?xml version="1.0" encoding="UTF-8"?> /admin/login.jsp
contextConfigLocation classpath:applicationContext.xml
org.springframework.web.context.ContextLoaderListener
springMVC
org.springframework.web.servlet.DispatcherServlet
<!--指定springmvc的配置文件位置-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springMVC-servlet.xml</param-value>
</init-param>
<!--在服务器启动时,实例化servlet对象-->
<load-on-startup>1</load-on-startup>
springMVC
*.do
characterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8
forceEncoding true
characterEncodingFilter /* 第五步配置UserlMapper.xml文件进行注册和登录以及ProductMapper.xml文件进行对商品的增删改查。 1.UserlMapper.xml.文件 <?xml version="1.0" encoding="UTF-8" ?>
InsertintoUserL values(seq_UserL.nextval,#{uname},#{upwd},#{salt}) select * from UserL uname=#{uname} and upwd=#{upwd} 2.ProductMapper.xml文件 <?xml version="1.0" encoding="UTF-8" ?>
select * from product where pro_id=#{proId} select * from product insert into product (pro_id,pro_name,pro_price,pro_count) values(seq_pro_id.nextval,#{proName},#{proPrice},#{proCount}) update product pro_name=#{proName}, pro_price=#{proPrice}, pro_count=#{proCount}, where pro_id=#{proId} delete from product where pro_id=#{proId}
select*from (select rownum rn,t.*from product t) where rn < #{end} and rn>#{first}
select count(*) from product
第六步配置UserlMapper.xml和ProductMapper.xml文件对应商品的实体类。
1.Userl实体类
package sm.entity;
/**
-
@author ldf
-
@author2021/5/17-17:50
*/
public class UserL {
private int id;
private String uname;
private String upwd;
private String salt;public int getId() {
return id;
}public void setId(int id) {
this.id = id;
}public String getUname() {
return uname;
}public void setUname(String uname) {
this.uname = uname;
}public String getUpwd() {
return upwd;
}public void setUpwd(String upwd) {
this.upwd = upwd;
}public String getSalt() {
return salt;
}public void setSalt(String salt) {
this.salt = salt;
}
public UserL( String uname, String upwd, String salt) {
this.uname = uname;
this.upwd = upwd;
this.salt = salt;
}public UserL(int id, String uname, String upwd, String salt) {
this.id = id;
this.uname = uname;
this.upwd = upwd;
this.salt = salt;
}public UserL() {
super();
}@Override
public String toString() {
return “UserL{” +
“id=” + id +
“, uname=’” + uname + ‘’’ +
“, upwd=’” + upwd + ‘’’ +
“, salt=’” + salt + ‘’’ +
‘}’;
}
}
2.ProductMapper实体类
package sm.entity;
import java.io.Serializable;
import java.sql.Date;
/**
-
@author ldf
-
@author2021/4/29-11:29
*/
public class Product implements Serializable{
private int proId;
private String proName;
private int proPrice;
private int proCount;
private Date proCreateDate;public int getProId() {
return proId;
}public void setProId(int proId) {
this.proId = proId;
}public String getProName() {
return proName;
}public void setProName(String proName) {
this.proName = proName;
}public int getProPrice() {
return proPrice;
}public void setProPrice(int proPrice) {
this.proPrice = proPrice;
}public int getProCount() {
return proCount;
}public void setProCount(int proCount) {
this.proCount = proCount;
}public Date getProCreateDate() {
return proCreateDate;
}public void setProCreateDate(Date proCreateDate) {this.proCreateDate = proCreateDate;}
public Product(int proId, String proName, int proPrice, int proCount, Date proCreateDate) {
this.proId = proId;
this.proName = proName;
this.proPrice = proPrice;
this.proCount = proCount;
this.proCreateDate = proCreateDate;
}
public Product(String proName, int proPrice, int proCount, int proId) {
this.proId = proId;
this.proName = proName;
this.proPrice = proPrice;
this.proCount = proCount;
}
public Product(String proName, int proPrice, int proCount) {
this.proName = proName;
this.proPrice = proPrice;
this.proCount = proCount;
}public Product() {
super();
}@Override
public String toString() {
return “Product{” +
“proId=” + proId +
“, proName=’” + proName + ‘’’ +
“, proPrice=” + proPrice +
“, proCount=” + proCount +
“, proCreateDate=” + proCreateDate +
‘}’;
}
}
5.2 登录模块设计
登录页面效果图
登录页面效果图实现代码
1)dao层
public interface IUserLDao {
List selectListdao(@Param(“uname”) String uname, @Param(“upwd”) String upwd);//查询所有的用户
}
2)Service实现层
/**
-
@author ldf
-
@author2021/5/17-18:18
*/
@Service
public class UserLserviceimpl implements IUserLservice {
@Autowired
private IUserLDao idao;//自动装配@Override//查看所有用户
public List selectListdaoservice(@Param(“uname”) String uname, @Param(“upwd”) String upwd) {
return idao.selectListdao(uname,upwd);
}
}
3)控制层controller层代码
@RequestMapping("/client/checklogin")
@ResponseBody
public boolean checklogin(HttpServletResponse response, @RequestParam(“uname”) String uname, @RequestParam(“upwd”) String upwd, HttpSession session) throws IOException {
//具体逻辑 返回一个结果 true false 0 1
boolean str = false;//标记
List userList = iUserLservice.selectListdaoservice(uname.trim(),null);
if(userList.size()>0){//用户名存在
//获取盐值
String salt = userList.get(0).getSalt();
//拼接 盐值+输入密码
String password = salt + upwd.trim();
System.out.println(password);
//如果存在 对输入的密码进行md5加密
String s = DigestUtils.md5Hex(password);
//对比加盐后的输入密码 与 数据库中的密文密码
if(s.equals(userList.get(0).getUpwd())){
Cookie cookie=new Cookie(“MvcCookic”,uname.trim());
cookie.setMaxAge(5*60);
response.addCookie(cookie);
//保存数据 参数传递
session.setAttribute(“uname”,userList.get(0).getUname());
int pageindex=1;//当前页
int pagesize=5;//页面大小;
int count=iProductservice.countservice();//数据总数
int pagecount=count/pagesize;//总页数
if (count<pagesize){
pageindex=1;//当前页
pagesize=count;
}
if (count%pagesize<pagesize){
if (count%pagesize==0){
pagecount=count/pagesize;//刚刚好
}else{
pagecount=(count/pagesize)+1;//多一页
}
}
List productslist = iProductservice.QueryPageUsersservice(pageindex,pagesize);
//保存数据 参数传递
session.setAttribute(“pagecount”,pagecount);
session.setAttribute(“productslist”, productslist);
session.setAttribute(“pageindex”,pageindex);
session.setAttribute(“pagesize”,pagesize);
str = true;
}
}
return str;
}
登录功能jsp代码
<%@page contentType=“text/html;charset=UTF-8” language=“java” %>
5.3 用户注册模块设计
注册页面效果图
注册页面效果图实现代码
1)dao层
public interface IUserLDao {
int insertDao(UserL userL);//注册用户
}
2)Service层
@Service
public class UserLserviceimpl implements IUserLservice {
@Autowired
private IUserLDao idao;//自动装配
//注册用户
@Override
public int insertDaoservice(UserL userL) {
return idao.insertDao(userL);
}
}
3)Controller层注册逻辑
@RequestMapping("/client/checkregist")
@ResponseBody
public boolean regist(HttpServletRequest request, HttpSession session , String uname,String upwd){
boolean str = false;//标记
RandomCharacters rr= new RandomCharacters();
String jy=rr.getRandomString(5);
System.out.println("注册加盐 = " + jy);
String upwdjy=jy+upwd;
UserL us=new UserL(uname, DigestUtils.md5Hex(upwdjy),jy);
int userL2 = iUserLservice.insertDaoservice(us);
session.setAttribute(“uname”,uname);
str=true;
return str;
}
4)Controller层注册查询用户名是否重复逻辑
@RequestMapping("/client/checkonly")
@ResponseBody
public boolean checkonly (HttpServletRequest req, HttpServletResponse resp, @RequestParam(“Admin”) String Admin, HttpSession session) throws ServletException, IOException {
boolean str = false;//标记
List userList = iUserLservice.selectListdaoservice(Admin,null);
if(userList.size()>0) {//用户名存在//
// 4、将检验结果返回给浏览器(响应Ajax请求)
System.out.println(“已找到重复名”);
return str;
} else{
str=true;
return str;
}
}
注册功能页面jsp代码
<%@page contentType=“text/html;charset=UTF-8” language=“java”%>
//用户唯一验证
function checkUname() {
let reg = /1{2,6}
/
;
v
a
r
A
d
m
i
n
=
/; var Admin=
/;varAdmin=("#account").val();
if (!reg.test(Admin)|| Admin==’’) {
$("#tips").text(“请输入2~6位中文”).css(“color”,"#CCC")
return false;
} else{
//jquery集成ajax
console.log(Admin);
console.log(“ajax”)
KaTeX parse error: Expected '}', got 'EOF' at end of input: … url:"{pageContext.request.contextPath}/client/checkonly.do",//请求地址
data:{“Admin”: Admin},
success: function (data) {//服务器成功处理请求后的回调函数
console.log(“返回的数据” + data);
//判断返回的数据
if (datatrue) {
//在页面上显示数据
$("#tips").text(“用户名可以注册”).css(“color”,"#CCC")
unameUnique= true;
} else {
//在页面上显示数据
$("#tips").text(“用户名重复”).css(“color”,"#CCC")
return false;
}
},
error: function (xhr) {//服务器未成功处理请求后的回调函数
console.log(“失败信息” + xhr.responseText);
},
dataType: “json” //服务器响应的数据格式
});
}
}
//密码验证
function pwdCheck() {
let reg = /2{6,12}/;
let pwd = $("#realname").val();
if(!reg.test(pwd) || pwd’’){
$("#tips1").text(“请输入6-12位密码”).css(“color”,"#CCC")
return false;
}else{
$("#tips1").text(“密码可用”).css(“color”,"#CCC")
return true;
}
}
//确认密码验证
function pwdSure() {
let reg = /3{6,12}/;
let pasd= KaTeX parse error: Expected 'EOF', got '#' at position 3: ("#̲pasd").val(); …("#realname").val() === $("#pasd").val() && $("#pasd").val()!=’’) {
$("#tips2").text(“确认密码正确”).css(“color”,"#CCC")
return true;
} else {
$("#tips2").text(“密码请保持一致或者不可为空”).css(“color”,"#CCC")
return false;
}
}
//提交注册
function checkregist() {
var uname = $("#account").val();
var upwd = $("#realname").val();
//jquery集成ajax
KaTeX parse error: Expected '}', got 'EOF' at end of input: …x({ url: "{pageContext.request.contextPath}/client/checkregist.do",//请求地址
type: “post”,//请求方式
data: {“uname”: uname, “upwd”: upwd},
success: function (data) {//服务器成功处理请求后的回调函数
if(data){
window.location.href = “${pageContext.request.contextPath}/admin/registsuccess.jsp”;
}else {
alert(“请重新注册”);
}
},
error: function (xhr) {//服务器未成功处理请求后的回调函数
console.log(“失败信息” + xhr.responseText);
},
dataType: “json” //服务器响应的数据格式
});
}
登录后台显示商品并分页显示页面效果图实现代码
1)dao层
public interface IProductDao {
List selectProductDaoall();//查询所有的商品
ListQueryPageUsers(@Param(“end”) int end, @Param(“first”) int first);//分页显示
int count();//查询商品数据总数
}
2)Service层
public List selectProductDaoserviceall() {
return dao.selectProductDaoall();
}
public List QueryPageUsersservice(int pageindex, int pagesize) {//查询指定数据
int end= pageindex*pagesize+1;
int first=(pageindex-1)*pagesize;
return dao.QueryPageUsers(end,first);}
public int countservice() {
return dao.count();//查询商品表中的数据总数
}
3)Controller层
@RequestMapping("/client/showbypage")
public String showbypage(HttpServletRequest request ,HttpSession session ){
int index = Integer.parseInt(request.getParameter(“index”));
int pagesize= Integer.parseInt(request.getParameter(“size”));//页面大小;
int count=iProductservice.countservice();//数据总数
int pageindex;//当前页
int pagecount=count/pagesize;//总页数
if (count<pagesize){
pagesize=count;
}
if (count%pagesize<pagesize){
if (count%pagesize==0){
pagecount=count/pagesize;//刚刚好
}else{
pagecount=(count/pagesize)+1;//多一页
}
}
System.out.println(“当前页”+index+“页面大小”+pagesize);
System.out.println(“AllController.showbypage”);
if (index<1){
pageindex=1;
List productslist = iProductservice.QueryPageUsersservice(pageindex,pagesize);
//保存数据 参数传递
session.setAttribute(“pagecount”,pagecount);
session.setAttribute(“productslist”, productslist);
session.setAttribute(“pageindex”,pageindex);
session.setAttribute(“pagesize”,pagesize);
return “redirect:/admin/loginsuccess.jsp”;
}else if(index>pagecount){
pageindex=pagecount;
List productslist = iProductservice.QueryPageUsersservice( pageindex,pagesize);
//保存数据 参数传递
session.setAttribute(“pagecount”,pagecount);
session.setAttribute(“productslist”, productslist);
session.setAttribute(“pageindex”,pageindex);
session.setAttribute(“pagesize”,pagesize);
return “redirect:/admin/loginsuccess.jsp”;
}else {
pageindex=index;
List productslist = iProductservice.QueryPageUsersservice( pageindex,pagesize);
//保存数据 参数传递
session.setAttribute(“pagecount”,pagecount);
session.setAttribute(“productslist”, productslist);
session.setAttribute(“pageindex”,pageindex);
session.setAttribute(“pagesize”,pagesize);
return “redirect:/admin/loginsuccess.jsp”;
}
}
后台分页页页面jsp代码
5.5 商品添加模块设计 商品添加页面效果图商品添加页面效果图实现代码
1)dao层
int insertProductDao(@Param(“proName”) String proName, @Param(“proPrice”) int proPrice, @Param(“proCount”) int proCount);//添加
2)Service层
public int insertProductDaoservice(String proName, int proPrice, int proCount) {
return dao.insertProductDao(proName,proPrice,proCount);}
3)Controller层
@RequestMapping("/client/addmvc")
public String add(HttpServletRequest request ,HttpSession session){
String proname = request.getParameter(“proname”);;
int procount = Integer.parseInt(request.getParameter(“procount”));
int proprice= Integer.parseInt(request.getParameter(“proprice”));
int i = iProductservice.insertProductDaoservice(proname, proprice, procount);
System.out.println("add = " + i);
return “redirect:/admin/Addsuccess.jsp”;
}
商品添加页页面jsp代码
<%–
Created by IntelliJ IDEA.
User: F
Date: 2021/5/24
Time: 18:37
To change this template use File | Settings | File Templates.
–%>
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>
数量:
价格:
5.6 商品删除模块设计 商品删除页面效果图
商品删除页面效果图实现代码
1)dao层
int deleteProductDao(@Param(“proId”) int proId);//删除商品
2)Service层
public int deleteProductDaoservice( int proId) {
return dao.deleteProductDao(proId);
}
3)Controller层
@RequestMapping("/client/deletemvc")
public String delete(@RequestParam(“uid”) Integer uid, HttpServletRequest request , HttpSession session){
System.out.println("uid = " +uid );
int i = iProductservice.deleteProductDaoservice(uid);
int pageindex = Integer.parseInt(request.getParameter(“index”));//当前页
int pagesize= Integer.parseInt(request.getParameter(“size”));//页面大小;
int count=iProductservice.countservice();//数据总数
int pagecount=count/pagesize;//总页数
if (count<pagesize){
if(count0){
return “redirect:/admin/deletenone.jsp”;
}
pagesize=count;
}
if (count%pagesize<pagesize){
if (count%pagesize0){
pagecount=count/pagesize;//刚刚好
}else{
pagecount=(count/pagesize)+1;//多一页
}
}
List productslist = iProductservice.QueryPageUsersservice(pageindex, pagesize);
//保存数据 参数传递
session.setAttribute(“pagecount”,pagecount);
session.setAttribute(“pageindex”,pageindex);
session.setAttribute(“pagesize”,pagesize);
session.setAttribute(“productslist”, productslist);
return “redirect:/admin/loginsuccess.jsp”;
}
商品删除页页面jsp代码
商品更新页面效果图实现代码
1)dao层
int updateProductDao(Product product);//修改商品
2)Service层
public int updateProductDaoservice(Product productupdate) {
return dao.updateProductDao(productupdate);
}
3)Controller层
@RequestMapping("/client/updatemvc")
public String update(@RequestParam(“uid”) Integer uid,HttpServletRequest request ,HttpSession session){
System.out.println(“uid2 = " +uid );
int index = Integer.parseInt(request.getParameter(“index”));
int size= Integer.parseInt(request.getParameter(“size”));//页面大小;
List productsupdate = iProductservice.selectProductDaoid(uid);
//保存数据 参数传递
session.setAttribute(“pageindex”,index);
session.setAttribute(“pagesize”,size);
session.setAttribute(“productsupdateid”, productsupdate.get(0).getProId());
session.setAttribute(“productsupdatename”, productsupdate.get(0).getProName());
session.setAttribute(“productsupdateprice”, productsupdate.get(0).getProPrice());
session.setAttribute(“productsupdatecount”, productsupdate.get(0).getProCount());
return “redirect:/admin/update.jsp”;
}
@RequestMapping(”/client/updatetwomvc")
public String updatetwo(HttpServletRequest request ,HttpSession session){
String proname = request.getParameter(“proname”);
int proid= Integer.parseInt(request.getParameter(“proid”));
int procount = Integer.parseInt(request.getParameter(“procount”));
int proprice= Integer.parseInt(request.getParameter(“proprice”));
Product productupdate=new Product(proname, proprice, procount,proid);
int i = iProductservice.updateProductDaoservice(productupdate);
int pageindex = Integer.parseInt(request.getParameter(“index”));
int size= Integer.parseInt(request.getParameter(“size”));//页面大小;
int count=iProductservice.countservice();//数据总数
int pagesize=size;//页面大小;
int pagecount=count/pagesize;//总页数
if (count<pagesize){
pagesize=count;
}
if (count%pagesize<pagesize){
if (count%pagesize==0){
pagecount=count/pagesize;//刚刚好
}else{
pagecount=(count/pagesize)+1;//多一页
}
}
List productslist = iProductservice.QueryPageUsersservice(pageindex,pagesize);
//保存数据 参数传递
session.setAttribute(“pagecount”,pagecount);
session.setAttribute(“productslist”, productslist);
session.setAttribute(“pageindex”,pageindex);
session.setAttribute(“pagesize”,pagesize);
return “redirect:/admin/loginsuccess.jsp”;
}
商品更新页页面jsp代码
更新<%–
Created by IntelliJ IDEA.
User: F
Date: 2021/5/24
Time: 20:21
To change this template use File | Settings | File Templates.
–%>
<%@ page contentType=“text/html;charset=UTF-8” language=“java” %>