实现手机扫描二维码进行登录

article/2025/9/18 8:48:32

项目结构:

 

 

 

 

实现流程:

 

pc端:

1:打开二维码登录网页index.html

2:index.html调用GetQrCodeServlet

3:GetQrCodeServlet干2件事

  a:生成随机的uuid,是一个唯一标识,该标识贯穿整个流程

  b:生成二维码图片,二维码信息:http://xx.xx.xx.xx:8080/QrCodeLoginPro/Login.html?uuid=" + uuid

4:index页面展示二维码

5:index页面调用LongConnectionCheckServlet进行长连接轮询操作,参数为uuid

6:LongConnectionCheckServlet只干1件事

  a:拿到uuid后循环检查loginUserMap中uuid是否不为null。

7:如果为null则代表没有登录,index.html将继续进行轮询

 

  ps: LongConnectionCheckServlet 一个长连接请求检测登录状态

    loginUserMap 是一个静态的map结构的登录池,uuid为key , 登录信息为value

 

 

手机端:

1:扫描pc端的二维码

2:打开二维码中的网页 http://xx.xx.xx.xx:8380/QrCodeLoginPro/Login.html?uuid=" + uuid

3:登录,将uname upwd uuid 传递给登录程序PhoneLoginServlet

4:PhoneLoginServlet干2件事

  a:检测登录

  b:登录成功后将登录信息插入到loginUserMap中去,uuid为key

 

 

pc端:

  1:继续轮询检测uuid中是否为null

  2:登录后的uuid中就不为null了,此时LongConnectionCheckServlet停止循环,返回登录状态。

 

 

 

 

代码:

cn.kuwo下的3个servlet

复制代码
package cn.kuwo;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.kuwo.util.TwoDimensionCode;/*** 生成二维码图片以及uuid* @author zijuntang**/
public class GetQrCodeServlet extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {PrintWriter out = response.getWriter();//生成唯一IDint uuid = (int) (Math.random() * 100000);//二维码内容String content = "http://xx.xx.xx.xx:8380/QrCodeLoginPro/Login.html?uuid=" + uuid;//生成二维码String imgName =  uuid + "_" + (int) (new Date().getTime() / 1000) + ".png";String imgPath = "/home/web/apache/htdocs/QrCodeLogin/" + imgName;TwoDimensionCode handler = new TwoDimensionCode();handler.encoderQRCode(content, imgPath, "png");//生成的图片访问地址String qrCodeImg = "http://xx.xx.xx.xx/QrCodeLogin/" + imgName;String jsonStr = "{\"uuid\":" + uuid + ",\"qrCodeImg\":\"" + qrCodeImg + "\"}";out.print(jsonStr);out.flush();out.close();}
}
复制代码
复制代码
package cn.kuwo;import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.kuwo.vo.LoginUserVo;
import cn.kuwo.vo.UserVo;/*** 用长连接,检查登录状态* @author zijuntang**/
public class LongConnectionCheckServlet extends HttpServlet {private static final long serialVersionUID = 1L;public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String uuid = request.getParameter("uuid");String jsonStr = "";System.out.println("in");System.out.println("uuid:" + uuid);long inTime = new Date().getTime();Boolean bool = true;while (bool) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}//检测登录UserVo userVo = LoginUserVo.getLoginUserMap().get(uuid);System.out.println("userVo:" + userVo);if(userVo != null){bool = false;jsonStr = "{\"uname\":\""+userVo.getUname()+"\"}";LoginUserVo.getLoginUserMap().remove(uuid);}else{if(new Date().getTime() - inTime > 5000){bool = false;}}}System.out.println("login ok : " + jsonStr);PrintWriter out = response.getWriter();out.print(jsonStr);out.flush();out.close();}
}
复制代码
复制代码
package cn.kuwo;import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.kuwo.vo.LoginUserVo;
import cn.kuwo.vo.UserVo;/*** 二维码手机端登录* @author zijuntang**/
public class PhoneLoginServlet extends HttpServlet {private static final long serialVersionUID = 1L;public PhoneLoginServlet() {super();// TODO Auto-generated constructor stub
    }protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String uuid = request.getParameter("uuid");String uname = request.getParameter("uname");String upwd = request.getParameter("upwd");System.out.println(uuid);System.out.println(uname);System.out.println(upwd);//TODO 验证登录boolean bool = true;if(bool){//将登陆信息存入mapUserVo userVo = LoginUserVo.getLoginUserMap().get(uuid);if(userVo == null){userVo = new UserVo();userVo.setUname(uname);userVo.setUpwd(upwd);LoginUserVo.getLoginUserMap().put(uuid, userVo);}}PrintWriter out = response.getWriter();out.print(bool);out.flush();out.close();}
}
复制代码

 

 

 

 

 

