易购网上商城系统

ShopOnline项目是一个基于SSH框架的电子商务应用平台,包括Struts2、Spring、Hibernate、MySql、JSP和JQuery等技术。系统涵盖用户登录注册、多表级联、商品分页、订单操作和后台管理等功能。前端需求分析包括用户模块、分类模块、商品模块、购物车和订单模块。后台需求分析涉及用户、一级分类、二级分类、商品和订单管理。

**

ShopOnline项目

**
本系统的开发 意在建立一个以SSH框架为基础,结构灵活、
可复用、可扩展,开发快速且轻量的 电子商务应用平台

实现技术: 主要涉及Struts2、Spring、Hibernate、MySql、JSP、JQuery

功能模块
1:运用Ajax 用户登录注册异步校验
2:多表级联关系映射 完成数据的层级显示
3:封装工具类处理业务 实现商品分页展示
4:订单在线支付、物流信息状态等常规操作
5:系统后台管理各功能的实现 且采用EasyUI进行布局

写完项目有段时间了,才想起来补一篇博客
先放上结构图
这里写图片描述
这里写图片描述

这个项目大方向上分为前台和后台两部分,进一步分析之后前台又分了用户、一级分类、二级分类、购物车、订单等一些比较详细的模块,以下是需求分析:

前台需求分析:

*1.1.1 用户模块:*

注册:
1.前台JS校验:
2.使用AJAX完成对用户名异步校验:
3.后台Struts2校验:
4.验证码:
5.发送激活邮件:
6.将用户信息存入到数据库:
激活:
1.点击链接完成激活:
* 根据激活码,查询数据库中是否有该用户:
* 如果有:激活.(将激活码字段清空.)
* 修改用户的状态:
登录:
1.输入用户名和密码:(数据校验.)
2.用户名和密码都正确同时用户状态必须是激活状态:
退出:
1.销毁session:

1.1.2 一级分类模块:

查询一级分类(导航栏):
1.查询一级分类.
* 将一级分类存入到session范围.(因为每个页面中都有一级分类的数据)
查询某个一级分类:
1.查询所有一级分类:
* 同时查询到每个一级分类下所属的二级分类

1.1.3 商品模块:

查询热门商品:
1.查询热门商品:(限制个数)–分页查询
查询最新商品:
1.查询最新商品:(限制个数)
查询某个分类商品:
1.根据分类的ID进行查询商品:
查询某个二级分类商品:
1.根据二级分类的ID进行查询商品:
查询某个商品信息:
1.根据商品ID进行查询商品:

1.1.4 购物模块:

添加到购物车:
1.将商品信息添加到购物车中:
从购物车中移除商品:
1.将商品信息从购物车中移除:
清空购物车:
1.将所有的商品信息从购物车中移除:

1.1.5 订单模块:

生成订单:
1.若将购物车中 全部的信息存入到数据库(生成订单).
* 此时就清空购物车了:
为订单付款:
1.在线支付功能:
2.修改订单状态:(从 未付款状态变为已付款状态)
3.修改订单的信息:(收货人,联系方式,送货地址)
查询我的订单:
1.根据用户ID查询订单.
查询某个订单详情:
1.根据订单ID进行查询:

1.2 后台需求分析:

1.2.1 用户模块:
添加用户:
添加用户到数据库
修改用户信息:
修改用户到数据库
删除用户:
删除用户
查询用户:
查询用户(带分页)
1.2.2 一级分类:
添加一级分类:
添加一级分类:
修改一级分类:
修改一级分类
删除一级分类:
删除一级分类:
* 级联删除二级分类:
查询一级分类:
查询一级分类:
1.2.3 二级分类:
添加二级分类:
二级分类需要有所属的一级分类:
修改二级分类:
修改二级分类所属的一级分类:
删除二级分类:
删除二级分类:
查询所有二级分类:
查询二级分类(带分页)
1.2.4 商品模块:
添加商品:
1.添加商品所属二级分类:
2.上传商品图片:
修改商品:
1.修改商品的二级分类:
2.修改商品图片(涉及到上传):
删除商品:
1.删除商品:
查询商品:
1.商品查询:(带分页)
1.2.5 订单模块:
查询订单:
查询所有订单:(带分页)
* 异步加载订单项(刚开始只查询订单,当点击某个按钮的时候 显示商品信息)

