文江的个人博客,建立这个博客是为了学习和分享SEO知识、Web开发技术(Web前端开发和PHP网站开发),文章里肯定会有出错的地方请多多指点,有不对的地方请批评。
在实际的数据可视化项目中,图表的交互行为往往会直接影响用户体验。尤其是在后台系统、监控面板或只读型数据展示页面中, 图例的点击交互 有时并不是一个加分项,反而可能造成误解或数据状态混乱。 本文基于一次完整的前端实践过程,记录在 @antv/g2plot 2.4.33 版本中,如何精确控制并关闭图例的…
我们有个爬虫收录统计页面,用 G2 4.x 画两组折线图: 每天收录 ( dayChart ):X 轴为日期,Y 轴绘制三条线 - added (真正新增收录量)、 query (查询量)、 repeat (重复量) 每小时收录 ( hourChart ):X 轴为 0–23 小时,数据…
很多人觉得建表是抄底活,字段、类型随便定,反正以后能 ALTER。可真到了线上,加字段要锁表、改类型要重建、索引错了要慢查,这些都是要还的债。表结构是承接业务的第一层地基,它决定了一场查询是毫秒级还是分钟级,决定了一个功能能不能加、加得起加不起。所以,设计阶段的寸功,抵得上后面十个月的补救。 核心原…
画布编辑器的血泪教训: 把一张 8000×8000 的大图直接放进 canvas,内存瞬间爆掉 ,卡顿、白屏、甚至浏览器崩溃。图片压缩不只是一个"体积变小",而是"在显存 / 画布渲染质量 / 上传体积 / 交互体验"四者之间取平衡。这篇文章把我的妥协策略和落地方案写清楚。 一、压缩的触…
光有鉴权(token)还不够 - token 管 你是谁 ,但管不住 数据被中间人改 。尤其对外接口、转账/下单这类高风险操作,需要 签名 来保证: 请求在传输中没被篡改、且确实来自可信调用方。 这篇讲接口签名的原理、最常见也最容易漏的一个细节(参数排序)、以及怎么落地且不伤开发体验。 一、签名解决…
数据访问层封装是把线程业务里「拼 where 的裸 SQL」收敛到统一入口。本文基于参数驱动讲解如何用一个通用 DAO 同时处理等值、模糊、区间条件,加上统一的分页、排序白名单与参数化绑定,并给出 egg-mysql 环境下 queryPage 的封装示例,从根上避免拼接注入、一处维护多处长长的改写…
多个图层如何 合并成一整个组,以及把这个组 打散 回到独立图层,是编辑器的常见能力。难度不在 Group 本身,而在 拆组那一刻 :子对象的坐标、缩放、旋转、镜像,一旦组合时经过了整体变换,拆出来就得全部重新换算,否则视觉上会"瞬间跳变"。这篇文章把最难的"拆组坐标换算"一次讲透。 一、组合(Gro…
登录后带个 token、没 token 给 401 ,大部分人能写上。但 JWT 鉴权里真正的经验在于:token 怎么来、怎么校验、用户在请求里以什么形态存在、又有哪些接口要 放行但不校验 (白名单)、冻结账号怎么拦截。这篇把这些拧成一个完整可落地的 JWT 鉴权中间件,并详解白名单设计。 一、J…
把 Node 服务稳准跑在生产环境,涉及进程守护、优雅重启与热更新。本文讲解 pm2 做进程守护、用 SIGTERM 配合优雅退出实现不间断重启,以及 cluster 多进程共享端口做无缝升级,并演示 ecosystem.config.js 的关键配置和 nodemon 开发期热更新的正确用法。 问…
编辑器的素材库里往往有些"半业务半通用"的形状——比如带圆角的标注框、带箭头的指示物。Fabric 内置对象满足不了,就得自己 继承 fabric.Polygon 或 fabric.Text 重写 _render 。这篇文章用一个自定义箭头类演示完整流程,并讲解自定义对象在 …