首页 文章 精选 留言 我的

精选列表

搜索[智能平台],共10000篇文章
优秀的个人博客,低调大师

🎉smart-mqtt v0.24 发布,做最好的 Java 物联网平台底座

1、smart-mqtt 简介 smart-mqtt,是 smartboot 组织下面向物联网的首款解决方案,它使用 Java 语言开发,提供高效、可靠的 MQTT Broker 服务。 smart-mqtt 的独特优势在于大量设备接入的情况下,仍能保持低延迟和高吞吐量,满足物联网领域严苛的实时性需求。同时,smart-mqtt 为了最大限度地节省硬件成本,采用了高度优化的资源管理策略,降低了系统运行时的 CPU 和内存占用,使企业在保持高性能的同时,大幅降低运维成本。 另外,mqtt 协议天然适合 IM 场景,需要打造企业级 IM 应用,smart-mqtt 同样是一个非常好的选择。 smartboot 开源组织,一个容易被误认为是在 “重复造轮子” 的低调组织。曾获得2020 年度 OSC 中国开源项目「优秀 Gitee 组织 」荣誉。 该组织内的明星项目包括: smart-socket 历时 5 年精炼出 2 千多行代码,轻松实现百万级长连接的 AIO 通信框架。 smart-http 基于 smart-socket 实现的 HTTP/1.1 web 服务。 smart-servlet 基于 smart-http 实现的 Servlet 3.1 容器服务。 smart-mqtt 基于 smart-socket 实现的 MQTT 3.1.1/5.0 Broker&Client 服务。 smart-flow 一款具备可观测性的轻量级业务编排框架。 组织地址:?https://smartboot.tech/ 代码仓库:?https://gitee.com/smartboot 2、 版本更新 我们在这个版本中进行了一次大胆的尝试。长期以来smart相关的所有前端都是采用:layui-vue,这是一款非常优秀的前端框架,对于我这个专注后端研发的人来讲,它能让我轻松通过各种丰富的组件搭建出想要的效果。 然而,自从smart-mqtt开始在企业版功能上发力的时候,遇到了一些技术层面的挑战。当我需要将echarts与layui-vue结合的时候,存在较高的学习、调试成本,并且为了作出想要的效果,echarts相关的配置代码非常冗长。可以预感,以我这半吊子的前端水准,后续将会难以维护这个工程。 之后又尝试在社区寻找好用的前端低代码解决方案,却都不如人意。反倒无意中发现一款华为开源的前端框架:opentiny。这款框架已经与 echarts 做了非常好的融合,我只需要向其输入特定格式的数据,无需操心样式相关问题。虽然在某些细节方面还有待完善,但当下对 smart-mqtt 而言是个值得尝试的选择。 现在,我们一起来欣赏下调整后的页面视图。 集群看板:顶部每个tab标签代表集群中的一个节点,主体部分露出了各节点的基础信息,包括: smart-mqtt版本号 JVM版本 服务启动时间 企业版授权效期 CPU、内存指标 当前客户端连接数、Topic数量和订阅量 区域地图:展示了过去一段时期内与smart-mqtt broker建立过连接的各省份连接数。 指标趋势图 现阶段只实现了上述内容,更多的功能正在抓紧研发中,敬请期待! 更新内容 开源版 升级smart-socket至1.5.31 升级smart-http至1.2.6 增加broker启动时关于技术支持联系方式的露出。 移除开源版中的前端资源,迁移至企业版。 企业版 增加按省份维度的访问量排名统计。 提供更加高效,且自适应采样粒度的指标统计功能。 企业版的主数据库调整为mysql,依旧保留h2的开箱即用特性。 屏蔽服务启动时的DDL语句打印。 优化数据库索引,提供更高效的检索体验。 丰富集群间的关键信息互通。 修复非周期性指标在入库时被重置的bug。 3、性能测试报告 场景一: 10 个 publisher 每隔 1 毫秒发送 payload 为 128 字节的消息,这些消息分布在 128 种 topic 下,有 2000 个 subscriber 订阅这些 topic 的消息。 smart-mqtt emqx QoS0 240W/s 25W/s QoS1 100W/s 25W/s QoS2 50W/s 25W/s 场景二: 2000 个 publisher 每隔 1 毫秒发送 10 个 payload 为 128 字节的消息,这些消息分布在 128 种 topic 下。 smart-mqtt emqx QoS0 89W/s 50W/s (间歇性不可用) QoS1 50W/s 9W/s QoS2 40W/s 6.8W/s 因为不了解 emq 的调优策略,测试过程或许存在不公平因素,结果仅供参考。 4、如何获取 smart-mqtt 4.1 源码 主仓库:https://gitee.com/smartboot/smart-mqtt 镜像同步:https://github.com/smartboot/smart-mqtt 4.2 Maven 依赖 mqtt broker <dependency> <groupId>org.smartboot.mqtt</groupId> <artifactId>smart-mqtt-broker</artifactId> <version>0.24</version> </dependency> mqtt client <dependency> <groupId>org.smartboot.mqtt</groupId> <artifactId>smart-mqtt-client</artifactId> <version>0.24</version> </dependency> 4.3 发行包 社区版 打开浏览器访问:https://gitee.com/smartboot/smart-mqtt/releases下载最新版。 企业版 成为项目赞助商,单独提供发行包(具体见下文)。 5. 关于 smart-mqtt 企业版 smart-mqtt 目前是由个人开发者在业余时间维护,暂无提供商业化服务的计划。 出于项目的可持续发展需要,我们在 smart-mqtt 社区版的基础上,丰富了一些企业级功能。如果贵公司认可 smart-mqtt 的价值,可以通过成为赞助商获得企业版授权。 功能特性 企业版 License 认证。授权过期将无法启动服务,但并不会因授权过期影响正在运行的 Broker。 MQTT over WebSocket。 Broker 集群部署。 管理后台 指标数据持久化(H2、MySQL) 未完待续... 赞助商等级 青铜赞助商 白银赞助商 黄金赞助商 铂金赞助商 赞助条件 加入企业支持计划 500 元 / 年 1500 元 / 年 5000 元 / 年 License 有效期 1 年 1 年 1 年 1 年 部署指导 - 1 次 1 次 不限次数 Logo 展示位 - 小号 中号 大号 首页 Logo 展示 - - - ✅ 技术支持 文档 邮件 /ISSUE 微信 / QQ / 邮件 微信 / QQ / 邮件 白银赞助商的价值: 成本:500 元 / 年,相当于一名初中级程序员一天的薪资。 产出效益: 增加品牌曝光率。 节省投入在 Sass 云服务中的巨额资费。 结交更多物联网领域的从业者。 成为赞助商遵循双方自愿原则,我们会在能力范围内尽可能提供 smart-mqtt 相关的技术支持。与此同时因时间和精力有限,我们也并不希望由此带来额外的负担,影响到项目的正常迭代。 所以,如有疑问尽量通过 ISSUE 交流,或者通过 ISSUE 和官方文档自助寻找答案,还望理解~~ ISSUE:?https://gitee.com/smartboot/smart-mqtt/issu

