基于Golang+Vue3快速搭建的博客系统

WANLI 博客系统

项目介绍

基于vue3和gin框架开发的前后端分离个人博客系统,包含md格式的文本编辑展示,点赞评论收藏,新闻热点,匿名聊天室,文章搜索等功能。

项目在线访问:http://bloggo.chat/ 或 http://59.110.34.61/

访客账号:test 密码:test
也可以使用邮箱自己注册。

GitHub地址:ginblog-wanli


功能展示

B 站视频

图片展示:
在这里插入图片描述

在这里插入图片描述


技术介绍

开发环境
开发工具功能描述
GoLand后端开发
Vscode前端开发
ApifoxAPI测试
Ubuntu依赖软件运行
xftp、xsheelLinux 远程工具
开发环境版本
GoLang1.22.3
nodejs20.14.0
MySQL8.0
Elasticsearch、kibana、ik7.12.0
Redis7.0.8

技术栈

这里只写一些主流的通用技术,详细第三方库:前端参考 package.json 文件,后端参考 go.mod 文件

功能描述前端官方地址
Vue3框架vuejshttps://cn.vuejs.org/
Vue组件ant-design-vuehttps://next.antdv.com/docs/vue/introduce-cn/
Mark Downmd-editor-v3https://imzbf.github.io/md-editor-v3/
状态管理工具piniahttps://pinia.vuejs.org/
构建工具vitehttps://cn.vitejs.dev/
可视化图表库echartshttps://echarts.apache.org/zh/index.html
功能描述后端官方地址
GO语言golanghttps://github.com/golang/go
WEB框架ginhttps://gin-gonic.com/zh-cn/docs/
API文档swaggohttps://github.com/swaggo
ORM 库gormhttps://github.com/go-gorm/gorm
日志库logrushttps://github.com/sirupsen/logrus

本地运行

自行安装 Golang、Node、MySQL、Redis 、Elasticsearch 环境
Golang 安装参考官方文档
Node 建议安装使用 https://nodejs.org/zh-cn 的长期维护版
MySQL、Redis、Elasticsearch 建议使用 Docker 运行

后端项目运行:

# 1、启动MySQL、Redis、Elasticsearch,其中mysql需要新建一个库
# 2、修改项目运行的配置文件 settings.yaml# 3、初始化运行环境
go mod tidy 				# 下载当前项目所依赖的包
go run main.go -db 			# mysql建表
go run main.go -es create	# elasticsearch建索引# 4、mysql插入菜单表数据
INSERT INTO gvb.menu_models (id, created_at, updated_at, title, path, slogan, abstract, abstract_time, banner_time, sort) VALUES (1, NOW(), NOW(), '首页', '/', '众神眷恋的幻想乡', '天寒地冻路远马亡又何妨', 5, 5, 1);
INSERT INTO gvb.menu_models (id, created_at, updated_at, title, path, slogan, abstract, abstract_time, banner_time, sort) VALUES (2, NOW(), NOW(), '新闻', '/news', '新闻三分钟,知晓天下事', '震惊!男人看了会沉默,女人看了会流泪!不转不是中国人!',  5, 5, 2);
INSERT INTO gvb.menu_models (id, created_at, updated_at, title, path, slogan, abstract, abstract_time, banner_time, sort) VALUES (3, NOW(), NOW(), '文章搜索', '/search', '文章搜索', '文章搜索',  5, 5, 3);
INSERT INTO gvb.menu_models (id, created_at, updated_at, title, path, slogan, abstract, abstract_time, banner_time, sort) VALUES (4, NOW(), NOW(),'聊天室', '/chat_group', '聊天室', '聊天室',  5, 5, 4);# 5、创建第一个用户,后续可在前端创建或注册
go run main.go -u admin		# 管理员
go run main.go -u user		# 普通用户# 6、启动项目
go run main.go

前端项目运行:

# 下载当前项目所依赖的包
npm insatll
# 启动项目
npm run dev

线上部署(Linux)| 阿里云服务器 | 七牛云存储

