spring boot+vue个人博客五:完成登陆注册页面,nginx网关对接后端

Java后端进阶实战:从核心原理到分布式系统设计 最近和不少准备面试的朋友交流,发现一个普遍现象:大家手头资料很多,但学习路径混乱,要么死磕八股文,要么盲目刷题,结果面试时遇到场景题就懵了。结合我近期辅导和面试的经验,整理了一套我认为当前最有效的 Java 后端进阶路径。这套方法不仅针对面试,更是构建扎实后端能力体系的关键,涵盖了从 Java 基础、核心框架到分布式、数据库、JVM 乃至 AI 辅助学习的实战策略。 1. 为什么传统的学习方式效率低下? 很多开发者,尤其是工作1-3年的朋友,容易陷入两个极端:一是沉迷于收集各种“面试宝典”、“八股文大全”, 阅读详情
系列大纲
GitHub(还没开发完成)
在线演示www.yzpnb.top
第一章:(后端)搭建spring boot脚手架:https://blog.youkuaiyun.com/grd_java/article/details/107452826
第二章:权限整合shiro+jwt,完成后端接口:https://blog.youkuaiyun.com/grd_java/article/details/107481570
第三章:搭建前端vue整合element ui脚手架:https://blog.youkuaiyun.com/grd_java/article/details/107498140
第四章:首页和公共头部组件:https://blog.youkuaiyun.com/grd_java/article/details/107507213
第五章:完成登陆注册页面,nginx网关对接后端:https://blog.youkuaiyun.com/grd_java/article/details/107515437
第六章:博客页面,观看博客,博客编辑功能:https://blog.youkuaiyun.com/grd_java/article/details/107525128
第七章:打包部署,多节点部署方案:https://blog.youkuaiyun.com/grd_java/article/details/107533253

一、页面整合

在这里插入图片描述

1、下载bootstrap(去官网下载即可)

在这里插入图片描述

2、编写单独样式表

在这里插入图片描述

/* Please ❤ this if you like it! */


@import url('https://fonts.googleapis.com/css?family=Poppins:400,500,600,700,800,900');

body{
	font-family: 'Poppins', sans-serif;
	font-weight: 300;
	font-size: 15px;
	line-height: 1.7;
	color: #c4c3ca;
	background-color: #1f2029;
	overflow-x: hidden;
}
a {
	cursor: pointer;
  transition: all 200ms linear;
}
a:hover {
	text-decoration: none;
}
.link {
  color: #c4c3ca;
}
.link:hover {
  color: #ffeba7;
}
p {
  font-weight: 500;
  font-size: 14px;
  line-height: 1.7;
}
h4 {
  font-weight: 600;
}
h6 span{
  padding: 0 20px;
  text-transform: uppercase;
  font-weight: 700;
}
.section{
  position: relative;
  width: 100%;
  display: block;
}
.full-height{
  min-height: 100vh;
}
[type="checkbox"]:checked,
[type="checkbox"]:not(:checked){
  position: absolute;
  left: -9999px;
}
.checkbox:checked + label,
.checkbox:not(:checked) + label{
  position: relative;
  display: block;
  text-align: center;
  width: 60px;
  height: 16px;
  border-radius: 8px;
  padding: 0;
  margin: 10px auto;
  cursor: pointer;
  background-color: #ffeba7;
}
.checkbox:checked + label:before,
.checkbox:not(:checked) + label:before{
  position: absolute;
  display: block;
  width: 36px;
  height: 36px;
  border-radius: 50%;
  color: #ffeba7;
  background-color: #102770;
  font-family: 'unicons';
  content: '\eb4f';
  z-index: 20;
  top: -10px;
  left: -10px;
  line-height: 36px;
  text-align: center;
  font-size: 24px;
  transition: all 0.5s ease;
}
.checkbox:checked + label:before {
  transform: translateX(44px) rotate(-270deg);
}


