记录一次自建短链接系统

4月9日,我注册了 ahd.im 域名并打算以此为基础搭建短链接系统。但当我在 GitHub 等平台搜索了一圈,却没有找到令我满意的作品。大多数UI丑陋或是算法效率低下,难以满足我的愿景,因此我决定着手写一套自己的短链接系统。

选择

这是我第一次独立完成一套全栈系统,其摸索的过程自然会为我全栈开发能力积累经验。因此,选择一套高效、高兼容、普适的技术栈自然是极为重要的一步。

后端

对于后端,最重要的是保证代码质量和执行效率。

PHP 效率太低,代码混乱,不被我欣赏。

ExpressJS 不适合写较大的系统应用,其并发也不强,且代码中同步异步容易混乱。

Golang 尽管性能较强,但不符合我的代码习惯。

C++ 应该就没有一个能用的Web开发框架。

最后,我选择了使用 Java Spring Boot 框架撰写后端功能,使用 MyBatis + MySQL 进行数据控制。

前端

前端便没有那么多选择了。

jQuery 我不是很熟悉,且当今时代高级前端框架林立,我没有理由选择一个即将被时代淘汰的框架。

Vue 我不喜欢,就没学。

AngularJS 我学了,但还是不喜欢。

React 我很喜欢。

于是,前端框架的选择就轻松地完成了。

UI

对于用户端,看了许多公众号文章,发现了阿里的 Ant Design 似乎很不错,于是便选用了 Ant Design 。

对于管理端,因为我实在没有想象力,不知道 Ant Design 如何设计,而且没有学习时间(实际上就是没心情研究了),就用回了 Material
UI。

技术栈

由上,我确定了我开发所需的技术栈:

  • 前端
    • React
    • TypeScript
    • Ant Design
    • Matarial UI
  • 后端
    • Spring Boot
    • MyBatis
  • 数据
    • MySQL

开发

因为一模的原因,拖到了5月初才开始进行开发工作。学习 Ant Design 的函数、功能,Java 语法和 Spring Boot 使用也耗费了不少时间。

大约是一周以后,我正式着手进行 AHdark/Link 的 Development Progress 。

bafkreigjt7u73odne5xzecsahtng4ectl7kslj7dpdu2fs2cjlaq6satji.png

后端

bafkreige2jkljyvfzdtradftdbyzrxlszghglickfsb4hcac3s2pbcm2k4.png

后端

bafkreihpveep7vdavxth4x5fx2si5x6z2bqhwfgxmyqw5fylpyhfu6b4se.png

后端

bafkreihbgstbnj3tss2pz2myhtsptpbqrnftuqz6632rljwh7vv46ppcdm.png

后端

bafkreifzfzqc43ctgob4m3rx37suhvt2lnh6wsx2sy64xqxkafc4jtjvx4.png

前端

bafkreihda5but6iepxlhrum56v3pxj5eiaghaplkddywgpbf7tbueuf24u.png

前端

bafkreibrtazq4nlubbwia3odyyki2wqsjivrexji5y6rfieozthcfaesgy.png

前端

前后端分离并同时进行开发,自然需要在本地和测试服务器进行诸多配置。

我使用的 IntelliJ Idea 高效地适配了 Java 和 React 开发,使得我可以在一个专业编辑器上同时进行前后端的开发。

高效的 Idea 编辑器也使得我代码中极少出现错误,减少了反复编译的次数。

不要小看 idea 的内存占用,随便写几行代码就破 4GB 了,真不是个正常玩意。

前端通过 Git Submodule 内嵌于后端项目目录中,尽管在每天晚上需要进行 Sync Commit 修改后端保存的前端Git版本以保证前后端一致性,但仍确保了项目一致性和开发稳定性。

模块化

模块化开发可以使得我的开发进程更加规律化,避免因某一功能的修改引起整体代码大改的情况。

bafkreiehlfh5iqofkylkgpnfcwapdiis763yxutwijbmelagh3r3eealo4.png

顶层路由

在前端顶层,我通过 React Router v5 区分用户端与管理端。

管理端

bafkreibduuf7n6fqgqiocwj7awc6jau6skpoz5c6j7qqufkhucoru7uxxa.png

管理端 路由

管理端顶层,我将 Layout 渲染部分放置在 Switch 以外以避免切换页面时重复渲染。

同时将各个页面处理成 JSX.Element ,放置在不同的目录中。

如此,每次开发某一页面或组件,就可以只修改某一目录下的文件,避免了 Git Commit Log 混乱。

用户端

bafkreicjqv5gflpx2tn5b6elvazqytdqkx6uel3jyszqnmtywhnlnqdkcq.png

用户端 路由