本项目线上部署目录结构如下,必需的目录及文件:

  gvb└─deploy└─gvb├─elasticsearch│  ├─config│  ├─data│  └─plugins			│  	  └─ik    # 使用ik分词器,下载7.12.0版本,然后解压重命名为ik,上传到linux挂载的plugins目录下├─gvb_server  # 服务端代码,这个不用容器启动 直接 ./main 启动即可│  ├─docs│  ├─uploads│  ├─main(二进制文件)│  └─settings.yml(配置文件)├─gvb_web│  └─dist├─mysql│  └─data├─nginx│  ├─conf│  ├─html│  └─logs└─redis└─data

安装Docker和docker-compose

只需要提前安装好docker运行环境,可自行上网搜索资料安装

安装地址:[https://developer.aliyun.com/article/708974


依赖软件准备

后端Golang中的settings.yaml文件,请自行修改你的配置内容。

在服务器上使用docker-compose启动所有容器:mysql、redis、elasticsearch、kibana、nginx

docker-compose.yml 和 .env 文件放在部署服务器的 deploy 目录下,cd 到deploy启动docker-compose,以下是各个文件的内容。

1、docker-compose.yml 文件

version: "3"networks:gvb-network:driver: bridgeipam:config:- subnet: ${SUBNET}services:gvb-redis:image: redis:7.0.8-alpinecontainer_name: gvb-redisvolumes:- ${GVB_DATA_DIRECTORY}/redis/data:/dataports:- ${REDIS_PORT}:6379 # 自定义的是暴露出去的端口, Redis 容器内运行固定为 6379command: redis-server --requirepass ${REDIS_PASSWORD} --appendonly yesnetworks:gvb-network:ipv4_address: ${REDIS_HOST}gvb-mysql:image: mysql:8.0container_name: gvb-mysqlvolumes:- ${GVB_DATA_DIRECTORY}/mysql/data:/var/lib/mysqlenvironment:- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD} # root 账号的密码- MYSQL_DATABASE=${MYSQL_DATABASE} # 初始化的数据库- MYSQL_USER=${MYSQL_USER}- MYSQL_PASSWORD=${MYSQL_PASSWORD}- TZ=Asia/Shanghaicommand: --max_connections=1000--character-set-server=utf8mb4--collation-server=utf8mb4_general_ciports:- ${MYSQL_PORT}:3306 # 自定义的是暴露出去的端口, MySQL 容器内运行固定为 3306networks:gvb-network:ipv4_address: ${MYSQL_HOST}gvb-elasticsearch:image: elasticsearch:7.12.0container_name: gvb-elasticsearchvolumes:- ${GVB_DATA_DIRECTORY}/elasticsearch/data:/usr/share/elasticsearch/data- ${GVB_DATA_DIRECTORY}/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml- ${GVB_DATA_DIRECTORY}/elasticsearch/plugins:/usr/share/elasticsearch/pluginsenvironment:- discovery.type=single-node- ES_JAVA_OPTS=-Xms128m -Xmx256mports:- ${ELASTICSEARCH_PORT01}:9200 # 自定义的是暴露出去的端口, elasticsearch 容器内运行固定为 9200和9300- ${ELASTICSEARCH_PORT02}:9300networks:gvb-network:ipv4_address: ${ELASTICSEARCH_HOST}command:["/bin/sh","-c","chmod -R 777 /usr/share/elasticsearch/data /usr/share/elasticsearch/config /usr/share/elasticsearch/plugins && /usr/local/bin/docker-entrypoint.sh",]gvb-nginx:image: nginx:latestcontainer_name: gvb-nginxvolumes:- ${GVB_DATA_DIRECTORY}/nginx/conf/nginx.conf:/etc/nginx/nginx.conf- ${GVB_DATA_DIRECTORY}/nginx/logs:/var/log/nginx- ${GVB_DATA_DIRECTORY}/gvb_web:/usr/share/nginx/html # 修改路径为 nginx 默认的 web 根目录- ${GVB_DATA_DIRECTORY}/gvb_server:/usr/share/nginx/server # 修改路径为 nginx 默认的服务器目录ports:- ${NGINX_PORT}:80 # 自定义的是暴露出去的端口, nginx 容器内运行固定为 80networks:gvb-network:ipv4_address: ${NGINX_HOST}gvb-kibana:image: kibana:7.12.0container_name: gvb-kibanaenvironment:- ELASTICSEARCH_HOSTS=http://gvb-elasticsearch:9200ports:- ${KIBANA_PORT}:5601networks:gvb-network:ipv4_address: ${KIBANA_HOST}

2、 .env 文件(相关参数自行修改)

# https://docs.docker.com/compose/migrate/
# docker-compose.yml 同目录下的 .env 文件会被加载为其环境变量# COMPOSE_PROJECT_NAME=gin-vue-blog# 数据存储的文件夹位置 (默认在当前路径生成 gvb 文件夹)
GVB_DATA_DIRECTORY=./gvb# Redis
REDIS_PORT=6379
REDIS_PASSWORD=password# Kibana
KIBANA_PORT=5601# MySQL
MYSQL_PORT=3306
MYSQL_ROOT_PASSWORD=password
MYSQL_DATABASE=gvb_db
MYSQL_USER=gvb
MYSQL_PASSWORD=password# Elasticsearch
ELASTICSEARCH_PORT01=9200
ELASTICSEARCH_PORT02=9300# Nginx
NGINX_PORT=80# Docker Network (一般不需要变, 除非发生冲突)
SUBNET=172.12.0.0/24
REDIS_HOST=172.12.0.2
MYSQL_HOST=172.12.0.3
ELASTICSEARCH_HOST=172.12.0.4
KIBANA_HOST=172.12.0.5
NGINX_HOST=172.12.0.6

后端 settings.yml 配置文件,在目录:gvb\deploy\gvb\gvb_server 下。

mysql:host: 你的服务器地址port: 3306config: charset=utf8mb4&parseTime=True&loc=Localdb: gvb_dbuser: rootpassword: xxxlog_Level: ""
logger:level: infoprefix: '[gvb]'director: logshow-line: truelog-in-console: true
system:host: 0.0.0.0port: 8080env: releasessl-pem: ""ssl-key: ""
site-info:created_at: "2024-07-17"bei_an: 等待中title: 万里的个人博客qq_image: /uploads/file/admin/qq_20240717101939.jpgversion: 1.0.1email: 2597029604@qq.comwechat_image: /uploads/file/admin/wechat_20240717101945.jpgname: WANLIjob: Golang后端开发addr: 北京slogan: 万里slogan_en: WANLIweb: http://bloggo.chat/bilibili_url: https://space.bilibili.com/1829444123?spm_id_from=333.1007.0.0gitee_url: https://gitee.com/xiwanligithub_url: https://github.com/xzhHas/ginblog-wanli
qq:app_id: key: redirect: http://127.0.0.1/login?flag=qq
qiniu:enable: trueaccess_key: secret_key: bucket: gvbdbcdn: http://spaotwd8k.hb-bkt.clouddn.com/zone: z1prefix: gvbsize: 150
email:host: smtp.qq.comport: 465user: xxx@qq.compassword: default-from-email: xxx@qq.comuse_ssl: trueuser_tls: false
jwt:secret: 9Saj0XAf8SdTYHj3lq6EOnyIrSfC5D6Dexpires: 1issuer: xiwanli
upload:size: 150path: uploads/file/
redis:ip: 你的服务器地址port: 6379password: "xxx"pool_size: 100
es:host: http://你的服务器地址port: 9200user: ""password: ""

Elasticsearch 配置文件:elasticsearch.yml,在目录:gvb\deploy\gvb\elasticsearch\config 下。

http.host: 0.0.0.0

nginx配置文件:nginx.conf,在目录:gvb\deploy\gvb\nginx\conf 下。

user  root;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log  main;sendfile        on;tcp_nopush     on;client_max_body_size 8M; # 上传文件大小限制keepalive_timeout  65;server {listen 80; # HTTPserver_name bloggo.chat www.bloggo.chat; # 域名# 前端请求处理location / {root   /usr/share/nginx/html/dist/;index  index.html index.htm;try_files $uri $uri/ /index.html;}# WebSocket 请求处理location /wsUrl/ {rewrite ^/wsUrl/(.*)$ /$1 break;   # 长连接时间proxy_pass http://你的服务器地址/api/;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Host $server_name;proxy_read_timeout 3600s;  # 长连接时间}# API 请求处理location /api/ {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://你的服务器地址/api/;}# 文件上传处理location /uploads/ {alias /usr/share/nginx/server/uploads/;}# Swagger 文档处理location /swagger/ {proxy_pass http://你的服务器地址/swagger/;}}
}