优秀的个人博客,低调大师

gofs v0.7.1 已经发布,基于 Go 的跨平台实时文件同步工具

Fixed 修复中继文档中的示例 修复停止grpc客户端导致panic的问题 修复同步文件到服务端场景的测试用例 Enhancements 新增dry_run命令行参数来支持启动gofs但是不真正执行同步操作 新增一些MinIO的集成测试 更新gofs程序的描述信息 在parseRedisConnection函数中返回int类型的db字段 在Loader接口中新增一些保存函数 更新构建脚本,在构建之前先切换到main分支 更新依赖包,github.com/gin-gonic/gin v1.9.0 => v1.9.1 更新依赖包,github.com/quic-go/quic-go v0.34.0 => v0.36.0 更新依赖包,github.com/minio/minio-go/v7 v7.0.55 => v7.0.58 更新依赖包,google.golang.org/grpc v1.55.0 => v1.56.0 更新依赖包,github.com/no-src/log v0.1.10 => v0.2.3 更新依赖包,github.com/no-src/nscache v0.1.0 => v0.1.1 更新依赖包,golang.org/x/oauth2 v0.8.0 => v0.9.0 更新依赖包,google.golang.org/protobuf v1.30.0 => v1.31.0 详情查看:https://github.com/no-src/gofs/releases/tag/v0.7.1