在用户端,我通过 Router 区分页面,对各个页面进行分离。

后端程序

bafkreiauilqbjlzdzoqmdqjrhmzeo2kiupj5twilwrtnzk6z3qa2qwtdv4.png

后端代码均严格依据规范进行开发,对 Controller 、 Service 等进行分层,以保证程序的稳定性。

@topjohncian 对于前端代码的大型优化

首先,在此感谢 @topjohncian 对于我前端代码的优化建议与分析。

之前,我使用 react-router-dom@v6 进行路由分离,在每个页面通过请求后端判断用户是否登陆。

这样的实现既不优雅也不高效,而且会降低用户体验。

经由他的帮助,他为我尝试制作 <AuthRoute> <NoAuthRoute> 等中间件。

因为 react-router-dom@v6 的愚蠢特性,我们经过漫长的尝试后决定降级为v5,以获得更高的可扩展性。

bafkreidynyxfdmrtcek3sf2o7xtelttjnsbi4o53h42f2fbule4ndzxn24.png

AuthRoute Element

部署

在经历漫长的开发过程后,我开始着手进行部署工作。

其中重要的一项内容是 Debug ,尽管我尽力寻找 Bug 并予以更改,但部署到生产环境时仍有不少 Bug 等待修复。

在几小时后,程序迭代出更新的版本,我修复了绝大多数的未解决的 Bug 。

生产环境与测试环境不在同一云服务商,以此避免测试环境提权影响到生产环境。

你可以前往 https://ahd.im 预览实际效果。

短链接生成目前仅开放给注册用户,且并未开放注册,因此您可能无法体验到短链接生成和站点管理的过程。

bafkreihuct2bvzi45felpv7e6nvc6wj5xaanrqsymoasghrrjd7lq5rs2e.png

用户端 - 首页

bafkreicwh34w6fanshzdwiix5kipane7osg7nz5l5utybvwebsfoc36dx4.png

用户端 - 设置

bafkreifuywovzq4gkovj7i26fdjh7gvxqmswgluu3cwpwqtedwesktwsba.png

管理端 - 仪表盘

bafkreihqkrzl3zitp7aregkxxnlmnivrgmtg3fkcy66rb6wsm7w43tfwzm.png

管理端 - 用户管理

关于项目

Link 短链接系统 为闭源项目,使用 React+SpringBoot 前后端分离开发。

其 GitHub 私有仓库 分别位于 https://github.com/AH-dark/Link
https://github.com/AH-dark/Link-Frontend ,但你无法打开获取源代码。

主要开发者为 @AHdark 。项目的成功实现离不开 @topjohncian 的协助。

感谢您的阅读,我们会持续更新本项目,并视情况决定是否开源。

本项目已在2022年5月28日全量开源。

AH-dark/Link
AH-dark/Link-Frontend

Read more

Web 后端应用程序的可观测性改进

Web 后端应用程序的可观测性改进

相信日志,即 Logging,对于大多数开发人员是不陌生的。 日志是一种记录应用程序运行状态的重要手段,它可以帮助我们了解应用程序的运行情况,排查问题,甚至是监控应用程序的性能。在 Web 后端应用程序中,日志是不可或缺的一部分,它可以记录用户请求、应用程序的错误、警告等信息,帮助我们更好地了解应用程序的运行情况。 但它真的不可或缺吗?读完这篇文章后我想我给你的答案是:不是。日志的形式很单一,只是文本,这注定了它很冗杂的特点,我们很难从中提取我们需要的信息。即使你使用 AI 如 ChatGPT,也并不一定可以得到一个有建设性的答案。对于自己构建的应用程序,ChatGPT 既不了解也不可能去真的全部了解你的代码,这就带来了问题。 为什么日志不是不可或缺的 日志的形式单一,以纯文本呈现,信息常常显得冗余且难以提取。即便是使用 AI 进行分析,也不一定能提供清晰的洞见。日志的主要问题在于: * 冗余性和庞大的数据量:日志往往包含大量无用信息,查找特定问题的关键信息耗时。 * 缺乏上下文关联:单条日志难以呈现多个服务之间的调用关系和上下文,尤其是在微服务架构中

By AHdark
我如何从零开始学习一门编程语言

我如何从零开始学习一门编程语言

作为一门全栈开发,我理应掌握多门语言。截止 2024 年 9 月,我掌握了超过 30 门编程语言,可以使用它们构建简单的应用程序、为开源社区提交代码、为公司开发产品。我们不讨论对于“掌握”的定义,让我梳理思路,详细阐述我是怎么一步步掌握如 此多的编程语言的。如果你也想学习一门新的编程语言,希望这篇文章能够帮助到你。

By AHdark