应用程序准备

后端项目打包生成的main文件、docs文件夹、settings.yaml、uploads文件夹复制至部署服务器的 gvb_server 目录下。

# 生成api文档
swag init # 后端go打包(请使用cmd打包,不然打包后的文件还可能是windows的版本)
set GOARCH=amd64
set GOOS=linux
set CGO_ENABLED=0
go build -o main 

前端项目打包生成的dist文件夹及其文件复制至部署服务器的 gvb_web 目录下。

# 前端npm打包
npm run build

启动应用

修改好各项配置

# docker compose 启动依赖软件
cd xxxxx/gvb/deploy/
docker compose up -d#启动后端应用
cd xxxxx/gvb/gvb_server/
./main -es create (首先创建es的索引)
./main (启动后端程序)

访问应用


最后

感谢观看。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

深入搞懂Checkpoint调优基础及原理

前言 在执行大量写操作的系统上,调优检查点对于获得良好的性能至关重要。然而,检查点是我们经常发现混淆和配置问题的地方之一,无论是在社区邮件列表中,还是在为客户提供支持和咨询期间。这篇文章旨在解释检查点是什么——目的和数据库如何实现它——以及如何调优它们。 注…

chapter08-面相对象编程的三大特征——封装

1、基础介绍 对电视机的操作就是典型封装 封装的好处:隐藏实现细节;可以对数据进行验证 2、封装的实现 3、入门案例 altinsert,getter and setter,自动插入

