Skip to content

VJSP-Boot-Form快速开发框架

项目简介

VJSP-Boot-Form是一个基于Spring Boot的后端服务项目,提供表单处理、工作流管理、系统管理等功能。该项目采用现代化的Java技术栈,支持多种数据库,并提供了完善的安全机制和日志记录功能。

内置模块

  1. 用户管理:管理系统操作人员,完成用户账号的创建、权限分配和信息维护。

  2. 部门管理:配置公司、部门的多级组织架构,以树形结构直观展示,并支持按数据权限进行隔离。

  3. 菜单管理:配置系统导航菜单、操作功能权限及按钮级权限标识,实现精细化访问控制。

  4. 角色管理:为不同角色分配菜单和操作权限,支持按组织架构划分数据权限范围。

  5. 字典管理:维护系统中常用且相对固定的分类、标签等基础数据,提升数据一致性和可维护性。

  6. 系统日志:记录和查询系统的正常操作日志与异常信息日志,便于审计与故障排查。

开发说明

运行环境

工具版本
Java1.8、17
Maven3.6.3 +
Redis5 +
PostgreSQL12.16
IDEIDEA、Eclipse 、Visual Studio Code

工程结构

vjsp-boot-form
├── src
│   ├── main
│   │   ├── java
│   │   │   └── net
│   │   │       └── vjsp
│   │   │           ├── VjspApplication.java        # 应用启动入口类
│   │   │           ├── common                      # 通用工具和组件
│   │   │           ├── framework                   # 框架核心组件
│   │   │           ├── log                         # 日志相关功能
│   │   │           ├── modules                     # 业务模块
│   │   │           ├── starter                     # 附件上传下载配置模块
│   │   │           ├── system                      # 系统管理模块
│   │   │           └── workflowprocess             # 工作流处理模块
│   │   └── resources
│   │       ├── application.yml                     # 应用主配置文件
│   │       ├── application-dev.yml                 # 开发环境配置
│   │       ├── template                            # 页面模板文件
│   │       ├── mapper                              # MyBatis映射文件
│   │       ├── static                              # 静态资源
│   │       │   └── vjsphtml                        # 前端页面
│   │       └── vjsp-mapping                        # VJSP映射配置
│   └── test
│       └── java                                    # 测试代码
└── pom.xml                                         # Maven项目配置文件
└── sql                                         # 数据库脚本

结构规范

一级包名路径说明
common通用文件包,全局变量,异常类,枚举类,静态工具类等和业务无关的全局文件
framework系统文件包,权限框架,配置文件,拦截器,依赖注入工具类
system系统模块,用户,角色,菜单,日志,登录等
modules业务模块,除系统自带模块外其他功能模块
workflowprocess工作流模块
resources配置文件

Maven规范

使用springboot主版本提供依赖的jar包,不需要写版本号,非springboot主版本提供依赖得jar包, 版本号声明提取到属性文件中

当前系统中使用到得非springboot主版本提供依赖得jar包如下:

<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
        <file.encoding>UTF-8</file.encoding>
        <java.version>8</java.version>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <skipTests>true</skipTests>
        <druid.version>1.1.10</druid.version>
        <hutool.version>5.8.41</hutool.version>
        <jjwt.version>0.11.5</jjwt.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
        <mybatis-plus.version>3.5.6</mybatis-plus.version>
        <fileupload.version>1.5</fileupload.version>
        <poi.version>3.9</poi.version>
        <zip4j.version>1.3.2</zip4j.version>
        <beanutils.version>1.9.4</beanutils.version>
        <collections4.version>4.4</collections4.version>
        <bcprov.version>1.73</bcprov.version>
        <mail.version>1.6.2</mail.version>
        <xmlbeans.version>3.1.0</xmlbeans.version> 
        <jexl3.version>3.0</jexl3.version> 
        <vjsp-form.version>3.0-RELEASE</vjsp-form.version>
        <fastdfs.version>1.27.2</fastdfs.version>
		    <s3.version>1.11.792</s3.version>
        <mapstruct.version>1.5.1.Final</mapstruct.version>
    </properties>

JAR包清单

