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

基于Spring Boot + Vue 前后端分离个人博客网站设计 个人博客网站摘要一、绪论1.1 课题背景、目的、意义1.2 国内外研究现状1.3 技术介绍1.3.1 Spring Boot1.3.2 MyBatisPlus1.3.3 Shiro1.3.4 Redis1.3.5 Jwt1.3.6 Vue1.3.7 Element-ui1.3.8 Axios1.3.9 前后端分离二、可行性分析2.1 技术可行性分析2.2 时间和资源可行性三、需求分析3.1 用户分析3.2 功能需求分析3.3 流程分析四、结构设计4.1 实体e-r图4.2 数据库设计五、详细设计六、系统测试 阅读详情
系列大纲
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、api接口

在这里插入图片描述

import request from '@/utils/request.js'
export default {
  limitSelect(current,size) {
    return request({
      url: `/service_blog/m-blog/limitSelect/${current}/${size}`,
      method: 'get'
    })
  },
  blogById(id){
	  return request({
		  url:`/service_blog/m-blog/blogById/${id}`,
		  method:'get',
	  })
  },
  deleteBlogById(id){
	  return request({
		  url:`/service_blog/m-blog/blogById/${id}`,
		  method:'delete',
	  })
  },
  updateBlogById(data){
  	  return request({
  		  url:`/service_blog/m-blog/blogById`,
  		  method:'put',
  		  data
  	  })
  },
  insertBlog(data){
	  return request({
		  url:`/service_blog/m-blog/insertBlog`,
		  method:'post',
		  data
	  })
  },
 }

2、代码

在这里插入图片描述

<template>
	<div class="blog">
		<Handler id="handler"></Handler>
		<el-row type="flex"  justify="center">
		  <el-col :span="18">
			  <div class="block">
				  <el-timeline>
					<el-timeline-item timestamp="" placement="top">
					  <el-card id="item" @click="blogDetailsave()">
						<h4 style="text-align: center;" @click="blogDetailsave()">编辑一篇新的博客</h4>
						<div class="buttonC"></div>
					  </el-card>
					</el-timeline-item>
					<el-timeline-item v-for="blog in blogs" :key="blog.id" :timestamp="blog.gmtModified" placement="top">
					  <el-card id="item">
						<h4 @click="blogDetail(blog.id)">{{blog.title}}</h4>
						<p @click="blogDetail(blog.id)">名字 提交于 {{blog.gmtModified}}</p>
						<div class="buttonC">
							<el-button id="a" type="primary" icon="el-icon-edit" circle @click="updateBlogById(blog.id,blog.userId)"></el-button>
							<el-button id="a" type="success" icon="el-icon-check" circle @click="blogDetail(blog.id)"></el-button>
							<el-button id="a" type="danger" icon="el-icon-delete" circle @click="deleteBlogById(blog.id,blog.userId)"></el-button>
						</div>
					  </el-card>
					</el-timeline-item>
				  </el-timeline>
				</div> 
				<el-pagination
				  :page-size="size"
				  :current-page="current"
				  background
				  @current-change="currentChange"
				  style="opacity: 0.5;box-shadow: 5px 5px 5x #000000; "
				  layout="prev, pager, next"
				  :total="total">
				</el-pagination>
		  </el-col>
		</el-row>
	</div>
</template>