Docker(十)-Docker运行elasticsearch7.4.2容器实例

1.下载镜像 1.1存储和检索数据 docker pull elasticsearch:7.4.2 1.2可视化检索数据 docker pull kibana:7.4.22.创建elasticsearch实例 创建本地挂载数据卷配置目录 mkdir -p /software/elasticsearch/config 创建本地挂载数据卷数据目录 mkdir -p /software/elasticse…

Linux——管理本地用户和组(详细介绍了Linux中用户和组的概念及用法)

目录 一、用户和组概念 (一)、用户的概念 (二)、组的概念 补充组 主要组 二、获取超级用户访问权限 (一)、su 命令和su -命令 ( 二)、sudo命令 三、管理本地用户账户 &…

PyTorch模型训练步步详解:从零开始构建深度学习流程

P y T o r c h 训练模型流程图 PyTorch训练模型流程图 P y T orc h 训练模型流程图

基于STM32瑞士军刀--【FreeRTOS开发】学习笔记(二)|| 堆 / 栈

堆和栈 1. 堆 堆就是空闲的一块内存,可以通过malloc申请一小块内存,用完之后使用再free释放回去。管理堆需要用到链表操作。 比如需要分配100字节,实际所占108字节,因为为了方便后期的free,这一小块需要有个头部记录…

Python | Leetcode Python题解之第283题移动零

题目&#xff1a; 题解&#xff1a; class Solution:def moveZeroes(self, nums: List[int]) -> None:n len(nums)left right 0while right < n:if nums[right] ! 0:nums[left], nums[right] nums[right], nums[left]left 1right 1

【管控业财一体化】

1. 引言 大型集团在现代企业管理中扮演着举足轻重的角色&#xff0c;其管控业财一体化解决方案是实现企业高效运营的关键。随着数字化转型的加速&#xff0c;业财一体化不再局限于财务与业务流程的简单融合&#xff0c;而是向着更深层次的数据驱动、智能化决策和价值创造方向发…

Java入门:05.Java中的数组002

通过上篇文章&#xff0c;相信大家对数组应该有了一个简单的了解&#xff0c;并对Java中的数据类型有了一个基本的认识&#xff0c;不仅如此我们还明白了怎样定义一个数组类型的变量&#xff0c;在这之后&#xff0c;让我们一起来更加深入的了解一下数组吧。 三、如何创建一个…

哈希表相关的力扣题和讲解和Java、C++常用的数据结构(哈希法)

20240725 一、什么时候适用什么样的结构。1.java中1.1 HashSet&#xff1a;1.2 TreeSet&#xff1a;1.3 LinkedHashSet&#xff1a;1.4 HashMap&#xff1a;1.5 TreeMap&#xff1a;1.6 LinkedHashMap&#xff1a;1.7 总结 2. c中2.1 std::unordered_set&#xff1a;2.2 std::s…