页面设计

首页
这里写图片描述
注册
这里写图片描述
登录
这里写图片描述
传统后台
这里写图片描述
EasyUI新型后台
功能都是一样的,所以只进行了一种

1.4 数据库设计:

用户表:
* 用户ID
* 用户名:
* 密码:
* 真实姓名:
* 邮箱:
* 地址:
* 电话:
* 用户状态: 0未激活 1已经激活
* 激活码:

一级分类(导航栏):
* 一级分类ID
* 一级分类名称

【一个一级分类可对应多个二级分类 但同一个二级分类只能从属于某一个一级分类
一级分类对二级分类 是一对多的关系:
–需要在多的一方创建一个字段 指向一的一方的主键】

二级分类:
* 二级分类ID:
* 二级分类名称:
* 指向一级分类ID(外键指向一级分类主键)

商品表:
* 商品ID:
* 商品名称:
* 商品商城价格(参考价):
* 商品市场价格(真实卖价):
* 商品描述:
* 商品图片:(路径)
* 指向二级分类ID(外键指向二级分类主键)

订单表:
* 订单ID
* 订单时间:
* 订单总金额:
* 订单状态(付没付款、发没发货、签没签收):
* 订单地址:
* 订单电话:
* 订单收货人:
* 指向用户ID(外键指向用户表的主键)

【订单表与商品表的关系 多对多 所以需要创建一个中间表】
中间表(订单项表):(需要参与到业务逻辑中)
* 主键ID
* 指向商品ID(外键指向商品表的主键id)
* 指向订单ID(外键指向订单表的主键id)
* 数量
* 小计

商城后台用户(管理员)表:
* 用户名:
* 密码
这里写图片描述

这是写项目时的记录文档,剩下的就是编码实现了
这里写图片描述
这里写图片描述

这里主要放一些典型的代码片段吧,仅供参考
用户注册时的验证码程序,喜欢的朋友可以直接拿去用,注释写的还是比较详细哒

//生成验证码的Action类
public class CheckImgAction extends ActionSupport {

    @Override
    public String execute() throws Exception {
        int width = 120;
        int height = 30;

        // 步骤一 绘制一张内存中图片
        BufferedImage bufferedImage = new BufferedImage(width, height,
                BufferedImage.TYPE_INT_RGB);

        // 步骤二 图片绘制背景颜色 ---通过绘图对象
        Graphics graphics = bufferedImage.getGraphics();// 得到画图对象 --- 画笔
        // 绘制任何图形之前 都必须指定一个颜色
        graphics.setColor(getRandColor(200, 250));
        graphics.fillRect(0, 0, width, height);

        // 步骤三 绘制边框
        graphics.setColor(Color.WHITE);
        graphics.drawRect(0, 0, width - 1, height - 1);

        // 步骤四 四个随机数字
        Graphics2D graphics2d = (Graphics2D) graphics;
        // 设置输出字体
        graphics2d.setFont(new Font("宋体", Font.BOLD, 18));

        String words = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
        Random random = new Random();// 生成随机数
        // 定义StringBuffer
        StringBuffer sb = new StringBuffer();
        // 定义x坐标
        int x = 10;
        for (int i = 0; i < 4; i++) {
            // 随机颜色
            graphics2d.setColor(new Color(20 + random.nextInt(110), 20 + random
                    .nextInt(110), 20 + random.nextInt(110)));
            // 旋转 -30 --- 30度
            int jiaodu = random.nextInt(60) - 30;
            // 换算弧度
            double theta = jiaodu * Math.PI / 180;

            // 生成一个随机数字
            int index = random.nextInt(words.length()); // 生成随机数 0 到 length - 1
            // 获得字母数字
            char c = words.charAt(index);
            sb.append(c);
            // 将c 输出到图片
            graphics2d.rotate(theta, x, 20);
            graphics2d.drawString(String.valueOf(c), x, 20);
            graphics2d.rotate(-theta, x, 20);
            x += 30;
        }

        // 将生成的字母存入到session中      供UserAction的注册方法使用
        ServletActionContext.getRequest().getSession().setAttribute("checkcode", sb.toString());

        // 步骤五 绘制干扰线
        graphics.setColor(getRandColor(160, 200));
        int x1;
        int x2;
        int y1;
        int y2;
        for (int i = 0; i < 30; i++) {
            x1 = random.nextInt(width);
            x2 = random.nextInt(12);
            y1 = random.nextInt(height);
            y2 = random.nextInt(12);
            graphics.drawLine(x1, y1, x1 + x2, x2 + y2);
        }

        // 将上面图片输出到浏览器 ImageIO
        graphics.dispose();// 释放资源
        ImageIO.write(bufferedImage, "jpg", ServletActionContext.getResponse()
                .getOutputStream());
        //不需要进行页面跳转
        return NONE;
    }