cn.kuwo.util包下的生成二维码的封装类

复制代码
package cn.kuwo.util;  import java.awt.Color;  
import java.awt.Graphics2D;  
import java.awt.image.BufferedImage;  
import java.io.File;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.OutputStream;  
import javax.imageio.ImageIO;  
import jp.sourceforge.qrcode.QRCodeDecoder;  
import jp.sourceforge.qrcode.exception.DecodingFailedException;  
import com.swetake.util.Qrcode;  public class TwoDimensionCode {  /** * 生成二维码(QRCode)图片 * @param content 存储内容 * @param imgPath 图片路径 */  public void encoderQRCode(String content, String imgPath) {  this.encoderQRCode(content, imgPath, "png", 7);  }  /** * 生成二维码(QRCode)图片 * @param content 存储内容 * @param output 输出流 */  public void encoderQRCode(String content, OutputStream output) {  this.encoderQRCode(content, output, "png", 7);  }  /** * 生成二维码(QRCode)图片 * @param content 存储内容 * @param imgPath 图片路径 * @param imgType 图片类型 */  public void encoderQRCode(String content, String imgPath, String imgType) {  this.encoderQRCode(content, imgPath, imgType, 7);  }  /** * 生成二维码(QRCode)图片 * @param content 存储内容 * @param output 输出流 * @param imgType 图片类型 */  public void encoderQRCode(String content, OutputStream output, String imgType) {  this.encoderQRCode(content, output, imgType, 7);  }  /** * 生成二维码(QRCode)图片 * @param content 存储内容 * @param imgPath 图片路径 * @param imgType 图片类型 * @param size 二维码尺寸 */  public void encoderQRCode(String content, String imgPath, String imgType, int size) {  try {  BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);  File imgFile = new File(imgPath);if (!imgFile.exists()){imgFile.mkdirs();}// 生成二维码QRCode图片  
            ImageIO.write(bufImg, imgType, imgFile);  } catch (Exception e) {  e.printStackTrace();  }  }  /** * 生成二维码(QRCode)图片 * @param content 存储内容 * @param output 输出流 * @param imgType 图片类型 * @param size 二维码尺寸 */  public void encoderQRCode(String content, OutputStream output, String imgType, int size) {  try {  BufferedImage bufImg = this.qRCodeCommon(content, imgType, size);  // 生成二维码QRCode图片  
            ImageIO.write(bufImg, imgType, output);  } catch (Exception e) {  e.printStackTrace();  }  }  /** * 生成二维码(QRCode)图片的公共方法 * @param content 存储内容 * @param imgType 图片类型 * @param size 二维码尺寸 * @return */  private BufferedImage qRCodeCommon(String content, String imgType, int size) {  BufferedImage bufImg = null;  try {  Qrcode qrcodeHandler = new Qrcode();  // 设置二维码排错率,可选L(7%)、M(15%)、Q(25%)、H(30%),排错率越高可存储的信息越少,但对二维码清晰度的要求越小  qrcodeHandler.setQrcodeErrorCorrect('M');  qrcodeHandler.setQrcodeEncodeMode('B');  // 设置设置二维码尺寸,取值范围1-40,值越大尺寸越大,可存储的信息越大  
            qrcodeHandler.setQrcodeVersion(size);  // 获得内容的字节数组,设置编码格式  byte[] contentBytes = content.getBytes("utf-8");  // 图片尺寸  int imgSize = 67 + 12 * (size - 1);  bufImg = new BufferedImage(imgSize, imgSize, BufferedImage.TYPE_INT_RGB);  Graphics2D gs = bufImg.createGraphics();  // 设置背景颜色  
            gs.setBackground(Color.WHITE);  gs.clearRect(0, 0, imgSize, imgSize);  // 设定图像颜色> BLACK  
            gs.setColor(Color.BLACK);  // 设置偏移量,不设置可能导致解析出错  int pixoff = 2;  // 输出内容> 二维码  if (contentBytes.length > 0 && contentBytes.length < 800) {  boolean[][] codeOut = qrcodeHandler.calQrcode(contentBytes);  for (int i = 0; i < codeOut.length; i++) {  for (int j = 0; j < codeOut.length; j++) {  if (codeOut[j][i]) {  gs.fillRect(j * 3 + pixoff, i * 3 + pixoff, 3, 3);  }  }  }  } else {  throw new Exception("QRCode content bytes length = " + contentBytes.length + " not in [0, 800].");  }  gs.dispose();  bufImg.flush();  } catch (Exception e) {  e.printStackTrace();  }  return bufImg;  }  /** * 解析二维码(QRCode) * @param imgPath 图片路径 * @return */  public String decoderQRCode(String imgPath) {  // QRCode 二维码图片的文件  File imageFile = new File(imgPath);  BufferedImage bufImg = null;  String content = null;  try {  bufImg = ImageIO.read(imageFile);  QRCodeDecoder decoder = new QRCodeDecoder();  content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");   } catch (IOException e) {  System.out.println("Error: " + e.getMessage());  e.printStackTrace();  } catch (DecodingFailedException dfe) {  System.out.println("Error: " + dfe.getMessage());  dfe.printStackTrace();  }  return content;  }  /** * 解析二维码(QRCode) * @param input 输入流 * @return */  public String decoderQRCode(InputStream input) {  BufferedImage bufImg = null;  String content = null;  try {  bufImg = ImageIO.read(input);  QRCodeDecoder decoder = new QRCodeDecoder();  content = new String(decoder.decode(new TwoDimensionCodeImage(bufImg)), "utf-8");   } catch (IOException e) {  System.out.println("Error: " + e.getMessage());  e.printStackTrace();  } catch (DecodingFailedException dfe) {  System.out.println("Error: " + dfe.getMessage());  dfe.printStackTrace();  }  return content;  }  public static void main(String[] args) {  String imgPath = "D:/aaa/Michael_QRCode.png";  String encoderContent = "http://xx.xx.xx.xx:8380/QrCodeLoginPro/Login.html";  TwoDimensionCode handler = new TwoDimensionCode();  handler.encoderQRCode(encoderContent, imgPath, "png");/*System.out.println("========encoder success");  String decoderContent = handler.decoderQRCode(imgPath);  System.out.println("解析结果如下:");  System.out.println(decoderContent);  System.out.println("========decoder success!!!");  */}  
}  
复制代码
复制代码
package cn.kuwo.util;import java.awt.image.BufferedImage;  
import jp.sourceforge.qrcode.data.QRCodeImage;  public class TwoDimensionCodeImage implements QRCodeImage {  BufferedImage bufImg;  public TwoDimensionCodeImage(BufferedImage bufImg) {  this.bufImg = bufImg;  }  @Override  public int getHeight() {  return bufImg.getHeight();  }  @Override  public int getPixel(int x, int y) {  return bufImg.getRGB(x, y);  }  @Override  public int getWidth() {  return bufImg.getWidth();  }  }  
复制代码

 

 

 

 

 

 

 

cn.kuwo.vo下的2个数据层

复制代码
package cn.kuwo.vo;import java.util.HashMap;public class LoginUserVo {private static HashMap<String, UserVo> loginUserMap = new HashMap<String, UserVo>();private static LoginUserVo loginUserVo;public static LoginUserVo getVo(){if(loginUserVo == null){loginUserVo = new LoginUserVo();}return loginUserVo;}public static HashMap<String, UserVo> getLoginUserMap() {return loginUserMap;}
}
复制代码
复制代码
package cn.kuwo.vo;public class UserVo {private String uname;private String upwd;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;}
}
复制代码

 

 

 

 

 

 

