欢迎Star、Fork:https://github.com/gefangshuai/ANodeBlog NodeJS路由规范遵循RESTful 规范,更多有关RESTful的相关知识请参考RESTful...所以我们的路由要针对这两部分用户分别进行设计,我遵循的原则是:普通用户:路由尽量简短明了(可参考简书);管理员用户:直观表达功能 普通用户路由 这里的普通用户路由是指:普通用户就能操作的功能模块...同样,对于管理者的路由,在原来的基础上,都以/dashboard/前缀表示。...dashboard/p/up/:id: 文章置顶 /dashboard/p/recommend/:id: 文章推荐 dashboard-u.js: /dashboard/u: 后台用户信息页 至此,所有的路由已设计完毕...对于路由的设计,尽量遵循标准规范,这样对于我们的程序,可很好维护控制。
对于每个被介绍的框架,我们都强调了它们最大的优点,以便你了解它们在哪些方面表现出色,以及哪些方面可能会让你自己尝试一下!...另一个重要的事情是,它还有一个名为 Solid Start 的元框架(目前处于测试版),它允许用户根据自己的偏好以不同的方式渲染应用程序,具有基于文件的路由、actions、API 路由和中间件等功能。...它提供了路由器、构建优化、不同的渲染和预渲染方式、图像优化等。...简而言之,可恢复性基于在服务器上暂停执行并在客户端上恢复执行,而无需重放和下载所有应用程序逻辑。...结论 我们提到的所有框架和库之间最大的共同点是熟悉度。每个人都寻求以一种建立在他们当前知识基础上的方式来吸引潜在的新开发者,而不是做完全新的事情,这是一个非常酷的概念。
去年写了一篇文章手写一个虚拟DOM库,彻底让你理解diff算法介绍虚拟DOM的patch过程和diff算法过程,当时使用的是双端diff算法,今年看到了Vue3使用的已经是快速diff算法,所以也想写一篇来记录一下...需要说明的是这个动画只包含diff算法的过程,不包含patch过程。...我们想让这个diff过程动起来,首先要找到动画的对象都有哪些,从函数的参数开始看,首先oldChildren和 newChildren两个VNode列表是必不可少的,可以通过两个水平的列表表示,然后是四个指针...() => { resolve() }, t || 3000 ) }) } 然后我们使用async/await语法,就可以轻松在循环中实现等待了...newStartVNode = newChildren[++newStartIdx] } 我们想表现出头尾比较的过程,其实就在这些if条件中,也就是要在每个if条件中停留一段时间,那么可以直接这样吗
循环中引用迭代器变量 循环迭代器变量是一个在每次循环迭代中采用不同值的单个变量。如果我们一直使用一个变量,可能会导致不可预知的行为。...如果您真的需要在循环内使用 defer,您可能需要委托另一个函数来完成这项工作。...不使用 -race 选项 我经常见到的一个错误是在测试 go 应用的时候没有带 -race 选项。...显然,Go 的竞争检查 (race detector) 无法解决每一个并发问题,然而它依然是一个有价值的工具,我们应当确保在做测试的时候(go test) 始终使用它。...timeout_test.go:618 +0x298 testing.tRunner() src/testing/testing.go:301 +0xe8 总结 如上是初学golang过程中经常出现的一些低级错误
而本次比赛中,如果不考虑使用官方IDE的话,又不想用makefile(主要是不会写),所以还是尝试着用GN+Ninja完成了rt1062的构建系统。...(我的项目我做主,折腾不嫌事儿多)。...2、编译构建命令: ninja -C out/${BOARD} 3、建议使用方式: 我比较懒,喜欢直接在~/.bashrc中配置好BOARD环境变量,并设置命令别名: alias gbuild='gn...}.hex 5、添加源码 完成功能不可避免的需要修改源码,添加c源文件和.h头文件。...从组件解耦来说,真正能做到所有的组件都能通过健康的依赖完成整个项目构建的(没有循环依赖和恶性依赖),功能解耦就做的不错了。
查看目录命令 1、查看目录命令的使用 命令 说明 ls 查看当前目录信息 tree 以树状方式显示目录信息 2、切换目录命令的使用 命令 说明 cd 目录 切换到指定目录 cd ~ 切换到当前用户的主目录...切换到当前目录 cd - 切换到上一次目录 3、创建、删除文件及目录命令的使用 命令 说明 touch 文件名 创建指定文件 mkdir 目录名 创建目录(文件夹) rm 文件名或者目录名 删除指定文件或者目录...rmdir 目录名 删除空目录 4、查看命令帮助方式 —help 使用说明:命令 --help man 使用说明:man 命令 查看命令帮助的目的说明: 查看命令帮助目的是查看命令选项信息 5、ls...命令选项使用 命令选项 说明 -l 以列表方式显示 -h 以大小为单位显示,默认是字节 -a 显示隐藏文件和隐藏目录 6、mkdir和rm命令选项 1、mkdir命令选项 命令选项 说明 -p 创建所依赖的文件夹...8、重定向命令 1、重定向命令的介绍:重定向也称为输出重定向,把在终端执行命令的结果保存到目标文件 2、重定向命令的使用 命令 说明 > 如果文件存在会覆盖原有文件内容,相当于文件操作中的“w”模式 >
工欲善其事,必先利其器,是时候祭出神器了:MyBatis Generator(简称:MBG),它是一个用于所有版本MyBatis的代码自动生成器。...它可以根据数据库的表自动为项目生产对应的实体类、Mapper、DAO,包括简单CRUD数据库操作(创建、查询、更新、删除)。解放了我们的双手,不必做重复性的机械工作。...datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 创建一个SpringBoot项目 以使用...--defaultModelType用于指定生成对象的样式,flat表示每一张表只生成一个实体类,这个实体类包含表中的所有字段。...="JDBC"/> 以上就是最基础简介的配置了,在实际的开发过程中就够用。
Hello,你好呀,我是灰小猿!一个超会写bug的程序猿!...最近某学妹在众多大佬的栽培下学到了不少东西, 虽然学妹没等到,但是等到可爱的女朋友来找我帮忙了,她居然说Android Studio自带的真机不好用,还想让我帮她在安卓虚拟机上浏览各位大佬的文章,看来女朋友已经不限于使用自己的电脑或手机来学习我文章中的知识了...然后上来就是一个左正蹬一个右边腿一个左刺拳,“啪”的我的电脑就打开了! 上来我就打开了Android Studio就要手写代码,女友说:“这不行,真机调试老出问题,不能用自带的真机!”...我让她打开cmd命令行找到到“夜神模拟器”的安装目录,她居然要手动输入路径,这在一个程序员男友面前怎么行, 我先是找到“夜神模拟器”的安装路径“\Nox\bin”,一个CTRL+L,再输入一个“cmd”...紧接着,我在命令行输入了: nox_adb.exe connect 127.0.0.1:62001 我让她重新运行Android Studio,可是还是不显示模拟器设备,这好办,程序员通用道路,
最近一段时间,我们团队在生产环境出现了几次线上问题,有部分比较严重,直接影响用户功能的使用,惹得领导不高兴了,让我想办法提升代码质量,这时候项目工程代码质量检测神器——SonarQube,出现在我们的视线当中...总览: 在典型的开发过程中: 开发人员在IDE中开发和合并代码(最好使用SonarLint在编辑器中接收即时反馈),然后将其代码签入ALM。...SonarQube实例包含三个组件: SonarQube服务器运行以下过程: 提供SonarQube用户界面的Web服务器。 基于Elasticsearch的搜索服务器。...,我在这里就不过多介绍了,网上有很多教程。...此外,还有mybatis插件 gitee地址:https://gitee.com/mirrors/sonar-mybatis 我个人用过,觉得作用不大,不过可以基于这个代码扩展自己需要的功能。
最近一段时间,我们团队在生产环境出现了几次线上问题,有部分比较严重,直接影响用户功能的使用,惹得领导不高兴了,让我想办法提升代码质量,这时候项目工程代码质量检测神器——SonarQube,出现在我们的视线当中...在典型的开发过程中: 开发人员在IDE中开发和合并代码(最好使用SonarLint在编辑器中接收即时反馈),然后将其代码签入ALM。...SonarQube服务器运行以下过程: 提供SonarQube用户界面的Web服务器。 基于Elasticsearch的搜索服务器。...,我在这里就不过多介绍了,网上有很多教程。...此外,还有mybatis插件 gitee地址:https://gitee.com/mirrors/sonar-mybatis 我个人用过,觉得作用不大,不过可以基于这个代码扩展自己需要的功能。
以下文章来源于code秘密花园 ,作者ConardLi 推荐几个我常用的Chrome插件 —— 让你使用Github效率翻倍 Chrome 可以说是全世界最受欢迎的浏览器了,其快速、稳定的性能...我个人安装了非常多的 Chrome 插件,这些插件可以在使用浏览器的各个方面帮助我提升效率,今天就推荐一些 Github 相关的 Chrome 插件。...点击按钮跳转到更清晰的 git 历史页面,展示该文件的历史变更情况。相比直接使用 git log ,这种方式更友好。...下载方式:Chrome 商店搜索 Enhanced GitHub OctoLinker 让你看代码的时候,可以进行更高效的代码连接跳转。...我是用的下面这个网站下载 crx 的,只需要输入插件在 chrome 商店的 url 即可:https://chrome-extension-downloader.com/
推荐几个我常用的Chrome插件 —— 让你使用Github效率翻倍 Chrome 可以说是全世界最受欢迎的浏览器了,其快速、稳定的性能,简洁的设计以及多平台同步的功能都深受用户的推崇,然而很多人成为他的忠粉还是因为它强大的拓展性...我个人安装了非常多的 Chrome 插件,这些插件可以在使用浏览器的各个方面帮助我提升效率,今天就推荐一些 Github 相关的 Chrome 插件。...点击按钮跳转到更清晰的 git 历史页面,展示该文件的历史变更情况。相比直接使用 git log ,这种方式更友好。...下载方式:Chrome 商店搜索 Enhanced GitHub OctoLinker 让你看代码的时候,可以进行更高效的代码连接跳转。...我是用的下面这个网站下载 crx 的,只需要输入插件在 chrome 商店的 url 即可:https://chrome-extension-downloader.com/
笔者之前做商城项目时,做过商城首页的商品分类功能。当时考虑分类是放在商城首页,以后流量大,而且不经常变动,为了提升首页访问速度,我考虑使用缓存。对于java开发而言,首先的缓存当然是redis。...日志打印我在这里就不多说了,不是本文的重点,我们重点说一下redis cache。 优化后的系统流程图: ?...基本用法 项目中如何使用 工作原理 一、基本用法 SpringCache缓存功能的实现是依靠下面的这几个注解完成的。...或者关注一下我的公众账号,后面会有专门AOP的专题)。...:苏三说技术,或者帮忙点赞或转发,坚持原创不易,您的支持是我坚持最大的动力。
笔者之前做商城项目时,做过商城首页的商品分类功能。当时考虑分类是放在商城首页,以后流量大,而且不经常变动,为了提升首页访问速度,我考虑使用缓存。对于java开发而言,首先的缓存当然是redis。...日志打印我在这里就不多说了,不是本文的重点,我们重点说一下redis cache。...基本用法 项目中如何使用 工作原理 一、基本用法 SpringCache缓存功能的实现是依靠下面的这几个注解完成的。...说明缓存生效了,下面我介绍一下spring cache的工作原理 三、工作原理 通过上面的例子,相当朋友们对spring cache在项目中的用法有了一定的认识。那么它的工作原理是什么呢?...或者关注一下我的公众账号,后面会有专门AOP的专题)。
在实际开发过程中我踩到了mybatis的一个坑,我觉得值得记录、分享一下。 先说说这个坑是什么吧。如果你踩过这个坑,并且知道具体的原因,那这篇文章可以加深你的印象。...常规的方法是加断点进行追踪,但是我想分享一个我当时排查的"骚"操作,定位问题非常快。那就是逆向排查。 逆向排查法 现在我们确定了是sql拼接的问题,我通过日志,也拿到了完整的sql。...但是,你再回过头的想一想,我最开始的改造mapper.xml是怎么操作的: 改造点很简单,在xml文件里面ctrl+c一下原来的if标签,再ctrl+v出来改改里面的名字就好了。...是的,我无脑的使用了CV大法。导致我在欢声笑语中写出了bug。我orderStatus传入的类型是一个Byte,和""做判断有任何意义吗?...但是我也感谢这次无脑的CV,让我踩到了这个坑,并且研究清楚了。get到了新的知识点。 同时,我也感谢自己做了单元测试,不然测试同学测试的时候抛出这样的问题,我会觉得他不会用,他会觉得我是弱鸡。
这是why技术的第14篇原创文章 在实际开发过程中我踩到了mybatis的一个坑,我觉得值得记录、分享一下。 先说说这个坑是什么吧。...常规的方法是加断点进行追踪,但是我想分享一个我当时排查的"骚"操作,定位问题非常快。那就是逆向排查。 逆向排查法 现在我们确定了是sql拼接的问题,我通过日志,也拿到了完整的sql。...但是,你再回过头的想一想,我最开始的改造mapper.xml是怎么操作的: 改造点很简单,在xml文件里面ctrl+c一下原来的if标签,再ctrl+v出来改改里面的名字就好了。...是的,我无脑的使用了CV大法。导致我在欢声笑语中写出了bug。我orderStatus传入的类型是一个Byte,和""做判断有任何意义吗?...但是我也感谢这次无脑的CV,让我踩到了这个坑,并且研究清楚了。get到了新的知识点。 同时,我也感谢自己做了单元测试,不然测试同学测试的时候抛出这样的问题,我会觉得他不会用,他会觉得我是弱鸡。
LocalStorage 是浏览器提供的一种本地会话存储的方式,最大支持 5M 的存储空间。 虽说它的存储空间是有上限的,但是我相信很多同学都和我一样,在日常开发中其实并没有关注过这个问题。...此时,我们统计所有累积的数据,这就是总存储量! 在 JavaScript 中,字符串使用 UTF-16 编码存储。这意味着每个字符通常占用 2 个字节的内存空间。...但是,对于某些特殊字符(例如表情符号或某些不太常见的语言字符),它们可能最多使用 4 个字节。...因此,官网中所说的 5MB,其单位就是字符串的长度。 03:如何计算已使用的容量 要计算已使用的容量,我们需要做的就是迭代 LocalStorage 上的存储属性并计算每个存储属性的长度。...const computedUse = () => { let cache = 0; // 循环访问LocalStore中的所有 key for(let key in localStorage
我当然知道有很多优秀的大名鼎鼎的http开源框架可以实现任何形式的http调用,在多年的开发经验中我都有使用过。...于是,我发现了一款优秀的开源http框架,能屏蔽不同细节http api所带来的所有差异。能通过简单的配置像调用rpc框架一样的去完成极为复杂的http调用。...我用Forest最终完成了和多个服务商api对接的项目,这些风格迥异的API,我仅用了1个小时时间就把他们转化为了本地方法。然后项目顺利上线。...4.两个很棒的功能 这里不对使用方式和配置方式一一描述,有兴趣的可以去阅读详细文档: https://dt_flys.gitee.io/forest 这里只想分析这个框架2个我认为比较好的功能 4.1...然后根据别人的经验来修改自己的代码。 Forest对于这方面也想的很周到,底层完美封装了对https单双向证书的支持。也是只要通过简单的配置就能迅速完成。
要感谢 asyncio,让我可以同时编写同步和异步代码。...当 Japronto 收到数据并成功解析出请求序列时,它会尝试尽可能快的把这些请求执行完成,并以正确的顺序合并所有结果,然后只执行一次系统调用发送数据给客户端。...然而事情并不总是那么完美,有时候请求需要耗费很长时间去处理,等待完成的过程增加了不必要的延迟。 当我们做优化时,有必要考虑系统调用的成本和请求的预期完成时间。...开源贡献者们,我需要你们的帮助 我已经连续不断的开发 Japronto 超过三个月,不光在每一个工作日,周末也无休。除了每天的工作外,我把所有时间精力都投入到这个项目上了。...我想是时候和社区分享我的劳动果实了。
要感谢 asyncio,让我可以同时编写同步和异步代码。 ?...当 Japronto 收到数据并成功解析出请求序列时,它会尝试尽可能快的把这些请求执行完成,并以正确的顺序合并所有结果,然后只执行一次系统调用发送数据给客户端。...然而事情并不总是那么完美,有时候请求需要耗费很长时间去处理,等待完成的过程增加了不必要的延迟。 当我们做优化时,有必要考虑系统调用的成本和请求的预期完成时间。 ?...比如,在处理路由时,先做 URL 解码再进行路由匹配。 开源贡献者们,我需要你们的帮助 我已经连续不断的开发 Japronto 超过三个月,不光在每一个工作日,周末也无休。...除了每天的工作外,我把所有时间精力都投入到这个项目上了。 我想是时候和社区分享我的劳动果实了。
领取专属 10元无门槛券
手把手带您无忧上云