<script>
	import Handler from '@/components/Handler.vue'
	import blog from '@/api/blog.js'
	export default{
		data(){
			return{
				current:1,//当前页
				size:3,//每页记录
				total:1,//总记录数
				blogs:{},//博客数据
				userId:0,//用户id
			}
		},
		components:{
			Handler
		},
		created() {
			if(this.$store.state.userInfo!=null||this.$store.state.userInfo!=undefined){//如果有用户信息
				this.userId=this.$store.state.userInfo.id//获取用户id
			}
			this.init()
		},
		methods:{
			init(){
				this.limitSelect()
			},
			currentChange(val){
				this.current=val;
				this.limitSelect()
			},
			/* 分页获取博客 */
			limitSelect(){
				blog.limitSelect(this.current,this.size).then(response=>{
					this.blogs=response.data.data.limitBlog.records//获取所有博客数据
					this.total=response.data.data.limitBlog.total//获取total
					this.size=response.data.data.limitBlog.size//获取size
					this.current=response.data.data.limitBlog.current//获取current
				})
			},
			/* 查看博客详情页面 */
			blogDetail(id){
				this.$router.push({name:"BlogDetail",params:{BlogId:id}});
			},
			/* 删除博客 */
			deleteBlogById(id,userId){
				if(this.userId===userId){//表示当前博客是自己的可以删除
					this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
					  confirmButtonText: '确定',
					  cancelButtonText: '取消',
					  type: 'warning'
					}).then(() => {
						blog.deleteBlogById(id).then(response=>{
							if(response.data.code===20000){
								this.$message({
								          message: '删除成功',
								          type: 'success'
								        });
								this.init();
							}else{
								this.$message.error(response.data.message);
							}
						}).catch(error=>{
							this.$message.error(error.data.message);
						})
					}).catch(() => {
					  this.$message({
						type: 'info',
						message: '已取消删除',
						});
					  });
				}else{
					this.$message.error("你没有权限删除此博客");
				}
				
			},
			/* 修改博客 */
			updateBlogById(id,userId){
				if(this.userId===userId){//表示当前博客是自己的可以修改
					this.$router.push({name:"BlogEdit",params:{BlogId:id}});
				}else{
					this.$message.error("这篇文章不是你的哦!");
				}
				
			},
			/* 保存博客 */
			blogDetailsave(){
				if(this.$store.state.loginFlag){//如果为true表示已登录
					this.$router.push({name:"BlogAdd"})
				}else{
					this.$message({
							type: 'info',
							message: '请登录',
							});
					this.$router.push({name:"Login"})
				}
			}
		}
	}
</script>

<style>
	#handler{
		position: relative;
	}
	.blog{
		  background-image:url(http://www.lzqcode.com/templets/static/image/index_bg.jpg);/* 首页背景图片 */
		  background-position: center;/* 背景图片位置始终居中显示 */
		  background-attachment: fixed;/* 背景固定 */
		  background-repeat: no-repeat;/* 不平铺 */
		  position: relative;/* 相对定位 */
		  height: 100vh;/* 100vh表示正好和浏览器窗口大小一致 */
	}
	.block{
		height: 80vh;
	}
	#item{
		min-width: 500px;
		border:0;
		background-color: rgba(0,0,0,0.5);
		box-shadow: 5px 5px 5px rgba(0,0,0,0.5); 
		color: rgba(255,255,255,0.8);
		transition: 0.5s;
		overflow:hidden;
		position: relative;
		
	}
	#item:hover{
		box-shadow: 5px 5px 5px rgba(0,0,0,0.5);
		transform: translateY(-10%);
		transform: scale(1.02,1.02);
	}
	#item h4,#item p{
		text-align: left;
		text-shadow: 5px 5px 9px rgba(255,255,255,0.5);
		font-family: "agency fb";
		transition: 0.5s;
	}
	#item:hover h4,#item:hover p{
		text-shadow: 5px 5px 9px rgba(255,255,255,1);
	}
	.buttonC{
		display: inline-block;
		position: absolute;
		right: 2.5%;
		bottom: 30%;
	}
	#a{
		transition: 0.5s;
		box-shadow:1px 2px 15px rgba(255,255,255,0.7);
		opacity: 0.5;
	}
	#a:hover{
		box-shadow:1px 2px 15px rgba(255,255,255,1);
		opacity: 1;
	}
</style>

二、博客编辑

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

1、整合mavon-editor编辑器

安装依赖
npm install mavon-editor --save

在这里插入图片描述

main.js中引入

在这里插入图片描述

import mavonEditor from 'mavon-editor'

import 'mavon-editor/dist/css/index.css'

