首页 文章 精选 留言 我的

精选列表

搜索[vue3],共1101篇文章
优秀的个人博客,低调大师

Vue3 组件 view-shadcn-ui 2024.5.2 发布

View Shadcn UI 是一个基于 Tailwind CSS 构建的组件库。 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件:https://github.com/devlive-community/openai-java-sdk 推荐一套功能强大的开源数据中台系统:https://github.com/devlive-community/datacap 组件源码地址:https://github.com/devlive-community/view-shadcn-ui ✨ 功能特性 国际化:支持响应式语言切换 国际化:支持动态语言 实用工具:新增 UUID 工具函数 工作流:支持工作流 标签输入:支持标签输入组件 Map:支持 Map 组合数据功能 加载进度条:支持加载进度条 悬浮按钮:支持悬浮按钮 数据过滤:支持数据过滤功能 组件截图 语言国际化 UUID 工具函数 输入标签 加载进度条 悬浮按钮 数据筛选器 全局引用 修改main.ts入口文件中的配置如下: import { createApp } from 'vue' import App from './App.vue' const app = createApp(App) // Import View Shadcn UI import ViewShadcnUI from 'view-shadcn-ui' app.use(ViewShadcnUI) 按需引用 import { ShadcnButton } from 'view-shadcn-ui' app.component('ShadcnButton', ShadcnButton) 或者 <template> <ShadcnButton>Button</ShadcnButton> </template> <script setup> import { ShadcnButton } from 'view-shadcn-ui' </script> 推荐一套全平台数据库管理工具,建议下载使用:https://github.com/devlive-community/dbm 我们即将推出一套开源新系统。InfoSphere 是一款面向企业和个人的开源 Wiki 系统,旨在提供简单而强大的知识管理解决方案。建议尝试使用:https://github.com/devlive-community/incubator-infosphere 欢迎大家前往测试站点使用并提出宝贵的建议,如果您有需要实现的布局,可以提交 issues 我们会在最快的时间内实现。 我们的示例地址为:https://view-shadcn-ui.devlive.org 询问AI

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

Vue3 组件 view-shadcn-ui 2024.4.0 发布

View Shadcn UI 是一个基于 Tailwind CSS 构建的组件库。 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件:https://github.com/devlive-community/openai-java-sdk 推荐一套功能强大的开源数据中台系统:https://github.com/devlive-community/datacap 组件源码地址:https://github.com/devlive-community/view-shadcn-ui 🐛 Bug 修复 input:修复文本域边框显示问题 (588b8dd) tree:修复在懒加载时悬浮和选中状态样式异常的问题 (b6610f1) ✨ 新功能 contextmenu:支持右键菜单功能 (2f1620e) contextmenu:支持自定义位置 (59a9b1c) contextmenu:支持菜单项禁用状态 (13f0029) contextmenu:支持子菜单功能 (5bc2533) select:支持选项懒加载 (4bb4761) spin:优化背景层显示 tabs:支持标签项的标签插槽 (41d4279) tabs:支持标签项的点击事件 (d191501) collapse:支持折叠面板项的标题功能 (0f0e99d) form:支持动态表单 (bfd3997) hover card:修复代码问题 (d22408c) hover card:支持悬浮卡片功能 (712549a) hover card:支持标题和底部插槽 (66f5b35) toggle:添加图片示例 (65703a8) toggle:支持禁用状态 (b151771) toggle:支持分组功能 (5b7bda1) toggle:支持分组多选模式 (ae09b8c) toggle:支持尺寸设置 (0efec03) toggle:支持切换功能 (f732b08) switch:支持自定义值设置 (036b7b3) 全局引用 修改main.ts入口文件中的配置如下: import { createApp } from 'vue' import App from './App.vue' const app = createApp(App) // Import View Shadcn UI import ViewShadcnUI from 'view-shadcn-ui' app.use(ViewShadcnUI) 按需引用 import { ShadcnButton } from 'view-shadcn-ui' app.component('ShadcnButton', ShadcnButton) 或者 <template> <ShadcnButton>Button</ShadcnButton> </template> <script setup> import { ShadcnButton } from 'view-shadcn-ui' </script> 推荐一套全平台数据库管理工具,建议下载使用:https://github.com/devlive-community/dbm 我们即将推出一套开源新系统。InfoSphere 是一款面向企业和个人的开源 Wiki 系统,旨在提供简单而强大的知识管理解决方案。建议尝试使用:https://github.com/devlive-community/incubator-infosphere 欢迎大家前往测试站点使用并提出宝贵的建议,如果您有需要实现的布局,可以提交 issues 我们会在最快的时间内实现。 我们的示例地址为:https://shadcn.vue.devlive.org 询问AI

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