2个网页

复制代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<script type="text/javascript" src="js/jquery-1.11.0.min.js"></script>
<body><div id="divCon"><img src="" id="QrCodeImg" /></div>
</body>
<script type="text/javascript">$(document).ready(function() {var uuid;$.get("/QrCodeLoginPro/GetQrCodeServlet", function(data, status) {var obj = eval("(" + data + ")");//存储UUIDuuid = obj.uuid;//显示二维码$("#QrCodeImg").attr("src", obj.qrCodeImg);//开始验证登录
            validateLogin();});function validateLogin(){$.get("/QrCodeLoginPro/LongConnectionCheckServlet?uuid=" + uuid , function(data, status) {if(data == ""){validateLogin();}else{var obj = eval("(" + data + ")");alert("登录成功了:" + obj.uname);}});}});
</script>
</html>
复制代码

 

复制代码
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<style>
.l_m_l {float: left;font-size: 14px;padding: 5px 0 0 0;width: 330px;color: #414141;
}.l_m_linput {height: 31px;position: relative;width: 300px;margin-bottom: 21px;
}.l_m_linput span {float: left;width: 78px;text-align: right;line-height: 31px;
}input {float: left;width: 195px;height: 24px;line-height: 24px;background: #f2f2f2;border: 1px solid #c4c4c4;padding: 2px 22px 2px 2px;
}.l_mimacon {position: absolute;top: 6px;right: 6px;width: 15px;height: 17px;background: url(img/l_mimacon.png)no-repeat;
}.l_peoplecon {position: absolute;top: 7px;right: 6px;width: 15px;height: 15px;background: url(img/l_peoplecon.png)no-repeat;
}.l_m_lload a {display: block;width: 154px;height: 40px;background:url(img/l_loadingbtn.png)no-repeat;margin: 0 auto;line-height: 40px;text-align: center;font-size: 18px;color: #52340c;text-decoration: none;
}
</style>
<script type="text/javascript" src="js/jquery-1.11.0.min.js"></script>
<body style="background-color: #333333"><div style="margin-left: 100px;"><img src="img/logo.png" /></div><div class="l_m_l"><p class="l_m_linput"><span><font color="#fff">用户名:</font></span><input type="text" id="login_name" value="zijuntang"><emclass="l_peoplecon"></em></p><p class="l_m_linput"><span><font color="#fff">密码:</font></span><input type="password" id="login_psw" value="xxxxxxxxx"><emclass="l_mimacon"></em></p><div class="l_m_linput2"></div><div class="l_m_lload"><a href="javascript:login();">登录</a></div></div>
</body>
<script type="text/javascript">//登录
    function login(){$.post("/QrCodeLoginPro/PhoneLoginServlet", {uuid : $.getUrlParam('uuid'),uname:$("#login_name").val(),upwd:$("#login_psw").val()}, function(data, status) {if(data == ""){alert("登录失败");}else{alert("登录成功");}});}//获取网页参数
    (function($){$.getUrlParam = function(name){var reg = new RegExp("(^|&)"+ name +"=([^&]*)(&|$)");var r = window.location.search.substr(1).match(reg);if (r!=null) return unescape(r[2]); return null;}})(jQuery);
