[开发笔记]避免数据库死锁之全局一致锁顺序

在电商平台开发中,往往涉及多种类型的订单结算以及并发结算的问题,例如这样的场景:

  • 平台涉及国内官方订单、国内商户订单以及海外官方订单等多种订单
  • 在各种订单完成时,又根据不同的订单类型,涉及冻结金额扣减、利润账户分润、经纪人分润、商户分润、预付回款、卡主回款等流程,期间将会涉及使用数据库事务,对多个账户钱包记录的行锁后变更
  • 但由于项目早期开发的不规范,并没有固定加锁的顺序,并且又将入账出账的流程设计为串行,并没有设计为出账同步入账异步的功能,因此整体处理流程又较依赖于行锁
  • 不同的完成订单流程中用户钱包的加锁顺序不一致,这里可能是冻结金额扣减->经纪人分润->利润账户分润,而另一处是冻结金额扣减、利润账户分润->经纪人分润;同时,经纪人也可以作为买家,在完成自己的某类订单时先进行冻结金额扣减

以上的几种条件组合,也就为后续业务的死锁埋下了种子。

继续阅读[开发笔记]避免数据库死锁之全局一致锁顺序

[前端-CSS]CSS的unset关键字

unset关键字的作用

在CSS中,unset关键字用于将属性重置为其继承值初始值

  • 是继承属性,并且在父元素中有定义,那么使用unset会使该属性继承父元素的值。类似于inherit关键字。
  • 不是继承属性,unset则会将其重置为初始值。类似于initial关键字。

继续阅读[前端-CSS]CSS的unset关键字

2D坐标转换2.5D坐标公式

以下是2D坐标转换为2.5D坐标的JavaScript实现方式:

const angleDeg = 15 // 倾角(以度为单位)
const angleRad = (angleDeg * Math.PI) / 180 // 将角度转换为弧度
const x = parseInt(left * Math.cos(-angleRad) - top * Math.sin(-angleRad))
const y = parseInt(top * Math.cos(-angleRad) + left * Math.sin(-angleRad))

不使用函数式组件改造Ant Design Vue递归子菜单

Vue.js 组件提供了一个 functional 开关,设置为 true 后,就可以让组件变为无状态、无实例的函数化组件。因为只是函数,所以渲染的开销相对来说较小。

在对使用Ant Design Vue项目的左侧菜单国际化改造时,由于翻译函数$t是挂载在Vue实例上的,而子菜单是通过函数化组件(functional template)递归生成,因此需要将子菜单改成非函数化组件实现。

继续阅读不使用函数式组件改造Ant Design Vue递归子菜单

几种常见的前端反调试方法及突破方式

file
:hushed:前年有段时间沉迷于某H5的大逃杀小游戏(闲的),起初也是中规中矩,后来因为存档丢失,遂开启了修改存档的不归路。
最近的版本也更新的新的游戏模式和枪械,原本的小破枪再也不能称霸战局了,想再次修改存档时,发现网页也做了诸多反调试限制,通过一番折腾成功突破,那就以此为例总结下几种前端反调试方法及突破方式。

继续阅读几种常见的前端反调试方法及突破方式

[开个新坑/完善中][Vue3+TS]硅谷甄选运营平台项目学习笔记

简单介绍

想着Vue2在今年年底也要停止维护了,是时候跟进学学Vue3更新下技术栈了。以笔记方式整理一下学习过程中的要点,顺便巩固一下基础知识。

一些我已经看过的内容链接:

余下的笔记内容主要整理自B站视频:尚硅谷Vue项目实战硅谷甄选,vue3项目+TypeScript前端项目一套通关B站大学好:joy:)

继续阅读[开个新坑/完善中][Vue3+TS]硅谷甄选运营平台项目学习笔记