# ytor-java **Repository Path**: yt220600/ytor-java ## Basic Information - **Project Name**: ytor-java - **Description**: ytor项目的Java后端部分 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-20 - **Last Updated**: 2025-12-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # rain-java 杨桐的通用开发脚手架——后端代码(Java版本) ## 1 项目基础架构 * 版本和依赖控制 Maven 3.9.6,层级如下 ```css your-project/ ├── pom.xml ├── src/ │ ├── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── yourcompany/ │ │ │ └── yourapp/ │ │ └── resources/ │ └── test/ │ ├── java/ │ │ └── com/ │ │ └── yourcompany/ │ │ └── yourapp/ │ └── resources/ ``` * JDK21 至少要使用JDK17及以上的版本 * Spring-Boot 3.4.4 截止2025-04-04,最新的SpringBoot稳定版本 在父POM中引入以下依赖,子工程就可以直接使用 ```xml org.springframework.boot spring-boot-dependencies 3.4.4 pom import ``` * MyBatis-Plus https://baomidou.com/introduce/ 数据库操作库,基于MyBatis ```xml com.baomidou mybatis-plus-spring-boot3-starter 3.5.11 ``` * 数据库驱动依赖(MySQL) ```xml com.mysql mysql-connector-j 8.3.0 ``` * 缓存库依赖 Redis ```xml org.springframework.boot spring-boot-starter-data-redis ``` caffeine,基于JVM内存的缓存库 ```xml com.github.ben-manes.caffeine caffeine 3.0.3 ``` * 工具库 Guava ```xml com.google.guava guava 33.4.6-jre ``` * 单元测试 junit ```xml junit junit test ``` * 接口文档 使用SpringDoc ```xml com.github.xiaoymin knife4j-openapi3-jakarta-spring-boot-starter 4.4.0 ``` * OFFICE操作库 POI,可能跟其他库比如easyexcel,poi-tl等产生版本冲突 ```xml org.apache.poi poi 5.2.5 org.apache.poi poi-ooxml 5.2.5 org.apache.commons commons-compress org.apache.commons commons-compress 1.26.0 org.apache.poi poi-ooxml-schemas 4.1.2 ``` 为了方便版本控制,以上所有依赖版本最好在父POM中的`properties`标签里面统一管理 父POM中的其他内容如下: ```xml org.apache.maven.plugins maven-compiler-plugin 3.13.0 ${java.version} ${java.version} ${java.version} ${project.build.sourceEncoding} true true -parameters org.apache.maven.plugins maven-resources-plugin 3.3.1 ${project.build.sourceEncoding} xlsx xls doc docx jpg png org.apache.maven.plugins maven-surefire-plugin 3.2.5 true src/main/java **/*.xml false src/main/resources **/*.* true dev true dev test test prod prod ``` ## 2 代码整体结构 项目整体结构 ```css parent-project/ ├── common/ #基础模块,包含工具栏,基础依赖等不含有web配置的代码,该模块在任何环境下都可单独使用 ├── core/ #核心模块,包含SpringBoot项目的配置,只能在SpringBoot环境下使用 ├── system/ #业务模块,使用者可以将自己的业务代码写在该模块 ``` 以下是几个子模块的介绍: * common基础模块结构 ```css common/ ├── anno/ #通用注解 ├── cache/ #缓存组件 ├── convert/ #类型转换器组件 ├── enums/ #通用枚举 ├── exception/ #异常相关 ├── holder/ #上下文相关 ├── lock/ #锁相关 ├── model/ #通用类 ├── tree/ #树形操作组件 ├── util/ #工具类 ``` * core核心模块结构 ```css core/ ├── auth/ #权限校验 ├── listenner/ #监听器 ├── model/ #通用模型 ├── swagger/ #接口文档 ├── util/ #web环境下的工具类 ``` * system业务模块结构 ## 3 权限系统设计 ### 3.1 数据库设计 本系统使用RABC模式来进行权限控制 下面所有表都默认含有基础字段 1. 用户表 用户字段 | 字段 | 注释 | | :---------: | :----------: | | user_name | 用户名 | | real_name | 真实姓名 | | password | 密码 | | avatar | 头像 | | phone | 手机号码 | | email | 邮箱 | | status | 状态 | | birthday | 生日 | | id_card | 身份证 | | depart_code | 用户当前部门 | 2. 角色表 角色字段,分为普通角色和部门角色 | 字段 | 注释 | | :---------: | :--------------------: | | role_name | 角色名称 | | role_code | 角色编码 | | status | 角色状态 | | depart_code | 所属部门,无部门则为空 | 3. 部门表 部门字段 depart_code不能乱填,必须以父部门的depart_code开头 比如父部门的depart_code是A01,那么子部门的depart_code就是A0102 | 字段 | 注释 | | :---------------: | :----------------: | | depart_name | 部门名称 | | depart_code | 部门编码 | | pid | 上级部门id | | contact_user_name | 部门联系人username | | address | 部门地址 | | status | 状态 | 4. 资源表 资源字段 | 字段 | 注释 | | :-------: | :------------------------------: | | pid | 父资源id | | name | 资源名称 | | code | 资源唯一编码 | | type | 资源类型,0-菜单、1-按钮、2-接口 | | path | 地址(菜单路由地址或者接口地址) | | component | 前端组件地址(type为菜单时生效) | | icon | 图标 | | status | 状态 | 5. 用户-角色表 保存用户和角色的映射关系 | 字段 | 注释 | | :-----: | :----: | | user_id | 用户id | | role_id | 角色id | 6. 用户-部门表 保存用户和部门的映射关系 | 字段 | 注释 | | :-------: | :----: | | user_id | 用户id | | depart_id | 部门id | 7. 角色-资源表 | 字段 | 注释 | | :-----------: | :----: | | role_id | 角色id | | permission_id | 资源id | ### 3.2 权限控制 菜单权限和按钮权限 权限数据都放在资源表里,通过**角色-资源表**与某个角色关联,然后**用户-角色表**与某个用户关联 ### 3.3 查询参数规则 根据前端传过来的参数,自动封装对应的QueryWrapper 规则:(参数名,必须)_(操作符,非必须)(=/!=,必须)(规则值,必须) | 查询类型 | 表示方法 | 示例 | 含义 | 扩展 | | :--------: | :-------------: | :----------------------: | :------------------------------: | :----------------------------: | | 等值 | xxx=val | age=12 | 查询age=12的数据 | - | | 不等 | xxx!=val | age!=12 | 查询age != 12的数据 | 字段后面有个"!"的,表示取反 | | 大于等于 | xxx_ge=val | createTime_ge=2021-12-12 | 查询createTime>=2021-12-12的数据 | 还有小于等于le、小于lt、大于gt | | 区间 | xxx_between=a,b | age_between=11,22 | 查询age between 11 and 22的数据 | - | | 在什么范围 | xxxx_in=a,b,c | age_in=1,2,3 | 查询age in (1,2,3)的数据 | - | | 或者 | xxxx_or=a,b,c | age_or=1,2,3 | age=1 or age=2 or age=3 | - | | 模糊查询 | xxx=\*val\* | name=\*张* | 查询name like '%张%'的数据 | 左模糊\*yyy、右模糊yyy\* | | 为空 | xxx=isNull | name=isNull | 查询name is null的数据 | 类似的,还有xxx=isNotNull | 上面表格列出的规则还可以相互左右 比如 * 查询包含 age_or=\*1\*,\*2\*,\*3\*,就等同于:age like '%1%' or age like '%2%' or age like '%3%' * 取反 age_in!=1,2,3,就等同于:!age in (1,2,3) ### 3.4 数据权限 控制哪些人可以看到哪些数据 例如: * 一个数据只有创建人可以看 * 一个数据只有创建人所在部门下的人可以看 * 一个数据只有指定部门的人能看 * 一个数据只有指定人可以看 * …… 上面的就是数据规则,可以给不同角色配置不同的数据规则,那么切换不同角色时,适用的数据规则也不一样 给一个角色配置了数据规则,那么怎么应用呢? 在接口里获取当前人的角色,然后根据角色去查询数据权限,并组装成SQL片段,然后将SQL片段应用到查询SQL 我们可以通过**3.3查询参数规则**来获取这个SQL片段 ## 4 数据权限设计 ## 5 前后端交互设计 前后端数据交互时,无非就是两大类型的数据 1. 前端发给后端的数据 * 二进制数据 * 普通数据 2. 后端发给前端的数据 * 二进制数据 * 普通数据 * 分页数据 抛开二进制数据,其他数据都可以用统一的类型接受 xxx:实体类,这两大类型的数据都是围绕着实体类展开的 xxxReq:请求数据的类型,前后端都要都有对应的发送/接收类 xxxResp:响应数据的类型,前后端都要都有对应的发送/接收类 * 特别的,如果响应是属于分页类型,则应该使用xxxResp的子类xxxPageResp来发送/接收 ## 6 未来的计划 - [ ] 用户管理 - [ ] 角色管理 - [ ] 资源管理 - [ ] 资源权限 - [ ] 数据权限 - [ ] 数据字典 - [ ] 定时任务 - [ ] 系统监控 - [ ] 数据库管理 - [ ] 日志管理 - [ ] 系统缓存 - [ ] 系统文件 - [ ] 接口文档 - [ ] 链式ORM - [ ] 自定义XML语法解析 - [x] 代码生成器 - [ ] 邮件模块 - [ ] 短信模块 - [ ] AI模块