</script>
</html>
复制代码

 

 

 

 

web.xml配置文件

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://java.sun.com/xml/ns/javaee"xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"id="WebApp_ID" version="2.5"><display-name>QrCodeLoginPro</display-name><welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list><servlet><description></description><display-name>长连接检查登录状态</display-name><servlet-name>LongConnectionCheckServlet</servlet-name><servlet-class>cn.kuwo.LongConnectionCheckServlet</servlet-class></servlet><servlet-mapping><servlet-name>LongConnectionCheckServlet</servlet-name><url-pattern>/LongConnectionCheckServlet</url-pattern></servlet-mapping><servlet><description>获取二维码图片以及uuid</description><display-name>GetQrCodeServlet</display-name><servlet-name>GetQrCodeServlet</servlet-name><servlet-class>cn.kuwo.GetQrCodeServlet</servlet-class></servlet><servlet-mapping><servlet-name>GetQrCodeServlet</servlet-name><url-pattern>/GetQrCodeServlet</url-pattern></servlet-mapping><servlet><description>手机扫描二维码之后进行登录</description><display-name>PhoneLoginServlet</display-name><servlet-name>PhoneLoginServlet</servlet-name><servlet-class>cn.kuwo.PhoneLoginServlet</servlet-class></servlet><servlet-mapping><servlet-name>PhoneLoginServlet</servlet-name><url-pattern>/PhoneLoginServlet</url-pattern></servlet-mapping>
</web-app>
复制代码

 

 

