1 Star 0 Fork 31

蜗牛 / elk-blog

forked from 杰克 / elk-blog 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

前段时间上线了一个小博客,今天有点空总结一下http://www.milu.blog,走过路过的小伙伴不要错过。Golang 边学边撸,这个看起来不复杂的小东西前后搞了2个多月的时间。在前期技术选型时,做为一个略懂前端的菜鸟,在前端方面做了大部分舍弃,没有选择时下流行的技术栈反而选择最原始的技术栈。这样做的目的一方面希望自己能够将主要的精力聚焦在Golang开发上,能够在完成阶段小目标的同时尽量不要沉迷于前台页面细节中,另外一方面还是希望能够在初期问题比较多的时候能够快速修复快速更新,给用户和反馈问题的小伙伴能够及时响应。就算这样的目标,最终还是在前台尝试了三套不同的风格模板来展示,也花费了不少时间,有兴趣的小伙伴可以试试。当然这些都是在Pongo2模板引擎的配合下完美实现,直接更新单个页面不用重启后台服务,如果切换模板需要重启服务。

这个项目的初衷就是通过一个基础代码的练习来巩固一下对Golang基础知识的掌握,同时也能够串联起所学的其它知识,并且以最简单的开发方式能够快速开发完成并能发布上线。由于侧重的是Golang,前台页面用简单的服务端方式渲染,没有npm,webpack,没有安装依赖、压缩,粗暴而简单。后台管理页面在 Layuimini 的基础上采用 iframe+vue 混合开发方式,原来通过 iframe 实现多标签的功能及基础布局框架没有变更,在业务页面直接引入 vueelement。优点是省去了安装依赖包、上线前打包的步骤,缺点是支撑不了复杂的业务。可选的技术栈有:

  1. 前台页面可以用Nuxt3 + ElementPlusNextjs + Antd等方式。
  2. 后台管理可以用 Vue3 + Arco, React + Antd 等等的方式。

仓库地址:

预览地址:

后台地址:

共提供三款基础主题,在系统管理 / 系统设置 中设置。

  • 绿色主题

绿色主题.jpg

  • 默认主题

默认主题.jpg

  • 极简主题

极简主题.jpg

  • 后台管理

管理后台.jpg

1. 相关介绍

1.1 基本介绍

  • 麋鹿博客 名字是为便于搜索引擎关键字直达,同时组成整个动物系列开源项目。总的思路就是:

    1. 简单的开发 前后端不分离,后台管理虽然使用了Vue 2.x,但是不安装依赖不打包,直接引入使用。
    2. 简单的部署 没有docker, redisFTP直接上传,适合配置低的机型部署。
    3. 简单的维护 .go文件打包发布后需要重启go应用,public、view等静态文件可单独热更新,不需要重启go服务。
  • 开发时间从5到8差不多三个月的业余时间。

  • 静态页面参考其它项目,没有投入太多的时间,只在细节上做了调整。

1.2 功能特性

  1. 文章

    • 文章发布,采用富文本 tinymcemarkdown 编辑的使用体验
    • 分类管理
    • 文章排序
    • 草稿箱
  2. Banner管理

    • Banner增加、修改、删除
  3. 评论

    • 文章评论
    • 评论回复
  4. 友情链接

    • 添加、修改、删除友链
  5. 用户

    • 修改用户基础信息
  6. 友情链接

    • 添加、修改友链
    • 友链分类
  7. 设置

    • 网站设置
    • 主题切换

1.2 技术栈

1.2.1 后台
技术 说明 官网
Golang - 1.18 开发语言 https://go.dev/
Gin - 1.8.1 Gin Web Framework https://gin-gonic.com/zh-cn/docs/
Mysql - 5.7 数据库 https://www.mysql.com/cn/
Gorm - 1.9.16 Golang ORM https://gorm.io/zh_CN/docs/index.html
Jwt Golang jwt https://github.com/golang-jwt/jwt
Pongo2 - 5 模板引擎 https://github.com/flosch/pongo2
Logrus 日志 https://github.com/sirupsen/logrus
Base64Captcha 验证码 https://github.com/mojocn/base64Captcha
Crypto 密码库 https://golang.org/x/crypto
Ini ini文件库 https://github.com/go-ini/ini
Goment 时间处理工具 https://github.com/nleeper/goment
Air 热更新工具 https://github.com/cosmtrek/air
1.2.1 前台
技术 说明 官网
Vue - 2.x 渐进式JavaScript 框架 https://cn.vuejs.org/v2/guide/
Axios 基于promise 的HTTP 库 https://github.com/axios/axios
Element-UI 前端UI组件库 https://element.eleme.io/
Tinymce 可视化HTML编辑器 https://www.tiny.cloud/
Fontawesome 图标字体库 http://www.fontawesome.com.cn/