名称版本用途
javax.servlet-api未显式指定,由容器提供Servlet API(provided)
spring-boot2.7.18框架主版本
spring-boot-starter-web同主框架版本Web容器
spring-boot-starter-test同主框架版本测试
spring-boot-configuration-processor同主框架版本元数据补全
spring-boot-starter-aop同主框架版本拦截器
spring-boot-devtools同主框架版本热编译工具
spring-boot-starter-security同主框架版本安全认证
spring-boot-starter-data-redis同主框架版本数据缓存
spring-boot-starter-validation同主框架版本校验框架
lombok由 Spring Boot 管理,默认兼容开发工具库
mybatis-plus-boot-starter3.5.6持久层框架
mybatis-plus-generator3.5.6持久层代码生成
postgresql由 Spring Boot 管理数据库驱动(PostgreSQL)
bcprov-jdk15to181.73加密库
jjwt0.11.5JWT支持
mapstruct1.5.1.Final代码生成工具
mapstruct-processor1.5.1.Final代码生成工具(注解处理器)
poi3.9Excel 工具(含 poi-ooxml、poi-scratchpad)
commons-beanutils1.9.4常用工具类
commons-collections44.4常用工具类
poi-ooxml4.1.2excel工具
commons-io2.19.0常用工具类
commons-lang33.12.0常用工具类
fastdfs-client1.27.2文件存储
aws-java-sdk-s31.11.792文件存储

命名规范

所有对象类名使用大驼峰命名法(PascalCase),不允许使用下划线、小驼峰、缩写等非标准命名。

对象使用场景命名规范
Entity工作流实体对象以Entity为后缀
Controller控制器组件,接收和处理HTTP请求,将请求分发给相应的业务逻辑以Controller为后缀
Service业务逻辑接口以Service为后缀
ServiceImpl业务逻辑实现类,调用 Mapper 并处理事务以ServiceImpl为后缀
Mapper持久层,定义数据库操作方法以Mapper为后缀
Config系统配置类对象以Config为后缀
Filter过滤器对象以Filter为后缀
Aspect逻辑切面实现对象以Aspect为后缀
Properties属性配置文件以Properties为后缀
Convert负责 PO ↔ DTO ↔ VO 之间的转换 (MapStruct实现)以Convert为后缀
Constants常量对象以Constants为后缀
View用于服务间调用、复杂逻辑封装或跨层数据传输以View为后缀

请求头格式

身份验证使用JWT实现,已查询用户为例,传递格式:

POST http://127.0.0.1/system/users/listAll
Content-Type: application/json
Authorization: Bearer_<jwt_token>

{
  "loginName": "zhangsan"
}

代码规范

控制层

  1. 映射规则 全局,每个方法
  2. 审计日志
  3. 表单校验
  4. 返回对象格式
  5. 权限控制
  6. 文档注解
  7. 方法定义
  8. 异常处理
  9. 访问限流
  10. 错误码

业务层

  1. 继承关系
  2. IService方法清单
  3. 全局通用service添加
  4. 业务service添加
  5. 事务控制
  6. 分页
  7. 异常处理
  8. 缓存注解

持久层

  1. 继承关系
  2. BaseMapper方法清单
  3. 全局通用Mapper添加
  4. 业务Mapper添加
  5. Mappper中使用自定义SQL
  6. 在XML中使用自定义SQL
  7. 幂等新增和保存

权限规范

  1. 三种使用场景
    1. 登录并需要授权
    2. 登录不需要授权
    3. 不需要登录(链接:白名单的使用说明)
  2. 注解格式
  3. 资源标识的维护和表对应关系
  4. 权限拦截方法的注入
  5. 权限拦截的函数

开发规范

  1. 隶属于用户个人的页面或者功能必须进行权限控制校验
  2. 用户敏感数据禁止直接展示,必须对展示数据进行脱敏
  3. 用户请求传入的任何参数必须做有效性验证和长度校验
  4. 配置文件中的密码需要加密
  5. 上传文件定义大小限制和头部特征码检测

数据库规范

建表规范

  1. 表名、字段名必须使用小写字母或数字,禁止出现数字开头。

  2. 表名不允许使用复数名词。

  3. 业务表必须包含默认字段。

    字段名称数据类型是否必填默认值描述
    idvarchar(40)主键
    create_user_idint8创建人ID
    create_timetimestamp(6)now()创建时间
    update_user_idint8修改人ID
    update_timetimestamp(6)修改时间
    is_deleteint20删除标志(0正常 1删除)
  4. 在数据库中不能使用物理删除操作,要使用逻辑删除。

  5. 业务唯一字段必须创建索引。

