易买网

Posted 素而安然

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了易买网相关的知识,希望对你有一定的参考价值。

                             

0.开发流程:

1.项目约定:

   6个小组:

小组项目名称:EasyBuy_flc或者(EasyBuy_01)

小组数据库名称:EasyBuy_flc

版本控制工具:svn,不再使用

将来可以将自己小组的项目上传到git

 

开发流程控制:     

组长:所有的html页面改成jsp后缀,并且,然后确立数据库和数据表

      A组员:设计数据库,书写数据表中文字段名称

      B组员:设计实体类

项目开发步骤

1.数据库设计

 

 

 easybuy_user(用户表)   1

  EU_USER_ID varchar       用户名

  EU_USER_NAME varchar     真实姓名

  EU_PASSWORD varchar      密码

  EU_SEX varchar           性别(T,F)

  EU_BIRTHDAY date         出生日期

  EU_IDENTITY_CODE varchar 身份证

  EU_EMAIL varchar         电子邮件

============================================================

 

 easybuy_product_category (商品分类表)  2

 

EPC_ID                分类编号

 

EPC_NAME              分类名称

 

EPC_PARENT_ID         父分类编号

=======================================

easybuy_product(商品表)  3

   EP_ID           商品编号

   EP_NAME        商品名称

   EP_DESCRIPTION   商品描述

   EP_PRICE         商品价格

   EP_STOCK         商品库存

   EPC_ID           当前商品所属分类的父分类编号

   EPC_CHILD_ID     当前商品所属分类

   EP_FILE_NAME     商品图片名称

============================================================

 

easybuy_order(订单表) 4

 

EO_ID            订单编号

 

EO_USER_ID       订单所属用户

 

EO_USER_NAME     订单所属用户(真实名称)

 

EO_USER_ADDRESS  订单送货地址

 

EO_CREATE_TIME   订单形成时间

 

EO_COST          本单金额

 

EO_STATUS        订单状态

 

EO_TYPE          订单类型 (本项目未启用)

=====================================================

 

easybuy_order_detail (订单详情表) 5

 

   EOD_ID          订单详情编号

 

EO_ID           订单编号

 

EP_ID           商品编号

 

EOD_QUANTITY    商品数量

 

EOD_COST        单品金额

==========================================================

 

easybuy_news (新闻表)   6

 

   EN_ID           新闻编号

 

   EN_TITLE        新闻标题

 

   EN_CONTENT      新闻内容

 

   EN_CREATE_TIME   新闻发布时间

===================================================

 

easybuy_comment (评论表)  表7

 

EC_ID            评论编号

 

EC_CONTENT       评论内容

 

EC_CREATE_TIME   评论创建时间

 

EC_REPLY          评论回复

 

EC_REPLY_TIME     评论回复时间

 

EC_NICK_NAME      评论人

==============================================================

 

2.项目架构的搭建

 

2.1从实体层开始  

Entity层代码如下:

 User用户类:

Product_category产品类:

Product商品信息表:

Order订单表:

Order_detail订单详情表:

News资讯表:

User_address地址类:

Count类:

开始着手项目:1:

我的登录:

功能是:效验,验证码,登录成功跳转页面。

开始分层:

工具BaseDao:

package cn.com.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.sql.DataSource;

public class BaseDAO {
    public static final String driver = "com.mysql.jdbc.Driver";
    public static final String url = "jdbc:mysql://localhost:3306/easybuy?useUnicode=true&charaterEncoding=UTF-8";
    public static final String username = "root";
    public static final String pwd = "1234";
    public Connection con=null;
    public PreparedStatement ps=null;
    public ResultSet rs=null;
    
    //获取连接getConnection
    public Connection getConnection() throws Exception {
        //加载驱动
        Class.forName(driver);
        if (con == null || con.isClosed()) {
            con = DriverManager.getConnection(url, username, pwd);
        }
        return con;
    }

    //查询 executeQuery
    public ResultSet executeQuery(String sql, Object...objects) throws Exception {
        con = getConnection();
        ps = con.prepareStatement(sql);
        for (int i = 0; i < objects.length; i++) {
            ps.setObject(i + 1, objects[i]);
        }
        rs = ps.executeQuery();
        return rs;
    }

