最新web/java/jsp实现发送手机短信验证码和邮箱验证码的注册登录功能(详细) 您所在的位置:网站首页 java如何实现短信验证 最新web/java/jsp实现发送手机短信验证码和邮箱验证码的注册登录功能(详细)

最新web/java/jsp实现发送手机短信验证码和邮箱验证码的注册登录功能(详细)

2023-08-11 04:30| 来源: 网络整理| 查看: 265

最新web/java/jsp实现发送手机短信验证码和邮箱验证码的注册登录功能(详细)

最近几天有人需要帮忙做一个关于发送验证码的功能,之前没有做过,于是我鼓捣一阵子,记录一下关于web项目中注册登录常用的手机验证码和邮箱验证码的发送。

作为一个演示项目,我没有使用任何框架,用了一个简单的jsp+Servlet,当然用boostrap美化了一下。代码带有注释,非常简单易懂。

一、手机验证码

由于手机短信属于增值业务,那么一般来说都是需要一些资金的。毕竟短信费是花钱的!所以一般来说都是调用第三方API来支持。

1.1、API申请

我们使用的API平台是:秒滴短信平台,

为啥用这个呢?因为他好?不一定,主要是因为他注册免费先送10块钱。做个测试功能足够了。

废话不多说,网站自行注册然后登录: 在这里插入图片描述

然后在开发者信息里面获得你自己的AUTH_TOKEN:记录一下API需要的东西 在这里插入图片描述

1.2、在配置管理中新建一个模板

这个模板就是发送验证码的模板。 在这里插入图片描述

1.3、自定义短信就要认证

注意了!

这个地方有个难处,就是必须认证以后才能发生自定义的短信内容。 我要发自定义的,所以我要认证。认证是需要公司营业执照的。 在这里插入图片描述 (太麻烦?自己搞定不了?实际上很简单,私信我,我有妙招)

看一下API接口要求: 验证码通知短信接口说明

主要的是这里: 在这里插入图片描述

反正完成了整个第三方平台的API接口以后。

1.4、编写java手机短信发送代码

我们就可以开始建项目,写代码了。 新建项目什么的我都懒得说了,能做这个功能的这些都是小事情了。

看一下我的项目结构吧: 在这里插入图片描述 直接上代码了,注释都写在里面了。 为了方便理解,我们倒过来写。

新建login.jsp:

源码:

手机登录 #login { width: 450px; height: 100px; margin: 126px auto; } #btn { margin-left: 100px; margin-top: -25px; width: 120px; height: 25px; font-size: 11px; } body { background-color: #ecfcf9; } var InterValObj; //timer变量,控制时间 var count = 60; //间隔函数,1秒执行 var curCount;//当前剩余秒数 function sendMessage() { curCount = count; $("#btn").attr("disabled", "true"); $("#btn").val(curCount + "秒后可重新发送"); InterValObj = window.setInterval(SetRemainTime, 1000); //启动计时器,1秒执行一次请求后台发送验证码 TODO } //timer处理函数 function SetRemainTime() { if (curCount == 0) { window.clearInterval(InterValObj);//停止计时器 $("#btn").removeAttr("disabled");//启用按钮 $("#btn").val("重新发送验证码"); } else { curCount--; $("#btn").val(curCount + "秒后可重新发送"); } } 用户登录 手机号 验证码 手机号登录 邮箱注册 var sms = ""; $("#btn").click(function() { var phone = $("#phone").val(); if (phone != "") { $.ajax({ url : "sendSMS", //发送请求 type : "post", data : { "phone" : phone }, success : function(result) { sms = result; } }); } else { alert("请输入手机号"); return false; } }); $("#lo").click(function() { var code = $("#code").val(); if (code == "") { alert("请输入验证码"); } else { if (sms == code) { window.location.href = "success.jsp"; } else { alert("验证码错误"); } ; } ; });

根据ajax,我们 点击发送以后,会url : “sendSMS”, 发送请求到 sendSMS。

