wordpress固定链接显示404/温州云优化seo

wordpress固定链接显示404,温州云优化seo,南京网站开发公司,互联网代理在这里记一下。原来的html中的css和js路径下载不下来&#xff0c;需要换成&#xff1a; <link href"https://cdn.jsdelivr.net/npm/bootstrap5.3.3/dist/css/bootstrap.min.css" rel"stylesheet" integrity"sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6Y…

在这里记一下。原来的html中的css和js路径下载不下来,需要换成:

<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous">

发送邮件

启动邮箱的SMTP服务

我这里使用的是 edu邮箱,好像默认开启了SMTP服务:

image

配置Spring Email

导入Jar包(Maven)

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mail -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId><version>3.2.3</version>
</dependency>

配置邮箱参数

在applications.properties中配置:

# MailProperties
spring.mail.host= mail.ustc.edu.cn
spring.mail.port=465
spring.mail.username=********
spring.mail.password=*******
spring.mail.protocol=smtps
sprint.mail.properties.mail.ssl.enable=true

使用JavaMailSender发送邮件

  1. 创建一个包util,表示开发中需要用到的工具类,并创建MailClient工具类:
@Component
public class MailClient {private static final Logger logger = LoggerFactory.getLogger(MailClient.class);@Autowiredprivate JavaMailSender mailSender;//从配置文件中把发件人信息注入进来@Value("${spring.mail.username}")private String from;//给to发送主题为subject,内容为content的邮件public void sendMail(String to, String subject, String content) {try {MimeMessage message = mailSender.createMimeMessage();//使用MimeMessageHelper来协助构建邮件MimeMessageHelper helper = new MimeMessageHelper(message);helper.setFrom(from);helper.setTo(to);helper.setSubject(subject);helper.setText(content, true);//true表示支持html格式的邮件mailSender.send(helper.getMimeMessage());} catch (MessagingException e) {logger.error("发送邮件失败:" + e.getMessage());}}}
  • @Component:spring的通用注解,加了这个的类就会被Spring自动管理为bean(比@Service、@Controller之类的更宽泛);
  • @Value(“${spring.mail.username}”)表示注解下的变量from的值会从配置文件中读取。
  • mailSender是自带的JavaMailSender的bean,是SPring用于发送邮件的工具
  • mailSender.createMimeMessage();创建一个MimeMessgge对象来封装邮件;
  • new一个Helper用于往MimeMessage中装东西(set方法)
  • helper.setText(content, true);的true表示支持html格式的邮件
  1. 创建MailTests类进行测试:
@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class MailTests {@Autowiredprivate MailClient mailClient;@Testpublic void testTextMail() {mailClient.sendMail("xxxxx","宝宝","宝宝");}
}
  1. 可以看到成功发送了邮件:

image

使用Thymeleaf发送HTML邮件

之前已经学会了怎么发邮件,并把方法封装到了mailClient.sendMail中,现在我们就要解决参数content,将其转化成html。