    //增、删、改
    public int executeUpudate(String sql, Object... objects) throws Exception {
        con = getConnection();
        ps = con.prepareStatement(sql);
        for (int i = 0; i < objects.length; i++) {
            ps.setObject(i + 1, objects[i]);
        }
        int num = ps.executeUpdate();
        
        return num;
    }

    public void closeAll() throws Exception {
        if (rs != null || !rs.isClosed()) {
            rs.close();
        }
        if (ps != null || !ps.isClosed()) {
            ps.close();
        }
        if (con != null || !con.isClosed()) {
            con.close();
        }
    }
}

dao层:

public interface IUserDao {
    //根据用户名和密码查询对象
    public int select(String name,String pwd) throws Exception;
//查询用户信息返回泛型集合
  public List<User> getAllList() throws Exception;
 

}

dao的实现层:

public class UserDaoImpl extends BaseDAO implements IUserDao{
     @override
public int select(String name,String pwd) throws Exception{
    string sql="select count(1) from easybuy_user where loginname=? and loginname=?";
    ResultSet  rs=executeQuery(sql,name);
    if(rs!=null){
         while(rs.next()){
              num=rs.getInt("id"):
      }
}
        return num;
    }
@Override
 public List<User> getAllList() throws Exception {
  List<User> list=new ArrayList<User>();
  String  sql="select * from easybuy_user";
  ResultSet rs = executeQuery(sql);
  if(rs!=null){
   while(rs.next()){
    User users=new User();
    users.setId(rs.getInt("id"));
    users.setLoginName(rs.getString("loginname"));
    users.setUserName(rs.getString("username"));
    users.setPassword(rs.getString("password"));
    users.setIdentityCode(rs.getString("identitycode"));
    users.setSex(rs.getInt("sex"));
    users.setMobile(rs.getString("mobile"));
    users.setType(rs.getInt("type"));
    users.setEmail(rs.getString("email"));
    list.add(users);
   }
  }
  return list;
 }




}

services层:

public interface IUserService {
//根据用户名和密码查询对象
        public int select(String name,String pwd) throws Exception;
//查询用户信息返回泛型集合
    public List<User> getAllList() throws Exception;
}

services实现层:

public class UserServiceImpl implements IUserService{

	UserDaoImpl dao=new UserDaoImpl();
@Override
	public int select(String name, String pwd) throws Exception {
		
		return dao.select(name, pwd);
	}
@Override
 public List<User> getAllList() throws Exception {
  
  return dao.getAllList();
 } }

 静态页面:

                <form action="user?title=login" method="post"
                    onsubmit="return checks(this)" id="myform">
                    <table border="0"
                        style="width:370px; font-size:14px; margin-top:30px;"
                        cellspacing="0" cellpadding="0">
                        <tr height="50" valign="top">
                            <td width="55">&nbsp;</td>
                            <td><span class="fl" style="font-size:24px;">登录</span> <span
                                class="fr">还没有商城账号,<a href="Regist.jsp"
                                    style="color:#ff4e00;">立即注册</a></span></td>
                        </tr>
                        <tr height="70">
                            <td>用户名</td>
                            <td><input type="text" value="" class="l_user" id="user" name="luser" /><font color="#ff4e00"><span
                                id="lid"></span></font></td>
                        </tr>
                        <tr height="70">
                            <td>&nbsp; &nbsp;</td>
                            <td><input type="password" value="" class="l_pwd"
                                name="lpwd" id="first" /><font color="#ff4e00"><span id="pid"></span></font></td>
                        </tr>
                        <tr height="70">
                            <td>验证码&nbsp; &nbsp;</td>
                            <td><input type="text" value="" class="l_yzm" name="yzm" />
                                <a href="#" style="font-size:12px; font-family:\'宋体\';" id="myid"><img
                                    src="${pageContext.request.contextPath }/AuthCodeServlet"
                                    id="authImg" />看不清</a><span id="msg"> <c:choose>
                                        <c:when test="${mm==null}">
                                            <script>
                                                $("#msg").html("");
                                            </script>
                                        </c:when>
                                        <c:otherwise>
                                            <script>
                                                $("#msg").html("验证码不一致");
                                            </script>
                                        </c:otherwise>
                                    </c:choose>

                            </span></td>
                        </tr>
                        <tr height="60">
                            <td>&nbsp;</td>
                            <td><input type="submit" value="登录" class="log_btn" /></td>
                        </tr>
                    </table>
                </form>