    /*
     * 取其某一范围的color
     * @param fc    int 范围参数1
     * @param bc    int 范围参数2
     * @return Color
     */
    private Color getRandColor(int fc, int bc) {
        // 取其随机颜色
        Random random = new Random();
        if (fc > 255) {
            fc = 255;
        }
        if (bc > 255) {
            bc = 255;
        }
        int r = fc + random.nextInt(bc - fc);
        int g = fc + random.nextInt(bc - fc);
        int b = fc + random.nextInt(bc - fc);
        return new Color(r, g, b);
    }


}

验证邮箱的工具类

//邮件发送的工具类
public class MailUitls {
    //参数: 收件人    激活码
    public static void sendMail(String to,String code){

        //1.获取邮件发送的Session连接对象    用于 连接发送邮件的服务器
        Properties props = new Properties();
        //参数:发送邮件的主机--本机
        props.setProperty("mail.host", "localhost");//【(key, value)】
        Session session = Session.getInstance(props, new Authenticator() {
            //获取邮件用户名 密码
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //发送邮件的官方邮箱
                return new PasswordAuthentication("evashop@shoponline.com", "0910");
            }
        });


        //2.创建一个代表邮件的对象 Message对象
        Message message = new MimeMessage(session);
        try {
            //设置发件人    注意这里是官方邮箱
            message.setFrom(new InternetAddress("evashop@shoponline.com"));
            //设置收件人  CC抄送   BCC密送
            message.addRecipient(RecipientType.TO, new InternetAddress(to));
            //设置邮件标题
            message.setSubject("来自evashop的官方激活邮件");
            // 设置邮件正文:      注意ip(会变的!!!注意!)和端口号             正文内容    格式【text/html  链接格式】 【text/plain 纯文本格式】                                                                                  //注意这里的UTF-8和eclipse中的UTF-8 大小写一致                                           
            message.setContent("<h1>来自evashop的官方激活邮件!点下面链接完成激活操作!</h1><h3><a href='http://192.168.179.2:1020/ShopOnline/user_active.action?code="+code+"'>邮件内容:"+code+"</a></h3>", "text/html; charset=UTF-8");
            //3.执行发送邮件    Transport对象
            Transport.send(message);
        } catch (AddressException e) {
            e.printStackTrace();
        } catch (MessagingException e) {
            e.printStackTrace();
        }

    }

    //测试邮件发送
    public static void main(String[] args) {
        //接收人    邮件内容
        sendMail("aaa@shoponline.com","测试邮件");
    }

}

log4j.properties配置文件

### direct log messages to stdout ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### direct messages to file mylog.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=c:/mylog.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n

### set log levels - for more verbose logging change 'info' to 'debug' ###

log4j.rootLogger=info, stdout

基本上这个项目就是这些啦,小小白在努力~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值