Showing preview only (1,648K chars total). Download the full file or copy to clipboard to get everything.
Repository: lmq2582609/minimalist-saas
Branch: master
Commit: 742e613f4a75
Files: 322
Total size: 1.4 MB
Directory structure:
gitextract_koj_vsiu/
├── .gitignore
├── LICENSE
├── README.md
├── minimalist-application/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── minimalist/
│ │ └── application/
│ │ ├── MinimalistBasicApplication.java
│ │ └── config/
│ │ ├── GlobalExceptionHandler.java
│ │ └── satoken/
│ │ ├── SaTokenConfigure.java
│ │ └── SaTokenInterfaceImpl.java
│ └── resources/
│ ├── application-dev.yml
│ ├── application.yml
│ └── logback-dev.xml
├── minimalist-basic/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── minimalist/
│ │ │ └── basic/
│ │ │ ├── config/
│ │ │ │ ├── async/
│ │ │ │ │ ├── AsyncConfig.java
│ │ │ │ │ └── ThreadPoolConfig.java
│ │ │ │ ├── convert/
│ │ │ │ │ ├── FileSizeDeserializer.java
│ │ │ │ │ ├── FileSizeSerializer.java
│ │ │ │ │ └── LongArrJsonSerializer.java
│ │ │ │ ├── dataConfig/
│ │ │ │ │ └── SystemConfigInit.java
│ │ │ │ ├── eDict/
│ │ │ │ │ ├── BeanMethod.java
│ │ │ │ │ ├── EDict.java
│ │ │ │ │ ├── EDictConstant.java
│ │ │ │ │ └── EDictInit.java
│ │ │ │ ├── exception/
│ │ │ │ │ └── BusinessException.java
│ │ │ │ ├── fileHandler/
│ │ │ │ │ ├── FileManager.java
│ │ │ │ │ ├── FileResourcesInit.java
│ │ │ │ │ ├── entity/
│ │ │ │ │ │ ├── LocalFileEntity.java
│ │ │ │ │ │ ├── MinIOFileEntity.java
│ │ │ │ │ │ └── QiNiuFileEntity.java
│ │ │ │ │ └── handler/
│ │ │ │ │ ├── FileHandler.java
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── LocalFileHandler.java
│ │ │ │ │ ├── MinIOFileHandler.java
│ │ │ │ │ └── QiNiuFileHandler.java
│ │ │ │ ├── mybatis/
│ │ │ │ │ ├── GeneratorCodeHandler.java
│ │ │ │ │ ├── InsertFullColumnHandler.java
│ │ │ │ │ ├── MyBatisFlexConfiguration.java
│ │ │ │ │ ├── UpdateFullColumnHandler.java
│ │ │ │ │ └── bo/
│ │ │ │ │ ├── BaseEntity.java
│ │ │ │ │ ├── PageReq.java
│ │ │ │ │ └── PageResp.java
│ │ │ │ ├── redis/
│ │ │ │ │ ├── RedisManager.java
│ │ │ │ │ └── RedissonConfiguration.java
│ │ │ │ ├── resubmit/
│ │ │ │ │ ├── ReSubmit.java
│ │ │ │ │ └── ReSubmitAspect.java
│ │ │ │ ├── swagger/
│ │ │ │ │ ├── ParameterHandler.java
│ │ │ │ │ ├── PropertyHandler.java
│ │ │ │ │ ├── SchemaEnum.java
│ │ │ │ │ ├── SchemaEnumHandler.java
│ │ │ │ │ └── SwaggerConfig.java
│ │ │ │ ├── tenant/
│ │ │ │ │ ├── TenantDatasourceInterceptor.java
│ │ │ │ │ ├── TenantIgnore.java
│ │ │ │ │ ├── TenantIgnoreAspect.java
│ │ │ │ │ ├── TenantInit.java
│ │ │ │ │ └── TenantWebMvcConfig.java
│ │ │ │ └── trace/
│ │ │ │ ├── TraceIdInterceptor.java
│ │ │ │ └── WebMvcConfig.java
│ │ │ ├── controller/
│ │ │ │ ├── ConfigController.java
│ │ │ │ ├── DeptController.java
│ │ │ │ ├── DictController.java
│ │ │ │ ├── FileController.java
│ │ │ │ ├── NoticeController.java
│ │ │ │ ├── PermController.java
│ │ │ │ ├── PostController.java
│ │ │ │ ├── RoleController.java
│ │ │ │ ├── StorageController.java
│ │ │ │ ├── TenantController.java
│ │ │ │ ├── TenantPackageController.java
│ │ │ │ └── UserController.java
│ │ │ ├── entity/
│ │ │ │ ├── enums/
│ │ │ │ │ ├── ConfigEnum.java
│ │ │ │ │ ├── DeptEnum.java
│ │ │ │ │ ├── DictEnum.java
│ │ │ │ │ ├── FileEnum.java
│ │ │ │ │ ├── NoticeEnum.java
│ │ │ │ │ ├── PermEnum.java
│ │ │ │ │ ├── PostEnum.java
│ │ │ │ │ ├── RespEnum.java
│ │ │ │ │ ├── RoleEnum.java
│ │ │ │ │ ├── StatusEnum.java
│ │ │ │ │ ├── StorageEnum.java
│ │ │ │ │ ├── TenantEnum.java
│ │ │ │ │ └── UserEnum.java
│ │ │ │ ├── po/
│ │ │ │ │ ├── MConfig.java
│ │ │ │ │ ├── MDept.java
│ │ │ │ │ ├── MDict.java
│ │ │ │ │ ├── MFile.java
│ │ │ │ │ ├── MNotice.java
│ │ │ │ │ ├── MPerms.java
│ │ │ │ │ ├── MPost.java
│ │ │ │ │ ├── MRole.java
│ │ │ │ │ ├── MRoleDept.java
│ │ │ │ │ ├── MRolePerm.java
│ │ │ │ │ ├── MStorage.java
│ │ │ │ │ ├── MTenant.java
│ │ │ │ │ ├── MTenantDatasource.java
│ │ │ │ │ ├── MTenantPackage.java
│ │ │ │ │ ├── MTenantPackagePerm.java
│ │ │ │ │ ├── MUser.java
│ │ │ │ │ ├── MUserDept.java
│ │ │ │ │ ├── MUserPost.java
│ │ │ │ │ └── MUserRole.java
│ │ │ │ └── vo/
│ │ │ │ ├── config/
│ │ │ │ │ ├── ConfigQueryVO.java
│ │ │ │ │ └── ConfigVO.java
│ │ │ │ ├── dept/
│ │ │ │ │ ├── DeptQueryVO.java
│ │ │ │ │ └── DeptVO.java
│ │ │ │ ├── dict/
│ │ │ │ │ ├── DictCacheVO.java
│ │ │ │ │ ├── DictDataVO.java
│ │ │ │ │ ├── DictInfoVO.java
│ │ │ │ │ ├── DictListVO.java
│ │ │ │ │ ├── DictQueryVO.java
│ │ │ │ │ └── DictVO.java
│ │ │ │ ├── file/
│ │ │ │ │ ├── FileQueryVO.java
│ │ │ │ │ ├── FileUploadBatchVO.java
│ │ │ │ │ ├── FileUploadRespVO.java
│ │ │ │ │ ├── FileUploadVO.java
│ │ │ │ │ └── FileVO.java
│ │ │ │ ├── notice/
│ │ │ │ │ ├── NoticeQueryVO.java
│ │ │ │ │ └── NoticeVO.java
│ │ │ │ ├── perm/
│ │ │ │ │ ├── PermQueryVO.java
│ │ │ │ │ └── PermVO.java
│ │ │ │ ├── post/
│ │ │ │ │ ├── PostQueryVO.java
│ │ │ │ │ └── PostVO.java
│ │ │ │ ├── role/
│ │ │ │ │ ├── RoleQueryVO.java
│ │ │ │ │ └── RoleVO.java
│ │ │ │ ├── storage/
│ │ │ │ │ ├── StorageQueryVO.java
│ │ │ │ │ └── StorageVO.java
│ │ │ │ ├── tenant/
│ │ │ │ │ ├── TenantDatasourceVO.java
│ │ │ │ │ ├── TenantPackageQueryVO.java
│ │ │ │ │ ├── TenantPackageVO.java
│ │ │ │ │ ├── TenantQueryVO.java
│ │ │ │ │ └── TenantVO.java
│ │ │ │ └── user/
│ │ │ │ ├── ImageCaptchaVO.java
│ │ │ │ ├── RePasswordVO.java
│ │ │ │ ├── UserInfoVO.java
│ │ │ │ ├── UserLoginReqVO.java
│ │ │ │ ├── UserQueryVO.java
│ │ │ │ ├── UserSettingVO.java
│ │ │ │ └── UserVO.java
│ │ │ ├── manager/
│ │ │ │ ├── TenantManager.java
│ │ │ │ └── UserManager.java
│ │ │ ├── mapper/
│ │ │ │ ├── MConfigMapper.java
│ │ │ │ ├── MDeptMapper.java
│ │ │ │ ├── MDictMapper.java
│ │ │ │ ├── MFileMapper.java
│ │ │ │ ├── MNoticeMapper.java
│ │ │ │ ├── MPermsMapper.java
│ │ │ │ ├── MPostMapper.java
│ │ │ │ ├── MRoleDeptMapper.java
│ │ │ │ ├── MRoleMapper.java
│ │ │ │ ├── MRolePermMapper.java
│ │ │ │ ├── MStorageMapper.java
│ │ │ │ ├── MTenantDatasourceMapper.java
│ │ │ │ ├── MTenantMapper.java
│ │ │ │ ├── MTenantPackageMapper.java
│ │ │ │ ├── MTenantPackagePermMapper.java
│ │ │ │ ├── MUserDeptMapper.java
│ │ │ │ ├── MUserMapper.java
│ │ │ │ ├── MUserPostMapper.java
│ │ │ │ └── MUserRoleMapper.java
│ │ │ ├── mq/
│ │ │ │ ├── SystemConfigSyncConsumer.java
│ │ │ │ └── TenantDatasourceSyncConsumer.java
│ │ │ ├── service/
│ │ │ │ ├── ConfigService.java
│ │ │ │ ├── DeptService.java
│ │ │ │ ├── DictService.java
│ │ │ │ ├── EDictService.java
│ │ │ │ ├── FileService.java
│ │ │ │ ├── NoticeService.java
│ │ │ │ ├── PermService.java
│ │ │ │ ├── PostService.java
│ │ │ │ ├── RoleService.java
│ │ │ │ ├── StorageService.java
│ │ │ │ ├── TenantPackageService.java
│ │ │ │ ├── TenantService.java
│ │ │ │ ├── UserService.java
│ │ │ │ └── impl/
│ │ │ │ ├── ConfigServiceImpl.java
│ │ │ │ ├── DeptServiceImpl.java
│ │ │ │ ├── DictServiceImpl.java
│ │ │ │ ├── EDictServiceImpl.java
│ │ │ │ ├── FileServiceImpl.java
│ │ │ │ ├── NoticeServiceImpl.java
│ │ │ │ ├── PermServiceImpl.java
│ │ │ │ ├── PostServiceImpl.java
│ │ │ │ ├── RoleServiceImpl.java
│ │ │ │ ├── StorageServiceImpl.java
│ │ │ │ ├── TenantPackageServiceImpl.java
│ │ │ │ ├── TenantServiceImpl.java
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── utils/
│ │ │ ├── Add.java
│ │ │ ├── CommonConstant.java
│ │ │ ├── RedisKeyConstant.java
│ │ │ ├── TenantUtil.java
│ │ │ ├── TextUtil.java
│ │ │ ├── UnqIdUtil.java
│ │ │ ├── Update.java
│ │ │ └── ValidateUtil.java
│ │ └── resources/
│ │ └── mappers/
│ │ ├── MConfigMapper.xml
│ │ ├── MDeptMapper.xml
│ │ ├── MDictMapper.xml
│ │ ├── MFileMapper.xml
│ │ ├── MNoticeMapper.xml
│ │ ├── MPermsMapper.xml
│ │ ├── MPostMapper.xml
│ │ ├── MRoleDeptMapper.xml
│ │ ├── MRoleMapper.xml
│ │ ├── MRolePermMapper.xml
│ │ ├── MStorageMapper.xml
│ │ ├── MTenantDatasourceMapper.xml
│ │ ├── MTenantMapper.xml
│ │ ├── MTenantPackageMapper.xml
│ │ ├── MTenantPackagePermMapper.xml
│ │ ├── MUserDeptMapper.xml
│ │ ├── MUserMapper.xml
│ │ ├── MUserPostMapper.xml
│ │ └── MUserRoleMapper.xml
│ └── test/
│ └── java/
│ └── com/
│ └── minimalist/
│ └── basic/
│ └── MinimalistBasicApplicationTests.java
├── minimalist-vue3/
│ ├── .gitignore
│ ├── index.html
│ ├── package.json
│ ├── public/
│ │ └── tinymce/
│ │ └── skins/
│ │ ├── content/
│ │ │ ├── dark/
│ │ │ │ └── content.css
│ │ │ ├── default/
│ │ │ │ └── content.css
│ │ │ ├── document/
│ │ │ │ └── content.css
│ │ │ ├── tinymce-5/
│ │ │ │ └── content.css
│ │ │ ├── tinymce-5-dark/
│ │ │ │ └── content.css
│ │ │ └── writer/
│ │ │ └── content.css
│ │ ├── langs/
│ │ │ └── zh-Hans.js
│ │ └── ui/
│ │ ├── oxide/
│ │ │ ├── content.css
│ │ │ ├── content.inline.css
│ │ │ ├── skin.css
│ │ │ └── skin.shadowdom.css
│ │ ├── oxide-dark/
│ │ │ ├── content.css
│ │ │ ├── content.inline.css
│ │ │ ├── skin.css
│ │ │ └── skin.shadowdom.css
│ │ ├── tinymce-5/
│ │ │ ├── content.css
│ │ │ ├── content.inline.css
│ │ │ ├── skin.css
│ │ │ └── skin.shadowdom.css
│ │ └── tinymce-5-dark/
│ │ ├── content.css
│ │ ├── content.inline.css
│ │ ├── skin.css
│ │ └── skin.shadowdom.css
│ ├── src/
│ │ ├── App.vue
│ │ ├── api/
│ │ │ ├── config.js
│ │ │ ├── dept.js
│ │ │ ├── dict.js
│ │ │ ├── file.js
│ │ │ ├── notice.js
│ │ │ ├── perm.js
│ │ │ ├── post.js
│ │ │ ├── role.js
│ │ │ ├── storage.js
│ │ │ ├── tenant.js
│ │ │ ├── tenantPackage.js
│ │ │ └── user.js
│ │ ├── assets/
│ │ │ └── globalStyle.css
│ │ ├── axios.js
│ │ ├── components/
│ │ │ ├── MHeader.vue
│ │ │ ├── MSider.vue
│ │ │ ├── PageTabList.vue
│ │ │ ├── dictValue/
│ │ │ │ └── index.vue
│ │ │ ├── iconSelect/
│ │ │ │ ├── FunctionalIcons.vue
│ │ │ │ └── index.vue
│ │ │ ├── menuTree/
│ │ │ │ └── index.vue
│ │ │ ├── pagination/
│ │ │ │ └── index.vue
│ │ │ ├── tinymceEditor/
│ │ │ │ └── index.vue
│ │ │ └── uploadFile/
│ │ │ └── index.vue
│ │ ├── directives/
│ │ │ ├── permission.js
│ │ │ └── role.js
│ │ ├── main.js
│ │ ├── pages/
│ │ │ ├── 404.vue
│ │ │ ├── basic/
│ │ │ │ ├── config/
│ │ │ │ │ ├── ConfigDetail.vue
│ │ │ │ │ ├── ConfigEdit.vue
│ │ │ │ │ └── ConfigMgt.vue
│ │ │ │ ├── dept/
│ │ │ │ │ ├── DeptDetail.vue
│ │ │ │ │ ├── DeptEdit.vue
│ │ │ │ │ └── DeptMgt.vue
│ │ │ │ ├── dict/
│ │ │ │ │ ├── DictDetail.vue
│ │ │ │ │ ├── DictEdit.vue
│ │ │ │ │ └── DictMgt.vue
│ │ │ │ ├── file/
│ │ │ │ │ ├── FileMgt.vue
│ │ │ │ │ └── FileSelect.vue
│ │ │ │ ├── notice/
│ │ │ │ │ ├── NoticeDetail.vue
│ │ │ │ │ ├── NoticeEdit.vue
│ │ │ │ │ └── NoticeMgt.vue
│ │ │ │ ├── perm/
│ │ │ │ │ ├── PermDetail.vue
│ │ │ │ │ ├── PermEdit.vue
│ │ │ │ │ └── PermMgt.vue
│ │ │ │ ├── post/
│ │ │ │ │ ├── PostDetail.vue
│ │ │ │ │ ├── PostEdit.vue
│ │ │ │ │ └── PostMgt.vue
│ │ │ │ ├── role/
│ │ │ │ │ ├── RoleDetail.vue
│ │ │ │ │ ├── RoleEdit.vue
│ │ │ │ │ └── RoleMgt.vue
│ │ │ │ ├── storage/
│ │ │ │ │ ├── Local.vue
│ │ │ │ │ ├── Minio.vue
│ │ │ │ │ ├── QiNiu.vue
│ │ │ │ │ ├── StorageDetail.vue
│ │ │ │ │ ├── StorageEdit.vue
│ │ │ │ │ └── StorageMgt.vue
│ │ │ │ ├── system/
│ │ │ │ │ └── Swagger.vue
│ │ │ │ ├── tenant/
│ │ │ │ │ ├── TenantDetail.vue
│ │ │ │ │ ├── TenantEdit.vue
│ │ │ │ │ └── TenantMgt.vue
│ │ │ │ ├── tenantPackage/
│ │ │ │ │ ├── TenantPackageDetail.vue
│ │ │ │ │ ├── TenantPackageEdit.vue
│ │ │ │ │ └── TenantPackageMgt.vue
│ │ │ │ └── user/
│ │ │ │ ├── UserDetail.vue
│ │ │ │ ├── UserEdit.vue
│ │ │ │ ├── UserMgt.vue
│ │ │ │ └── UserSetting.vue
│ │ │ ├── container.vue
│ │ │ ├── index.vue
│ │ │ └── login.vue
│ │ ├── router/
│ │ │ └── index.js
│ │ ├── store/
│ │ │ ├── index.js
│ │ │ └── module/
│ │ │ └── sys-store.js
│ │ └── utils/
│ │ ├── cookie.js
│ │ ├── dict.js
│ │ ├── msg.js
│ │ └── sys.js
│ └── vite.config.js
├── pom.xml
└── resources/
└── sql/
└── mysql/
├── 2024-12-03 ~ 2025-03-12期间的SQL变更(第一次使用本项目忽略).sql
└── minimalist_全部sql,如果是第一次使用本项目直接执行这个.sql
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
######################################################################
# Build Tools
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar
target/
!.mvn/wrapper/maven-wrapper.jar
######################################################################
# IDE
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
nbproject/private/
build/*
nbbuild/
dist/
nbdist/
.nb-gradle/
######################################################################
# Others
*.log
*.xml.versionsBackup
*.swp
!*/build/*.java
!*/build/*.html
!*/build/*.xml
/files/
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2023 小太阳
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: README.md
================================================
<div align="center">
<img alt="logo" src="minimalist-vue3/src/assets/logo.png" width="80px" height="80px">
</div>
<div align="center">
<h1>极简多租户管理系统</h1>
<span>基于SpringBoot3+Vue3前后端分离的Java快速开发脚手架</span>
</div>
## 项目简介
极简多租户管理系统是一个多租户管理系统,基于SpringBoot3+Vue3的前后端分离的后台开发脚手架,具备一些常用的基础功能。
## 项目地址
演示地址:[https://www.jjian.com.cn](https://www.jjian.com.cn)
文档地址:[https://apebbs.cn/docs/minimalist-saas/1.0.0/introduction.html](https://apebbs.cn/docs/minimalist-saas/1.0.0/introduction.html)
Gitee:[https://gitee.com/marlife/minimalist-saas](https://gitee.com/marlife/minimalist-saas)
Github:[https://github.com/lmq2582609/minimalist-saas](https://github.com/lmq2582609/minimalist-saas)
管理员账号/密码: `admin`/`111111`
租户账号/密码:`dongdong`/`111111`
## 技术选型
### 前端
| 名称 | 版本 | 说明 |
| ----------- | ------ | ----------------------- |
| Vue | 3.2.47 | 用于构建用户界面的 JavaScript 框架 |
| Vite | 4.3.2 | 前端构建工具 |
| Arco-Design | 2.45.3 | 字节出的 Vue3 UI 组件库 |
| Windicss | 3.5.6 | CSS 框架 |
| Vue-Router | 4.1.6 | Vue官方路由 |
| Vueuse | 10.1.2 | 基于Composition API的实用函数库 |
| Axios | 1.4.0 | 基于Promise的HTTP客户端 |
| Pinia | 2.0.36 | Vue 状态管理 |
| Vue-Cropper | 1.0.9 | 图片裁剪 |
| Nprogress | 0.2.0 | 进度条 |
| Tinymce | 6.6.0 | 富文本编辑器 |
### 后端
| 名称 | 版本 | 说明 |
| -------------------------- | ------ | ----------------------- |
| Java | 17 | 无需多言 |
| SpringBoot | 3.1.1 | Java开发框架 |
| Redisson | 3.36.0 | Redis Java客户端 |
| Mysql | 8.0.33 | Mysql数据库驱动 |
| Mybatis-flex | 1.9.7 | ORM框架 |
| Hutool | 5.8.32 | Java工具库 |
| Satoken | 1.39.0 | Java权限认证框架 |
| Knife4j | 4.1.0 | Swagger2和OpenAPI3增强解决方案 |
| Mica-xss | 3.3.2 | xss防护 |
## 中间件
| 名称 | 版本 | 说明 |
| ----- | ------ | -------- |
| mysql | 8.0.24 | 关系型数据库 |
| redis | 7.2.4 | NoSQL数据库 |
## 演示图
<table>
<tr>
<td><img src="resources/images/login-page.png"/></td>
<td><img src="resources/images/index-page.png"/></td>
</tr>
<tr>
<td><img src="resources/images/user-page.png"/></td>
<td><img src="resources/images/role-page.png"/></td>
</tr>
<tr>
<td><img src="resources/images/perm-page.png"/></td>
<td><img src="resources/images/dept-page.png"/></td>
</tr>
<tr>
<td><img src="resources/images/post-page.png"/></td>
<td><img src="resources/images/dict-page.png"/></td>
</tr>
<tr>
<td><img src="resources/images/file-page.png"/></td>
<td><img src="resources/images/package-page.png"/></td>
</tr>
<tr>
<td><img src="resources/images/tenant-page.png"/></td>
<td><img src="resources/images/notice-page.png"/></td>
</tr>
<tr>
<td><img src="resources/images/config-page.png"/></td>
<td><img src="resources/images/storage-page.png"/></td>
</tr>
<tr>
<td><img src="resources/images/user-pro-page.png"/></td>
<td><img src="resources/images/swagger-page.png"/></td>
</tr>
</table>
================================================
FILE: minimalist-application/pom.xml
================================================
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<parent>
<groupId>com.cn</groupId>
<artifactId>minimalist-saas</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>minimalist-application</artifactId>
<name>minimalist-application Maven Webapp</name>
<description>启动</description>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>com.cn</groupId>
<artifactId>minimalist-basic</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<!-- 项目打包名称 -->
<finalName>${project.package.name}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<!--创建一个自动可执行的jar或war文件 -->
<goal>repackage</goal>
</goals>
</execution>
</executions>
<configuration>
<!-- 打包指定启动类 -->
<mainClass>com.minimalist.application.MinimalistBasicApplication</mainClass>
<!-- 打包时忽略的包 -->
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.package.encoding}</encoding>
<compilerArgs>--enable-preview</compilerArgs>
</configuration>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
<!-- 项目中依赖的包从哪里下载 -->
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<!-- 项目中所使用的maven插件从哪里下载 -->
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
<profiles>
<!-- 开发环境配置文件 -->
<profile>
<id>dev</id>
<activation>
<!--默认激活dev 环境-->
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<!-- spring.profiles.active是在application.yml自定义的字段(名字随便起),自定义字段可以有多个,能对应上就行-->
<spring.profiles.active>dev</spring.profiles.active>
</properties>
</profile>
<!-- 生产环境配置文件 -->
<profile>
<id>prod</id>
<properties>
<spring.profiles.active>prod</spring.profiles.active>
</properties>
</profile>
</profiles>
</project>
================================================
FILE: minimalist-application/src/main/java/com/minimalist/application/MinimalistBasicApplication.java
================================================
package com.minimalist.application;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan("com.minimalist.**.mapper")
@SpringBootApplication(scanBasePackages = {"com.minimalist.*", "cn.hutool.extra.spring"})
public class MinimalistBasicApplication {
public static void main(String[] args) {
SpringApplication.run(MinimalistBasicApplication.class, args);
}
}
================================================
FILE: minimalist-application/src/main/java/com/minimalist/application/config/GlobalExceptionHandler.java
================================================
package com.minimalist.application.config;
import cn.dev33.satoken.exception.NotLoginException;
import cn.dev33.satoken.exception.NotPermissionException;
import com.minimalist.basic.config.exception.BusinessException;
import com.minimalist.basic.entity.enums.RespEnum;
import jakarta.validation.ConstraintViolation;
import jakarta.validation.ConstraintViolationException;
import lombok.extern.slf4j.Slf4j;
import net.dreamlu.mica.xss.core.XssException;
import org.springframework.core.NestedExceptionUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentConversionNotSupportedException;
import java.util.List;
import java.util.Set;
import java.util.StringJoiner;
/**
* 全局异常处理
*/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
/**
* 参数异常
* @param e 异常
* @return 响应
*/
@ExceptionHandler(value = {IllegalArgumentException.class, MethodArgumentNotValidException.class, ConstraintViolationException.class})
public ResponseEntity<Object> paramsException(Exception e) {
if (e instanceof IllegalArgumentException) {
log.warn(e.getMessage(), e);
return ResponseEntity.status(RespEnum.PARAM_ERROR.getCode()).body(RespEnum.PARAM_ERROR.getDesc());
} else if (e instanceof MethodArgumentNotValidException) {
//参数异常处理
log.warn(e.getMessage(), e);
BindingResult bindingResult = ((MethodArgumentNotValidException) e).getBindingResult();
List<FieldError> errors = bindingResult.getFieldErrors();
StringJoiner sj = new StringJoiner(",");
errors.forEach(error -> sj.add(error.getDefaultMessage()));
return ResponseEntity.status(RespEnum.PARAM_ERROR.getCode()).body(sj.toString());
} else if (e instanceof ConstraintViolationException) {
//参数异常处理
log.warn(e.getMessage(), e);
Set<ConstraintViolation<?>> constraintViolations = ((ConstraintViolationException) e).getConstraintViolations();
StringJoiner sj = new StringJoiner(",");
constraintViolations.forEach(c -> sj.add(c.getMessageTemplate()));
return ResponseEntity.status(RespEnum.PARAM_ERROR.getCode()).body(sj.toString());
} else {
return exception(e);
}
}
/**
* 自定义异常
* @param e 异常
* @return 响应
*/
@ExceptionHandler(value = {BusinessException.class})
public ResponseEntity<Object> customException(Exception e) {
//业务异常
if (e instanceof BusinessException) {
//记录日志
log(e);
//响应 业务异常
return ResponseEntity.status(((BusinessException) e).getCode()).body(e.getMessage());
} else {
return exception(e);
}
}
/**
* 未登录异常处理
*/
@ExceptionHandler(value = {NotLoginException.class})
public ResponseEntity<Object> customNotLoginException(Exception e) {
return ResponseEntity.status(RespEnum.REQUEST_UNAUTH.getCode()).body(RespEnum.REQUEST_UNAUTH.getDesc());
}
/**
* 无权限异常处理
*/
@ExceptionHandler(value = {NotPermissionException.class})
public ResponseEntity<Object> customNotPermissionException(Exception e) {
return ResponseEntity.status(RespEnum.NO_OPERATION_PERMISSION.getCode()).body(RespEnum.NO_OPERATION_PERMISSION.getDesc());
}
/**
* XSS异常
* @param e 异常
* @return 响应
*/
@ExceptionHandler(value = {HttpMessageNotReadableException.class, MethodArgumentConversionNotSupportedException.class})
public ResponseEntity<Object> xssException(Exception e) {
Throwable rootCause = NestedExceptionUtils.getRootCause(e);
if (rootCause instanceof XssException) {
//记录日志
log(e);
return ResponseEntity.status(RespEnum.PARAM_XSS_ERROR.getCode()).body(RespEnum.PARAM_XSS_ERROR.getDesc());
} else {
return exception(e);
}
}
/**
* 未知异常
* @param e 异常
* @return 响应
*/
@ExceptionHandler(value = {Exception.class})
public ResponseEntity<Object> exception(Exception e) {
//记录日志
log(e);
//响应 系统异常
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(RespEnum.FAILED.getDesc());
}
private void log(Exception e) {
//记录日志
log.error(e.getMessage(), e);
//邮件、通知、告警
}
}
================================================
FILE: minimalist-application/src/main/java/com/minimalist/application/config/satoken/SaTokenConfigure.java
================================================
package com.minimalist.application.config.satoken;
import cn.dev33.satoken.interceptor.SaInterceptor;
import cn.dev33.satoken.router.SaHttpMethod;
import cn.dev33.satoken.router.SaRouter;
import cn.dev33.satoken.stp.StpUtil;
import com.minimalist.basic.config.exception.BusinessException;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class SaTokenConfigure implements WebMvcConfigurer {
/**
* 注册 Sa-Token 拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// /** 演示环境,可以删除 ------- start */
// SaInterceptor saInterceptor = new SaInterceptor(handle -> {
// //校验登录
// StpUtil.checkLogin();
// // 根据请求类型匹配
// SaRouter.match(SaHttpMethod.POST, SaHttpMethod.DELETE, SaHttpMethod.PUT)
// .check(() -> {
// throw new BusinessException("演示环境,只能查询,不能进行操作");
// });
// });
// registry.addInterceptor(saInterceptor).addPathPatterns("/**")
// .excludePathPatterns("/basic/user/logout");
// /** 演示环境,可以删除 ------- end */
//上面演示环境删除后,下面的注视需要放开
//全局拦截配置,必须登陆后才可访问,如果某个接口需要跳过拦截,需要在接口上增加@SaIgnore注解
SaInterceptor saInterceptor = new SaInterceptor(handle -> StpUtil.checkLogin());
registry.addInterceptor(saInterceptor).addPathPatterns("/**");
}
}
================================================
FILE: minimalist-application/src/main/java/com/minimalist/application/config/satoken/SaTokenInterfaceImpl.java
================================================
package com.minimalist.application.config.satoken;
import cn.dev33.satoken.stp.StpInterface;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.util.StrUtil;
import com.minimalist.basic.config.redis.RedisManager;
import com.minimalist.basic.utils.RedisKeyConstant;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Set;
/**
* sa-token,自定义权限加载接口实现类
*/
@Component
public class SaTokenInterfaceImpl implements StpInterface {
@Autowired
private RedisManager redisManager;
/**
* 返回指定账号id所拥有的权限码集合,loginId即登陆时传入的UserId
* @param loginId 用户ID
* @param loginType 账号体系标识
* @return 权限编码集合
*/
@Override
public List<String> getPermissionList(Object loginId, String loginType) {
//从redis获取权限数据,在请求getUserInfo接口时会set权限数据
Set<String> permCodes = redisManager.get(StrUtil.indexedFormat(RedisKeyConstant.USER_PERM_CACHE_KEY, Long.parseLong(loginId.toString())));
return CollectionUtil.newArrayList(permCodes);
}
/**
* 返回指定账号id所拥有的角色标识集合,loginId即登陆时传入的ID
* @param loginId 用户ID
* @param loginType 账号体系标识
* @return 角色编码集合
*/
@Override
public List<String> getRoleList(Object loginId, String loginType) {
//从redis获取角色数据,在请求getUserInfo接口时会set角色数据
Set<String> roleCodes = redisManager.get(StrUtil.indexedFormat(RedisKeyConstant.USER_ROLE_CACHE_KEY, Long.parseLong(loginId.toString())));
return CollectionUtil.newArrayList(roleCodes);
}
}
================================================
FILE: minimalist-application/src/main/resources/application-dev.yml
================================================
mybatis-flex:
configuration:
map-underscore-to-camel-case: true
auto-mapping-behavior: full
mapper-locations:
- classpath*:mappers/**/*.xml
global-config:
# 逻辑删除字段
logic-delete-column: deleted
# 别名包扫描路径
type-aliases-package: com.minimalist.**.entity
# springdoc-openapi 项目文档配置
springdoc:
title: 极简多租户开发平台
authorName: 小太阳
authorUrl: https://apebbs.cn
authorEmail: 438562332@qq.com
swagger-ui:
path: /swagger-ui.html
tags-sorter: alpha
operations-sorter: alpha
api-docs:
path: /v3/api-docs
group-configs:
- group: '1.全部'
paths-to-match: '/**'
packages-to-scan: com.minimalist
- group: '3.basic基础模块'
paths-to-match: '/basic/**'
packages-to-scan: com.minimalist.basic
# knife4j的增强配置,不需要增强可以不配
knife4j:
# 启用增强模式
enable: true
setting:
language: zh_cn
swagger-model-name: 实体说明
spring:
datasource:
dynamic:
primary: master
strict: false
hikari:
# 最小空闲连接数量
minimum-idle: 20
# 连接池最大连接数,默认是10
maximum-pool-size: 100
# 空闲连接存活最大时间,默认600000
idle-timeout: 30000
# 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟
max-lifetime: 60000
# 数据库连接超时时间,默认30秒,即30000
connection-timeout: 30000
# 测试连接
connection-test-query: "SELECT 1"
datasource:
master:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/minimalist?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowMultiQueries=true&useAffectedRows=true&rewriteBatchedStatements=true
servlet:
multipart:
# 单个文件大小
max-file-size: 100MB
# 总文件大小
max-request-size: 256MB
data:
# redis配置
redis:
# Redis数据库索引(默认为0)
database: 3
# Redis服务器地址
host: 127.0.0.1
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
password: 1
# 读取超时时间
timeout: 10s
# 连接超时时间
connect-timeout: 5s
lettuce:
pool:
enabled: true
# 连接池最大连接数
max-active: 200
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0
redisson:
address: redis://${spring.data.redis.host}:${spring.data.redis.port}
password: ${spring.data.redis.password}
database: 3
pingInterval: 10000
connectionPoolSize: 100
connectionMinimumIdleSize: 0
# 防XSS,使用说明文档请访问:https://gitee.com/596392912/mica 找到其中的mica-xss中的 README.md 查看
mica:
xss:
# 开启xss
enabled: true
# 【全局】是否去除文本首尾空格
trim-text: true
# mode有三个模式:clear清理(默认)、escape转义、validate校验,
# validate校验模式,校验未通过会抛出异常,可使用全局异常捕获进行处理
# clear模式,会将不允许的数据清理掉
# escape模式,会将不允许的数据转义
# 出错抛出的异常:
# json处理默认使用jackson,jackson校验未通过异常:HttpMessageNotReadableException
# form表单校验未通过异常:MethodArgumentConversionNotSupportedException
mode: clear
# 是否保留换行
pretty-print: false
# 是否转义
enable-escape: false
# 需要拦截的路由
path-patterns: /**
# 需要放行的路由,可以配置,也可以使用 @XssCleanIgnore 注解对某个方法和类进行忽略
# 若需要对实体类的某个字段忽略,使用 @JsonDeserialize(using = XssCleanDeserializer.class) 注解忽略
path-exclude-patterns:
############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token:
# token 名称,默认:satoken
token-name: Authentication
# token 有效期(单位:秒) 604800秒=7天,默认2592000秒=30天,-1=永久有效
timeout: 604800
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
active-timeout: -1
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
is-concurrent: true
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
is-share: false
# token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
token-style: simple-uuid
# 是否输出操作日志
is-log: true
# 日志配置
logging:
level:
com.minimalist: debug
org.springframework: warn
config: classpath:logback-dev.xml
================================================
FILE: minimalist-application/src/main/resources/application.yml
================================================
server:
port: 9090
servlet:
context-path: /minimalist
encoding:
charset: UTF-8
force: true
spring:
profiles:
active: @spring.profiles.active@
================================================
FILE: minimalist-application/src/main/resources/logback-dev.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<!-- 日志存放路径 -->
<property name="LOG_PATH" value="./logs"/>
<!-- 日志输出格式 -->
<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{traceId}] %-5level [%thread] %logger{36} - %msg%n" />
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<!-- 系统输出 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!-- 日志文件输出路径 -->
<file>${LOG_PATH}/minimalist.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_PATH}/minimalist-%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 保留历史日志文件的天数 30天 -->
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="FILE" />
<appender-ref ref="STDOUT" />
</root>
<!-- 系统模块日志级别控制 -->
<logger name="com.minimalist" level="info" />
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn" />
</configuration>
================================================
FILE: minimalist-basic/pom.xml
================================================
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>minimalist-saas</artifactId>
<groupId>com.cn</groupId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>minimalist-basic</artifactId>
<name>minimalist-basic</name>
<description>基础模块</description>
<packaging>jar</packaging>
<dependencies>
<!-- spring-web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- aop -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- swagger-knife4j -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>knife4j-openapi3-jakarta-spring-boot-starter</artifactId>
<version>${knife4j.version}</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- 参数校验 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<!-- Sa-Token 权限认证,在线文档:https://sa-token.cc -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-spring-boot3-starter</artifactId>
<version>${satoken.version}</version>
</dependency>
<!-- Sa-Token 整合 Redis (使用 jackson 序列化方式) -->
<dependency>
<groupId>cn.dev33</groupId>
<artifactId>sa-token-redis-jackson</artifactId>
<version>${satoken.version}</version>
</dependency>
<!-- 提供Redis连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
<!-- redisson -->
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>${redisson.version}</version>
</dependency>
<!-- hutool工具类 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
<!-- mica-xss -->
<dependency>
<groupId>net.dreamlu</groupId>
<artifactId>mica-xss</artifactId>
<version>${mica-xss.version}</version>
</dependency>
<!-- 缩略图处理 -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>${thumbnailator.version}</version>
</dependency>
<!-- webp-imageio 配合thumbnailator做缩略图处理,不引入回出现No suitable ImageReader found for source data. -->
<dependency>
<groupId>org.sejda.imageio</groupId>
<artifactId>webp-imageio</artifactId>
<version>${webp-imageio.version}</version>
</dependency>
<!-- mybatis-flex -->
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-spring-boot3-starter</artifactId>
<version>${mybatis-flex.version}</version>
</dependency>
<!-- mybatis-flex APT服务 -->
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-processor</artifactId>
<version>${mybatis-flex.version}</version>
<scope>provided</scope>
</dependency>
<!-- mybatis-flex 代码生成 -->
<dependency>
<groupId>com.mybatis-flex</groupId>
<artifactId>mybatis-flex-codegen</artifactId>
<version>${mybatis-flex.codegen.version}</version>
</dependency>
<!-- hikariCP连接池 -->
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>${mybatis-flex.hikariCP.version}</version>
</dependency>
<!-- 多数据源 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot3-starter</artifactId>
<version>${dynamic-datasource.version}</version>
</dependency>
<!-- 七牛云 -->
<dependency>
<groupId>com.qiniu</groupId>
<artifactId>qiniu-java-sdk</artifactId>
<version>${qiniu.version}</version>
</dependency>
</dependencies>
</project>
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/async/AsyncConfig.java
================================================
package com.minimalist.basic.config.async;
import org.slf4j.MDC;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.Map;
import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* EnableAsync 开启 @Async 支持
* 自定义Async线程池,跨线程传递traceId
*/
@EnableAsync
@Configuration
public class AsyncConfig implements AsyncConfigurer {
/**
* 核心线程数 = cpu核心数 + 1
*/
private final int coreSize = Runtime.getRuntime().availableProcessors() + 1;
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(coreSize);
executor.setMaxPoolSize(coreSize * 2);
executor.setQueueCapacity(100); //队列数
executor.setThreadNamePrefix("Async-Thread-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setTaskDecorator(runnable -> {
Map<String, String> copyOfContextMap = MDC.getCopyOfContextMap();
return () -> {
try {
MDC.setContextMap(copyOfContextMap);
runnable.run();
} finally {
MDC.clear();
}
};
});
executor.initialize();
return executor;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/async/ThreadPoolConfig.java
================================================
package com.minimalist.basic.config.async;
import org.slf4j.MDC;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.Map;
import java.util.concurrent.ThreadPoolExecutor;
@Configuration
public class ThreadPoolConfig {
/**
* 核心线程数 = cpu核心数 + 1
*/
private final int coreSize = Runtime.getRuntime().availableProcessors() + 1;
@Bean(name = "threadPoolExecutor")
public ThreadPoolTaskExecutor threadPoolExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(coreSize);
executor.setMaxPoolSize(coreSize * 2);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("ThreadPool-");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.setTaskDecorator(runnable -> {
Map<String, String> copyOfContextMap = MDC.getCopyOfContextMap();
return () -> {
try {
MDC.setContextMap(copyOfContextMap);
runnable.run();
} finally {
MDC.clear();
}
};
});
executor.initialize();
return executor;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/convert/FileSizeDeserializer.java
================================================
package com.minimalist.basic.config.convert;
import cn.hutool.core.io.unit.DataSizeUtil;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.core.JacksonException;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import java.io.IOException;
/**
* 接收数据时,对String类型的文件大小进行处理
*/
public class FileSizeDeserializer extends JsonDeserializer<Long> {
@Override
public Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JacksonException {
String text = jsonParser.getText();
return StrUtil.isBlank(text) ? null : DataSizeUtil.parse(text);
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/convert/FileSizeSerializer.java
================================================
package com.minimalist.basic.config.convert;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.ObjectUtil;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
/**
* 返回数据时,对Long类型的文件大小进行处理
*/
public class FileSizeSerializer extends JsonSerializer<Long> {
@Override
public void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
if (ObjectUtil.isNotNull(value)) {
jsonGenerator.writeString(FileUtil.readableFileSize(value));
} else {
jsonGenerator.writeNull();
}
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/convert/LongArrJsonSerializer.java
================================================
package com.minimalist.basic.config.convert;
import cn.hutool.core.collection.CollectionUtil;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.util.Collection;
/**
* 返回数据时,对Long类型的集合转换成String后再返回,防止Long类型精度丢失
*/
public class LongArrJsonSerializer extends JsonSerializer<Collection<Long>> {
@Override
public void serialize(Collection<Long> values, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
if (CollectionUtil.isNotEmpty(values)) {
String [] strArr = values.stream().map(l -> Long.toString(l)).toArray(String[]::new);
jsonGenerator.writeArray(strArr, 0, strArr.length);
} else {
jsonGenerator.writeNull();
}
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/dataConfig/SystemConfigInit.java
================================================
package com.minimalist.basic.config.dataConfig;
import com.minimalist.basic.service.ConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
@Component
public class SystemConfigInit implements ApplicationRunner {
@Autowired
private ConfigService configService;
@Override
public void run(ApplicationArguments args) throws Exception {
//初始化将系统参数缓存到Map中
configService.refreshConfigCache();
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/eDict/BeanMethod.java
================================================
package com.minimalist.basic.config.eDict;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.lang.reflect.Method;
/**
* 存放class和method
* @param <T>
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class BeanMethod<T> {
/**
* class
*/
private T bean;
/**
* method
*/
private Method method;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/eDict/EDict.java
================================================
package com.minimalist.basic.config.eDict;
import java.lang.annotation.*;
/**
* 额外字典数据处理
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface EDict {
/**
* 字典类型
*/
String dictType() default "";
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/eDict/EDictConstant.java
================================================
package com.minimalist.basic.config.eDict;
import cn.hutool.core.map.MapUtil;
import org.springframework.stereotype.Component;
import java.util.Map;
@Component
public class EDictConstant {
/** 存储额外字典数据处理的方法 */
public static final Map<String, BeanMethod<?>> dictMethodMap = MapUtil.newConcurrentHashMap();
/** 部门字典type */
public static final String DEPT_LIST = "dict-dept-list";
/** 岗位字典type */
public static final String POST_LIST = "dict-post-list";
/** 角色字典type */
public static final String ROLE_LIST = "dict-role-list";
/** 用户字典type */
public static final String USER_LIST = "dict-user-list";
/** 租户字典type */
public static final String TENANT_LIST = "dict-tenant-list";
/** 租户套餐字典type */
public static final String TENANT_PACKAGE_LIST = "tenant-package-list";
/** 存储方式字典type */
public static final String STORAGE_LIST = "storage-list";
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/eDict/EDictInit.java
================================================
package com.minimalist.basic.config.eDict;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.aop.support.AopUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.ApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
/**
* 额外字典处理,初始化加载字典处理方法
*/
@Order(-1)
@Component
public class EDictInit implements ApplicationRunner {
@Autowired
private ApplicationContext applicationContext;
@Override
public void run(ApplicationArguments args) throws Exception {
String[] beanDefinitionNames = applicationContext.getBeanDefinitionNames();
//getBean,找到含有额外字典处理的注解方法
for (String beanDefinitionName : beanDefinitionNames) {
Object bean = applicationContext.getBean(beanDefinitionName);
postProcessAfterInitialization(bean);
}
System.out.println("-------------------- 初始化自定义字典完毕 --------------------");
}
public void postProcessAfterInitialization(Object bean) {
//Spring代理类中的方法
Method[] proxyMethods = bean.getClass().getDeclaredMethods();
//Spring代理类中的方法转Map,key:方法名,value:代理方法
Map<String, Method> proxyMethodMap = Arrays.stream(proxyMethods).collect(Collectors.toMap(Method::getName, Function.identity(), (v1, v2) -> v1));
//判断是否是cglib动态代理
boolean cglibProxy = AopUtils.isCglibProxy(bean);
if (cglibProxy) {
//获取Spring代理类,再获取代理目标类
Class<?> superclass = bean.getClass().getSuperclass();
//获取代理目标类中的方法,目的是为了获取到 ExtraDict 自定义注解
Method[] methods = superclass.getDeclaredMethods();
for (Method method : methods) {
cacheBeanMethod(method, proxyMethodMap, bean);
}
} else {
//不是cglib动态代理,可能是其他代理,暂时还没遇到其他代理扫描不到的情况
for (Method method : proxyMethods) {
cacheBeanMethod(method, proxyMethodMap, bean);
}
}
}
private void cacheBeanMethod(Method method, Map<String, Method> proxyMethodMap, Object bean) {
//获取自定义注解
EDict eDict = method.getDeclaredAnnotation(EDict.class);
if (ObjectUtil.isNotNull(eDict) && StrUtil.isNotBlank(eDict.dictType())) {
//从代理方法中查找并缓存代理方法,如果代理方法不存在,则缓存代理目标类方法
Method proxyMethod = proxyMethodMap.get(method.getName());
if (ObjectUtil.isNotNull(proxyMethod)) {
EDictConstant.dictMethodMap.put(eDict.dictType(), new BeanMethod<>(bean, proxyMethod));
} else {
EDictConstant.dictMethodMap.put(eDict.dictType(), new BeanMethod<>(bean, method));
}
}
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/exception/BusinessException.java
================================================
package com.minimalist.basic.config.exception;
import com.minimalist.basic.entity.enums.RespEnum;
import lombok.Data;
import java.io.Serializable;
@Data
public class BusinessException extends RuntimeException implements Serializable {
private static final long serialVersionUID = 1L;
/** 状态码 */
private Integer code;
/** 异常信息 */
private String message;
public BusinessException(Integer code, String message) {
this.code = code;
this.message = message;
}
public BusinessException(String message) {
this.code = RespEnum.FAILED.getCode();
this.message = message;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/FileManager.java
================================================
package com.minimalist.basic.config.fileHandler;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
import com.minimalist.basic.config.exception.BusinessException;
import com.minimalist.basic.config.fileHandler.handler.FileHandler;
import com.minimalist.basic.entity.po.MDict;
import com.minimalist.basic.mapper.MDictMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.Optional;
@Component
public class FileManager {
@Autowired
private ApplicationContext applicationContext;
@Autowired
private MDictMapper dictMapper;
/**
* 根据存储类型获取对应的处理类
* @param storageType 存储类型
* @return 处理类
*/
public FileHandler getFileHandler(String storageType) {
if (StrUtil.isBlank(storageType)) {
throw new BusinessException("处理文件时,存储平台参数为空");
}
Map<String, FileHandler> beansMaps = applicationContext.getBeansOfType(FileHandler.class);
if (MapUtil.isEmpty(beansMaps)) {
throw new BusinessException("处理文件时,未找到指定的处理方法");
}
return beansMaps.values().stream()
.filter(bean -> bean.isHandler(storageType))
.findFirst()
.orElseThrow(() -> new BusinessException("未找到 [" + storageType + "] 的处理方法"));
}
/**
* 根据文件来源获取存储路径
* @param fileSource 文件来源
* @return 路径
*/
public String getPathByFileSource(Integer fileSource) {
MDict dict = dictMapper.selectDictByDictTypeAndKey("file-source-path", String.valueOf(fileSource));
return Optional.ofNullable(dict)
.map(MDict::getDictValue)
.orElse("common/");
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/FileResourcesInit.java
================================================
package com.minimalist.basic.config.fileHandler;
import cn.hutool.json.JSONUtil;
import com.minimalist.basic.entity.enums.StatusEnum;
import com.minimalist.basic.config.fileHandler.entity.LocalFileEntity;
import com.minimalist.basic.entity.enums.StorageEnum;
import com.minimalist.basic.entity.po.MStorage;
import com.minimalist.basic.mapper.MStorageMapper;
import com.mybatisflex.core.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
/**
* 静态资源目录映射,只有本地存储需要映射,启动后执行一次
* 如果在存储管理中,修改了本地存储的文件存储路径,那么程序需要重启才可以生效
*/
@Order(-1)
@Configuration
public class FileResourcesInit implements WebMvcConfigurer {
@Autowired
private MStorageMapper storageMapper;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//查询本地存储
List<MStorage> storageList = storageMapper.selectListByQuery(QueryWrapper.create()
.eq(MStorage::getStorageType, StorageEnum.StorageType.LOCAL.getCode())
.eq(MStorage::getStatus, StatusEnum.STATUS_1.getCode())
);
for (MStorage storage : storageList) {
LocalFileEntity localFileEntity = JSONUtil.toBean(storage.getStorageConfig(), LocalFileEntity.class);
registry.addResourceHandler("/files/**").addResourceLocations("file:" + localFileEntity.getStoragePath());
}
System.out.println("-------------------- 初始化静态资源映射完毕 --------------------");
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/entity/LocalFileEntity.java
================================================
package com.minimalist.basic.config.fileHandler.entity;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class LocalFileEntity {
@NotBlank(message = "本地存储路径不能为空")
private String storagePath;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/entity/MinIOFileEntity.java
================================================
package com.minimalist.basic.config.fileHandler.entity;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class MinIOFileEntity {
@NotBlank(message = "访问密钥不能为空")
private String accessKey;
@NotBlank(message = "私有密钥不能为空")
private String secretKey;
@NotBlank(message = "域名不能为空")
private String endPoint;
@NotBlank(message = "桶名称不能为空")
private String bucketName;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/entity/QiNiuFileEntity.java
================================================
package com.minimalist.basic.config.fileHandler.entity;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
@Data
public class QiNiuFileEntity {
@NotBlank(message = "访问密钥不能为空")
private String accessKey;
@NotBlank(message = "私有密钥不能为空")
private String secretKey;
@NotBlank(message = "桶名称不能为空")
private String bucketName;
@NotBlank(message = "域名不能为空")
private String endPoint;
@NotBlank(message = "七牛云存储区域ID不能为空")
private String regionId;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/handler/FileHandler.java
================================================
package com.minimalist.basic.config.fileHandler.handler;
import com.minimalist.basic.entity.po.MFile;
import com.minimalist.basic.entity.po.MStorage;
import org.springframework.web.multipart.MultipartFile;
public interface FileHandler {
/**
* 是否是对应的处理类
* @param storageType 存储类型
* @return 处理类
*/
boolean isHandler(String storageType);
/**
* 参数校验
* @param storageConfig JSON存储配置信息
* @return 格式化后的配置信息
*/
String valid(String storageConfig);
/**
* 单文件上传
* @param multipartFile 文件
* @param fileSource 文件来源
* @param storage 存储信息
* @return 文件信息
*/
MFile uploadFile(MultipartFile multipartFile, Integer fileSource, MStorage storage);
/**
* 删除文件
* @param file 文件信息
* @return 是否删除成功
*/
boolean deleteFile(MFile file, MStorage storage);
/**
* 移动文件
* @param file 文件信息
* @param storage 存储信息
* @return 是否成功
*/
boolean moveFile(MFile file, MStorage storage);
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/handler/impl/LocalFileHandler.java
================================================
package com.minimalist.basic.config.fileHandler.handler.impl;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.minimalist.basic.config.exception.BusinessException;
import com.minimalist.basic.config.fileHandler.FileManager;
import com.minimalist.basic.config.fileHandler.entity.LocalFileEntity;
import com.minimalist.basic.config.fileHandler.handler.FileHandler;
import com.minimalist.basic.entity.enums.FileEnum;
import com.minimalist.basic.entity.enums.StatusEnum;
import com.minimalist.basic.entity.enums.StorageEnum;
import com.minimalist.basic.entity.po.MFile;
import com.minimalist.basic.entity.po.MStorage;
import com.minimalist.basic.mapper.MFileMapper;
import com.minimalist.basic.mapper.MStorageMapper;
import com.minimalist.basic.utils.CommonConstant;
import com.minimalist.basic.utils.UnqIdUtil;
import com.minimalist.basic.utils.ValidateUtil;
import com.mybatisflex.core.query.QueryWrapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime;
@Slf4j
@Service
public class LocalFileHandler implements FileHandler {
@Value("${server.servlet.context-path}")
private String contextPath;
@Autowired
private FileManager fileManager;
@Autowired
private MFileMapper fileMapper;
@Autowired
private MStorageMapper storageMapper;
/**
* 是否是对应的处理类
* @param storageType 存储类型
* @return 处理类
*/
@Override
public boolean isHandler(String storageType) {
return StorageEnum.StorageType.LOCAL.getCode().equals(storageType);
}
/**
* 参数校验
* @param storageConfig JSON存储配置信息
*/
@Override
public String valid(String storageConfig) {
LocalFileEntity localFileEntity = JSONUtil.toBean(storageConfig, LocalFileEntity.class);
ValidateUtil.valid(localFileEntity);
//格式化路径
String normalize = FileUtil.normalize(localFileEntity.getStoragePath());
localFileEntity.setStoragePath(normalize);
return JSONUtil.toJsonStr(localFileEntity);
}
/**
* 单文件上传
* @param multipartFile 文件
* @param fileSource 文件来源
* @param storage 存储信息
* @return 文件信息
*/
@Override
public MFile uploadFile(MultipartFile multipartFile, Integer fileSource, MStorage storage) {
//根据文件来源,获取相对路径
String fileSourcePath = fileManager.getPathByFileSource(fileSource);
//本地存储路径
LocalFileEntity localFileEntity = JSONUtil.toBean(storage.getStorageConfig(), LocalFileEntity.class);
String storagePath = localFileEntity.getStoragePath();
//文件后缀
String fileSuffix = FileNameUtil.extName(multipartFile.getOriginalFilename());
//新文件名
String newFileName = IdUtil.objectId() + "." + fileSuffix;
//拼接路径
String path = FileUtil.normalize(storagePath + "/" + fileSourcePath + newFileName);
//request请求信息
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + contextPath + "/files/";
//返回的文件信息
MFile fileInfo = new MFile();
fileInfo.setFileId(UnqIdUtil.uniqueId());
fileInfo.setFileName(multipartFile.getOriginalFilename());
fileInfo.setNewFileName(newFileName);
fileInfo.setFileSize(multipartFile.getSize());
fileInfo.setFileType(multipartFile.getContentType());
fileInfo.setFileBasePath(storagePath);
fileInfo.setFilePath(FileUtil.normalize(storagePath + "/" + fileSourcePath));
fileInfo.setFileUrl(url + fileSourcePath + newFileName);
fileInfo.setFileSource(fileSource);
fileInfo.setStorageId(storage.getStorageId());
//如果未指定文件来源,将状态置为正常
//因为这是从文件选择组件中上传的文件,不置为正常,在选择文件时查询条件是正常的才能被查出来
if (fileSource < CommonConstant.ZERO) {
fileInfo.setStatus(StatusEnum.STATUS_1.getCode());
}
try {
log.info("上传文件,路径:{}", path);
File file = FileUtil.touch(path);
multipartFile.transferTo(file);
if (StrUtil.isNotBlank(multipartFile.getContentType()) && multipartFile.getContentType().contains("image")) {
//如果是图片,生成缩略图
String thFileName = "thumbnail-" + newFileName;
String thPath = FileUtil.normalize(storagePath + "/" + fileSourcePath + "/" + thFileName);
File thFile = FileUtil.touch(thPath);
Thumbnails.of(file)
.scale(0.4)
.toFile(thFile);
fileInfo.setFileThUrl(url + fileSourcePath + thFileName);
fileInfo.setFileThFilename(thFileName);
fileInfo.setFileThSize(thFile.length());
}
} catch (IOException e) {
FileUtil.del(path);
log.warn("上传文件,异常:", e);
throw new BusinessException(FileEnum.ErrorMsg.FILE_UPLOAD_FAIL.getDesc());
}
return fileInfo;
}
/**
* 删除文件
* @param file 文件信息
* @return 是否删除成功
*/
@Override
public boolean deleteFile(MFile file, MStorage storage) {
String filePath = file.getFilePath() + file.getNewFileName();
boolean result = FileUtil.del(filePath);
//如果有缩略图,删除缩略图
if (StrUtil.isNotBlank(file.getFileThFilename())) {
String fileThPath = file.getFilePath() + file.getFileThFilename();
FileUtil.del(fileThPath);
}
return result;
}
/**
* 移动文件
* @param file 文件信息
* @param storage 存储信息
* @return 是否成功
*/
@Override
public boolean moveFile(MFile file, MStorage storage) {
//根据文件来源,获取相对路径
String fileSourcePath = fileManager.getPathByFileSource(file.getFileSource());
//本地存储路径
LocalFileEntity localFileEntity = JSONUtil.toBean(storage.getStorageConfig(), LocalFileEntity.class);
String storagePath = localFileEntity.getStoragePath();
//request请求信息
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
String url = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + contextPath + "/files/";
//源文件路径
Path sourcePath = Paths.get(FileUtil.normalize(file.getFilePath() + "/" + file.getNewFileName()));
//目标文件路径
Path targetPath = Paths.get(FileUtil.normalize(storagePath + "/" + fileSourcePath + "/" + file.getNewFileName()));
try {
FileUtil.move(sourcePath, targetPath, true);
//修改文件url
file.setFileUrl(url + fileSourcePath + file.getNewFileName());
//如果有缩略图,需要将缩略图移动
if (StrUtil.isNotBlank(file.getFileThFilename())) {
//源文件路径
Path sourcePathTh = Paths.get(FileUtil.normalize(file.getFilePath() + "/" + file.getFileThFilename()));
//目标文件路径
Path targetPathTh = Paths.get(FileUtil.normalize(storagePath + "/" + fileSourcePath + "/" + file.getFileThFilename()));
//移动缩略图
FileUtil.move(sourcePathTh, targetPathTh, true);
//修改缩略图url
file.setFileThUrl(url + fileSourcePath + file.getFileThFilename());
}
//修改文件路径
file.setFilePath(FileUtil.normalize(storagePath + "/" + fileSourcePath));
return true;
} catch (Exception e) {
log.warn("移动文件,异常:", e);
}
return false;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/handler/impl/MinIOFileHandler.java
================================================
package com.minimalist.basic.config.fileHandler.handler.impl;
import cn.hutool.json.JSONUtil;
import com.minimalist.basic.config.fileHandler.entity.MinIOFileEntity;
import com.minimalist.basic.config.fileHandler.handler.FileHandler;
import com.minimalist.basic.entity.enums.StorageEnum;
import com.minimalist.basic.entity.po.MFile;
import com.minimalist.basic.entity.po.MStorage;
import com.minimalist.basic.utils.ValidateUtil;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
@Service
public class MinIOFileHandler implements FileHandler {
/**
* 是否是对应的处理类
* @param storageType 存储类型
* @return 处理类
*/
@Override
public boolean isHandler(String storageType) {
return StorageEnum.StorageType.MINIO.getCode().equals(storageType);
}
/**
* 参数校验
* @param storageConfig JSON存储配置信息
*/
@Override
public String valid(String storageConfig) {
MinIOFileEntity minIOFileEntity = JSONUtil.toBean(storageConfig, MinIOFileEntity.class);
ValidateUtil.valid(minIOFileEntity);
return storageConfig;
}
/**
* 单文件上传
* @param multipartFile 文件
* @param fileSource 文件来源
* @param storage 存储信息
* @return 文件信息
*/
@Override
public MFile uploadFile(MultipartFile multipartFile, Integer fileSource, MStorage storage) {
//没做,做了需要引jar包,可自行实现
return null;
}
/**
* 删除文件
* @param file 文件信息
* @return 是否删除成功
*/
@Override
public boolean deleteFile(MFile file, MStorage storage) {
//没做,做了需要引jar包,可自行实现
return false;
}
/**
* 移动文件
* @param file 文件信息
* @param storage 存储信息
* @return 是否成功
*/
@Override
public boolean moveFile(MFile file, MStorage storage) {
//没做,做了需要引jar包,可自行实现
return false;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/handler/impl/QiNiuFileHandler.java
================================================
package com.minimalist.basic.config.fileHandler.handler.impl;
import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.minimalist.basic.config.exception.BusinessException;
import com.minimalist.basic.config.fileHandler.FileManager;
import com.minimalist.basic.config.fileHandler.entity.QiNiuFileEntity;
import com.minimalist.basic.config.fileHandler.handler.FileHandler;
import com.minimalist.basic.entity.enums.FileEnum;
import com.minimalist.basic.entity.enums.StatusEnum;
import com.minimalist.basic.entity.enums.StorageEnum;
import com.minimalist.basic.entity.po.MFile;
import com.minimalist.basic.entity.po.MStorage;
import com.minimalist.basic.mapper.MFileMapper;
import com.minimalist.basic.mapper.MStorageMapper;
import com.minimalist.basic.utils.*;
import com.qiniu.common.QiniuException;
import com.qiniu.http.Response;
import com.qiniu.storage.BucketManager;
import com.qiniu.storage.Configuration;
import com.qiniu.storage.Region;
import com.qiniu.storage.UploadManager;
import com.qiniu.util.Auth;
import com.qiniu.util.StringMap;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayOutputStream;
@Slf4j
@Service
public class QiNiuFileHandler implements FileHandler {
@Autowired
private FileManager fileManager;
@Autowired
private MFileMapper fileMapper;
@Autowired
private MStorageMapper storageMapper;
/**
* 是否是对应的处理类
* @param storageType 存储类型
* @return 处理类
*/
@Override
public boolean isHandler(String storageType) {
return StorageEnum.StorageType.QINIU.getCode().equals(storageType);
}
/**
* 参数校验
* @param storageConfig JSON存储配置信息
*/
@Override
public String valid(String storageConfig) {
QiNiuFileEntity qiNiuFileEntity = JSONUtil.toBean(storageConfig, QiNiuFileEntity.class);
ValidateUtil.valid(qiNiuFileEntity);
return storageConfig;
}
/**
* 单文件上传
* @param multipartFile 文件
* @param fileSource 文件来源
* @param storage 存储信息
* @return 文件信息
*/
@Override
public MFile uploadFile(MultipartFile multipartFile, Integer fileSource, MStorage storage) {
//根据文件来源,获取相对路径
String fileSourcePath = fileManager.getPathByFileSource(fileSource);
//文件后缀
String fileSuffix = FileNameUtil.extName(multipartFile.getOriginalFilename());
//新文件名
String newFileName = IdUtil.objectId() + "." + fileSuffix;
//文件信息
QiNiuFileEntity qnConfig = JSONUtil.toBean(storage.getStorageConfig(), QiNiuFileEntity.class);
MFile fileInfo = new MFile();
fileInfo.setFileId(UnqIdUtil.uniqueId());
fileInfo.setFileName(multipartFile.getOriginalFilename());
fileInfo.setNewFileName(newFileName);
fileInfo.setFileSize(multipartFile.getSize());
fileInfo.setFileType(multipartFile.getContentType());
//基础路径 = 租户ID
String basePath = String.valueOf(TenantUtil.getTenantId());
fileInfo.setFileBasePath(basePath);
String fileKey = basePath + "/" + fileSourcePath + newFileName;
fileInfo.setFilePath(basePath + "/" + fileSourcePath);
fileInfo.setFileUrl(TextUtil.urlNormalize(qnConfig.getEndPoint() + "/" + fileKey));
fileInfo.setFileSource(fileSource);
fileInfo.setStorageId(storage.getStorageId());
//如果未指定文件来源,将状态置为正常
//因为这是从文件选择组件中上传的文件,不置为正常,在选择文件时查询条件是正常的才能被查出来
if (fileSource < CommonConstant.ZERO) {
fileInfo.setStatus(StatusEnum.STATUS_1.getCode());
}
try {
Auth auth = Auth.create(qnConfig.getAccessKey(), qnConfig.getSecretKey());
String upToken = auth.uploadToken(qnConfig.getBucketName());
Configuration cfg = new Configuration(Region.createWithRegionId(qnConfig.getRegionId()));
UploadManager uploadManager = new UploadManager(cfg);
StringMap params = new StringMap();
params.put("tenantId", basePath);
Response response = uploadManager.put(multipartFile.getInputStream(), fileKey, upToken, params, null);
if (!response.isOK()) {
log.error("上传文件失败:{}", JSONUtil.toJsonStr(response));
throw new BusinessException(FileEnum.ErrorMsg.FILE_UPLOAD_FAIL.getDesc());
}
//生成图片缩略图
if (StrUtil.isNotBlank(multipartFile.getContentType()) && multipartFile.getContentType().contains("image")) {
ByteArrayOutputStream thumbnailOutputStream = new ByteArrayOutputStream();
Thumbnails.of(multipartFile.getInputStream())
.scale(0.4)
.toOutputStream(thumbnailOutputStream);
byte[] fileByte = thumbnailOutputStream.toByteArray();
String thFileName = "thumbnail-" + newFileName;
String thumbnailsFileKey = basePath + "/" + fileSourcePath + thFileName;
Response thumbnailsResponse = uploadManager.put(fileByte, thumbnailsFileKey, upToken, params, null, false);
if (thumbnailsResponse.isOK()) {
fileInfo.setFileThUrl(qnConfig.getEndPoint() + "/" + thumbnailsFileKey);
fileInfo.setFileThFilename(thFileName);
fileInfo.setFileThSize((long) fileByte.length);
} else {
log.error("上传缩略图失败:{}", JSONUtil.toJsonStr(thumbnailsResponse));
throw new BusinessException(FileEnum.ErrorMsg.FILE_THUMBNAILS_UPLOAD_FAIL.getDesc());
}
}
} catch (Exception e) {
//删除刚上传的图片
deleteFile(fileInfo, storage);
log.error("上传文件,异常:", e);
throw new BusinessException(FileEnum.ErrorMsg.FILE_UPLOAD_FAIL.getDesc());
}
return fileInfo;
}
/**
* 删除文件
* @param file 文件信息
* @return 是否删除成功
*/
@Override
public boolean deleteFile(MFile file, MStorage storage) {
try {
QiNiuFileEntity qnConfig = JSONUtil.toBean(storage.getStorageConfig(), QiNiuFileEntity.class);
Auth auth = Auth.create(qnConfig.getAccessKey(), qnConfig.getSecretKey());
Configuration cfg = new Configuration(Region.createWithRegionId(qnConfig.getRegionId()));
BucketManager bucketManager = new BucketManager(auth, cfg);
Response response = bucketManager.delete(qnConfig.getBucketName(), file.getFilePath() + file.getNewFileName());
if (!response.isOK()) {
log.warn("删除文件失败:{}", JSONUtil.toJsonStr(response));
return false;
}
//如果存在缩略图,删除
if (StrUtil.isNotBlank(file.getFileThFilename())) {
//删除缩略图
bucketManager.delete(qnConfig.getBucketName(), file.getFilePath() + file.getFileThFilename());
}
return true;
} catch (Exception e) {
log.error("删除文件失败:", e);
}
return false;
}
/**
* 移动文件
* @param file 文件信息
* @param storage 存储信息
* @return 是否成功
*/
public boolean moveFile(MFile file, MStorage storage) {
try {
QiNiuFileEntity qnConfig = JSONUtil.toBean(storage.getStorageConfig(), QiNiuFileEntity.class);
Auth auth = Auth.create(qnConfig.getAccessKey(), qnConfig.getSecretKey());
Configuration cfg = new Configuration(Region.createWithRegionId(qnConfig.getRegionId()));
BucketManager bucketManager = new BucketManager(auth, cfg);
//源文件名
String fromKey = file.getFilePath() + file.getNewFileName();
//基础路径 = 租户ID
String basePath = String.valueOf(TenantUtil.getTenantId());
//根据文件来源,获取相对路径
String fileSourcePath = fileManager.getPathByFileSource(file.getFileSource());
//目标文件名
String toKey = basePath + "/" + fileSourcePath + file.getNewFileName();
//移动文件
Response response = bucketManager.move(qnConfig.getBucketName(), fromKey, qnConfig.getBucketName(), toKey, true);
if (!response.isOK()) {
log.warn("移动文件失败:{}", JSONUtil.toJsonStr(response));
return false;
}
//修改文件url
file.setFileUrl(TextUtil.urlNormalize(qnConfig.getEndPoint() + "/" + toKey));
//如果有缩略图,需要将缩略图移动
if (StrUtil.isNotBlank(file.getFileThFilename())) {
//源文件名
String fromKeyTh = file.getFilePath() + file.getFileThFilename();
//目标文件名
String toKeyTh = basePath + "/" + fileSourcePath + file.getFileThFilename();
//移动文件
Response responseTh = bucketManager.move(qnConfig.getBucketName(), fromKeyTh, qnConfig.getBucketName(), toKeyTh, true);
if (!responseTh.isOK()) {
log.warn("移动文件失败:{}", JSONUtil.toJsonStr(responseTh));
return false;
}
//修改缩略图url
file.setFileThUrl(TextUtil.urlNormalize(qnConfig.getEndPoint() + "/" + toKeyTh));
}
//修改文件路径
file.setFilePath(basePath + "/" + fileSourcePath);
return true;
} catch (QiniuException ex) {
log.error("移动文件失败,错误码:{},错误信息:{}", ex.code(), ex.response.toString());
log.error("移动文件失败:", ex);
} catch (Exception e) {
log.error("移动文件失败:", e);
}
return false;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/GeneratorCodeHandler.java
================================================
package com.minimalist.basic.config.mybatis;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.codegen.Generator;
import com.mybatisflex.codegen.config.GlobalConfig;
import com.mybatisflex.codegen.config.TableConfig;
import com.zaxxer.hikari.HikariDataSource;
/**
* 配置Mybatis-Flex生成代码
*/
public class GeneratorCodeHandler {
public static final String url = "jdbc:mysql://127.0.0.1:3306/minimalist?characterEncoding=utf-8";
public static final String username = "root";
public static final String password = "123456";
public static void main(String[] args) {
//配置数据源
HikariDataSource dataSource = new HikariDataSource();
dataSource.setJdbcUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
//项目根目录
String projectPath = System.getProperty("user.dir");
//生成配置
GlobalConfig globalConfig = new GlobalConfig();
//设置根包
globalConfig.setBasePackage("com.minimalist.basic");
//生成路径
globalConfig.setSourceDir(projectPath + "\\generator\\java");
/* ------------------------ 实体配置 ------------------------ */
//生成实体
globalConfig.setEntityGenerateEnable(true);
//使用lombok
globalConfig.setEntityWithLombok(true);
//设置项目的JDK版本,项目的JDK为14及以上时建议设置该项,小于14则可以不设置
globalConfig.setEntityJdkVersion(17);
//设置生成 entity 包名
globalConfig.setEntityPackage("com.minimalist.basic.entity.po");
//自动填充
TableConfig tableConfig = new TableConfig();
tableConfig.setInsertListenerClass(InsertFullColumnHandler.class);
tableConfig.setUpdateListenerClass(UpdateFullColumnHandler.class);
globalConfig.setTableConfig(tableConfig);
//设置实体类的父类
globalConfig.setEntitySuperClass(BaseEntity.class);
//父类字段忽略
globalConfig.getStrategyConfig()
.setIgnoreColumns("id", "deleted", "create_time", "create_id", "update_id", "update_time", "version");
/* ------------------------ mapper 配置 ------------------------ */
//设置生成 mapper
globalConfig.setMapperGenerateEnable(true);
//mapper包
globalConfig.setMapperPackage("com.minimalist.basic.mapper");
//生成mapper xml文件
globalConfig.enableMapperXml();
//生成mapper.xml路径
globalConfig.setMapperXmlPath(projectPath + "/generator/resources/mapper");
/* ------------------------ 生成哪些表 ------------------------ */
globalConfig.setGenerateTable(
"m_config",
"m_dept",
"m_dict",
"m_file",
"m_notice",
"m_perms",
"m_post",
"m_role",
"m_role_dept",
"m_role_perm",
"m_storage",
"m_tenant",
"m_tenant_package",
"m_tenant_package_perm",
"m_user",
"m_user_dept",
"m_user_post",
"m_user_role"
);
//是否生成service和controller
globalConfig.setServiceGenerateEnable(true);
globalConfig.setServiceImplGenerateEnable(true);
globalConfig.setControllerGenerateEnable(true);
//通过 datasource 和 globalConfig 创建代码生成器
Generator generatorHandler = new Generator(dataSource, globalConfig);
generatorHandler.generate();
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/InsertFullColumnHandler.java
================================================
package com.minimalist.basic.config.mybatis;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.minimalist.basic.utils.CommonConstant;
import com.mybatisflex.annotation.InsertListener;
import org.springframework.stereotype.Component;
/**
* Mybatis-Flex 插入时字段自动填充。注:xml中和Db+Row插入不会生效需要手动set
*/
@Component
public class InsertFullColumnHandler implements InsertListener {
@Override
public void onInsert(Object entity) {
BaseEntity t = (BaseEntity) entity;
SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
if (ObjectUtil.isNotNull(tokenInfo) && ObjectUtil.isNotNull(tokenInfo.getLoginId())) {
long userId = Long.parseLong(tokenInfo.getLoginId().toString());
t.setCreateId(userId);
t.setUpdateId(userId);
} else {
t.setCreateId((long) CommonConstant.ZERO);
t.setUpdateId((long) CommonConstant.ZERO);
}
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/MyBatisFlexConfiguration.java
================================================
package com.minimalist.basic.config.mybatis;
import com.minimalist.basic.utils.TenantUtil;
import com.mybatisflex.core.audit.AuditManager;
import com.mybatisflex.core.tenant.TenantManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyBatisFlexConfiguration {
private static final Logger logger = LoggerFactory.getLogger("mybatis-flex-sql");
public MyBatisFlexConfiguration() {
//开启审计功能
AuditManager.setAuditEnable(true);
//设置 SQL 审计收集器
AuditManager.setMessageCollector(auditMessage ->
logger.info("{},{} ms", auditMessage.getFullSql(), auditMessage.getElapsedTime())
);
//获取租户ID,目前支持返回一个租户ID
TenantManager.setTenantFactory(() -> {
//校验系统多租户是否开启
if (!TenantUtil.checkTenantOnOff()) {
//未打开,忽略多租户
return null;
}
//放回当前要操作的租户ID
return new Object[]{ TenantUtil.getTenantId() };
});
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/UpdateFullColumnHandler.java
================================================
package com.minimalist.basic.config.mybatis;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.ObjectUtil;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.minimalist.basic.utils.CommonConstant;
import com.mybatisflex.annotation.UpdateListener;
import org.springframework.stereotype.Component;
/**
* Mybatis-Flex 修改时字段自动填充。注:xml中和Db+Row插入不会生效需要手动set
*/
@Component
public class UpdateFullColumnHandler implements UpdateListener {
@Override
public void onUpdate(Object entity) {
BaseEntity t = (BaseEntity) entity;
SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
if (ObjectUtil.isNotNull(tokenInfo) && ObjectUtil.isNotNull(tokenInfo.getLoginId())) {
long userId = Long.parseLong(tokenInfo.getLoginId().toString());
t.setUpdateId(userId);
} else {
t.setUpdateId((long) CommonConstant.ZERO);
}
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/bo/BaseEntity.java
================================================
package com.minimalist.basic.config.mybatis.bo;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import lombok.Getter;
import lombok.Setter;
import java.time.LocalDateTime;
@Getter
@Setter
public class BaseEntity {
/** ID自增 */
@Id(keyType = KeyType.Auto)
private Long id;
/** 逻辑删除 */
@Column(isLogicDelete = true)
private Boolean deleted;
/** 创建人ID */
private Long createId;
/** 更新人ID */
private Long updateId;
/** 创建时间 */
@Column(onInsertValue = "now()")
private LocalDateTime createTime;
/** 更新时间 */
@Column(onInsertValue = "now()", onUpdateValue = "now()")
private LocalDateTime updateTime;
/** 版本号 */
@Column(version = true, onInsertValue = "0", onUpdateValue = "version + 1")
private Integer version;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/bo/PageReq.java
================================================
package com.minimalist.basic.config.mybatis.bo;
import lombok.Getter;
import lombok.Setter;
/**
* 分页请求
*/
@Getter
@Setter
public class PageReq {
/** 页码 */
private Long pageNum = 1L;
/** 分页条数 默认10条 */
private Long pageSize = 10L;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/bo/PageResp.java
================================================
package com.minimalist.basic.config.mybatis.bo;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.Collections;
import java.util.List;
/**
* 分页响应
*/
@Data
@AllArgsConstructor
public class PageResp<T> {
/** 数据 */
private List<T> records = Collections.emptyList();
/** 总条数 */
private long total = 0;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/redis/RedisManager.java
================================================
package com.minimalist.basic.config.redis;
import lombok.extern.slf4j.Slf4j;
import org.redisson.api.RBucket;
import org.redisson.api.RLock;
import org.redisson.api.RTopic;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.concurrent.TimeUnit;
@Slf4j
@Component
public class RedisManager {
@Autowired
private RedissonClient redissonClient;
/**
* 获取缓存
* @param key 缓存key
* @param <T> 泛型
* @return 泛型
*/
public <T> T get(String key) {
RBucket<T> bucket = redissonClient.getBucket(key);
return bucket.get();
}
/**
* 获取缓存 并删除
* @param key 缓存key
* @param <T> 泛型
* @return 泛型
*/
public <T> T getAndDelete(String key) {
RBucket<T> bucket = redissonClient.getBucket(key);
return bucket.getAndDelete();
}
/**
* 删除缓存
* @param key 缓存key
*/
public void delete(String key) {
redissonClient.getBucket(key).delete();
}
/**
* 存放缓存
* @param key 缓存key
* @param value 缓存value
* @param seconds 过期时间: 秒
* @param <T> 泛型
*/
public <T> void set(String key, T value, int seconds) {
RBucket<T> bucket = redissonClient.getBucket(key);
bucket.set(value, seconds, TimeUnit.SECONDS);
}
/**
* 获取分布式锁
* @param key 缓存key
* @param waitTime 获取锁时等待的时间
* @param leaseTime 持有锁的时间
* @return true获取到锁,false未获取到
*/
public boolean tryLock(String key, long waitTime, long leaseTime) {
RLock lock = redissonClient.getLock(key);
try {
return lock.tryLock(waitTime, leaseTime, TimeUnit.MILLISECONDS);
} catch (InterruptedException e) {
log.error("尝试获取分布式锁异常:", e);
}
return false;
}
/**
* 释放锁
* @param key 缓存key
*/
public void unLock(String key) {
RLock lock = redissonClient.getLock(key);
//检查是否已加锁,已加锁返回true
if (lock.isLocked()) {
//检查是否是当前线程加的锁,是同一线程则释放锁
if (lock.isHeldByCurrentThread()) {
lock.unlock();
}
}
}
/**
* 随机秒数
* @return 秒数
*/
public int randomSeconds() {
return BigDecimal.valueOf(Math.random()).multiply(new BigDecimal(20)).intValue();
}
/**
* 发布消息
* @param topic 主题
* @param message 消息
*/
public void publishMessage(String topic, String message) {
RTopic rTopic = redissonClient.getTopic(topic);
rTopic.publish(message);
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/redis/RedissonConfiguration.java
================================================
package com.minimalist.basic.config.redis;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.codec.JsonJacksonCodec;
import org.redisson.config.Config;
import org.redisson.config.SingleServerConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
@Configuration
public class RedissonConfiguration {
@Autowired
private Environment environment;
/**
* redisson单节点
* @return RedissonClient
*/
@Bean
public RedissonClient getSingleRedissonClient() {
Config config = new Config();
String address = environment.getProperty("redisson.address");
String password = environment.getProperty("redisson.password");
Integer pingInterval = environment.getProperty("redisson.pingInterval", Integer.class);
Integer connectionPoolSize = environment.getProperty("redisson.connectionPoolSize", Integer.class);
Integer connectionMinimumIdleSize = environment.getProperty("redisson.connectionMinimumIdleSize", Integer.class);
Integer database = environment.getProperty("redisson.database", Integer.class);
SingleServerConfig singleServerConfig = config.useSingleServer()
.setAddress(address)
.setKeepAlive(true)
.setDatabase(database)
.setConnectionPoolSize(connectionPoolSize)
.setConnectionMinimumIdleSize(connectionMinimumIdleSize)
.setPingConnectionInterval(pingInterval);
if (StrUtil.isNotBlank(password)) {
singleServerConfig.setPassword(password);
}
//设置redisson序列化与反序列化,jackson增加java时间模块处理
JsonJacksonCodec jsonJacksonCodec = new JsonJacksonCodec();
ObjectMapper objectMapper = jsonJacksonCodec.getObjectMapper();
objectMapper.registerModule(new JavaTimeModule());
config.setCodec(jsonJacksonCodec);
return Redisson.create(config);
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/resubmit/ReSubmit.java
================================================
package com.minimalist.basic.config.resubmit;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface ReSubmit {
/**
* 持有锁的租期时间
* 第一次请求和第二次请求,时间相隔 leaseTime 毫秒算重复请求,将被拒绝
*/
long leaseTime() default 3000;
/**
* 获取锁时,等待 waitTime 毫秒,超过 waitTimeout 毫秒,就不再尝试获取锁
* 默认 0 不等待,即获取锁时只要获取不到就返回
*/
long waitTime() default 0;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/resubmit/ReSubmitAspect.java
================================================
package com.minimalist.basic.config.resubmit;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ClassUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.extra.servlet.JakartaServletUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.minimalist.basic.config.redis.RedisManager;
import com.minimalist.basic.entity.enums.RespEnum;
import com.minimalist.basic.utils.RedisKeyConstant;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;
import java.util.Comparator;
import java.util.TreeMap;
/**
* 防重复提交处理
*/
@Slf4j
@Aspect
@Component
public class ReSubmitAspect {
@Autowired
private RedisManager redisManager;
@Around("@annotation(re)")
public Object around(ProceedingJoinPoint joinPoint, ReSubmit re) throws Throwable {
Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
ReSubmit reSubmit = method.getAnnotation(ReSubmit.class);
//如果不需要防重复提交校验,则放行
if (ObjectUtil.isNull(reSubmit)) {
return joinPoint.proceed();
}
//获取请求参数
String lockKey = getReqParams(joinPoint, method);
//根据请求参数,加锁
boolean acquireLock = redisManager.tryLock(lockKey, reSubmit.waitTime(), reSubmit.leaseTime());
//重复提交
if (!acquireLock) {
return ResponseEntity.status(HttpStatus.SERVICE_UNAVAILABLE).body(RespEnum.RESUBMIT_ERROR.getDesc());
}
try {
return joinPoint.proceed();
} finally {
redisManager.unLock(lockKey);
}
}
/**
* 获取请求参数
* @param joinPoint joinPoint
* @return 缓存key
*/
private String getReqParams(ProceedingJoinPoint joinPoint, Method method) {
//获取请求参数
Object [] args = joinPoint.getArgs();
//方法的参数
Parameter[] parameters = method.getParameters();
//参数有序存放
TreeMap<String, Object> paramTreeMap = MapUtil.newTreeMap(Comparator.naturalOrder());
//参数转为key
if (ArrayUtil.isNotEmpty(args) && ArrayUtil.isNotEmpty(parameters) && args.length == parameters.length) {
//取参数
for (int i = 0; i < args.length; i++) {
//参数值
Object arg = args[i];
//参数
Parameter param = parameters[i];
//是否为基本数据类型,可能是单参数
boolean basicType = ClassUtil.isBasicType(arg.getClass());
if (basicType || arg instanceof String) {
paramTreeMap.put(param.getName(), arg);
} else {
//其余参数视为对象,转Map
String json = JSONUtil.toJsonStr(arg);
JSONObject jsonObject = JSONUtil.parseObj(json);
paramTreeMap.putAll(jsonObject);
}
}
return StrUtil.indexedFormat(RedisKeyConstant.REPEAT_SUBMIT_KEY, SecureUtil.sha256(JSONUtil.toJsonStr(paramTreeMap)));
}
//获取IP
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
//使用 IP:包.类名.方法名 生成一个key
String sha256 = SecureUtil.sha256(JakartaServletUtil.getClientIP(request) + ":" + method.getDeclaringClass().getName() + "." + method.getName());
return StrUtil.indexedFormat(RedisKeyConstant.REPEAT_SUBMIT_KEY, sha256);
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/swagger/ParameterHandler.java
================================================
package com.minimalist.basic.config.swagger;
import cn.hutool.core.util.ObjectUtil;
import io.swagger.v3.oas.models.parameters.Parameter;
import lombok.extern.slf4j.Slf4j;
import org.springdoc.core.customizers.ParameterCustomizer;
import org.springframework.core.MethodParameter;
/**
* 对单字段的枚举进行处理
* 单字段对应的swagger注解:@Parameter
*/
@Slf4j
public class ParameterHandler extends SchemaEnumHandler implements ParameterCustomizer {
@Override
public Parameter customize(Parameter property, MethodParameter parameter) {
//检查是否包含自定义注解
SchemaEnum schemaEnumAnnotation = getSchemaEnumAnnotation(parameter.getParameterAnnotations());
if (ObjectUtil.isNull(schemaEnumAnnotation)) {
return property;
}
String columnDescription = getColumnDescription(schemaEnumAnnotation, property.getDescription());
property.setDescription(columnDescription);
return property;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/swagger/PropertyHandler.java
================================================
package com.minimalist.basic.config.swagger;
import cn.hutool.core.util.ObjectUtil;
import io.swagger.v3.core.converter.AnnotatedType;
import io.swagger.v3.oas.models.media.Schema;
import lombok.extern.slf4j.Slf4j;
import org.springdoc.core.customizers.PropertyCustomizer;
/**
* 对实体类中的枚举进行处理
* 实体类中对应的swagger注解:@Schema
*/
@Slf4j
public class PropertyHandler extends SchemaEnumHandler implements PropertyCustomizer {
@Override
public Schema customize(Schema property, AnnotatedType type) {
//检查是否包含自定义注解
SchemaEnum schemaEnumAnnotation = getSchemaEnumAnnotation(type.getCtxAnnotations());
if (ObjectUtil.isNull(schemaEnumAnnotation)) {
return property;
}
String columnDescription = getColumnDescription(schemaEnumAnnotation, property.getDescription());
property.setDescription(columnDescription);
return property;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/swagger/SchemaEnum.java
================================================
package com.minimalist.basic.config.swagger;
import java.lang.annotation.*;
/**
* swagger 实体中枚举值处理注解
*/
@Target({ElementType.FIELD, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SchemaEnum {
/** 枚举中取key值的方法名 */
String keyMethodName() default "getCode";
/** 枚举中取value值的方法名 */
String valueMethodName() default "getDesc";
/** 枚举 */
Class<? extends Enum> implementation();
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/swagger/SchemaEnumHandler.java
================================================
package com.minimalist.basic.config.swagger;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.AnnotationUtils;
import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.Optional;
import java.util.StringJoiner;
@Slf4j
public class SchemaEnumHandler {
/**
* 查找注解
* @param annotations 注解数组
* @return SchemaEnum注解
*/
protected SchemaEnum getSchemaEnumAnnotation(Annotation[] annotations) {
if (ArrayUtil.isEmpty(annotations)) {
return null;
}
for (Annotation annotation : annotations) {
SchemaEnum anno = AnnotationUtils.getAnnotation(annotation, SchemaEnum.class);
if (ObjectUtil.isNotNull(anno)) {
return anno;
}
}
return null;
}
/**
* 获取枚举里的方法,并执行取值
* @param enumClass 枚举
* @param method 方法名
* @return 值
*/
protected Object getEnumMethodValue(Enum enumClass, String method) {
try {
Method m = enumClass.getClass().getMethod(method);
return m.invoke(enumClass);
} catch (Exception e) {
log.warn("swagger自定义处理,获取枚举中 {} 方法异常,", method, e);
}
return null;
}
/**
* 根据注解获取描述
* @param schemaEnumAnnotation swagger自定义枚举处理注解
* @param sourceDescription 字段swagger原始描述
* @return 文字描述
*/
protected String getColumnDescription(SchemaEnum schemaEnumAnnotation, String sourceDescription) {
//枚举
Class<? extends Enum> enumClass = schemaEnumAnnotation.implementation();
//将枚举转为文字描述
StringJoiner sj = new StringJoiner(", ");
for (Enum enumConstant : enumClass.getEnumConstants()) {
Object key = getEnumMethodValue(enumConstant, schemaEnumAnnotation.keyMethodName());
Object value = getEnumMethodValue(enumConstant, schemaEnumAnnotation.valueMethodName());
sj.add(key + ": " + value);
}
return Optional.ofNullable(sourceDescription)
.map(s -> s + " -> ")
.orElse("")
+ sj;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/swagger/SwaggerConfig.java
================================================
package com.minimalist.basic.config.swagger;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Contact;
import io.swagger.v3.oas.models.info.Info;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SwaggerConfig {
/** 标题 */
@Value("${springdoc.title}")
private String title;
/** 作者 */
@Value("${springdoc.authorName}")
private String authorName;
/** 作者主页 */
@Value("${springdoc.authorUrl}")
private String authorUrl;
/** 作者Email */
@Value("${springdoc.authorEmail}")
private String authorEmail;
@Bean
public OpenAPI openApi() {
return new OpenAPI().info(new Info()
//文档页面标题
.title(title)
//描述
.description(title + "接口文档")
//版本号
.version("1.0.0-SNAPSHOT")
//作者信息
.contact(new Contact().name(authorName).email(authorEmail).url(authorUrl)));
}
@Bean
@ConditionalOnMissingBean
public PropertyHandler propertyHandler() {
return new PropertyHandler();
}
@Bean
@ConditionalOnMissingBean
public ParameterHandler parameterHandler() {
return new ParameterHandler();
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/tenant/TenantDatasourceInterceptor.java
================================================
package com.minimalist.basic.config.tenant;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import com.minimalist.basic.entity.enums.TenantEnum;
import com.minimalist.basic.entity.vo.tenant.TenantVO;
import com.minimalist.basic.utils.CommonConstant;
import com.minimalist.basic.utils.TenantUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
/**
* 租户数据源切换拦截器
*/
@Slf4j
public class TenantDatasourceInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//校验系统多租户是否开启
if (!TenantUtil.checkTenantOnOff()) {
//未打开,忽略多租户,继续使用主数据源
return HandlerInterceptor.super.preHandle(request, response, handler);
}
String requestURI = request.getRequestURI();
log.info("切换数据源,访问非/basic接口,经过多数据源拦截器, 当前路径是:{}", requestURI);
//获取要操作的租户ID
long tenantId = TenantUtil.getTenantId();
//如果是系统租户,使用主数据源
if (CommonConstant.ZERO == tenantId) {
log.info("切换数据源,[系统租户] => 继续使用主数据源,租户ID:{}", tenantId);
} else {
//如果非系统租户,检查是否需要切换到租户数据源
TenantVO tenantVO = CommonConstant.tenantMap.get(tenantId);
//该租户数据隔离方式 != master,表示需要切换到租户自己的数据源
if (ObjectUtil.isNotNull(tenantVO) && !TenantEnum.MASTER.equals(tenantVO.getDatasource())) {
log.info("切换数据源,[其他租户] => 切换到租户数据源,租户ID:{}", tenantId);
DynamicDataSourceContextHolder.push(String.valueOf(tenantId));
}
}
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
//清空线程内数据源信息
DynamicDataSourceContextHolder.clear();
log.info("切换数据源,清空数据源");
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/tenant/TenantIgnore.java
================================================
package com.minimalist.basic.config.tenant;
import java.lang.annotation.*;
/**
* 注解加到方法上,标识此方法忽略多租户(异步方法无效)
*/
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface TenantIgnore {
/** 多租户字段 */
String TENANT_ID = "tenant_id";
/** 租户切换,多租户字段 */
String CHANGE_TENANT_ID = "change_tenant_id";
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/tenant/TenantIgnoreAspect.java
================================================
package com.minimalist.basic.config.tenant;
import cn.hutool.core.util.ObjectUtil;
import com.mybatisflex.core.tenant.TenantManager;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
/**
* 忽略多租户处理
*/
@Slf4j
@Aspect
@Component
public class TenantIgnoreAspect {
@Around("@annotation(tenantIgnore)")
public Object around(ProceedingJoinPoint joinPoint, TenantIgnore tenantIgnore) throws Throwable {
Method method = ((MethodSignature) joinPoint.getSignature()).getMethod();
TenantIgnore it = method.getAnnotation(TenantIgnore.class);
if (ObjectUtil.isNull(it)) {
return joinPoint.proceed();
}
try {
//忽略多租户
TenantManager.ignoreTenantCondition();
//执行目标方法
return joinPoint.proceed();
} finally {
//恢复多租户
TenantManager.restoreTenantCondition();
}
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/tenant/TenantInit.java
================================================
package com.minimalist.basic.config.tenant;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.minimalist.basic.entity.enums.StatusEnum;
import com.minimalist.basic.entity.po.MConfig;
import com.minimalist.basic.entity.po.MStorage;
import com.minimalist.basic.entity.po.MTenant;
import com.minimalist.basic.entity.po.MTenantDatasource;
import com.minimalist.basic.entity.vo.storage.StorageVO;
import com.minimalist.basic.entity.vo.tenant.TenantDatasourceVO;
import com.minimalist.basic.entity.vo.tenant.TenantVO;
import com.minimalist.basic.manager.TenantManager;
import com.minimalist.basic.mapper.MConfigMapper;
import com.minimalist.basic.mapper.MStorageMapper;
import com.minimalist.basic.mapper.MTenantDatasourceMapper;
import com.minimalist.basic.mapper.MTenantMapper;
import com.minimalist.basic.utils.CommonConstant;
import com.mybatisflex.core.query.QueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;
@Component
public class TenantInit implements ApplicationRunner {
@Autowired
private MTenantMapper tenantMapper;
@Autowired
private MTenantDatasourceMapper tenantDatasourceMapper;
@Autowired
private TenantManager tenantManager;
@Autowired
private MStorageMapper storageMapper;
@Autowired
private MConfigMapper configMapper;
@Override
public void run(ApplicationArguments args) throws Exception {
//查询系统多租户开关
MConfig mConfig = configMapper.selectConfigByConfigKey(CommonConstant.SYSTEM_CONFIG_TENANT, StatusEnum.STATUS_1.getCode());
if (ObjectUtil.isNotNull(mConfig)) {
boolean tenantOnOff = Boolean.parseBoolean(mConfig.getConfigValue());
if (!tenantOnOff) {
//未打开多租户开关,忽略多租户
return;
}
}
List<MTenant> mTenants = tenantMapper.selectListByQuery(QueryWrapper.create()
.eq(MTenant::getStatus, StatusEnum.STATUS_1.getCode()));
//租户数据库隔离数据源
List<MTenantDatasource> tenantDatasourceList = tenantDatasourceMapper.selectAll();
Map<Long, MTenantDatasource> tenantDatasourceMap = tenantDatasourceList.stream().collect(Collectors.toMap(MTenantDatasource::getTenantId, Function.identity()));
//租户文件存储
List<MStorage> mStorages = storageMapper.selectListByQuery(QueryWrapper.create()
.eq(MStorage::getStatus, StatusEnum.STATUS_1.getCode()));
Map<Long, MStorage> storageMap = mStorages.stream().collect(Collectors.toMap(MStorage::getStorageId, Function.identity()));
for (MTenant tenant : mTenants) {
TenantVO tenantVO = BeanUtil.copyProperties(tenant, TenantVO.class);
//查询租户数据源
if (tenantDatasourceMap.containsKey(tenant.getTenantId())) {
//动态添加数据源
MTenantDatasource tenantDatasource = tenantDatasourceMap.get(tenant.getTenantId());
TenantDatasourceVO tenantDatasourceVO = BeanUtil.copyProperties(tenantDatasource, TenantDatasourceVO.class);
tenantManager.dynamicAddDatasource(tenant.getTenantId().toString(), tenantDatasourceVO);
//租户数据源信息
tenantVO.setTenantDatasource(tenantDatasourceVO);
}
//租户文件存储
MStorage storage = storageMap.get(tenant.getStorageId());
tenantVO.setStorage(BeanUtil.copyProperties(storage, StorageVO.class));
//缓存租户信息
CommonConstant.tenantMap.put(tenant.getTenantId(), tenantVO);
}
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/tenant/TenantWebMvcConfig.java
================================================
package com.minimalist.basic.config.tenant;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class TenantWebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TenantDatasourceInterceptor())
//排除/basic接口对数据源的限制,/basic只能使用master数据源
.excludePathPatterns("/basic/**")
.addPathPatterns("/**");
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/trace/TraceIdInterceptor.java
================================================
package com.minimalist.basic.config.trace;
import cn.hutool.core.util.IdUtil;
import com.minimalist.basic.utils.CommonConstant;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
/**
* 链路追踪拦截器
* 请求前添加traceId并放到响应头中,请求后将清除
*/
@Component
public class TraceIdInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String traceId = IdUtil.randomUUID();
MDC.put(CommonConstant.TRACE_ID, traceId);
response.setHeader(CommonConstant.TRACE_ID, traceId);
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
MDC.clear();
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/trace/WebMvcConfig.java
================================================
package com.minimalist.basic.config.trace;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Resource
private TraceIdInterceptor traceIdInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
WebMvcConfigurer.super.addInterceptors(registry);
registry.addInterceptor(traceIdInterceptor);
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/ConfigController.java
================================================
package com.minimalist.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.minimalist.basic.config.mybatis.bo.PageResp;
import com.minimalist.basic.entity.vo.config.ConfigQueryVO;
import com.minimalist.basic.entity.vo.config.ConfigVO;
import com.minimalist.basic.service.ConfigService;
import com.minimalist.basic.utils.Add;
import com.minimalist.basic.utils.Update;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Validated
@RestController
@Tag(name = "参数配置管理")
@RequestMapping("/basic/config")
public class ConfigController {
@Autowired
private ConfigService configService;
@PostMapping("/addConfig")
@SaCheckPermission("basic:config:add")
@Operation(summary = "添加参数")
public ResponseEntity<Void> addConfig(@RequestBody @Validated(Add.class) ConfigVO configVO) {
configService.addConfig(configVO);
return ResponseEntity.ok().build();
}
@DeleteMapping("/deleteConfigByConfigId")
@SaCheckPermission("basic:config:delete")
@Operation(summary = "删除参数 -> 根据参数ID删除")
public ResponseEntity<Void> deleteConfigByConfigId(@RequestParam("configId")
@NotNull(message = "参数ID不能为空")
@Parameter(name = "configId", required = true, description = "参数ID") Long configId) {
configService.deleteConfigByConfigId(configId);
return ResponseEntity.ok().build();
}
@PutMapping("/updateConfigByConfigId")
@SaCheckPermission("basic:config:update")
@Operation(summary = "修改参数")
public ResponseEntity<Void> updateConfigByConfigId(@RequestBody @Validated(Update.class) ConfigVO configVO) {
configService.updateConfigByConfigId(configVO);
return ResponseEntity.ok().build();
}
@GetMapping("/getPageConfigList")
@SaCheckPermission("basic:config:get")
@Operation(summary = "查询参数配置列表(分页)")
public ResponseEntity<PageResp<ConfigVO>> getPageConfigList(ConfigQueryVO queryVO) {
return ResponseEntity.ok(configService.getPageConfigList(queryVO));
}
@GetMapping("/getConfigByConfigId/{configId}")
@SaCheckPermission("basic:config:get")
@Operation(summary = "根据参数ID查询参数")
public ResponseEntity<ConfigVO> getConfigByConfigId(@PathVariable(value = "configId")
@NotNull(message = "参数ID不能为空")
@Parameter(name = "configId", description = "参数ID", required = true) Long configId) {
return ResponseEntity.ok(configService.getConfigByConfigId(configId));
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/DeptController.java
================================================
package com.minimalist.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.minimalist.basic.entity.vo.dept.DeptQueryVO;
import com.minimalist.basic.entity.vo.dept.DeptVO;
import com.minimalist.basic.service.DeptService;
import com.minimalist.basic.utils.Add;
import com.minimalist.basic.utils.Update;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Validated
@RestController
@RequestMapping("/basic/dept")
@Tag(name = "部门管理")
public class DeptController {
@Autowired
private DeptService deptService;
@PostMapping("/addDept")
@SaCheckPermission("basic:dept:add")
@Operation(summary = "添加部门")
public ResponseEntity<Void> addDept(@RequestBody @Validated(Add.class) DeptVO deptVO) {
deptService.addDept(deptVO);
return ResponseEntity.ok().build();
}
@DeleteMapping("/deleteDeptByDeptId")
@SaCheckPermission("basic:dept:delete")
@Operation(summary = "删除部门 -> 根据部门ID删除")
public ResponseEntity<Void> deleteDeptByDeptId(@RequestParam("deptId")
@NotNull(message = "部门ID不能为空")
@Parameter(name = "deptId", required = true, description = "部门ID") Long deptId) {
deptService.deleteDeptByDeptId(deptId);
return ResponseEntity.ok().build();
}
@PutMapping("/updateDeptByDeptId")
@SaCheckPermission("basic:dept:update")
@Operation(summary = "修改部门 -> 根据部门ID修改")
public ResponseEntity<Void> updateDeptByDeptId(@RequestBody @Validated(Update.class) DeptVO deptVO) {
deptService.updateDeptByDeptId(deptVO);
return ResponseEntity.ok().build();
}
@GetMapping("/getDeptList")
@SaCheckPermission("basic:dept:get")
@Operation(summary = "查询部门列表(不分页,获取全部数据) -> 部门管理使用")
public ResponseEntity<List<DeptVO>> getDeptList(DeptQueryVO queryVO) {
return ResponseEntity.ok(deptService.getDeptList(queryVO));
}
@GetMapping("/getEnableDeptList")
@SaCheckPermission("basic:dept:get")
@Operation(summary = "查询部门树 -> 只获取正常状态的部门")
public ResponseEntity<List<DeptVO>> getEnableDeptList() {
return ResponseEntity.ok(deptService.getEnableDeptList());
}
@GetMapping("/getDeptByDeptId/{deptId}")
@SaCheckPermission("basic:dept:get")
@Operation(summary = "根据部门ID查询部门")
public ResponseEntity<DeptVO> getDeptByDeptId(@PathVariable(value = "deptId")
@NotNull(message = "部门ID不能为空")
@Parameter(name = "deptId", description = "部门ID", required = true) Long deptId) {
return ResponseEntity.ok(deptService.getDeptByDeptId(deptId));
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/DictController.java
================================================
package com.minimalist.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.minimalist.basic.entity.vo.dict.*;
import com.minimalist.basic.service.DictService;
import com.minimalist.basic.config.mybatis.bo.PageResp;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Validated
@RestController
@Tag(name = "字典管理")
@RequestMapping("/basic/dict")
public class DictController {
@Autowired
private DictService dictService;
@PostMapping("/addDict")
@SaCheckPermission("basic:dict:add")
@Operation(summary = "添加字典")
public ResponseEntity<Void> addDict(@RequestBody @Validated DictInfoVO dictInfoVO) {
dictService.addDict(dictInfoVO);
return ResponseEntity.ok().build();
}
@DeleteMapping("/deleteDictByDictId")
@SaCheckPermission("basic:dict:delete")
@Operation(summary = "删除字典 -> 根据字典ID删除")
public ResponseEntity<Void> deleteDictByDictId(@RequestParam("dictId")
@NotNull(message = "字典ID不能为空")
@Parameter(name = "dictId", required = true, description = "字典ID") Long dictId) {
dictService.deleteDictByDictId(dictId);
return ResponseEntity.ok().build();
}
@DeleteMapping("/deleteDictByDictType")
@SaCheckPermission("basic:dict:delete")
@Operation(summary = "删除字典 -> 根据字典类型删除")
public ResponseEntity<Void> deleteDictByDictType(@RequestParam("dictType")
@NotNull(message = "字典类型不能为空")
@Parameter(name = "dictType", required = true, description = "字典类型") String dictType) {
dictService.deleteDictByDictType(dictType);
return ResponseEntity.ok().build();
}
@PutMapping("/updateDictByDictId")
@SaCheckPermission("basic:dict:update")
@Operation(summary = "修改字典")
public ResponseEntity<Void> updateDictByDictId(@RequestBody @Validated DictInfoVO dictInfoVO) {
dictService.updateDictByDictId(dictInfoVO);
return ResponseEntity.ok().build();
}
@GetMapping("/getPageDictList")
@SaCheckPermission("basic:dict:get")
@Operation(summary = "查询字典列表(分页)")
public ResponseEntity<PageResp<DictVO>> getPageDictList(DictQueryVO queryVO) {
return ResponseEntity.ok(dictService.getPageDictList(queryVO));
}
@GetMapping("/getDictByDictType/{dictType}")
@SaCheckPermission("basic:dict:get")
@Operation(summary = "根据字典类型查询字典 -> 用于字典管理页面")
public ResponseEntity<DictInfoVO> getDictByDictType(@PathVariable(value = "dictType")
@Parameter(name = "dictType", description = "字典类型", required = true) String dictType) {
return ResponseEntity.ok(dictService.getDictByDictType(dictType));
}
@GetMapping("/getDictList/{dictTypes}")
@Operation(summary = "根据字典类型查询字典 -> 用于下拉框数据展示或编码转换")
public ResponseEntity<List<DictCacheVO>> getDictList(@PathVariable(value = "dictTypes")
@NotEmpty(message = "字典类型不能为空")
@Parameter(name = "dictTypes", description = "字典类型列表,为空则查询所有字典数据") List<String> dictType) {
return ResponseEntity.ok(dictService.getDictList(dictType));
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/FileController.java
================================================
package com.minimalist.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.minimalist.basic.entity.vo.file.*;
import com.minimalist.basic.service.FileService;
import com.minimalist.basic.config.mybatis.bo.PageResp;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Validated
@RestController
@Tag(name = "文件管理")
@RequestMapping("/basic/file")
public class FileController {
@Autowired
private FileService fileService;
@PostMapping("/uploadFile")
@SaCheckPermission("basic:file:upload")
@Operation(summary = "单文件上传")
public ResponseEntity<FileUploadRespVO> uploadFile(@Validated FileUploadVO fileUploadVO) {
return ResponseEntity.ok(fileService.uploadFile(fileUploadVO));
}
@PostMapping("/uploadFileBatch")
@SaCheckPermission("basic:file:upload")
@Operation(summary = "批量文件上传")
public ResponseEntity<List<FileUploadRespVO>> uploadFileBatch(@Validated FileUploadBatchVO uploadBatchVO) {
return ResponseEntity.ok(fileService.uploadFileBatch(uploadBatchVO));
}
@DeleteMapping("/deleteFile")
@SaCheckPermission("basic:file:delete")
@Operation(summary = "单文件删除")
public ResponseEntity<Void> deleteFile(@RequestParam("fileId")
@NotNull(message = "文件ID不能为空")
@Parameter(name = "fileId", required = true, description = "fileId") Long fileId) {
fileService.deleteFile(fileId);
return ResponseEntity.ok().build();
}
@GetMapping("/getPageFileList")
@SaCheckPermission("basic:file:get")
@Operation(summary = "查询文件列表(分页)")
public ResponseEntity<PageResp<FileVO>> getPageFileList(FileQueryVO queryVO) {
return ResponseEntity.ok(fileService.getPageFileList(queryVO));
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/NoticeController.java
================================================
package com.minimalist.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.minimalist.basic.entity.vo.notice.NoticeQueryVO;
import com.minimalist.basic.entity.vo.notice.NoticeVO;
import com.minimalist.basic.service.NoticeService;
import com.minimalist.basic.config.mybatis.bo.PageResp;
import com.minimalist.basic.config.mybatis.bo.PageReq;
import com.minimalist.basic.utils.Add;
import com.minimalist.basic.utils.Update;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
import net.dreamlu.mica.xss.core.XssCleanIgnore;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Validated
@RestController
@Tag(name = "通知、公告管理")
@RequestMapping("/basic/notice")
public class NoticeController {
@Autowired
private NoticeService noticeService;
@XssCleanIgnore
@PostMapping("/addNotice")
@SaCheckPermission("basic:notice:add")
@Operation(summary = "添加公告")
public ResponseEntity<Void> addNotice(@RequestBody @Validated(Add.class) NoticeVO noticeVO) {
noticeService.addNotice(noticeVO);
return ResponseEntity.ok().build();
}
@DeleteMapping("/deleteNoticeByNoticeId")
@SaCheckPermission("basic:notice:delete")
@Operation(summary = "删除公告 -> 根据公告ID删除")
public ResponseEntity<Void> deleteNoticeByNoticeId(@RequestParam("noticeId")
@NotNull(message = "公告ID不能为空")
@Parameter(name = "noticeId", required = true, description = "公告ID") Long noticeId) {
noticeService.deleteNoticeByNoticeId(noticeId);
return ResponseEntity.ok().build();
}
@XssCleanIgnore
@PutMapping("/updateNoticeByNoticeId")
@SaCheckPermission("basic:notice:update")
@Operation(summary = "修改公告 -> 根据公告ID修改")
public ResponseEntity<Void> updateNoticeByNoticeId(@RequestBody @Validated(Update.class) NoticeVO noticeVO) {
noticeService.updateNoticeByNoticeId(noticeVO);
return ResponseEntity.ok().build();
}
@GetMapping("/getPageNoticeList")
@SaCheckPermission("basic:notice:get")
@Operation(summary = "查询公告列表(分页) -> 公告管理使用")
public ResponseEntity<PageResp<NoticeVO>> getPageNoticeList(NoticeQueryVO queryVO) {
return ResponseEntity.ok(noticeService.getPageNoticeList(queryVO));
}
@GetMapping("/getNoticeByNoticeId/{noticeId}")
@Operation(summary = "根据公告ID查询公告")
public ResponseEntity<NoticeVO> getNoticeByNoticeId(@PathVariable(value = "noticeId")
@NotNull(message = "公告ID不能为空")
@Parameter(name = "noticeId", description = "公告ID", required = true) Long noticeId) {
return ResponseEntity.ok(noticeService.getNoticeByNoticeId(noticeId));
}
@GetMapping("/getPageHomeNoticeList")
@Operation(summary = "查询公告列表(分页) -> 首页使用")
public ResponseEntity<PageResp<NoticeVO>> getPageHomeNoticeList(PageReq pageReq) {
return ResponseEntity.ok(noticeService.getPageHomeNoticeList(pageReq));
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/PermController.java
================================================
package com.minimalist.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.minimalist.basic.entity.vo.perm.PermQueryVO;
import com.minimalist.basic.entity.vo.perm.PermVO;
import com.minimalist.basic.service.PermService;
import com.minimalist.basic.utils.Add;
import com.minimalist.basic.utils.Update;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Validated
@RestController
@RequestMapping("/basic/permission")
@Tag(name = "权限管理")
public class PermController {
@Autowired
private PermService permService;
@PostMapping("/addPerm")
@SaCheckPermission("basic:perm:add")
@Operation(summary = "添加权限")
public ResponseEntity<Void> addPerm(@RequestBody @Validated(Add.class) PermVO permVO) {
permService.addPerm(permVO);
return ResponseEntity.ok().build();
}
@DeleteMapping("/deletePermByPermId")
@SaCheckPermission("basic:perm:delete")
@Operation(summary = "删除权限 -> 根据权限ID删除")
public ResponseEntity<Void> deletePermByPermId(@RequestParam("permId")
@NotNull(message = "权限ID不能为空")
@Parameter(name = "permId", required = true, description = "权限ID") Long permId) {
permService.deletePermByPermId(permId);
return ResponseEntity.ok().build();
}
@PutMapping("/updatePermByPermId")
@SaCheckPermission("basic:perm:update")
@Operation(summary = "修改权限 -> 根据权限ID修改")
public ResponseEntity<Void> updatePermByPermId(@RequestBody @Validated(Update.class) PermVO permVO) {
permService.updatePermByPermId(permVO);
return ResponseEntity.ok().build();
}
@GetMapping("/getPermList")
@SaCheckPermission("basic:perm:get")
@Operation(summary = "查询权限列表(不分页,获取全部数据) -> 权限管理使用")
public ResponseEntity<List<PermVO>> getPermList(PermQueryVO queryVO) {
return ResponseEntity.ok(permService.getPermList(queryVO));
}
@GetMapping("/getEnablePermList")
@Operation(summary = "查询系统租户权限列表 -> 只获取正常状态的权限")
public ResponseEntity<List<PermVO>> getEnablePermList() {
return ResponseEntity.ok(permService.getEnablePermList());
}
@GetMapping("/getTenantEnablePermList")
@Operation(summary = "查询租户权限列表 -> 只获取正常状态的权限")
public ResponseEntity<List<PermVO>> getTenantEnablePermList() {
return ResponseEntity.ok(permService.getTenantEnablePermList());
}
@GetMapping("/getPermByPermId/{permId}")
@SaCheckPermission("basic:perm:get")
@Operation(summary = "根据权限ID查询权限")
public ResponseEntity<PermVO> getPermByPermId(@PathVariable(value = "permId")
@NotNull(message = "权限ID不能为空")
@Parameter(name = "permId", description = "权限ID", required = true) Long permId) {
return ResponseEntity.ok(permService.getPermByPermId(permId));
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/PostController.java
================================================
package com.minimalist.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.minimalist.basic.entity.vo.post.PostQueryVO;
import com.minimalist.basic.entity.vo.post.PostVO;
import com.minimalist.basic.service.PostService;
import com.minimalist.basic.config.mybatis.bo.PageResp;
import com.minimalist.basic.utils.Add;
import com.minimalist.basic.utils.Update;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Validated
@RestController
@RequestMapping("/basic/post")
@Tag(name = "岗位管理")
public class PostController {
@Autowired
private PostService postService;
@PostMapping("/addPost")
@SaCheckPermission("basic:post:add")
@Operation(summary = "添加岗位")
public ResponseEntity<Void> addPost(@RequestBody @Validated(Add.class) PostVO postVO) {
postService.addPost(postVO);
return ResponseEntity.ok().build();
}
@DeleteMapping("/deletePostByPostId")
@SaCheckPermission("basic:post:delete")
@Operation(summary = "删除岗位 -> 根据岗位ID删除")
public ResponseEntity<Void> deletePostByPostId(@RequestParam("postId")
@NotNull(message = "岗位ID不能为空")
@Parameter(name = "postId", required = true, description = "岗位ID") Long postId) {
postService.deletePostByPostId(postId);
return ResponseEntity.ok().build();
}
@PutMapping("/updatePostByPostId")
@SaCheckPermission("basic:post:update")
@Operation(summary = "修改岗位 -> 根据岗位ID修改")
public ResponseEntity<Void> updatePostByPostId(@RequestBody @Validated(Update.class) PostVO postVO) {
postService.updatePostByPostId(postVO);
return ResponseEntity.ok().build();
}
@GetMapping("/getPagePostList")
@SaCheckPermission("basic:post:get")
@Operation(summary = "查询岗位列表(分页)")
public ResponseEntity<PageResp<PostVO>> getPagePostList(PostQueryVO queryVO) {
return ResponseEntity.ok(postService.getPagePostList(queryVO));
}
@GetMapping("/getPostByPostId/{postId}")
@SaCheckPermission("basic:post:get")
@Operation(summary = "根据岗位ID查询岗位")
public ResponseEntity<PostVO> getPostByPostId(@PathVariable(value = "postId")
@NotNull(message = "岗位ID不能为空")
@Parameter(name = "postId", description = "岗位ID", required = true) Long postId) {
return ResponseEntity.ok(postService.getPostByPostId(postId));
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/RoleController.java
================================================
package com.minimalist.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.minimalist.basic.entity.vo.role.RoleQueryVO;
import com.minimalist.basic.entity.vo.role.RoleVO;
import com.minimalist.basic.service.RoleService;
import com.minimalist.basic.config.mybatis.bo.PageResp;
import com.minimalist.basic.utils.Add;
import com.minimalist.basic.utils.Update;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Validated
@RestController
@RequestMapping("/basic/role")
@Tag(name = "角色管理")
public class RoleController {
@Autowired
private RoleService roleService;
@PostMapping("/addRole")
@SaCheckPermission("basic:role:add")
@Operation(summary = "添加角色")
public ResponseEntity<Void> addRole(@RequestBody @Validated(Add.class) RoleVO roleVO) {
roleService.addRole(roleVO);
return ResponseEntity.ok().build();
}
@DeleteMapping("/deleteRoleByRoleId")
@SaCheckPermission("basic:role:delete")
@Operation(summary = "删除角色 -> 根据角色ID删除角色")
public ResponseEntity<Void> deleteRoleByRoleId(@RequestParam("roleId")
@NotNull(message = "角色ID不能为空")
@Parameter(name = "roleId", required = true, description = "角色ID") Long roleId) {
roleService.deleteRoleByRoleId(roleId);
return ResponseEntity.ok().build();
}
@PutMapping("/updateRoleByRoleId")
@SaCheckPermission("basic:role:update")
@Operation(summary = "修改角色 -> 根据角色ID修改")
public ResponseEntity<Void> updateRoleByRoleId(@RequestBody @Validated(Update.class) RoleVO roleVO) {
roleService.updateRoleByRoleId(roleVO);
return ResponseEntity.ok().build();
}
@GetMapping("/getPageRoleList")
@SaCheckPermission("basic:role:get")
@Operation(summary = "查询角色(分页) -> 角色管理使用")
public ResponseEntity<PageResp<RoleVO>> getPageRoleList(RoleQueryVO queryVO) {
return ResponseEntity.ok(roleService.getPageRoleList(queryVO));
}
@GetMapping("/getRoleByRoleId/{roleId}")
@SaCheckPermission("basic:role:get")
@Operation(summary = "根据角色ID查询角色")
public ResponseEntity<RoleVO> getRoleByRoleId(@PathVariable(value = "roleId")
@NotNull(message = "角色ID不能为空")
@Parameter(name = "roleId", description = "角色ID", required = true) Long roleId) {
return ResponseEntity.ok(roleService.getRoleByRoleId(roleId));
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/StorageController.java
================================================
package com.minimalist.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.minimalist.basic.config.mybatis.bo.PageResp;
import com.minimalist.basic.entity.vo.storage.StorageQueryVO;
import com.minimalist.basic.entity.vo.storage.StorageVO;
import com.minimalist.basic.service.StorageService;
import com.minimalist.basic.utils.Add;
import com.minimalist.basic.utils.Update;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Validated
@RestController
@RequestMapping("/basic/storage")
@Tag(name = "存储管理")
public class StorageController {
@Autowired
private StorageService storageService;
@PostMapping("/addStorage")
@SaCheckPermission("basic:storage:add")
@Operation(summary = "添加存储")
public ResponseEntity<Void> addStorage(@RequestBody @Validated(Add.class) StorageVO storageVO) {
storageService.addStorage(storageVO);
return ResponseEntity.ok().build();
}
@DeleteMapping("/deleteStorageByStorageId")
@SaCheckPermission("basic:storage:delete")
@Operation(summary = "删除存储 -> 根据存储ID删除")
public ResponseEntity<Void> deleteStorageByStorageId(@RequestParam("storageId")
@NotNull(message = "存储ID不能为空")
@Parameter(name = "storageId", required = true, description = "存储ID") Long storageId) {
storageService.deleteStorageByStorageId(storageId);
return ResponseEntity.ok().build();
}
@PutMapping("/updateStorageByStorageId")
@SaCheckPermission("basic:storage:update")
@Operation(summary = "修改存储 -> 根据存储ID修改")
public ResponseEntity<Void> updateStorageByStorageId(@RequestBody @Validated(Update.class) StorageVO storageVO) {
storageService.updateStorageByStorageId(storageVO);
return ResponseEntity.ok().build();
}
@GetMapping("/getPageStorageList")
@SaCheckPermission("basic:storage:get")
@Operation(summary = "查询存储列表(分页)")
public ResponseEntity<PageResp<StorageVO>> getPageStorageList(StorageQueryVO queryVO) {
return ResponseEntity.ok(storageService.getPageStorageList(queryVO));
}
@GetMapping("/getStorageByStorageId/{storageId}")
@SaCheckPermission("basic:storage:get")
@Operation(summary = "根据存储ID查询存储信息")
public ResponseEntity<StorageVO> getStorageByStorageId(@PathVariable(value = "storageId")
@NotNull(message = "存储ID不能为空")
@Parameter(name = "storageId", description = "存储ID", required = true) Long storageId) {
return ResponseEntity.ok(storageService.getStorageByStorageId(storageId));
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/TenantController.java
================================================
package com.minimalist.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.minimalist.basic.entity.vo.tenant.TenantQueryVO;
import com.minimalist.basic.entity.vo.tenant.TenantVO;
import com.minimalist.basic.service.TenantService;
import com.minimalist.basic.config.mybatis.bo.PageResp;
import com.minimalist.basic.config.tenant.TenantIgnore;
import com.minimalist.basic.utils.Add;
import com.minimalist.basic.utils.Update;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Validated
@RestController
@RequestMapping("/basic/tenant")
@Tag(name = "租户管理")
public class TenantController {
@Autowired
private TenantService tenantService;
@TenantIgnore
@PostMapping("/addTenant")
@SaCheckPermission("basic:tenant:add")
@Operation(summary = "添加租户")
public ResponseEntity<Void> addTenant(@RequestBody @Validated(Add.class) TenantVO tenantVO) {
tenantService.addTenant(tenantVO);
return ResponseEntity.ok().build();
}
@TenantIgnore
@DeleteMapping("/deleteTenantByTenantId")
@SaCheckPermission("basic:tenant:delete")
@Operation(summary = "删除租户 -> 根据租户ID删除租户")
public ResponseEntity<Void> deleteTenantByTenantId(@RequestParam("tenantId")
@NotNull(message = "租户ID不能为空")
@Parameter(name = "tenantId", required = true, description = "租户ID") Long tenantId) {
tenantService.deleteTenantByTenantId(tenantId);
return ResponseEntity.ok().build();
}
@TenantIgnore
@PutMapping("/updateTenantByTenantId")
@SaCheckPermission("basic:tenant:update")
@Operation(summary = "修改租户 -> 根据租户ID修改")
public ResponseEntity<Void> updateTenantByTenantId(@RequestBody @Validated(Update.class) TenantVO tenantVO) {
tenantService.updateTenantByTenantId(tenantVO);
return ResponseEntity.ok().build();
}
@TenantIgnore
@GetMapping("/getPageTenantList")
@SaCheckPermission("basic:tenant:get")
@Operation(summary = "查询租户(分页)")
public ResponseEntity<PageResp<TenantVO>> getPageTenantList(TenantQueryVO queryVO) {
return ResponseEntity.ok(tenantService.getPageTenantList(queryVO));
}
@TenantIgnore
@GetMapping("/getTenantByTenantId/{tenantId}")
@SaCheckPermission("basic:tenant:get")
@Operation(summary = "根据租户ID查询租户")
public ResponseEntity<TenantVO> getTenantByTenantId(@PathVariable(value = "tenantId")
@NotNull(message = "租户ID不能为空")
@Parameter(name = "tenantId", description = "租户ID", required = true) Long tenantId) {
return ResponseEntity.ok(tenantService.getTenantByTenantId(tenantId));
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/TenantPackageController.java
================================================
package com.minimalist.basic.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.minimalist.basic.entity.vo.tenant.TenantPackageQueryVO;
import com.minimalist.basic.entity.vo.tenant.TenantPackageVO;
import com.minimalist.basic.service.TenantPackageService;
import com.minimalist.basic.config.mybatis.bo.PageResp;
import com.minimalist.basic.config.tenant.TenantIgnore;
import com.minimalist.basic.utils.Add;
import com.minimalist.basic.utils.Update;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Validated
@RestController
@RequestMapping("/basic/tenantPackage")
@Tag(name = "租户管理")
public class TenantPackageController {
@Autowired
private TenantPackageService tenantPackageService;
@TenantIgnore
@PostMapping("/addTenantPackage")
@SaCheckPermission("basic:tenantPackage:add")
@Operation(summary = "添加租户套餐")
public ResponseEntity<Void> addTenantPackage(@RequestBody @Validated(Add.class) TenantPackageVO tenantPackageVO) {
tenantPackageService.addTenantPackage(tenantPackageVO);
return ResponseEntity.ok().build();
}
@TenantIgnore
@DeleteMapping("/deleteTenantPackageByTenantPackageId")
@SaCheckPermission("basic:tenantPackage:delete")
@Operation(summary = "删除租户套餐 -> 根据租户套餐ID删除租户套餐")
public ResponseEntity<Void> deleteTenantPackageByTenantPackageId(@RequestParam("tenantPackageId")
@NotNull(message = "租户套餐ID不能为空")
@Parameter(name = "tenantPackageId", required = true, description = "租户套餐ID") Long tenantPackageId) {
tenantPackageService.deleteTenantPackageByTenantPackageId(tenantPackageId);
return ResponseEntity.ok().build();
}
@TenantIgnore
@PutMapping("/updateTenantPackageByTenantPackageId")
@SaCheckPermission("basic:tenantPackage:update")
@Operation(summary = "修改租户套餐 -> 根据租户套餐ID修改")
public ResponseEntity<Void> updateTenantPackageByTenantPackageId(@RequestBody @Validated(Update.class) TenantPackageVO tenantPackageVO) {
tenantPackageService.updateTenantPackageByTenantPackageId(tenantPackageVO);
return ResponseEntity.ok().build();
}
@TenantIgnore
@GetMapping("/getPageTenantPackageList")
@SaCheckPermission("basic:tenantPackage:get")
@Operation(summary = "查询租户套餐(分页)")
public ResponseEntity<PageResp<TenantPackageVO>> getPageTenantPackageList(TenantPackageQueryVO queryVO) {
return ResponseEntity.ok(tenantPackageService.getPageTenantPackageList(queryVO));
}
@TenantIgnore
@GetMapping("/getTenantPackageByTenantPackageId/{tenantPackageId}")
@SaCheckPermission("basic:tenantPackage:get")
@Operation(summary = "根据租户套餐ID查询租户套餐")
public ResponseEntity<TenantPackageVO> getTenantPackageByTenantPackageId(@PathVariable(value = "tenantPackageId")
@NotNull(message = "租户套餐ID不能为空")
@Parameter(name = "tenantPackageId", description = "租户套餐ID", required = true) Long tenantPackageId) {
return ResponseEntity.ok(tenantPackageService.getTenantPackageByTenantPackageId(tenantPackageId));
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/UserController.java
================================================
package com.minimalist.basic.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaIgnore;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import com.minimalist.basic.entity.vo.user.*;
import com.minimalist.basic.service.UserService;
import com.minimalist.basic.config.mybatis.bo.PageResp;
import com.minimalist.basic.config.tenant.TenantIgnore;
import com.minimalist.basic.utils.Add;
import com.minimalist.basic.utils.Update;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@Validated
@RestController
@RequestMapping("/basic/user")
@Tag(name = "用户管理")
public class UserController {
@Autowired
private UserService userService;
@PostMapping("/addUser")
@SaCheckPermission("basic:user:add")
@Operation(summary = "添加用户")
public ResponseEntity<Void> addUser(@RequestBody @Validated(Add.class) UserVO userVO) {
userService.addUser(userVO);
return ResponseEntity.ok().build();
}
@DeleteMapping("/deleteUserByUserId")
@SaCheckPermission("basic:user:delete")
@Operation(summary = "删除用户 -> 根据用户ID删除")
public ResponseEntity<Void> deleteUserByUserId(@RequestParam("userId")
@NotNull(message = "用户ID不能为空")
@Parameter(name = "userId", required = true, description = "用户ID") Long userId) {
userService.deleteUserByUserId(userId);
return ResponseEntity.ok().build();
}
@PutMapping("/updateUserByUserId")
@SaCheckPermission("basic:user:update")
@Operation(summary = "修改用户")
public ResponseEntity<Void> updateUserByUserId(@RequestBody @Validated(Update.class) UserVO userVO) {
userService.updateUserByUserId(userVO);
return ResponseEntity.ok().build();
}
@GetMapping("/getPageUserList")
@SaCheckPermission("basic:user:get")
@Operation(summary = "查询用户(分页)")
public ResponseEntity<PageResp<UserVO>> getPageUserList(UserQueryVO queryVO) {
return ResponseEntity.ok(userService.getPageUserList(queryVO));
}
@GetMapping("/getUserByUserId/{userId}")
@SaCheckPermission("basic:user:get")
@Operation(summary = "根据用户ID查询用户 -> 用户管理页使用")
public ResponseEntity<UserVO> getUserByUserId(@PathVariable(value = "userId")
@NotNull(message = "用户ID不能为空")
@Parameter(name = "userId", description = "用户ID", required = true) Long userId) {
return ResponseEntity.ok(userService.getUserByUserId(userId));
}
//@TenantIgnore
@GetMapping("/getUserInfo")
@Operation(summary = "获取用户信息(登录后获取,含角色、权限、菜单、部门等)")
public ResponseEntity<UserInfoVO> getUserInfo() {
return ResponseEntity.ok(userService.getUserInfo());
}
@SaIgnore
@GetMapping("/getImageCaptcha")
@Operation(summary = "获取图形验证码")
public ResponseEntity<ImageCaptchaVO> getImageCaptcha() {
return ResponseEntity.ok(userService.getImageCaptcha());
}
@SaIgnore
@TenantIgnore
@PostMapping("/login")
@Operation(summary = "用户登录,返回token")
public ResponseEntity<SaTokenInfo> login(@RequestBody @Valid UserLoginReqVO reqVO) {
return ResponseEntity.ok(userService.userLogin(reqVO));
}
@PostMapping("/logout")
@Operation(summary = "退出登录")
public ResponseEntity<Void> logout() {
StpUtil.logout();
return ResponseEntity.ok().build();
}
@SaCheckLogin
@PostMapping("/resetPassword")
@Operation(summary = "重置密码")
public ResponseEntity<Void> resetPassword(@RequestBody @Valid RePasswordVO passwordVO) {
userService.resetPassword(passwordVO);
return ResponseEntity.ok().build();
}
@SaCheckLogin
@PostMapping("/updateUserAvatar")
@Operation(summary = "修改用户头像")
public ResponseEntity<Void> updateUserAvatar(@RequestParam("userAvatar")
@NotBlank(message = "用户头像不能为空")
@Parameter(name = "userAvatar", description = "用户头像base64编码", required = true) String userAvatar) {
userService.updateUserAvatar(userAvatar);
return ResponseEntity.ok().build();
}
@SaCheckLogin
@PostMapping("/updateUserInfo")
@Operation(summary = "修改用户基本信息")
public ResponseEntity<Void> updateUserInfo(@RequestBody @Valid UserSettingVO settingVO) {
userService.updateUserInfo(settingVO);
return ResponseEntity.ok().build();
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/ConfigEnum.java
================================================
package com.minimalist.basic.entity.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
public class ConfigEnum {
/** 字典处理异常信息 */
@Getter
@AllArgsConstructor
public enum ErrorMsg {
NONENTITY_CONFIG("参数配置不存在"),
CONTAIN_CONFIG_KEY("参数键名已存在"),
CANNOT_DEL_SYSTEM_CONFIG("不能删除系统参数"),
;
private final String desc;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/DeptEnum.java
================================================
package com.minimalist.basic.entity.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
public class DeptEnum {
/** 部门处理异常信息 */
@Getter
@AllArgsConstructor
public enum ErrorMsg {
NONENTITY_DEPT("部门不存在"),
CONTAIN_CHILDREN("该权限下包含子项,请先删除子项"),
USER_DEPT_CHILDREN("有用户在该部门,请先调整该用户部门"),
;
private final String desc;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/DictEnum.java
================================================
package com.minimalist.basic.entity.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
public class DictEnum {
/** 字典处理异常信息 */
@Getter
@AllArgsConstructor
public enum ErrorMsg {
NONENTITY_DICT("字典不存在"),
;
private final String desc;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/FileEnum.java
================================================
package com.minimalist.basic.entity.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
public class FileEnum {
/** 文件处理异常信息 */
@Getter
@AllArgsConstructor
public enum ErrorMsg {
NONENTITY_FILE("文件不存在"),
FILE_USED("文件已被使用"),
FILE_UPLOAD_FAIL("文件上传失败,请重试"),
FILE_THUMBNAILS_UPLOAD_FAIL("文件缩略图上传失败,请重试"),
FILE_DOWNLOAD_FAIL("文件下载失败,请重试"),
FILE_MOVE_FAIL("文件移动失败,请重试"),
FILE_DELETE_FAIL("文件删除失败,请重试"),
;
private final String desc;
}
/** 文件来源 */
@Getter
@AllArgsConstructor
public enum FileSource {
NOTICE_COVER_IMG(1, "系统公告封面图片"),
NOTICE_CONTENT_IMG(2, "系统公告内容图片"),
;
private final Integer code;
private final String desc;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/NoticeEnum.java
================================================
package com.minimalist.basic.entity.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
public class NoticeEnum {
/** 公告处理异常信息 */
@Getter
@AllArgsConstructor
public enum ErrorMsg {
NONENTITY_NOTICE("公告不存在"),
;
private final String desc;
}
/** 公告类型 */
@Getter
@AllArgsConstructor
public enum NoticeType {
NOTICE(1, "公告"),
NEWS(2, "新闻"),
;
private final Integer code;
private final String desc;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/PermEnum.java
================================================
package com.minimalist.basic.entity.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
public class PermEnum {
/** 权限处理异常信息 */
@Getter
@AllArgsConstructor
public enum ErrorMsg {
NONENTITY_PERM("权限不存在"),
CONTAIN_CHILDREN("该权限下包含子项,请先删除子项"),
;
private final String desc;
}
/** 权限类型 */
@Getter
@AllArgsConstructor
public enum PermType {
MENU("M", "菜单"),
BUTTON("B", "按钮"),
;
private final String code;
private final String desc;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/PostEnum.java
================================================
package com.minimalist.basic.entity.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
public class PostEnum {
/** 岗位处理异常信息 */
@Getter
@AllArgsConstructor
public enum ErrorMsg {
NONENTITY_POST("岗位不存在"),
EXISTS_POST("岗位编码已存在"),
;
private final String desc;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/RespEnum.java
================================================
package com.minimalist.basic.entity.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum RespEnum {
/** 操作成功 */
SUCCESS(200, "操作成功"),
/** 系统异常,请稍后再试 */
FAILED(500, "系统异常,请稍后再试"),
/** 参数错误 */
PARAM_ERROR(400, "参数错误"),
/** 用户认证失败,请重新登录 */
REQUEST_UNAUTH(401, "用户认证失败,请重新登录"),
/** 无操作权限 */
NO_OPERATION_PERMISSION(403, "暂无操作权限"),
/** 无操作权限 */
TAMPER_WITH_DATA(400, "请勿篡改数据"),
/** 重复提交 */
RESUBMIT_ERROR(503, "请求已提交,请稍后重试"),
/** 参数存在XSS敏感字符 */
PARAM_XSS_ERROR(400, "存在敏感数据,不能提交"),
;
private final Integer code;
private final String desc;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/RoleEnum.java
================================================
package com.minimalist.basic.entity.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
public class RoleEnum {
/** 角色 */
@Getter
@AllArgsConstructor
public enum Role {
/** 系统管理员,权限最高 */
SYSTEM_ADMIN("system_admin", "系统管理员"),
/** 租户管理员,租户权限范围内权限最高 */
ADMIN("admin", "管理员"),
;
private final String code;
private final String name;
}
/** 角色处理异常信息 */
@Getter
@AllArgsConstructor
public enum ErrorMsg {
EXISTS_ROLE("角色编码已存在"),
NONENTITY_ROLE("角色不存在"),
;
private final String desc;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/StatusEnum.java
================================================
package com.minimalist.basic.entity.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 公共的状态枚举
* 对应每张表中的status字段
*/
@Getter
@AllArgsConstructor
public enum StatusEnum {
STATUS_0(0, "禁用"),
STATUS_1(1, "正常"),
;
private final Integer code;
private final String desc;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/StorageEnum.java
================================================
package com.minimalist.basic.entity.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
public class StorageEnum {
/** 存储处理异常信息 */
@Getter
@AllArgsConstructor
public enum ErrorMsg {
NONENTITY_STORAGE("存储信息不存在"),
;
private final String desc;
}
/** 存储类型 */
@Getter
@AllArgsConstructor
public enum StorageType {
LOCAL("local", "本地"),
MINIO("minio", "MinIO"),
QINIU("qiniu", "七牛云"),
;
private final String code;
private final String desc;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/TenantEnum.java
================================================
package com.minimalist.basic.entity.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
public class TenantEnum {
/** 租户处理异常信息 */
@Getter
@AllArgsConstructor
public enum ErrorMsg {
NONENTITY_TENANT("租户不存在"),
EXISTS_TENANT("租户已存在,请检查租户名"),
NONENTITY_TENANT_PACKAGE("租户套餐不存在"),
USE_TENANT_PACKAGE("有租户正在使用该套餐,不能删除"),
STATUS_TENANT_PACKAGE("选择的租户套餐已被禁用"),
TENANT_USER_COUNT_LIMIT("租户下可创建的用户数已达上限"),
EX_TENANT("租户已过期,请联系管理员"),
DISABLED_TENANT("租户已被禁用,请联系管理员"),
QUERY_NULL_TENANT("未查询到租户,请联系管理员"),
SYSTEM_TENANT("系统租户,不可删除"),
SYSTEM_TENANT_PACKAGE("系统租户套餐,不可删除"),
ADD_TENANT_USER_NULL("添加租户时用户信息不能为空"),
ADD_TENANT_USERNAME_NULL("添加租户时用户账号不能为空"),
ADD_TENANT_PASSWORD_NULL("添加租户时用户密码不能为空"),
ADD_TENANT_NICKNAME_NULL("添加租户时用户昵称不能为空"),
ADD_TENANT_REALNAME_NULL("添加租户时用户真实姓名不能为空"),
ADD_TENANT_PHONE_NULL("添加租户时用户手机号不能为空"),
ADD_TENANT_USERSEX_NULL("添加租户时用户性别不能为空"),
;
private final String desc;
}
/** 租户数据隔离方式 */
@Getter
@AllArgsConstructor
public enum DataIsolation {
COLUMN("column", "字段隔离"),
DB("db", "数据库隔离");
private final String code;
private final String desc;
}
/** 主数据源名称 */
public static final String MASTER = "master";
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/UserEnum.java
================================================
package com.minimalist.basic.entity.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
public class UserEnum {
/** 用户处理异常信息 */
@Getter
@AllArgsConstructor
public enum ErrorMsg {
CAPTCHA_ID_EMPTY("验证码ID为空"),
CAPTCHA_CONTENT_EMPTY("验证码为空"),
CAPTCHA_INCORRECT("验证码输入错误"),
U_OR_P_INCORRECT("用户名或密码错误"),
USER_FROZEN("账户已被冻结"),
AUTH_EXPIRED("登录信息过期,请重新登录"),
ACCOUNT_EXPIRED("账户已过期"),
BAD_INVALID("凭证无效,请重新登录"),
EXISTS_ACCOUNT("用户名已存在"),
PHONE_ACCOUNT("用户手机已存在"),
EMAIL_ACCOUNT("用户邮箱已存在"),
NONENTITY_ACCOUNT("用户不存在"),
NONENTITY_OPT_ACCOUNT("操作的用户不存在"),
OLD_PASSWORD_INCORRECT("旧密码输入错误"),
USER_AVATAR_SIZE("头像大小需小于100kb"),
LOGIN_USER_INCONSISTENT("获取的用户信息与当前登陆用户不一致"),
USER_UNBOUND_TENANT("该账户未绑定租户"),
;
private final String desc;
}
/** 用户性别 */
@Getter
@AllArgsConstructor
public enum UserSex {
USER_SEX_0(0, "未知"),
USER_SEX_1(1, "男"),
USER_SEX_2(2, "女"),
;
private final Integer code;
private final String desc;
}
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MConfig.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 参数配置表 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(value = "m_config", onInsert = InsertFullColumnHandler.class, onUpdate = UpdateFullColumnHandler.class)
public class MConfig extends BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 参数ID
*/
private Long configId;
/**
* 参数名称
*/
private String configName;
/**
* 参数键名
*/
private String configKey;
/**
* 参数键值
*/
private String configValue;
/**
* 说明
*/
private String description;
/**
* 状态 0禁用 1正常
*/
private Integer status;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MDept.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 部门表 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(value = "m_dept", onInsert = InsertFullColumnHandler.class, onUpdate = UpdateFullColumnHandler.class)
public class MDept extends BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 部门id
*/
private Long deptId;
/**
* 父部门id
*/
private Long parentDeptId;
/**
* 祖级列表
*/
private String ancestors;
/**
* 部门名称
*/
private String deptName;
/**
* 部门负责人
*/
private Long deptLeader;
/**
* 显示顺序
*/
private Integer deptSort;
/**
* 联系电话
*/
private String phone;
/**
* 邮箱
*/
private String email;
/**
* 状态 0禁用 1正常
*/
private Integer status;
/**
* 租户编号
*/
@Column(tenantId = true)
private Long tenantId;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MDict.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 字典表 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(value = "m_dict", onInsert = InsertFullColumnHandler.class, onUpdate = UpdateFullColumnHandler.class)
public class MDict extends BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 字典ID
*/
private Long dictId;
/**
* 字典类型
*/
private String dictType;
/**
* 字典key
*/
private String dictKey;
/**
* 字典value
*/
private String dictValue;
/**
* 字典名称
*/
private String dictName;
/**
* 字典描述
*/
private String dictDesc;
/**
* 字典排序值
*/
private Integer dictOrder;
/**
* 字典样式,对应前端Tag组件的type
*/
private String dictClass;
/**
* 状态 0禁用 1正常
*/
private Integer status;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MFile.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 文件表 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(value = "m_file", onInsert = InsertFullColumnHandler.class, onUpdate = UpdateFullColumnHandler.class)
public class MFile extends BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 文件ID
*/
private Long fileId;
/**
* 原文件名
*/
private String fileName;
/**
* 现文件名
*/
private String newFileName;
/**
* 文件大小
*/
private Long fileSize;
/**
* 文件类型
*/
private String fileType;
/**
* 文件基础路径
*/
private String fileBasePath;
/**
* 文件相对路径
*/
private String filePath;
/**
* 文件url
*/
private String fileUrl;
/**
* 文件来源
*/
private Integer fileSource;
/**
* 存储ID
*/
private Long storageId;
/**
* 文件缩略图url
*/
private String fileThUrl;
/**
* 文件缩略图文件名
*/
private String fileThFilename;
/**
* 缩略图文件大小
*/
private Long fileThSize;
/**
* 备注
*/
private String remark;
/**
* 状态 0未使用 1已使用,默认未使用,代码中控制修改为已使用,可以定期清理未使用的文件
*/
private Integer status;
/**
* 租户ID
*/
@Column(tenantId = true)
private Long tenantId;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MNotice.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 通知公告表 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(value = "m_notice", onInsert = InsertFullColumnHandler.class, onUpdate = UpdateFullColumnHandler.class)
public class MNotice extends BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 公告ID
*/
private Long noticeId;
/**
* 公告标题
*/
private String noticeTitle;
/**
* 公告类型(1公告)
*/
private Integer noticeType;
/**
* 公告内容
*/
private String noticeContent;
/**
* 封面图文件ID,多个使用 , 分割
*/
private String noticePicFileId;
/**
* 是否置顶 0否 1是
*/
private Boolean noticeTop;
/**
* 延时发布的时间
*/
private LocalDateTime noticeTimeInterval;
/**
* 排序
*/
private Integer noticeSort;
/**
* 是否外链 0否 1是
*/
private Boolean noticeOutChain;
/**
* 外部跳转链接
*/
private String noticeLink;
/**
* 发布部门
*/
private Long publishDeptId;
/**
* 发布人
*/
private Long publishAuthorId;
/**
* 发布时间
*/
private LocalDateTime publishTime;
/**
* 状态 0禁用 1正常
*/
private Integer status;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MPerms.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 权限表 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(value = "m_perms", onInsert = InsertFullColumnHandler.class, onUpdate = UpdateFullColumnHandler.class)
public class MPerms extends BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 权限ID
*/
private Long permId;
/**
* 权限标识
*/
private String permCode;
/**
* 权限名称
*/
private String permName;
/**
* 父权限ID
*/
private Long parentPermId;
/**
* 显示顺序
*/
private Integer permSort;
/**
* 路由地址
*/
private String permPath;
/**
* 权限图标 菜单或目录时可传图标
*/
private String permIcon;
/**
* 权限类型 M菜单 B按钮
*/
private String permType;
/**
* 组件路径
*/
private String component;
/**
* 是否为外部链接 0否 1是
*/
private Boolean externalLink;
/**
* 是否可见 0隐藏 1显示)
*/
private Boolean visible;
/**
* 备注
*/
private String remark;
/**
* 状态 0禁用 1正常
*/
private Integer status;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MPost.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 岗位表 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(value = "m_post", onInsert = InsertFullColumnHandler.class, onUpdate = UpdateFullColumnHandler.class)
public class MPost extends BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 岗位ID
*/
private Long postId;
/**
* 岗位编码
*/
private String postCode;
/**
* 岗位名称
*/
private String postName;
/**
* 显示顺序
*/
private Integer postSort;
/**
* 备注
*/
private String remark;
/**
* 状态 0禁用 1正常
*/
private Integer status;
/**
* 租户编号
*/
@Column(tenantId = true)
private Long tenantId;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MRole.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 角色表 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(value = "m_role", onInsert = InsertFullColumnHandler.class, onUpdate = UpdateFullColumnHandler.class)
public class MRole extends BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 角色ID
*/
private Long roleId;
/**
* 角色名称
*/
private String roleName;
/**
* 角色编码
*/
private String roleCode;
/**
* 显示顺序
*/
private Integer roleSort;
/**
* 状态 0禁用 1正常
*/
private Integer status;
/**
* 备注
*/
private String remark;
/**
* 租户编号
*/
@Column(tenantId = true)
private Long tenantId;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MRoleDept.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 角色与部门关联表 1角色-N部门 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Table(value = "m_role_dept")
public class MRoleDept implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 角色ID
*/
private Long roleId;
/**
* 部门ID
*/
private Long deptId;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MRolePerm.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 角色与权限关联表 1角色-N权限 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Table(value = "m_role_perm")
public class MRolePerm implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 角色ID
*/
private Long roleId;
/**
* 权限ID
*/
private Long permId;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MStorage.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 存储管理表 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(value = "m_storage", onInsert = InsertFullColumnHandler.class, onUpdate = UpdateFullColumnHandler.class)
public class MStorage extends BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Long storageId;
/**
* 名称
*/
private String storageName;
/**
* 存储类型,用于标识存储平台,如本地、阿里云oss、七牛云oss等
*/
private String storageType;
/**
* 说明
*/
private String description;
/**
* 存储配置,JSON数据
*/
private String storageConfig;
/**
* 状态
*/
private Integer status;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MTenant.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 租户表 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(value = "m_tenant", onInsert = InsertFullColumnHandler.class, onUpdate = UpdateFullColumnHandler.class)
public class MTenant extends BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 租户ID
*/
private Long tenantId;
/**
* 用户ID
*/
private Long userId;
/**
* 租户套餐ID
*/
private Long packageId;
/**
* 租户名
*/
private String tenantName;
/**
* 租户过期时间
*/
private LocalDateTime expireTime;
/**
* 可创建账号数量
*/
private Integer accountCount;
/**
* 数据隔离方式 column字段隔离(默认) db数据库隔离
*/
private String dataIsolation;
/**
* 数据源名称 master默认使用主库
*/
private String datasource;
/**
* 存储ID 表示该租户使用哪个文件存储
*/
private Long storageId;
/**
* 状态 0禁用 1正常
*/
private Integer status;
/**
* 备注
*/
private String remark;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MTenantDatasource.java
================================================
package com.minimalist.basic.entity.po;
import com.mybatisflex.annotation.Id;
import com.mybatisflex.annotation.KeyType;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 租户数据源表 实体类。
*
* @author asus
* @since 2025-02-14
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Table(value = "m_tenant_datasource")
public class MTenantDatasource implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/** ID自增 */
@Id(keyType = KeyType.Auto)
private Long id;
/**
* 数据源ID
*/
private Long datasourceId;
/**
* 租户ID
*/
private Long tenantId;
/**
* 数据源名称
*/
private String datasourceName;
/**
* 数据源连接
*/
private String datasourceUrl;
/**
* 数据源用户名
*/
private String username;
/**
* 数据源密码
*/
private String password;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MTenantPackage.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 租户套餐表 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(value = "m_tenant_package", onInsert = InsertFullColumnHandler.class, onUpdate = UpdateFullColumnHandler.class)
public class MTenantPackage extends BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 套餐ID
*/
private Long packageId;
/**
* 套餐名称
*/
private String packageName;
/**
* 状态 0禁用 1正常
*/
private Integer status;
/**
* 备注
*/
private String remark;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MTenantPackagePerm.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 租户套餐与权限关联表 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Table(value = "m_tenant_package_perm")
public class MTenantPackagePerm implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 租户套餐ID
*/
private Long packageId;
/**
* 权限ID
*/
private Long permId;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MUser.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Column;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 用户表 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@Table(value = "m_user", onInsert = InsertFullColumnHandler.class, onUpdate = UpdateFullColumnHandler.class)
public class MUser extends BaseEntity implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private Long userId;
/**
* 用户账号
*/
private String username;
/**
* 密码
*/
private String password;
/**
* 盐值
*/
private String salt;
/**
* 用户昵称
*/
private String nickname;
/**
* 用户真实姓名
*/
private String userRealName;
/**
* 用户邮箱
*/
private String email;
/**
* 手机号码
*/
private String phone;
/**
* 用户性别 0未知 1男 2女
*/
private Integer userSex;
/**
* 头像base64编码
*/
private String userAvatar;
/**
* 备注
*/
private String remark;
/**
* 状态 0禁用 1正常
*/
private Integer status;
/**
* 租户编号
*/
@Column(tenantId = true)
private Long tenantId;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MUserDept.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 用户与岗位关联表 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Table(value = "m_user_dept")
public class MUserDept implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private Long userId;
/**
* 部门ID
*/
private Long deptId;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MUserPost.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 用户与岗位关联表 1用户-N岗位 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Table(value = "m_user_post")
public class MUserPost implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private Long userId;
/**
* 岗位ID
*/
private Long postId;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MUserRole.java
================================================
package com.minimalist.basic.entity.po;
import com.minimalist.basic.config.mybatis.InsertFullColumnHandler;
import com.minimalist.basic.config.mybatis.UpdateFullColumnHandler;
import com.minimalist.basic.config.mybatis.bo.BaseEntity;
import com.mybatisflex.annotation.Table;
import java.io.Serializable;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.EqualsAndHashCode;
import java.io.Serial;
/**
* 用户与角色关联表 1用户-N角色 实体类。
*
* @author 小太阳
* @since 2024-10-18
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode
@Table(value = "m_user_role")
public class MUserRole implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
private Long userId;
/**
* 角色ID
*/
private Long roleId;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/config/ConfigQueryVO.java
================================================
package com.minimalist.basic.entity.vo.config;
import com.minimalist.basic.entity.enums.StatusEnum;
import com.minimalist.basic.config.mybatis.bo.PageReq;
import com.minimalist.basic.config.swagger.SchemaEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Data
@Schema(name = "参数配置查询实体")
public class ConfigQueryVO extends PageReq implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(name = "configName", description = "参数名称", type = "string")
private String configName;
@Schema(name = "configKey", description = "参数键名", type = "string")
private String configKey;
@SchemaEnum(implementation = StatusEnum.class)
@Schema(name = "status", description = "参数配置状态", type = "integer")
private Integer status;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/config/ConfigVO.java
================================================
package com.minimalist.basic.entity.vo.config;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.minimalist.basic.entity.enums.StatusEnum;
import com.minimalist.basic.config.swagger.SchemaEnum;
import com.minimalist.basic.utils.Add;
import com.minimalist.basic.utils.Update;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Data
@Schema(name = "参数配置实体")
public class ConfigVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@NotNull(message = "参数ID不能为空", groups = {Update.class})
@JsonSerialize(using = ToStringSerializer.class)
@Schema(name = "configId", description = "参数ID", type = "string")
private Long configId;
@NotBlank(message = "参数名称不能为空", groups = {Add.class, Update.class})
@Schema(name = "configName", description = "参数名称", type = "string")
private String configName;
@NotBlank(message = "参数键名不能为空", groups = {Add.class, Update.class})
@Schema(name = "configKey", description = "参数键名", type = "string")
private String configKey;
@NotBlank(message = "参数键值不能为空", groups = {Add.class, Update.class})
@Schema(name = "configValue", description = "参数键值", type = "string")
private String configValue;
@Schema(name = "description", description = "说明", type = "string")
private String description;
@SchemaEnum(implementation = StatusEnum.class)
@NotNull(message = "参数配置状态不能为空", groups = {Update.class})
@Schema(name = "status", description = "参数配置状态", type = "integer")
private Integer status;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dept/DeptQueryVO.java
================================================
package com.minimalist.basic.entity.vo.dept;
import com.minimalist.basic.entity.enums.StatusEnum;
import com.minimalist.basic.config.swagger.SchemaEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Data
@Schema(name = "部门查询实体")
public class DeptQueryVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(name = "deptName", description = "部门名称", type = "string")
private String deptName;
@SchemaEnum(implementation = StatusEnum.class)
@Schema(name = "status", description = "部门状态", type = "integer")
private Integer status;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dept/DeptVO.java
================================================
package com.minimalist.basic.entity.vo.dept;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.minimalist.basic.entity.enums.StatusEnum;
import com.minimalist.basic.config.swagger.SchemaEnum;
import com.minimalist.basic.utils.Add;
import com.minimalist.basic.utils.Update;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@Data
@Schema(name = "部门实体")
public class DeptVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@NotNull(message = "部门ID不能为空", groups = {Update.class})
@JsonSerialize(using = ToStringSerializer.class)
@Schema(name = "deptId", description = "部门id", type = "string")
private Long deptId;
@NotNull(message = "上级部门ID不能为空", groups = {Add.class, Update.class})
@Schema(name = "parentDeptId", description = "父部门ID", type = "string")
@JsonSerialize(using = ToStringSerializer.class)
private Long parentDeptId;
@Schema(name = "ancestors", description = "祖级列表", type = "string")
private String ancestors;
@NotBlank(message = "部门名称不能为空", groups = {Add.class, Update.class})
@Schema(name = "deptName", description = "部门名称", type = "string")
private String deptName;
@NotNull(message = "排序值不能为空", groups = {Add.class, Update.class})
@Schema(name = "deptSort", description = "排序值", type = "integer")
private Integer deptSort;
@NotNull(message = "部门负责人不能为空", groups = {Add.class, Update.class})
@Schema(name = "deptLeader", description = "部门负责人", type = "string")
@JsonSerialize(using = ToStringSerializer.class)
private Long deptLeader;
@NotBlank(message = "部门电话不能为空", groups = {Add.class, Update.class})
@Schema(name = "phone", description = "部门电话", type = "string")
private String phone;
@NotBlank(message = "部门邮箱不能为空", groups = {Add.class, Update.class})
@Schema(name = "email", description = "部门邮箱", type = "string")
private String email;
@SchemaEnum(implementation = StatusEnum.class)
@NotNull(message = "部门状态不能为空", groups = {Update.class})
@Schema(name = "status", description = "部门状态", type = "integer")
private Integer status;
@JsonSerialize(using = ToStringSerializer.class)
@Schema(name = "tenantId", description = "租户ID", type = "string")
private Long tenantId;
@Schema(name = "children", description = "部门子集", type = "array")
private List<DeptVO> children;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictCacheVO.java
================================================
package com.minimalist.basic.entity.vo.dict;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@Data
@Schema(name = "字典数据实体 - 一般用于下拉框的数据展示或编码转换使用")
public class DictCacheVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Data
@Schema(name = "字典key和value实体")
public static class DictKV {
@Schema(name = "dictKey", description = "字典key,字典编码", type = "string")
private String dictKey;
@Schema(name = "dictValue", description = "字典value,字典编码对应的中文", type = "string")
private String dictValue;
@Schema(name = "dictType", description = "字典类型", type = "string")
private String dictType;
@Schema(name = "dictClass", description = "字典样式,对应前端Tag组件的type", type = "string")
private String dictClass;
}
@Schema(name = "dictType", description = "字典类型", type = "string")
private String dictType;
@Schema(name = "dictList", description = "字典列表", type = "array")
private List<DictKV> dictList;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictDataVO.java
================================================
package com.minimalist.basic.entity.vo.dict;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import com.minimalist.basic.entity.enums.StatusEnum;
import com.minimalist.basic.config.swagger.SchemaEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Data
@Schema(name = "字典数据实体")
public class DictDataVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@JsonSerialize(using = ToStringSerializer.class)
@Schema(name = "dictId", description = "字典ID", type = "string")
private Long dictId;
@NotBlank(message = "字典key不能为空")
@Schema(name = "dictKey", description = "字典key", type = "string")
private String dictKey;
@NotBlank(message = "字典value不能为空")
@Schema(name = "dictValue", description = "字典value", type = "string")
private String dictValue;
@NotNull(message = "字典排序值不能为空")
@Schema(name = "dictOrder", description = "字典排序值", type = "integer")
private Integer dictOrder;
@Schema(name = "dictClass", description = "字典样式,对应前端Tag组件的type", type = "string")
private String dictClass;
@SchemaEnum(implementation = StatusEnum.class)
@Schema(name = "status", description = "字典状态", type = "integer")
private Integer status;
}
================================================
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictInfoVO.java
================================================
package com.minimalist.basic.entity.vo.dict;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@Data
@Schema(name = "字典基础信息实体")
public class DictInfoVO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@NotBlank(message = "字典类型不能为空")
gitextract_koj_vsiu/
├── .gitignore
├── LICENSE
├── README.md
├── minimalist-application/
│ ├── pom.xml
│ └── src/
│ └── main/
│ ├── java/
│ │ └── com/
│ │ └── minimalist/
│ │ └── application/
│ │ ├── MinimalistBasicApplication.java
│ │ └── config/
│ │ ├── GlobalExceptionHandler.java
│ │ └── satoken/
│ │ ├── SaTokenConfigure.java
│ │ └── SaTokenInterfaceImpl.java
│ └── resources/
│ ├── application-dev.yml
│ ├── application.yml
│ └── logback-dev.xml
├── minimalist-basic/
│ ├── pom.xml
│ └── src/
│ ├── main/
│ │ ├── java/
│ │ │ └── com/
│ │ │ └── minimalist/
│ │ │ └── basic/
│ │ │ ├── config/
│ │ │ │ ├── async/
│ │ │ │ │ ├── AsyncConfig.java
│ │ │ │ │ └── ThreadPoolConfig.java
│ │ │ │ ├── convert/
│ │ │ │ │ ├── FileSizeDeserializer.java
│ │ │ │ │ ├── FileSizeSerializer.java
│ │ │ │ │ └── LongArrJsonSerializer.java
│ │ │ │ ├── dataConfig/
│ │ │ │ │ └── SystemConfigInit.java
│ │ │ │ ├── eDict/
│ │ │ │ │ ├── BeanMethod.java
│ │ │ │ │ ├── EDict.java
│ │ │ │ │ ├── EDictConstant.java
│ │ │ │ │ └── EDictInit.java
│ │ │ │ ├── exception/
│ │ │ │ │ └── BusinessException.java
│ │ │ │ ├── fileHandler/
│ │ │ │ │ ├── FileManager.java
│ │ │ │ │ ├── FileResourcesInit.java
│ │ │ │ │ ├── entity/
│ │ │ │ │ │ ├── LocalFileEntity.java
│ │ │ │ │ │ ├── MinIOFileEntity.java
│ │ │ │ │ │ └── QiNiuFileEntity.java
│ │ │ │ │ └── handler/
│ │ │ │ │ ├── FileHandler.java
│ │ │ │ │ └── impl/
│ │ │ │ │ ├── LocalFileHandler.java
│ │ │ │ │ ├── MinIOFileHandler.java
│ │ │ │ │ └── QiNiuFileHandler.java
│ │ │ │ ├── mybatis/
│ │ │ │ │ ├── GeneratorCodeHandler.java
│ │ │ │ │ ├── InsertFullColumnHandler.java
│ │ │ │ │ ├── MyBatisFlexConfiguration.java
│ │ │ │ │ ├── UpdateFullColumnHandler.java
│ │ │ │ │ └── bo/
│ │ │ │ │ ├── BaseEntity.java
│ │ │ │ │ ├── PageReq.java
│ │ │ │ │ └── PageResp.java
│ │ │ │ ├── redis/
│ │ │ │ │ ├── RedisManager.java
│ │ │ │ │ └── RedissonConfiguration.java
│ │ │ │ ├── resubmit/
│ │ │ │ │ ├── ReSubmit.java
│ │ │ │ │ └── ReSubmitAspect.java
│ │ │ │ ├── swagger/
│ │ │ │ │ ├── ParameterHandler.java
│ │ │ │ │ ├── PropertyHandler.java
│ │ │ │ │ ├── SchemaEnum.java
│ │ │ │ │ ├── SchemaEnumHandler.java
│ │ │ │ │ └── SwaggerConfig.java
│ │ │ │ ├── tenant/
│ │ │ │ │ ├── TenantDatasourceInterceptor.java
│ │ │ │ │ ├── TenantIgnore.java
│ │ │ │ │ ├── TenantIgnoreAspect.java
│ │ │ │ │ ├── TenantInit.java
│ │ │ │ │ └── TenantWebMvcConfig.java
│ │ │ │ └── trace/
│ │ │ │ ├── TraceIdInterceptor.java
│ │ │ │ └── WebMvcConfig.java
│ │ │ ├── controller/
│ │ │ │ ├── ConfigController.java
│ │ │ │ ├── DeptController.java
│ │ │ │ ├── DictController.java
│ │ │ │ ├── FileController.java
│ │ │ │ ├── NoticeController.java
│ │ │ │ ├── PermController.java
│ │ │ │ ├── PostController.java
│ │ │ │ ├── RoleController.java
│ │ │ │ ├── StorageController.java
│ │ │ │ ├── TenantController.java
│ │ │ │ ├── TenantPackageController.java
│ │ │ │ └── UserController.java
│ │ │ ├── entity/
│ │ │ │ ├── enums/
│ │ │ │ │ ├── ConfigEnum.java
│ │ │ │ │ ├── DeptEnum.java
│ │ │ │ │ ├── DictEnum.java
│ │ │ │ │ ├── FileEnum.java
│ │ │ │ │ ├── NoticeEnum.java
│ │ │ │ │ ├── PermEnum.java
│ │ │ │ │ ├── PostEnum.java
│ │ │ │ │ ├── RespEnum.java
│ │ │ │ │ ├── RoleEnum.java
│ │ │ │ │ ├── StatusEnum.java
│ │ │ │ │ ├── StorageEnum.java
│ │ │ │ │ ├── TenantEnum.java
│ │ │ │ │ └── UserEnum.java
│ │ │ │ ├── po/
│ │ │ │ │ ├── MConfig.java
│ │ │ │ │ ├── MDept.java
│ │ │ │ │ ├── MDict.java
│ │ │ │ │ ├── MFile.java
│ │ │ │ │ ├── MNotice.java
│ │ │ │ │ ├── MPerms.java
│ │ │ │ │ ├── MPost.java
│ │ │ │ │ ├── MRole.java
│ │ │ │ │ ├── MRoleDept.java
│ │ │ │ │ ├── MRolePerm.java
│ │ │ │ │ ├── MStorage.java
│ │ │ │ │ ├── MTenant.java
│ │ │ │ │ ├── MTenantDatasource.java
│ │ │ │ │ ├── MTenantPackage.java
│ │ │ │ │ ├── MTenantPackagePerm.java
│ │ │ │ │ ├── MUser.java
│ │ │ │ │ ├── MUserDept.java
│ │ │ │ │ ├── MUserPost.java
│ │ │ │ │ └── MUserRole.java
│ │ │ │ └── vo/
│ │ │ │ ├── config/
│ │ │ │ │ ├── ConfigQueryVO.java
│ │ │ │ │ └── ConfigVO.java
│ │ │ │ ├── dept/
│ │ │ │ │ ├── DeptQueryVO.java
│ │ │ │ │ └── DeptVO.java
│ │ │ │ ├── dict/
│ │ │ │ │ ├── DictCacheVO.java
│ │ │ │ │ ├── DictDataVO.java
│ │ │ │ │ ├── DictInfoVO.java
│ │ │ │ │ ├── DictListVO.java
│ │ │ │ │ ├── DictQueryVO.java
│ │ │ │ │ └── DictVO.java
│ │ │ │ ├── file/
│ │ │ │ │ ├── FileQueryVO.java
│ │ │ │ │ ├── FileUploadBatchVO.java
│ │ │ │ │ ├── FileUploadRespVO.java
│ │ │ │ │ ├── FileUploadVO.java
│ │ │ │ │ └── FileVO.java
│ │ │ │ ├── notice/
│ │ │ │ │ ├── NoticeQueryVO.java
│ │ │ │ │ └── NoticeVO.java
│ │ │ │ ├── perm/
│ │ │ │ │ ├── PermQueryVO.java
│ │ │ │ │ └── PermVO.java
│ │ │ │ ├── post/
│ │ │ │ │ ├── PostQueryVO.java
│ │ │ │ │ └── PostVO.java
│ │ │ │ ├── role/
│ │ │ │ │ ├── RoleQueryVO.java
│ │ │ │ │ └── RoleVO.java
│ │ │ │ ├── storage/
│ │ │ │ │ ├── StorageQueryVO.java
│ │ │ │ │ └── StorageVO.java
│ │ │ │ ├── tenant/
│ │ │ │ │ ├── TenantDatasourceVO.java
│ │ │ │ │ ├── TenantPackageQueryVO.java
│ │ │ │ │ ├── TenantPackageVO.java
│ │ │ │ │ ├── TenantQueryVO.java
│ │ │ │ │ └── TenantVO.java
│ │ │ │ └── user/
│ │ │ │ ├── ImageCaptchaVO.java
│ │ │ │ ├── RePasswordVO.java
│ │ │ │ ├── UserInfoVO.java
│ │ │ │ ├── UserLoginReqVO.java
│ │ │ │ ├── UserQueryVO.java
│ │ │ │ ├── UserSettingVO.java
│ │ │ │ └── UserVO.java
│ │ │ ├── manager/
│ │ │ │ ├── TenantManager.java
│ │ │ │ └── UserManager.java
│ │ │ ├── mapper/
│ │ │ │ ├── MConfigMapper.java
│ │ │ │ ├── MDeptMapper.java
│ │ │ │ ├── MDictMapper.java
│ │ │ │ ├── MFileMapper.java
│ │ │ │ ├── MNoticeMapper.java
│ │ │ │ ├── MPermsMapper.java
│ │ │ │ ├── MPostMapper.java
│ │ │ │ ├── MRoleDeptMapper.java
│ │ │ │ ├── MRoleMapper.java
│ │ │ │ ├── MRolePermMapper.java
│ │ │ │ ├── MStorageMapper.java
│ │ │ │ ├── MTenantDatasourceMapper.java
│ │ │ │ ├── MTenantMapper.java
│ │ │ │ ├── MTenantPackageMapper.java
│ │ │ │ ├── MTenantPackagePermMapper.java
│ │ │ │ ├── MUserDeptMapper.java
│ │ │ │ ├── MUserMapper.java
│ │ │ │ ├── MUserPostMapper.java
│ │ │ │ └── MUserRoleMapper.java
│ │ │ ├── mq/
│ │ │ │ ├── SystemConfigSyncConsumer.java
│ │ │ │ └── TenantDatasourceSyncConsumer.java
│ │ │ ├── service/
│ │ │ │ ├── ConfigService.java
│ │ │ │ ├── DeptService.java
│ │ │ │ ├── DictService.java
│ │ │ │ ├── EDictService.java
│ │ │ │ ├── FileService.java
│ │ │ │ ├── NoticeService.java
│ │ │ │ ├── PermService.java
│ │ │ │ ├── PostService.java
│ │ │ │ ├── RoleService.java
│ │ │ │ ├── StorageService.java
│ │ │ │ ├── TenantPackageService.java
│ │ │ │ ├── TenantService.java
│ │ │ │ ├── UserService.java
│ │ │ │ └── impl/
│ │ │ │ ├── ConfigServiceImpl.java
│ │ │ │ ├── DeptServiceImpl.java
│ │ │ │ ├── DictServiceImpl.java
│ │ │ │ ├── EDictServiceImpl.java
│ │ │ │ ├── FileServiceImpl.java
│ │ │ │ ├── NoticeServiceImpl.java
│ │ │ │ ├── PermServiceImpl.java
│ │ │ │ ├── PostServiceImpl.java
│ │ │ │ ├── RoleServiceImpl.java
│ │ │ │ ├── StorageServiceImpl.java
│ │ │ │ ├── TenantPackageServiceImpl.java
│ │ │ │ ├── TenantServiceImpl.java
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── utils/
│ │ │ ├── Add.java
│ │ │ ├── CommonConstant.java
│ │ │ ├── RedisKeyConstant.java
│ │ │ ├── TenantUtil.java
│ │ │ ├── TextUtil.java
│ │ │ ├── UnqIdUtil.java
│ │ │ ├── Update.java
│ │ │ └── ValidateUtil.java
│ │ └── resources/
│ │ └── mappers/
│ │ ├── MConfigMapper.xml
│ │ ├── MDeptMapper.xml
│ │ ├── MDictMapper.xml
│ │ ├── MFileMapper.xml
│ │ ├── MNoticeMapper.xml
│ │ ├── MPermsMapper.xml
│ │ ├── MPostMapper.xml
│ │ ├── MRoleDeptMapper.xml
│ │ ├── MRoleMapper.xml
│ │ ├── MRolePermMapper.xml
│ │ ├── MStorageMapper.xml
│ │ ├── MTenantDatasourceMapper.xml
│ │ ├── MTenantMapper.xml
│ │ ├── MTenantPackageMapper.xml
│ │ ├── MTenantPackagePermMapper.xml
│ │ ├── MUserDeptMapper.xml
│ │ ├── MUserMapper.xml
│ │ ├── MUserPostMapper.xml
│ │ └── MUserRoleMapper.xml
│ └── test/
│ └── java/
│ └── com/
│ └── minimalist/
│ └── basic/
│ └── MinimalistBasicApplicationTests.java
├── minimalist-vue3/
│ ├── .gitignore
│ ├── index.html
│ ├── package.json
│ ├── public/
│ │ └── tinymce/
│ │ └── skins/
│ │ ├── content/
│ │ │ ├── dark/
│ │ │ │ └── content.css
│ │ │ ├── default/
│ │ │ │ └── content.css
│ │ │ ├── document/
│ │ │ │ └── content.css
│ │ │ ├── tinymce-5/
│ │ │ │ └── content.css
│ │ │ ├── tinymce-5-dark/
│ │ │ │ └── content.css
│ │ │ └── writer/
│ │ │ └── content.css
│ │ ├── langs/
│ │ │ └── zh-Hans.js
│ │ └── ui/
│ │ ├── oxide/
│ │ │ ├── content.css
│ │ │ ├── content.inline.css
│ │ │ ├── skin.css
│ │ │ └── skin.shadowdom.css
│ │ ├── oxide-dark/
│ │ │ ├── content.css
│ │ │ ├── content.inline.css
│ │ │ ├── skin.css
│ │ │ └── skin.shadowdom.css
│ │ ├── tinymce-5/
│ │ │ ├── content.css
│ │ │ ├── content.inline.css
│ │ │ ├── skin.css
│ │ │ └── skin.shadowdom.css
│ │ └── tinymce-5-dark/
│ │ ├── content.css
│ │ ├── content.inline.css
│ │ ├── skin.css
│ │ └── skin.shadowdom.css
│ ├── src/
│ │ ├── App.vue
│ │ ├── api/
│ │ │ ├── config.js
│ │ │ ├── dept.js
│ │ │ ├── dict.js
│ │ │ ├── file.js
│ │ │ ├── notice.js
│ │ │ ├── perm.js
│ │ │ ├── post.js
│ │ │ ├── role.js
│ │ │ ├── storage.js
│ │ │ ├── tenant.js
│ │ │ ├── tenantPackage.js
│ │ │ └── user.js
│ │ ├── assets/
│ │ │ └── globalStyle.css
│ │ ├── axios.js
│ │ ├── components/
│ │ │ ├── MHeader.vue
│ │ │ ├── MSider.vue
│ │ │ ├── PageTabList.vue
│ │ │ ├── dictValue/
│ │ │ │ └── index.vue
│ │ │ ├── iconSelect/
│ │ │ │ ├── FunctionalIcons.vue
│ │ │ │ └── index.vue
│ │ │ ├── menuTree/
│ │ │ │ └── index.vue
│ │ │ ├── pagination/
│ │ │ │ └── index.vue
│ │ │ ├── tinymceEditor/
│ │ │ │ └── index.vue
│ │ │ └── uploadFile/
│ │ │ └── index.vue
│ │ ├── directives/
│ │ │ ├── permission.js
│ │ │ └── role.js
│ │ ├── main.js
│ │ ├── pages/
│ │ │ ├── 404.vue
│ │ │ ├── basic/
│ │ │ │ ├── config/
│ │ │ │ │ ├── ConfigDetail.vue
│ │ │ │ │ ├── ConfigEdit.vue
│ │ │ │ │ └── ConfigMgt.vue
│ │ │ │ ├── dept/
│ │ │ │ │ ├── DeptDetail.vue
│ │ │ │ │ ├── DeptEdit.vue
│ │ │ │ │ └── DeptMgt.vue
│ │ │ │ ├── dict/
│ │ │ │ │ ├── DictDetail.vue
│ │ │ │ │ ├── DictEdit.vue
│ │ │ │ │ └── DictMgt.vue
│ │ │ │ ├── file/
│ │ │ │ │ ├── FileMgt.vue
│ │ │ │ │ └── FileSelect.vue
│ │ │ │ ├── notice/
│ │ │ │ │ ├── NoticeDetail.vue
│ │ │ │ │ ├── NoticeEdit.vue
│ │ │ │ │ └── NoticeMgt.vue
│ │ │ │ ├── perm/
│ │ │ │ │ ├── PermDetail.vue
│ │ │ │ │ ├── PermEdit.vue
│ │ │ │ │ └── PermMgt.vue
│ │ │ │ ├── post/
│ │ │ │ │ ├── PostDetail.vue
│ │ │ │ │ ├── PostEdit.vue
│ │ │ │ │ └── PostMgt.vue
│ │ │ │ ├── role/
│ │ │ │ │ ├── RoleDetail.vue
│ │ │ │ │ ├── RoleEdit.vue
│ │ │ │ │ └── RoleMgt.vue
│ │ │ │ ├── storage/
│ │ │ │ │ ├── Local.vue
│ │ │ │ │ ├── Minio.vue
│ │ │ │ │ ├── QiNiu.vue
│ │ │ │ │ ├── StorageDetail.vue
│ │ │ │ │ ├── StorageEdit.vue
│ │ │ │ │ └── StorageMgt.vue
│ │ │ │ ├── system/
│ │ │ │ │ └── Swagger.vue
│ │ │ │ ├── tenant/
│ │ │ │ │ ├── TenantDetail.vue
│ │ │ │ │ ├── TenantEdit.vue
│ │ │ │ │ └── TenantMgt.vue
│ │ │ │ ├── tenantPackage/
│ │ │ │ │ ├── TenantPackageDetail.vue
│ │ │ │ │ ├── TenantPackageEdit.vue
│ │ │ │ │ └── TenantPackageMgt.vue
│ │ │ │ └── user/
│ │ │ │ ├── UserDetail.vue
│ │ │ │ ├── UserEdit.vue
│ │ │ │ ├── UserMgt.vue
│ │ │ │ └── UserSetting.vue
│ │ │ ├── container.vue
│ │ │ ├── index.vue
│ │ │ └── login.vue
│ │ ├── router/
│ │ │ └── index.js
│ │ ├── store/
│ │ │ ├── index.js
│ │ │ └── module/
│ │ │ └── sys-store.js
│ │ └── utils/
│ │ ├── cookie.js
│ │ ├── dict.js
│ │ ├── msg.js
│ │ └── sys.js
│ └── vite.config.js
├── pom.xml
└── resources/
└── sql/
└── mysql/
├── 2024-12-03 ~ 2025-03-12期间的SQL变更(第一次使用本项目忽略).sql
└── minimalist_全部sql,如果是第一次使用本项目直接执行这个.sql
SYMBOL INDEX (767 symbols across 203 files)
FILE: minimalist-application/src/main/java/com/minimalist/application/MinimalistBasicApplication.java
class MinimalistBasicApplication (line 7) | @MapperScan("com.minimalist.**.mapper")
method main (line 11) | public static void main(String[] args) {
FILE: minimalist-application/src/main/java/com/minimalist/application/config/GlobalExceptionHandler.java
class GlobalExceptionHandler (line 28) | @Slf4j
method paramsException (line 37) | @ExceptionHandler(value = {IllegalArgumentException.class, MethodArgum...
method customException (line 67) | @ExceptionHandler(value = {BusinessException.class})
method customNotLoginException (line 83) | @ExceptionHandler(value = {NotLoginException.class})
method customNotPermissionException (line 91) | @ExceptionHandler(value = {NotPermissionException.class})
method xssException (line 101) | @ExceptionHandler(value = {HttpMessageNotReadableException.class, Meth...
method exception (line 118) | @ExceptionHandler(value = {Exception.class})
method log (line 126) | private void log(Exception e) {
FILE: minimalist-application/src/main/java/com/minimalist/application/config/satoken/SaTokenConfigure.java
class SaTokenConfigure (line 12) | @Configuration
method addInterceptors (line 18) | @Override
FILE: minimalist-application/src/main/java/com/minimalist/application/config/satoken/SaTokenInterfaceImpl.java
class SaTokenInterfaceImpl (line 16) | @Component
method getPermissionList (line 28) | @Override
method getRoleList (line 41) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/async/AsyncConfig.java
class AsyncConfig (line 16) | @EnableAsync
method getAsyncExecutor (line 25) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/async/ThreadPoolConfig.java
class ThreadPoolConfig (line 10) | @Configuration
method threadPoolExecutor (line 18) | @Bean(name = "threadPoolExecutor")
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/convert/FileSizeDeserializer.java
class FileSizeDeserializer (line 14) | public class FileSizeDeserializer extends JsonDeserializer<Long> {
method deserialize (line 16) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/convert/FileSizeSerializer.java
class FileSizeSerializer (line 14) | public class FileSizeSerializer extends JsonSerializer<Long> {
method serialize (line 16) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/convert/LongArrJsonSerializer.java
class LongArrJsonSerializer (line 14) | public class LongArrJsonSerializer extends JsonSerializer<Collection<Lon...
method serialize (line 16) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/dataConfig/SystemConfigInit.java
class SystemConfigInit (line 9) | @Component
method run (line 15) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/eDict/BeanMethod.java
class BeanMethod (line 13) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/eDict/EDictConstant.java
class EDictConstant (line 7) | @Component
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/eDict/EDictInit.java
class EDictInit (line 22) | @Order(-1)
method run (line 29) | @Override
method postProcessAfterInitialization (line 40) | public void postProcessAfterInitialization(Object bean) {
method cacheBeanMethod (line 63) | private void cacheBeanMethod(Method method, Map<String, Method> proxyM...
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/exception/BusinessException.java
class BusinessException (line 8) | @Data
method BusinessException (line 19) | public BusinessException(Integer code, String message) {
method BusinessException (line 24) | public BusinessException(String message) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/FileManager.java
class FileManager (line 15) | @Component
method getFileHandler (line 30) | public FileHandler getFileHandler(String storageType) {
method getPathByFileSource (line 49) | public String getPathByFileSource(Integer fileSource) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/FileResourcesInit.java
class FileResourcesInit (line 21) | @Order(-1)
method addResourceHandlers (line 28) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/entity/LocalFileEntity.java
class LocalFileEntity (line 6) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/entity/MinIOFileEntity.java
class MinIOFileEntity (line 6) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/entity/QiNiuFileEntity.java
class QiNiuFileEntity (line 6) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/handler/FileHandler.java
type FileHandler (line 7) | public interface FileHandler {
method isHandler (line 14) | boolean isHandler(String storageType);
method valid (line 21) | String valid(String storageConfig);
method uploadFile (line 30) | MFile uploadFile(MultipartFile multipartFile, Integer fileSource, MSto...
method deleteFile (line 37) | boolean deleteFile(MFile file, MStorage storage);
method moveFile (line 45) | boolean moveFile(MFile file, MStorage storage);
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/handler/impl/LocalFileHandler.java
class LocalFileHandler (line 39) | @Slf4j
method isHandler (line 60) | @Override
method valid (line 69) | @Override
method uploadFile (line 86) | @Override
method deleteFile (line 148) | @Override
method moveFile (line 166) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/handler/impl/MinIOFileHandler.java
class MinIOFileHandler (line 13) | @Service
method isHandler (line 21) | @Override
method valid (line 30) | @Override
method uploadFile (line 44) | @Override
method deleteFile (line 55) | @Override
method moveFile (line 67) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/handler/impl/QiNiuFileHandler.java
class QiNiuFileHandler (line 34) | @Slf4j
method isHandler (line 52) | @Override
method valid (line 61) | @Override
method uploadFile (line 75) | @Override
method deleteFile (line 149) | @Override
method moveFile (line 179) | public boolean moveFile(MFile file, MStorage storage) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/GeneratorCodeHandler.java
class GeneratorCodeHandler (line 12) | public class GeneratorCodeHandler {
method main (line 20) | public static void main(String[] args) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/InsertFullColumnHandler.java
class InsertFullColumnHandler (line 14) | @Component
method onInsert (line 17) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/MyBatisFlexConfiguration.java
class MyBatisFlexConfiguration (line 10) | @Configuration
method MyBatisFlexConfiguration (line 15) | public MyBatisFlexConfiguration() {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/UpdateFullColumnHandler.java
class UpdateFullColumnHandler (line 14) | @Component
method onUpdate (line 17) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/bo/BaseEntity.java
class BaseEntity (line 10) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/bo/PageReq.java
class PageReq (line 9) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/bo/PageResp.java
class PageResp (line 12) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/redis/RedisManager.java
class RedisManager (line 13) | @Slf4j
method get (line 26) | public <T> T get(String key) {
method getAndDelete (line 37) | public <T> T getAndDelete(String key) {
method delete (line 46) | public void delete(String key) {
method set (line 57) | public <T> void set(String key, T value, int seconds) {
method tryLock (line 69) | public boolean tryLock(String key, long waitTime, long leaseTime) {
method unLock (line 83) | public void unLock(String key) {
method randomSeconds (line 98) | public int randomSeconds() {
method publishMessage (line 107) | public void publishMessage(String topic, String message) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/redis/RedissonConfiguration.java
class RedissonConfiguration (line 16) | @Configuration
method getSingleRedissonClient (line 26) | @Bean
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/resubmit/ReSubmitAspect.java
class ReSubmitAspect (line 35) | @Slf4j
method around (line 43) | @Around("@annotation(re)")
method getReqParams (line 71) | private String getReqParams(ProceedingJoinPoint joinPoint, Method meth...
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/swagger/ParameterHandler.java
class ParameterHandler (line 13) | @Slf4j
method customize (line 16) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/swagger/PropertyHandler.java
class PropertyHandler (line 13) | @Slf4j
method customize (line 16) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/swagger/SchemaEnumHandler.java
class SchemaEnumHandler (line 14) | @Slf4j
method getSchemaEnumAnnotation (line 22) | protected SchemaEnum getSchemaEnumAnnotation(Annotation[] annotations) {
method getEnumMethodValue (line 41) | protected Object getEnumMethodValue(Enum enumClass, String method) {
method getColumnDescription (line 57) | protected String getColumnDescription(SchemaEnum schemaEnumAnnotation,...
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/swagger/SwaggerConfig.java
class SwaggerConfig (line 11) | @Configuration
method openApi (line 30) | @Bean
method propertyHandler (line 43) | @Bean
method parameterHandler (line 49) | @Bean
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/tenant/TenantDatasourceInterceptor.java
class TenantDatasourceInterceptor (line 17) | @Slf4j
method preHandle (line 20) | @Override
method afterCompletion (line 49) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/tenant/TenantIgnoreAspect.java
class TenantIgnoreAspect (line 16) | @Slf4j
method around (line 21) | @Around("@annotation(tenantIgnore)")
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/tenant/TenantInit.java
class TenantInit (line 29) | @Component
method run (line 47) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/tenant/TenantWebMvcConfig.java
class TenantWebMvcConfig (line 7) | @Configuration
method addInterceptors (line 10) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/trace/TraceIdInterceptor.java
class TraceIdInterceptor (line 15) | @Component
method preHandle (line 18) | @Override
method afterCompletion (line 26) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/config/trace/WebMvcConfig.java
class WebMvcConfig (line 8) | @Configuration
method addInterceptors (line 14) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/ConfigController.java
class ConfigController (line 19) | @Validated
method addConfig (line 28) | @PostMapping("/addConfig")
method deleteConfigByConfigId (line 36) | @DeleteMapping("/deleteConfigByConfigId")
method updateConfigByConfigId (line 46) | @PutMapping("/updateConfigByConfigId")
method getPageConfigList (line 54) | @GetMapping("/getPageConfigList")
method getConfigByConfigId (line 61) | @GetMapping("/getConfigByConfigId/{configId}")
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/DeptController.java
class DeptController (line 19) | @Validated
method addDept (line 28) | @PostMapping("/addDept")
method deleteDeptByDeptId (line 36) | @DeleteMapping("/deleteDeptByDeptId")
method updateDeptByDeptId (line 46) | @PutMapping("/updateDeptByDeptId")
method getDeptList (line 54) | @GetMapping("/getDeptList")
method getEnableDeptList (line 61) | @GetMapping("/getEnableDeptList")
method getDeptByDeptId (line 68) | @GetMapping("/getDeptByDeptId/{deptId}")
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/DictController.java
class DictController (line 18) | @Validated
method addDict (line 27) | @PostMapping("/addDict")
method deleteDictByDictId (line 35) | @DeleteMapping("/deleteDictByDictId")
method deleteDictByDictType (line 45) | @DeleteMapping("/deleteDictByDictType")
method updateDictByDictId (line 55) | @PutMapping("/updateDictByDictId")
method getPageDictList (line 63) | @GetMapping("/getPageDictList")
method getDictByDictType (line 70) | @GetMapping("/getDictByDictType/{dictType}")
method getDictList (line 78) | @GetMapping("/getDictList/{dictTypes}")
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/FileController.java
class FileController (line 18) | @Validated
method uploadFile (line 27) | @PostMapping("/uploadFile")
method uploadFileBatch (line 34) | @PostMapping("/uploadFileBatch")
method deleteFile (line 41) | @DeleteMapping("/deleteFile")
method getPageFileList (line 51) | @GetMapping("/getPageFileList")
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/NoticeController.java
class NoticeController (line 21) | @Validated
method addNotice (line 30) | @XssCleanIgnore
method deleteNoticeByNoticeId (line 39) | @DeleteMapping("/deleteNoticeByNoticeId")
method updateNoticeByNoticeId (line 49) | @XssCleanIgnore
method getPageNoticeList (line 58) | @GetMapping("/getPageNoticeList")
method getNoticeByNoticeId (line 65) | @GetMapping("/getNoticeByNoticeId/{noticeId}")
method getPageHomeNoticeList (line 73) | @GetMapping("/getPageHomeNoticeList")
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/PermController.java
class PermController (line 19) | @Validated
method addPerm (line 28) | @PostMapping("/addPerm")
method deletePermByPermId (line 36) | @DeleteMapping("/deletePermByPermId")
method updatePermByPermId (line 46) | @PutMapping("/updatePermByPermId")
method getPermList (line 54) | @GetMapping("/getPermList")
method getEnablePermList (line 61) | @GetMapping("/getEnablePermList")
method getTenantEnablePermList (line 67) | @GetMapping("/getTenantEnablePermList")
method getPermByPermId (line 73) | @GetMapping("/getPermByPermId/{permId}")
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/PostController.java
class PostController (line 19) | @Validated
method addPost (line 28) | @PostMapping("/addPost")
method deletePostByPostId (line 36) | @DeleteMapping("/deletePostByPostId")
method updatePostByPostId (line 46) | @PutMapping("/updatePostByPostId")
method getPagePostList (line 54) | @GetMapping("/getPagePostList")
method getPostByPostId (line 61) | @GetMapping("/getPostByPostId/{postId}")
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/RoleController.java
class RoleController (line 19) | @Validated
method addRole (line 28) | @PostMapping("/addRole")
method deleteRoleByRoleId (line 36) | @DeleteMapping("/deleteRoleByRoleId")
method updateRoleByRoleId (line 46) | @PutMapping("/updateRoleByRoleId")
method getPageRoleList (line 54) | @GetMapping("/getPageRoleList")
method getRoleByRoleId (line 61) | @GetMapping("/getRoleByRoleId/{roleId}")
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/StorageController.java
class StorageController (line 19) | @Validated
method addStorage (line 28) | @PostMapping("/addStorage")
method deleteStorageByStorageId (line 36) | @DeleteMapping("/deleteStorageByStorageId")
method updateStorageByStorageId (line 46) | @PutMapping("/updateStorageByStorageId")
method getPageStorageList (line 54) | @GetMapping("/getPageStorageList")
method getStorageByStorageId (line 61) | @GetMapping("/getStorageByStorageId/{storageId}")
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/TenantController.java
class TenantController (line 20) | @Validated
method addTenant (line 29) | @TenantIgnore
method deleteTenantByTenantId (line 38) | @TenantIgnore
method updateTenantByTenantId (line 49) | @TenantIgnore
method getPageTenantList (line 58) | @TenantIgnore
method getTenantByTenantId (line 66) | @TenantIgnore
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/TenantPackageController.java
class TenantPackageController (line 20) | @Validated
method addTenantPackage (line 29) | @TenantIgnore
method deleteTenantPackageByTenantPackageId (line 38) | @TenantIgnore
method updateTenantPackageByTenantPackageId (line 49) | @TenantIgnore
method getPageTenantPackageList (line 58) | @TenantIgnore
method getTenantPackageByTenantPackageId (line 66) | @TenantIgnore
FILE: minimalist-basic/src/main/java/com/minimalist/basic/controller/UserController.java
class UserController (line 25) | @Validated
method addUser (line 34) | @PostMapping("/addUser")
method deleteUserByUserId (line 42) | @DeleteMapping("/deleteUserByUserId")
method updateUserByUserId (line 52) | @PutMapping("/updateUserByUserId")
method getPageUserList (line 60) | @GetMapping("/getPageUserList")
method getUserByUserId (line 67) | @GetMapping("/getUserByUserId/{userId}")
method getUserInfo (line 77) | @GetMapping("/getUserInfo")
method getImageCaptcha (line 83) | @SaIgnore
method login (line 90) | @SaIgnore
method logout (line 98) | @PostMapping("/logout")
method resetPassword (line 105) | @SaCheckLogin
method updateUserAvatar (line 113) | @SaCheckLogin
method updateUserInfo (line 123) | @SaCheckLogin
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/ConfigEnum.java
class ConfigEnum (line 6) | public class ConfigEnum {
type ErrorMsg (line 9) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/DeptEnum.java
class DeptEnum (line 6) | public class DeptEnum {
type ErrorMsg (line 9) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/DictEnum.java
class DictEnum (line 6) | public class DictEnum {
type ErrorMsg (line 9) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/FileEnum.java
class FileEnum (line 6) | public class FileEnum {
type ErrorMsg (line 9) | @Getter
type FileSource (line 24) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/NoticeEnum.java
class NoticeEnum (line 6) | public class NoticeEnum {
type ErrorMsg (line 9) | @Getter
type NoticeType (line 18) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/PermEnum.java
class PermEnum (line 6) | public class PermEnum {
type ErrorMsg (line 9) | @Getter
type PermType (line 19) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/PostEnum.java
class PostEnum (line 6) | public class PostEnum {
type ErrorMsg (line 9) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/RespEnum.java
type RespEnum (line 6) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/RoleEnum.java
class RoleEnum (line 6) | public class RoleEnum {
type Role (line 9) | @Getter
type ErrorMsg (line 22) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/StatusEnum.java
type StatusEnum (line 10) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/StorageEnum.java
class StorageEnum (line 6) | public class StorageEnum {
type ErrorMsg (line 9) | @Getter
type StorageType (line 18) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/TenantEnum.java
class TenantEnum (line 6) | public class TenantEnum {
type ErrorMsg (line 9) | @Getter
type DataIsolation (line 35) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/UserEnum.java
class UserEnum (line 6) | public class UserEnum {
type ErrorMsg (line 9) | @Getter
type UserSex (line 35) | @Getter
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MConfig.java
class MConfig (line 22) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MDept.java
class MDept (line 23) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MDict.java
class MDict (line 22) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MFile.java
class MFile (line 23) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MNotice.java
class MNotice (line 23) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MPerms.java
class MPerms (line 22) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MPost.java
class MPost (line 23) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MRole.java
class MRole (line 23) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MRoleDept.java
class MRoleDept (line 22) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MRolePerm.java
class MRolePerm (line 22) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MStorage.java
class MStorage (line 21) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MTenant.java
class MTenant (line 23) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MTenantDatasource.java
class MTenantDatasource (line 20) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MTenantPackage.java
class MTenantPackage (line 22) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MTenantPackagePerm.java
class MTenantPackagePerm (line 22) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MUser.java
class MUser (line 23) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MUserDept.java
class MUserDept (line 22) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MUserPost.java
class MUserPost (line 22) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MUserRole.java
class MUserRole (line 22) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/config/ConfigQueryVO.java
class ConfigQueryVO (line 12) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/config/ConfigVO.java
class ConfigVO (line 16) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dept/DeptQueryVO.java
class DeptQueryVO (line 10) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dept/DeptVO.java
class DeptVO (line 17) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictCacheVO.java
class DictCacheVO (line 9) | @Data
class DictKV (line 16) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictDataVO.java
class DictDataVO (line 14) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictInfoVO.java
class DictInfoVO (line 12) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictListVO.java
class DictListVO (line 10) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictQueryVO.java
class DictQueryVO (line 11) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictVO.java
class DictVO (line 12) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/file/FileQueryVO.java
class FileQueryVO (line 11) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/file/FileUploadBatchVO.java
class FileUploadBatchVO (line 12) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/file/FileUploadRespVO.java
class FileUploadRespVO (line 12) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/file/FileUploadVO.java
class FileUploadVO (line 10) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/file/FileVO.java
class FileVO (line 15) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/notice/NoticeQueryVO.java
class NoticeQueryVO (line 15) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/notice/NoticeVO.java
class NoticeVO (line 24) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/perm/PermQueryVO.java
class PermQueryVO (line 10) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/perm/PermVO.java
class PermVO (line 18) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/post/PostQueryVO.java
class PostQueryVO (line 11) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/post/PostVO.java
class PostVO (line 16) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/role/RoleQueryVO.java
class RoleQueryVO (line 11) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/role/RoleVO.java
class RoleVO (line 19) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/storage/StorageQueryVO.java
class StorageQueryVO (line 12) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/storage/StorageVO.java
class StorageVO (line 17) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/tenant/TenantDatasourceVO.java
class TenantDatasourceVO (line 11) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/tenant/TenantPackageQueryVO.java
class TenantPackageQueryVO (line 11) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/tenant/TenantPackageVO.java
class TenantPackageVO (line 18) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/tenant/TenantQueryVO.java
class TenantQueryVO (line 11) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/tenant/TenantVO.java
class TenantVO (line 23) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/user/ImageCaptchaVO.java
class ImageCaptchaVO (line 9) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/user/RePasswordVO.java
class RePasswordVO (line 9) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/user/UserInfoVO.java
class UserInfoVO (line 19) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/user/UserLoginReqVO.java
class UserLoginReqVO (line 10) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/user/UserQueryVO.java
class UserQueryVO (line 9) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/user/UserSettingVO.java
class UserSettingVO (line 12) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/user/UserVO.java
class UserVO (line 22) | @Data
FILE: minimalist-basic/src/main/java/com/minimalist/basic/manager/TenantManager.java
class TenantManager (line 29) | @Component
method checkTenantPackage (line 54) | public void checkTenantPackage(long tenantId) {
method checkTenantExpireTime (line 73) | public void checkTenantExpireTime(LocalDateTime expireTime) {
method updateTenantPermission (line 83) | public void updateTenantPermission(List<MRole> roleList, Long packageI...
method dynamicAddDatasource (line 119) | public void dynamicAddDatasource(String tenantId, TenantDatasourceVO t...
method dynamicDeleteDatasource (line 133) | public void dynamicDeleteDatasource(String tenantId) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/manager/UserManager.java
class UserManager (line 28) | @Component
method passwordEncrypt (line 49) | public String passwordEncrypt(String password, String salt) {
method checkUsernameUniqueness (line 60) | public void checkUsernameUniqueness(String username, Long userId) {
method checkUserEmailUniqueness (line 75) | public void checkUserEmailUniqueness(String email, Long userId) {
method insertUserRelation (line 91) | public void insertUserRelation(Set<Long> roleIds, Set<Long> postIds, S...
method deleteUserRelation (line 128) | public void deleteUserRelation(Long userId) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MConfigMapper.java
type MConfigMapper (line 15) | public interface MConfigMapper extends BaseMapper<MConfig> {
method selectConfigByConfigId (line 22) | default MConfig selectConfigByConfigId(Long configId) {
method selectConfigByConfigKey (line 32) | default MConfig selectConfigByConfigKey(String configKey, Integer stat...
method deleteConfigByConfigId (line 43) | default int deleteConfigByConfigId(Long configId) {
method updateConfigByConfigId (line 51) | default void updateConfigByConfigId(MConfig updateConfig) {
method selectPageConfigList (line 60) | default Page<MConfig> selectPageConfigList(ConfigQueryVO queryVO) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MDeptMapper.java
type MDeptMapper (line 16) | public interface MDeptMapper extends BaseMapper<MDept> {
method selectChildrenCountByDeptId (line 23) | default long selectChildrenCountByDeptId(Long deptId) {
method deleteDeptByDeptId (line 31) | default void deleteDeptByDeptId(Long deptId) {
method selectDeptByDeptId (line 41) | default MDept selectDeptByDeptId(Long deptId) {
method selectDeptByDeptIds (line 50) | default List<MDept> selectDeptByDeptIds(List<Long> deptIds) {
method updateDeptByDeptId (line 58) | default void updateDeptByDeptId(MDept mDept) {
method selectDeptList (line 68) | default List<MDept> selectDeptList(DeptQueryVO queryVO) {
method selectDeptDict (line 78) | default List<MDept> selectDeptDict() {
method selectChildrenDeptByDeptId (line 88) | default List<MDept> selectChildrenDeptByDeptId(Long deptId) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MDictMapper.java
type MDictMapper (line 17) | public interface MDictMapper extends BaseMapper<MDict> {
method selectDictByDictId (line 23) | default MDict selectDictByDictId(Long dictId) {
method deleteDictByDictId (line 31) | default void deleteDictByDictId(Long dictId) {
method deleteDictByDictType (line 39) | default void deleteDictByDictType(String dictType) {
method selectPageDictList (line 48) | default Page<DictVO> selectPageDictList(DictQueryVO queryVO) {
method selectDictListByDictType (line 62) | default List<MDict> selectDictListByDictType(List<String> dictTypeList) {
method updateDictByDictId (line 70) | default void updateDictByDictId(MDict dict) {
method selectDictByDictTypeAndKey (line 80) | default MDict selectDictByDictTypeAndKey(String dictType, String dictK...
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MFileMapper.java
type MFileMapper (line 18) | public interface MFileMapper extends BaseMapper<MFile> {
method updateStatusByFileUrl (line 25) | default void updateStatusByFileUrl(Long userId, List<String> urlList, ...
method selectPageFileList (line 38) | default Page<MFile> selectPageFileList(FileQueryVO queryVO) {
method selectFileByFileId (line 53) | default MFile selectFileByFileId(Long fileId) {
method selectFileByFileIds (line 62) | default List<MFile> selectFileByFileIds(List<Long> fileIdList) {
method updateFileStatusByFileIds (line 73) | default void updateFileStatusByFileIds(Long userId, List<Long> fileIdL...
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MNoticeMapper.java
type MNoticeMapper (line 20) | public interface MNoticeMapper extends BaseMapper<MNotice> {
method deleteNoticeByNoticeId (line 25) | default void deleteNoticeByNoticeId(Long noticeId) {
method updateNoticeByNoticeId (line 33) | default void updateNoticeByNoticeId(MNotice notice) {
method selectPageNoticeList (line 42) | default Page<MNotice> selectPageNoticeList(NoticeQueryVO queryVO) {
method selectNoticeByNoticeId (line 57) | default MNotice selectNoticeByNoticeId(Long noticeId) {
method selectHomePageNoticeList (line 65) | default Page<MNotice> selectHomePageNoticeList(PageReq pageReq) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MPermsMapper.java
type MPermsMapper (line 16) | public interface MPermsMapper extends BaseMapper<MPerms> {
method selectPermsByPermsIds (line 23) | default List<MPerms> selectPermsByPermsIds(List<Long> permsIds) {
method selectPermsByPermId (line 32) | default MPerms selectPermsByPermId(Long permId) {
method updatePermsByPermId (line 40) | default void updatePermsByPermId(MPerms perms) {
method selectChildrenCountByPermId (line 49) | default long selectChildrenCountByPermId(Long permId) {
method deletePermsByPermId (line 57) | default void deletePermsByPermId(Long permId) {
method selectPermList (line 66) | default List<MPerms> selectPermList(PermQueryVO queryVO) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MPostMapper.java
type MPostMapper (line 18) | public interface MPostMapper extends BaseMapper<MPost> {
method selectPostByPostCode (line 25) | default MPost selectPostByPostCode(String postCode) {
method deletePostByPostId (line 33) | default void deletePostByPostId(Long postId) {
method selectPostByPostId (line 42) | default MPost selectPostByPostId(Long postId) {
method selectPostByPostIds (line 51) | default List<PostVO> selectPostByPostIds(List<Long> postIds) {
method updatePostByPostId (line 59) | default void updatePostByPostId(MPost mPost) {
method selectPagePostList (line 68) | default Page<PostVO> selectPagePostList(PostQueryVO queryVO) {
method selectPostDict (line 83) | default List<MPost> selectPostDict() {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MRoleDeptMapper.java
type MRoleDeptMapper (line 12) | public interface MRoleDeptMapper extends BaseMapper<MRoleDept> {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MRoleMapper.java
type MRoleMapper (line 18) | public interface MRoleMapper extends BaseMapper<MRole> {
method selectRoleByRoleCode (line 25) | default MRole selectRoleByRoleCode(String roleCode) {
method selectRoleByRoleId (line 34) | default MRole selectRoleByRoleId(Long roleId) {
method selectRoleByRoleIds (line 43) | default List<RoleVO> selectRoleByRoleIds(List<Long> roleId) {
method deleteRoleByRoleId (line 51) | default void deleteRoleByRoleId(Long roleId) {
method updateRoleByRoleId (line 59) | default void updateRoleByRoleId(MRole role) {
method selectPageRoleList (line 68) | default Page<RoleVO> selectPageRoleList(RoleQueryVO queryVO) {
method selectRoleDict (line 82) | default List<MRole> selectRoleDict() {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MRolePermMapper.java
type MRolePermMapper (line 14) | public interface MRolePermMapper extends BaseMapper<MRolePerm> {
method selectRolePermByRoleIds (line 21) | default List<MRolePerm> selectRolePermByRoleIds(List<Long> roleIds) {
method selectRolePermByRoleId (line 30) | default List<MRolePerm> selectRolePermByRoleId(Long roleId) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MStorageMapper.java
type MStorageMapper (line 16) | public interface MStorageMapper extends BaseMapper<MStorage> {
method selectStorageByStorageId (line 22) | default MStorage selectStorageByStorageId(Long storageId) {
method deleteStorageByStorageId (line 30) | default void deleteStorageByStorageId(Long storageId) {
method updateStorageByStorageId (line 38) | default void updateStorageByStorageId(MStorage storage) {
method selectPageStorageList (line 47) | default Page<StorageVO> selectPageStorageList(StorageQueryVO queryVO) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MTenantDatasourceMapper.java
type MTenantDatasourceMapper (line 13) | public interface MTenantDatasourceMapper extends BaseMapper<MTenantDatas...
method deleteTenantDatasourceByTenantId (line 19) | default void deleteTenantDatasourceByTenantId(Long tenantId) {
method selectTenantDatasourceByTenantId (line 28) | default MTenantDatasource selectTenantDatasourceByTenantId(Long tenant...
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MTenantMapper.java
type MTenantMapper (line 19) | public interface MTenantMapper extends BaseMapper<MTenant> {
method selectTenantCountByTenantPackageId (line 25) | default long selectTenantCountByTenantPackageId(Long tenantPackageId) {
method selectTenantByTenantPackageId (line 34) | default List<MTenant> selectTenantByTenantPackageId(Long tenantPackage...
method selectTenantByTenantName (line 43) | default MTenant selectTenantByTenantName(String tenantName) {
method selectTenantByTenantId (line 52) | default MTenant selectTenantByTenantId(Long tenantId) {
method deleteTenantByTenantId (line 60) | default void deleteTenantByTenantId(Long tenantId) {
method updateTenantByTenantId (line 68) | default void updateTenantByTenantId(MTenant tenant) {
method selectPageTenantList (line 77) | default Page<TenantVO> selectPageTenantList(TenantQueryVO queryVO) {
method selectTenantDict (line 92) | default List<MTenant> selectTenantDict() {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MTenantPackageMapper.java
type MTenantPackageMapper (line 18) | public interface MTenantPackageMapper extends BaseMapper<MTenantPackage> {
method selectTenantPackageByTenantPackageId (line 25) | default MTenantPackage selectTenantPackageByTenantPackageId(Long tenan...
method deleteTenantPackageByTenantPackageId (line 33) | default void deleteTenantPackageByTenantPackageId(Long tenantPackageId) {
method updateTenantPackageByTenantPackageId (line 41) | default void updateTenantPackageByTenantPackageId(MTenantPackage tenan...
method selectPageTenantPackageList (line 50) | default Page<TenantPackageVO> selectPageTenantPackageList(TenantPackag...
method selectTenantPackageDict (line 63) | default List<MTenantPackage> selectTenantPackageDict() {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MTenantPackagePermMapper.java
type MTenantPackagePermMapper (line 14) | public interface MTenantPackagePermMapper extends BaseMapper<MTenantPack...
method selectTenantPackagePermByTenantPackageId (line 21) | default List<MTenantPackagePerm> selectTenantPackagePermByTenantPackag...
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MUserDeptMapper.java
type MUserDeptMapper (line 14) | public interface MUserDeptMapper extends BaseMapper<MUserDept> {
method selectUserDeptRelation (line 21) | default List<MUserDept> selectUserDeptRelation(Long userId) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MUserMapper.java
type MUserMapper (line 27) | public interface MUserMapper extends BaseMapper<MUser> {
method selectUserByUsername (line 34) | default MUser selectUserByUsername(String username) {
method selectUserByUserId (line 43) | default MUser selectUserByUserId(Long userId) {
method selectUserByUserIds (line 52) | default List<MUser> selectUserByUserIds(List<Long> userIdList) {
method selectUserDict (line 60) | default List<MUser> selectUserDict() {
method selectUserCountByTenantId (line 69) | default long selectUserCountByTenantId(Long tenantId) {
method selectUserByPhone (line 78) | default MUser selectUserByPhone(String phone) {
method deleteUserByUserId (line 86) | default void deleteUserByUserId(Long userId) {
method updateUserByUserId (line 94) | default void updateUserByUserId(MUser user) {
method selectUserCountByDeptIds (line 103) | default long selectUserCountByDeptIds(List<Long> deptIds) {
method selectPageUserList (line 116) | default Page<UserVO> selectPageUserList(UserQueryVO query) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MUserPostMapper.java
type MUserPostMapper (line 14) | public interface MUserPostMapper extends BaseMapper<MUserPost> {
method selectUserPostRelation (line 21) | default List<MUserPost> selectUserPostRelation(Long userId) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mapper/MUserRoleMapper.java
type MUserRoleMapper (line 14) | public interface MUserRoleMapper extends BaseMapper<MUserRole> {
method selectUserRoleRelation (line 21) | default List<MUserRole> selectUserRoleRelation(Long userId) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mq/SystemConfigSyncConsumer.java
class SystemConfigSyncConsumer (line 21) | @Slf4j
method run (line 28) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/mq/TenantDatasourceSyncConsumer.java
class TenantDatasourceSyncConsumer (line 24) | @Slf4j
method run (line 34) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/ConfigService.java
type ConfigService (line 7) | public interface ConfigService {
method addConfig (line 13) | void addConfig(ConfigVO configVO);
method deleteConfigByConfigId (line 19) | void deleteConfigByConfigId(Long configId);
method updateConfigByConfigId (line 25) | void updateConfigByConfigId(ConfigVO configVO);
method getPageConfigList (line 32) | PageResp<ConfigVO> getPageConfigList(ConfigQueryVO queryVO);
method getConfigByConfigId (line 39) | ConfigVO getConfigByConfigId(Long configId);
method getConfigByConfigKey (line 46) | ConfigVO getConfigByConfigKey(String configKey);
method refreshConfigCache (line 51) | void refreshConfigCache();
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/DeptService.java
type DeptService (line 7) | public interface DeptService {
method addDept (line 13) | void addDept(DeptVO deptVO);
method deleteDeptByDeptId (line 19) | void deleteDeptByDeptId(Long deptId);
method updateDeptByDeptId (line 25) | void updateDeptByDeptId(DeptVO deptVO);
method getDeptList (line 32) | List<DeptVO> getDeptList(DeptQueryVO queryVO);
method getDeptByDeptId (line 39) | DeptVO getDeptByDeptId(Long deptId);
method getEnableDeptList (line 45) | List<DeptVO> getEnableDeptList();
method getDeptByDeptIds (line 52) | List<DeptVO> getDeptByDeptIds(List<Long> deptIds);
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/DictService.java
type DictService (line 8) | public interface DictService {
method addDict (line 14) | void addDict(DictInfoVO dictInfoVO);
method deleteDictByDictId (line 20) | void deleteDictByDictId(Long dictId);
method deleteDictByDictType (line 26) | void deleteDictByDictType(String dictType);
method updateDictByDictId (line 32) | void updateDictByDictId(DictInfoVO dictInfoVO);
method getPageDictList (line 39) | PageResp<DictVO> getPageDictList(DictQueryVO queryVO);
method getDictByDictType (line 46) | DictInfoVO getDictByDictType(String dictType);
method getDictList (line 53) | List<DictCacheVO> getDictList(List<String> dictTypes);
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/EDictService.java
type EDictService (line 8) | public interface EDictService {
method getDeptDictData (line 14) | DictCacheVO getDeptDictData();
method getUserDictData (line 20) | DictCacheVO getUserDictData();
method getTenantPackageDictData (line 26) | DictCacheVO getTenantPackageDictData();
method getRoleDictData (line 32) | DictCacheVO getRoleDictData();
method getPostDictData (line 38) | DictCacheVO getPostDictData();
method getTenantDictData (line 44) | DictCacheVO getTenantDictData();
method getStorageDictData (line 50) | DictCacheVO getStorageDictData();
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/FileService.java
type FileService (line 8) | public interface FileService {
method uploadFile (line 15) | FileUploadRespVO uploadFile(FileUploadVO fileUploadVO);
method uploadFileBatch (line 22) | List<FileUploadRespVO> uploadFileBatch(FileUploadBatchVO uploadBatchVO);
method deleteFile (line 28) | void deleteFile(Long fileId);
method moveFile (line 38) | MFile moveFile(Long fileId, Integer fileSource);
method getPageFileList (line 45) | PageResp<FileVO> getPageFileList(FileQueryVO queryVO);
method moveFile (line 54) | String moveFile(List<FileVO> files, Integer fileSource);
method moveFile (line 63) | MFile moveFile(String fileUrl, Integer fileSource);
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/NoticeService.java
type NoticeService (line 8) | public interface NoticeService {
method addNotice (line 14) | void addNotice(NoticeVO noticeVO);
method deleteNoticeByNoticeId (line 20) | void deleteNoticeByNoticeId(Long noticeId);
method updateNoticeByNoticeId (line 26) | void updateNoticeByNoticeId(NoticeVO noticeVO);
method getPageNoticeList (line 33) | PageResp<NoticeVO> getPageNoticeList(NoticeQueryVO queryVO);
method getNoticeByNoticeId (line 40) | NoticeVO getNoticeByNoticeId(Long noticeId);
method getPageHomeNoticeList (line 46) | PageResp<NoticeVO> getPageHomeNoticeList(PageReq pageReq);
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/PermService.java
type PermService (line 9) | public interface PermService {
method getPermsByRoleId (line 16) | List<MPerms> getPermsByRoleId(List<Long> roleIds);
method permsToTree (line 23) | List<PermVO> permsToTree(List<MPerms> permsList);
method addPerm (line 29) | void addPerm(PermVO permVO);
method deletePermByPermId (line 35) | void deletePermByPermId(Long permId);
method updatePermByPermId (line 41) | void updatePermByPermId(PermVO permVO);
method getPermList (line 48) | List<PermVO> getPermList(PermQueryVO queryVO);
method getEnablePermList (line 54) | List<PermVO> getEnablePermList();
method getTenantEnablePermList (line 60) | List<PermVO> getTenantEnablePermList();
method getPermByPermId (line 67) | PermVO getPermByPermId(Long permId);
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/PostService.java
type PostService (line 9) | public interface PostService {
method addPost (line 15) | void addPost(PostVO postVO);
method deletePostByPostId (line 21) | void deletePostByPostId(Long postId);
method updatePostByPostId (line 27) | void updatePostByPostId(PostVO postVO);
method getPagePostList (line 34) | PageResp<PostVO> getPagePostList(PostQueryVO queryVO);
method getPostByPostId (line 41) | PostVO getPostByPostId(Long postId);
method getPostByUserId (line 48) | List<PostVO> getPostByUserId(Long userId);
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/RoleService.java
type RoleService (line 10) | public interface RoleService {
method getRolesByUserId (line 17) | List<RoleVO> getRolesByUserId(Long userId);
method addRole (line 23) | void addRole(RoleVO roleVO);
method deleteRoleByRoleId (line 29) | void deleteRoleByRoleId(Long roleId);
method updateRoleByRoleId (line 35) | void updateRoleByRoleId(RoleVO roleVO);
method getPageRoleList (line 42) | PageResp<RoleVO> getPageRoleList(RoleQueryVO queryVO);
method getRoleByRoleId (line 49) | RoleVO getRoleByRoleId(Long roleId);
method getRoleByTenantId (line 56) | List<MRole> getRoleByTenantId(Long tenantId);
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/StorageService.java
type StorageService (line 7) | public interface StorageService {
method addStorage (line 13) | void addStorage(StorageVO storageVO);
method deleteStorageByStorageId (line 19) | void deleteStorageByStorageId(Long storageId);
method updateStorageByStorageId (line 25) | void updateStorageByStorageId(StorageVO storageVO);
method getPageStorageList (line 32) | PageResp<StorageVO> getPageStorageList(StorageQueryVO queryVO);
method getStorageByStorageId (line 39) | StorageVO getStorageByStorageId(Long storageId);
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/TenantPackageService.java
type TenantPackageService (line 10) | public interface TenantPackageService {
method addTenantPackage (line 16) | void addTenantPackage(TenantPackageVO tenantPackageVO);
method deleteTenantPackageByTenantPackageId (line 22) | void deleteTenantPackageByTenantPackageId(Long tenantPackageId);
method updateTenantPackageByTenantPackageId (line 28) | void updateTenantPackageByTenantPackageId(TenantPackageVO tenantPackag...
method getPageTenantPackageList (line 35) | PageResp<TenantPackageVO> getPageTenantPackageList(TenantPackageQueryV...
method getTenantPackageByTenantPackageId (line 42) | TenantPackageVO getTenantPackageByTenantPackageId(Long tenantPackageId);
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/TenantService.java
type TenantService (line 7) | public interface TenantService {
method addTenant (line 13) | void addTenant(TenantVO tenantVO);
method deleteTenantByTenantId (line 19) | void deleteTenantByTenantId(Long tenantId);
method updateTenantByTenantId (line 25) | void updateTenantByTenantId(TenantVO tenantVO);
method getPageTenantList (line 32) | PageResp<TenantVO> getPageTenantList(TenantQueryVO queryVO);
method getTenantByTenantId (line 39) | TenantVO getTenantByTenantId(Long tenantId);
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/UserService.java
type UserService (line 9) | @Service
method addUser (line 16) | void addUser(UserVO userVO);
method deleteUserByUserId (line 22) | void deleteUserByUserId(Long userId);
method updateUserByUserId (line 28) | void updateUserByUserId(UserVO userVO);
method getPageUserList (line 35) | PageResp<UserVO> getPageUserList(UserQueryVO queryVO);
method getUserByUserId (line 42) | UserVO getUserByUserId(Long userId);
method getUserInfo (line 48) | UserInfoVO getUserInfo();
method getImageCaptcha (line 54) | ImageCaptchaVO getImageCaptcha();
method checkImageCaptcha (line 62) | boolean checkImageCaptcha(String captcha, String captchaId);
method userLogin (line 69) | SaTokenInfo userLogin(UserLoginReqVO reqVO);
method resetPassword (line 75) | void resetPassword(RePasswordVO passwordVO);
method updateUserInfo (line 81) | void updateUserInfo(UserSettingVO settingVO);
method updateUserAvatar (line 87) | void updateUserAvatar(String userAvatar);
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/impl/ConfigServiceImpl.java
class ConfigServiceImpl (line 28) | @Service
method addConfig (line 41) | @Override
method deleteConfigByConfigId (line 58) | @Override
method updateConfigByConfigId (line 74) | @Override
method getPageConfigList (line 92) | @Override
method getConfigByConfigId (line 104) | @Override
method getConfigByConfigKey (line 114) | @Override
method refreshConfigCache (line 129) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/impl/DeptServiceImpl.java
class DeptServiceImpl (line 33) | @Service
method addDept (line 49) | @Override
method deleteDeptByDeptId (line 71) | @Override
method updateDeptByDeptId (line 96) | @Override
method updateChildrenDeptAncestors (line 126) | private void updateChildrenDeptAncestors(Long deptId, String oldAncest...
method getDeptList (line 146) | @Override
method getDeptByDeptId (line 156) | @Override
method getEnableDeptList (line 165) | @Override
method getDeptByDeptIds (line 176) | @Override
method deptToTree (line 187) | private List<DeptVO> deptToTree(List<MDept> deptList) {
method findChildren (line 206) | private void findChildren(List<MDept> deptList, List<DeptVO> rootNodeL...
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/impl/DictServiceImpl.java
class DictServiceImpl (line 39) | @Service
method addDict (line 55) | @Override
method deleteDictByDictId (line 71) | @Override
method deleteDictByDictType (line 87) | @Override
method updateDictByDictId (line 100) | @Override
method getPageDictList (line 150) | @Override
method getDictByDictType (line 161) | @Override
method getDictList (line 190) | @Override
method setDictCacheHandler (line 247) | private List<DictCacheVO> setDictCacheHandler(List<String> dictType) {
method getDictCacheHandler (line 289) | private List<DictCacheVO> getDictCacheHandler(List<String> dictType) {
method buildDictData (line 339) | private List<MDict> buildDictData(DictInfoVO dictInfoVO, boolean unqId) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/impl/EDictServiceImpl.java
class EDictServiceImpl (line 22) | @Service
method getDeptDictData (line 50) | @Override
method getUserDictData (line 74) | @Override
method getTenantPackageDictData (line 84) | @Override
method getRoleDictData (line 108) | @Override
method getPostDictData (line 132) | @Override
method getTenantDictData (line 156) | @Override
method getStorageDictData (line 181) | @Override
method getUserDictList (line 219) | private DictCacheVO getUserDictList(String dictType) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/impl/FileServiceImpl.java
class FileServiceImpl (line 35) | @Service
method uploadFile (line 55) | @Override
method uploadFileBatch (line 71) | @Override
method deleteFile (line 91) | @Override
method moveFile (line 117) | @Override
method getPageFileList (line 141) | @Override
method moveFile (line 165) | @Override
method moveFile (line 193) | @Override
method getStorage (line 217) | private MStorage getStorage(Long storageId) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/impl/NoticeServiceImpl.java
class NoticeServiceImpl (line 34) | @Slf4j
method addNotice (line 51) | @Override
method deleteNoticeByNoticeId (line 78) | @Override
method updateNoticeByNoticeId (line 92) | @Override
method getPageNoticeList (line 120) | @Override
method getNoticeByNoticeId (line 166) | @Override
method getPageHomeNoticeList (line 186) | @Override
method saveNoticeFileHandler (line 202) | private String saveNoticeFileHandler(NoticeVO newNotice) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/impl/PermServiceImpl.java
class PermServiceImpl (line 24) | @Service
method getPermsByRoleId (line 44) | @Override
method permsToTree (line 62) | public List<PermVO> permsToTree(List<MPerms> permsList) {
method addPerm (line 82) | @Override
method deletePermByPermId (line 93) | @Override
method updatePermByPermId (line 105) | @Override
method getPermList (line 116) | @Override
method getEnablePermList (line 125) | @Override
method getTenantEnablePermList (line 136) | @Override
method getPermByPermId (line 157) | @Override
method findChildren (line 167) | private void findChildren(List<MPerms> permsList, List<PermVO> rootNod...
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/impl/PostServiceImpl.java
class PostServiceImpl (line 24) | @Service
method addPost (line 37) | @Override
method deletePostByPostId (line 51) | @Override
method updatePostByPostId (line 65) | @Override
method getPagePostList (line 76) | @Override
method getPostByPostId (line 87) | @Override
method getPostByUserId (line 97) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/impl/RoleServiceImpl.java
class RoleServiceImpl (line 29) | @Service
method getRolesByUserId (line 46) | @Override
method addRole (line 61) | @Override
method deleteRoleByRoleId (line 81) | @Override
method updateRoleByRoleId (line 99) | @Override
method getPageRoleList (line 118) | @Override
method getRoleByRoleId (line 129) | @Override
method getRoleByTenantId (line 145) | @Override
method permIdToRolePerm (line 156) | private List<MRolePerm> permIdToRolePerm(List<Long> permIds, long role...
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/impl/StorageServiceImpl.java
class StorageServiceImpl (line 18) | @Service
method addStorage (line 31) | @Override
method deleteStorageByStorageId (line 48) | @Override
method updateStorageByStorageId (line 57) | @Override
method getPageStorageList (line 72) | @Override
method getStorageByStorageId (line 83) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/impl/TenantPackageServiceImpl.java
class TenantPackageServiceImpl (line 29) | @Service
method addTenantPackage (line 54) | @Override
method deleteTenantPackageByTenantPackageId (line 70) | @Override
method updateTenantPackageByTenantPackageId (line 85) | @Override
method getPageTenantPackageList (line 122) | @Override
method getTenantPackageByTenantPackageId (line 133) | @Override
method buildTenantPackagePerm (line 151) | private List<MTenantPackagePerm> buildTenantPackagePerm(List<Long> per...
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/impl/TenantServiceImpl.java
class TenantServiceImpl (line 35) | @Service
method addTenant (line 75) | @Override
method deleteTenantByTenantId (line 129) | @Override
method updateTenantByTenantId (line 144) | @Override
method getPageTenantList (line 195) | @Override
method getTenantByTenantId (line 222) | @Override
method checkTenantNameExists (line 242) | private void checkTenantNameExists(String tenantName) {
method checkAddTenantUser (line 251) | private void checkAddTenantUser(UserVO user) {
method addTenantRole (line 261) | private void addTenantRole(Long roleId, Long tenantId, Long tenantPack...
method addTenantUser (line 283) | private void addTenantUser(UserVO userInfo, Long tenantId) {
method addTenantUserRole (line 300) | private void addTenantUserRole(Long userId, Long roleId) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/service/impl/UserServiceImpl.java
class UserServiceImpl (line 52) | @Slf4j
method addUser (line 99) | @Override
method deleteUserByUserId (line 134) | @Override
method updateUserByUserId (line 147) | @Override
method getPageUserList (line 182) | @Override
method getUserByUserId (line 193) | @Override
method getUserInfo (line 215) | @Override
method getImageCaptcha (line 292) | @Override
method checkImageCaptcha (line 323) | @Override
method userLogin (line 335) | @Override
method resetPassword (line 374) | @Override
method updateUserInfo (line 392) | @Override
method updateUserAvatar (line 408) | @Override
FILE: minimalist-basic/src/main/java/com/minimalist/basic/utils/Add.java
type Add (line 6) | public interface Add {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/utils/CommonConstant.java
class CommonConstant (line 8) | public class CommonConstant {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/utils/RedisKeyConstant.java
class RedisKeyConstant (line 3) | public class RedisKeyConstant {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/utils/TenantUtil.java
class TenantUtil (line 20) | @Slf4j
method checkTenantOnOff (line 27) | public static boolean checkTenantOnOff() {
method getTenantId (line 41) | public static long getTenantId() {
method checkQueryTenantData (line 80) | public static boolean checkQueryTenantData() {
method checkIsSystemTenant (line 89) | public static boolean checkIsSystemTenant() {
method getLoginUserTenantId (line 99) | public static long getLoginUserTenantId() {
method getCookieChangeTenantId (line 113) | public static Long getCookieChangeTenantId() {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/utils/TextUtil.java
class TextUtil (line 13) | @Slf4j
method getImgUrlByRichText (line 27) | public static List<String> getImgUrlByRichText(String richText) {
method encode (line 47) | public static String encode(String text) {
method decode (line 56) | public static String decode(String text) {
method splitAndListStrToListLong (line 65) | public static List<Long> splitAndListStrToListLong(String str) {
method extractFileUrl (line 83) | public static Set<String> extractFileUrl(String content) {
method urlNormalize (line 98) | public static String urlNormalize(String url) {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/utils/UnqIdUtil.java
class UnqIdUtil (line 5) | public class UnqIdUtil {
method uniqueId (line 11) | public static long uniqueId() {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/utils/Update.java
type Update (line 6) | public interface Update {
FILE: minimalist-basic/src/main/java/com/minimalist/basic/utils/ValidateUtil.java
class ValidateUtil (line 15) | public class ValidateUtil {
method valid (line 20) | public static <T> void valid(T t) {
FILE: minimalist-basic/src/test/java/com/minimalist/basic/MinimalistBasicApplicationTests.java
class MinimalistBasicApplicationTests (line 6) | @SpringBootTest(classes = MinimalistBasicApplicationTests.class)
method contextLoads (line 9) | @Test
FILE: minimalist-vue3/src/api/config.js
function addConfigApi (line 4) | function addConfigApi(data) {
function deleteConfigByConfigIdApi (line 9) | function deleteConfigByConfigIdApi(configId) {
function updateConfigByConfigIdApi (line 20) | function updateConfigByConfigIdApi(data) {
function getPageConfigListApi (line 25) | function getPageConfigListApi(params) {
function getConfigByConfigIdApi (line 34) | function getConfigByConfigIdApi(configId) {
FILE: minimalist-vue3/src/api/dept.js
function addDeptApi (line 4) | function addDeptApi(data) {
function deleteDeptByDeptIdApi (line 9) | function deleteDeptByDeptIdApi(deptId) {
function updateDeptByDeptIdApi (line 20) | function updateDeptByDeptIdApi(data) {
function getDeptListApi (line 25) | function getDeptListApi(params) {
function getEnableDeptListApi (line 34) | function getEnableDeptListApi() {
function getDeptByDeptIdApi (line 39) | function getDeptByDeptIdApi(deptId) {
FILE: minimalist-vue3/src/api/dict.js
function getPageDictListApi (line 4) | function getPageDictListApi(params) {
function addDictApi (line 13) | function addDictApi(data) {
function getDictByDictTypeApi (line 18) | function getDictByDictTypeApi(dictType) {
function getDictByDictTypeListApi (line 23) | function getDictByDictTypeListApi(dictTypes) {
function deleteDictByDictTypeApi (line 28) | function deleteDictByDictTypeApi(dictType) {
function deleteDictByDictIdApi (line 39) | function deleteDictByDictIdApi(dictId) {
function updateDictApi (line 50) | function updateDictApi(data) {
FILE: minimalist-vue3/src/api/file.js
function uploadFileApi (line 4) | function uploadFileApi(data, onUploadProgress) {
function deleteFileApi (line 16) | function deleteFileApi(fileId) {
function getPageFileListApi (line 27) | function getPageFileListApi(params) {
FILE: minimalist-vue3/src/api/notice.js
function addNoticeApi (line 4) | function addNoticeApi(data) {
function deleteNoticeByNoticeIdApi (line 9) | function deleteNoticeByNoticeIdApi(noticeId) {
function updateNoticeByNoticeIdApi (line 20) | function updateNoticeByNoticeIdApi(data) {
function getPageNoticeListApi (line 25) | function getPageNoticeListApi(params) {
function getPageHomeNoticeListApi (line 34) | function getPageHomeNoticeListApi(params) {
function getNoticeByNoticeIdApi (line 43) | function getNoticeByNoticeIdApi(noticeId) {
FILE: minimalist-vue3/src/api/perm.js
function addPermApi (line 10) | function addPermApi(data) {
function deletePermByPermIdApi (line 15) | function deletePermByPermIdApi(permId) {
function updatePermByPermIdApi (line 26) | function updatePermByPermIdApi(data) {
function getPermListApi (line 31) | function getPermListApi(params) {
function getEnablePermListApi (line 41) | function getEnablePermListApi() {
function getTenantEnablePermListApi (line 46) | function getTenantEnablePermListApi() {
function getPermByPermIdApi (line 51) | function getPermByPermIdApi(permId) {
FILE: minimalist-vue3/src/api/post.js
function addPostApi (line 4) | function addPostApi(data) {
function deletePostByPostIdApi (line 9) | function deletePostByPostIdApi(postId) {
function updatePostByPostIdApi (line 20) | function updatePostByPostIdApi(data) {
function getPagePostListApi (line 25) | function getPagePostListApi(params) {
function getPostByPostIdApi (line 34) | function getPostByPostIdApi(postId) {
FILE: minimalist-vue3/src/api/role.js
function addRoleApi (line 4) | function addRoleApi(data) {
function deleteRoleByRoleIdApi (line 9) | function deleteRoleByRoleIdApi(roleId) {
function updateRoleByRoleIdApi (line 20) | function updateRoleByRoleIdApi(data) {
function getPageRoleListApi (line 25) | function getPageRoleListApi(params) {
function getRoleByRoleIdApi (line 34) | function getRoleByRoleIdApi(roleId) {
FILE: minimalist-vue3/src/api/storage.js
function addStorageApi (line 4) | function addStorageApi(data) {
function deleteStorageByStorageIdApi (line 9) | function deleteStorageByStorageIdApi(storageId) {
function updateStorageByStorageIdApi (line 20) | function updateStorageByStorageIdApi(data) {
function getPageStorageListApi (line 25) | function getPageStorageListApi(params) {
function getStorageByStorageIdApi (line 34) | function getStorageByStorageIdApi(storageId) {
FILE: minimalist-vue3/src/api/tenant.js
function addTenantApi (line 4) | function addTenantApi(data) {
function deleteTenantByTenantIdApi (line 8) | function deleteTenantByTenantIdApi(tenantId) {
function updateTenantByTenantIdApi (line 18) | function updateTenantByTenantIdApi(data) {
function getPageTenantListApi (line 22) | function getPageTenantListApi(params) {
function getTenantByTenantIdApi (line 30) | function getTenantByTenantIdApi(tenantId) {
FILE: minimalist-vue3/src/api/tenantPackage.js
function addTenantPackageApi (line 4) | function addTenantPackageApi(data) {
function deleteTenantPackageByTenantPackageIdApi (line 8) | function deleteTenantPackageByTenantPackageIdApi(tenantPackageId) {
function updateTenantPackageByTenantPackageIdApi (line 18) | function updateTenantPackageByTenantPackageIdApi(data) {
function getPageTenantPackageListApi (line 22) | function getPageTenantPackageListApi(params) {
function getTenantPackageByTenantPackageIdApi (line 30) | function getTenantPackageByTenantPackageIdApi(tenantPackageId) {
FILE: minimalist-vue3/src/api/user.js
function addUserApi (line 4) | function addUserApi(data) {
function deleteUserByUserIdApi (line 9) | function deleteUserByUserIdApi(userId) {
function updateUserByUserIdApi (line 20) | function updateUserByUserIdApi(data) {
function getPageUserListApi (line 25) | function getPageUserListApi(params) {
function getUserByUserIdApi (line 34) | function getUserByUserIdApi(userId) {
function getUserInfoApi (line 39) | function getUserInfoApi() {
function getImageCaptchaApi (line 44) | function getImageCaptchaApi() {
function loginApi (line 49) | function loginApi(loginForm) {
function resetPasswordApi (line 59) | function resetPasswordApi(rePasswordForm) {
function updateUserAvatarApi (line 67) | function updateUserAvatarApi(userAvatar) {
function updateUserInfoApi (line 74) | function updateUserInfoApi(form) {
function logoutApi (line 79) | function logoutApi() {
FILE: minimalist-vue3/src/directives/permission.js
method install (line 9) | install(app) {
FILE: minimalist-vue3/src/directives/role.js
method install (line 9) | install(app) {
FILE: minimalist-vue3/src/router/index.js
function dynamicAddRoutes (line 50) | function dynamicAddRoutes(menus) {
function findRouter (line 92) | function findRouter(component) {
FILE: minimalist-vue3/src/store/module/sys-store.js
method updateUserAvatar (line 35) | updateUserAvatar(userAvatar) {
method userLogoutHandler (line 39) | userLogoutHandler() {
FILE: minimalist-vue3/src/utils/cookie.js
constant CHANGE_TENANT_ID (line 6) | const CHANGE_TENANT_ID = 'change_tenant_id'
constant CHANGE_TENANT_ID_BASE64 (line 8) | const CHANGE_TENANT_ID_BASE64 = 'change_tenant_id_base64'
constant PAGE_TAB_LIST (line 10) | const PAGE_TAB_LIST = 'pageTabList'
constant CHANGE_TENANT_ALLOW (line 14) | const CHANGE_TENANT_ALLOW = 'changeTenantAllow'
function getToken (line 17) | function getToken() {
function setToken (line 22) | function setToken(token) {
function removeToken (line 27) | function removeToken() {
function getCookie (line 32) | function getCookie(key) {
function setCookie (line 35) | function setCookie(key, value) {
FILE: minimalist-vue3/src/utils/dict.js
constant DICT (line 4) | const DICT = {
FILE: minimalist-vue3/src/utils/msg.js
method success (line 4) | success(msg) {
method error (line 7) | error(msg) {
FILE: resources/sql/mysql/2024-12-03 ~ 2025-03-12期间的SQL变更(第一次使用本项目忽略).sql
type `m_tenant_datasource` (line 39) | CREATE TABLE `m_tenant_datasource` (
FILE: resources/sql/mysql/minimalist_全部sql,如果是第一次使用本项目直接执行这个.sql
type `m_config` (line 24) | CREATE TABLE `m_config` (
type `m_dept` (line 52) | CREATE TABLE `m_dept` (
type `m_dict` (line 101) | CREATE TABLE `m_dict` (
type `m_file` (line 164) | CREATE TABLE `m_file` (
type `m_notice` (line 204) | CREATE TABLE `m_notice` (
type `m_perms` (line 238) | CREATE TABLE `m_perms` (
type `m_post` (line 335) | CREATE TABLE `m_post` (
type `m_role` (line 371) | CREATE TABLE `m_role` (
type `m_role_dept` (line 412) | CREATE TABLE `m_role_dept` (
type `m_role_perm` (line 425) | CREATE TABLE `m_role_perm` (
type `m_storage` (line 681) | CREATE TABLE `m_storage` (
type `m_tenant` (line 709) | CREATE TABLE `m_tenant` (
type `m_tenant_datasource` (line 745) | CREATE TABLE `m_tenant_datasource` (
type `m_tenant_package` (line 760) | CREATE TABLE `m_tenant_package` (
type `m_tenant_package_perm` (line 786) | CREATE TABLE `m_tenant_package_perm` (
type `m_user` (line 828) | CREATE TABLE `m_user` (
type `m_user_dept` (line 873) | CREATE TABLE `m_user_dept` (
type `m_user_post` (line 911) | CREATE TABLE `m_user_post` (
type `m_user_role` (line 934) | CREATE TABLE `m_user_role` (
Condensed preview — 322 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (1,657K chars).
[
{
"path": ".gitignore",
"chars": 637,
"preview": "######################################################################\n# Build Tools\n\n.gradle\n/build/\n!gradle/wrapper/gr"
},
{
"path": "LICENSE",
"chars": 1081,
"preview": "MIT License\r\n\r\nCopyright (c) 2023 小太阳\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\no"
},
{
"path": "README.md",
"chars": 3472,
"preview": "<div align=\"center\">\n\t<img alt=\"logo\" src=\"minimalist-vue3/src/assets/logo.png\" width=\"80px\" height=\"80px\">\n</div>\n<div "
},
{
"path": "minimalist-application/pom.xml",
"chars": 3981,
"preview": "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n xsi:sc"
},
{
"path": "minimalist-application/src/main/java/com/minimalist/application/MinimalistBasicApplication.java",
"chars": 505,
"preview": "package com.minimalist.application;\n\nimport org.mybatis.spring.annotation.MapperScan;\nimport org.springframework.boot.Sp"
},
{
"path": "minimalist-application/src/main/java/com/minimalist/application/config/GlobalExceptionHandler.java",
"chars": 4886,
"preview": "package com.minimalist.application.config;\n\nimport cn.dev33.satoken.exception.NotLoginException;\nimport cn.dev33.satoken"
},
{
"path": "minimalist-application/src/main/java/com/minimalist/application/config/satoken/SaTokenConfigure.java",
"chars": 1567,
"preview": "package com.minimalist.application.config.satoken;\n\nimport cn.dev33.satoken.interceptor.SaInterceptor;\nimport cn.dev33.s"
},
{
"path": "minimalist-application/src/main/java/com/minimalist/application/config/satoken/SaTokenInterfaceImpl.java",
"chars": 1581,
"preview": "package com.minimalist.application.config.satoken;\n\nimport cn.dev33.satoken.stp.StpInterface;\nimport cn.hutool.core.coll"
},
{
"path": "minimalist-application/src/main/resources/application-dev.yml",
"chars": 4684,
"preview": "mybatis-flex:\n configuration:\n map-underscore-to-camel-case: true\n auto-mapping-behavior: full\n mapp"
},
{
"path": "minimalist-application/src/main/resources/application.yml",
"chars": 201,
"preview": "server:\n port: 9090\n servlet:\n context-path: /minimalist\n encoding:\n charset: UTF-8\n "
},
{
"path": "minimalist-application/src/main/resources/logback-dev.xml",
"chars": 1343,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<configuration debug=\"true\">\n\n <!-- 日志存放路径 -->\n <property name=\"LOG_PATH\" v"
},
{
"path": "minimalist-basic/pom.xml",
"chars": 5119,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/async/AsyncConfig.java",
"chars": 1556,
"preview": "package com.minimalist.basic.config.async;\n\nimport org.slf4j.MDC;\nimport org.springframework.context.annotation.Configur"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/async/ThreadPoolConfig.java",
"chars": 1375,
"preview": "package com.minimalist.basic.config.async;\n\nimport org.slf4j.MDC;\nimport org.springframework.context.annotation.Bean;\nim"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/convert/FileSizeDeserializer.java",
"chars": 751,
"preview": "package com.minimalist.basic.config.convert;\n\nimport cn.hutool.core.io.unit.DataSizeUtil;\nimport cn.hutool.core.util.Str"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/convert/FileSizeSerializer.java",
"chars": 741,
"preview": "package com.minimalist.basic.config.convert;\n\nimport cn.hutool.core.io.FileUtil;\nimport cn.hutool.core.util.ObjectUtil;\n"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/convert/LongArrJsonSerializer.java",
"chars": 888,
"preview": "package com.minimalist.basic.config.convert;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.fasterxml.jack"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/dataConfig/SystemConfigInit.java",
"chars": 607,
"preview": "package com.minimalist.basic.config.dataConfig;\n\nimport com.minimalist.basic.service.ConfigService;\nimport org.springfra"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/eDict/BeanMethod.java",
"chars": 391,
"preview": "package com.minimalist.basic.config.eDict;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\nimport lombok.NoArgsCo"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/eDict/EDict.java",
"chars": 266,
"preview": "package com.minimalist.basic.config.eDict;\n\nimport java.lang.annotation.*;\n\n/**\n * 额外字典数据处理\n */\n@Target({ElementType.MET"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/eDict/EDictConstant.java",
"chars": 917,
"preview": "package com.minimalist.basic.config.eDict;\n\nimport cn.hutool.core.map.MapUtil;\nimport org.springframework.stereotype.Com"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/eDict/EDictInit.java",
"chars": 3018,
"preview": "package com.minimalist.basic.config.eDict;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport cn.hutool.core.util.StrUtil;\ni"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/exception/BusinessException.java",
"chars": 641,
"preview": "package com.minimalist.basic.config.exception;\n\nimport com.minimalist.basic.entity.enums.RespEnum;\nimport lombok.Data;\n\n"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/FileManager.java",
"chars": 1809,
"preview": "package com.minimalist.basic.config.fileHandler;\n\nimport cn.hutool.core.map.MapUtil;\nimport cn.hutool.core.util.StrUtil;"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/FileResourcesInit.java",
"chars": 1736,
"preview": "package com.minimalist.basic.config.fileHandler;\n\nimport cn.hutool.json.JSONUtil;\nimport com.minimalist.basic.entity.enu"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/entity/LocalFileEntity.java",
"chars": 237,
"preview": "package com.minimalist.basic.config.fileHandler.entity;\n\nimport jakarta.validation.constraints.NotBlank;\nimport lombok.D"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/entity/MinIOFileEntity.java",
"chars": 431,
"preview": "package com.minimalist.basic.config.fileHandler.entity;\n\nimport jakarta.validation.constraints.NotBlank;\nimport lombok.D"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/entity/QiNiuFileEntity.java",
"chars": 502,
"preview": "package com.minimalist.basic.config.fileHandler.entity;\n\nimport jakarta.validation.constraints.NotBlank;\nimport lombok.D"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/handler/FileHandler.java",
"chars": 1010,
"preview": "package com.minimalist.basic.config.fileHandler.handler;\n\nimport com.minimalist.basic.entity.po.MFile;\nimport com.minima"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/handler/impl/LocalFileHandler.java",
"chars": 8310,
"preview": "package com.minimalist.basic.config.fileHandler.handler.impl;\n\nimport cn.hutool.core.io.FileUtil;\nimport cn.hutool.core."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/handler/impl/MinIOFileHandler.java",
"chars": 1886,
"preview": "package com.minimalist.basic.config.fileHandler.handler.impl;\n\nimport cn.hutool.json.JSONUtil;\nimport com.minimalist.bas"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/fileHandler/handler/impl/QiNiuFileHandler.java",
"chars": 9825,
"preview": "package com.minimalist.basic.config.fileHandler.handler.impl;\n\nimport cn.hutool.core.io.file.FileNameUtil;\nimport cn.hut"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/GeneratorCodeHandler.java",
"chars": 3476,
"preview": "package com.minimalist.basic.config.mybatis;\n\nimport com.minimalist.basic.config.mybatis.bo.BaseEntity;\nimport com.mybat"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/InsertFullColumnHandler.java",
"chars": 1053,
"preview": "package com.minimalist.basic.config.mybatis;\n\nimport cn.dev33.satoken.stp.SaTokenInfo;\nimport cn.dev33.satoken.stp.StpUt"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/MyBatisFlexConfiguration.java",
"chars": 1077,
"preview": "package com.minimalist.basic.config.mybatis;\n\nimport com.minimalist.basic.utils.TenantUtil;\nimport com.mybatisflex.core."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/UpdateFullColumnHandler.java",
"chars": 963,
"preview": "package com.minimalist.basic.config.mybatis;\n\nimport cn.dev33.satoken.stp.SaTokenInfo;\nimport cn.dev33.satoken.stp.StpUt"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/bo/BaseEntity.java",
"chars": 868,
"preview": "package com.minimalist.basic.config.mybatis.bo;\n\nimport com.mybatisflex.annotation.Column;\nimport com.mybatisflex.annota"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/bo/PageReq.java",
"chars": 254,
"preview": "package com.minimalist.basic.config.mybatis.bo;\n\nimport lombok.Getter;\nimport lombok.Setter;\n\n/**\n * 分页请求\n */\n@Getter\n@S"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/mybatis/bo/PageResp.java",
"chars": 344,
"preview": "package com.minimalist.basic.config.mybatis.bo;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Data;\n\nimport java.util"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/redis/RedisManager.java",
"chars": 2664,
"preview": "package com.minimalist.basic.config.redis;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.redisson.api.RBucket;\nimport or"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/redis/RedissonConfiguration.java",
"chars": 2267,
"preview": "package com.minimalist.basic.config.redis;\n\nimport cn.hutool.core.util.StrUtil;\nimport com.fasterxml.jackson.databind.Ob"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/resubmit/ReSubmit.java",
"chars": 553,
"preview": "package com.minimalist.basic.config.resubmit;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Rete"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/resubmit/ReSubmitAspect.java",
"chars": 4102,
"preview": "package com.minimalist.basic.config.resubmit;\n\nimport cn.hutool.core.map.MapUtil;\nimport cn.hutool.core.util.ArrayUtil;\n"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/swagger/ParameterHandler.java",
"chars": 938,
"preview": "package com.minimalist.basic.config.swagger;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport io.swagger.v3.oas.models.par"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/swagger/PropertyHandler.java",
"chars": 904,
"preview": "package com.minimalist.basic.config.swagger;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport io.swagger.v3.core.converter"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/swagger/SchemaEnum.java",
"chars": 472,
"preview": "package com.minimalist.basic.config.swagger;\n\nimport java.lang.annotation.*;\n\n/**\n * swagger 实体中枚举值处理注解\n */\n@Target({Ele"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/swagger/SchemaEnumHandler.java",
"chars": 2254,
"preview": "package com.minimalist.basic.config.swagger;\n\nimport cn.hutool.core.util.ArrayUtil;\nimport cn.hutool.core.util.ObjectUti"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/swagger/SwaggerConfig.java",
"chars": 1473,
"preview": "package com.minimalist.basic.config.swagger;\n\nimport io.swagger.v3.oas.models.OpenAPI;\nimport io.swagger.v3.oas.models.i"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/tenant/TenantDatasourceInterceptor.java",
"chars": 2118,
"preview": "package com.minimalist.basic.config.tenant;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport com.baomidou.dynamic.datasour"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/tenant/TenantIgnore.java",
"chars": 356,
"preview": "package com.minimalist.basic.config.tenant;\n\nimport java.lang.annotation.*;\n\n/**\n * 注解加到方法上,标识此方法忽略多租户(异步方法无效)\n */\n@Targ"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/tenant/TenantIgnoreAspect.java",
"chars": 1148,
"preview": "package com.minimalist.basic.config.tenant;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport com.mybatisflex.core.tenant.T"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/tenant/TenantInit.java",
"chars": 3809,
"preview": "package com.minimalist.basic.config.tenant;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport cn.hutool.core.util.ObjectUtil;"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/tenant/TenantWebMvcConfig.java",
"chars": 639,
"preview": "package com.minimalist.basic.config.tenant;\n\nimport org.springframework.context.annotation.Configuration;\nimport org.spr"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/trace/TraceIdInterceptor.java",
"chars": 1028,
"preview": "package com.minimalist.basic.config.trace;\n\nimport cn.hutool.core.util.IdUtil;\nimport com.minimalist.basic.utils.CommonC"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/config/trace/WebMvcConfig.java",
"chars": 631,
"preview": "package com.minimalist.basic.config.trace;\n\nimport jakarta.annotation.Resource;\nimport org.springframework.context.annot"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/controller/ConfigController.java",
"chars": 2993,
"preview": "package com.minimalist.basic.controller;\n\nimport cn.dev33.satoken.annotation.SaCheckPermission;\nimport com.minimalist.ba"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/controller/DeptController.java",
"chars": 3109,
"preview": "package com.minimalist.basic.controller;\n\nimport cn.dev33.satoken.annotation.SaCheckPermission;\nimport com.minimalist.ba"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/controller/DictController.java",
"chars": 3738,
"preview": "package com.minimalist.basic.controller;\n\nimport cn.dev33.satoken.annotation.SaCheckPermission;\nimport com.minimalist.ba"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/controller/FileController.java",
"chars": 2193,
"preview": "package com.minimalist.basic.controller;\n\nimport cn.dev33.satoken.annotation.SaCheckPermission;\nimport com.minimalist.ba"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/controller/NoticeController.java",
"chars": 3376,
"preview": "package com.minimalist.basic.controller;\n\nimport cn.dev33.satoken.annotation.SaCheckPermission;\nimport com.minimalist.ba"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/controller/PermController.java",
"chars": 3334,
"preview": "package com.minimalist.basic.controller;\n\nimport cn.dev33.satoken.annotation.SaCheckPermission;\nimport com.minimalist.ba"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/controller/PostController.java",
"chars": 2877,
"preview": "package com.minimalist.basic.controller;\n\nimport cn.dev33.satoken.annotation.SaCheckPermission;\nimport com.minimalist.ba"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/controller/RoleController.java",
"chars": 2887,
"preview": "package com.minimalist.basic.controller;\n\nimport cn.dev33.satoken.annotation.SaCheckPermission;\nimport com.minimalist.ba"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/controller/StorageController.java",
"chars": 3072,
"preview": "package com.minimalist.basic.controller;\n\nimport cn.dev33.satoken.annotation.SaCheckPermission;\nimport com.minimalist.ba"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/controller/TenantController.java",
"chars": 3235,
"preview": "package com.minimalist.basic.controller;\n\nimport cn.dev33.satoken.annotation.SaCheckPermission;\nimport com.minimalist.ba"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/controller/TenantPackageController.java",
"chars": 3584,
"preview": "package com.minimalist.basic.controller;\n\nimport cn.dev33.satoken.annotation.SaCheckPermission;\nimport com.minimalist.ba"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/controller/UserController.java",
"chars": 5058,
"preview": "package com.minimalist.basic.controller;\n\nimport cn.dev33.satoken.annotation.SaCheckLogin;\nimport cn.dev33.satoken.annot"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/ConfigEnum.java",
"chars": 387,
"preview": "package com.minimalist.basic.entity.enums;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\npublic class Config"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/DeptEnum.java",
"chars": 390,
"preview": "package com.minimalist.basic.entity.enums;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\npublic class DeptEn"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/DictEnum.java",
"chars": 296,
"preview": "package com.minimalist.basic.entity.enums;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\npublic class DictEn"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/FileEnum.java",
"chars": 792,
"preview": "package com.minimalist.basic.entity.enums;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\npublic class FileEn"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/NoticeEnum.java",
"chars": 517,
"preview": "package com.minimalist.basic.entity.enums;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\npublic class Notice"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/PermEnum.java",
"chars": 559,
"preview": "package com.minimalist.basic.entity.enums;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\npublic class PermEn"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/PostEnum.java",
"chars": 328,
"preview": "package com.minimalist.basic.entity.enums;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\npublic class PostEn"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/RespEnum.java",
"chars": 675,
"preview": "package com.minimalist.basic.entity.enums;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\n@Getter\n@AllArgsCon"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/RoleEnum.java",
"chars": 625,
"preview": "package com.minimalist.basic.entity.enums;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\npublic class RoleEn"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/StatusEnum.java",
"chars": 309,
"preview": "package com.minimalist.basic.entity.enums;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\n/**\n * 公共的状态枚举\n * 对"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/StorageEnum.java",
"chars": 567,
"preview": "package com.minimalist.basic.entity.enums;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\npublic class Storag"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/TenantEnum.java",
"chars": 1378,
"preview": "package com.minimalist.basic.entity.enums;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\npublic class Tenant"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/enums/UserEnum.java",
"chars": 1167,
"preview": "package com.minimalist.basic.entity.enums;\n\nimport lombok.AllArgsConstructor;\nimport lombok.Getter;\n\npublic class UserEn"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MConfig.java",
"chars": 1230,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MDept.java",
"chars": 1514,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MDict.java",
"chars": 1412,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MFile.java",
"chars": 1922,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MNotice.java",
"chars": 1818,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MPerms.java",
"chars": 1668,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MPost.java",
"chars": 1339,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MRole.java",
"chars": 1339,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MRoleDept.java",
"chars": 874,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MRolePerm.java",
"chars": 874,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MStorage.java",
"chars": 1233,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MTenant.java",
"chars": 1617,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MTenantDatasource.java",
"chars": 1094,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.mybatisflex.annotation.Id;\nimport com.mybatisflex.annotation.KeyType"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MTenantPackage.java",
"chars": 1121,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MTenantPackagePerm.java",
"chars": 892,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MUser.java",
"chars": 1697,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MUserDept.java",
"chars": 866,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MUserPost.java",
"chars": 874,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/po/MUserRole.java",
"chars": 874,
"preview": "package com.minimalist.basic.entity.po;\n\nimport com.minimalist.basic.config.mybatis.InsertFullColumnHandler;\nimport com."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/config/ConfigQueryVO.java",
"chars": 864,
"preview": "package com.minimalist.basic.entity.vo.config;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimali"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/config/ConfigVO.java",
"chars": 1790,
"preview": "package com.minimalist.basic.entity.vo.config;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport c"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dept/DeptQueryVO.java",
"chars": 678,
"preview": "package com.minimalist.basic.entity.vo.dept;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimalist"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dept/DeptVO.java",
"chars": 2661,
"preview": "package com.minimalist.basic.entity.vo.dept;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport com"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictCacheVO.java",
"chars": 1128,
"preview": "package com.minimalist.basic.entity.vo.dict;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\nimp"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictDataVO.java",
"chars": 1487,
"preview": "package com.minimalist.basic.entity.vo.dict;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport com"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictInfoVO.java",
"chars": 1005,
"preview": "package com.minimalist.basic.entity.vo.dict;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport jakarta.validati"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictListVO.java",
"chars": 549,
"preview": "package com.minimalist.basic.entity.vo.dict;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\n\nim"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictQueryVO.java",
"chars": 842,
"preview": "package com.minimalist.basic.entity.vo.dict;\n\nimport com.minimalist.basic.config.mybatis.bo.PageReq;\nimport com.minimali"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/dict/DictVO.java",
"chars": 1576,
"preview": "package com.minimalist.basic.entity.vo.dict;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport com"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/file/FileQueryVO.java",
"chars": 975,
"preview": "package com.minimalist.basic.entity.vo.file;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimalist"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/file/FileUploadBatchVO.java",
"chars": 922,
"preview": "package com.minimalist.basic.entity.vo.file;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport jakarta.validati"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/file/FileUploadRespVO.java",
"chars": 1428,
"preview": "package com.minimalist.basic.entity.vo.file;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport com"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/file/FileUploadVO.java",
"chars": 802,
"preview": "package com.minimalist.basic.entity.vo.file;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport jakarta.validati"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/file/FileVO.java",
"chars": 2158,
"preview": "package com.minimalist.basic.entity.vo.file;\n\nimport com.fasterxml.jackson.databind.annotation.JsonDeserialize;\nimport c"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/notice/NoticeQueryVO.java",
"chars": 1174,
"preview": "package com.minimalist.basic.entity.vo.notice;\n\nimport com.minimalist.basic.entity.enums.NoticeEnum;\nimport com.minimali"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/notice/NoticeVO.java",
"chars": 3957,
"preview": "package com.minimalist.basic.entity.vo.notice;\n\nimport cn.hutool.core.date.DatePattern;\nimport com.fasterxml.jackson.ann"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/perm/PermQueryVO.java",
"chars": 776,
"preview": "package com.minimalist.basic.entity.vo.perm;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimalist"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/perm/PermVO.java",
"chars": 2731,
"preview": "package com.minimalist.basic.entity.vo.perm;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport com"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/post/PostQueryVO.java",
"chars": 849,
"preview": "package com.minimalist.basic.entity.vo.post;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimalist"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/post/PostVO.java",
"chars": 1903,
"preview": "package com.minimalist.basic.entity.vo.post;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport com"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/role/RoleQueryVO.java",
"chars": 849,
"preview": "package com.minimalist.basic.entity.vo.role;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimalist"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/role/RoleVO.java",
"chars": 2424,
"preview": "package com.minimalist.basic.entity.vo.role;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport com"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/storage/StorageQueryVO.java",
"chars": 870,
"preview": "package com.minimalist.basic.entity.vo.storage;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimal"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/storage/StorageVO.java",
"chars": 1802,
"preview": "package com.minimalist.basic.entity.vo.storage;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport "
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/tenant/TenantDatasourceVO.java",
"chars": 1177,
"preview": "package com.minimalist.basic.entity.vo.tenant;\n\nimport com.minimalist.basic.utils.Add;\nimport com.minimalist.basic.utils"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/tenant/TenantPackageQueryVO.java",
"chars": 767,
"preview": "package com.minimalist.basic.entity.vo.tenant;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimali"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/tenant/TenantPackageVO.java",
"chars": 1906,
"preview": "package com.minimalist.basic.entity.vo.tenant;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport c"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/tenant/TenantQueryVO.java",
"chars": 753,
"preview": "package com.minimalist.basic.entity.vo.tenant;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimali"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/tenant/TenantVO.java",
"chars": 4110,
"preview": "package com.minimalist.basic.entity.vo.tenant;\n\nimport cn.hutool.core.date.DatePattern;\nimport com.fasterxml.jackson.ann"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/user/ImageCaptchaVO.java",
"chars": 645,
"preview": "package com.minimalist.basic.entity.vo.user;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport lombok.Data;\n\nim"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/user/RePasswordVO.java",
"chars": 652,
"preview": "package com.minimalist.basic.entity.vo.user;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport jakarta.validati"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/user/UserInfoVO.java",
"chars": 2728,
"preview": "package com.minimalist.basic.entity.vo.user;\n\nimport com.fasterxml.jackson.annotation.JsonIgnore;\nimport com.fasterxml.j"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/user/UserLoginReqVO.java",
"chars": 940,
"preview": "package com.minimalist.basic.entity.vo.user;\n\nimport io.swagger.v3.oas.annotations.media.Schema;\nimport jakarta.validati"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/user/UserQueryVO.java",
"chars": 787,
"preview": "package com.minimalist.basic.entity.vo.user;\n\nimport com.minimalist.basic.config.mybatis.bo.PageReq;\nimport io.swagger.v"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/user/UserSettingVO.java",
"chars": 1227,
"preview": "package com.minimalist.basic.entity.vo.user;\n\nimport com.minimalist.basic.entity.enums.UserEnum;\nimport com.minimalist.b"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/entity/vo/user/UserVO.java",
"chars": 3611,
"preview": "package com.minimalist.basic.entity.vo.user;\n\nimport com.fasterxml.jackson.databind.annotation.JsonSerialize;\nimport com"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/manager/TenantManager.java",
"chars": 5404,
"preview": "package com.minimalist.basic.manager;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport cn.hutool.core.date.Local"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/manager/UserManager.java",
"chars": 4877,
"preview": "package com.minimalist.basic.manager;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport cn.hutool.core.lang.Asser"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MConfigMapper.java",
"chars": 1982,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.minimalist.basic.entity.vo.config.ConfigQueryVO;\nimport com.mybatisflex"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MDeptMapper.java",
"chars": 2427,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimalist.basic.e"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MDictMapper.java",
"chars": 2528,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.minimalist.basic.entity.vo.dict.DictQueryVO;\nimport com.minimalist.basi"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MFileMapper.java",
"chars": 2706,
"preview": "package com.minimalist.basic.mapper;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport com.minimalist.basic.entity.vo.file."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MNoticeMapper.java",
"chars": 2529,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.minimalist.basic.config.mybatis.bo.PageReq;\nimport com.minimalist.basic"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MPermsMapper.java",
"chars": 1973,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimalist.basic.e"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MPostMapper.java",
"chars": 2451,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimalist.basic.e"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MRoleDeptMapper.java",
"chars": 268,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.mybatisflex.core.BaseMapper;\nimport com.minimalist.basic.entity.po.MRol"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MRoleMapper.java",
"chars": 2374,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimalist.basic.e"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MRolePermMapper.java",
"chars": 869,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.mybatisflex.core.BaseMapper;\nimport com.minimalist.basic.entity.po.MRol"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MStorageMapper.java",
"chars": 1722,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.minimalist.basic.entity.vo.storage.StorageQueryVO;\nimport com.minimalis"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MTenantDatasourceMapper.java",
"chars": 835,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.mybatisflex.core.BaseMapper;\nimport com.minimalist.basic.entity.po.MTen"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MTenantMapper.java",
"chars": 2848,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimalist.basic.e"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MTenantPackageMapper.java",
"chars": 2167,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.minimalist.basic.entity.enums.StatusEnum;\nimport com.minimalist.basic.e"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MTenantPackagePermMapper.java",
"chars": 689,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.mybatisflex.core.BaseMapper;\nimport com.minimalist.basic.entity.po.MTen"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MUserDeptMapper.java",
"chars": 586,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.mybatisflex.core.BaseMapper;\nimport com.minimalist.basic.entity.po.MUse"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MUserMapper.java",
"chars": 5119,
"preview": "package com.minimalist.basic.mapper;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport cn.hutool.core.util.StrUtil;\nimport "
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MUserPostMapper.java",
"chars": 594,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.mybatisflex.core.BaseMapper;\nimport com.minimalist.basic.entity.po.MUse"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mapper/MUserRoleMapper.java",
"chars": 596,
"preview": "package com.minimalist.basic.mapper;\n\nimport com.mybatisflex.core.BaseMapper;\nimport com.minimalist.basic.entity.po.MUse"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mq/SystemConfigSyncConsumer.java",
"chars": 1911,
"preview": "package com.minimalist.basic.mq;\n\nimport cn.hutool.core.util.StrUtil;\nimport cn.hutool.json.JSONUtil;\nimport com.minimal"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/mq/TenantDatasourceSyncConsumer.java",
"chars": 2945,
"preview": "package com.minimalist.basic.mq;\n\nimport cn.hutool.core.util.ObjectUtil;\nimport cn.hutool.core.util.StrUtil;\nimport cn.h"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/ConfigService.java",
"chars": 1065,
"preview": "package com.minimalist.basic.service;\n\nimport com.minimalist.basic.config.mybatis.bo.PageResp;\nimport com.minimalist.bas"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/DeptService.java",
"chars": 1032,
"preview": "package com.minimalist.basic.service;\n\nimport com.minimalist.basic.entity.vo.dept.DeptQueryVO;\nimport com.minimalist.bas"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/DictService.java",
"chars": 1072,
"preview": "package com.minimalist.basic.service;\n\nimport com.minimalist.basic.entity.vo.dict.*;\nimport com.minimalist.basic.config."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/EDictService.java",
"chars": 882,
"preview": "package com.minimalist.basic.service;\n\nimport com.minimalist.basic.entity.vo.dict.DictCacheVO;\n\n/**\n * 额外的字典数据,这些数据不会出现在"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/FileService.java",
"chars": 1474,
"preview": "package com.minimalist.basic.service;\n\nimport com.minimalist.basic.entity.po.MFile;\nimport com.minimalist.basic.entity.v"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/NoticeService.java",
"chars": 1055,
"preview": "package com.minimalist.basic.service;\n\nimport com.minimalist.basic.entity.vo.notice.NoticeQueryVO;\nimport com.minimalist"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/PermService.java",
"chars": 1303,
"preview": "package com.minimalist.basic.service;\n\nimport com.minimalist.basic.entity.po.MPerms;\nimport com.minimalist.basic.entity."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/PostService.java",
"chars": 962,
"preview": "package com.minimalist.basic.service;\n\nimport com.minimalist.basic.entity.vo.post.PostQueryVO;\nimport com.minimalist.bas"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/RoleService.java",
"chars": 1139,
"preview": "package com.minimalist.basic.service;\n\nimport com.minimalist.basic.entity.po.MRole;\nimport com.minimalist.basic.entity.v"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/StorageService.java",
"chars": 888,
"preview": "package com.minimalist.basic.service;\n\nimport com.minimalist.basic.config.mybatis.bo.PageResp;\nimport com.minimalist.bas"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/TenantPackageService.java",
"chars": 1130,
"preview": "package com.minimalist.basic.service;\n\nimport com.minimalist.basic.entity.po.MPerms;\nimport com.minimalist.basic.entity."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/TenantService.java",
"chars": 860,
"preview": "package com.minimalist.basic.service;\n\nimport com.minimalist.basic.entity.vo.tenant.TenantQueryVO;\nimport com.minimalist"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/UserService.java",
"chars": 1695,
"preview": "package com.minimalist.basic.service;\n\nimport cn.dev33.satoken.stp.SaTokenInfo;\nimport com.minimalist.basic.entity.po.MU"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/impl/ConfigServiceImpl.java",
"chars": 5496,
"preview": "package com.minimalist.basic.service.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport cn.hutool.core.lang.Assert;\nimpo"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/impl/DeptServiceImpl.java",
"chars": 8075,
"preview": "package com.minimalist.basic.service.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport cn.hutool.core.collection.Collec"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/impl/DictServiceImpl.java",
"chars": 14624,
"preview": "package com.minimalist.basic.service.impl;\n\nimport cn.dev33.satoken.stp.StpUtil;\nimport cn.hutool.core.bean.BeanUtil;\nim"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/impl/EDictServiceImpl.java",
"chars": 8672,
"preview": "package com.minimalist.basic.service.impl;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.minimalist.basic"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/impl/FileServiceImpl.java",
"chars": 8301,
"preview": "package com.minimalist.basic.service.impl;\n\nimport cn.dev33.satoken.stp.StpUtil;\nimport cn.hutool.core.bean.BeanUtil;\nim"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/impl/NoticeServiceImpl.java",
"chars": 8571,
"preview": "package com.minimalist.basic.service.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport cn.hutool.core.collection.Collec"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/impl/PermServiceImpl.java",
"chars": 6169,
"preview": "package com.minimalist.basic.service.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport cn.hutool.core.collection.Collec"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/impl/PostServiceImpl.java",
"chars": 3397,
"preview": "package com.minimalist.basic.service.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport cn.hutool.core.collection.Collec"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/impl/RoleServiceImpl.java",
"chars": 5590,
"preview": "package com.minimalist.basic.service.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport cn.hutool.core.collection.Collec"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/impl/StorageServiceImpl.java",
"chars": 2969,
"preview": "package com.minimalist.basic.service.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport com.minimalist.basic.config.file"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/impl/TenantPackageServiceImpl.java",
"chars": 6716,
"preview": "package com.minimalist.basic.service.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport cn.hutool.core.collection.Collec"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/impl/TenantServiceImpl.java",
"chars": 12473,
"preview": "package com.minimalist.basic.service.impl;\n\nimport cn.hutool.core.bean.BeanUtil;\nimport cn.hutool.core.collection.Collec"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/service/impl/UserServiceImpl.java",
"chars": 16992,
"preview": "package com.minimalist.basic.service.impl;\n\nimport cn.dev33.satoken.stp.SaTokenInfo;\nimport cn.dev33.satoken.stp.StpUtil"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/utils/Add.java",
"chars": 82,
"preview": "package com.minimalist.basic.utils;\n\n/**\n * 添加时的分组校验\n */\npublic interface Add {\n}\n"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/utils/CommonConstant.java",
"chars": 1154,
"preview": "package com.minimalist.basic.utils;\n\nimport com.minimalist.basic.entity.vo.config.ConfigVO;\nimport com.minimalist.basic."
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/utils/RedisKeyConstant.java",
"chars": 1135,
"preview": "package com.minimalist.basic.utils;\n\npublic class RedisKeyConstant {\n\n /**\n * 图形验证码缓存\n */\n public static f"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/utils/TenantUtil.java",
"chars": 4074,
"preview": "package com.minimalist.basic.utils;\n\nimport cn.dev33.satoken.stp.StpUtil;\nimport cn.hutool.core.util.ObjectUtil;\nimport "
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/utils/TextUtil.java",
"chars": 3337,
"preview": "package com.minimalist.basic.utils;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport cn.hutool.core.util.StrUtil"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/utils/UnqIdUtil.java",
"chars": 236,
"preview": "package com.minimalist.basic.utils;\n\nimport cn.hutool.core.util.IdUtil;\n\npublic class UnqIdUtil {\n\n /**\n * 获取唯一ID"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/utils/Update.java",
"chars": 85,
"preview": "package com.minimalist.basic.utils;\n\n/**\n * 更新时的分组校验\n */\npublic interface Update {\n}\n"
},
{
"path": "minimalist-basic/src/main/java/com/minimalist/basic/utils/ValidateUtil.java",
"chars": 1078,
"preview": "package com.minimalist.basic.utils;\n\nimport cn.hutool.core.collection.CollectionUtil;\nimport com.minimalist.basic.config"
},
{
"path": "minimalist-basic/src/main/resources/mappers/MConfigMapper.xml",
"chars": 237,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper\n PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n \"htt"
},
{
"path": "minimalist-basic/src/main/resources/mappers/MDeptMapper.xml",
"chars": 235,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper\n PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n \"htt"
},
{
"path": "minimalist-basic/src/main/resources/mappers/MDictMapper.xml",
"chars": 235,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper\n PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n \"htt"
},
{
"path": "minimalist-basic/src/main/resources/mappers/MFileMapper.xml",
"chars": 235,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper\n PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n \"htt"
},
{
"path": "minimalist-basic/src/main/resources/mappers/MNoticeMapper.xml",
"chars": 237,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper\n PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n \"htt"
},
{
"path": "minimalist-basic/src/main/resources/mappers/MPermsMapper.xml",
"chars": 236,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper\n PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n \"htt"
},
{
"path": "minimalist-basic/src/main/resources/mappers/MPostMapper.xml",
"chars": 235,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE mapper\n PUBLIC \"-//mybatis.org//DTD Mapper 3.0//EN\"\n \"htt"
}
]
// ... and 122 more files (download for full content)
About this extraction
This page contains the full source code of the lmq2582609/minimalist-saas GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 322 files (1.4 MB), approximately 472.7k tokens, and a symbol index with 767 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.