Vue3 组件 view-shadcn-ui 2024.1.2 发布

View Shadcn UI 是一个基于 Shadcn UI 和 Tailwind CSS 构建的组件库。 推荐一套为 Java 开发人员提供方便易用的 SDK 来与目前提供服务的的 Open AI 进行交互组件:https://github.com/devlive-community/openai-java-sdk 推荐一套功能强大的开源数据中台系统:https://github.com/devlive-community/datacap 组件源码地址:https://github.com/devlive-community/view-shadcn-ui 常规更新 [Docs] 添加了一些配置 [Env] 优化了 NPM 版本发布脚本 组件更新 [Row] 支持行、列 [Row] 支持栅格间距 [Row] 支持对齐 [Row] 支持水平排列 [Row] 支持换行 [Col] 支持跨度 [Col] 支持顺序 [Divider] 支持类型 [Divider] 支持位置 [Divider] 支持虚线 [Tooltip] 支持宽度 [Tooltip] 支持省略号 [Tooltip] 支持长度 [Tooltip] 支持多行 [Avatar] 支持尺寸 [Avatar] 支持方形 [Avatar] 支持成功事件 [Avatar] 支持失败事件 [Badge] 支持类型 [Badge] 支持文本 [Badge] 支持最大值 [Badge] 支持小红点 [Alert] 支持标题 [Alert] 支持描述 [Alert] 支持类型 [Alert] 支持可关闭 [Alert] 支持图标 [Alert] 支持横幅模式 [Progress] 支持状态 [Progress] 支持尺寸 [Progress] 支持显示标签 [Space] 支持尺寸 [Space] 支持自定义尺寸 [Space] 支持换行 [Space] 支持数组尺寸 [Switch] 支持类型 [Switch] 支持尺寸 [Switch] 支持禁用 [Switch] 支持开关槽 [Radio] 支持禁用 [Radio] 支持尺寸 [Radio] 支持类型 [Radio] 支持组 [Checkbox] 支持禁用 [Checkbox] 支持尺寸 [Checkbox] 支持类型 [Checkbox] 支持组 [Input] 修复了边框样式 [Input] 支持禁用 [Input] 支持密码 [Input] 支持文本域 [Select] 支持禁用 [Select] 支持插槽 [Select] 支持尺寸 [Select] 支持类型 [Rate] 支持最大值 [Rate] 支持半选 [Rate] 支持类型 [Rate] 支持禁用 [Rate] 支持显示文本 [Tab] 支持禁用 [Tab] 支持类型 [Tab] 支持尺寸 [Tab] 支持 v-model [Tab] 支持项图标 [Tab] 支持卡片模式 [Tab] 支持可关闭 [Tab] 支持额外插槽 [Tab] 支持垂直模式 [Tab] 支持位置 [Tab] 增加动态示例 [Tab] 支持移除 [Skeleton] 支持动画 [Skeleton] 支持标题 [Skeleton] 支持项类型 [Skeleton] 支持项尺寸 [Layout] 支持布局和头部 [Layout] 支持内容 [Layout] 支持页脚 [Layout] 支持多布局 [Layout] 修复自定义宽度 [Layout] 添加 shadcn-layout-wrapper 选择器 [Layout] 添加一些选择器 [Page] 支持分页尺寸 [Page] 支持上一页和下一页 [Page] 支持显示最大页数 [Page] 支持显示总数 [Page] 支持分页器 [Page] 增加插槽 [Drawer] 支持自定义标题 [Drawer] 支持可关闭 [Drawer] 支持遮罩可关闭 [Drawer] 支持位置 [Drawer] 支持宽度和高度 [Menu] 支持宽度 [Menu] 支持方向 [Menu] 支持 v-model [Message] 支持显示图标 [Message] 支持类型 [Message] 支持背景 [Message] 支持设置 0 则不会自动关闭 [Message] 支持可关闭 [Table] 支持条纹 [Table] 支持边框 [Table] 支持自定义列插槽 [Table] 支持行点击事件 [Table] 支持固定列 [Table] 支持宽度 [Table] 支持列宽 [Table] 支持固定阴影 [Table] 支持多列固定 [Table] 支持高度 全局引用 修改main.ts入口文件中的配置如下: import { createApp } from 'vue' import App from './App.vue' const app = createApp(App) // Import View Shadcn UI import ViewShadcnUI from 'view-shadcn-ui' app.use(ViewShadcnUI) 按需引用 import { ShadcnButton } from 'view-shadcn-ui' app.component('ShadcnButton', ShadcnButton) 或者 <template> <ShadcnButton>Button</ShadcnButton> </template> <script setup> import { ShadcnButton } from 'view-shadcn-ui' </script> 推荐一套全平台数据库管理工具,建议下载使用:https://github.com/devlive-community/dbm 我们即将推出一套开源新系统。InfoSphere 是一款面向企业和个人的开源 Wiki 系统,旨在提供简单而强大的知识管理解决方案。建议尝试使用:https://github.com/devlive-community/incubator-infosphere 欢迎大家前往测试站点使用并提出宝贵的建议,如果您有需要实现的布局,可以提交 issues 我们会在最快的时间内实现。 我们的示例地址为:https://shadcn.vue.devlive.org

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