Vue.use(mavonEditor)

2、博客编辑页面

<template>
	<div class="blogEdit">
		<Handler id="handler"></Handler>
		<el-container>
		  <el-header >
			  <el-form id="BlogForm" :inline="true" :model="blogMD" class="demo-form-inline" style="min-width: 950px;">
			    <el-form-item id="el-item" label="">
			      <el-input  v-model="blogMD.title" placeholder="标题" style="min-width: 90vh;"></el-input>
			    </el-form-item>
				<el-form-item id="el-item" label="">
			      <el-button type="primary" @click="save()">{{saveTitle}}</el-button>
				</el-form-item>
				<el-form-item id="el-item" label="">
				  <el-button type="success" @click="publish()">{{publishTilte}}</el-button>
				</el-form-item>
			    <el-form-item id="el-item" label="">
			      <el-input v-model="blogMD.description" placeholder="简介" style="min-width: 117vh;"></el-input>
			    </el-form-item>
			  </el-form>
		  </el-header>
		  <div >
			  <mavon-editor v-model="blogMD.content" id="editor" @fullScreen="fullScreen()"></mavon-editor>
		  </div>
		  <!-- <el-footer>Footer</el-footer> -->
		</el-container>
	</div>
</template>

<script>
	import Handler from '@/components/Handler.vue'
	import blog from '@/api/blog.js'
	export default{
		data(){
			return{
				blogMD:{
					id:'',//博客id
					userId:'',//用户id
					title:'',//标题
					description: "test",//简介
				    content: "rest",//内容
				    status: 0,//发布状态
				},
				saveFlag:true,//true表示新建博客,false表示编辑已有博客
				saveTitle:'保存',//如果是新建就保存,不是新建就显示完成修改
				publishTilte:'未发布',//如果发布状态为0显示未发布,1显示已发布
				screenFlag:false,//当前是否是全屏模式
			}
		},
		created() {
			if(this.$route.params.BlogId===undefined||
				this.$route.params.BlogId===null||
				this.$route.params.BlogId==="")
			{//如果没有id,说明是新建博客
				this.blogMD.userId=this.$store.state.userInfo.id;//获取当前用户id
			}else{
				//有id就是修改博客
				this.saveFlag=false
				this.saveTitle="修改完成"
				this.blogMD.id=this.$route.params.BlogId
				//回显数据
				this.blogById();
			}
			if(this.blogMD.status===1){//等于1表示已经发布了
				this.publishTilte="已发布";
			}else{
				this.publishTilte="未发布";
			}
		},
		methods:{
			/* 根据博客id获取博客信息 */
			blogById(){
				blog.blogById(this.$route.params.BlogId).then(response=>{
						if(response.data.code===20000){
							const data=response.data.data.blog
							this.blogMD.userId=data.userId
							this.blogMD.title=data.title
							this.blogMD.description=data.description
							this.blogMD.content=data.content
							this.blogMD.status=data.status
						}else{
							this.$message.error(response.data.message);
						}
					}).catch(error=>{
						this.$message.error(error.data.message);
					})
			},
			publish(){
				if(this.blogMD.status===0){
					this.blogMD.status=1;//将发布状态改为1,表示已发布
					this.save();//保存
				}else{
					this.save();
				}
				
			},
			/* 保存博客 */
			save(){
				if(this.saveFlag){//如果为true,就调用保存的api
					blog.insertBlog(this.blogMD).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);
					})
				}else{//如果是else,就调用修改接口
					blog.updateBlogById(this.blogMD).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);
					})
				}
			},
			/* 全屏编辑模式 */
			fullScreen(){
				let a=document.querySelector("#editor");
				if(this.screenFlag===true){//如果是true表示当前是全屏,点击按钮后,需要缩小
					this.screenFlag=false;
					a.style.maxWidth=130+'vh'
				}else{//表示现在是小屏幕
					this.screenFlag=true;
					a.style.maxWidth=300+'vh'
				}
			}
		},
		components:{
			Handler
		}
	}