MD5加密工具:

public class Md5Tool{
           public String getMD5(String pwd){
          //用于加密的字符
               char md5String[] ={\'0\',\'1\',\'2\',\'3\',\'4\',\'5\',\'6\',\'7\',\'8\',\'9\',\'A\',\'B\',\'C\',\'D\',\'E\',\'F\'};
          try{
                //使用平台的默认字符集将此String编码为bytex序列,并将结果存储到一个新的byte数组中
               byte[] btInput=pwd.getBytes();
               //信息摘要是安全的单向哈希函数,它接受任意大小的数据,并输出固定长度的哈希值。
               MessageDigest mdInst=MessageDigest.getInstance("MD5");
              //MessageDisgest对象通过使用update方法处理数据,使用指定的byte数组更新摘要
               mdInst.update(btInput);
             //摘要更新之后,通过调用disgest()执行哈希计算,获得密文
               byte[] md = mdInst.digest();
            //把密文转换成十六进制的字符串形式
               int j=md.length;
               char str[] = new char[j*2];
               int k=0;
              for(int i=0;i<j;i++){         //i=0
                   byte byte0=md[i];       //95
                   str[k++] = md5String[byte0>>>4&0xf];    //5
                   str[k++] = md5String[byte0&0xf];    //F
           }
                          
        //返回经过加密后的字符串
            return new String(str);
          }catch(Exception e)
               return null;
}
}
}

验证码问题:

1.为什么要在网站中加入验证码?

解析:为了防止机器恶意注册1s内在我们的数据库中形成N条记录

2.验证码实现机制:

 解析:为了防止浏览器读取缓存中的验证码图片,首先在形成验证码的Servlet处理程序中设置浏览器不缓存,第二种手段就是给请求的Servlet加一个随机数,这样就保证每次都从服务器拿一张验证码图片。说白了验证码就是一个服务器端的后台类(Servlet),以流的方式回送到客户端浏览器,用img标签承载。

3.雕虫小技

解析:验证的时候先进行验证码的校验,如果发现验证码不匹配, 就不用再验证用户名和密码,这样就省去了和数据库的一次交互。

验证码工具书写:

package cn.buy.util;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

public class AuthCode {

    public static final int AUTHCODE_LENGTH = 5;        //验证码长度  
    public static final int SINGLECODE_WIDTH = 15;  //单个验证码宽度  
    public static final int SINGLECODE_HEIGHT = 30; //单个验证码高度  
    public static final int SINGLECODE_GAP = 4;     //单个验证码之间间隔  
    public static final int IMG_WIDTH = AUTHCODE_LENGTH * (SINGLECODE_WIDTH + SINGLECODE_GAP);  
    public static final int IMG_HEIGHT = SINGLECODE_HEIGHT;  
      
    public static String getAuthCode() {  
        String authCode = "";  
        for(int i = 0; i < AUTHCODE_LENGTH; i++) {  
            authCode += (new Random()).nextInt(10);  
        }  
        return authCode;  
    }  
      
    public static BufferedImage getAuthImg(String authCode) {  
        //设置图片的高、宽、类型  
        //RGB编码:red、green、blue  
        BufferedImage img = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_BGR);  
        //得到图片上的一个画笔  
        Graphics g = img.getGraphics();  
        //设置画笔的颜色,用来做背景色  
        g.setColor(Color.YELLOW);  
        //用画笔来填充一个矩形,矩形的左上角坐标,宽,高  
        g.fillRect(0, 0, IMG_WIDTH, IMG_HEIGHT);  
        //将画笔颜色设置为黑色,用来写字  
        g.setColor(Color.BLACK);  
        //设置字体:宋体、不带格式的、字号  
        g.setFont(new Font("宋体", Font.PLAIN, SINGLECODE_HEIGHT + 5));  
          
