一、背景简介

最近2年,很多公司接项目开始不挑剔了,只要核算下来有收益不会亏,就会库库的做各种没头没脑的项目,都是抱着多撑一天是一天的躺平心态。

如果项目和业务稳定,自然也有动力卷架构卷设计。

然而2024年对于很多研发团队的打工人来说,普遍都是处在随时卷铺盖走人的状态中,自然就是怎么省事怎么来,做项目时间和成本是最重视的维度。

抛开什么AI和各种工具加持,节省编程时间最有效的办法就是:拿现成的,最好只改个端口号。

二、工程结构

2024年上半年各种不大不小的项目写下来,其实从代码工程上看都是差不多的,服务端无非就是前和后两个代码工程,集成基础框架就可以增删改查了。

为了后续其它项目使用相同的基础工程,在第一个项目中,预留了代码工程的初期基础设计,方便那什么循环利用,在这篇文章简单分享一下。

基础的代码工程就这几块,实际上就是前后台两个单体服务,不涉及微服务和复杂架构,就是拿来应付各种奇怪的内部项目的快速开发;两个门面服务分别依赖framesharedthird三层代码包,然后运行启动类即可。

既然是单体服务,自然也不涉及数据库的拆分,能安稳运行就可以了。

<modules>
<!-- 门面管理 -->
<module>bm-facade</module>
<!-- 后台管理 -->
<module>bm-admin</module>
<!-- 业务共享层 -->
<module>bm-shared</module>
<!-- 框架管理 -->
<module>bm-frame</module>
<!-- 第三方接入 -->
<module>bm-third</module>
</modules>

三、模块化功能

3.1 框架模块

主要管理代码工程核心组件依赖,比如SpringBoot框架,MySQL数据库,MybatisPlus持久层,Swagger接口等,并且添加了一个公共过滤器。

@Slf4j
@Component
public class CommonFilter extends OncePerRequestFilter implements Ordered { @Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain chain)
throws ServletException, IOException { log.info("CommonFilter...doFilterInternal"); // 请求向下转发
chain.doFilter(request, response);
} @Override
public int getOrder() {
return 999 ;
}
}

对于一些必要的配置类和二次封装,也放在了这一层,另外为了简化工程的复杂性,使用AOP的方式包装了日志记录和令牌核验;

AOP切面编程就不说了,这个在项目中经常使用;Token令牌的封装方式可以自行扩展,权限校验拿数据的记录对比一下即可。

@Component
public class BaseToken { @Getter
@Setter
private Long userId; @Getter
@Setter
private String userName; @Getter
@Setter
private String appName; @Getter
@Setter
private Long expireTime; private static final byte[] AES_KEY = Arrays.copyOf(MD5.create().digest(BaseToken.class.getPackage().getName()), 16); @Getter
private final String currentType = BaseToken.class.getTypeName(); public void expireTime(int effective) {
expireTime = System.currentTimeMillis()/1000 + effective ;
} public boolean expired() {
return expireTime < (System.currentTimeMillis() / 1000);
} public String toToken() {
String data = JSONUtil.toJsonStr(this);
return SecureUtil.aes(AES_KEY).encryptBase64(data);
} public static BaseToken parseToken(String token) {
String dataStr = SecureUtil.aes(AES_KEY).decryptStr(token);
return JSONUtil.toBean(dataStr, BaseToken.class);
} public boolean checkPermission (String... permissionCode) {
AuthCheck authService = SpringUtil.getBean(AuthCheck.class);
return authService.hasPermission(this.getUserId(), permissionCode);
} }

使用AOP切面编程拦截要鉴权的方法即可。

@Component
@Aspect
@RequiredArgsConstructor
public class AuthAop { /**
* 切入点
*/
@Pointcut("@annotation(com.butte.mound.frame.security.Auth)")
public void logPointCut() { } @Around("logPointCut()")
public Object around (ProceedingJoinPoint point) throws Throwable {
try{
// 检查权限
checkAuth(point);
// 执行方法
Object result = point.proceed();
return result;
} catch (Exception e){
e.printStackTrace();
throw e ;
}
} private void checkAuth (ProceedingJoinPoint point){
try{
MethodSignature signature = (MethodSignature) point.getSignature();
Method method = signature.getMethod();
Auth auth = method.getAnnotation(Auth.class);
BaseToken token = TokenContext.getToken();
token.checkPermission(auth.authCode());
} catch (Exception e){
e.printStackTrace();
}
}
}

3.2 业务共享模块

主要管理业务代码,数据库相关的持久层文件,如果在服务层前后台业务差异过大的话,也可以考虑分2层管理即可,在体量小的项目中,持久层代码几乎差异不大,最多只是一些自定义查询。

3.3 前后台模块

前后台两个模块,主要就是API接入层,通常就是用户访问和系统管理的两个服务,在逻辑上并没有什么本质差异,为了方便不同角色的请求管理,在两个工程内各添加了一个拦截器。

@Slf4j
@Component
public class FacadeInterceptor implements HandlerInterceptor { @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.info("req uri : {}",request.getRequestURI()); String facadeToken = "令牌"; BaseToken token = BaseToken.parseToken(facadeToken);
TokenContext.setToken(token); return Boolean.TRUE ;
}
}

3.4 第三方模块