</script>

<style>
	#handler{
		position: relative;
	}
	.blogEdit{
		  background-image:url(http://www.lzqcode.com/templets/static/image/index_bg.jpg);/* 首页背景图片 */
		  background-position: center;/* 背景图片位置始终居中显示 */
		  background-attachment: fixed;/* 背景固定 */
		  background-repeat: no-repeat;/* 不平铺 */
		  position: relative;/* 相对定位 */
		  height: 100vh;/* 100vh表示正好和浏览器窗口大小一致 */
		  overflow-y: scroll;
	}
	#editor{
		/* 居中方案 */
		position: absolute;
		left: 0;
		right: 0;
		margin-left: auto;
		margin-right: auto;
		
		min-height: 70vh;
		max-width: 130vh;
		
		overflow: hidden;
	}
	.el-header, .el-footer {
	    color: #333;
	    text-align: center;
	    line-height: 60px;
		min-height: 15vh;
	}
	.el-header{
		margin-top: 2%;
	}
    .el-main {
	  color: #333;
	  text-align: center;
	  line-height: 160px;
    }
	#BlogForm{
		position: relative;
		/* top: 10%; */
	}
	#el-item{
		margin: 0 1vh;
	}  
</style>

三、博客详情页面

1、安装依赖

用来解析md格式文档
用于解析md文档 npm install markdown-it --save
md样式 npm install github-markdown-css

2、开发页面

在这里插入图片描述

<template>
	<div class="blogDetail">
		<Handler id="handler"></Handler>
		<div class="mblog">
		  <h2>{{ blogMD.title }}</h2>
		  <!-- <el-divider></el-divider> -->
		  <div class="content markdown-body" id="content" v-html="blogMD.content"></div>
		</div>
	</div>
</template>

<script>
	import 'github-markdown-css/github-markdown.css' // 然后添加样式markdown-body
	import Handler from '@/components/Handler.vue'
	import blog from '@/api/blog.js'
	export default{
		data(){
			return{
				blogMD:{
					id:'',//博客id
					userId:'',//用户id
					title:'',//标题
					description: "test",//简介
				    content: "rest",//内容
				    status: 0,//发布状态
				},
			}
		},
		created() {
			this.blogById()
		},
		methods:{
			/* 根据博客id获取博客信息 */
			blogById(){
				blog.blogById(this.$route.params.BlogId).then(response=>{
					if(response.data.code===20000){
						const data=response.data.data.blog
						this.blogMD.userId=data.userId
						this.blogMD.title=data.title
						this.blogMD.description=data.description
						/*初始化编辑器*/
						var MarkdownIt = require('markdown-it'),
						md = new MarkdownIt();
						var result = md.render(data.content);//生成转换后的内容
						this.blogMD.content = result//将转换后的内容给content
						this.blogMD.status=data.status
					}else{
						this.$message.error(response.data.message);
					}
				}).catch(error=>{
					this.$message.error(error.data.message);
				})
			},
		},
		components:{
			Handler
		}
	}
</script>

<style>
	#handler{
		position: relative;
	}
	.blogDetail{
		  background-image:url(http://www.lzqcode.com/templets/static/image/index_bg.jpg);/* 首页背景图片 */
		  background-position: center;/* 背景图片位置始终居中显示 */
		  background-attachment: fixed;/* 背景固定 */
		  background-repeat: no-repeat;/* 不平铺 */
		  position: relative;/* 相对定位 */
		  height: 100vh;/* 100vh表示正好和浏览器窗口大小一致 */
		  overflow-y: scroll;
	}
	#content{
		background-color: rgba(255,255,255,0.5);
		box-shadow: 5px 5px 15px rgba(0,0,0,0.5);
		border-radius: 50px;
		text-align: left;
		margin: 0 10%;
		padding: 5% 0;
		min-width: 70vh;
		min-height: 80vh;
	}
</style>