        //输出数字  
        char c;  
        for(int i = 0; i < authCode.toCharArray().length; i++) {  
            //取到对应位置的字符  
            c = authCode.charAt(i);  
            //画出一个字符串:要画的内容,开始的位置,高度  
            g.drawString(c + "", i * (SINGLECODE_WIDTH + SINGLECODE_GAP)+ SINGLECODE_GAP / 2, IMG_HEIGHT);  
        }  
        Random random = new Random();  
        //干扰素  
        for(int i = 0; i < 20; i++) {  
            int x = random.nextInt(IMG_WIDTH);  
            int y = random.nextInt(IMG_HEIGHT);  
            int x2 = random.nextInt(IMG_WIDTH);  
            int y2 = random.nextInt(IMG_HEIGHT);  
            g.drawLine(x, y, x + x2, y + y2);  
        }  
        return img;  
    }  
}

验证码的servlet书写:

public class AuthCodeServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doPost(request, response);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String authCode = AuthCode.getAuthCode();  
        
        request.getSession().setAttribute("authCode", authCode); 
        //将验证码保存到session中,便于以后验证  
        try {  
            //发送图片  
            ImageIO.write(AuthCode.getAuthImg(authCode), "JPEG", response.getOutputStream());  
        } catch (IOException e){  
            e.printStackTrace();  
        } 
    }

}

验证码的Ajax,,登录的效验,,鼠标悬停和离开:

前台页面显示js:

1.光标的显示和离开

2.验证码的显示

 

<script type="text/javascript">
    $(function() {
        $("#myid").click(function() {
            $.ajax({
                url : "/EasyBuy/AuthCodeServlet",
                type : "get",
                success : function(dom) {
                    document.getElementById("authImg").src = "AuthCodeServlet";
                }
            });
        });    
    });
    $(function(){
    var erro=0;
        $(".l_user").focus(function() {
            $("#lid").html("请输入用户名");
                });
        $(".l_user").blur(function(){
            if($(this).val()==""){
                $("#lid").html("");
            }else if ($(this).val() != ""
                            && /^[a-zA-Z]{1}([a-zA-Z]|[0-9]){4,15}$/.test($(this).val())) {
                        $("#lid").html("");
            } else {
                $("#lid").html("请输入正确的用户名(首字母为英文,5-15位)");
            }
        });
        
        $(".l_pwd").focus(function(){
            $("#pid").html("请输入密码");
        });
        $(".l_pwd").blur(function(){
            if($(this).val()==""){
            erro=1;
                $("#pid").html("");
            }else if ($(this).val() != ""
                            && /^.{1,16}$/.test($(this).val())) {
                            erro=0;
                        $("#pid").html("");
            } else {
                $("#pid").html("密码格式不正确");
                erro=1;
            }
        });
    });
    
    
    function checks(myform) {
        if (myform.luser.value == "") {
            $("#lid").html("请输入用户名");
            return false;
        }else if (myform.lpwd.value =="") {
            $("#pid").html("请输入密码");
            return false;
        }
        return true;
    }
</script>

 

根据前台页面表单里action的跳转:servelet:

Md5Tool md5Tool=new Md5Tool();
IUserService service = new UserServiceImpl();
if("login".equals(resquest.getParameter("title")){
    String name=request.getParameter("luser");
    String pwds=request.getParameter("lpwd");
    if(name==null&&pwds==null){
        response.sendRedirect("/EasyBuy/Login.jsp");
}else{
        name=new String(name.getBytes("iso-8859-1"),"utf-8");
        pwds=new String(pwds.getBytes("iso-8859-1"),"utf-8");
        String mm=(String)request.getSession().getAttribute("authCode");
        String yy=request.getParameter("yzm");  //获取验证码
        if(!yy.equest(mm)){
                    request.getSession().setAttribute("mm","flag");
                    response.sendRedirect("/EasyBuy/Login.jsp");
            }易买网吐血文档(图片拖不上来,要文档留下联系)

一些项目的基本总结

微信小程序代码片段

VSCode自定义代码片段——CSS选择器

谷歌浏览器调试jsp 引入代码片段,如何调试代码片段中的js

片段和活动之间的核心区别是啥?哪些代码可以写成片段?