优秀的个人博客,低调大师

高性能跨平台网络通信框架 HP-Socket v5.9.2 发布

项目主页:http://www.oschina.net/p/hp-socket 开发文档: https://www.docin.com/p-4062394468.html 下载地址: https://github.com/ldcsaa/HP-Socket v5.9.2 更新 一、主要更新 HTTP Cookie 请求和响应头 ‘Cookie’、‘Set-Cookie’ 支持不区分大小写 更好支持 GCC 11 编译器 二、第三方库更新 openssl 升级到 1.1.1u 版本 mimalloc 升级到 1.8.2 版本 HP-Socket 组件列表 基础组件 SSL 组件 HTTP 组件

优秀的个人博客,低调大师

酷瓜云课堂(企业版)v1.2.0 发布,在线教育平台软件

更新内容 增加beanstalk消费队列配套功能 修正优惠券Macro endif不匹配问题 修正创建提现账号问题 优化OfficeAccount语法结构 优化提现账号验证流程 优化课程等MeInfo信息 优化外部通知 注意事项 由于增加队列组件,此次更新需要更新PHP镜像,如果更新出现错误,请联系我们。 (1)和往常一样执行 bash upgrade.sh 升级系统 (2)执行如下如下命令更新PHP镜像 sudo docker-compose build --pull php sudo docker-compose up -d --force-recreate --build php (3)使用 ps aux | grep php 命令查看是否有 queue start 的字样,有则说明更新成功 系统介绍 酷瓜云课堂,依托腾讯云基础服务架构,采用 C 扩展框架 Phalcon 开发,致力互联网课程点播,互联网课程直播,局域网课程点播,局域网课程直播,垂直于在线教育解决方案。 系统功能 实现了点播、直播、考试、专栏、面授、问答、会员、积分、秒杀、拼团、分销等。 友情提示 请使用干净的系统执行安装,如有安装过 nginx,apache 之类的占用 80 和 443 端口的 web 服务会造成端口冲突 配置要求 操作系统:Ubuntu | Debain | Centos 系统内存:2G+ 桌面端演示 前台演示 后台演示 演示帐号:100015@163.com / 123456 (前后台通用) H5 端演示 演示帐号:13507083515 / 123456 微信公众号演示 演示帐号:13507083515 / 123456 微信小程序演示 演示帐号:13507083515 / 123456 支付流程演示 MySQL 提升全面讲解 MySQL 架构设计(0.01 元) Nginx 入门到实践 Nginx 中间件(0.01 元) 数据库与中间件的基础必修课(0.02 元) Tips:测试支付请用手机号注册一个新账户,以便接收订单通知,以及避免课程无法购买 视频加密演示 CSS3 实现按钮特效 课程简介 微信推送演示 Tips:请用手机注册一个新账号,用户中心 -> 关注订阅,扫码关注公众号。之后的登录、购买、退款、直播、咨询等会有消息推送。 产品试用 申请地址:点击申请

优秀的个人博客,低调大师

使用MASA全家桶从零开始搭建IoT平台(三)管理设备的连接状态