1.3 开发工具

系统 工具 官网
Goland 开发工具 https://www.jetbrains.com/zh-cn/go/
Navicat 数据库管理工具 https://www.navicat.com.cn/
Atom 源码阅读工具 https://atom.io/
Cmder Cmd替代工具[windows] https://cmder.net/
Notepad2 临时单文件编辑[windows] http://www.flos-freeware.ch/notepad2.html
Chrome 调试工具 https://www.google.com/intl/zh-CN/chrome/

1.4 文件结构

整体的结构参考世上最优美的框架 Laravel

├─app                 // 核心代码
  ├─controller       // 控制层
    ├─admin
    └─home
  ├─database        // 数据库链接
  ├─model           // 模型层
  └─service         // 操作数据层
├─config             // 配置文件
├─pkg                // 所有工具文件
  ├─e               // 报错
  ├─hash            // 验证码
  ├─response        // 返回封装
  └─utils           // 工具库
├─public             // 所有静态资源
  ├─admin
  ├─common
  ├─data
  ├─green
  ├─home
  └─uploads
├─routers             // 路由文件
└─views               // 所有静态资源
    ├─admin
    ├─green           // 绿色主题模板
    ├─default         // 默认模板
    └─home            // 普通模板

Tips:

  • Air 由于go本身没有热加载技术,所以还需要一个热加载工具的支持。可选的也不多,
1. Fresh

Fresh满足基础的应用,每次保存文件都会生成或重新启动Web应用程序,只是这工具多年未更新所以弃用。

2. Air

Air的优点也比较突出:彩色日志输出,自定义构建或二进制命令,支持忽略子目录,启动后支持监听新目录等等的。

2.1 Air 存在问题

Air存在缓存问题,虽然在cmd里边结束Air,但刷新浏览器程序依然在运行,这时就需要手工结束进程然后重启。

// 查找 PID,9888为端口号
netstat -ano | findstr 9888
// 杀死进程,14172 查到的pid
taskkill /pid 14172 /f
2.2 Command not found 报错

如果输入 air 报这个错,那需要在系统的path里边配置项目路径,比如项目在D:\go-project,那么在path里边就应该有一条:

D:\go-project\bin
  • Pongo2 由于是前后端未分离的开发方式,所以模板引擎扮演着重要的角色,起初的选型也看了不少。比如goview,仿ejs的quicktemplate,还有类ejs的hero等等的。最后选定Pongo2的理由是功能强大,上手容易,能够容易实现分模板继承不同模板的需求。他大体的思路和语法是仿Jinja2和Django模板的或基本一样的。有诸如Extends、Macro、Block、Include等强大功能,如果有类 Django, Nunjucks 模板语法上手基本没有难度,Pongo2文档写的不是那么详细,有进一步了解还需要看仓库源码 Template_tests。 问题,与Vue的取值边界符号有冲突。

两种解决办法:

  1. Vue的标签用v-html来代替,比如:<div v-html="user.nickname"></div>
  2. 修改Vue的边界修饰符 delimiters配置方式。 Goland对Pongo2并没有提供专门的语法高亮支持,这其中推荐另外一个插件,Twig,需要2步
  3. 安装插件 File -> Settings -> Plugins -> Twig
  4. 重启开发工具

2. 如何在本地运行

以下以windows系统举例 先从官网下载安装最新版Go开发包 1.18.3,然后进行相关的配置。

2.1 环境变量的配置

在系统变量中添加 Go 开发相关的变量,需添加以下变量

变量名 说明
GOPATH d:\go-project Go 语言的开发目录
GOROOT c:\Go 安装 Go 安装目录
PATH c:\Go\bin;d:\go-project\bin 终端可以直接运行Go命令; 运行自己编译的Go程序和Air
GO111MODULE on 开启 Go.mod 功能,统一用go.mod管理开发依赖包,此功能在Go1.11版本中添加
GOPROXY https://goproxy.cn Go 包下载代理地址

2.2 数据库

2.2.1 Mysql的安装

Mysql是我以前玩PHP的套件Phpstudy,有安装方便、启动便捷、管理省心等特点,当然也可以选择单独的 Mysql 来安装。由于最终发布的宝塔控制面板目前默认版本是 5.7,为了避免不必要的麻烦,我目前安装这是这一版本。

2.2.2 数据导入

新建名称为 elk-blog 的数据库,注意字符集为 utf8 -- UTF-8 Unicode,字符编码为 utf8_general_ci 然后导入 elk-blg/public/data/elk-blog.sql文件。

  • 然后克隆项目代码到本地:
$ git clone https://gitee.com/jikey/elk-blog.git
  • 复制项目目录下文件 config/env.example.inienv.ini 并修改配置文件中的数据库连接相关信息
