个人介绍
个人技术博客 https://zhangrui654321.github.io/
有过通信,能源,生物行业商业级企业内部管理项目4年经验,高可用系统调优经验
熟练掌握Spring Cloud,Springboot ,Mybatis等主流开发框架,以及maven构建工具
熟练掌握主流数据库,如MySQL,Oracle等,有过sql性能调优经验,以及redis的使用经验
熟悉基本Linux命令,能独立部署前后端分离系统
熟悉java语法,多线程,集合基本框架
工作经历
2022-07-01 -至今北京华云安java后端
工作流,审批流,绩效考核的开发 负责菜单权限管理,用户管理,角色管理 java 后端开发 负责 redis 相关需求开发
2017-10-01 -2022-06-01广州朴成科技有限公司java后端开发
1,根据设计文档进行功能模块的后端开发。 2,本地单元测试,接口文档编写 3,测试Linux服务器的搭建,包括gitlab,jenkins,oracle,docker的部署 部门:数字化建设部
教育经历
2013-09-01 - 2017-07-01西藏民族大学经济统计学本科
技能
通信施工流程管理系统,控制从项目立项,审批,招标,过程管理,验收,合同,付款,等全进度控制管理系统。项目采用Activity审批流,配合springboot+mybatis+docker开发,使用了线程池来并发业务。 本人负责 审批流模块,过程管理,合同模块的后端开发 一,技术亮点 ● 1.采用自定义注解@Log,结合spring的aop,打印日志,线上收集bug信息 ● 2.使用Enum枚举封装了返回的result,自定义了统一返回格式,保证了前后端的低耦合 ● 3.使用spring的拦截器实现权限的拦截,根据url过滤需要拦截的页面,当session中user为空时,则跳转至登录页 ● 4.使用了线程池ThreadPool+Callable来优化查询速度,重写了callable中call方法,使用future.get方法返回查询的结果 ● 5.使用注解@Transcational来控制事务,保证了数据一致性
为配合营销分公司发展,开发的一款统计每月兽药和动保库存情况的进销存项目。 后台通过Springboot+Mybatis+redis+MySQL+帆软报表搭建 一,责任描述 负责库存报表,入库报表,毛利分析表,销售出库分析表等报表实现 负责采购订单,合同,入库,折扣模块的Java后端开发 负责部分前端js的编写 负责部署到Linux测试机 二,技术亮点 1.实现了订单过期自动取消功能,通过自定义OrderUnPaidTask实现Delayed,Runnable接口,设置过期事件后自动调用delayQueue.take()方法,take方法会执行OrderUnPaidTask中重写的run方法,run方法到期自动执行。如果订单是已付款,则return,如果不是,设置订单为已取消状态,商品货品库存数量增加。 2,实现订单数量的实时显示,通过自定义的OrderNumberInterceptor实现HandlerInterceptor拦截器,每次请求会获取根据用户id获取用户的订单数量。 3.通过自定义@RepeatSubmit,实现防止重复提交采购订单。具体由AOP实现,在需要防止重复提交的方法加上注解,获取切点的method名和参数,并保存到session,设置过期时间,当在过期时间内再次访问,并且和上一次方法名和参数一致时,抛出异常。 4.实现了通过枚举封装返回的结果。 5.通过redis重构了数据读写,具体为读的时候先看redis中有无数据,有数据则直接读取,无数据则查询mysql数据,然后保存到redis中,对于写,先更新mysql数据库,再删除redis数据。 6.使用存储过程对实时库存查询进行了优化 7.使用spring-mail实现了邮件推送 8.后端采用nginx部署多节点springboot项目,实现了负载均衡 三,遇到的问题以及如何解决 1.使用nginx部署时,负载均衡 session问题 将多个节点springboot项目中session都保存到同一个redis中,保证一致性 2,入库业务mysql数据库请求超时 优化sql,调整最大连接数。 3.后端入库接口请求超时 优化代码,将双层for循环改为一层,使用EnumMap代替map。
同步客户的考勤打卡机数据,服务于客户KPI考核,薪资管理,财务考核,人力权限管理系统.后端采用springcloud+Mybatis+shiro+docker搭建,实现了按钮级的权限控制,和数据权限的实现。 一,责任描述 工作流,审批流,绩效考核的开发 负责菜单权限管理,用户管理,角色管理java后端开发 负责redis相关需求开发 二,技术亮点: 1.通过配置ShiroFilterFactoryBean和自定义实现 ShiroRealm,实现认证和授权两大模块,用redis保存授权信息。 2.实现了登录接口和验证码的限流操作。(60秒内10次点击).通过自定义@Limit注解,和AOP框架,获取方法的key值 ,通过redis+lua脚本实现限流,调用的时候不超过阈值,则直接返回并执行计算器自加。 3.通过AOP实现了controller层的操作日志输出,如果无异常则保存至数据库,有异常则抛出。 4.Spring Boot 中的异步实现了权限刷新,日志保存等任务,提高后台吞吐量。通过@bean实例化线程池,通过@Async实现异步调用。 5.通过mybatis中Interceptor实现数据权限过滤,核心设计为重写intercept方法,获取执行sql的类型,如果是select并且需要过滤,则获取当前用户的部门id,再在where后面根据dept_id过滤。 6.通过shrio配置 rememberMe cookie ,重开浏览器后无需重新登录。通过shiroDialect配置Thymeleaf 中的 shiro 标签,实现页面按钮显示或隐藏,通过shrio的SimpleHash方法实现密码加盐加密。 三,遇到的问题以及如何解决 1.redis和mysql中数据不一致的问题 后经排查是在redis写数据过程中 先删除redis中数据,再更新mysql。应该先更新mysql,再删除redis中的key。 2.float精度丢失问题,后项目float全部改为BigDecimal。 3.重启docker容器后图片丢失问题,后续通过docker -v挂在到宿主机地址解决 mybatis中使用了事务注解失效问题,无法识别新增mapper的问题,后通过配置解决。