❤️‍🔥FlyFlow:Ant Design Vue3 版本来袭~~~

FlyFlow 介绍 官网地址:www.flyflow.cc Element Plus 演示网址:pro.flyflow.cc Ant Design演示网址:ant.flyflow.cc 经过作者几个星期夜以继日的辛勤耕耘与不懈探索,FlyFlow工作流框架的AntDesign版本终于璀璨问世,为这款强大的业务流程管理工具增添了新的活力与风采。与此同时,FlyFlow工作流框架也展现出了其非凡的包容性与灵活性,实现了与Element Plus框架的和谐共存,为用户提供了更加多元化的选择空间。 AntDesign版本的FlyFlow工作流框架,以其独特的视觉风格、丰富的组件库和高效的交互设计,为用户带来了全新的操作体验。它继承了AntDesign一贯的优雅与简洁,将工作流的各个环节以直观、清晰的方式呈现给用户,极大地提升了工作效率与团队协作的顺畅度。无论是创建复杂的工作流程,还是实时监控任务进度,用户都能通过这一版本轻松应对,游刃有余。 FlyFlow工作流框架的AntDesign版本与Element Plus框架的并存,不仅为用户带来了更多的选择与可能,也为业界树立了新的标杆。未来,随着技术的不断进步和市场的不断发展,FlyFlow工作流框架将继续秉承创新、开放、合作的精神,不断探索新的技术方向和应用场景,为用户创造更大的价值。

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

Vue3最新Router带来哪些颠覆性变化?