前言 获取一个设备的在线和离线状态,是一个很关键的功能。我们对设备下发的控制指令,设备处于在线状态才能及时给我们反馈。这里的在线和离线,我们可以简单的理解为设备与MQTT的连接状态。 分析 我们打电话的时候经常能听到:"您拨打的用户已关机“和”用户不在服务区或暂时无法接通“,这两种的区别是什么? 1、当用户开机时,会自动向最近的移动基站注册,基站标记该用户为"attach"(在线)状态。 2、当用户关机时,手机会发起datach流程,告知基站自己关机了,基站标记该用户为"detach"(离线)状态。这样再次拨打就可以节省寻呼资源,直接提示用户关机。 3、当用户忽然进入无网络的环境,或者手机故障,导致来不及发起datach流程,基站还认为用户"在线",当有人拨打用户号码时,基站测会对用户进行寻呼,但是超时得不到回应后,就会提示"不在服务区"或者"暂时无法接通" 的语音。 其实这个方案在IoT上也是可行的,我们可以让设备在线和离线的过程中向特定Topic发送状态消息,但是存在问题,我们需要一个单独的Broker去订阅这个Topic,但是这个单独的Broker很容易成为单点故障点。而且如果设备数量很大,这种意外离线的设备也很难及时发现,需要下发指令后等待设备响应超时才能发现。 方案1:遗嘱消息 MQTT 遗嘱消息可以在客户端意外断线时将“遗嘱”优雅地发送给第三方订阅者,以实现离线通知、设备状态更新等业务。其中意外断线指客户端断开前未向服务器发送 DISCONNECT 消息,比如: 因网络故障或网络波动,设备在保持连接周期内未能通讯,连接被服务端关闭 设备意外掉电 设备尝试进行不被允许的操作而被服务端关闭连接,例如订阅自身权限以外的主题等 遗嘱消息在 MQTT 客户端向服务器端 CONNECT 请求时设置,可选属性包括是否发送遗嘱消息 (Will Message)标志,和遗嘱消息主题 (Topic) 与内容(Payload) 以及 Properties。 值得一提的,遗嘱消息发布的时间可能会有延迟:通常意外断线时,服务器无法立即检测到断线行为,需要通过连接保活心跳机制并经过一定周期后才会触发;MQTT 5.0 提供的遗嘱延迟间隔(Will Delay Interval)属性也会影响发布时间。 演示遗嘱消息的使用 我们使用A、B两台电脑使用MQTT X来演示。 我们在A电脑的 MQTT X 中新建一个名为 Test 的连接,Host 修改为 修改为我们的MQTT地址(192.120.5.204),并输入账号密码,在 Advanced 部分选择 MQTT Version 为 5.0,并且将 Session Expiry Interval 设置为 10,确保会话不会在遗嘱消息发布前过期。 然后在 Lass Will and Testament 部分将 Last-Will Topic 设置为 offline,Last-Will Payload 设置为 I'm offline,Will Delay Interval (s) 设置为 5。 完成以上设置后,我们点击右上角的 Connect 按钮以建立连接。 我们在B电脑的MQTTX中新建一个连接Sub,mqtt地址同样指向我们的mqtt服务器(192.120.5.204) 并订阅offline主题 我们用任务管理器直接结束A电脑的MQTTX进程,这是连接会被直接断开,模拟了设备断电的场景,在5s之后,在B电脑的MQTTX订阅中收到了一条内容为 I‘m offline 的遗嘱消息。 实施流程 1、设备遗嘱消息内容设置为offline,该遗嘱主题与一个普通发送状态的主题设定成同一个 {设备名称}/status。例如 284202304230001/status 2、当设备连接时,向主题 {设备名称}/status 发送内容为 online 的Retained消息,其它客户端订阅主题 {设备名称}/status 的时候,将获取到 Retained 消息为 online。 保留消息(Retain ) MQTT 服务端收到 Retain 标志为 1 的 PUBLISH 报文时,会将该报文视为保留消息,除了被正常转发以外, 保留消息会被存储在服务端,每个主题下只能存在一份保留消息,因此如果已经存在相同主题的保留消息,则该保留消息被替换。 当客户端建立订阅时,如果服务端存在主题匹配的保留消息,则这些保留消息将被立即发送给该客户端。 借助保留消息,新的订阅者能够立即获取最近的状态,而不需要等待无法预期的时间,这在很多场景下是非常重要的。 EMQX 默认开启保留消息的能力和服务,可以在 etc/emqx.conf 中修改 mqtt.retain_available 为 false 来关闭保留消息的能力, 这样客户端将被禁止发送 Retain 标志为 1 的 PUBLISH 报文,否则,客户端将会收到原因码为 0x9A(不支持保留消息)的 DISCONNECT 报文。 保留消息的服务会存储和管理客户端发送的保留消息,并发送给相应的订阅者。 3、当客户端异常断开时,系统自动向主题 {设备名称}/status 发送内容为 offline 的消息,其它订阅了此主题的客户端会马上收到 offline 消息;如果遗嘱消息设置了 Will Retain,那么此时如果有新的订阅 A/status 主题的客户端上线,也将获取到内容为 offline 的遗嘱消息。 方案2:使用WebHook 方案1需要设备主动设置遗嘱消息才能实现,那么有没有更简单的方式,直接通过设备与Mqtt的连接事件来获取连接状态呢。 EMQX 设计了一套WebHook系统,可以通过这个自带的WebHook系统获取内部的事件并进行处理。WebHook的原理很简单,当设备与mqtt建立连接或者断开连接时,EMQX会把事件的信息通过我们的配置调用特定的URL上的接口,实现通知。 使用WebHook还可以有限避免单点故障。所以本项目会采用WebHook的方式来实现对设备在线和离线的管理。 开启WebHook 在数据集成 -> 数据桥接 中创建一个Webhook 名称设置为ConnectedEvent,URL 中填写我们的Webhook地址,也就是触发事件之后的调用接口地址,这里我们填: http://192.120.5.204:5000/api/Device/ConnectedEvent 请求方式为Post,其他内容保持默认不变 这里注意URL可以通过${field}的方式拼接,请求体也可以自己指定,如果留空会原样转发消息,我们这里请求体留空 设备在线和离线的事件转发的消息格式如下 { "username": "284202304230001", "timestamp": 1682652598840, "sockname": "172.17.0.5:1883", "receive_maximum": 32, "proto_ver": 5, "proto_name": "MQTT", "peername": "172.17.0.1:48524", "node": "emqx@172.17.0.5", "mountpoint": "undefined", "metadata": { "rule_id": "rule_3hsx" }, "keepalive": 60, "is_bridge": false, "expiry_interval": 10, "event": "client.connected", "connected_at": 1682652598840, "conn_props": { "User-Property": {}, "Session-Expiry-Interval": 10 }, "clientid": "mqttx_c4491df0", "clean_start": false } 我们点击 创建 ,并继续点击 创建规则 我们在创建规则中指定新的规则名称 rule_client_connected,并在SQL编辑器复制以下内容 SELECT * FROM "$events/client_connected", "$events/client_disconnected" 在右侧的事件中,我们可以看到所有可用的事件,我们选择了连接和断开两个事件,在这两个事件触发时会通过Webhook调用我们配置的接口,这样我们就能获取到设备的在线、离线状态了。 我们点击 创建按钮 完成规则的创建 我们可以看见我们创建好的规则 点击规则ID,还可以看到统计数据 在FLows中还可以看到整个工作流程 演示Webhook 我们使用MQTTX模拟一次设备连接和断开动作,可以在规则统计界面看到我们的操作已经被记录。 编写代码 我们这里采用方案2。 我们需要实现之前配置的ConnectedEvent接口 /// <summary> /// 连接事件请求 /// </summary> public class ConnectedEventRequest { /// <summary> /// 设备名称 /// </summary> public string Username { get; set; } /// <summary> /// 时间戳 /// </summary> public long Timestamp { get; set; } /// <summary> /// 事件(连接/断开) /// </summary> public string Event { get; set; } /// <summary> /// 连接时间(断开事件中为0) /// </summary> public long Connected_at { get; set; } /// <summary> /// Client ID /// </summary> public string Clientid { get; set; } } /// <summary> /// 更新设备在线状态 /// </summary> /// <param name="deviceName"></param> /// <param name="onlineStatus"></param> /// <returns></returns> public async Task UpdateDeviceOnlineStatusAsync(string deviceName, OnLineStates onlineStatus) { var device = await _ioTDbContext.IoTDeviceInfo.Include(o => o.IoTDeviceExtend).AsNoTracking() .FirstOrDefaultAsync(o => o.DeviceName == deviceName); if (device == null) { return; } else { if (device.IoTDeviceExtend == null) //扩展表为空 { device.IoTDeviceExtend = new IoTDeviceExtend { DeviceInfoId = device.Id, OnLineStates = (int)onlineStatus, }; _ioTDbContext.Attach(device.IoTDeviceExtend); _ioTDbContext.Entry(device.IoTDeviceExtend).State = EntityState.Added; _ioTDbContext.Entry(device.IoTDeviceExtend).Property(o => o.OnLineStates).IsModified = true; await _ioTDbContext.SaveChangesAsync(); } if (device.IoTDeviceExtend.OnLineStates != (int)onlineStatus) //在线状态不一致 { device.IoTDeviceExtend.OnLineStates = (int)onlineStatus; _ioTDbContext.Attach(device.IoTDeviceExtend); //防止更新其他字段 _ioTDbContext.Entry(device.IoTDeviceExtend).State = EntityState.Unchanged; _ioTDbContext.Entry(device.IoTDeviceExtend).Property(o => o.OnLineStates).IsModified = true; await _ioTDbContext.SaveChangesAsync(); } } } 我们根据Event中的内容来判断是 连接(client.connected)/断开(client.disconnected) 的事件 /// <summary> /// 连接、断开事件 /// </summary> /// <param name="request"></param> /// <returns></returns> [HttpPost] public async Task ConnectedEventAsync([FromBody] ConnectedEventRequest request) { var onlineStatus = request.Event switch { "client.connected" => OnLineStates.OnLine, _ => OnLineStates.OffLine }; await _deviceHandler.UpdateDeviceOnlineStatusAsync(request.Username, onlineStatus); } #总结 以上就是本文要讲的内容,我们可以通过MQTTX来测试我们的代码有效性。 该方案还存在部分缺点,例如: 1、每次设备上下线会导致频繁的请求接口,在大量设备接入的场景中需要考虑接口性能。 2、由于网络等问题,Web调用顺序可能不能完全保证,也许离线会比在线事件更早处理,从而导致状态不一致。我们后面会尝试用其他方案来替代WebHook,尝试解决上述问题,在此之前我们都会继续使用WebHook进行功能演示。 完整代码在这里:https://github.com/sunday866/MASA.IoT-Training-Demos 如果你对我们的 MASA 感兴趣,无论是代码贡献、使用、提 Issue,欢迎联系我们 WeChat:MasaStackTechOps QQ:7424099