新建servlet类:

sendSMS.java:

package com.zout.controller; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.zout.util.GetMessageCode; /** * *@class_name:SendSms *@comments:登录 -发送手机短信验证码 *@param:phone *@return: code *@author:邹涛/Zoutao *@createtime:2019年2月23日 */ @WebServlet("/sendSMS") public class SendSms extends HttpServlet { /** serialVersionUID*/ private static final long serialVersionUID = 1L; @Override public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { String phone=req.getParameter("phone"); //根据获取到的手机号发送验证码 String code = GetMessageCode.getCode(phone); System.out.println(code); resp.getWriter().print(code); } }

在servlet当中我们调用GetMessageCode.getCode的方法,来发送短信。

新建GetMessageCode.java:

源码:

package com.zout.util; import java.net.URLEncoder import com.alibaba.fastjson.JSONObject; import com.zout.common.Config; import com.zout.common.HttpUtil; /** * *@class_name:GetMessageCode *@comments:调用手机短信API *@param:phone *@return: String *@author:邹涛/Zoutao *@createtime:2019年2月22日 */ public class GetMessageCode { private static String operation = "/industrySMS/sendSMS";//对应的API地址 private static String accountSid = Config.ACCOUNT_SID; private static String to = "17121192629"; //改由前台传入 private static String rod=smsCode(); //生成一个随机验证码 private static String smsContent = "【柒晓白网络科技】您的验证码:"+rod+",如非本人操作,请忽略此短信。"; //创建验证码 public static String smsCode(){ String random=(int)((Math.random()*9+1)*100000)+""; System.out.print("random验证码:"+random); return random; } //根据相应的手机号发送验证码 public static String getCode(String phone){ String tmpSmsContent = null; try{ tmpSmsContent = URLEncoder.encode(smsContent, "UTF-8"); }catch(Exception e){ e.getMessage(); } String url = Config.BASE_URL + operation; String body = "accountSid=" + accountSid + "&to=" + phone + "&smsContent=" + tmpSmsContent + HttpUtil.createCommonParam(); // 提交请求 String result = HttpUtil.post(url, body); //(换行符) 剔除了平台无关性 System.out.println("result:" + System.lineSeparator() + result); System.out.println(result.getClass()); //字符串转json对象 JSONObject jsonObject = JSONObject.parseObject(result); String respCode = jsonObject.getString("respCode"); System.out.println(respCode); //反馈-00000状态码标识请求成功, String defaultRespCode="00000"; if(defaultRespCode.equals(respCode)){ return rod; }else{ return defaultRespCode; } } }

注意: 在GetMessageCode类中,把smsContent改为你自己在平台上面建立的模板的样式,这里必须一致。

还有json是用的:import com.alibaba.fastjson.JSONObject; 阿里巴巴的jar包。

新建Config配置类

在com.zout.common包中新建Config.java: 源码:

package com.zout.common; /** * *@class_name:Config *@comments:系统常量 *@param:自主填写API的授权码等信息 *@return: String *@author:邹涛/Zoutao *@createtime:2019年2月23日 */ public class Config { /** * url前半部分 */ public static final String BASE_URL = "https://api.miaodiyun.com/20150822"; /** * 开发者注册后系统自动生成的账号,可在官网登录后查看-修改为自己的。 */ public static final String ACCOUNT_SID = "b38529a662bd4你自己的800f140"; /** * 开发者注册后系统自动生成的TOKEN,可在官网登录后查看-修改为自己的。 */ public static final String AUTH_TOKEN = "568ce19f6958467你自己的5080906341ae"; /** * 响应数据类型, JSON或XML */ public static final String RESP_DATA_TYPE = "json"; }

我标注的地方改成你自己的,(ACCOUNT_SID和AUTH_TOKEN)最好就改这两个就好了。去官网查询到自己的。上面有写。

新建HttpUtil请求类

在com.zout.common包中新建 HttpUtil.java 源码:

package com.zout.common; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.URL; import java.net.URLConnection; import java.text.SimpleDateFormat; import java.util.Date; import org.apache.commons.codec.digest.DigestUtils; /** * *@class_name:HttpUtil *@comments:http请求工具 *@param: 根据官网的API要求构建请求URL结构 *@return: String结构 *@author:邹涛/Zoutao *@createtime:2019年2月23日 */ public class HttpUtil { /** * 构造通用参数timestamp、sig和respDataType * * @return */ public static String createCommonParam() { // 时间戳 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); String timestamp = sdf.format(new Date()); // 签名 String sig = DigestUtils.md5Hex(Config.ACCOUNT_SID + Config.AUTH_TOKEN + timestamp); return "×tamp=" + timestamp + "&sig=" + sig + "&respDataType=" + Config.RESP_DATA_TYPE; } /** * post请求 * * @param url * 功能和操作 * @param body * 要post的数据 * @return * @throws IOException */ public static String post(String url, String body) { System.out.println("url:" + System.lineSeparator() + url); System.out.println("body:" + System.lineSeparator() + body); String result = ""; try { OutputStreamWriter out = null; BufferedReader in = null; URL realUrl = new URL(url); URLConnection conn = realUrl.openConnection(); // 设置连接参数 conn.setDoOutput(true); conn.setDoInput(true); conn.setConnectTimeout(5000); conn.setReadTimeout(20000); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // 提交数据 out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); out.write(body); out.flush(); // 读取返回数据 in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); String line = ""; boolean firstLine = true; // 读第一行不加换行符 while ((line = in.readLine()) != null) { if (firstLine) { firstLine = false; } else { result += System.lineSeparator(); } result += line; } } catch (Exception e) { e.printStackTrace(); } return result; } /** * 回调测试工具方法 * * @param url * @param reqStr * @return */ public static String postHuiDiao(String url, String body) { String result = ""; try { OutputStreamWriter out = null; BufferedReader in = null; URL realUrl = new URL(url); URLConnection conn = realUrl.openConnection(); // 设置连接参数 conn.setDoOutput(true); conn.setDoInput(true); conn.setConnectTimeout(5000); conn.setReadTimeout(20000); // 提交数据 out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); out.write(body); out.flush(); // 读取返回数据 in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8")); String line = ""; boolean firstLine = true; // 读第一行不加换行符 while ((line = in.readLine()) != null) { if (firstLine) { firstLine = false; } else { result += System.lineSeparator(); } result += line; } } catch (Exception e) { e.printStackTrace(); } return result; } }

这个实际上就是要构建上面所写的API的请求体的方式。 必须按照人家官网的要求来,不然就接收不到你的短信发送请求。

对了,顺便在建立两个jsp文件:分别是fail.jsp和success.jsp,里面没有啥内容,就是标志一个成功一个失败即可。

上面就完成了整个手机短信发送的请求,于是我们在tomcat里面运行项目,看看: 浏览器输入:http://localhost:8080/EmailAndPhone/

手机验证码发送效果图:

输入手机号: 在这里插入图片描述点击发送。

后台: 在这里插入图片描述

手机接收短信: 在这里插入图片描述

先输入错误的: 在这里插入图片描述

在输入正确的:

在这里插入图片描述 点击登录: 在这里插入图片描述 你可以在秒滴登录自己的账号,然后查看发送状态: 在这里插入图片描述

这就完成了一个手机验证码短信的发送过程。接下来是邮箱验证码的发送。 (提醒:一个手机号码一小时之类不能重复请求4次,你可以换号码来测试,注意看后台返回状态即可。)

二、邮箱验证码

在163和qq邮箱发送邮件之间,QQ比较难一些,所我们采用QQ邮箱来做。

2.1、开启POP3/SMTP协议

做这些之前,先要去QQ邮箱里帐号设置要开启POP3/SMTP协议。 在这里插入图片描述 选择账户,然后找到下面的地方,开启: 在这里插入图片描述

开启的时候,会给你一个java邮箱的授权码,你记得记录一下。网易同样道理。 比如我的:

成功开启POP3/SMTP服务: prktbfsmxxxxxj成功开启IMAP/SMTP服务: ehqvnfayxxxxxdf

由于java发送邮件这个功能比较简单,我们写一个java版和一个web版本来方便使用。

2.2、java版发送邮件:

在com.zout.util;包下新建一个Mail_java.java类来测试: 需要注意一点就是,在QQ中要求 开启SSL证书加密,否则会失败。

Mail_java.java:

package com.zout.util; import java.util.Properties; import javax.mail.Message; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; import com.sun.mail.util.MailSSLSocketFactory; /** * JavaMail发送邮件: java版本-与web无关 * 前提是QQ邮箱里帐号设置要开启POP3/SMTP协议 * * */ public class Mail_java { public static void main(String[] args) throws Exception { Properties prop = new Properties(); // 开启debug调试,以便在控制台查看 prop.setProperty("mail.debug", "true"); // 设置邮件服务器主机名 prop.setProperty("mail.host", "smtp.qq.com"); // 发送服务器需要身份验证 prop.setProperty("mail.smtp.auth", "true"); // 发送邮件协议名称 prop.setProperty("mail.transport.protocol", "smtp"); // 开启SSL加密,否则会失败 MailSSLSocketFactory sf = new MailSSLSocketFactory(); sf.setTrustAllHosts(true); prop.put("mail.smtp.ssl.enable", "true"); prop.put("mail.smtp.ssl.socketFactory", sf); // 创建session Session session = Session.getInstance(prop); // 通过session得到transport对象 Transport ts = session.getTransport(); // 连接邮件服务器:邮箱类型,帐号,POP3/SMTP协议授权码 163使用:smtp.163.com ts.connect("smtp.qq.com", "你自己的QQ", "prktbfsmrjhvbajj"); // 创建邮件 Message message = createSimpleMail(session); // 发送邮件 ts.sendMessage(message, message.getAllRecipients()); ts.close(); } /** * @Method: createSimpleMail * @Description: 创建一封只包含文本的邮件 */ public static MimeMessage createSimpleMail(Session session) throws Exception { // 获取6为随机验证码 String[] letters = new String[] { "q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m", "A","W","E","R","T","Y","U","I","O","P","A","S","D","F","G","H","J","K","L","Z","X","C","V","B","N","M", "0","1","2","3","4","5","6","7","8","9"}; String stringBuilder =""; for (int i = 0; i width: 450px; height: 100px; margin: 50px auto; } #btn { margin-left: 197px; margin-top: -24px; width: 120px; height: 25px; font-size: 14px; color: #7904c9 } body { background-color: #ecfcf9; } $(function(){ $("#btn").click(function(){ if($("#email").val()){ $.ajax({ type:"POST", url :"SendEmailServlet?random"+Math.random(), data:{ email:$("#email").val(), }, success:function(data){ alert("验证码发送成功,请注意查收。"); }, }) }else{ alert("邮箱发送失败"); $("#notice").html("请填写邮箱"); setTimeout(function(){ $("#notice").hide(); },1000); } } ); // 判断用户是否可以注册 $("#submit").click(function() { if ($("#email").val()) { $("#RegistForm").submit(); } else { // 如果没有值 $("#notice").html("请填写完整信息"); setTimeout(function() { $("#notice").hide(); }, 1000); } }); }); 用户注册 账号 密码 邮箱 验证码 请先完成邮箱验证 返回登录

根据上面,我们点击发送验证码的时候,会请求:SendEmailServlet。

新建SendEmailServlet

于是新建一个SendEmailServlet.java:

package com.zout.controller; import java.io.IOException; import java.util.Properties; import javax.mail.Session; import javax.mail.Transport; import javax.mail.internet.MimeMessage; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.zout.util.JavaMailUtil; import com.zout.util.RandomUtil; import com.zout.util.htmlText; /** * *@class_name:SendEmailServlet *@comments:注册- 发送邮箱验证码功能 *@param: *@return: *@author:邹涛/Zoutao *@createtime:2019年2月22日 */ @WebServlet("/SendEmailServlet") public class SendEmailServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("邮箱发送功能"); try { String email = req.getParameter("email"); JavaMailUtil.receiveMailAccount = email; // 给用户输入的邮箱发送邮件 // 1、创建参数配置,用于连接邮箱服务器的参数配置 Properties props = new Properties(); // 开启debug调试 props.setProperty("mail.debug", "true"); // 发送服务器需要身份验证 props.setProperty("mail.smtp.auth", "true"); // 设置右键服务器的主机名 props.setProperty("mail.host", JavaMailUtil.emailSMTPHost); // 发送邮件协议名称 props.setProperty("mail.transport.protocol", "smtp"); // 2、根据配置创建会话对象,用于和邮件服务器交互 Session session = Session.getInstance(props); // 设置debug,可以查看详细的发送log session.setDebug(true); // 3、创建一封邮件 String code = RandomUtil.getRandom(); System.out.println("邮箱验证码:" + code); String html = htmlText.html(code); MimeMessage message = JavaMailUtil.creatMimeMessage(session, JavaMailUtil.emailAccount, JavaMailUtil.receiveMailAccount, html); // 4、根据session获取邮件传输对象 Transport transport = session.getTransport(); // 5、使用邮箱账号和密码连接邮箱服务器emailAccount必须与message中的发件人邮箱一致,否则报错 transport.connect(JavaMailUtil.emailAccount, JavaMailUtil.emailPassword); // 6、发送邮件,发送所有收件人地址 transport.sendMessage(message, message.getAllRecipients()); // 7、关闭连接 transport.close(); // 写入session req.getSession().setAttribute("code", code); } catch (Exception e) { e.printStackTrace(); req.getSession().setAttribute("error", "邮件发送失败"); } } }

需要用到servlet的jar包哟,你有tomcat就会自动导入进去。

当中用到三个工具类,新建工具类。

新建工具类JavaMailUtil

在com.zout.util包下新建

JavaMailUtil.java

package com.zout.util; import java.io.IOException; import java.util.Date; import javax.mail.MessagingException; import javax.mail.Session; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeMessage; /** * *@class_name:JavaMailUtil *@comments:定义邮箱发送配置接口 *@param:web版本 *@return: *@author:邹涛/Zoutao *@createtime:2019年2月23日 */ public class JavaMailUtil { // 发件人的邮箱-修改为自己的 public static String emailAccount = "你自己的@qq.com"; // 发件人邮箱授权码-修改为自己的 public static String emailPassword = "prktbf你自己vbajj"; // 发件人邮箱服务地址-修改为自己的 public static String emailSMTPHost = "smtp.qq.com"; // 收件人邮箱 public static String receiveMailAccount = ""; /** * 创建一封邮件(发件人、收件人、邮件内容) * @param session * @param sendMail * @param receiveMail * @param html * @return * @throws MessagingException * @throws IOException * cc:抄送 * Bcc:密送 * To:发送 */ public static MimeMessage creatMimeMessage(Session session,String sendMail,String receiveMail,String html) throws MessagingException, IOException { // 1、创建一封邮件对象 MimeMessage message = new MimeMessage(session); // 2、From:发件人 message.setFrom(new InternetAddress(sendMail, "发件人昵称", "UTF-8")); // 3、To:收件人(可以增加多个收件人:抄送或者密送) message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(receiveMail, "张三", "UTF-8")); // 4、Subject:邮件主题 message.setSubject("邮箱验证","UTF-8"); // 5、Content:邮件正文(可以使用Html标签) message.setContent(html,"text/html;charset=UTF-8"); // 6、设置发送时间 message.setSentDate(new Date()); // 7、保存设置 message.saveChanges(); // 8、将该邮件保存在本地 //OutputStream out = new FileOutputStream("D://MyEmail" + UUID.randomUUID().toString() + ".eml"); //message.writeTo(out); //out.flush(); //out.close(); return message; } }

把对应地方改为你自己的。

新建RandomUtil工具类

在com.zout.util包下新建RandomUtil;

RandomUtil.java:

package com.zout.util; /** * *@class_name:RandomUtil *@comments:生成随机6位数验证码 *@param: *@return: *@author:邹涛/Zoutao *@createtime:2019年2月23日 */ public class RandomUtil { public static void main(String[] args) { // 控制台打印 System.out.println(RandomUtil.getRandom()); } // 生成6位数随机验证码 public static String getRandom() { String[] letters = new String[] { "q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m", "A","W","E","R","T","Y","U","I","O","P","A","S","D","F","G","H","J","K","L","Z","X","C","V","B","N","M", "0","1","2","3","4","5","6","7","8","9"}; String code =""; for (int i = 0; i // 返回页面Html携带的6位随机码 public static String html(String code) { String html = "Email地址验证"+ "这封邮件是由【柒晓白网络科技】发送的。"+ "你收到这封邮件是【柒晓白网络科技】进行新用户注册或者用户修改Email使用这个地址。"+ "账号激活声明"+ "请将下面的验证码输入到提示框即可:" + code + ""; return html; } }

这就完成了邮件发送的功能。

然后我们还需要注册接收的servlet。 因为在jsp当中,点击注册的时候,发请求:RegistServlet。 新建一个servlet类: RegistServlet.java

package com.zout.controller; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * *@class_name:RegistServlet *@comments: 注册请求处理 *@param:验证码校验 *@return: jsp跳转 *@author:邹涛/Zoutao *@createtime:2019年2月22日 */ @WebServlet("/RegistServlet") public class RegistServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取session中的验证码 String sessionCode = (String) req.getSession().getAttribute("code"); System.out.println(sessionCode); if(sessionCode != null) { // 获取页面提交的验证码 String inputCode = req.getParameter("code"); System.out.println("页面提交的验证码:" + inputCode); if (sessionCode.toLowerCase().equals(inputCode.toLowerCase())) { String username = req.getParameter("username"); String password = req.getParameter("password"); System.out.println("页面提交:" + username+password); // 验证成功,跳转成功页面 req.setAttribute("username", username); req.getRequestDispatcher("/success.jsp").forward(req, resp); }else { // 验证失败 req.getRequestDispatcher("fail.jsp").forward(req, resp); } }else { // 验证失败 req.getRequestDispatcher("fail.jsp").forward(req, resp); } // 移除session中的验证码 req.removeAttribute("code"); } }

接收一下注册请求,然后跳转到指定页面。

好了整个邮箱注册已经完成。开始运行我们的项目了。

浏览器输入:http://localhost:8080/EmailAndPhone/register.jsp

邮箱发送效果图:

输入邮箱地址:

带有校验,如果邮箱不是带有@符号,则出现错误提示。

在这里插入图片描述 点击发送验证码。

后台:

在这里插入图片描述邮箱里面查看验证码: 在这里插入图片描述

输入错误的验证码就会提示错误,输入正确的就会跳转到成功页面。 在这里插入图片描述

好了,上诉就是整个关于最新web/java/jsp实现发送手机短信验证码和邮箱验证码的注册登录功能的过程了。

总结一下,其中需要导入对应的jar包(ali的json,java的email,activation-1.1.1.jar),boostrap的css,js,和juqery的js。这些都是网上可以下载的。你可以自己下载。

如图: 在这里插入图片描述

boostrap组件:

在这里插入图片描述

最后贴出整个项目的源码包下载地址:源码

没有积分,点个关注留下邮箱,我发给你。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有