1 前后端开发模式的演变 jQuery时对大部分Web项目,前端不能控制路由,要依赖后端项目的路由系统。通常,前端项目也部署在后端项目的模板里,项目执行示意图: jQuery前端都要学会在后端模板如JSP里写代码。此时,前端工程师无需了解路由。对每次的页面跳转,都由后端负责重新渲染模板。 前端依赖后端,且前端无需负责路由,有很多 优点 如开发速度快、后端也承担部分前端任务,所以至今很多内部管理系统还这样。 缺点 如: 前后端项目无法分离 页面跳转由于需重新刷新整个页面、等待时间较长,让交互体验下降 为提高页面交互体验,很多前端做不同尝试。前端开发模式变化,项目结构也变化。目前前端开发中,用户访问页面后代码执行的过程: 用户访问路由后,无论URL地址,都直接渲染一个前端的入口文件index.html,然后在index.html文件中加载JS、CSS 之后,js获取当前页面地址及当前路由匹配的组件 再去动态渲染当前页面 用户在页面上点击时,也不需刷新页面,而直接通过JS重新计算出匹配的路由渲染。 前后两个示意图中,绿色的部分表示的就是前端负责的内容。后面这架构下,前端获得路由的控制权,在js中控制路由系统。也因此,页面跳转时就不需刷新页面,网页浏览体验提高。 这种所有路由都渲染一个前端入口文件的方式,是单页面应用程序(SPA)的雏形。 通过js动态控制数据去提高用户体验的方式并不新奇,Ajax让数据获取不需刷新页面,SPA应用让路由跳转也不需要刷新页面。这种开发模式在jQuery时代就出来,浏览器路由的变化可以通过pushState来操作,这种纯前端开发应用的方式,以前称Pjax (pushState+ Ajax)。之后,这种开发模式在MVVM框架时代放异彩,现在大部分使用Vue/React/Angular应用都这种架构。 SPA应用相比于模板的开发方式,对前端更友好,如: 前端对项目控制权更大 交互体验更丝滑 前端项目终于可独立部署 完成了前后端系统完全分离。 2 前端路由的实现原理 通过URL区分路由的机制实现: hash模式,通过URL中#后面的内容做区分,hash-router history模式,路由看起来和正常URL一致 对应vue-router的函数: createWebHashHistory createWebHistory 2.1 hash 模式 单页应用在页面交互、页面跳转上都是无刷新的,极大提高用户访问网页的体验。 为实现单页应用,前端路由的需求也变重要。 类似服务端路由,前端路由实现也简单,就是匹配不同 URL 路径,进行解析,然后动态渲染出区域 HTML 内容。但URL每次变化都会造成页面的刷新。解决思路:改变 URL 时保证页面的不刷新。 2014年前,大家通过 hash 实现前端路由,URL hash 中的 # 类似下面这种 # : http://www.xxx.com/#/login 之后,在进行页面跳转操作时,hash 值变化并不会导致浏览器页面刷新,只会触发hashchange事件。在下面的代码中,通过对hashchange事件的监听,就可在fn函数内部进行动态地页面切换。 window.addEventListener('hashchange',fn) 2.2 history 模式 2014年后HTML5标准发布,浏览器多API:pushState 和 replaceState。可改变 URL 地址,并且浏览器不会向后端发送请求,就能用另外一种方式实现前端路由。 监听popstate事件,可监听到通过pushState修改路由的变化。并且在fn函数中,我们实现了页面的更新 window.addEventListener('popstate', fn) 3 手写vue-router src/router新建grouter文件夹 在grouter文件夹新建index.js 手写Vuex的基础,在index.js写代码。 先用Router类去管理路由,并用createWebHashHistory返回hash模式相关的监听代码及返回当前URL和监听hashchange事件的方法 import {ref,inject} from 'vue' const ROUTER_KEY = '__router__' function createRouter(options){ return new Router(options) } function useRouter(){ return inject(ROUTER_KEY) } function createWebHashHistory(){ function bindEvents(fn){ window.addEventListener('hashchange',fn) } return { bindEvents, url:window.location.hash.slice(1) || '/' } } class Router { constructor(options) { this.history = options.history this.routes = options.routes this.current = ref(this.history.url) this.history.bindEvents(()=>{ this.current.value = window.location.hash.slice(1) }) } // 通过Router类install方法注册Router实例 install(app) { app.provide(ROUTER_KEY,this) } } // 暴露createRouter方法创建Router实例 // 暴露useRouter方法,获取路由实例 export {createRouter,createWebHashHistory,useRouter} 回到src/router/index.js: import {createRouter, createWebHashHistory} from './grouter/index' const router = createRouter({ history: createWebHashHistory(), // 使用routes作为页面参数传递给createRouter函数 routes }) 在createRouter创建的Router实例上,current返回当前路由地址,并用ref包裹成响应式数据。 注册两个内置组件: router-view:就是current变化时,去匹配current地址对应组件,然后动态渲染到router-view。 router-link 实现RouterView组件 grouter下新建RouterView.vue。 <template> 4. 在template内部使用component组件动态渲染 <component :is="comp"></component> </template> <script setup> import {computed } from 'vue' import { useRouter } from '../grouter/index' // 1. 先用useRouter获取当前路由的实例 let router = useRouter() // 3. 最后通过计算属性返回comp变量 const comp = computed(()=>{ // 2. 通过当前的路由,即router.current.value值,在用户路由配置route中计算出匹配的组件 const route = router.routes.find( (route) => route.path === router.current.value ) return route?route.component : null }) </script> 实现router-link组件 grouter下新建RouterILink.vue。template是渲染个a标签,只是将其href属性前加个#, 实现hash的修改。 <template> <a :href="'#'+props.to"> <slot /> </a> </template> <script setup> import {defineProps} from 'vue' let props = defineProps({ to:{type:String,required:true} }) </script> 回到grouter/index.js,注册router-link、router-view组件,hash模式mini-vue-router就实现了。 import {ref,inject} from 'vue' import RouterLink from './RouterLink.vue' import RouterView from './RouterView.vue' class Router{ .... install(app){ app.provide(ROUTER_KEY,this) app.component("router-link",RouterLink) app.component("router-view",RouterView) } } vue-router还需处理路由懒加载、路由的正则匹配等。 4 vue-router实战路由匹配 vue-router支持动态路由。某用户页面使用User组件,但每个用户信息不一,需给每个用户配置单独的路由入口,就可按下面代码样式配置路由。 冒号开头的id就是路由的动态部分,同时匹配/user/dasheng和/user/javaedge, 详见 官方文档的路由匹配语法部分。 const routes = [ { path: '/users/:id', component: User }, ] 有些页面,仅管理员可访问,普通用户访问提示无权限。得用vue-router的 路由守卫功能 ,即访问路由页面之前进行权限认证,做到页面级控制,只允许某些用户访问。 项目庞大后,如果首屏加载文件太大,就可能影响性能。可用vue-router的 动态导入功能,把不常用的路由组件单独打包,当访问到这个路由的时候再进行加载,这也是vue项目常见优化方式。 5 总结 前后端开发模式演进:前端项目经历的从最初的嵌入到后端内部发布,再到如今前后端分离,也见证了前端SPA发展。 前端路由实现的两种方式,即通过监听不同的浏览器事件,实现hash、history模式。之后,根据这原理,手写vue-router,通过createRouter创建路由实例,并在app.use函数内部执行router-link和router-view组件的注册,最后在router-view组件内部动态的渲染组件。 Vue Router 路由实现步骤 路由配置: import { createRouter, createWebHistory } from 'vue-router' const routes = [ { path: '/login', name: 'Login', component: () => import('@/views/user/login.vue') }, { path: '/', name: 'Home', component: () => import('@/views/Home.vue'), meta: { requiresAuth: true } // 需要登录权限 } ] const router = createRouter({ history: createWebHistory(), routes }) 路由守卫: router.beforeEach((to, from, next) => { const token = localStorage.getItem('token') if (to.meta.requiresAuth && !token) { // 需要登录但未登录,重定向到登录页 next({ path: '/login', query: { redirect: to.fullPath } }) } else { next() } }) 登录组件中使用路由: <script setup> import { useRouter, useRoute } from 'vue-router' const router = useRouter() const route = useRoute() const login = async () => { try { await doLogin() // 登录成功后跳转 const redirect = route.query.redirect || '/' router.push(redirect) } catch (error) { handleError(error) } } const logout = async () => { localStorage.removeItem('token') router.push('/login') } </script> 主应用挂载路由: import { createApp } from 'vue' import router from './router' import App from './App.vue' const app = createApp(App) app.use(router) app.mount('#app') 路由视图渲染: <template> <router-view></router-view> </template> 路由流程: 配置路由表 设置路由守卫 组件中注入路由 应用挂载路由 视图渲染组件 使用方式: 声明式: <router-link to="/login"> 编程式: router.push('/login') FAQ 60行代码实现hash模式的迷你vue-router,支持history模式的迷你vue-router咋实现? 实现支持 history 模式 的迷你 Vue Router 的核心是利用 HTML5 提供的 pushState 和 replaceState API,以及监听 popstate 事件来响应浏览器的回退、前进等操作。以下是支持 history 模式的迷你 Vue Router 的实现步骤: 实现 history 模式的 createWebHistory 方法 在 src/router/grouter/index.js 中修改或新增以下代码,用于返回 history 模式相关的监听逻辑: function createWebHistory() { function bindEvents(fn) { window.addEventListener('popstate', fn); } function push(url) { history.pushState(null, '', url); // 修改浏览器地址但不刷新页面 } return { bindEvents, push, url: window.location.pathname || '/', // 获取当前路径 }; } 修改 Router 类 扩展 Router 类,支持 history 模式的路由变化处理: class Router { constructor(options) { this.history = options.history; this.routes = options.routes; this.current = ref(this.history.url); this.history.bindEvents(() => { this.current.value = window.location.pathname; }); } // 编程式导航(例如 router.push('/path')) push(url) { this.history.push(url); this.current.value = url; } install(app) { app.provide(ROUTER_KEY, this); app.component('router-link', RouterLink); app.component('router-view', RouterView); } } 修改 RouterLink 组件 支持 history 模式的 RouterLink 组件不需要 # 前缀,使用编程式导航: <template> <a @click.prevent="navigate">{{ $slots.default() }}</a> </template> <script setup> import { defineProps, inject } from 'vue'; const props = defineProps({ to: { type: String, required: true }, }); const router = inject('__router__'); function navigate() { router.push(props.to); } </script> 注册 Vue Router 在 src/router/index.js 中注册使用 createWebHistory 的路由实例: import { createRouter, createWebHistory } from './grouter/index'; const routes = [ { path: '/', component: Home }, { path: '/about', component: About }, ]; const router = createRouter({ history: createWebHistory(), routes, }); export default router; 配置 Web 服务 要支持 history 模式,需要配置服务器以处理所有的路径。以 Nginx 为例,配置如下: server { listen 80; server_name yourdomain.com; location / { root /path/to/your/app; index index.html; try_files $uri /index.html; } } hash V.S history模式 | 特点 | Hash 模式 | History 模式 | | -------------- | --------------------------- | ------------------------- | | URL 格式 | http://example.com/#/path | http://example.com/path | | 浏览器刷新处理 | 不需后端额外支持 | 需服务器配置支持 | | SEO | 不友好 | 更友好 | | 实现复杂度 | 简单 | 较复杂 |、 本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续! 作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。 各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。 负责: 中央/分销预订系统性能优化 活动&券等营销中台建设 交易平台及数据中台等架构和开发设计 车联网核心平台-物联网连接平台、大数据平台架构设计及优化 LLM Agent应用开发 区块链应用开发 大数据开发挖掘经验 推荐系统项目 目前主攻市级软件项目设计、构建服务全社会的应用系统。 参考: 编程严选网 本文由博客一文多发平台 OpenWrite 发布!

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

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部分的功能。

用户登录
用户注册