.card-3d-wrap {
  position: relative;
  width: 440px;
  max-width: 100%;
  height: 400px;
  -webkit-transform-style: preserve-3d;
  transform-style: preserve-3d;
  perspective: 800px;
  margin-top: 60px;
}
.card-3d-wrapper {
  width: 100%;
  height: 100%;
  position:absolute;    
  top: 0;
  left: 0;  
  -webkit-transform-style: preserve-3d;
  transform-style: preserve-3d;
  transition: all 600ms ease-out; 
}
.card-front, .card-back {
  width: 100%;
  height: 100%;
  background-color: #2a2b38;
  background-image: url('https://s3-us-west-2.amazonaws.com/s.cdpn.io/1462889/pat.svg');
  background-position: bottom center;
  background-repeat: no-repeat;
  background-size: 300%;
  position: absolute;
  border-radius: 6px;
  left: 0;
  top: 0;
  -webkit-transform-style: preserve-3d;
  transform-style: preserve-3d;
  -webkit-backface-visibility: hidden;
  -moz-backface-visibility: hidden;
  -o-backface-visibility: hidden;
  backface-visibility: hidden;
}
.card-back {
  transform: rotateY(180deg);
}
.checkbox:checked ~ .card-3d-wrap .card-3d-wrapper {
  transform: rotateY(180deg);
}
.center-wrap{
  position: absolute;
  width: 100%;
  padding: 0 35px;
  top: 50%;
  left: 0;
  transform: translate3d(0, -50%, 35px) perspective(100px);
  z-index: 20;
  display: block;
}


.form-group{ 
  position: relative;
  display: block;
    margin: 0;
    padding: 0;
}
.form-style {
  padding: 13px 20px;
  padding-left: 55px;
  height: 48px;
  width: 100%;
  font-weight: 500;
  border-radius: 4px;
  font-size: 14px;
  line-height: 22px;
  letter-spacing: 0.5px;
  outline: none;
  color: #c4c3ca;
  background-color: #1f2029;
  border: none;
  -webkit-transition: all 200ms linear;
  transition: all 200ms linear;
  box-shadow: 0 4px 8px 0 rgba(21,21,21,.2);
}
.form-style:focus,
.form-style:active {
  border: none;
  outline: none;
  box-shadow: 0 4px 8px 0 rgba(21,21,21,.2);
}
.input-icon {
  position: absolute;
  top: 0;
  left: 18px;
  height: 48px;
  font-size: 24px;
  line-height: 48px;
  text-align: left;
  color: #ffeba7;
  -webkit-transition: all 200ms linear;
    transition: all 200ms linear;
}

.form-group input:-ms-input-placeholder  {
  color: #c4c3ca;
  opacity: 0.7;
  -webkit-transition: all 200ms linear;
    transition: all 200ms linear;
}
.form-group input::-moz-placeholder  {
  color: #c4c3ca;
  opacity: 0.7;
  -webkit-transition: all 200ms linear;
    transition: all 200ms linear;
}
.form-group input:-moz-placeholder  {
  color: #c4c3ca;
  opacity: 0.7;
  -webkit-transition: all 200ms linear;
    transition: all 200ms linear;
}
.form-group input::-webkit-input-placeholder  {
  color: #c4c3ca;
  opacity: 0.7;
  -webkit-transition: all 200ms linear;
    transition: all 200ms linear;
}
.form-group input:focus:-ms-input-placeholder  {
  opacity: 0;
  -webkit-transition: all 200ms linear;
    transition: all 200ms linear;
}
.form-group input:focus::-moz-placeholder  {
  opacity: 0;
  -webkit-transition: all 200ms linear;
    transition: all 200ms linear;
}
.form-group input:focus:-moz-placeholder  {
  opacity: 0;
  -webkit-transition: all 200ms linear;
    transition: all 200ms linear;
}
.form-group input:focus::-webkit-input-placeholder  {
  opacity: 0;
  -webkit-transition: all 200ms linear;
    transition: all 200ms linear;
}