  1. 创建模版templates/mail/demo.html
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head><meta charset="UTF-8"><title>邮件示例</title>
</head>
<body><p> 欢迎你,<span style="color: red;" th:text="${username}"> </span>!</p></body>
</html>
  • 这里用th:text把这里的参数变成可变的,接收username,还加了一点样式,记得变量名加$。
  1. 测试发送邮件:
@Autowiredprivate TemplateEngine templateEngine;@Testpublic void testHtmlMail() {Context context = new Context();context.setVariable("username", "宝宝");String content = templateEngine.process("/mail/demo", context);//生成的是字符串;System.out.println(content);mailClient.sendMail("xxxxxxxxxx","宝宝",content);}
  • 运行的时候Thymeleaf会自己加载模版,但测试时需要自己调用注入TemplateEngine。
  • 使用Context(Thymeleaf的)的setVariable方法装填内容。
  • templateEngine.process(“/mail/demo”, context);返回字符串形式的html

开发注册功能

  • 拆解成:访问注册页面、提交注册数据、激活注册账号
  • 遵循:数据层、业务层和视图层进行开发。

访问注册页面

  • 展示页面,不需要开发数据层和业务层

视图层开发(controller)

  1. 创建LoginController类,把site/register的html模版映射到/regesiter路径
@Controller
public class LoginController {@RequestMapping(path = "/register", method = RequestMethod.GET)public String getRegisterPage() {return "/site/register";}}
  • 这里的RequestMapping为什么注解方法而不是类:

对于@RequestMapping注解的使用,你完全可以只在方法上使用,而不在类上使用。这样做的话,每个方法都会处理一个特定的URL。

然而,如果你的控制器类有多个方法,而这些方法处理的URL有共同的部分,那么在类上使用@RequestMapping注解就会很有用。这样做可以避免在每个方法上都重复相同的URL路径。

例如,假设你有一个UserController类,这个类有getUserupdateUserdeleteUser三个方法,分别用于获取、更新和删除用户。这三个方法处理的URL分别是/user/get/user/update/user/delete。你可以在类上使用@RequestMapping("/user")注解,然后在方法上使用@RequestMapping("/get")@RequestMapping("/update")@RequestMapping("/delete")注解,这样就可以避免在每个方法上都重复/user这部分的路径。

总的来说,是否在类上使用@RequestMapping注解,取决于你的具体需求和你的代码组织方式。

  • 注意这里的两个路径实际上不一样:
  • @RequestMapping(path = “/register”, method = RequestMethod.GET):这里的/register是URL路径,当用户通过GET方法访问/register这个URL时,Spring MVC就会调用getRegisterPage方法来处理这个请求。这个路径是相对于应用的上下文路径的,也就是说,如果你的应用部署在http://localhost:8080/myapp,那么用户需要访问http://localhost:8080/myapp/register来触发这个方法。
  • return “/site/register”;:这里的/site/register是视图的名称,它告诉Spring MVC要渲染哪个视图来生成HTTP响应。在Spring MVC中,视图通常是一个JSP页面或者是一个Thymeleaf模板。Spring MVC会渲染classpath:/templates/site/register.html这个Thymeleaf模板。
  1. 修改register.html和index.html,把其中的静态的html路径改成动态的:
<html lang="en" xmlns:th="http://www.thymeleaf.org">...
<link rel="stylesheet" th:href="@{/css/global.css}" /><link rel="stylesheet" th:href="@{/css/register.css}" />
...<li class="nav-item ml-3 btn-group-vertical"><a class="nav-link" th:href="@{/index}">首页</a></li>...<li class="nav-item ml-3 btn-group-vertical"><a class="nav-link" th:href="@{/register}">注册</a></li>
  1. 复用网页的上面一层都是一样的,重复代码很麻烦,考虑能不能复用

在index.html的header上添加fragment标签为该片段命名:

<header class="bg-dark sticky-top" th:fragment="header">

在register.html上复用:

<header class="bg-dark sticky-top" th:replace="index :: header">
  1. 展示页面:

image

提交注册数据

  1. 首先创建一个工具类,用几个静态方法用于生成随机字符串和对key进行md5加密:
public class CommunityUtil {//生成随机字符串public static String generateUUID() {return java.util.UUID.randomUUID().toString().replaceAll("-", "");}//MD5加密public static String md5(String key) {//key是原始密码加盐if(StringUtils.isBlank(key)) {//判断key是否为空或者长度为0return null;}return DigestUtils.md5Hex(key.getBytes());}}

验证账号是否存在

  1. UserService.java中将该注入的注入(需要发邮件要client和模版引擎,以及域名和路径)
@Autowiredprivate MailClient mailClient;@Autowiredprivate TemplateEngine templateEngine;@Value("${community.path.domain}")private String domain;@Value("${server.servlet.context-path}")private String contextPath;
  1. 编写register方法框架
public Map<String, Object> register(User user) {//用Map封装错误信息返回给客户端Map<String, Object> map = new HashMap<>();//1. 验证用户是否符合要求if (user == null) {throw new IllegalArgumentException("User参数不能为空");}if (user.getUsername() == null) {//业务上的漏洞map.put("usernameMsg", "用户名不能为空");return map;}if (user.getPassword() == null) {map.put("passwordMsg", "密码不能为空");return map;}if (user.getEmail() == null) {map.put("emailMsg", "邮箱不能为空");return map;}...
}
  • 要求传入一个User
  • 将错误信息通过map传出来;
  • usernameMsg等xxMsg在后面的thymeleaf模版上要用。
  1. 验证账号
//验证账号和邮箱是否存在if (userMapper.selectByName(user.getUsername()) != null) {map.put("usernameMsg", "该用户名已存在");return map;}if (userMapper.selectByEmail(user.getEmail()) != null) {map.put("emailMsg", "该邮箱已被注册");return map;}
  1. 注册用户
  • 这里的逻辑是符合就创建用户,但是显示未激活
//2. 注册用户//生成saltuser.setSalt(CommunityUtil.generateUUID().substring(0, 5));//加密密码user.setPassword(CommunityUtil.md5(user.getPassword() + user.getSalt()));//设置用户类型user.setType(0);//设置用户状态user.setStatus(0);//设置激活码user.setActivationCode(CommunityUtil.generateUUID());//设置头像user.setHeaderUrl(String.format("http://images.nowcoder.com/head/%dt.png", (int) (Math.random() * 1000)));//设置创建时间user.setCreateTime(new Date());userMapper.insertUser(user);

发送激活邮件

//3. 发送激活邮件//构建邮件内容Context context = new Context();context.setVariable("email", user.getEmail());//Mybatis会自动将user对象回填idcontext.setVariable("url", domain + contextPath + "/activation/" + user.getId() + "/" + user.getActivationCode());String content = templateEngine.process("/mail/activation", context);mailClient.sendMail(user.getEmail(), "激活账号", content);return map;
  • 使用context构建thyme模版需要装填的信息。
  • context.setVariable把xx变量设置为xx;
  • 这里注意与改th标签然后用model.addAttribute方法不用,因为这是用thyme生成html还不是与客户端交互

这一步要修改html文件。

  • 发送邮件的模版mail/activation.html修改成模版
    • 换成thymeleaf模版
<html lang="en" xmlns:th="http://www.thymeleaf.org">
- 替换email为变量 
<b th:text="${email}">xxx@xxx.com</b>, 您好!
- 替换url为变量:
<p>您正在注册, 这是一封激活邮件, 请点击<a th:href= "${url}">此链接</a>,激活您的账号!</p>

这里的变量由哪里传递?回看第三步发送激活邮件。

编写controller

@Controller
public class LoginController {@Autowiredprivate UserService userService;@RequestMapping(path = "/register", method = RequestMethod.GET)public String getRegisterPage() {return "site/register";}@RequestMapping(path = "/register", method = RequestMethod.POST)public String register(Model model, User user) {Map<String, Object> map = userService.register(user);if(map == null || map.isEmpty()){model.addAttribute("msg", "注册成功,我们已向您的邮箱发送了一封激活邮件,请尽快激活!");model.addAttribute("target", "/index");return "/site/operate-result";}else{model.addAttribute("usernameMsg", map.get("usernameMsg"));model.addAttribute("passwordMsg", map.get("passwordMsg"));model.addAttribute("emailMsg", map.get("emailMsg"));return "/site/register";}}
}
  • register传入一个User
  • 调用userService.register查看信息选择怎么和浏览器响应。
  • 成功返回跳转界面,不成功留在注册。

修改operate-result

  • thymeleaf,混入变量msg和target(从model.addAttribute得到)
<html lang="en" xmlns:th="http://www.thymeleaf.org">
		<!-- 内容 --><div class="main"><div class="container mt-5 pt-5"><div class="jumbotron"><p class="lead" th:text="${msg}"></p><hr class="my-4"><p>系统会在 <span id="seconds" class="text-danger">8</span> 秒后自动跳转,您也可以点此 <a id="target" th:href="${target}" class="text-primary">链接</a>, 手动跳转!</p></div></div></div>

修改register.html

  • 引入thymeleaf:
<html lang="en" xmlns:th="http://www.thymeleaf.org">
  • 复用header:
<header class="bg-dark sticky-top" th:replace="index :: header">
  • 主要修改表单,method设定为POST,路径提交到register(thymeleaf语法,是Mapping的路径不是html)
<form class="mt-5" method="post" th:action="@{/register}"> <!-- 注册表单 -->
  • 如果usernameMsg没问题,就不报错,不然把is-invalid拼到前面让前端报错,所在的值如果其他地方错了,这里应该保持show
<input type="text" th:class="|form-control ${usernameMsg!=null?'is-invalid':''}|"th:value="${user!=null? user.username : ''}"id="username" name="username" placeholder="请输入您的账号!" required>
<div class="invalid-feedback" th:text="${usernameMsg}">该账号已存在!</div>
  • password:
<input type="password" th:class="|form-control ${passwordMsg!=null?'is-invalid':''}|"th:value="${user!=null? user.password : ''}"id="password" name="password" placeholder="请输入您的密码!" required><div class="invalid-feedback" th:text="${passwordMsg}">密码长度不能小于8!</div>							
  • email:
<input type="email" th:class="|form-control ${emailMsg!=null?'is-invalid':''}|"th:value="${user!=null? user.email : ''}"id="email" name="email" placeholder="请输入您的邮箱!" required><div class="invalid-feedback" th:text="${emailMsg}">该邮箱已注册!</div>

激活注册账号

到第二个视频的13:26处开始,明天再记录。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/740027.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 一步一步教你用pyglet制作汉诺塔游戏(终篇)

目录 汉诺塔游戏 完整游戏 后期展望 汉诺塔游戏 汉诺塔&#xff08;Tower of Hanoi&#xff09;&#xff0c;是一个源于印度古老传说的益智玩具。这个传说讲述了大梵天创造世界的时候&#xff0c;他做了三根金刚石柱子&#xff0c;并在其中一根柱子上从下往上按照大小顺序摞…

Unsupervised RL:METRA: Scalable Unsupervised RL with Metric-Aware Abstraction

ICLR 2024 Oral paper Intro 无监督RL旨在发现潜在的行为帮助提高下游任务效率以往方法集中于探索以及基于互信息的技能发现(skill)。然而去前者在高危复杂空间实现困难&#xff0c;后者也容易因为缺乏激励导致探索能力不足。本文提出METRA核心观点认为与其在复杂状态空间处理…

[leetcode~dfs]1261. 在受污染的二叉树中查找元素

给出一个满足下述规则的二叉树&#xff1a; root.val 0 如果 treeNode.val x 且 treeNode.left ! null&#xff0c;那么 treeNode.left.val 2 * x 1 如果 treeNode.val x 且 treeNode.right ! null&#xff0c;那么 treeNode.right.val 2 * x 2 现在这个二叉树受到「污…

Games101笔记-计算机图形学概述

光栅化&#xff1a;把三维空间的几何形体显示在屏幕上 实时&#xff1a;每秒30帧的画面 曲线和曲面&#xff1a; 如何表示一条光滑曲线&#xff0c;如何表示曲面如何用简单的曲面通过细分的方法得到更复杂的曲面在形状发生变化时&#xff0c;面要如何变化&#xff0c;如何保…

深入学习默认成员函数——c++指南

前言&#xff1a;类和对象是面向对象语言的重要概念。 c身为一门既面向过程&#xff0c;又面向对象的语言。 想要学习c&#xff0c; 首先同样要先了解类和对象。 本节就类和对象的几种构造函数相关内容进行深入的解析。 目录 类和对象的基本概念 封装 类域和类体 访问限定符…

力扣235. 二叉搜索树的最近公共祖先

思路&#xff1a;要利用好二叉搜索树的特性&#xff0c;中序遍历是有序的&#xff0c;也就是说最近的公共祖先 大小一定落在区间 [p,q] 或[q,p]。 1、当p和q都大于当前root值时&#xff0c;说明当前root值太小&#xff0c;需要更大才能让它落入区间范围&#xff0c;所以要往右子…

如何下载安装chromium浏览器

下载安装chromium浏览器去这个网站下载&#xff1a; CNPM Binaries Mirror 参考链接&#xff1a;手写 Puppeteer&#xff1a;自动下载 Chromium - 知乎

手撸nano-gpt

nano GPT 跟着youtube上AndrejKarpathy大佬复现一个简单GPT 1.数据集准备 很小的莎士比亚数据集 wget https://raw.githubusercontent.com/karpathy/char-rnn/master/data/tinyshakespeare/input.txt 1.1简单的tokenize 数据和等下的模型较简单&#xff0c;所以这里用了个…

游戏免费下载平台模板源码

功能介绍 此游戏网站模板源码是专门为游戏下载站而设计的&#xff0c;旨在为网站开发者提供一个高效、易于维护和扩展的解决方案。 特点&#xff1a; 响应式设计&#xff1a;我们的模板可以自适应不同设备屏幕大小&#xff0c;从而为不同平台的用户提供最佳的浏览体验。 …

算法---滑动窗口练习-1(长度最小的子数组)

长度最小的子数组 1. 题目解析2. 讲解算法原理3. 编写代码 1. 题目解析 题目地址&#xff1a;长度最小的子数组 2. 讲解算法原理 首先&#xff0c;定义变量n为数组nums的长度&#xff0c;sum为当前子数组的和&#xff0c;len为最短子数组的长度&#xff0c;初始值为INT_MAX&am…

javascript中的structuredClone()克隆方法

前言&#xff1a; structuredClone 是 JavaScript 的方法之一&#xff0c;用于深拷贝一个对象。它的语法是 structuredClone(obj)&#xff0c;其中 obj 是要拷贝的对象。structuredClone 方法将会创建一个与原始对象完全相同但是独立的副本。 案例&#xff1a; 当使用Web Work…

Shadertoy内置函数系列 - mod 取模运算

mod函数返回x % 3的结果 先看一个挑战问题题目&#xff1a; Create a pattern of alternating black and red columns, with 9 columns of each color. Then, hide every third column that is colored red.The shader should avoid using branching or conditional statemen…

2024年最新阿里云和腾讯云云服务器价格租用对比

2024年阿里云服务器和腾讯云服务器价格战已经打响&#xff0c;阿里云服务器优惠61元一年起&#xff0c;腾讯云服务器61元一年&#xff0c;2核2G3M、2核4G、4核8G、4核16G、8核16G、16核32G、16核64G等配置价格对比&#xff0c;阿腾云atengyun.com整理阿里云和腾讯云服务器详细配…

每日OJ题_路径dp②_力扣63. 不同路径 II

目录 力扣63. 不同路径 II 解析代码 力扣63. 不同路径 II 63. 不同路径 II 难度 中等 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Select)

提供下拉选择菜单&#xff0c;可以让用户在多个选项之间选择。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 Select(options: Array<SelectOption>) 参数&#xff1a;…

git撤回代码提交commit或者修改commit提交注释

执行commit后&#xff0c;还没执行push时&#xff0c;想要撤销之前的提交commit 撤销提交 使用命令&#xff1a; git reset --soft HEAD^命令详解&#xff1a; HEAD^ 表示上一个版本&#xff0c;即上一次的commit&#xff0c;也可以写成HEAD~1 如果进行两次的commit&#xf…

算法打卡day15|二叉树篇04|110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和

算法题 Leetcode 110.平衡二叉树 题目链接:110.平衡二叉树 大佬视频讲解&#xff1a;平衡二叉树视频讲解 个人思路 可以用递归法&#xff0c;计算左右子树的高度差&#xff0c;当超过1时就不为平衡二叉树了&#xff1b; 解法 回顾一下二叉树节点的深度与高度&#xff1b; …

Python学习:基础语法

版本查看 python --version编码 默认情况下&#xff0c;Python 3 源码文件以 UTF-8 编码&#xff0c;所有字符串都是 unicode 字符串。 特殊情况下&#xff0c;也可以为源码文件指定不同的编码&#xff1a; # -*- coding: cp-1252 -*-标识符 第一个字符必须是字母表中字母或…

rt-thread组件之audio组件(结合mp3player包使用)

前言 继上一篇RT-Thread组件之Audio框架i2s驱动的编写的编写&#xff0c;应用层使用rt-thread软件包里面的wavplayer组件以及 rt-thread组件之audio组件(结合wavplayer包使用)的文章本篇使用的是 mp3player软件包&#xff0c;与wavplayer设计框架基本上是一样的&#xff0c;只…

java-单列集合-set系列

set集合继承collection,所以API都差不多&#xff0c;我就不多加介绍 直接见图看他们的特点 我们主要讲述的是set系列里的HashSet、LinkedHashSet、TreeSet HashSet HashSet它的底层是哈希表 哈希表由数组集合红黑树组成 特点&#xff1a;增删改查都性能良好 哈希表具体是…