新闻详情

新闻详情

首页 / 资讯中心 / 详情

ECharts实战指南:从柱状图到地图,搞定数据可视化大屏适配

发布时间:2026/10/1 15:33:44来源:尧图网络
ECharts实战指南:从柱状图到地图,搞定数据可视化大屏适配
1. 先用一张图看懂ECharts能干什么ECharts 这个库前端和数据可视化方向的人基本都绕不开。它出自百度团队后来捐给了 Apache 基金会现在叫 Apache ECharts是完全开源免费的。你要是做过数据大屏、后台管理系统里的统计报表、运营看板大概率已经在用了。就算你只是刚接触前端想在网页里画个柱状图、折线图、饼图它也是上手最快、文档最全的选择之一。我最早接触 ECharts 是好几年前做后台项目那时候领导丢过来一个需求“把订单数据用图表展示出来”。我当时第一反应是自己用 Canvas 画后来发现光是处理坐标轴刻度、Tooltip 交互、图例筛选就能写几百行代码而且浏览器兼容性还容易出问题。换用 ECharts 之后一个setOption就能搞定 90% 的图表需求剩下的时间都花在样式微调和性能优化上。这个库最大的价值就是让你不用重复造轮子把精力放在“分析数据”和“讲好数据故事”上而不是纠结怎么画一条平滑曲线。从技术角度看ECharts 支持 Canvas 和 SVG 两种渲染方式内置了几十种图表类型包括折线图、柱状图、饼图、散点图、地图、雷达图、仪表盘、树图、桑基图等等。它的配置项非常细几乎每个视觉元素都能控制再加上官方提供的丰富示例和社区贡献的模板基本覆盖了日常开发中你能想到的所有可视化场景。这篇博文我从实际使用角度出发把柱状图、折线图、饼图、地图、Tooltip 细节、Ajax 数据对接、大屏适配这些高频场景完整走一遍最后分享一些排查问题的经验。2. 从柱状图入手把 ECharts 的核心配置项吃透很多人学 ECharts 的第一步就是从柱状图开始的因为柱状图结构最简单却几乎覆盖了所有通用配置项xAxis、yAxis、series、legend、tooltip。把这些搞明白后面学折线图、饼图、地图都是触类旁通。2.1 五个必会的核心配置项先看一份最基础的柱状图配置我习惯从上到下按“图表整体 → 提示框 → 图例 → 坐标轴 → 数据系列”的顺序写这样结构清晰排查问题也好定位const chart echarts.init(document.getElementById(main)); const option { title: { text: 各品类月度销量, left: center, textStyle: { fontSize: 16 } }, tooltip: { trigger: axis, axisPointer: { type: shadow } }, legend: { data: [销售额, 订单量], bottom: 0 }, grid: { left: 3%, right: 4%, bottom: 10%, containLabel: true }, xAxis: { type: category, data: [手机, 电脑, 家电, 服饰, 食品] }, yAxis: { type: value, name: 单位万元 }, series: [ { name: 销售额, type: bar, data: [120, 200, 150, 80, 170], itemStyle: { color: #5470c6, borderRadius: [4, 4, 0, 0] } }, { name: 订单量, type: bar, data: [85, 140, 120, 60, 95], itemStyle: { color: #91cc75, borderRadius: [4, 4, 0, 0] } } ] }; chart.setOption(option);这段配置里几个关键点值得细说title是图表标题建议用left、top做位置控制别用像素值这样在不同宽度容器下不容易错位。tooltip.trigger有两个值axis适合柱状图、折线图这类有坐标轴的图表鼠标滑过时整根轴线对应的数据都显示item适合饼图、散点图只显示当前悬浮的数据项。grid控制绘图区域containLabel: true这个属性最容易忽略它的作用是把坐标轴刻度文字算进grid区域里否则刻度文字长了很容易被截断。xAxis.type是category表示类目轴数据源是离散的yAxis.type是value表示数值轴ECharts 会自动计算最大值和刻度间隔。series是核心数据系列一个series对象就是一组数据type 决定图表类型数据通过data传入。2.2 折线图 X 轴刻度密密麻麻怎么办说完柱状图折线图最常被问的就是 X 轴刻度问题。数据一多类目轴上的文字会全部挤在一起看着像一团乱码。解决办法分两种情况第一种刻度全部要显示但需要错开或倾斜。用axisLabel.interval配合rotatexAxis: { type: category, data: timeList, axisLabel: { interval: 0, // 强制显示所有刻度 rotate: 45 // 文字旋转45度避免重叠 } }第二种只显示部分刻度。比如你有 30 天的数据X 轴标签每 5 天显示一次设置interval: 4索引从0开始每隔4个类目显示一个。如果不确定间距写成interval: auto让 ECharts 自己算这是默认行为但有时它算出来的结果间距太大所以我会先观察效果再手动调。还有一个容易被忽略的点axisLabel.hideOverlap这个属性只对类目轴生效当文字重叠时自动隐藏一部分适合折线图、面积图这种类目特别多的场景。实测下来它可以替代一部分手动设置interval的工作但会随机隐藏标签如果你有指定的刻度必须展示还是手动指定interval更可靠。2.3 数据更新时别忘了一件事setOption 的第二个参数柱状图和折线图在动态数据场景下最常见的坑是图表不更新或者残留旧数据。原因是setOption默认是合并模式新的配置和数据会和旧的做 merge如果数据结构变了某些老数据就残留下来了。正确的做法是显式指定chart.setOption(option, true);第二个参数传true表示完全替换模式把旧的组件和数据全部清掉再按新配置渲染。动态请求接口后更新图表我都是无脑传true避免各种数据残留的诡异问题。代价是会重新计算布局性能稍差一点但对大多数业务场景来说可以忽略。3. Tooltip 与标签那些高频但容易搞砸的细节Tooltip 是用户和数据图表交互的第一触点。很多人觉得 Tooltip 不就是鼠标悬浮显示数据嘛其实真做起来自动换行、自定义内容、位置避让、饼图标签偏移每一个都能让你排查半天。3.1 Tooltip 自动换行不只是加个 \nECharts 的 Tooltip 默认不支持自动换行内容长了会一直延伸超出屏幕边界的情况很常见。网上一搜“echarts tooltip自动换行”结果大多是让你在formatter里手动拼\n比如tooltip: { formatter: function (params) { return 品类${params.name}br销量${params.value} 件; } }这招应对固定格式没问题但遇到动态内容比如接口返回一段很长的描述文字手动拼\n就不现实了。我建议直接设置extraCssText让 Tooltip 容器支持自动换行tooltip: { trigger: axis, extraCssText: white-space:pre-wrap;word-break:break-all;max-width:300px; }extraCssText是 ECharts 提供的一个透传样式的入口直接作用在 Tooltip 的 DOM 节点上。加上white-space:pre-wrap后formatter里的\n会正常换行同时内容超出max-width时会自动折行不会再出现“把整个屏幕撑爆”的情形。我在实际项目中踩过另一个坑formatter返回的 HTML 字符串里中文和数字混排时经常在标点符号处断开很难看。解决方法是给数字加一个不换行的 spanformatter: function (params) { return params.name : span stylewhite-space:nowrap params.value /span; }这样数字部分不会被拆到两行中文部分可以正常换行视觉上舒服很多。3.2 饼图 labelLine 末尾的小圆点偏移怎么修饼图是另一个高频场景尤其是 label 加 labelLine引导线的样式做数据大屏时几乎必用。有小圆点的样式大致是这样扇区外拉一条细线线末端一个带边框的圆点圆点旁跟着文字。如果你在社区搜“echarts 饼图 labelline 末尾小圆点偏移”说明已经遇到实际渲染问题了。这个问题的核心是小圆点不一定是用 ECharts 原生配置实现的而很可能是用label.rich配合 formatter 拼出来的偏移大多出在富文本样式和内边距计算上。我看一个比较稳的实现方式先定义 rich 样式label: { show: true, formatter: function (params) { return {dot|} {name| params.name }\n{val| params.value }; }, rich: { dot: { backgroundColor: #fff, borderRadius: 3, width: 6, height: 6, align: center, verticalAlign: middle }, name: { color: #333, fontSize: 12, lineHeight: 16, padding: [0, 0, 0, 4] }, val: { color: #999, fontSize: 12, lineHeight: 16, padding: [0, 0, 0, 4] } } }这里用rich定义了一个 6x6 的圆点然后通过padding控制文字和圆点的间距。偏移问题的根源多半是 rich 中不同文本块的lineHeight不一致导致圆点和文字不在同一水平线上。经验是把圆点和第一行文字放在同一个 label 行里且lineHeight保持一致如果圆点上下偏移调整富文本里的verticalAlign而不是改padding。另一个常见情况是用labelLine的length和length2来控制引导线长度labelLine: { show: true, length: 12, length2: 8, smooth: 0.2 }length是扇区边缘到折线拐角的距离length2是拐角到文字的距离。小圆点如果贴文字太近或太远优先调length2。如果折现弯曲得太僵硬调大smooth值让它圆润一些。3.3 饼图改造从标配到高颜值基础饼图配置很简单type: pie、data传进来就完事。但实际做展示时我一般会加三个“提升质感”的配置第一radius和center控制大小和位置。做环形图就把radius: [40%, 70%]中间空出来的区域可以放总数值这种形式在移动端和 PC 端都耐看。第二itemStyle.borderColor和borderWidth。给每个扇区加一圈和背景色一致的边框视觉上能把相邻扇区切分开干净利落。第三emphasis配置控制鼠标悬浮时扇区被放大的效果emphasis: { scale: true, scaleSize: 6, itemStyle: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: rgba(0, 0, 0, 0.3) } }这样悬浮时扇区会轻微外扩加阴影后有浮起效果比默认的高亮看起来更专业。4. 地图场景把 ECharts 中国地图真正跑起来echarts 中国地图是搜索量很高的需求但也是新手最容易卡住的地方。ECharts 从 4.9 之后官方包里就不再内置地图数据了需要自己额外加载 GeoJSON 并注册。也就是说你光引入 echarts.js直接配type: map和map: china是会报错的。4.1 地图数据从哪来怎么注册中国地图的 GeoJSON 数据常用的免费来源是 DataV.GeoAtlas地址是https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json它提供了全国和各省市的 GeoJSON。拿到数据后用echarts.registerMap注册fetch(https://geo.datav.aliyun.com/areas_v3/bound/100000_full.json) .then(res res.json()) .then(geoJson { echarts.registerMap(china, geoJson); initMapChart(); }) .catch(err { console.error(地图数据加载失败, err); }); function initMapChart() { const chart echarts.init(document.getElementById(map)); chart.setOption({ tooltip: { trigger: item, formatter: function (params) { return params.name br/ (params.value ?? 暂无数据); } }, visualMap: { min: 0, max: 1000, left: left, top: bottom, text: [高, 低], inRange: { color: [#e0f3f8, #74add1, #4575b4] } }, series: [ { type: map, map: china, roam: true, itemStyle: { areaColor: #eee, borderColor: #fff }, data: provinceData // 格式: [{ name: 广东, value: 100 }, ...] } ] }); }几个注意点echarts.registerMap的注册名称要和你series.map里的值一致不然控制台直接报 “Map china not exists”。visualMap是地图上右下角的颜色刻度尺min、max要根据你自己的数据范围设置否则地图颜色会失真低值和高值的差异不明显。roam: true允许用户拖拽、缩放地图做数据大屏时我通常会关掉避免用户误操作把地图拖出可视区。4.2 地图下钻和省市区切换地图进阶玩法是省市区下钻也就是点击某个省份展示该省的市级地图。这个关键是 GeoJSON 的联动替换。点击省份时通过省份的 adcode 请求对应城市的边界数据重新registerMap再setOptionchart.on(click, function (params) { const adcode getAdcodeByName(params.name); // 根据省名映射到 adcode fetch(https://geo.datav.aliyun.com/areas_v3/bound/${adcode}_full.json) .then(res res.json()) .then(geoJson { echarts.registerMap(province, geoJson); chart.setOption({ series: [{ type: map, map: province, data: cityData }] }); }); });这里有两个现实问题一是省名和 adcode 需要你提前维护一份映射表二是如果点击返回时要能回到全国视图。我的笨办法是在页面加一个“返回全国”按钮点击时重新加载全国 GeoJSON。做多了你会发现地图功能的复杂度不在 ECharts 本身而在 GeoJSON 数据的获取、切换和状态管理上。4.3 地图上的散点、飞线和涟漪效果做中国地图十有八九还要叠加散点和涟漪效果。比如展示城市门店分布用的是effectScatter涟漪散点图series: [ { type: map, map: china, data: [] }, { type: effectScatter, coordinateSystem: geo, data: pointData, // 格式: [{ name: 北京, value: [116.46, 39.92, 100] }] symbolSize: 8, rippleEffect: { brushType: stroke, scale: 4 }, itemStyle: { color: #ff6600 } } ]symbolSize可以是一个函数根据数据值的大小动态控制圆点尺寸symbolSize: function (val) { return Math.max(4, Math.min(20, val[2] / 10)); }这里注意坐标轴数据的格式是[经度, 纬度, 数值]不要传反。我见过有人把纬度和经度写反了结果城市跑到海里去了排查了半天最后发现是数据顺序问题这种低级错误几乎每个人都犯过。5. 前端项目实战原生 JS、jQuery、Ajax 和 ECharts 怎么组合很多培训课程和练习项目会把“原生 JS jQuery Ajax ECharts”放在一起做成一个网页数据可视化的练习。这个组合看起来技术栈有点旧但它非常锻炼基本功原生 JS 操作 DOM、jQuery 的 Ajax 封装、ECharts 的图表渲染全部揉在一个页面里。我在带新人时也喜欢让他先做一遍这个练习能把数据请求、异步渲染、生命周期管理这些基础打牢。5.1 传统方式的完整思路请求数据再渲染图表核心思路是页面加载完成后用 Ajax 请求后端接口拿到数据后在回调里使用 ECharts 渲染图表。以 jQuery 的$.ajax为例$(function () { const chart echarts.init(document.getElementById(chart)); // 先显示加载动画 chart.showLoading({ text: 数据加载中..., color: #409eff, maskColor: rgba(255, 255, 255, 0.8) }); $.ajax({ url: /api/sales/data, type: GET, dataType: json, timeout: 10000, success: function (res) { if (res.code 200) { chart.hideLoading(); const option buildOption(res.data); chart.setOption(option, true); } else { chart.hideLoading(); alert(接口异常 res.msg); } }, error: function (xhr, status, error) { chart.hideLoading(); console.error(请求失败, status, error); } }); function buildOption(data) { return { tooltip: { trigger: axis }, legend: { data: data.legend }, grid: { left: 3%, right: 4%, bottom: 3%, containLabel: true }, xAxis: { type: category, data: data.categories }, yAxis: { type: value }, series: data.series.map(item ({ name: item.name, type: line, smooth: true, data: item.values })) }; } });几个容易踩的坑chart.showLoading()和chart.hideLoading()要成对出现否则请求失败时图表会一直转圈。success里一定要先判断业务状态码比如res.code 200不要直接拿res.data去渲染否则后端返回错误时前端直接就报错了。timeout建议设一个接口慢的时候至少能让用户知道是超时了而不是一直转圈。这套流程虽然传统但思路清晰先 loading再请求按状态码分支处理最后 setOption。日常开发中 80% 的图表页面都是这个模式只是把 jQuery 换成了 fetch 或 axios 而已。5.2 用 fetch 替代 jQuery 的 Ajax代码更现代如果你不想为了一个请求引入整个 jQuery完全可以用浏览器原生fetch。同样是请求接口fetch 写法更简洁而且返回的是 Promise配合async/await用起来很顺手async function loadDataAndRender() { const chart echarts.init(document.getElementById(chart)); chart.showLoading(); try { const response await fetch(/api/sales/data); const result await response.json(); if (result.code ! 200) { throw new Error(result.msg); } chart.hideLoading(); chart.setOption(buildOption(result.data), true); } catch (err) { chart.hideLoading(); console.error(数据加载失败, err); } }这里有一个很多人忽略的细节fetch只有在网络层错误时才会 reject比如断网、超时如果接口返回了 HTTP 500fetch照样会 resolve所以必须自己判断response.okif (!response.ok) { throw new Error(HTTP ${response.status}); }严格来说fetch也没有默认超时设置需要借助AbortController实现比 jQuery 的timeout参数麻烦一些。这也是为什么很多项目仍然保留 axios 的原因——请求库的便利性不是 fetch 能完全替代的。5.3 聊天式前端和后端联调时的三个习惯如果你经常做前后端联调我建议养成三个习惯第一后端接口的数据结构尽量前端提需求或者至少前端要和后端对齐字段。最好在接口文档里明确定义返回格式比如{ code, msg, data }这种统一包裹结构前端处理起来会省很多事。第二后端返回的数据如果为空前端要兜底。比如data.categories是nullECharts 会直接报错或者渲染成空白页。我的做法是渲染前先做个判空if (!data || !Array.isArray(data.categories) || data.categories.length 0) { chart.clear(); // 显示空数据提示 return; }第三接口频繁刷新时定义一个renderChart函数统一处理 setOption避免散落到处都是的chart.setOption调用。6. 大屏适配与 px 转 rem 的那些坑数据可视化大屏是近年来的高频词很多人拿 ECharts 做 LED 大屏、监控大屏。大屏开发最头疼的就是适配不同分辨率、不同缩放比例图表要么挤成一团要么散得不成样子。而 px 转 rem 这套方案在普通页面上很管用到了 ECharts 这里却经常失灵社区里搜“pxtorem 对 echarts 没起到效果”,几乎一搜一个准。6.1 为什么 ECharts 不理会 px 转 rem在 Vue 项目里很多人用postcss-pxtorem配合amfe-flexible做移动端适配原理是把 CSS 里的 px 自动转换成 rem。问题在于ECharts 里配置的fontSize、symbolSize、width、height这些数值并不是写在 CSS 里的而是写在 JavaScript 配置对象里的。浏览器解析 JS 时不可能帮你自动把 12px 转成 0.12rem所以你对 ECharts 内部的字体大小、圆点大小做 rem 适配压根不起作用。这是什么概念呢打个比方CSS 里的 px 是“装修图纸”浏览器渲染时会按比例缩放而 ECharts 配置里的 px 是“直接钉在墙上的钉子”钉死了就是钉死了不会跟着 rem 变。所以想让图表跟随屏幕缩放必须自己在 JS 里动态计算把根字体大小算进去。6.2 大屏适配推荐方案动态换算 resize 监听我做大屏碰到这种问题最常用的方案是通过document.documentElement.clientWidth计算缩放比例然后传给 ECharts 配置在setOption时完成换算。例如设计稿宽度是 1920当前屏幕宽度是 1280缩放比例就是 1280 / 1920 ≈ 0.667。写一个工具函数function getScale() { return document.documentElement.clientWidth / 1920; } function createChartOption(scale 1) { return { title: { text: 销量趋势, textStyle: { fontSize: 16 * scale } }, xAxis: { axisLabel: { fontSize: 12 * scale } }, series: [ { type: bar, barWidth: 20 * scale } ] }; }还可以用ResizeObserver监听容器尺寸变化动态重绘图表const container document.getElementById(main); const observer new ResizeObserver(() { chart.resize(); const scale getScale(); chart.setOption(createChartOption(scale)); }); observer.observe(container);chart.resize()是 ECharts 内置方法会重新计算绘图区域尺寸并重绘比手动刷新页面优雅得多。ResizeObserver比监听window.resize更精确因为它的粒度是具体元素不会因为页面里其他区域尺寸变化导致不必要的重绘。6.3 性能优化数据量大时别让大屏卡成 PPT做数据大屏还有一个绕不开的问题是性能。我见过一个大屏里塞了 6 个 ECharts 图表全部是实时数据每 3 秒刷新一次结果浏览器直接卡死。排查后发现问题出在每次刷新都用setOption全量重绘而且开了很多动画效果。针对这种情况经验做法有三条第一开启animation: false或者只在数据首次加载时开动画。实时刷新时每次都播放动画GPU 渲染压力很大而且用户根本看不清动画过程。第二大屏数据量大时用sampling: lttb对折线图数据降采样。比如后端返回 2 万个点前端没必要把 2 万个点全画出来降采样后保留趋势特征视觉上几乎无差别渲染性能却能提升大半。第三多个图表共用一个setInterval或者用 WebSocket 推送不要每个图表单独开定时器。多个定时器叠加会让主线程负载过高页面交互就卡了。setInterval(() { fetchData().then(data { chart1.setOption({ series: [{ data: data.series1 }] }); chart2.setOption({ series: [{ data: data.series2 }] }); }); }, 5000);这里每次setOption都只更新series里的data其他配置不动能大大减少计算量。官方还提供chart.replaceData方法不过要注意兼容性项目里用setOption局部更新也完全够用。6.4 多图表实例的管理与销毁最后补一个容易忽略的点页面销毁时图表实例要手动销毁否则会内存泄漏。尤其是在 Vue、React 单页应用里频繁切换路由图表实例会一直占着内存。Vue2 里一般在beforeDestroy生命周期里beforeDestroy() { if (this.chart) { this.chart.dispose(); this.chart null; } }Vue3 的onUnmounted同理。如果你在一个容器里反复初始化记得先执行if (chartInstance) { chartInstance.dispose(); } const chartInstance echarts.init(container);否则控制台会报 “There is a chart instance already initialized on the dom” 的警告。这个问题在后台管理系统的标签页切换场景里尤其常见一定要养成 dispose 的习惯。做 ECharts 这几年我最大的感觉是这库的配置项太丰富翻文档不如跑 demo跑 demo 不如遇到几个真实的业务需求。你被逼着去解决 Tooltip 换行、地图下钻、大屏适配这些问题之后再回头看官方文档会突然觉得那些 API 不是死记硬背的而是真的理解了。最后再分享一个小技巧多逛 ECharts 社区和官方示例库遇到问题先搜示例而不是硬看配置项手册很多时候你想要的样式官方示例里早就有人做出来了。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Titanium Browser 隐私安全设置终极指南:WebRTC 防泄露、无痕模式与扩展隔离全解析 2026/10/1 16:13:57

Titanium Browser 隐私安全设置终极指南:WebRTC 防泄露、无痕模式与扩展隔离全解析

Titanium Browser 隐私安全设置终极指南:WebRTC 防泄露、无痕模式与扩展隔离全解析 【免费下载链接】android-titanium-browser Secure open-source Android browser with support for extensions 项目地址: https://gitcode.com/gh_mirrors/an/android-titanium-…

阅读更多 →
苏州跨境电商GEO优化服务商专业实力与用户口碑深度解析 2026/10/1 16:13:57

苏州跨境电商GEO优化服务商专业实力与用户口碑深度解析

苏州的跨境电商企业最近在采购决策前,越来越多地先打开AI对话框提问。能不能被AI主动推荐,直接决定企业能否进入海外买家的候选名单。围绕这个新入口,以下三个高频问题值得每一位跨境卖家认真了解。Q1:跨境电商企业做GEO优化&…

阅读更多 →
我的第一个网页 2026/10/1 16:13:56

我的第一个网页

学习路线:HTML4 ➡ CSS2 ➡ HTML5 ➡ CSS3 * 第7集 HTML是什么 全称 HyperText Markup Language 译 为 (超文本标记语言)语言:每一个标记的写法,读音,使用规则,构成标记语言 W3C:万维网联盟…

阅读更多 →
苏州B2B GEO优化服务商合作实力参考 2026/10/1 16:13:56

苏州B2B GEO优化服务商合作实力参考

苏州B2B企业做GEO优化,到底该怎么选服务商?Q1:什么是GEO优化?为什么苏州B2B企业现在就要重视?GEO是Generative Engine Optimization的缩写,中文全称是生成式引擎优化。简单说,就是让企业的品牌信息能够被豆包、DeepSeek、元宝、…

阅读更多 →
汽车零部件GEO优化外包服务商综合实力推荐,省心优选 2026/10/1 16:13:56

汽车零部件GEO优化外包服务商综合实力推荐,省心优选

汽车零部件企业,为什么需要重视AI搜索里的存在感当采购商的第一问从搜索引擎搬进AI对话框,汽车零部件企业的获客逻辑已经被改写。过去,一位主机厂采购或维修连锁的供应链负责人寻找供应商,习惯在搜索框输入关键词,翻看…

阅读更多 →
Ever Gauzy MCP Server 桌面应用指南:在 Electron 中托管与监控 Model Context Protocol 服务 2026/10/1 16:13:42

Ever Gauzy MCP Server 桌面应用指南:在 Electron 中托管与监控 Model Context Protocol 服务

后端前端企业应用MCP 服务 【免费下载链接】ever-gauzy Ever Gauzy™ - Open Business Management Platform (ERP/CRM/HRM/ATS/PM) - https://gauzy.co 项目地址: https://gitcode.com/GitHub_Trending/ev/ever-gauzy 点击查看 免费下载 本指南围绕 Ever Gauzy 仓库…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