.btn{  
  border-radius: 4px;
  height: 44px;
  font-size: 13px;
  font-weight: 600;
  text-transform: uppercase;
  -webkit-transition : all 200ms linear;
  transition: all 200ms linear;
  padding: 0 30px;
  letter-spacing: 1px;
  display: -webkit-inline-flex;
  display: -ms-inline-flexbox;
  display: inline-flex;
  -webkit-align-items: center;
  -moz-align-items: center;
  -ms-align-items: center;
  align-items: center;
  -webkit-justify-content: center;
  -moz-justify-content: center;
  -ms-justify-content: center;
  justify-content: center;
  -ms-flex-pack: center;
  text-align: center;
  border: none;
  background-color: #ffeba7;
  color: #102770;
  box-shadow: 0 8px 24px 0 rgba(255,235,167,.2);
}
.btn:active,
.btn:focus{  
  background-color: #102770;
  color: #ffeba7;
  box-shadow: 0 8px 24px 0 rgba(16,39,112,.2);
}
.btn:hover{  
  background-color: #102770;
  color: #ffeba7;
  box-shadow: 0 8px 24px 0 rgba(16,39,112,.2);
}

3、引入一个图标库

在这里插入图片描述

<!---图标库--->
<link rel='stylesheet' href='https://unicons.iconscout.com/release/v2.1.9/css/unicons.css'>

4、配置nginx,编写异步接口

server {
		listen       9001;# 配置你的nginx端口
		server_name  localhost;#服务名地址
		
		location ~ /service_blog/ { #当我们请求的路径中包含/service_blog/时就将请求转发到http://localhost:8001端口
            proxy_pass   http://localhost:8001;
        }
    }

在这里插入图片描述

5、api接口

在这里插入图片描述

import request from '@/utils/request.js'
export default {
  login(data) {
    return request({
      url: `/service_blog/account/login`,
      method: 'post',
	  data
    })
  },
  register(data){
	  return request({
		  url:`/service_blog/account/signIn`,
		  method:'post',
		  data
	  })
  },
  logout(){
	  return request({
		  url:`/service_blog/account/logout`,
		  method:'get'
	  })
  }
 }

6、登陆页面开发

在这里插入图片描述

html
<template>
	<div class="section">
		<div class="container">
			<div class="row full-height justify-content-center">
				<div class="col-12 text-center align-self-center py-5">
					<div class="section pb-5 pt-5 pt-sm-2 text-center">
						<h6 class="mb-0 pb-3"><span>登录</span><span>注册</span></h6>
			          	<input class="checkbox" type="checkbox" id="reg-log" name="reg-log"/>
			          	<label for="reg-log"></label>
						<div class="card-3d-wrap mx-auto">
							<div class="card-3d-wrapper">
								<div class="card-front">
									<div class="center-wrap">
										<div class="section text-center">
											<h4 class="mb-4 pb-3">登录</h4>
											<div class="form-group">
												<input type="text" name="username" v-model="loginData.username" class="form-style" placeholder="用户名" id="logemail" autocomplete="off">
												<i class="input-icon uil uil-at"></i>
											</div>	
											<div class="form-group mt-2">
												<input type="password" name="logpass" v-model="loginData.password" class="form-style" placeholder="密码" id="logpass" autocomplete="off">
												<i class="input-icon uil uil-lock-alt"></i>
											</div>
											<a href="#" class="btn mt-4" @click.stop.self="login()">登陆</a>
	                        				<p class="mb-0 mt-4 text-center"><a href="#0" class="link">忘记密码?</a></p>
				      					</div>
			      					</div>
			      				</div>
								<div class="card-back">
									<div class="center-wrap">
										<div class="section text-center">
											<h4 class="mb-4 pb-3">注册</h4>
											<div class="form-group">
												<input type="text" name="logname" v-model="registerData.username" class="form-style" placeholder="用户名" id="logname" autocomplete="off">
												<i class="input-icon uil uil-user"></i>
											</div>	
											<div class="form-group mt-2">
												<input type="email" name="logemail" v-model="registerData.email" class="form-style" placeholder="邮箱" id="logemail" autocomplete="off">
												<i class="input-icon uil uil-at"></i>
											</div>	
											<div class="form-group mt-2">
												<input type="password" name="logpass" v-model="registerData.password" class="form-style" placeholder="密码" id="logpass" autocomplete="off">
												<i class="input-icon uil uil-lock-alt"></i>
											</div>
											<a href="#" class="btn mt-4" @click.stop.self="register()">注册</a>
				      					</div>
			      					</div>
			      				</div>
			      			</div>
			      		</div>
			      	</div>
		      	</div>
	      	</div>
	    </div>
	</div>