此外还需要1个二维码开源包:QRCode.jar

源码下载:http://files.cnblogs.com/zijun/%E4%BA%8C%E7%BB%B4%E7%A0%81%E7%99%BB%E5%BD%95%E4%BE%8B%E5%AD%90.rar


http://chatgpt.dhexx.cn/article/ZkqBReXt.shtml

相关文章

扫码登录,背后是如何实现的?

引言 近年来&#xff0c;随着智能手机和移动支付的普及以及互联网应用的不断更新迭代&#xff0c;扫码登录已经成为了我们日常生活中非常普遍的登录方式。扫码登录能够迅速的成为我们各大网站常用的登录方式一定存在它的原因。 首先一个非常重要的原因&#xff0c;扫码登录还可…

网站实现微信扫码登录

网站实现微信扫码登录 1 准备工作1.1 申请网站应用 2 快速开始2.1 微信扫码登录流程说明2.2 生成微信二维码的两种方式2.2.1 微信提供的二维码生成URL2.2.2 将微信登录二维码内嵌到自己页面 2.3 系统微信扫码登录示例2.3.1 流程说明2.3.2 核心代码2.3.2.1 前端代码2.3.2.2 后端…

【一】微信公众号之扫码登录

微信公众号之扫码登录 ​ 原来公司的官网就支持账号密码、手机验证码、QQ扫码授权、微信扫码授权等多种登录方式。今天要分享的就是关于微信扫码授权登录的原理。 一、准备工作 使用的是微信登录功能实现的&#xff0c;需要先在微信开放平台注册开发者帐号&#xff0c;并拥有一…

公众号扫码登录

1.流程概述 1.1 申请公众号 1.2 创建带参数的公众号二维码&#xff0c;参数值为scen_id的值 1.3 微信基础配置接口编写&#xff0c;get方式的接口为微信测试接口&#xff0c;必须能正常访问&#xff0c;post方式的接口为扫码回调接口&#xff0c;从请求中获取微信返回的xml包…

二维码扫描登录,你必须知道的 3 件事!

作者 | 互联网平头哥 本文经授权转载自互联网平头哥&#xff08;ID&#xff1a;it_pingtouge&#xff09; 扫二维码登录现在比较常见&#xff0c;比如微信、支付宝等 PC 端登录&#xff0c;并且好像每款 APP 都支持扫码登录&#xff0c;不搞个扫码登录都不好意思。作为技术人员…

微信扫码登录实现

需求 使用微信扫码登录的授权方式登录系统 实现 此扫码登陆过程中使用了&#xff0c;微信开放平台&#xff08;需支付300开通开发者认证&#xff09;的网站应用实现的。 官方文档&#xff1a;https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wec…

web扫码登录

文章目录 需求流程交互流程服务交互流程 关键思路代码生成二维码&#xff0c;返回给PC展示轮询查询二维码状态APP扫码请求登录 总结 需求 pc端实现app扫码登录 流程 交互流程 服务交互流程 关键思路 主要问题在于如何识别APP端用户&#xff0c;然后传递给PC端已经登录成功 …

开放平台–扫描微信二维码登录

准备 如不了解第三方登录流程&#xff0c;建议先大概了解一下&#xff0c;在来看看代码。 说明&#xff1a; 由于开放平台无测试号测试&#xff0c;所以只能上开放平台进行配置信息。公众平台的测试号并不能给开放平台使用。 微信开放平台地址&#xff1a;https://open.weixi…

二维码登陆

上一段时间研究微信公共账号,发现微信提供了一个扫码登陆验证的功能。近期头痛于经常忘记用户名密码,因此考虑是否可以结合这个功能,完成免密码登陆。百度后发现&#xff0c;有很多仁兄已经做过类似的功能了。 如这篇文章: 实现网站二维码扫描登录 仔细研究后&#xff0c;发现很…