系统配置类

XSS过滤器配置(XSSFilterConfig.java)

  1. 注册 XSS 过滤器

    ## 防止XSS攻击
    xss:
       # 过滤开关
       enabled: true
       # 排除链接(多个用逗号分隔)
       excludes: /wechat/callback
       # 匹配链接
       urlPatterns: /*

跨域配置(GlobalCorsConfig.java)

  1. 使用场景
  2. 配置指定域名的跨域

MyBatis配置(MyBatisConfig.java)

  1. 设置扫描路径
  2. 插件注册

Redis配置(RedisConfig.java)

  1. 设置RedisTemplate序列化方式

    使用String序列化key,使用JSON序列化value。具体使用方式见。。。Redis工具类

安全配置(SecurityConfig.java)

配置安全过滤器链 设置URL访问权限、跨域、CSRF、会话管理等安全策略

依赖注入工具类

Redis操作类

  1. 使用场景
  2. 方法清单+代码示例

密码工具类

  1. 注入位置,有哪些加密方式
  2. 方法清单+代码示例

静态方法工具类

Base64工具(Base64.java)

跨平台命令执行工具(CmdUtil.java)

日期工具(DateUtils.java)

邮件工具(EmailUtils.java)

Excel工具(ExcelUtil.java)

网络工具(HttpKeyUtil.java)

Http请求工具(HttpUtil.java)

IP工具(IpUtils.java)

JWT工具(JwtTokenUtil.java)

日志缓存(LogsPool.java)

MD5工具(MD5Util.java)

RSA工具(RsaUtils.java)

Servlet工具(ServletUtils.java)

Spring工具(SpringUtil.java)

SSL工具(SSLClient.java)

字符串工具(StringUtils.java)

3Des加解密工具(TripleDes.java)

文件工具(VjspFiles.java)

ZIP工具(Zips.java)

运行

初始化数据库脚本、修改配置文件

  1. 新建数据库
  2. 导入 sql/postgresql/vjsp_form.sql 文件:如使用其他数据库,请在相应数据库文件夹中找到初始化脚本,例如 sql/mysql/vjsp_form.sql
  3. 修改 application-dev.yml 文件中的数据库连接信息
  4. 修改 application-dev.yml 文件中的Redis连接信息
  5. 流程配置修改

打开 src\main\resources\application-dev.yml

yml
vjsp:
  run:
    # 流程请求接口密钥,对应 ts_flow_partner 表的 partnerpass 字段
    partnerpass: TaXxYGBj1idmf4oCVUOK75QqWsZD2cEy  
    # 流程接口url
    vjspFlowUrl: http://127.0.0.1:9090/
    # vjsp-mapping 文件夹路径
    resourcesBaseConfig: 
  # 是否开启日志
  audit-log:
    # true 开启 false 关闭
    enabled: true
    # logger 使用日志框架输出
    # db 存储到数据库中
    log-type: db
  # rsa 密码加密
  # 使用 RsaUtils.java 的main方法生成新key

密码等敏感信息加密配置

配置文件中,敏感信息可使用加密方式配置

密钥生成方式 :SM4Utils.java 的 generateHexKey() 方法生成密钥,配置到 application-dev.yml 中。 敏感信息加密方式: SM4Utils.java 的 encrypt("要加密字符串", "密钥") 方法加密。

properties

# ENC加密配置
jasypt:
  encryptor:
    # SM4密钥(32位十六进制字符串)
    sm4-key: 2fe4a2696b85208e81d30a71c44fb482
    # 加密类
    bean: jasyptStringEncryptor
    
使用 ENC(xxxx) 格式配置密码,例如:

# 数据库密码
db.password=ENC(xxxxx)

只有用ENC(xxxx)格式配置的密码,才会被解密。

启动应用

项目的主启动类是 net.vjsp.VjspApplication,使用标准的Spring Boot启动方式:

java
@ServletComponentScan
@SpringBootApplication
public class VjspApplication {
    public static void main(String[] args) {
        SpringApplication.run(VjspApplication.class, args);
    }
}

启动应用工作流

应用路径

expansion-pack/vjsp_workflow

配置文件

expansion-pack\vjsp_workflow\config\application.yml

properties
# 数据库地址,与应用平台数据库相同
db.url=jdbc:postgresql://xxx.xxx.xxx.xxx:5432/vjsp_form
# 数据库驱动
db.driverClassName=org.postgresql.Driver
# 数据库用户名
db.username=postgres
# 数据库密码
db.password=

启动

执行 run.bat 或者 run.sh 启动应用

sh
# cmd
run.bat 

# vscode 、idea 、 powershell 
.\run.bat

打开浏览器,输入:http://localhost:8070/index.html

默认账户/密码: admin / 888

VS Code 配置

乱码问题

文件 - 首选项 - 设置 勾选 : Auto Guess Encoding

部署

打包说明

pom.xml 中配置了jar打包插件,可以排除不需要打包到jar里的文件或目录。例如:

xml
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-jar-plugin</artifactId>
  <configuration>
      <excludes>
         <!-- 示例:排除特定的配置文件 -->
         <exclude>**/application.yml</exclude>
         <exclude>**/application-dev.yml</exclude>
         <!-- 示例:排除整个目录 -->
         <exclude>**/static/**</exclude>
         <exclude>**/vjsp-mapping/**</exclude>
      </excludes>
 </configuration>
</plugin>

独立jar部署方式

  • 将 application-dev.yml 中的数据库连接信息、Redis连接信息、流程配置等修改为正式环境信息。
  • 删除掉pom.xml中的以下部分,使用mvn install打包,jar包里会包含配置文件,静态资源文件,窗体逻辑文件
xml
<!-- 示例:排除特定的配置文件 -->
<exclude>**/application.yml</exclude>
<exclude>**/application-dev.yml</exclude>
<!-- 示例:排除整个目录 -->
<exclude>**/static/**</exclude>
<exclude>**/vjsp-mapping/**</exclude>

打包后的jar包可以直接运行,例如:

java -jar vjsp-boot-form-1.0.2.jar

静态页面独立部署 + 后端jar包

删除 application-dev.yml 中的 ,不让jar包加载静态文件

yml
  web:
    resources:
      # 前端页面,资源文件 路径
      static-locations: classpath:static/vjsphtml/,file:./static/vjsphtml/,
  • 将 application-dev.yml 中的数据库连接信息、Redis连接信息、流程配置等修改为正式环境信息。
  • 删除掉pom.xml中的以下部分,使用mvn install打包,jar包里会包含配置文件,窗体逻辑文件
xml
<!-- 示例:排除特定的配置文件 -->
<exclude>**/application.yml</exclude>
<exclude>**/application-dev.yml</exclude>
<!-- 示例:排除整个目录 -->
<exclude>**/vjsp-mapping/**</exclude>

仅保留
<exclude>**/static/**</exclude>

使用 nginx 代理静态页面 和 jar包的 访问地址

修改 页面请求的接口地址

修改 static/vjsphtml/_vjsp_setting/setting.js 中的接口地址

js

var _vjsp_inter_domain = getRootPath() + (_vjsp_is_path != 0 ? getContextPath() : '');

修改成 

var _vjsp_inter_domain = '你自己的地址';

打包后的jar包可以直接运行,例如:

java -jar vjsp-boot-form-1.0.2.jar

配置文件、静态资源、窗体逻辑文件、jar 包分开部署

保留 pom.xml 中的 jar打包插件的配置,mvn install 打包后,jar包里不会包含 静态文件、窗体逻辑文件以及配置文件

部署目录结构如下:

yml

├── config
│   ├── application-dev.yml
│   └── application.yml
├── static
│   └── vjsphtml
├── vjsp-boot-form-1.0.2.jar
└── vjsp-mapping

注意事项

  • 如果static/vjsphtml 由 nginx 代理,则 需要删除 application-dev.yml 中的静态资源路径 , 以及 setting.js 中的接口地址

  • 如果 vjsp-mapping 与 jar包不是同级目录,需要修改 application-dev.yml 中的 窗体逻辑文件路径

yml
    # vjsp-mapping 文件夹路径
    # 修改为vjsp-mapping全路径(不包含 vjsp-mapping 本身)
    resourcesBaseConfig: /opt/app/