Java EE 阶段小项目(小型商城商品展示 + 购物车 + 下单 + 付款)

在这里插入图片描述

3.1.2 商品表 (product)

用于显示对应的数据

在这里插入图片描述

3.1.3 购物车(Shopcart)

在这里插入图片描述

3.2 Java Web 后端逻辑难点分析

3.2.1 验证码实现

使用 java 的 2d 绘图工具,绘制一张 png,我的代码对验证码的绘制做了比较好的封装,所以看起来比较舒服

import javax.imageio.ImageIO;

import javax.servlet.ServletException;

import javax.servlet.ServletOutputStream;

import javax.servlet.annotation.WebServlet;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.awt.*;

import java.awt.image.BufferedImage;

import java.io.IOException;

import java.util.Random;

/**

  • 生成一个 6位数的验证码,并存放到 session 域中 valiCode

  • 并通过 response 返回

  • */

@WebServlet(“/CodeServlet”)

public class CodeServlet extends HttpServlet {

private Random random = new Random();

private int width = 80;//宽度

private int height = 40;//高度

private int fontsize = 20;//字体大小

private String str = “0123456789abcdefghijklmnxnlopiiqusdakljnalwABCDEFGHIJKLMNOPQRSTUVWXYZ”;

//----------- 简单版本 -------------

private String randCode() { //生成 4个字符 随机字符串代码

String code = “”;

for (int i=0; i<4; i++) {

code +=str.charAt(random.nextInt(str.length()));

}

return code;

}

//------------ 生成至少四个字符的随机字符串 –

private String randCode1(int len) {

if (len < 4) {

len = 4;

}

//更改宽度

width = 5 + fontsize*len ;

String code = “”;

for (int i=0; i<len; i++) {

code +=str.charAt(random.nextInt(str.length()));

}

return code;

}

//------------- 返回随机字符串的颜色

private Color randColor() {

int r = random.nextInt(256);

int g = random.nextInt(256);

int b = random.nextInt(256);

return new Color(r,g,b);

}

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

// 1. 设置 servlet 的显示类型

response.setContentType(“image/png”);

// 2. 大致设置一个虚拟的验证码

//1. 创建画板

BufferedImage img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

//2.创建画笔

Graphics2D pen = (Graphics2D)img.getGraphics();

//3.生成随机内容

String code = randCode1(4); //生成 4位数验证码

System.out.println(code);

request.getSession().setAttribute(“valiCode”, code); //保存 code到 session,和后面的内容对应

//4.绘制内容

// 4.1 设置绘制区域

pen.fillRect(0, 0, width, height);

// 4.2设置字体

pen.setFont(new Font(“微软雅黑”,Font.BOLD,fontsize));

// 4.3 按顺序逐个绘制字符

for (int i = 0;i<code.length();i++) {

pen.setColor(randColor());//每个字符使用不同的颜色

//绘制字符

//code.charAt(i) 获得的是单个字符,因此加一个 “” 使其变成字符串

pen.drawString(code.charAt(i)+“”, 5+i*fontsize,(fontsize + height)/2);

}

// 4.4 绘制噪音线 ------------------ 增加验证码难度

for (int i = 0;i < 2;#### i++) {

pen.setColor(randColor());//设置画笔颜色

pen.setStroke(new BasicStroke(3));//设置线条为 3个像素

//划线的坐标:x1,y1 x2,y2

pen.drawLine(random.nextInt(width/2), random.nextInt(height), random.nextInt(width), random.nextInt(width));

}

//5.存为图片并发送

ServletOutputStream out = response.getOutputStream();//数据通过 response 返回

ImageIO.write(img, “png”, out);

out.flush();//缓存刷新

out.close();//缓存关闭

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

doPost(request, response);

}

}

3.2.2 分页逻辑实现

分页逻辑实际就是对数据库的数据进行分条查询,选择 mysql 数据库,是因为它有较好的分页逻辑

  1. 我们需要一个参数 pageNo 表示当前是第几页的数据,这个我们需要从前端获取,如果是第一次获取,就得给一个默认值

  2. 再给一个 pageSize ,表示每页固定展示的数据的条数

  3. 再给一个 count ,代表数据库中数据的总记录数,所以这里需要进行聚合查询的(select count(*) from xxx) 的到总记录数

  4. 还没完,还需要一个 pageCount,这个值代表当前页面能显示多少条数据,也是从后端数据库进行获取的

给大家举一个例子,假设我的数据库里有 11 条记录,也就是第一次展示前 5条,当我们要看第二页的时候就查询第 6 到 10条数据,在翻页就是查询最后一页的数据,因此这个 pageCount 是需要计算的,每次查询出来的数据,告诉前端要显示几条数据

计算逻辑:

int pageCount = 0;

if (count%pageSize == 0) {

pageCount = count/pageSize;

} else {

pageCount = count/pageSize+1;

}

  1. 数据库分页查询语句:select * from xxx limit pageSize*(pageNo-1), pageSize 这样就可以做到上面的例子的逻辑

前端的分页逻辑,采用 BootStrap 的分页标签 + jstl 标签库 共同实现分页逻辑

    <c:choose>

    <c:when test=“${pageNo>1}”>

    • 上一页
    • </c:when>

      <c:otherwise>

    • 上一页
    • </c:otherwise>

      </c:choose>

          

      <c:choose>

      <c:when test=“${pageNo<pageCount}”>

    • 下一页
    • </c:when>

      <c:otherwise>

    • 下一页
    • </c:otherwise>

      </c:choose>

      3.2.3 支付宝沙箱支付环境接入

      当时在接入的时候,也踩了比较多的坑,现在我把我的解决方案分享给大家(如果嫌麻烦,可以直接到 我的 ShoppingMall 仓库下载这个 购物车的小 demo,里面都是 配置好了的

      1. 下载 支付宝手机支付 API 的 SDK,我们是 Java 开发者,当然要下载 java 的 SDK:手机网站支付 SDK

      2. 然后可以大致预览一下支付宝接入流程:接入流程

      3. 然后登陆支付宝开放平台,填写配置,不然后续就无法进行接入的相关工作

      在这里插入图片描述

      1. 阅读沙箱环境支付接入流程:沙箱支付接入介绍

      2. 沙箱环境页面介绍:

      在这里插入图片描述

      1. 然后是下载签名工具:签名工具使用

      下载好就是这样子的

      在这里插入图片描述

      因为我们是个人开发者,没有企业的资质,所以无法生成证书的,所以就默认点这个就可以了

      在这里插入图片描述

      然后将生成的公钥添加到 沙箱环境的应用公钥里,就算是和支付宝环境接入完成了。

      在这里插入图片描述

      7. 然后是 java 代码配置

      将下载好的 sdk导入我们的项目

      在这里插入图片描述

      在这里插入图片描述

      在这里插入图片描述

      这里替换上面两个对应密钥

      在这里插入图片描述

      到这里就基本配置完成了,然后根据你的项目逻辑进行修改即可

      1. 差点忘记了,我们还需要将 SDK 提供的 jar 包导入进来

      在这里插入图片描述

      最后

      自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

      深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

      因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

      既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

      如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

      由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
      何学起的朋友,同时减轻大家的负担。**

      [外链图片转存中…(img-c738NZQt-1715699695123)]

      [外链图片转存中…(img-AeGjb3Kl-1715699695124)]

      [外链图片转存中…(img-cWtLk5zU-1715699695124)]

      既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Java开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

      如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

      由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值