</template>
js
<script>
	import '@/assets/css/bootstrap.min.css'
	import Handler from '@/components/Handler.vue'
	import login from '@/api/login.js'
	export default{
		data(){
			return{
				loginData:{
					username:'',//登陆用用户名
					password:''//登陆用密码
				},
				registerData:{
					username:'',//注册用用户名
					password:'',//注册用密码
					email:''	   //注册用邮箱
				}
			}
		},
		methods:{
			login(){
				login.login(this.loginData).then(response=>{
					if(response.data.code===20000){
						this.$message({
						          message: '登陆成功',
						          type: 'success'
						        });
						this.$router.push({name:'Blog'})
					}else{
						this.$message.error(response.data.message);
					}
				}).catch(error=>{
					this.$message.error(error.data.message);
				})
			},
			register(){
				login.register(this.registerData).then(response=>{
					if(response.data.code===20000){
						this.$message({
						          message: '注册成功',
						          type: 'success'
						        });
						this.loginData.username=this.registerData.username;
						this.loginData.password=this.registerData.password;
						this.login();
					}else{
						this.$message.error(response.data.message);
					}
				}).catch(error=>{
					this.$message.error(error.data.message);
				})
			}
		},
		components:{
			Handler
		}
	}
</script>

<style scoped src="@/assets/css/style.css">
	#handler{
		position: relative;
	}
</style>

二、逻辑测试与完善

1、测试当前接口

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

2、集中化管理数据

集中化管理数据

在这里插入图片描述

上面是正常的写法,但是我这里需要保存数据到客户端,所以采用如下写法

在这里插入图片描述

import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
	  token:localStorage.getItem("token"),//全局存放token,这里直接通过localSrotage获取,这样就省去了get的过程
	  userInfo:JSON.parse(sessionStorage.getItem("userInfo")),//全局存放用户信息,通过JSON反序列化,将用户数据拿到
	  loginFlag:false//用来标识当前登录状态,false表示没有登陆
  },
  mutations: {//这个就相当于java的set方法
	  SET_TOKEN:(state,token)=>{//设置值到token
		  state.token=token;
		  localStorage.setItem("token",token);//将token存储到localStorage中,就是存储在客户端
	  },
	  SET_USERINFO:(state,userInfo)=>{//设置用户信息
		  state.userInfo=userInfo;
		  sessionStorage.setItem("userInfo",JSON.stringify(userInfo));//将用户信息存放到session会话中,这个方法不能穿对象,所以通过JSON序列化
	  },
	  SET_LOFIN_Flag:(state,loginFlag)=>{//设置登陆状态
		  state.loginFlag=loginFlag;
	  },
	  SET_LOGOUT:(state)=>{//退出时,清除所有数据
		  state.token='';
		  state.userInfo={};
		  state.loginFlag=false;
		  localStorage.setItem("token",'');
		  sessionStorage.setItem("userInfo",JSON.stringify(''));
	  }
  },
  getters:{
	  //get
	  getUserInfo:state=>{
		 return state.userInfo
	  },
	  getToken:state=>{
		 return state.token
	  }
  },
  actions: {
  },
  modules: {
  }
})

3、方法重构

在这里插入图片描述

