大前端领域哪些开源项目最受欢迎?
评选活动设置「最受欢迎项目」,以及特别策划的「优秀中国开源原生创企」和「神秘奖项」,本页面用于投票选出「最受欢迎项目」; 参与投票的候选项目被划分到「组织」或「个人」通道,最终选出 TOP 30 项目(组织:21 个,个人:9 个) 详细规则点此查看; 候选开源项目均由国人发起,评审委员会筛选出本页面的候选项目; 提名、修改项目信息等相关问题请私信 @OSCHINA编辑部。
作者:小傅哥
博客:https://bugstack.cn
❝沉淀、分享、成长,让自己和他人都能有所收获!😜
❞
一、前言
二、需求目的
三、案例开发
1. 工程结构
2. 织入代码接口
3. 定义模板方法
4. 代码织入锚点
5. 配置菜单入口
四、测试验证
1. 复制对象
2. 生成对象
3. 最终效果
五、扩展接口
六、总结
七、系列推荐
给你机会,你也不中用啊
这些年从事编程开发以来,我好像发现了大部分研发那些不愿意干的事,都成就了别人。就像部署服务麻烦,有了Docker、简单CRUD不想开发,有了低代码、给方法代码加监控繁琐、有了非入侵的全链路监控。
而这些原本你也在干的事情,因为没有想法、没有创新、没有思考,也可能是没有能力,所以一直都是在搬砖、码砖、砌砖,反反复复、来来回回。键盘敲的是越来越快了,代码搞的是越来越烂了。薪资没搞上去,头发是越来越少了。
对于想走技术路线的码农,千万不要只是停留在业务功能的逻辑开发上,只有当你有了共性凝练的逻辑思维,才会逐步思考怎么把一件重复的事做成一个通用的服务或者组件,而这些东西的落地不仅需要你会写代码,还要会思考更要会去索引一些你需要的技术,并用自学的方式来补充这部分技能。
你想写对象间的get、set吗?烦,烦死了,尤其是在DDD四层架构下,有了多层防污处理,一会一个vo2dto、一会一个vo2do、一会一个do2po,虽然有很多工具的操作,但还是得写呀。
怎么办?不要慌,这是机会呀,我们做个插件搞定它,让它可以自动的给我生成get、set代码,在IDEA Plugin的处理下,选择好需要生成对象代码的锚点,复制下转换对象,自动织入代码,1s钟搞定!效果视频:
guide-idea-plugin-vo2dto
├── .gradle
└── src
├── main
│ └── java
│ └── cn.bugstack.guide.idea.plugin
│ ├── action
│ │ └── Vo2DtoGenerateAction.java
│ ├── application
│ │ └── IGenerateVo2Dto.java
│ ├── domain
│ │ ├── model
│ │ │ ├── GenerateContext.java
│ │ │ ├── GetObjConfigDO.java
│ │ │ └── SetObjConfigDO.java
│ │ └── service
│ │ ├── impl
│ │ │ └── GenerateVo2DtoImpl.java
│ │ └── AbstractGenerateVo2Dto.java
│ └── infrastructure
│ └── Utils.java
├── resources
│ └── META-INF
│ └── plugin.xml
├── build.gradle
└── gradle.properties
源码获取:#公众号:bugstack虫洞栈 回复:idea 即可下载全部 IDEA 插件开发源码
在此 IDEA 插件工程中,主要分为4块区域:
Generate 下,也就是通常你生成 get、set、constructor 方法的地方。
cn.bugstack.guide.idea.plugin.application.IGenerateVo2Dto
public interface IGenerateVo2Dto {
void doGenerate(Project project, DataContext dataContext);
}
因为生成代码并织入锚点位置的操作,整个来看其实也是一套流程操作,因为在这个过程需要;获取上下文信息(也就是工程对象)、给当前锚点位置的类提取 set 方法集合、之后在给Ctrl+C剪切板上的信息读取出来提取 get 方法集合,第四步把set、get进行组合并织入代码到锚点位置。整体过程如下:
关于代码织入锚点前,我们在模板类中定义的方法,需要实现接口进行处理,重点包括:
CommonDataKeys.EDITOR.getData(dataContext)、 CommonDataKeys.PSI_ELEMENT.getData(dataContext) 封装 GenerateContext 对象上下文信息,也就是一些类、锚点位置、文档编辑的对象。
psiClass.getMethods() 读取对象方法,把 set 方法过滤出来,封装到集合中。
Toolkit.getDefaultToolkit().getSystemClipboard() 获取剪切板信息,也就是你在锚点位置给对象生成 x.set(y.get) 时,复制的 Y y 对象,并开始提取 get 方法,同样封装到集合中。
cn.bugstack.guide.idea.plugin.domain.service.impl.GenerateVo2DtoImpl
@Override
protected void weavingSetGetCode(GenerateContext generateContext, SetObjConfigDO setObjConfigDO, GetObjConfigDO getObjConfigDO) {
Application application = ApplicationManager.getApplication();
// 获取空格位置长度
int distance = Utils.getWordStartOffset(generateContext.getEditorText(), generateContext.getOffset()) - generateContext.getStartOffset();
application.runWriteAction(() -> {
StringBuilder blankSpace = new StringBuilder();
for (int i = 0; i < distance; i++) {
blankSpace.append(" ");
}
int lineNumberCurrent = generateContext.getDocument().getLineNumber(generateContext.getOffset()) + 1;
List<String> setMtdList = setObjConfigDO.getParamList();
for (String param : setMtdList) {
int lineStartOffset = generateContext.getDocument().getLineStartOffset(lineNumberCurrent++);
new WriteCommandAction(generateContext.getProject()) {
@Override
protected void run(@NotNull Result result) throws Throwable {
generateContext.getDocument().insertString(lineStartOffset, blankSpace + setObjConfigDO.getClazzParamName() + "." + setObjConfigDO.getParamMtdMap().get(param) + "(" + (null == getObjConfigDO.getParamMtdMap().get(param) ? "" : getObjConfigDO.getClazzParam() + "." + getObjConfigDO.getParamMtdMap().get(param) + "()") + ");\n");
generateContext.getEditor().getCaretModel().moveToOffset(lineStartOffset + 2);
generateContext.getEditor().getScrollingModel().scrollToCaret(ScrollType.MAKE_VISIBLE);
}
}.execute();
}
});
}
x.set(y.get)通过 document.insertString 到具体的位置和代码。
x.set(y.get) 的过程。
plugin.xml
<actions>
<!-- Add your actions here -->
<action id="Vo2DtoGenerateAction" class="cn.bugstack.guide.idea.plugin.action.Vo2DtoGenerateAction"
text="Vo2Dto - 小傅哥" description="Vo2Dto generate util" icon="/icons/logo.png">
<add-to-group group-id="GenerateGroup" anchor="last"/>
<keyboard-shortcut keymap="$default" first-keystroke="ctrl shift K"/>
</action>
</actions>
x.set(y.get) 代码的操作加个快捷键,可以让我们更加方便的进行操作。
点击 Plugin 启动 IDEA 插件,之后有2步操作;
Generate -> Vo2Dto - 小傅哥
Ctrl + Shift + K 也是可以自动生成的。
| 获取当前编辑的文件, 通过PsiFile可获得PsiClass, PsiField等 | PsiFile psiFile = e.getData(LangDataKeys.PSI_FILE); |
| 获取当前的project对象 | Project project = e.getProject(); |
| 获取数据上下文 | DataContext dataContext = e.getDataContext(); |
| 获取到数据上下文后,通过CommonDataKeys对象可以获得该File的所有信息 | Editor editor = CommonDataKeys.EDITOR.getData(dataContext);<br />PsiFile psiFile = CommonDataKeys.PSI_FILE.getData(dataContext);<br />VirtualFile virtualFile = CommonDataKeys.VIRTUAL_FILE.getData(dataContext); |
| GlobalSearchScope中有Project域,Moudule域,File域等等 | PsiFile[] psiFiles = FilenameIndex.getFilesByName(project, name, GlobalSearchScope); |
| 类似于IDE中的Find Usages操作 | Query<PsiReference> search = ReferencesSearch.search(PsiElement); |
| 重命名 | RenameRefactoring newName = RefactoringFactory.getInstance(Project).createRename(PsiElement, "newName"); |
| 搜索一个类的所有子类,重载方法较多,具体不再一一列出 | Query<PsiClass> search = ClassInheritorsSearch.search(PsiClass); |
| 根据类的全限定名查询PsiClass,下面这个方法是查询Project域 | PsiClass psiClass = JavaPsiFacade.getInstance(project).findClass(classQualifiedName, GlobalSearchScope.projectScope(project)); |
| 获取Java类所在的Package | PsiPackage psiPackage = JavaPsiFacade.getInstance(Project).findPackage(classQualifiedName); |
| 查找被特定方法重写的方法 | Query<PsiMethod> search = OverridingMethodsSearch.search(PsiMethod); |
x.set(y.get) 的时候,我也在思考该怎么更合理的把转换对象代入到插件的代码逻辑中,可能会想到是通过弹窗配置或者代码扫描到上一行,但这样的方式终究是不舒服的,考虑到实际自己编码的习惯操作,其实我们做这步的时候,复制是第一步动作,为了更好的体验,所以这里选择了用复制来处理这块的连接性问题。
- END -
下方扫码关注 bugstack虫洞栈,与小傅哥一起学习成长、共同进步,做一个码场最贵Coder!
java 工程师、架构师,开发过交易&营销、写过运营&活动、设计过中间件也倒腾过中继器、IO板卡。不只是写Java语言,也搞过C#、PHP,是一个技术活跃的折腾者。
CodeGuide 、 itstack-demo-design ,持续霸榜 Trending,成为全球热门项目。
本文分享自微信公众号 - bugstack虫洞栈(bugstack)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
微信关注我们
转载内容版权归作者及来源网站所有!
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。
为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。
Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。
Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。