vue实战开发三(博客页面总览) 文章目录前言项目结构首页编辑器个人空间总结 前言 经过差不多五天的时间对前端进行开发,现在总算是把基本的客户端的前端页面做得差不多了,关于后端页面的话,嫖一个后端模板就好了,主要还是客户端的这一块要做好。这个也是本人第一做前后端的项目,可能多有不足,请多多指教~ 先来说说目前white hole 大致的功能的吧,关于这个项目的话其实在国庆的时候我是用Django 用 MVT的模式开发了一个的,当然后面由于各种原因没进行下去,一方面是没时间,另一方面是前端不好做,前后端耦合太紧密了导致我开发的时候逐渐偏离了方 阅读详情

相关推荐

Spring boot+Vue3博客平台:文章发布与编辑功能的技术实现

本文将详细介绍如何实现一个博客平台中的文章发布与编辑功能,包括前端的Vue组件设计和后端的Spring Boot接口实现。在阅读本文后,您将了解如何设计和实现高效、易用的文章发布与编辑功能。一、发布文章(1) 创建文章发布表单在前端,使用Vue框架创建一个文章发布表单组件。该组件包括标题、正文、标签等输入框,以及一个富文本编辑器。用户填写表单后,调用后端接口提交文章。(2) 实现文章发布接口在后端,使用Spring Boot创建一个处理文章发布请求的接口。首先,对用户提交的文章内容进行验证。

斌擎科技 1724

vue+element详细完整实现个人博客、个人网站

接上一篇《vue+elementui实现非常好看的博客、网站首页,网站模板》。 上一篇实现了整个框架的搭建和首页的编码,在此基础上,这一期进行了最终的功能页面完善,增加了功能:同时对样式进行了更深层的改造和优化。 文章详情: 心情说说+我的相册+相册详情 所有文章+标签合集 四.数据处理 主要数据就是文章+相册,分别声明为json数据格式,存储于页面缓存,因为app.vue是一定会加载的,所以作者把这些初始化数据和存储操作都放在了app.vue,利于其他页面获取缓存加载

lucky_fang的博客 1万+

基于Spring Boot和Vue3的博客平台发布、编辑、删除文章功能实现

在上一个教程中,我们已经实现了基于Spring Boot和Vue3的用户注册与登录功能。本教程将继续引导您实现博客平台的发布、编辑、删除文章功能。在这个博客教程中,我们实现了基于Spring Boot和Vue3的发布、编辑、删除文章功能。1.1. 创建Article实体类:定义文章的数据结构。1.2. 创建ArticleMapper接口:定义与数据库交互的操作。1.3. 创建ArticleService接口及其实现:提供具体的业务逻辑,如查询、创建、更新和删除文章。

斌擎科技 728

Vue个人博客前端开源。多页面,前后台分开打包,IE空白配置等总结

项目演示 网站首页:https://www.yunmobai.cn/ 网站源码:https://gitee.com/baymaxsjj/by-vue-blog

Baymax的博客 1971

Vue项目之个人博客

我的个人博客,里面是我的第一个个人Vue项目,希望大家可以来看看

大开眼界的十大开源人工智能项目

这是一个强大的开源工具,能让你在不同框架之间自由切换,无需重写代码。它是一个开源工具,能用简单的SQL语言同时处理数据和AI模型,让一切变得有序而高效。Rasa是我开发智能聊天机器人时的首选,它让你轻松掌控机器人对话的每个细节。我经常用它快速验证模型在不同框架下的表现,省去了大量烦躁的调试过程。最近发现的Vapi是一个以API方式提供的语音AI工具,开发者友好程度超乎想象。KNIME是一个以拖拽方式构建数据分析流程的开源工具,仿佛是数据界的乐高积木。它像个忠诚的守门员,确保你的模型始终健康运行。

wjianwei666的专栏 1105

搭建个人博客网站 -- vue初学者学习总结

阅读源码,初步学习Vue。本贴属个人学习总结。

spacewow的博客 3335