login(){
				login.login(this.loginData).then(response=>{
					if(response.data.code===20000){
						this.$message({
						          message: '登陆成功',
						          type: 'success'
						        });
						const jwt =response.headers['authorization'];//获取响应头中的jwt字串
						const userInfo=response.data.data.loginMD;//获取用户数据
						
						this.$store.commit("SET_TOKEN",jwt)//这个commit方法就是调用mutations来设置值的
						this.$store.commit("SET_USERINFO",userInfo)
						this.$store.commit("SET_LOFIN_Flag",true)//登陆成功将状态设置为true
						
						this.$router.push({name:'Blog'})//跳转页面到博客页面
					}else{
						this.$message.error(response.data.message);
					}
				}).catch(error=>{
					this.$message.error(error.data.message);
				})
			},

4、测试

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

三、获取登陆信息完善页面

3种常用获取集中化数据的方法
console.log(this.$store.state.loginFlag)//通过$store.state获取
console.log(this.$store.getters.getUserInfo)//通过getters获取
console.log(localStorage.getItem("token"))//通过localStorage或者SessionStorage获取

1、编写头部组件

根据用户登陆状态显示图标

在这里插入图片描述

<a href="#" class="blog-user" v-if="!$store.state.loginFlag">
  <i class="el-icon-user-solid" @click="login()"></i>
 </a>
 <a href="#" class="blog-user" v-if="$store.state.loginFlag">
  <img class="avatar" :src="avatar" @click="loginUser()"/>
 </a>
js代码

在这里插入图片描述

<script>
	import login from '@/api/login.js'
export default {
  name: 'HelloWorld',
  props: {
    msg: String
  },
  data(){
	  return{
		  avatar:'',//用户头像
	  }
  },
  created() {
  	if(this.$store.state.token=='' || this.$store.state.token==null){//如果token为空就设置用户登陆状态为false,有值就设置为true
		this.$store.commit("SET_LOFIN_Flag",false);
	}
	else if(this.$store.state.userInfo!=null||this.$store.state.userInfo!=undefined){//如果token有值,就判断用户数据有没有
		//如果有就设置为true并获取头像
		this.$store.commit("SET_LOFIN_Flag",true);
		this.avatar=this.$store.state.userInfo.avatar//获取头像
	}
  },
  methods:{
	  blog(){
		  this.$router.push({name:'Blog'})
	  },
	  login(){
		  this.$router.push({name:'Login'})
	  },
	  loginUser(){
		  // this.$router.push({name:'用户详情界面'})
		  
		  this.$confirm('是否退出登陆', '提示', {
			confirmButtonText: '确定',
			cancelButtonText: '取消',
			type: 'warning'
		  }).then(() => {
			login.logout().then(response=>{
				if(response.data.code===20000){
					this.$message({
					          message: '退出成功',
					          type: 'success'
					        });
					this.$store.commit("SET_LOGOUT")//清空vuex
					this.$router.push({name:'Blog'})//跳转页面到博客页面
				}else{
					this.$message.error(response.data.message);
				}
			})
			
		  })
	  },
	  leaveWord(){
		  // this.$router.push({name:'留言'})
	  },
	  diary(){
		  // this.$router.push({name:'日记'})
	  },
	  FriendsOfTheChain(){
		  // this.$router.push({name:'友链'})
	  },
  }
}
</script>
css
.avatar{
	width: 35px;
	border-radius: 35px;
	box-shadow: 1px 3px 9px rgba(0,0,0,0.5);
}

2、测试

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

springboot使用Gateway做网关并且配置全局拦截器 跨域:请求位置和被请求位置不同源就会发生跨域。这里的不同源包括两个点:域名不同:www.baidu.com 和 www.taobao.com。(IP不同也是相同道理)端口不同:127.0.0.1:8080和127.0.0.1:8081。而浏览器又会禁止请求的发起者与服务端发生跨域AJAX请求。如果发生了跨域请求,服务器端是能够正常响应的,但是响应的结果会被浏览器拦截。 阅读详情

相关推荐

springboot使用Gateway搭建网关服务及Nacos实现动态路由

springboot使用Gateway搭建网关服务及实现动态路由

lockie的博客 6121

