# vblog **Repository Path**: lsq_keith/vblog ## Basic Information - **Project Name**: vblog - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2023-10-13 - **Last Updated**: 2024-01-18 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vblog项目 ## 需求 该项目是一个前后端分离的web项目,旨在个人学习 ## 开发环境/技术栈 + 后端:go1.20.5 + gin + gorm + 前端:vue + arco design组件库 + 数据库:mysql5.7 ## 产品原型 (待补充) ## 软件架构 [软件架构图](docs/prd.drawio) (前端架构待补充) ## 项目代码组织说明 项目后端采用类似DDD(Domain Driven Develop)风格的代码组织风格,并尽可能完成多的单元测试来保证程序的可靠性(TDD Test Driven Develop)。 + 1.apps中放置后端业务处理模块 + blog模块:博客文章的管理 + user模块:用户的管理 + token模块:登录,鉴权相关 + 2.其他目录说明 + conf:对于配置的管理 + ioc:ioc注册中心 + common:公共工具/内容 + cmd:程序的cli + protocal:协议层,中间件相关 + exception:自定义异常的统一处理 + logger:日志logger的管理 + log: 日志文件 + etc:放置程序配置文件 + docs:项目文档,包括初始化sql,项目架构图等内容 + ui:项目前端代码 ## 产品设计详细描述 1.补充home页面,进行布局设计(三段式布局,有固定的头部,内容区,固定的底部),网站首页可以看到所有作者已发布的blog 头部加一个搜索框,可以搜索博客;还可以添加一个发布按钮,点了之后跳转到新建blog的页面(如果没登陆跳转到登录页面,如果已经登录右上角显示当前登录的用户,以及退出登录按钮,以及进入后台按钮) 内容区的话布局的时候左侧可以做一个图片轮转/天气插件等装饰;右侧显示所有用户已发布状态的blog,并且blog的显示和后台不同,这里只有查看详情按钮,没有编辑/发布/删除等按钮 单个blog的显示看能不能优化 使用https://arco.design/vue/component/list 列表,后台blog使用增加操作项列表 前台blog使用竖排列表样式列表展示 blog添加分类标签,比如一个blog属于运维/开发/go/vue等,首页看blog的时候可以根据标签过滤对应的blog 把vue的图标换掉 index.html中 2.美化登录页面 3.后台功能的优化 + 优化博客的显示与操作逻辑: 不显示id;增加查看按钮,草稿状态的blog会有发布按钮,已发布的会有撤回按钮,撤回后blog变为草稿状态 文章列表只显示已经发布的blog;文章管理下面多加一个草稿箱,里面查看状态为草稿的blog。 + 用户的优化:比如普通用户一个keith用户,一个lsq用户,每个用户登录后台都只能看到自己的blog,可以根据blog状态进行过滤,并且可以进行编辑等操作; admin用户登录后可以看到所有blog,并且可以操作 admin登录后有一个用户管理的功能选项,列出所有用户,能进行操作:新建用户,重置用户密码,修改用户状态 + 评论管理不单独一个按钮了,评论能在查看blog详情的时候看到。 收藏管理可以一个单独按钮,查看当前用户收藏的blog 后续可以补充评论/收藏功能 ## 补充程序优雅关闭(2024-1-18) 流程说明:优雅关闭实际就是捕捉到系统给程序发送的关闭的信号(常见的就是kill -9:os.Interrupt,kill -15:syscall.SIGTERM),捕捉到后不直接退出,而是给程序预留出一定时间处理没有处理完的部分,之后再退出 具体的实现就是:主协程中创建一个channel来监听对应的信号,当收到对应信号,这个channel中就会有数据进入。然后会创建一个带cancel函数的context上下文,传递给程序,当接收到关闭信号的时候,执行刚才的cancel函数,这样接收这个ctx的协程都能得到通知,也就是捕捉到case <-ctx.Done(),此时需要优雅关闭(比如写数据的程序,结束的时候把内存中的数据刷盘)的程序进行收尾/清理工作,执行完整个程序再退出。防止有些程序可能会卡死,可以通过context.WithTimeout使用创建一个带最大超时时间的context和cancel函数,这样等待一定时间后,会强制关闭程序。 代码实现: ```go // 启动http协议监听 httpserver := protocal.NewHttp(r) go func() { httpserver.Start() }() // 创建一个监听中断信号的channel interruptChan := make(chan os.Signal, 1) // 监听kill -15 -9 -2 三个中断信号 signal.Notify(interruptChan, syscall.SIGTERM, os.Interrupt, syscall.SIGKILL) ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() select { case <-interruptChan: // 当收到中断信号的时候进行httpserver的优雅关闭 logger.Log().Debug().Msg("Received interrupt signal. Shutting down...") httpserver.Stop(ctx) } logger.Log().Debug().Msg("httpserver is stopped...") ```