使用 Mid360 从零开始搭建实物机器人入门级导航系统 —— 基于 Fast_Lio 和 Move_Base

本文详细介绍了如何使用Mid360机器人从零开始搭建一个基于Fast_Lio和Move_Base的入门级导航系统。通过配置 ROS2、集成激光雷达、IMU、Fast_Lio、Move_Base 等模块,我们成功构建了一个能够实现自动导航的机器人系统。在实际开发中,随着需求的变化,你可以不断调整参数、优化路径规划算法、增加新的传感器等,逐步提升机器人的智能与功能。

小蜗牛的珍贵百宝箱 3564

个人博客系统(Vue实现)的主页布局设计

Vue主页设计

qq_51476492的博客 8200

逆向解析手淘x-sign签名算法:从抓包到API调用的完整实践

本文详细解析了手淘x-sign签名算法的逆向过程,从抓包工具选择到API调用实践,提供了完整的解决方案。通过分析签名参数组成和生成机制,帮助开发者理解并实现淘宝接口的合法调用,同时强调了安全与合规的重要性。

weixin_29323273的博客 604

centos7安装db2 version11.1

centos7安装db2 version11.1

AKA石头 1062

Vue + Spring Boot 项目实战(十八):博客功能开发

利用开源 markdown 编辑器为白卷项目开发文章管理与展示模块。

Evan 的博客 3万+

数字IC后端设计实现 | PR工具中到底应该如何控制density和congestion?(ICC2&Innovus)

数字IC后端设计实现中到底应该如何控制cell density和congestion?(ICC2和Innovus两种解决方案)

weixin_37584728的博客 7112

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

STM32U575 ADC+DMA+UART数据采集实战:CubeMX配置避坑与代码实现

在嵌入式开发中,ADC采集与DMA传输是提升系统实时性的关键技术。通过DMA将ADC数据直接搬运到内存,可大幅降低CPU占用,实现高效连续采样。结合UART的DMA发送,能进一步解放CPU,适用于工业采集、信号监测等场景。本文以STM32U575为例,详解CubeMX中ADC、DMA、UART的配置要点,包括时钟树、DMAMUX映射、循环模式等,并给出代码实现与常见问题排查,帮助开发者快速构建稳定的数据采集链路。

weixin_29194255的博客 170

YOLOv8【第十一章:视频追踪与流处理篇·第3节】匈牙利算法(Hungarian Algorithm)与 KM 算法匹配机制详解!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 444

Vue + Spring Boot 项目实战(三):前后端结合测试(登录页面开发)

构建 Spring Boot 项目并通过登录 DEMO 打通前后端的联系,为下一步开发打下基础。

Evan 的博客 27万+

【RKNN】RKNN(Rockchip Neural Network)​​ 的详解

RKNN 为 Rockchip 硬件提供了高效的 AI 推理解决方案,适合需要低功耗、实时响应的边缘场景

浩瀚之水的专栏 1684

计算机毕设Springboot个人博客系统 基于Spring Boot的个人博客平台设计与实现 Spring Boot驱动的个人博客系统开发与应用

该个人博客系统通过整合Spring Boot框架的优势,实现了用户友好的操作界面和强大的后台管理功能。此外,系统还具备高效的用户管理和系统管理功能,确保平台的稳定运行和良好秩序。整体而言,该系统为用户提供了一个功能丰富、操作便捷的个人博客平台,能够有效促进知识共享和信息交流。注:完成的毕业设计程序以下面的的环境软件、功能图和界面为准。系统所需要的环境软件:idea、eclipse+mysql5.7、8.0+Navicat+JDK1.8+tomcat7.0。

wek106的博客 939

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Statistics and Machine Learning Toolbox

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

Spring Boot + vue-element 开发个人博客项目实战教程(二十四、文章管理页面开发(3))