html简单用户登录界面_简单实现 nginx 用户登录认证

1. 安装 htpasswd 工具yum -y install httpd-tools 2. 创建认证用户htpasswd -c pass.db wang //wang 并输入密码在次添加用户时输入时输入htpasswd pass.db username会在/etx/nginx/passwd.db文件中生成用户名和加密的密码:myuser:YlmaHlkJnzhxG3.nginx 增加两项配置...

weixin_42633137的博客 1663

腾讯混元3D世界模型2.0实战:从AI生成到Unity/UE引擎集成全指南

生成式AI正在重塑3D内容创作流程,其核心原理是通过大语言模型理解自然语言描述,并驱动多阶段生成流水线自动创建3D资产与场景。这项技术为游戏开发、虚拟仿真和数字孪生领域带来了革命性的效率提升,能够将传统需要数周的美术协作流程压缩至几分钟。在实际应用中,开发者需要掌握本地环境部署、模型推理优化以及生成资产与主流游戏引擎的集成工作流。本文以腾讯开源的混元3D世界模型为例,详细解析如何将AI生成的场景通过插件高效导入Unity和Unreal Engine,并针对光照烘焙、材质调整、性能优化等工程实践问题提供解决方

cnracht8153的博客 1392

nginx简易实现权限登录

实现效果 Centos安装httpd-tools 创建用户并设置密码到指定文件: htpasswd /etc/apache2/.htpasswd user2 配置nginx server { listen 80; server_name nginx-ui.base.cecdata.com; location / { proxy_pass http://127.0.0.1:8080/; } auth_basic "Administrator's Area"; #这里是验证时的提示信息 auth_b

inteligent7的博客 1539

手把手教你为RK3588开发板适配RTL8211F网卡:设备树配置与PHY驱动匹配全流程

本文详细介绍了在RK3588开发板上适配RTL8211F千兆以太网PHY芯片的全流程,包括硬件原理图确认、设备树配置与PHY驱动匹配。通过实战案例和调试技巧,帮助开发者解决常见问题并优化网络性能,适用于嵌入式Linux开发中的Ethernet网络功能实现。

weixin_29184075的博客 526

图像处理入门007:图像处理中的数学基础:线性代数与卷积

一种:把 OpenCV 当黑盒,调用,效果不对就乱调参数;另一种:理解每个像素是怎么被周围邻域"加权平均"的,理解核翻转、边界填充、stride 的含义。前者能干活,后者能解难题。一旦遇到自定义核(比如 ISP 上的锐化)、深度学习反向传播、医学图像重建,你就必须把卷积、相关、矩阵乘法这些基本功捡回来。线性代数三件套:向量点积、矩阵乘法、线性变换;2D 卷积的数学定义:核翻转、滑动窗口、边界填充。并手写一个,验证它与和的结果完全一致(误差 < 1e-9)。f∗gn∑m−∞∞f。

专注:太空算力、AI infra、异构调度、大模型成本工程 387

Nginx部署安装实现前后端分离(springboot+vue)+双机互备

nginx+springboot+vue实现前后台分离、双节点互备

傲视苍穹 1万+

实战六十四:基于机器学习朴素贝叶斯的豆瓣Top250影评的情感分析与预测 附完整源码和数据

实战六十四:基于机器学习朴素贝叶斯的豆瓣Top250影评的情感分析与预测 附完整源码和数据

1563

nginx反向代理https网站 并实现网站的注册和登录功能

nginx反代多数是用sub_filter,但是这个需要ngx_http_sub_module模块,刚好军哥的安装包就自带编译了,所以很方便。开始工作:一、给服务器上面安装nginx、php、带上http_sub_module、pcre-devel、openssl模版编译即可。(其他模块常见的就不说了,一键脚本都有,反代用到的也少)二、配置反向代理规则 ...

weixin_34360651的博客 1930

麻辣香锅病毒分析

Spicy Hot Pot浏览器劫持病毒(麻辣香锅病毒)从2020年初被安全公司监测到,因其病毒模块带有MLXG_KM被安全行业代称麻辣香锅病毒。目前通过各种激活工具传播, 包括暴风激活、小马激活和KMS激活等诸多工具,疑似与下载站进行合作推广此类激活工具。Spicy Hot Pot 是一个浏览器劫持 Rootkit,它会将用户的主页更改为指向恶意软件操作员控制的页面,此外还会将内存转储从机器上传到预定义的服务器,并结合本地更新功能以确保其保持更新。通常浏览器劫持者会通过更改用户主页的恶意可执行文件或注册表

不忘初心,护天下安全! 4788

【异常】插入Milvus时出现无法插入的情况提示io.milvus.exception.ParamException: The field: meta is not provided.

在使用 Milvus 进行向量搜索时遇到 io.milvus.exception.ParamException: The field: meta is not provided 错误通常意味着在创建集合(Collection)或者插入数据(Insert)时,某些必需的元数据字段没有被正确提供。检查集合创建,确保在创建集合时,你已经定义了所有必需的字段,并且正确地使用了 SchemaField 来定义这些字段。例如,如果你在创建集合时没有正确设置元数据字段,就会出现这个错误。请严格按照这个表结构创建。

奶爸的编程之路,也就一周冷个三天 924

Spring Boot整合Spring Cloud Gateway搭建网关服务

本文介绍了Spring Cloud Gateway的使用方法,主要包括项目创建、配置路由规则、断言工厂和过滤器工厂的应用。通过创建Spring Boot项目并添加Gateway依赖,配置路由规则实现请求转发和负载均衡。详细讲解了多种断言工厂(如After、Before、Cookie、Header等)和过滤器工厂(如AddRequestHeader、AddResponseHeader等)的使用方法。最后展示了如何配置动态路由实现负载均衡功能,通过Nacos注册中心实现服务发现。

沐雨橙风ιε的博客 1万+

如何正确的计算两个角度的角度差?

这一步是必要的,因为它确保了无论a相对于b是在逆时针方向还是顺时针方向,d2总是正确地反映出绕圆相反方向的角度差。这样,当函数进行最后的比较时,它能够准确地比较两个方向的旋转路径并选择最短的一个。

小秋 AI SLAM 入门实战教程 4137

spring boot+vue个人博客一:(后端)搭建spring boot脚手架

文章目录一、环境搭建1、数据库2、创建工程并引入依赖3、application.yaml4、启动类5、mybatis plus 分页插件6、代码生成器1、相关依赖2、配置(根据注释修改即可)3、编写controller并测试7、统一返回结果1、创建公共模块2、测试8、整合swagger测试接口 一、环境搭建 1、数据库 CREATE TABLE `m_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `username` varchar(64) DEFAUL

殷志鹏的博客 8723

小程序设计中的区块链应用:数字藏品实现

本文旨在为开发者提供在小程序中实现区块链数字藏品功能的完整技术方案。区块链与数字藏品的基础概念智能合约的设计与实现小程序与区块链的交互方式数字藏品的完整实现流程文章将从基础概念入手,逐步深入到技术实现层面,最后通过完整项目案例展示数字藏品在小程序中的实现方式。每个技术点都会配合代码示例和架构图进行说明。区块链:一种分布式数据库技术,通过加密算法保证数据不可篡改数字藏品:基于区块链技术的数字资产,具有唯一性和可验证性NFT。

小程序开发 1350

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

spring boot+vue个人博客六:博客页面,观看博客,博客编辑功能

文章目录一、博客展示1、api接口2、代码二、博客编辑1、整合mavon-editor编辑器2、博客编辑页面 一、博客展示 1、api接口 import request from '@/utils/request.js' export default { limitSelect(current,size) { return request({ url: `/service_blog/m-blog/limitSelect/${current}/${size}`, met

殷志鹏的博客 1029

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

spring boot+vue个人博客七:打包部署,多节点部署方案

请先确保你会使用docker和Linux linux:https://blog.youkuaiyun.com/grd_java/article/details/107233667 docker:https://blog.youkuaiyun.com/grd_java/article/details/107220162 文章目录一、数据库节点1、Mysql集群2、使用docker下载PXC镜像3、划分一个docker内部网段,专门给PXC集群使用4、docker卷5、创建PXC容器二、后端部署1、打包2、使用...

殷志鹏的博客 2333

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Springcloud新闻头条系统69600-计算机课程/毕业设计

(1)注册登录:支持新用户通过手机号或邮箱完成账号注册,并允许老用户使用凭证安全登录系统。 (2)首页:聚合展示最新热点新闻、轮播图公告及推荐内容,为用户提供直观的信息浏览入口。 (3)通知公告:集中呈现管理员发布的系统维护、活动推广等全站重要通知信息。 (4)留言反馈:允许用户提交包含标题和具体内容的意见反馈,以便与平台进行互动沟通。 (5)新闻文章:展示新闻的标题、分类、来源、封面及详情内容,并实时统计显示点赞数与点击数。 (6)我的账户:提供用户查看个人基本信息及绑定状态的专属管理页面。

Biye_Design的博客 259

vue+springboot+cas配置及cookie传递问题

前后端分离,cookie无法传递

zwjzone的博客 965

基于微服务的中药材电商交易平台---附源码97529

本系统后端采用Spring Cloud微服务框架进行开发,结合Java语言实现业务逻辑处理,前端基于Vue构建交互式用户界面,数据库采用MySQL完成数据存储,并通过前后端分离模式与接口调用实现系统功能集成。平台主要面向普通用户、供应商用户和管理员三类角色,普通用户可进行注册登录、药材商品浏览、购物车管理、订单提交、地址维护、收藏点赞、即时通讯及交易纠纷反馈等操作;供应商用户可对店铺信息、药材商品、商品分类、订单配送、售后服务及交易纠纷进行管理;管理员则可对系统用户、公告信息、行业资讯...........

weixin_BYSJ1987的博客 475

工作中使用到的单词(软件开发)

1.エイリアス   alias 别名 powershell使用 get-help 命令时,会得到与此命令 相关(别名)的命令 2.プロキシ proxy 代 理 3.プロモート   promote 促进,提升   开发的系统新功能上线发布,有时会使用到这个词,比如 STプロモート 还有使用リリース这个词的。比如STリリース。个人认为两者含义相同。 4.見逃し み................................................................

sun0322 6万+

CnOpenData 线上招聘网站信息数据

CnOpenData线上招聘网站信息数据库是一个覆盖中国主流招聘平台、时间跨度长、更新频率高的劳动力市场需求侧大数据集合。本数据库汇集了,为学术界和业界提供了一扇实时观察中国劳动力市场动态的窗口。

CnOpenData_wj的博客 2622

Spring Boot 中的服务网关是什么,原理,如何使用

服务网关是微服务架构中的一种设计模式,它负责将所有的客户端请求转发到相应的微服务上,并提供了一些额外的功能,例如路由、负载均衡、安全性和监控等。服务网关是微服务架构中的一个重要组件,它可以简化服务调用方的细节,同时也提高了系统的可靠性和安全性。

程序猿徐师兄的博客 2091

spring 设计分布式组件之网关

永远不要停止学习。

m0_59588838的博客 1642

springboot整合gateway网关

API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题:(1)客户端会多次请求不同的微服务,增加了客户端的复杂性。(2)存在跨域请求,在一定场景下处理相对复杂。(3)认证复杂,每个服务都需要独立认证。(4)难以重构,随着项目的迭代,可能需要重新划分微服务。例如,可能将多个服务合并成一个或者将一个服务拆分成多个。如果客户端直接与微服务通信,那么重构将会很难实施。

豆豆的博客 5970
上一篇: spring boot+vue个人博客四:首页和公共头部组件
下一篇: spring boot+vue个人博客六:博客页面,观看博客,博客编辑功能
ydenergy_殷志鹏
博客等级 码龄7年 5885粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值