[database]
type = mysql
host = localhost
port = 3306
user = root
password = root
dbname = elk-blog
charset = utf8
  • 进入项目根目录,安装项目相关依赖
$ go mod download
  • 进入项目根目录,启动项目,比如:
$ cd D:\go-project\src\elk-blog
$ air

前台入口:

http://localhost:4000/

后台入口:

http://localhost:4000/admin/login

初始用户名:admin,密码:admin

2.3 Goland 的配置

2.3.1 File -> Settings -> Go 下配置
变量名 说明
GOPATH d:\go-project Go 语言的开发目录
GOROOT C:\Go 会默认选择系统安装最高版本
GOPATH-Global GOPATH d:\go-project 全局设置
Go Modules GOPROXY=https://goproxy.cn,direct 先从配置地址下载,若失败,转从原始地址下载 功能,统一用go.mod管理开发依赖包,此功能在Go1.11版本中添加
GOPROXY https://goproxy.cn Go 包下载代理地址
2.3.2 Settings -> Project Structure

排除Exclued .idea, bin, pkg 等目录,不进行索引,有效节省内存资源。

2.3.3 Settings -> Appearance

使用One Dark主题

2.4 Air 的配置

3. 如何上线发布

由于本人特别菜,对经典的linuxdocker一直没怎么学会,所以这次选择的是宝塔控制面板来辅助部署,以下的经验也是基于宝塔来介绍。

3.1 安装GO

宝塔Linux面板-安装golang环境

  • 基本的步骤就是先从go官网下载tar包,然后上传到服务器指定目录上 /usr/local,这样做的目的是,能够快速完成节省时间。
  • 然后解压添加环境变量 tar -xzvf go1.18.2.linux-amd64.tar.gz,这里边需要说明的是宝塔的终端不能修改配置文件,即没有退出保存的模式,需要ssh和直接在文本编辑模式修改。 我添加的环境变量:
export GOROOT=/usr/local/go # 设置为go安装的路径
export GOPATH=/www/wwwroot/GO #项目路径
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
  • 宝塔终端输入go version,显示:go version go1.18.2 linux/amd64 即确认为安装成功

3.2 新建网站

其实就是新建nginx配置文件,比如新建网站 milu.blog,然后在nginx中配置go服务端口入口。假如go的端口为4000,则增加如下配置:

server{
  location / {
    proxy_pass  http://127.0.0.1:4000;
  }
}

3.3 准备打包go

go的打包命令只打包*.go结尾的文件,换句话说非*.go的文件需要自己手动上传。如果经历过npm run build洗礼的人,那go的这个build至少到现在没有遇到大的问题,或许我代码写的少的原因。

set CGO_ENABLED=0
set GOARCH=amd64
set GOOS=linux
go build main.go

3.4 上传文件

上传的目录为在环境变量里边定义的项目路径,比如milu项目的目录就是

/www/wwwroot/GO/milu

其它的项目就是

/www/wwwroot/GO/other

为了防止其它配置文件寻找不到,那所有相关的文件都在这个目录中。那最后发布完的/www/wwwroot/GO/milu下的文件组织为:

├─config  // 配置文件
├─public  // 静态资源
├─views   // 模板文件
├─main    // 打完包二进制文件

也就是说前面那么多文件,如果部署这些文件就够了。

3.5 上传SQL文件

这块唯一说的是宝塔只支持Mysql5.7版本,暂不支持Mysql8.0,手工安装估计也可以,偷懒也没折腾。为防止版本不兼容,在本地开发时Mysql就为5.7。然后本地Navicat导出结构和数据,在宝塔的Phpmyadmin里边导入。

3.6 命令行终端调试

在宝塔终端中cd到项目目录/www/wwwroot/GO/milu,然后直接 ./main,这样方便的查看日志,能够看到一些详情的报错信息。运行 ./main之后,就可以刷新域名,如果各步正常页面就能显示出来。

3.7 PM2绑定进程

我也只是试试的心态用pm2来运行一下go,没想到还真运行起来了。这样暂时不安装其它的服务,和Node服务一块运行起来。

4. 感谢的人

此项目感谢以下各界人士的支持和帮助

方便找回此项目,可以点右上角 💖Star 💖 收藏 + 支持

还可以

  • Golang交流群 105545914
  • Vue交流群 364912432
  • Javascript交流群 492107297
MIT License Copyright (c) 2022 杰克 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

麋鹿博客:基于Go, Gin, Gorm, Mysql, Vue, Element, Pongo2 的个人博客 展开 收起
Go
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Go
1
https://gitee.com/sportboy03/elk-blog.git
git@gitee.com:sportboy03/elk-blog.git
sportboy03
elk-blog
elk-blog
master

搜索帮助

14c37bed 8189591 565d56ea 8189591