后端代码gitee地址:https://gitee.com/xyhwh/personal_blog前端代码gitee地址:https://gitee.com/xyhwh/personal_vue还是接着上边的来写,下面就剩下文章的展示一块了,马上这个系统就完结了,我看了一下即将写了一年,断断续续的。感谢大家的支持!这个列表相信大家已经写了很多遍了,现在可以说大概的思路应该掌握在手,这里我对后端又进行了处理,以前的bug也修复了一些,我这里先把后端改的代码来说一下。1、首先修改了根据分类id查找分类信息这里的

码上言 2282

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Spring Boot+Vue 3构建个人博客系统:从零到部署的完整实践指南

在Web开发领域,前后端分离架构已成为构建现代应用的主流范式。其核心原理在于将前端界面与后端业务逻辑解耦,通过RESTful API进行数据交互,从而实现技术栈独立、开发效率提升和系统可维护性增强。这种架构模式的技术价值在于,它允许开发者根据项目需求灵活选择最合适的前端框架(如Vue.js、React)和后端框架(如Spring Boot),并通过清晰的接口契约实现高效协作。在众多应用场景中,个人博客系统是一个经典的练手项目,它天然涵盖了用户认证、数据CRUD、文件处理和前后端通信等核心开发环节。本文聚焦于

weixin_30627341的博客 655

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

基于Spring Boot+Vue的校园二手交易平台

基于Spring Boot+Vue的校园二手交易平台

听夜雨声烦 3746

基于Spring Boot+Vue的博客系统

项目概述目标:构建一个功能完善、用户体验良好的博客系统,方便用户发表和管理文章,同时为读者提供便捷的阅读和互动平台。技术栈:前端采用Vue.js框架,后端基于Spring Boot框架,数据库使用MySQL,缓存采用Redis等。功能模块用户管理:支持用户的注册、登录、个人信息修改等功能。用户可以通过手机号或邮箱进行注册,登录时可选择图形验证码等方式验证身份。文章管理:博主可以撰写、编辑和发布文章,文章支持分类、标签管理,方便用户对文章进行组织和检索。

weixin_52721608的博客 796

Spring Boot + vue-element 开发个人博客项目实战教程(二十一、个人介绍、公告管理、标签管理开发)

本教程主要是使用SpringBoot+Vue从零搭建自己的个人博客系统,大家可以当做基础的项目来学习。

码上言 4143

计算机毕业设计Springboot个人博客系统 基于Spring Boot框架的个人博客平台开发与实现 Java Spring Boot驱动的个人博客系统设计与构建

本系统通过集成多种功能,为用户提供了一个全面且易于使用的个人博客平台。从用户注册到文章发布,从评论互动到个性化设计,系统涵盖了个人博客管理的各个方面。通过Spring Boot框架的高效开发和MySQL数据库的稳定支持,系统不仅保证了良好的用户体验,还具备了高效的数据处理能力和强大的扩展性。无论是初学者还是资深博主,都能通过本系统轻松搭建和管理自己的个人博客,分享知识、记录生活、表达观点。注:完成的毕业设计程序以下面的的环境软件、功能图和界面为准。

海灵学姐 976

计算机毕业设计Springboot基于vue的博客系统设计与实现 基于Spring Boot与Vue的个人博客平台开发与实践 Spring Boot结合Vue实现的博客系统架构与功能设计

计算机毕业设计Springboot基于vue的博客系统设计与实现vg5340r9(配套有源码 程序 mysql数据库 论文)本套源码可以先看具体功能演示视频领取,文末有联xi 可分享随着互联网技术的飞速发展,个人博客已成为人们分享知识、记录生活、交流思想的重要平台。传统的博客系统多依赖于服务器端渲染技术,用户体验和开发效率受到一定限制。近年来,前后端分离架构逐渐成为主流,Spring Boot作为强大的后端开发框架,与Vue.js这一高效的前端框架相结合,为构建高性能、易维护的博客系统提供了新的思路。本项目

wuzhou205的博客 939
上一篇: spring boot+vue个人博客五:完成登陆注册页面,nginx网关对接后端
下一篇: 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、付费专栏及课程。

余额充值