Python3网络爬虫开发实战(3)网页数据的解析提取

文章目录 一、XPath1. 选取节点2. 查找某个特定的节点或者包含某个指定的值的节点3. XPath 运算符4. 节点轴5. 利用 lxml 使用 XPath 二、CSS三、Beautiful Soup1. 信息提取2. 嵌套选择3. 关联选择4. 方法选择器5. css 选择器 四、PyQuery1. 初始化2. css 选择器3. 信息提取4. …

高等院校智慧校园建设规划设计方案

高等院校智慧校园建设规划设计方案摘要&#xff1a; 项目背景某学校是一所培养学前教育教师的高等专科学校&#xff0c;目前正致力于数字化校园平台的建设&#xff0c;以提升信息化和数字化建设管理水平&#xff0c;促进教学质量和管理效率的提升。 数字校园对职业教育的意义信…

Java基础-Atomic原子类

Java基础-Atomic原子类 一、Atomic 原子类简介 Atomic原子&#xff1a;指一个操作是不可中断的&#xff0c;即使是在多个线程一起执行的时候&#xff0c;一个操作一旦开始&#xff0c;就不会被其他线程干扰。所谓原子类说简单点就是具有原子/原子操作特征的类。并发包java.ut…

谷粒商城实战-58-商品服务-API-三级分类-删除-批量删除小结

文章目录 一&#xff0c;增加一个批量删除的按钮并绑定事件二&#xff0c;全栈工程师三&#xff0c;逆向工程在全栈开发中的应用提升效率的方式&#xff1a;使用案例&#xff1a; 这一节的主要内容是开发批量删除分类的功能。 一&#xff0c;增加一个批量删除的按钮并绑定事件 …

树莓派智能家居中枢

一个先进的枢纽&#xff0c;使智能家居系统更智能、更可定制、更易于控制 Homey Pro由树莓派 Compute Module 4 供电,Homey Pro 为用户提供了一个单一界面,用于控制和监控来自不同品牌的所有智能家居设备。它完全在本地网络上运行,而不是依赖云端,从而实现了最低的延迟、最高的…

【数据结构】单链表的增删改查

介绍 链表是有序的列表&#xff0c;但是它在内存中是如下存储的&#xff1a; ①链表以节点的方式进行存储&#xff0c;是链式存储的 ②每个节点包含 data 域、next 域&#xff1a;指向下一节点 ③链表的各个节点不一定是连续存放的 ④链表分为有头节点的链表和没有头节点的链表…

netty入门-6 Handler和Pipeline

前言 书上讲服务器客户端创建三个要点&#xff0c;线程模型(Group)&#xff0c;IO模型(NioSocketChannel)&#xff0c;处理逻辑。 这篇的Handler和Pipeline&#xff0c;就是我们IO操作的处理逻辑。 然后下篇说ByteBuf这个Netty自己实现的数据封装组件。 Handler和Pipeline 我…

GAT知识总结

《GRAPH ATTENTION NETWORKS》 解决GNN聚合邻居节点的时候没有考虑到不同的邻居节点重要性不同的问题&#xff0c;GAT借鉴了Transformer的idea&#xff0c;引入masked self-attention机制&#xff0c; 在计算图中的每个节点的表示的时候&#xff0c;会根据邻居节点特征的不同来…

57 数据链路层

用于两个设备&#xff08;同一种数据链路节点&#xff09;之间传递 目录 对比理解“数据链路层” 和 “网络层”以太网 2.1 认识以太网 2.2 以太网帧格式MAC地址 3.1 认识MAC地址 3.2 对比理解MAC地址和IP地址局域网通信MTU 5.1 认识MTU 5.2 MTU对ip协议的影响 5.3 MTU对UDP的…

javafx的ListView代入项目的使用

目录 1. 创建一个可观察的列表&#xff0c;用于存储ListView中的数据,这里的User是包装了用户的相关信息。 2.通过本人id获取friendid&#xff0c;及好友的id&#xff0c;然后用集合接送&#xff0c;更方便直观一点。 3.用for遍历集合&#xff0c;逐个添加。 4.渲染器&…