ThreadLocal
只有利害关系和出众的才干,才能帮你出起主意来,才认真细到,眼光透彻。——巴尔扎克 我们在web开发中经常遇到在一个线程中需要共享变量 这里就可以使用ThreadLocal去完成 例如我们用户发起请求,我们在过滤器等将用户信息存储在ThreadLocal中,这样在代码中获取用户信息就相对容易 写法如下: 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748import cn.hutool.core.lang.Opt;/** * 用户工具类 * * @author <achao1441470436@gmail.com> * @since 2021/8/25 12:10 */public class UserUtils { private static final ThreadLocal<UserDetail> USER_THREAD = new ThreadLocal<>(); /** ...
@SafeVarargs
不管怎样的事情,都请安静地愉快吧!这是人生。我们要依样地接受人生,勇敢地大胆地,而且永远地微笑着——卢森堡 前两天给mybatis-plus贡献了代码 https://gitee.com/baomidou/mybatis-plus/pulls/192 这里用到了一个注解SafeVarargs 我们在使用动态参数+泛型的时候,会提示来自形参化 vararg 类型的可能的堆污染 例如: 我们这里加上@SafeVarargs后发现它只能加在final或者static修饰的方法上: 不加的话会编译错误 再放几个例子吧: 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849package com.ruben.simplescaffold;import org.junit.jupiter.api.Test;import java.util.Arrays;import java.util.List;import java.util.Optional;/** ...
逻辑删除与联合索引冲突处理
早知今日读书是,悔作从前任侠非。——李欣 今天发现联合唯一索引和逻辑删除冲突了,导致我这边已删除的数据还具有唯一索引的约束 本来一开始是考虑要不要在删除前手动将数据清空一下,但这样感觉并不优雅 然后今天跟朋友探讨了下,决定使用datetime作为逻辑删除字段的类型,如果未删除,则字段为魔法值的固定时间,已删除,则设为删除时的时间 使用Mybatis-plus能够优雅实现: 将逻辑删除字段如下配置即可 12345/** * 逻辑删除 已删除为删除时间,未删除为null */@TableLogic(delval = "NOW()", value = "'2001-01-01 00:00:00'")private LocalDateTime delFlag; 如果不是用注解,也可以配置全局,全局配置的方法我之前写过一篇博客,只要把对应的删除值修改一下即可 然后对应的数据库联合唯一索引,将其关联上 最后效果也是很棒: 可以看到查询自动带上了设置的日期 而我们进行删除时也成功设为NOW() 这里对应的代码实现com.ba...
lombok建造者模式支持父类
精力充沛的青春,是不怎么容易灭亡的。——卡罗萨 使用@SuperBuilder注解代替原本的@Builder就可以了 如果对建造者模式不太了解的,可以看我以往写的博客: https://VampireAchao.github.io/2020/11/08/%E5%BB%BA%E9%80%A0%E8%80%85%E6%A8%A1%E5%BC%8F/ 这里做个对比,加之前: 加之后: 可以看到子类开始的建造者模式成功访问到父类属性,不过最终获取到的还是父类 如果想要最终获取到的还是子类,可以在父类也使用@SuperBuilder 不过父类的父类也要有@SuperBuilder
jq根据屏幕高度设置元素高度
没有哪一个聪明人会否定痛苦与忧愁的锻炼价值——赫胥黎 很简单一行代码: 1$('#ruben').css('height', $(window).height()); 这里$(window).height()获取了屏幕高度 然后用css函数去设置style
状态模式
顽强的毅力可以征服世界上任何一座高峰。——狄更斯 我们在实现审核业务的时候,可能在没使用状态模式的时候,使用if else或者switch case进行操作 ruben说:我不能针对不同的状态写多个后端接口吗? achao说:那你前端还是要使用if else去根据不同的状态调用不同的接口啊 我这里模拟一个简单的审核,真实项目中的业务将比这复杂 我们在用户提交审核后,状态应该是待审核 在待审核时执行操作,如果用户提交的内容为空,则将状态更改为审核未通过 在待审核时执行操作,如果用户提交的内容不为空,则将状态更改为审核已通过 在审核未通过时,如果用户再次执行操作,提示重新提交审核 在审核已通过时,如果用户再次执行操作,提示审核已通过 这里我们采用状态模式实现: 首先定义一个状态接口: 12345678910111213141516171819202122232425262728293031package com.ruben.state.example;import java.util.Map;/** * 审核状态公共接口 * * @author <achao14414704...
策略模式
只有永远躺在泥坑里的人,才不会再掉进坑里。——黑格尔 今天聊聊策略模式 一个导航程序,提供多种出行方式的导航策略 例如最开始就两种策略如步行和公路出行,我们将它写到一个类中 慢慢的,新增了公共交通,步行和公路出行中的逻辑越来越多,越来越复杂 如果此时不进行抽取,则会导致一个类中的代码行数过多,维护起来困难,如果是团队开发,代码冲突不断 抽取后能解决此问题,并且一些公共逻辑抽取出来能减少重复代码 因此我们将所有策略抽取出一个公共接口: 123456789101112131415161718192021package com.ruben.strategies.exapmle;import java.util.List;/** * 路线规划策略接口 * * @author <achao1441470436@gmail.com> * @since 2021/10/16 19:10 */public interface RouteStrategy { /** * 路线规划 * * @param start 起点 * @para...
layui镜像
偌大的城市,绵延无尽,并非是我眼见的让我停住了脚步,而是我所看不见的。——《海上钢琴师》 layui官网下架了,暂时这两天用非官方镜像代替吧 https://layui.itze.cn/
mybatis-plus代码生成器(二)
没有斗争就没有功绩,没有功绩就没有奖赏,而没有行动就没有生活——别林斯基 之前写过一篇,不过当时是快照版直接跑在源码环境里,今天我们使用最新的api,并且使用GAV引入 12345<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.1</version></dependency> 代码: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192package com.ruben;import com.baomidou...
uniapp拖动排序实现思路
没有哪一个聪明人会否定痛苦与忧愁的锻炼价值。——赫胥黎 找到下载量最多这个组件 https://ext.dcloud.net.cn/plugin?id=1372 导入,不多说 文档示例: 使用示例页面: 123456789101112131415161718复制代码<template> <view class="content"> <HM-dragSorts :list="list" :isLongTouch="true" :rowHeight="55" @change="change" @confirm="confirm" @onclick="onclick"> <template slot="rowContent" slot-scope="{ row }"> ...