至于常见的第三方API对接,比如短信服务,OSS文件存储,第三方登录等,如果考虑多个项目多次复用的话,可以单独拎一层出来,简单封装一层工具类,方便之后随时替换,当然也可以在业务工程中直接调用第三方的封装类。

四、源码地址

文档仓库:
https://gitee.com/cicadasmile/butte-java-note 源码仓库:
https://gitee.com/cicadasmile/butte-mound

Java轻量级代码工程的更多相关文章

  1. 编写Java脚本统计工程代码总行数

    在新公司工作将近一年了,一直独自一人负责服务端集群的运维和代码的编写.不知不觉从一个Project发展到了七八个Project. 看着越来越多的代码,今天突然想统计一下一共写了多少代码.[这里只统计完 ...

  2. FastDFS搭建及java整合代码【转】

    FastDFS软件介绍 1.什么是FastDFS FastDFS是用C语言编写的一款开源的分布式文件系统.FastDFS为互联网量身定制,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高 ...

  3. java 轻量级同步volatile关键字简介与可见性有序性与synchronized区别 多线程中篇(十二)

    概念 JMM规范解决了线程安全的问题,主要三个方面:原子性.可见性.有序性,借助于synchronized关键字体现,可以有效地保障线程安全(前提是你正确运用) 之前说过,这三个特性并不一定需要全部同 ...

  4. java 从一个工程action 跳转到另外一个工程action

    实现功能:java 从一个工程action 跳转到另外一个工程action 在我们实际编程的过程中,大家一定遇到过这种情况,那就是在一个工程中,需要使用到另外一个工程的实体Bean和方法.那么遇到这种 ...

  5. Scala IDEA for Eclipse里用maven来创建scala和java项目代码环境(图文详解)

    这篇博客 是在Scala IDEA for Eclipse里手动创建scala代码编写环境. Scala IDE for Eclipse的下载.安装和WordCount的初步使用(本地模式和集群模式) ...

  6. pagebean pagetag java 后台代码实现分页 demo 前台标签分页 后台java分页

    java 后台代码实现分页 demo 实力 自己写的 标签分页 package com.cszoc.sockstore.util; import java.util.HashMap;import ja ...

  7. 经典KMP算法C++与Java实现代码

    前言: KMP算法是一种字符串匹配算法,由Knuth,Morris和Pratt同时发现(简称KMP算法).KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.比 ...

  8. 常用 Java 静态代码分析工具的分析与比较

    常用 Java 静态代码分析工具的分析与比较 简介: 本文首先介绍了静态代码分析的基 本概念及主要技术,随后分别介绍了现有 4 种主流 Java 静态代码分析工具 (Checkstyle,FindBu ...

  9. 分享:根据webservice WSDL地址自动生成java调用代码及JAR包

    分享:根据webservice WSDL地址自动生成java调用代码及JAR包使用步骤:一.安装java 并配置JAVA_HOME 及 path二.安装ANT 并配置ANT_HOME三.解压WsdlT ...

  10. [原创]Java静态代码检查工具介绍

    [原创]Java静态代码检查工具介绍 一  什么是静态代码检查? 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法.结构.过程.接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数 ...

随机推荐

  1. nginx之常见错误

    在此只介绍源码安装nginx的时候,发生的一些常见的错误 1. nginx访问出现File not found 1) php-fpm找不到SCRIPT_FILENAME中执行的PHP文件 更改配置文件 ...

  2. 配置 Forwarded Headers Middleware

    来自微软的说明:Configure ASP.NET Core to work with proxy servers and load balancers | Microsoft Learn. 通过该中 ...

  3. adduser和addgroup命令讲解

    https://wiki.alpinelinux.org/wiki/Setting_up_a_new_user 在Alpine Linux下创建用户和组命令分别是adduser和addgroup,本文 ...

  4. mac上遇到的错误sed command a expects followed by text

    上简单的替换操作 sed -i 's/apple/mac/g' full-path-file 执行后报错,"sed: 1: command a expects \ followed by t ...

  5. xcrun: error: unable to find utility "xctest", not a developer tool or in PATH

    Start Xcode, select "Preferences -> Locations". Chances are that your Command Line Tool ...

  6. JunitGenerator

    ######################################################################################## ## ## Avail ...

  7. git Already up-to-date解决办法,强制覆盖本地代码

    1.拉取最新云端代码强制覆盖本地代码 git fetch --all git reset --hard origin/master git pull 2.git将分支合并到主master,出现这个结果 ...

  8. Qt/C++音视频开发72-倍速推流/音视频同步倍速推流/不改变帧率和采样率/低倍速和高倍速

    一.前言 最近多了个新需求,需要倍速推流,推流界的扛把子obs也有倍速推流功能,最高支持到两倍速.这里所说的倍速,当然只限定在文件,只有文件才可能有倍速功能,因为也只有文件才能倍速解码播放.实时视频流 ...

  9. 【Windows】修改虚拟内存位置

    问题:系统优化中,希望将pagefile.sys文件(即虚拟内存)移动到其他盘中,在网上查找解决办法,找了很多,按照方法设置完成后,pagefile.sys文件依然存在,后来,找到了一篇文章解决了,现 ...

  10. WPF使用Microsoft.Toolkit.Mvvm作为Mvvm框架DryIoc作依赖注入

    背景 MVVMLight已多年未更新,Microsoft.Toolkit.Mvvm作为MVVMLight继任者,需要学习一下. Microsoft.Toolkit.Mvvm跟MVVMLight使用非常 ...