二维码登录(三)扫码登录

承接上篇博客&#xff0c;在进行二维码生成之后&#xff0c;app进行扫码&#xff0c;扫码成功之后&#xff0c;手机点击登录&#xff0c;进行绑定登录关系&#xff0c;后台做自动关联与自动登录。 本文git地址&#xff1a;https://github.com/xvshu/qrlogin 1&#xff0c;扫码…

微信扫码登陆(1)---扫码登录流程讲解、获取授权登陆二维码

扫码登录流程讲解、获取授权登陆二维码 具体流程可以看微信官网的扫码登录文档 地址&#xff1a;准备工作 | 微信开放文档 其实官方文档已经讲的非常清楚而且讲的也很明白。 一、扫码登录流程讲解 1、首先准备工作 网站应用微信登录是基于OAuth2.0协议标准构建的微信OAut…

二维码扫码登录

项目结构 模块介绍 流程1 pc端&#xff1a;1:打开二维码登录网页index.html2:index.html调用GetQrCodeServlet3:GetQrCodeServlet干2件事 a:生成随机的uuid,是一个唯一标识&#xff0c;该标识贯穿整个流程 b:生成二维码图片&#xff0c;二维码信息&#xff1a;http://60.2…

扫码登录详解

目录 扫码流程分析 流程详解 步骤一&#xff1a;PC端准备二维码 步骤三&#xff1a;状态确认 token认证机制 扫码流程分析 1.扫码前&#xff0c;手机端已经是登陆状态&#xff0c;PC端显示一个二维码&#xff0c;等待扫描。 2.手机端打开应用&#xff0c;扫描PC端的二维码…

新增商品

1、在http代理设置&#xff0c;添加过滤参数&#xff1a; .*pusher\.*\/websocket.* .*/venilog/log/one .*\.(bmp|css|js|gif|ico|jpe?g|png|swf|woff) .*pusher\/info.* 2、启动http代理设置&#xff0c;录制脚本&#xff0c;将登陆和发布商品的脚本修改成’登陆‘&#x…

自定义商品分类,选择分类之后,添加商品附属性;仿淘宝后台添加商品附属性的价格和数量

效果图&#xff08;图片较大&#xff0c;加载较慢&#xff09; 页面部分&#xff1a; <div class"layui-form-item" id"add_attribute"><label class"layui-form-label">商品分类</label><div class"layui-input-i…

javaScript原生版购物车:全选、单选、全删、商品数量增减、计算总价、添加商品(代码)

题目&#xff1a; CSS代码如下&#xff1a; <style> *{ margin: 0px; padding: 0px; } .header,.content,.floot{ width: 800px; margin:0px auto; } .header ul li,.content ul li{ float: left; list-style: none; width: 100px; line-height: 100px; text-align: cen…

商品管理的新增

实现的功能如下&#xff1a; 点击新增弹出新增模态框通过下拉框绑定商品类别和商品单位保存新增 主要代码&#xff1a; 以上就是我的分享&#xff0c;如果有更好的方法或不懂得地方欢迎在评论区教导和提问喔&#xff01;

案例:实现在购物车中添加商品和删除购物车中指定商品的功能

一、向购物车中添加商品 1.1.创建AddCartServlet public class AddCartServlet extends HttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {doPost(request, response);}SuppressWarnings(&q…

14.商品添加功能

商品用例的bean层 添加商品的用例实现首先要有封装商品的bean&#xff0c;还要有封装商品种类的bean。 封装商品种类的bean package cn.bingou.domain;/*** 商品种类的bean* author 吹静静**/ public class ProdCategory {private int id;private String cname;public ProdCate…

二十三、商城 - 商品录入-新增商品(11)

目录 &#x1f33b;&#x1f33b; 一、商品录入【选择商品分类】1.1 需求分析1.2 准备工作1.3 代码实现1.3.1 一级分类下拉选择框1.3.2 二级分类下拉选择框1.3.3 三级分类下拉选择框1.3.4 读取模板ID 二、商品录入【品牌选择】2.1 需求分析2.2 代码实现 三、商品录入【扩展属性…