当前位置: 首页 > news >正文

springboot如何发送邮件,java如何发送邮件随机码作为验证

maven

        <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version></dependency>

然后java

package com.metasoft.common.utils;import java.util.Properties;import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;public final class JavaMailUntil {private JavaMailUntil() {}public static Session createSession() {//	账号信息String username = "skin_2023@qq.com";//	邮箱发送账号String password = "uncinojcclesurcdbb";//	邮箱授权码//	创建一个配置文件,并保存Properties props = new Properties();//	SMTP服务器连接信息//  126——smtp.126.com//  163——smtp.163.com//  qqsmtp.qq.com"props.put("mail.smtp.host", "smtp.qq.com");//	SMTP主机名props.put("mail.smtp.ssl.enable", "true");//  126——25//  163——645props.put("mail.smtp.port", "465");//	主机端口号props.put("mail.smtp.auth", "true");//	是否需要用户认证props.put("mail.smtp.starttls.enale", "true");//	启用TlS加密Session session = Session.getInstance(props,new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {// TODO Auto-generated method stubreturn new PasswordAuthentication(username,password);}});//  控制台打印调试信息session.setDebug(true);return session;}//正则验证// 验证邮箱地址是否合法public static boolean isValidEmailAddress(String email) {String emailRegex = "^[a-zA-Z0-9_+&*-]+(?:\\.[a-zA-Z0-9_+&*-]+)*@(?:[a-zA-Z0-9-]+\\.)+[a-zA-Z]{2,7}$";return email.matches(emailRegex);}
}

然后就是业务层了,包含发送普通邮件,发送附件,发送图片邮件

/*** 发送邮件*/@PostMapping("/sendEmail")@ApiOperationSupport(order = 18)@ApiOperation(value = "发送激活邮件", notes = "传入id")public R sendEmail(String userIds) throws MessagingException {if (StringUtil.isBlank(userIds)) {return R.fail("请至少选择一个用户");}List<User> userList = userService.list(Wrappers.<User>lambdaQuery().in(User::getId, Func.toLongList(userIds)));//	创建Session会话Session session = JavaMailUntil.createSession();for (User user : userList) {String targetEmail = "";//优先判断user的account是不是邮箱地址,如果不是判断user的email是不是邮箱地址,如果也不是,直接抛出异常// 优先判断user的account是不是邮箱地址if (JavaMailUntil.isValidEmailAddress(user.getAccount())) {targetEmail = user.getAccount();} else {// 如果user的account不是邮箱地址,则判断user的email是不是邮箱地址if (JavaMailUntil.isValidEmailAddress(user.getEmail())) {targetEmail = user.getEmail();} else {// 如果都不是邮箱地址,直接跳过log.info("用户{}的email和account都不是邮箱地址", user.getId());continue;}}MimeMessage message = new MimeMessage(session);message.setSubject("邀请您激活账号");String activationLink = "http://localhost:2888/register?activationCode=" + UUID.randomUUID().toString();String emailContent = "" +"\n" +"感谢您的注册。\n" +"\n" +"您目前处于已完成临时注册的状态。\n" +"\n" +"如需完成注册,请点击以下URL。" + activationLink;//todo 后续改成线上地址message.setText(emailContent);message.setFrom(new InternetAddress("skins_2023@qq.com"));message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(targetEmail));Transport.send(message);}return R.success("操作成功");}/*** 发送邮件带附件*/@GetMapping("/sendEmailForFile")@ApiOperationSupport(order = 18)@ApiOperation(value = "发送邮件带附件", notes = "传入id")public R sendEmailForFile(String userIds) throws MessagingException {try {//	创建会话Session session = JavaMailUntil.createSession();//	创建邮件MimeMessage message = new MimeMessage(session);message.setFrom("发送的邮箱");message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("主要发送人邮箱"));message.setRecipients(MimeMessage.RecipientType.CC, new InternetAddress[] {new  InternetAddress("抄送人邮箱"),new InternetAddress("抄送人邮箱")});message.setSubject("主题");//	邮件主体BodyPart textPart = new MimeBodyPart();textPart.setContent("文件内容","text/html;charset=utf-8");//	邮件附件BodyPart filePart = new MimeBodyPart();filePart.setFileName("附件显示名字.类型名");//	提交附件文件filePart.setDataHandler(new DataHandler(new ByteArrayDataSource(Files.readAllBytes(Paths.get("本地文件路径")),"application/octet-stream")));Multipart multipart = new MimeMultipart();multipart.addBodyPart(textPart);multipart.addBodyPart(filePart);//	将邮件装入信封message.setContent(multipart);Transport.send(message);} catch (AddressException e) {e.printStackTrace();} catch (MessagingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return R.success("操作成功");}/*** 发送邮件带图片*/@GetMapping("/sendEmailForPhoto")@ApiOperationSupport(order = 18)@ApiOperation(value = "发送邮件带图片", notes = "传入id")public R sendEmailForPhoto(String userIds) throws MessagingException {try {//	创建会话Session session = JavaMailUntil.createSession();//	创建邮件MimeMessage message = new MimeMessage(session);message.setFrom("发送的邮箱");message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress("主要发送人邮箱"));message.setRecipients(MimeMessage.RecipientType.CC, new InternetAddress[] {new  InternetAddress("抄送人邮箱"),new InternetAddress("抄送人邮箱")});message.setSubject("主题");//	邮件主体BodyPart textPart = new MimeBodyPart();StringBuilder stringBuilder = new StringBuilder();stringBuilder.append("文字");stringBuilder.append("文字");stringBuilder.append("<img src=\"cid:自定义id\"/>");textPart.setContent(stringBuilder.toString(),"text/html;charset=utf-8");//	邮件附件BodyPart filePart = new MimeBodyPart();filePart.setFileName("图片名称.jpg");//	提交附件文件filePart.setDataHandler(new DataHandler(new ByteArrayDataSource(Files.readAllBytes(Paths.get("本地路径")),"application/octet-stream")));filePart.setHeader("Content-ID","自定义id");Multipart multipart = new MimeMultipart();multipart.addBodyPart(textPart);multipart.addBodyPart(filePart);//	将邮件装入信封message.setContent(multipart);Transport.send(message);} catch (AddressException e) {e.printStackTrace();} catch (MessagingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}return R.success("操作成功");}/*** 生成六位数随机验证码*/public String generateRandomCode() {Random random = new Random();int code = 100000 + random.nextInt(900000);return String.valueOf(code);}/*** 发送包含验证码的邮件*/@GetMapping("/sendVerificationCode")public R sendVerificationCode(@RequestParam("emailAddress") String emailAddress) throws MessagingException {//验证邮箱地址是否正确boolean isValid = JavaMailUntil.isValidEmailAddress(emailAddress);if (!isValid) {return R.fail("邮箱地址不正确");}String verificationCode = generateRandomCode();// 创建邮件内容String emailContent = "您的验证码是:" + verificationCode+"。请在注册或登录时使用。有效期为10分钟。";// 创建Session会话Session session = JavaMailUntil.createSession();// 创建邮件对象MimeMessage message = new MimeMessage(session);message.setSubject("密码重置验证码");message.setText(emailContent);message.setFrom(new InternetAddress("skins_2023@qq.com"));message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(emailAddress));// 发送Transport.send(message);//验证码存入redis中方便后续读取,有效期为十分钟bladeRedis.getRedisTemplate().opsForValue().set("verificationCode:" + emailAddress, verificationCode, 10, TimeUnit.MINUTES);return R.success("验证码已发送到您的邮箱,请查收!");}/*** 账号激活*/@PostMapping("/activateAccount")public R activateAccount(@RequestBody RegisterUserVO userVO) throws MessagingException {log.info(userVO.toString());return R.success("账号激活");}/*** 忘记密码-修改密码*/@PostMapping("/changePassword")public R changePassword(@RequestBody RegisterUserVO userVO) throws MessagingException {log.info(userVO.toString());//查询是否存在此邮箱的账号User user = userService.getOne(new QueryWrapper<User>().lambda().eq(User::getAccount, userVO.getUsername()));//如果查询不到用户,则返回错误信息if (user == null) {return R.fail("用户不存在");}//判断两次输入的密码是否一致if (!userVO.getPassword().equals(userVO.getPassword2())) {return R.fail("两次输入的密码不一致");}//判断验证码是否正确String verificationCode = (String)bladeRedis.getRedisTemplate().opsForValue().get("verificationCode:" + userVO.getUsername());if (!verificationCode.equals(userVO.getEmailCode())) {return R.fail("邮箱验证码错误");}// 修改密码userService.update(Wrappers.<User>update().lambda().set(User::getPassword, DigestUtil.hex(userVO.getPassword())).eq(User::getId, user.getId()));return R.success("密码修改成功");}}

顺便也发出我写的前端代码,vue

<template><div class="register-container" ref="register"><p style="line-height:150%; margin:50pt 0pt 20pt 50pt; text-align:center;"><span style="font-family:FZXiaoBiaoSong-B05S; font-size:26pt; display:inline-block;">重置密码</span></p><div class="register-form"><el-form :model="form" ref="form" :rules="rules" label-width="100px"><el-form-item label="登录邮箱" prop="username"><el-input v-model="form.username" placeholder="请输入邮箱"></el-input></el-form-item><el-form-item label="邮箱验证码" prop="emailCode"><el-input v-model="form.emailCode" placeholder="请输入邮箱验证码"></el-input><el-button type="primary" @click="sendEmailCode" :disabled="countDown > 0">{{ countDown > 0 ? countDown + '秒后重新发送' : '发送验证码' }}</el-button></el-form-item><el-form-item label="新密码" prop="password"><el-input type="password" v-model="form.password" placeholder="请输入新密码"></el-input></el-form-item><el-form-item label="确认新密码" prop="password2"><el-input type="password" v-model="form.password2" placeholder="请再次输入新密码"></el-input></el-form-item><el-form-item><el-button type="primary" @click="submitForm">提交</el-button></el-form-item></el-form></div></div>
</template><script>
import {changePassword, sendVerificationCode} from "@/api/register/register";
import md5 from 'js-md5';export default {data() {return {form: {username: '',emailCode: '',password: '',password2: '',},rules: {username: [{ required: true, message: '请输入邮箱', trigger: 'blur' },],emailCode: [{ required: true, message: '请输入邮箱验证码', trigger: 'blur' },],password: [{ required: true, message: '请输入密码', trigger: 'blur' },],password2: [{ required: true, message: '请再次输入密码', trigger: 'blur' },],},countDown: 0,};},methods: {sendEmailCode() {// 编写发送邮箱验证码的逻辑if (this.countDown === 0) {// 模拟发送验证码,实际开发中调用后端接口console.log('发送验证码');sendVerificationCode(this.form.username).then(res => {//如果res的状态码为200,表示发送成功if (res.status === 200) {this.$message.success('验证码发送成功');} else {this.$message.error('验证码发送失败');}});this.countDown = 60;const timer = setInterval(() => {if (this.countDown > 0) {this.countDown--;} else {clearInterval(timer);}}, 1000);}},submitForm() {console.log("要发送的信息====", this.form);//todo 后续对密码的安全性做处理this.form.password = md5(this.form.password);this.form.password2 = md5(this.form.password2);changePassword(this.form).then(res => {this.$message({ type: "success", message: "提交成功!" });this.resetForm();}, error => {this.$message({ type: "error", message: "提交失败,请重试!" });});},resetForm() {this.form = {username: '',emailCode: '',password: '',password2: '',};},},
};
</script><style scoped>
.register-container {text-align: center;
}.register-form {width: 400px;margin: 0 auto;
}.el-button {margin-left: 10px;
}.el-form-item__content {display: flex;
}.el-input {flex: 1;
}
</style>

这个就是重置密码 利用邮箱验证60秒的功能

相关文章:

springboot如何发送邮件,java如何发送邮件随机码作为验证

maven <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version></dependency> 然后java package com.metasoft.common.utils;import java.util.Properties;import javax.…...

使用QLoRA在自定义数据集上finetuning 大模型 LLAMA3 的数据比对分析

概述: 大型语言模型(LLM)展示了先进的功能和复杂的解决方案,使自然语言处理领域发生了革命性的变化。这些模型经过广泛的文本数据集训练,在文本生成、翻译、摘要和问答等任务中表现出色。尽管LLM具有强大的功能,但它可能并不总是与特定的任务或领域保持一致。 什么是LL…...

编译和链接(超详细)

✅博客主页:爆打维c-CSDN博客​​​​​​ &#x1f43e; &#x1f539;分享c语言知识及代码 一、编译和链接实例 假设我们有一个名为main.c的C语言源文件&#xff0c;它包含了一个简单的Hello World程序。我们可以使用gcc编译器对该源文件进行编译&#xff0c;生成一个可执行…...

Rust Turbofish 的由来

0x01 什么是 Turbofish 我们运行如下 Rust Snippet&#xff1a; fn main() {let numbers: Vec<i32> vec![1, 2, 3, 4, 5, 6, 7, 8, 9, 10];let even_numbers numbers.into_iter().filter(|n| n % 2 0).collect();println!("{:?}", even_numbers); }不出意…...

2.外卖点餐系统(Java项目 springboot)

目录 0.系统的受众说明 1.系统功能设计 2.系统结构设计 3.数据库设计 3.1实体ER图 3.2数据表 4.系统实现 4.1用户功能模块 4.2管理员功能模块 4.3商家功能模块 4.4用户前台功能模块 4.5骑手功能模块 5.相关说明 新鲜运行起来的项目&#xff1a;如需要源码数据库…...

Universal Thresholdizer:将多种密码学原语门限化

参考文献&#xff1a; [LS90] Lapidot D, Shamir A. Publicly verifiable non-interactive zero-knowledge proofs[C]//Advances in Cryptology-CRYPTO’90: Proceedings 10. Springer Berlin Heidelberg, 1991: 353-365.[Shoup00] Shoup V. Practical threshold signatures[C…...

【UE5学习笔记】编辑及运行界面:关闭眼部识别(自动曝光)

自动曝光&#xff0c;也就是走进一个黑暗的环境&#xff0c;画面会逐渐变量&#xff0c;以模拟人眼进入黑暗空间时瞳孔放大&#xff0c;进光量增加的一种真实视觉感受&#xff1a; 制作过程中是否关闭自动曝光&#xff0c;取决于游戏的性质&#xff0c;但是个人认为&#xff0c…...

未来科技的前沿:深入探讨人工智能的进展、机器学习技术和未来趋势

文章目录 一、人工智能的定义和概述1. 人工智能的基本概念2. 人工智能的发展历史 二、技术深入&#xff1a;机器学习、深度学习和神经网络1. 机器学习2. 深度学习3. 神经网络 三、人工智能的主要目标和功能1. 自动化和效率提升2. 决策支持和风险管理3. 个性化服务和预测未来 本…...

3-qt综合实例-贪吃蛇的游戏程序

引言&#xff1a; 如题&#xff0c;本次实践课程主要讲解贪吃蛇游戏程序。 qt贪吃蛇项目内容&#xff1a; 一、功能需求 二、界面设计 各组件使用&#xff1a; 对象名 类 说明 Widget QWidge 主窗体 btnRank QPushButton 排行榜-按钮 groupBox QGroupBox 难…...

QGraphicsView实现简易地图12『平移与偏移』

前文链接&#xff1a;QGraphicsView实现简易地图11『指定层级-定位坐标』 提供地图平移与偏移功能。地图平移是指将地图的中心点更改为给定的点&#xff0c;即移动地图到指定位置。地图偏移是指将当前视口内的地图向上/下/左/右/进行微调&#xff0c;这里偏移视口宽/高的四分之…...

深入探索 Vue 中的 createVNode 与 resolveComponent

在 Vue 开发中&#xff0c;createVNode和resolveComponent是两个至关重要的工具&#xff0c;它们为我们提供了强大的能力来灵活地创建和操控组件。 一、首先&#xff0c;让我们深入了解一下createVNode。 这是一个用于创建虚拟节点的关键函数&#xff0c;通过它&#xff0c;我…...

【记录42】centos 7.6安装nginx教程详细教程

环境&#xff1a;腾讯云centos7.6 需求&#xff1a;安装nginx-1.24.0 1. 切入home文件 cd home 2. 创建nginx文件 mkdir nginx 3. 切入nginx文件 cd nginx 4. 下载nginx安装包 wget https://nginx.org/download/nginx-1.24.0.tar.gz 5. 解压安装包 tar -zxvf nginx-1.24.0.…...

C语言程序设计(不熟悉的点)

一、switch多路分支语句 二、条件表达式 三、循环 for循环&#xff1a; for循环的三个表达式不是必须的&#xff0c;第一个表达式之前声明过&#xff0c;可以不写&#xff0c;第三个表达式可以放在循环体里面&#xff1b;第二个表达式可以不写&#xff0c;为死循环。 空循环…...

DAO是什么?有什么用途?

DAO&#xff08;Decentralized Autonomous Organization&#xff0c;去中心化自治组织&#xff09;是一种基于区块链技术的组织形式&#xff0c;它没有中央管理层&#xff0c;而是通过智能合约和区块链上的代码来运作。DAO 的决策过程是透明的&#xff0c;通常由组织的成员通过…...

Socket学习记录

本次学习Socket的编程开发&#xff0c;该技术在一些通讯软件&#xff0c;比如说微信&#xff0c;QQ等有广泛应用。 网络结构 这些都是计算机网络中的内容&#xff0c;我们在这里简单回顾一下&#xff1a; UDP(User Datagram Protocol):用户数据报协议;TCP(Transmission Contr…...

黑马 - websocket搭建在线聊天室

这里写自定义目录标题 一、消息推送常见方式二、websocket 是什么&#xff1f;三、websocket api的介绍1、客户端 &#xff08;浏览器&#xff09;2、服务端api 四、实现在线聊天室1、需求2、聊天室流程分析3、消息格式4、代码实现 一、消息推送常见方式 1、轮训方式 2、SSE…...

【每日力扣】543. 二叉树的直径与101. 对称二叉树

&#x1f525; 个人主页: 黑洞晓威 &#x1f600;你不必等到非常厉害&#xff0c;才敢开始&#xff0c;你需要开始&#xff0c;才会变的非常厉害 543. 二叉树的直径 给你一棵二叉树的根节点&#xff0c;返回该树的 直径 。 二叉树的 直径 是指树中任意两个节点之间最长路径的…...

【linux】——日志分析

1. 日志文件 1.1 日志文件的分类 日志文件&#xff1a; 是用于记录Linux系统中各种运行消息的文件&#xff0c;相当于Linux主机的“日记". 日志文件对于诊断和解决系统中的问题很有帮助&#xff0c;系统一旦出现问题时及时分析日志就会“有据可查”。此外。当主机遭受攻…...

【intro】GraphSAGE

论文 https://arxiv.org/pdf/1706.02216 abstract 大图中节点的低维embedding已经被证明在各种预测任务中非常有用&#xff0c;然而&#xff0c;大多数现有的方法要求在embedding训练期间图中的所有节点都存在;这些先前的方法属于直推式&#xff08;transductive&#xff09…...

管理能力学习笔记九:授权的常见误区和如何有效授权

授权的常见误区 误区一&#xff1a;随意授权 管理者在授权工作时&#xff0c;需要依据下属的能力、经验、意愿问最自己&#xff1a;这项工作适合授权给Ta做吗&#xff1f;如果没有&#xff0c;可以通过哪些方法进行培训呢&#xff1f; 误区二&#xff1a;缺乏信任 心理暗示…...

第21天 反射

反射概述 想象一下&#xff0c;你在一个房间里边&#xff0c;但你看不见自己&#xff0c;也不知道自己是谁。这时候你面前有一个镜子&#xff0c;你可以通过镜子的反射来观察自己。反射就像这面镜子。它让你能够检查、分析、修改Java中的对象、类、方法等 使用情况&#xff1…...

多链路聚合设备是什么

多链路聚合设备属于通信指挥装备。 乾元通多链路聚合设备&#xff0c;它能够将多个网络链路聚合成一个逻辑链路&#xff0c;以实现高速、稳定、可靠的数据传输。多链路聚合设备的核心技术包括链路聚合、负载均衡、故障切换等&#xff0c;能够智能管理和优化利用不同网络链路&a…...

基于springboot+vue+Mysql的自习室预订系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

解决后端ID传到前端时被截断,末尾显示00

问题原因&#xff1a; Java后端Long类型的取值和前端Number类型取值范围不一样。 解决方案&#xff1a; 将id字段进行json序列化时转为字符串。 JsonSerialize(using ToStringSerializer.class) private Long id;...

Transformer中的数据输入构造

文章目录 1. 文本内容2. 字典构造2.1 定义一个类用于字典构造2.2 拆分文本2.3 构造结果 3. 完整代码 1. 文本内容 假如我们有如下一段文本内容&#xff1a; Optics It is the branch of physics that studies the behaviour and properties of light . Optical Science 这段…...

完美实现vue3异步加载组件

经过几个小时的努力&#xff0c;终于实现了&#xff0c;根据组件名异常加载组件&#xff0c;直接上代码&#xff0c;网上的很多代码方都有坑&#xff0c;先贴出比较坑的代码&#xff1a; <template><view class"main"> <view class"tops"…...

点云成图原理

点成图&#xff08;Point Cloud&#xff09;是指由一组离散的点构成的图形&#xff0c;它们在空间中没有任何连接关系。点成图通常是由激光雷达、相机或其他传感器获取的三维数据&#xff0c;用于表示现实世界中的物体或场景。 三角成图&#xff08;Triangulation&#xff09;…...

如何将jsp项目转成springboot项目

昨天说过&#xff0c;springboot推荐使用Thymeleaf作为前后端渲染的模板引擎&#xff0c;为什么推荐用Thymeleaf呢&#xff0c;有以下几个原因&#xff1a; 动静结合&#xff1a;Thymeleaf支持HTML原型&#xff0c;允许在HTML标签中增加额外的属性来实现模板与数据的结合。这样…...

C语言:环形链表

1.例子1&#xff1a;环形链表 142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a;我们先定义两个变量slow和fast&#xff0c;slow每次走一步&#xff0c;fast每次走两步&#xff0c;如果链表是环形链表&#xff0c;那么必定存在fast不会走到链表的最后…...

typescript综合练习1(展开音乐播放列表)

Playlist Soundness What’s up, friend?! I’m so pumped you’re joining us. We’ve got a sick project we could totally use your help on! See, someone’s giving us amazing recommendations for songs to play. But they’re not just coming in as songs. Someti…...

seo是做网站源码还是什么/怎么做公司网站推广

mongod会启动一个非常基本的HTTP服务器&#xff0c;监听数字比端口号高1000的端口&#xff0c;也就是28017端口。通过浏览器访问http://localhost:28017&#xff0c;能够获取数据库的管理信息。 mongodb shell会连接到服务器的test数据库&#xff0c;并将数据库连接赋值给全局…...

网站开发属于技术合同/百度官网电话

一、Java反射机制概述 Reflection(反射)是被视为动态语言的关键,反射机制允许程序在执行期借助于Reflection API取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个Class类型的对象(一个类只有一个Class对象),这…...

wordpress google翻译插件/我赢网提供的高水平网页设计师

一、 一般测试场景&#xff1a; 1. 所有必填字段都应校验并用星号“*”标注   2. 验证错误提示信息应在正确的位置合理显示   3. 所有的错误信息都应用相同的CSS样式显示&#xff08;如&#xff1a;红色&#xff09;   4. 一般性的确认信息应该用错误消息意外的CSS样…...

淄博网站建设设计/小程序开发公司十大排名

编者按&#xff1a;原文作者乔纳森丹尼可&#xff08;Jonathan Danylko&#xff09;是一位自由职业的web架构师和程序员&#xff0c;编程经验已超过20年&#xff0c;涉足领域有电子商务、生物技术、房地产、医疗、保险和公用事业。正如乔纳森在文中所言&#xff0c;本文适合刚毕…...

做营销型网站 推广的好处/百度旗下产品

阅读本文大概需要 6.8 分钟。Linux 系统大家一定不陌生&#xff0c;学习工作中肯定会和 Linux 打交道。不过谈及 Linux&#xff0c;给人的第一印象可能就是黑乎乎的命令行&#xff0c;乱七八糟的文件夹&#xff0c;甚至安装软件都不知道是怎么安装上去的。其实这些都是用惯了 W…...

东阿网站建设费用/个人网站设计

一到晚上这个网慢的呀&#xff0c;我和加载页面一样在原地直打转&#xff01;不能忍。所以我打算用网线连接提网速。 先分别测试了一下笔记本电脑连WIFI&#xff0c;直连路由器&#xff0c;和直连光猫的网速差距&#xff0c;不测不知道一侧吓一跳&#xff0c;所以我决定从光猫…...