优秀的个人博客,低调大师

酷瓜云课堂(内网版)v1.0.6 发布,局域网在线学习平台

更新内容 增加刷新opcache功能 增加清理测试数据脚本 首页轮播+课程合并为首页缓存 强化文章|提问|课程列表参数检查 优化课程学习时长同步 优化排序条件,改善分页重复问题 优化文件上传 优化学员导入 优化通用验证类 导入模板本地化 增加考试收藏 增加同步练习 增加前台直播管理 增加弹幕功能 增加右键屏蔽功能 后台试卷增加标题搜索 课时增加评论|弹幕|快进控制 系统介绍 酷瓜云课堂内网版,采用C扩展框架Phalcon开发,使用本地基础服务,无营销相关功能,主要适用于公司,学校等内部网络环境使用。 系统功能 实现了点播、直播、专栏、问答、积分等。 友情提示: 演示系统配置低,带宽有限,切莫压测 课程数据来源于网络(无实质内容) 管理后台已禁止数据提交,私密配置已过滤 系统演示: 前台演示 后台演示 演示账号:100015@163.com / 123456 (前后台通用) 项目组件 后台框架:phalcon 3.4.5 前端框架:layui 2.7.6 全文检索:xunsearch 1.4.9 即时通讯:workerman 3.5.22 基础依赖:php7.3, mysql5.7, redis5.0 项目文档 运行环境搭建 系统服务配置 客户终端配置 下载地址 桌面端 lan-edu-v1.0.6.zip 移动端 lan-edu-v1.0.1.zip

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册