Full Code of Ginyi3705/ginyi-spring-vue for AI

master 6c07298cd34c cached
329 files
34.0 MB
220.3k tokens
867 symbols
1 requests
Download .txt
Showing preview only (962K chars total). Download the full file or copy to clipboard to get everything.
Repository: Ginyi3705/ginyi-spring-vue
Branch: master
Commit: 6c07298cd34c
Files: 329
Total size: 34.0 MB

Directory structure:
gitextract_klywiall/

├── .gitignore
├── LICENSE
├── README.md
├── ginyi-springboot/
│   ├── .gitignore
│   ├── README.md
│   ├── ginyi-common/
│   │   ├── ginyi-common-annotation/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi.common.annotation/
│   │   │                   ├── Anonymous.java
│   │   │                   ├── CreateBy.java
│   │   │                   ├── CreateTime.java
│   │   │                   ├── Log.java
│   │   │                   ├── RepeatSubmit.java
│   │   │                   ├── UpdateBy.java
│   │   │                   └── UpdateTime.java
│   │   ├── ginyi-common-constants/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── constant/
│   │   │                           ├── CacheConstants.java
│   │   │                           ├── CommonMessageConstants.java
│   │   │                           ├── HttpStatus.java
│   │   │                           └── UserConstants.java
│   │   ├── ginyi-common-enums/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── enums/
│   │   │                           ├── BusinessStatus.java
│   │   │                           ├── BusinessType.java
│   │   │                           ├── HttpMethod.java
│   │   │                           └── OperatorType.java
│   │   ├── ginyi-common-exception/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── exception/
│   │   │                           ├── CommonException.java
│   │   │                           ├── UnPermissionException.java
│   │   │                           ├── UserPasswordNotMatchException.java
│   │   │                           ├── UserPasswordRetryLimitExceedException.java
│   │   │                           └── handler/
│   │   │                               └── GlobalExceptionHandler.java
│   │   ├── ginyi-common-mysql/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── mysql/
│   │   │                           ├── MyPage.java
│   │   │                           ├── config/
│   │   │                           │   └── MyBatisPlusInterceptorConfig.java
│   │   │                           ├── handler/
│   │   │                           │   ├── JacksonArrayTypeHandler.java
│   │   │                           │   └── MyMetaObjectHandler.java
│   │   │                           └── interceptor/
│   │   │                               └── MyInterceptor.java
│   │   ├── ginyi-common-redis/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── redis/
│   │   │                           ├── cache/
│   │   │                           │   └── RedisCache.java
│   │   │                           └── config/
│   │   │                               └── RedisConfig.java
│   │   ├── ginyi-common-result/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── result/
│   │   │                           ├── CommonResult.java
│   │   │                           └── StateCode.java
│   │   ├── ginyi-common-swagger/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── swagger/
│   │   │                           ├── AddGroup.java
│   │   │                           ├── Swagger2Config.java
│   │   │                           └── UpdateGroup.java
│   │   ├── ginyi-common-utils/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── utils/
│   │   │                           ├── Constants.java
│   │   │                           ├── DateUtils.java
│   │   │                           ├── EmailUtils.java
│   │   │                           ├── LogUtils.java
│   │   │                           ├── LunarCalendarUtil.java
│   │   │                           ├── MessageUtils.java
│   │   │                           ├── NumberUtils.java
│   │   │                           ├── ServletUtils.java
│   │   │                           ├── StringUtils.java
│   │   │                           ├── Threads.java
│   │   │                           ├── enums/
│   │   │                           │   └── UserStatus.java
│   │   │                           ├── http/
│   │   │                           │   ├── HttpHelper.java
│   │   │                           │   └── HttpUtils.java
│   │   │                           ├── ip/
│   │   │                           │   ├── AddressUtils.java
│   │   │                           │   └── IpUtils.java
│   │   │                           ├── spring/
│   │   │                           │   └── SpringUtils.java
│   │   │                           ├── text/
│   │   │                           │   ├── CharsetKit.java
│   │   │                           │   ├── Convert.java
│   │   │                           │   └── StrFormatter.java
│   │   │                           └── uuid/
│   │   │                               ├── IdUtils.java
│   │   │                               └── UUID.java
│   │   └── pom.xml
│   ├── ginyi-framework/
│   │   ├── ginyi-framework-core/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── framework/
│   │   │                       └── core/
│   │   │                           └── config/
│   │   │                               ├── AppConfig.java
│   │   │                               └── GinyiConfig.java
│   │   ├── ginyi-framework-security/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── framework/
│   │   │                       └── security/
│   │   │                           ├── aspectj/
│   │   │                           │   └── LogAspect.java
│   │   │                           ├── config/
│   │   │                           │   ├── ResourcesConfig.java
│   │   │                           │   ├── SecurityConfig.java
│   │   │                           │   └── ThreadPoolConfig.java
│   │   │                           ├── context/
│   │   │                           │   ├── AuthenticationContextHolder.java
│   │   │                           │   └── PermissionContextHolder.java
│   │   │                           ├── filter/
│   │   │                           │   ├── JwtAuthenticationTokenFilter.java
│   │   │                           │   ├── PropertyPreExcludeFilter.java
│   │   │                           │   └── RepeatedlyRequestWrapper.java
│   │   │                           ├── handle/
│   │   │                           │   ├── AuthenticationEntryPointImpl.java
│   │   │                           │   └── LogoutSuccessHandlerImpl.java
│   │   │                           ├── interceptor/
│   │   │                           │   ├── PreviewEnvInterceptor.java
│   │   │                           │   ├── RepeatSubmitInterceptor.java
│   │   │                           │   └── impl/
│   │   │                           │       └── SameUrlDataInterceptor.java
│   │   │                           ├── manager/
│   │   │                           │   ├── AsyncManager.java
│   │   │                           │   └── factory/
│   │   │                           │       └── AsyncFactory.java
│   │   │                           ├── properties/
│   │   │                           │   └── PermitAllUrlProperties.java
│   │   │                           ├── service/
│   │   │                           │   ├── ISysNoticeServiceImpl.java
│   │   │                           │   ├── MonitorServiceImpl.java
│   │   │                           │   ├── PermissionService.java
│   │   │                           │   ├── SysConfigServiceImpl.java
│   │   │                           │   ├── SysDeptServiceImpl.java
│   │   │                           │   ├── SysLogServiceImpl.java
│   │   │                           │   ├── SysLoginLogServiceImpl.java
│   │   │                           │   ├── SysLoginServiceImpl.java
│   │   │                           │   ├── SysMenuServiceImpl.java
│   │   │                           │   ├── SysMonitorServiceImpl.java
│   │   │                           │   ├── SysOperationLogServiceImpl.java
│   │   │                           │   ├── SysPasswordServiceImpl.java
│   │   │                           │   ├── SysPermissionServiceImpl.java
│   │   │                           │   ├── SysPostServiceImpl.java
│   │   │                           │   ├── SysRoleServiceImpl.java
│   │   │                           │   ├── SysUserServiceImpl.java
│   │   │                           │   ├── SysVerifyServiceImpl.java
│   │   │                           │   ├── TokenServiceImpl.java
│   │   │                           │   └── UserDetailsServiceImpl.java
│   │   │                           └── utils/
│   │   │                               └── SecurityUtils.java
│   │   ├── ginyi-framework-websocket/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── framework/
│   │   │                       └── websocket/
│   │   │                           ├── WebSocket.java
│   │   │                           └── config/
│   │   │                               └── WebSocketConfig.java
│   │   └── pom.xml
│   ├── ginyi-server/
│   │   ├── ginyi-server-admin/
│   │   │   ├── Dockerfile
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ginyi/
│   │   │           │       └── server/
│   │   │           │           └── admin/
│   │   │           │               ├── AdminApplication.java
│   │   │           │               ├── controller/
│   │   │           │               │   ├── SysDeptController.java
│   │   │           │               │   ├── SysLogController.java
│   │   │           │               │   ├── SysLoginController.java
│   │   │           │               │   ├── SysMenuController.java
│   │   │           │               │   ├── SysMonitorController.java
│   │   │           │               │   ├── SysNoticeController.java
│   │   │           │               │   ├── SysOnlineController.java
│   │   │           │               │   ├── SysPostController.java
│   │   │           │               │   ├── SysRoleController.java
│   │   │           │               │   ├── SysUserController.java
│   │   │           │               │   └── SysVerifyController.java
│   │   │           │               └── swagger/
│   │   │           │                   └── AdminSwagger2Config.java
│   │   │           └── resources/
│   │   │               ├── config/
│   │   │               │   └── application.yml
│   │   │               └── static/
│   │   │                   └── i18n/
│   │   │                       └── messages.properties
│   │   ├── ginyi-server-common/
│   │   │   └── pom.xml
│   │   ├── ginyi-server-web/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ginyi/
│   │   │           │       └── server/
│   │   │           │           └── web/
│   │   │           │               ├── WebApplication.java
│   │   │           │               ├── controller/
│   │   │           │               │   └── Test.java
│   │   │           │               └── swagger/
│   │   │           │                   └── WebSwagger2Config.java
│   │   │           └── resources/
│   │   │               └── config/
│   │   │                   └── application.yml
│   │   └── pom.xml
│   ├── ginyi-system/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── ginyi/
│   │           │       └── system/
│   │           │           ├── domain/
│   │           │           │   ├── BaseEntity.java
│   │           │           │   ├── LoginUser.java
│   │           │           │   ├── Sys.java
│   │           │           │   ├── SysConfig.java
│   │           │           │   ├── SysCpu.java
│   │           │           │   ├── SysDept.java
│   │           │           │   ├── SysFile.java
│   │           │           │   ├── SysJvm.java
│   │           │           │   ├── SysLogLogin.java
│   │           │           │   ├── SysLogOperation.java
│   │           │           │   ├── SysMemory.java
│   │           │           │   ├── SysMenu.java
│   │           │           │   ├── SysNotice.java
│   │           │           │   ├── SysPost.java
│   │           │           │   ├── SysRole.java
│   │           │           │   ├── SysServer.java
│   │           │           │   ├── SysUser.java
│   │           │           │   └── model/
│   │           │           │       ├── dto/
│   │           │           │       │   ├── CacheDto.java
│   │           │           │       │   ├── DeptDto.java
│   │           │           │       │   ├── LoginDto.java
│   │           │           │       │   ├── MenuDto.java
│   │           │           │       │   ├── NoticeDto.java
│   │           │           │       │   ├── PostDto.java
│   │           │           │       │   ├── RegisterDto.java
│   │           │           │       │   ├── RoleDto.java
│   │           │           │       │   └── UserDto.java
│   │           │           │       └── vo/
│   │           │           │           ├── BaseVo.java
│   │           │           │           ├── CacheKeyVo.java
│   │           │           │           ├── CacheVo.java
│   │           │           │           ├── DeptVo.java
│   │           │           │           ├── LoginVo.java
│   │           │           │           ├── NoticeVo.java
│   │           │           │           ├── PostVo.java
│   │           │           │           ├── RoleVo.java
│   │           │           │           ├── SessionUserVo.java
│   │           │           │           └── UserVo.java
│   │           │           ├── mapper/
│   │           │           │   ├── SysConfigMapper.java
│   │           │           │   ├── SysDeptMapper.java
│   │           │           │   ├── SysLogininforMapper.java
│   │           │           │   ├── SysMenuMapper.java
│   │           │           │   ├── SysNoticeMapper.java
│   │           │           │   ├── SysOperLogMapper.java
│   │           │           │   ├── SysPostMapper.java
│   │           │           │   ├── SysRoleMapper.java
│   │           │           │   └── SysUserMapper.java
│   │           │           └── service/
│   │           │               ├── ISysConfigService.java
│   │           │               ├── ISysDeptService.java
│   │           │               ├── ISysLogService.java
│   │           │               ├── ISysLoginService.java
│   │           │               ├── ISysLogininforService.java
│   │           │               ├── ISysMenuService.java
│   │           │               ├── ISysMonitorService.java
│   │           │               ├── ISysNoticeService.java
│   │           │               ├── ISysOnlineService.java
│   │           │               ├── ISysOperLogService.java
│   │           │               ├── ISysPasswordService.java
│   │           │               ├── ISysPermissionService.java
│   │           │               ├── ISysPostService.java
│   │           │               ├── ISysRoleService.java
│   │           │               ├── ISysUserService.java
│   │           │               ├── ITokenService.java
│   │           │               └── IVerifyService.java
│   │           └── resources/
│   │               ├── application.yml
│   │               ├── logging-config.xml
│   │               └── mapper/
│   │                   ├── SysDeptMapper.xml
│   │                   ├── SysMenuMapper.xml
│   │                   ├── SysNoticeMapper.xml
│   │                   ├── SysPostMapper.xml
│   │                   ├── SysRoleMapper.xml
│   │                   └── SysUserMapper.xml
│   ├── pom.xml
│   └── sql/
│       ├── ginyi-spring-vue-mongo.sql
│       └── ginyi-spring-vue-mysql.sql
└── ginyi-vue3/
    ├── .editorconfig
    ├── .gitignore
    ├── README.md
    ├── index.html
    ├── package.json
    ├── src/
    │   ├── App.vue
    │   ├── api/
    │   │   ├── controller/
    │   │   │   ├── deptController.ts
    │   │   │   ├── logController.ts
    │   │   │   ├── menuController.ts
    │   │   │   ├── monitorController.ts
    │   │   │   ├── onlineController.ts
    │   │   │   ├── postController.ts
    │   │   │   ├── roleController.ts
    │   │   │   └── userController.ts
    │   │   ├── index.ts
    │   │   └── useRequest.tsx
    │   ├── components/
    │   │   ├── commonForm/
    │   │   │   ├── index.vue
    │   │   │   ├── props.ts
    │   │   │   └── useCommonForm.ts
    │   │   ├── commonModal/
    │   │   │   ├── index.vue
    │   │   │   ├── props.ts
    │   │   │   └── useCommonModal.ts
    │   │   ├── commonTable/
    │   │   │   ├── index.vue
    │   │   │   ├── props.ts
    │   │   │   └── useCommonTable.ts
    │   │   └── monacoEditor/
    │   │       ├── index.vue
    │   │       └── monacoEditorType.ts
    │   ├── config/
    │   │   ├── console.log.ts
    │   │   ├── eventBus.ts
    │   │   └── setting.ts
    │   ├── dictionary/
    │   │   ├── useDynamicDict.ts
    │   │   └── useStaticDict.ts
    │   ├── directives/
    │   │   ├── draggable.ts
    │   │   ├── focus.ts
    │   │   ├── index.ts
    │   │   └── loading.ts
    │   ├── enums/
    │   │   ├── storeKeyEnums.ts
    │   │   └── tableActionEnums.ts
    │   ├── hooks/
    │   │   ├── useColor.ts
    │   │   ├── useCommonColums.ts
    │   │   ├── useDebthro.ts
    │   │   ├── useFormat.ts
    │   │   ├── useMenu.ts
    │   │   ├── useObject.ts
    │   │   ├── usePagination.ts
    │   │   ├── usePending.ts
    │   │   ├── useStorage.ts
    │   │   └── useTree.ts
    │   ├── interface/
    │   │   └── modules/
    │   │       └── system/
    │   │           └── index.ts
    │   ├── layout/
    │   │   ├── header/
    │   │   │   ├── breadcrumb.vue
    │   │   │   ├── index.vue
    │   │   │   └── personnel.vue
    │   │   ├── index.vue
    │   │   ├── logo/
    │   │   │   └── index.vue
    │   │   ├── menu/
    │   │   │   └── index.vue
    │   │   ├── tabs/
    │   │   │   └── index.vue
    │   │   └── theme/
    │   │       └── index.vue
    │   ├── main.ts
    │   ├── plugins/
    │   │   ├── naive-ui/
    │   │   │   └── common.tsx
    │   │   └── pinia/
    │   │       └── piniaPlugin.ts
    │   ├── router/
    │   │   └── index.ts
    │   ├── store/
    │   │   ├── index.ts
    │   │   └── modules/
    │   │       ├── useRouterStore.ts
    │   │       ├── useSystemStore.ts
    │   │       └── useUserStore.ts
    │   ├── style/
    │   │   └── index.css
    │   ├── views/
    │   │   ├── 404/
    │   │   │   └── index.vue
    │   │   ├── home/
    │   │   │   └── index.vue
    │   │   ├── login/
    │   │   │   ├── index.vue
    │   │   │   ├── loginForm.vue
    │   │   │   └── registerForm.vue
    │   │   └── pages/
    │   │       ├── monitor/
    │   │       │   ├── cache/
    │   │       │   │   └── index.vue
    │   │       │   ├── cacheList/
    │   │       │   │   ├── columns.tsx
    │   │       │   │   └── index.vue
    │   │       │   ├── data/
    │   │       │   │   └── index.vue
    │   │       │   ├── online/
    │   │       │   │   ├── columns.tsx
    │   │       │   │   └── index.vue
    │   │       │   ├── service/
    │   │       │   │   ├── columns.tsx
    │   │       │   │   └── index.vue
    │   │       │   └── task/
    │   │       │       └── index.vue
    │   │       ├── order/
    │   │       │   └── index.vue
    │   │       ├── product/
    │   │       │   └── index.vue
    │   │       ├── system/
    │   │       │   ├── department/
    │   │       │   │   ├── columns.tsx
    │   │       │   │   ├── deptEditForm.vue
    │   │       │   │   ├── deptQueryForm.vue
    │   │       │   │   └── index.vue
    │   │       │   ├── dict/
    │   │       │   │   └── index.vue
    │   │       │   ├── log/
    │   │       │   │   ├── login/
    │   │       │   │   │   ├── columns.tsx
    │   │       │   │   │   └── index.vue
    │   │       │   │   └── operation/
    │   │       │   │       ├── columns.tsx
    │   │       │   │       ├── index.vue
    │   │       │   │       └── useColumns.ts
    │   │       │   ├── menu/
    │   │       │   │   ├── columns.tsx
    │   │       │   │   ├── index.vue
    │   │       │   │   ├── menuEditForm.vue
    │   │       │   │   ├── menuQueryForm.vue
    │   │       │   │   └── useColumns.ts
    │   │       │   ├── notice/
    │   │       │   │   └── index.vue
    │   │       │   ├── params/
    │   │       │   │   └── index.vue
    │   │       │   ├── position/
    │   │       │   │   ├── columns.tsx
    │   │       │   │   ├── index.vue
    │   │       │   │   ├── postEditForm.vue
    │   │       │   │   └── postQueryForm.vue
    │   │       │   ├── role/
    │   │       │   │   ├── columns.tsx
    │   │       │   │   ├── index.vue
    │   │       │   │   ├── roleEditForm.vue
    │   │       │   │   └── roleQueryForm.vue
    │   │       │   └── user/
    │   │       │       ├── columns.tsx
    │   │       │       ├── index.vue
    │   │       │       ├── useColumns.ts
    │   │       │       ├── userEditForm.vue
    │   │       │       └── userQueryForm.vue
    │   │       └── systools/
    │   │           └── code/
    │   │               └── index.vue
    │   └── vite-env.d.ts
    ├── tsconfig.json
    ├── tsconfig.node.json
    ├── vite.config.ts
    └── web-types.json

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitignore
================================================
### gradle ###
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar

### STS ###
.settings/
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
rebel.xml
/ginyi-springboot/.idea

### NetBeans ###
nbproject/private/
build/
nbbuild/
nbdist/
.nb-gradle/

### maven ###
target/
*.war
*.ear
*.zip
*.tar
*.tar.gz
*.versionsBackup

### vscode ###
.vscode

### logs ###
/logs/
*.log

### temp ignore ###
*.cache
*.diff
*.patch
*.tmp
*.java~
*.properties~
*.xml~

### system ignore ###
.DS_Store
Thumbs.db
Servers
.metadata


/**/*.idea/**

================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: README.md
================================================
<p align="center" style="margin-left: 20px;">
	<img alt="logo" src="https://gitee.com/my-images/typora-imgs/raw/master/%E5%93%86%E5%95%A6a%E6%A2%A6test.png" width="80" height="80">
</p>
<h1 align="center" style="margin-top: 0;">Ginyi</h1>
<h5 align="center">基于对优秀开源项目RuoYi-Vue的喜爱,决定重构若依,打造属于自己的快速开发平台!</h5>
<p align="right">————向优秀致敬,向榜样学习!</p>
<p align="center">
	<a href="https://gitee.com/Ginyi/ginyi-spring-vue"><img src="https://img.shields.io/badge/license-Apache 2-red"></a>
	<a href="https://gitee.com/Ginyi/ginyi-spring-vue"><img src="https://img.shields.io/badge/Ginyi-v1.0.0-red"></a>
	<a href="https://gitee.com/Ginyi/ginyi-spring-vue"><img src="https://img.shields.io/badge/SpringBoot-Vue3-red"></a>
</p>





### 平台简介

基于`SpringBoot`和`Vue3`,搭配`Naive UI`组件库,模块清晰,界面美观,可自主选择主题色,提高视觉舒适度!部分功能尚未实现,有时间将持续更新,欢迎Star⭐!



### 特别鸣谢

- [RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue?_from=gitee_search)
- [Naive UI](https://www.naiveui.com/)



### 项目地址

演示地址:http://114.132.120.190:3800 (`仅PC端`)

接口地址:http://114.132.120.190:8066/doc.html

| 演示账号 / 密码    | 说明                         |
| ------------------ | ---------------------------- |
| `admin / 123456`   | 超级管理员,具有全部权限     |
| `Ginyi / 123456`   | 系统管理员,具有系统管理权限 |
| `order / 123456`   | 订单管理员,具有订单管理权限 |
| `product / 123456` | 商品管理员,具有商品管理权限 |

**注:**学生机服务器,5月份到期~ 请珍惜公用资源,请勿攻击~ 拜托拜托!😘😘😘 



### 帮助文档

- 没有~不想写文档...如果`Star`数量破`1k`,可以考虑一下!
- 可以参考`Ruoyi`的文档 http://doc.ruoyi.vip/(仅后端)



### 技术选型

| 前端                                     | 后端                            |
| ---------------------------------------- | ------------------------------- |
| `Node` 项目环境基础                      | `Maven` 构建多模块项目          |
| `Vite4` 构建项目                         | `Springboot` 项目主框架         |
| `Vue3` 项目主框架                        | `MySQL` 关系型数据库            |
| `TypeScript` 全量TS编写,搭配TSX模板渲染 | `MongoDB` 文档型数据库          |
| `Naive UI` 组件库                        | `Redis` 基于内存数据库          |
| `Pinia` 全局状态管理                     | `SpringSecurity & JWT` 权限框架 |
| `Axios` 网络请求库                       | `MyBatis-Plus` ORM框架          |
| `Monaco` 代码编辑器(vscode)            | `Hutool` 工具类                 |
| `...`                                    | `...`                           |



### 内置功能

| 功能         | 介绍                                                         | Ruoyi | Ginyi |
| ------------ | ------------------------------------------------------------ | ----- | ----- |
| `用户管理`   | 用户是系统操作者,该功能主要完成系统用户配置                 | ⭕     | ⭕     |
| `部门管理`   | 配置系统组织机构(公司、部门、小组),树结构展现支持数据权限 | ⭕     | ⭕     |
| `岗位管理`   | 配置系统用户所属担任职务                                     | ⭕     | ⭕     |
| `菜单管理`   | 配置系统菜单,操作权限,按钮权限标识等                       | ⭕     | ⭕     |
| `角色管理`   | 角色菜单权限分配、设置角色按机构进行数据范围权限划分         | ⭕     | ⭕     |
| `字典管理`   | 对系统中经常使用的一些较为固定的数据进行维护                 | ⭕     | ❎     |
| `参数管理`   | 对系统动态配置常用参数                                       | ⭕     | ❎     |
| `通知公告`   | 系统通知公告信息发布维护                                     | ⭕     | ❎     |
| `操作日志`   | 系统正常操作日志记录和查询;系统异常信息日志记录和查询       | ⭕     | ⭕     |
| `登录日志`   | 系统登录日志记录查询包含登录异常                             | ⭕     | ⭕     |
| `在线用户`   | 当前系统中活跃用户状态监控                                   | ⭕     | ⭕     |
| `定时任务`   | 在线(添加、修改、删除)任务调度包含执行结果日志              | ⭕     | ❎     |
| `代码生成`   | 前后端代码的生成(java、html、xml、sql)支持CRUD下载         | ⭕     | ❎     |
| `系统接口`   | 根据业务代码自动生成相关的api接口文档                        | ⭕     | ❎     |
| `服务监控`   | 监视当前系统CPU、内存、磁盘、堆栈等相关信息                  | ⭕     | ❎     |
| `缓存监控`   | 对系统的缓存信息查询,命令统计等                             | ⭕     | ❎     |
| `连接池监视` | 监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈  | ⭕     | ❎     |

**备注:**

- 尚未实现的功能,有时间将继续更新!



### 效果预览

<table>
    <tr>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230305141535709.png"/></td>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230305141626273.png"/></td>
    </tr>
    <tr>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230304205342498.png"/></td>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230304205431871.png"/></td>
    </tr>
    <tr>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230304205625969.png"/></td>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230304205559401.png"/></td>
    </tr>
    <tr>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230305141742131.png"/></td>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230305141818713.png"/></td>
    </tr>
    <tr>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230304210204690.png"/></td>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230304210228094.png"/></td>
    </tr>
     <tr>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230305141922643.png"/></td>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230305142006594.png"/></td>
    </tr>
    <tr>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230304210613278.png"/></td>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230304210651948.png"/></td>
    </tr>
    <tr>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230305142419340.png"/></td>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230305142444669.png"/></td>
    </tr>
    <tr>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230304211123371.png"/></td>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230304211109116.png"/></td>
    </tr>
    <tr>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230305142650617.png"/></td>
        <td><img src="https://gitee.com/my-images/typora-imgs/raw/master/image-20230305142737090.png"/></td>
    </tr>
</table>


================================================
FILE: ginyi-springboot/.gitignore
================================================
### gradle ###
.gradle
/build/
!gradle/wrapper/gradle-wrapper.jar

### STS ###
.settings/
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
bin/

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
rebel.xml

### NetBeans ###
nbproject/private/
build/
nbbuild/
nbdist/
.nb-gradle/

### maven ###
target/
*.war
*.ear
*.zip
*.tar
*.tar.gz
*.versionsBackup

### vscode ###
.vscode

### logs ###
/logs/
*.log

### temp ignore ###
*.cache
*.diff
*.patch
*.tmp
*.java~
*.properties~
*.xml~

### system ignore ###
.DS_Store
Thumbs.db
Servers
.metadata


================================================
FILE: ginyi-springboot/README.md
================================================
### 项目地址

接口文档:http://114.132.120.190:8066/doc.html

代码仓库:https://gitee.com/Ginyi/ginyi-spring-vue



### 帮助文档

- 没有~不想写文档...如果`Star`数量破`1k`,可以考虑一下!
- 可以参考`Ruoyi`的文档 http://doc.ruoyi.vip/



### 项目特色

- 使用主流技术栈`SpringBoot`、`Mybatis-plus`、`Redis`、`MySQL`、`MongoDB`等,易上手!
- 基于`SpringSecurity`安全框架实现`RBAC`的权限模式,易扩展易维护!
- 基于`Maven`多模块,可在上层应用中创建多个服务!模块分明,各司其职!
- 内置多个后台系统常用功能,搭配完善的接口文档:
  - 系统管理:`用户管理`、`部门管理`、`岗位管理`、`角色管理`、`菜单管理`等
  - 日志管理:`登录日志`、`操作日志`、`在线用户`等



### 前置知识

**重点:**使用本项目时,你需要具备以下基础知识:

1. `SpringBoot`框架基础,熟悉`MVC`分层的开发模式!
2. `Maven`基础,掌握多模块项目下,服务间的依赖引用!
3. `Redis`、`MongoDB`中间件、`Mybatis`和`Mybatis-plus`等`ORM`框架的使用!



### 项目环境

**注意:**使用本项目时,为了你能愉快地进行开发,请尽可能使用以下环境进行开发:

1. `JDK v1.8`
2. `Maven v3.6.3`
3. `MySQL v8.0`
4. `IntelliJ IDEA`



### 项目结构

```bash
ginyi-springboot
|
├─ ginyi-common  # 通用模块
│  ├─ ginyi-common-annotation      # 通用注解
│  ├─ ginyi-common-constants       # 通用常量
│  ├─ ginyi-common-enums           # 通用枚举
│  ├─ ginyi-common-exception       # 通用异常处理
│  ├─ ginyi-common-mysql           # 通用MySql配置
│  ├─ ginyi-common-redis           # 通用Redis配置
│  ├─ ginyi-common-result          # 通用结果集
│  ├─ ginyi-common-swagger         # 通用在线接口文档配置
│  └─ ginyi-common-utils           # 通用工具类
|
├─ ginyi-framework  # 框架模块
│  ├─ ginyi-framework-core         # 框架核心
│  ├─ ginyi-framework-security     # 安全框架
│  └─ ginyi-framework-websocket    # 实时通讯框架
|
├─ ginyi-server   # 服务模块(对外提供api接口)
│  ├─ ginyi-server-admin           # 后台系统端(包含系统接口)
│  ├─ ginyi-server-common          # 通用服务
│  └─ ginyi-server-web             # 前台应用端
|
├─ ginyi-system  # 系统服务模块(包含yaml配置、系统Entity、系统Service、系统Mapper等)
|
└─ sql  # 数据库文件
```



================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-annotation/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ginyi-common</artifactId>
        <groupId>com.ginyi</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ginyi-common-annotation</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.ginyi</groupId>
            <artifactId>ginyi-common-enums</artifactId>
            <version>${ginyi.version}</version>
        </dependency>
    </dependencies>

</project>

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-annotation/src/main/java/ginyi.common.annotation/Anonymous.java
================================================
package ginyi.common.annotation;

import java.lang.annotation.*;

/**
 * 匿名访问不鉴权注解
 * 
 * @author ruoyi
 */
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Anonymous
{
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-annotation/src/main/java/ginyi.common.annotation/CreateBy.java
================================================
package ginyi.common.annotation;

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.FIELD})
public @interface CreateBy {
    String value() default "";
}

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-annotation/src/main/java/ginyi.common.annotation/CreateTime.java
================================================
package ginyi.common.annotation;

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.FIELD})
public @interface CreateTime {
    String value() default "";
}

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-annotation/src/main/java/ginyi.common.annotation/Log.java
================================================
package ginyi.common.annotation;

import ginyi.common.enums.BusinessType;
import ginyi.common.enums.OperatorType;

import java.lang.annotation.*;

/**
 * 自定义操作日志记录注解
 *
 * @author ruoyi
 */
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Log {
    /**
     * 模块
     */
    public String title() default "";

    /**
     * 功能
     */
    public BusinessType businessType() default BusinessType.OTHER;

    /**
     * 操作人类别
     */
    public OperatorType operatorType() default OperatorType.MANAGE;

    /**
     * 是否保存请求的参数
     */
    public boolean isSaveRequestData() default true;

    /**
     * 是否保存响应的参数
     */
    public boolean isSaveResponseData() default true;
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-annotation/src/main/java/ginyi.common.annotation/RepeatSubmit.java
================================================
package ginyi.common.annotation;

import java.lang.annotation.*;

/**
 * 自定义注解防止表单重复提交
 *
 * @author ruoyi
 */
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RepeatSubmit {
    /**
     * 间隔时间(ms),小于此时间视为重复提交
     */
    public int interval() default 5000;

    /**
     * 提示消息
     */
    public String message() default "不允许重复提交,请稍候再试";
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-annotation/src/main/java/ginyi.common.annotation/UpdateBy.java
================================================
package ginyi.common.annotation;

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.FIELD})
public @interface UpdateBy {
    String value() default "";
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-annotation/src/main/java/ginyi.common.annotation/UpdateTime.java
================================================
package ginyi.common.annotation;

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.FIELD})
public @interface UpdateTime {
    String value() default "";
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-constants/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ginyi-common</artifactId>
        <groupId>com.ginyi</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ginyi-common-constants</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-constants/src/main/java/ginyi/common/constant/CacheConstants.java
================================================
package ginyi.common.constant;

/**
 * 缓存的key 常量
 *
 * @author ruoyi
 */
public class CacheConstants {
    /**
     * 参数管理 cache key
     */
    public static final String SYS_CONFIG_KEY = "sys_config:";

    /**
     * 验证码 redis key
     */
    public static final String CAPTCHA_CODE_KEY = "captcha_codes:";

    /**
     * 登录用户 redis key
     */
    public static final String LOGIN_TOKEN_KEY = "login_tokens:";

    /**
     * 登录账户密码错误次数 redis key
     */
    public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";

    /**
     * 防重提交 redis key
     */
    public static final String REPEAT_SUBMIT_KEY = "repeat_submit:";

    /** 防止恶意请求 */
    public static final String API_REQUEST = "api_request:";



    /** 菜单前缀,用于批量删除 */
    public static final String MENU_KEY_PREFIX = "menu_*";
    /** 菜单列表 */
    public static final String MENU_LIST_KEY = "menu_list";
    /** 用户菜单的菜单列表 */
    public static final String MENU_USER_LIST_KEY = "menu_user_list:";
    /** 菜单不存在的key */
    public static final String MENU_NOT_EXIST_KEY = "menu_not_exist:";
    /** 菜单详情 */
    public static final String MENU_DETAILS_BY_ID_KEY = "menu_details_by_id:";


    /** 用户前缀,用于批量删除 */
    public static final String USER_KEY_PREFIX = "user_*";
    /** 用户列表的key */
    public static final String USER_LIST_KEY = "user_list";
    /** 用户不存在的key */
    public static final String USER_NOT_EXIST_KEY = "user_not_exist:";
    /** 用户详情 */
    public static final  String USER_DETAILS_BY_USERID_KEY = "user_details_by_userId:";


    /** 部门前缀,用于批量删除 */
    public static final String DEPT_KEY_PREFIX = "dept_*";
    /** 部门列表 */
    public static final String DEPT_LIST_KEY = "dept_list";
    /** 部门不存在的key */
    public static final String DEPT_NOT_EXIST_KEY = "dept_not_exist:";
    /** 部门详情 */
    public static final String DEPT_DETAILS_BY_DEPTID_KEY = "dept_details_by_deptId:";
    /** 同分支下部门名称已被使用 */
    public static final String DEPT_NAME_USED_KEY = "dept_name_used_key:";


    /** 岗位前缀,用于批量删除 */
    public static final String POST_KEY_PREFIX = "post_*";
    /** 岗位列表 */
    public static final String POST_LIST_KEY = "post_list";
    /** 岗位不存在大的key */
    public static final String POST_NOT_EXIST_KEY = "post_not_exist:";
    /** 岗位详情 */
    public static final String POST_DETAILS_BY_POSTID_KEY = "post_details_by_postId:";


    /** 角色前缀,用于批量删除 */
    public static final String ROLE_KEY_PREFIX = "role_*";
    /** 角色列表 */
    public static final String ROLE_LIST_KEY = "role_list";
    /** 角色不存在的key */
    public static final String ROLE_NOT_EXIST_KEY = "role_not_exist:";
    /** 角色名已被使用 */
    public static final String ROLE_NAME_USED_KEY = "role_name_used:";
    /** 角色编码已被使用 */
    public static final String ROLE_CODE_USED_KEY = "role_code_used:";
    /** 角色详情 */
    public static final String ROLE_DETAILS_BY_ROLEID_KEY = "role_details_by_roleId:";

    /** 通知公告不存在的key */
    public static final String NOTICE_NOT_EXIST_KEY = "notice_not_exist:";

}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-constants/src/main/java/ginyi/common/constant/CommonMessageConstants.java
================================================
package ginyi.common.constant;

/**
 * 错误信息常量
 */
public class CommonMessageConstants {

    public static final String LOGIN_SUCCESS = "登录成功";
    public static final String REGISTER_SUCCESS = "注册成功";
    public static final String REDIS_KEY_NOT_EXIST = "该Key不存在,请仔细检查!";
    public static final String REDIS_VALUE_TYPE_NOT_MATCH = "数据类型不匹配,请联系管理人员!";

    public static final String SYS_ERROR = "请联系管理人员!";
    public static final String SYS_AUTHENTICATION_VALID = "权限不足,无法访问系统资源!";
    public static final String SYS_REQUEST_ILLEGAL = "请求参数错误,请仔细检查!";
    public static final String SYS_CAPTCHA_NOT_EXIST = "验证码不能为空!";
    public static final String SYS_PREVIEW_ENV = "演示环境不允许进行此操作!";
    public static final String SYS_BED_REQUEST = "恶意请求!该请求已被终止!";

    public static final String UPLOAD_FILE_ERROR = "文件上传业务异常";
    public static final String UPLOAD_SIZE_EXCEED = "单文件大小不得大于5MB,总文件大小不得大于50MB";

    public static final String VERIFY_EXPIRE = "验证码已失效!";
    public static final String VERiFY_INCORRECT = "验证码错误!";

    public static final String USER_PASSWORD_NOT_MATCH = "用户名密码不匹配!";
    public static final String USER_EXIST = "用户已存在!";
    public static final String USER_NOT_EXIST = "用户不存在!";
    public static final String USER_IS_DELETED = "用户已被注销!";
    public static final String USER_IS_FORBIDDEN = "用户已被停用!";
    public static final String USER_IS_LOCKED = "用户已被停用!";
    public static final String USER_NAME_USED = "用户名已被占用!";
    public static final String USER_NOT_FOUND = "请求参数错误,请仔细检查!";
    public static final String USER_ID_NOT_FOUND = "请求参数错误,用户ID不能为空!";
    public static final String USER_STATUS_ILLEGAL = "请求参数错误,用户状态不合法!";
    public static final String USER_IDS_ILLEGAL = "通知的用户不能为空!";


    public static final String MENU_COMPONENT_NOT_EXIST = "组件路径不存在!";
    public static final String MENU_PATH_NOT_EXIST = "路由地址不存在!";
    public static final String MENU_NAME_USED = "菜单名称已被使用!";
    public static final String MENU_NOT_EXIST = "菜单不存在!";
    public static final String MENU_PARENT_NOT_EXIST = "上级菜单不存在!";
    public static final String MENU_ID_NOT_FOUND = "请求参数错误,菜单ID不能为空!";
    public static final String MENU_STATUS_ILLEGAL = "请求参数错误,菜单状态不合法!";


    public static final String POST_NOT_EXIST = "岗位不存在!";
    public static final String POST_NAME_USED = "岗位名称已被使用!";
    public static final String POST_CODE_USED = "岗位编码已被使用!";
    public static final String POST_ID_NOT_FOUND = "请求参数错误,岗位ID不能为空!";
    public static final String POST_STATUS_ILLEGAL = "请求参数错误,岗位状态不合法!";


    public static final String ROLE_NOT_EXIST = "角色不存在!";
    public static final String ROLE_NAME_USED = "角色名称已被使用!";
    public static final String ROLE_PERMISSION_CODE_USED = "角色权限字符已被使用!";
    public static final String ROLE_MENU_NOT_EXIST = "菜单权限不存在!";
    public static final String ROLE_ID_NOT_FOUND = "请求参数错误,角色ID不能为空!";
    public static final String ROLE_STATUS_ILLEGAL = "请求参数错误,角色状态不合法!";


    public static final String DEPT_NOT_EXIST = "部门不存在!";
    public static final String DEPT_NAME_USED = "同分支下部门名称已被使用!";
    public static final String DEPT_PARENT_NOT_EXIST = "上级部门不存在!";
    public static final String DEPT_ID_NOT_FOUND = "请求参数错误,部门ID不能为空!";
    public static final String DEPT_STATUS_ILLEGAL = "请求参数错误,部门状态不合法!";


    public static final String NOTICE_NOT_EXIST = "通知公告不存在!";
    public static final String NOTICE_CURRENT_USER_NOT_EXIST = "当前用户不存在该消息!";
    public static final String NOTICE_HAVE_READ = "当前通知公告已确认,无需二次确认!";
    public static final String NOTICE_NOT_ALLOW = "当前通知公告无法被修改!";



}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-constants/src/main/java/ginyi/common/constant/HttpStatus.java
================================================
package ginyi.common.constant;

/**
 * 返回状态码
 * 
 * @author ruoyi
 */
public class HttpStatus
{
    /**
     * 操作成功
     */
    public static final int SUCCESS = 200;

    /**
     * 对象创建成功
     */
    public static final int CREATED = 201;

    /**
     * 请求已经被接受
     */
    public static final int ACCEPTED = 202;

    /**
     * 操作已经执行成功,但是没有返回数据
     */
    public static final int NO_CONTENT = 204;

    /**
     * 资源已被移除
     */
    public static final int MOVED_PERM = 301;

    /**
     * 重定向
     */
    public static final int SEE_OTHER = 303;

    /**
     * 资源没有被修改
     */
    public static final int NOT_MODIFIED = 304;

    /**
     * 参数列表错误(缺少,格式不匹配)
     */
    public static final int BAD_REQUEST = 400;

    /**
     * 未授权
     */
    public static final int UNAUTHORIZED = 401;

    /**
     * 访问受限,授权过期
     */
    public static final int FORBIDDEN = 403;

    /**
     * 资源,服务未找到
     */
    public static final int NOT_FOUND = 404;

    /**
     * 不允许的http方法
     */
    public static final int BAD_METHOD = 405;

    /**
     * 资源冲突,或者资源被锁
     */
    public static final int CONFLICT = 409;

    /**
     * 不支持的数据,媒体类型
     */
    public static final int UNSUPPORTED_TYPE = 415;

    /**
     * 系统内部错误
     */
    public static final int ERROR = 500;

    /**
     * 接口未实现
     */
    public static final int NOT_IMPLEMENTED = 501;

    /**
     * 系统警告消息
     */
    public static final int WARN = 601;
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-constants/src/main/java/ginyi/common/constant/UserConstants.java
================================================
package ginyi.common.constant;

/**
 * 用户常量信息
 *
 * @author ruoyi
 */
public class UserConstants {
    /**
     * 平台内系统用户的唯一标志
     */
    public static final String SYS_USER = "SYS_USER";

    /**
     * 当前线程上的用户
     */
    public static final String CURRENT_USER = "CURRENT_USER";

    /**
     * 正常状态
     */
    public static final String NORMAL = "0";

    /**
     * 异常状态
     */
    public static final String EXCEPTION = "1";

    /**
     * 用户封禁状态
     */
    public static final String USER_DISABLE = "1";

    /**
     * 角色封禁状态
     */
    public static final String ROLE_DISABLE = "1";

    /**
     * 部门正常状态
     */
    public static final String DEPT_NORMAL = "0";

    /**
     * 部门停用状态
     */
    public static final String DEPT_DISABLE = "1";

    /**
     * 字典正常状态
     */
    public static final String DICT_NORMAL = "0";

    /**
     * 是否为系统默认(是)
     */
    public static final String YES = "Y";

    /**
     * 是否菜单外链(是)
     */
    public static final String YES_FRAME = "0";

    /**
     * 是否菜单外链(否)
     */
    public static final String NO_FRAME = "1";

    /**
     * 菜单类型(目录)
     */
    public static final String TYPE_DIR = "M";

    /**
     * 菜单类型(菜单)
     */
    public static final String TYPE_MENU = "C";

    /**
     * 菜单类型(按钮)
     */
    public static final String TYPE_BUTTON = "F";

    /**
     * Layout组件标识
     */
    public final static String LAYOUT = "Layout";

    /**
     * ParentView组件标识
     */
    public final static String PARENT_VIEW = "ParentView";

    /**
     * InnerLink组件标识
     */
    public final static String INNER_LINK = "InnerLink";

    /**
     * 校验返回结果码
     */
    public final static String UNIQUE = "0";
    public final static String NOT_UNIQUE = "1";

    /**
     * 用户名长度限制
     */
    public static final int USERNAME_MIN_LENGTH = 2;
    public static final int USERNAME_MAX_LENGTH = 20;

    /**
     * 密码长度限制
     */
    public static final int PASSWORD_MIN_LENGTH = 5;
    public static final int PASSWORD_MAX_LENGTH = 20;
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-enums/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ginyi-common</artifactId>
        <groupId>com.ginyi</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ginyi-common-enums</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

</project>

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-enums/src/main/java/ginyi/common/enums/BusinessStatus.java
================================================
package ginyi.common.enums;

/**
 * 操作状态
 *
 * @author ruoyi
 */
public enum BusinessStatus {
    /**
     * 成功
     */
    SUCCESS,

    /**
     * 失败
     */
    FAIL,
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-enums/src/main/java/ginyi/common/enums/BusinessType.java
================================================
package ginyi.common.enums;

/**
 * 业务操作类型
 *
 * @author ruoyi
 */
public enum BusinessType {
    /**
     * 其它
     */
    OTHER,

    /**
     * 新增
     */
    INSERT,

    /**
     * 修改
     */
    UPDATE,

    /**
     * 删除
     */
    DELETE,

    /**
     * 授权
     */
    GRANT,

    /**
     * 导出
     */
    EXPORT,

    /**
     * 导入
     */
    IMPORT,

    /**
     * 强退
     */
    FORCE,

    /**
     * 生成代码
     */
    GENCODE,

    /**
     * 清空数据
     */
    CLEAN,
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-enums/src/main/java/ginyi/common/enums/HttpMethod.java
================================================
package ginyi.common.enums;

import org.springframework.lang.Nullable;

import java.util.HashMap;
import java.util.Map;

/**
 * 请求方式
 *
 * @author ruoyi
 */
public enum HttpMethod {
    GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE;

    private static final Map<String, HttpMethod> mappings = new HashMap<>(16);

    static {
        for (HttpMethod httpMethod : values()) {
            mappings.put(httpMethod.name(), httpMethod);
        }
    }

    @Nullable
    public static HttpMethod resolve(@Nullable String method) {
        return (method != null ? mappings.get(method) : null);
    }

    public boolean matches(String method) {
        return (this == resolve(method));
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-enums/src/main/java/ginyi/common/enums/OperatorType.java
================================================
package ginyi.common.enums;

/**
 * 操作人类别
 *
 * @author ruoyi
 */
public enum OperatorType {
    /**
     * 其它
     */
    OTHER,

    /**
     * 后台用户
     */
    MANAGE,

    /**
     * 手机端用户
     */
    MOBILE
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-exception/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ginyi-common</artifactId>
        <groupId>com.ginyi</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ginyi-common-exception</artifactId>

    <dependencies>
        <!-- 通用结果集 -->
        <dependency>
            <groupId>com.ginyi</groupId>
            <artifactId>ginyi-common-result</artifactId>
            <version>${ginyi.version}</version>
        </dependency>

        <!-- SpringBoot Web容器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 通用的静态常量 -->
        <dependency>
            <groupId>com.ginyi</groupId>
            <artifactId>ginyi-common-constants</artifactId>
            <version>${ginyi.version}</version>
        </dependency>

    </dependencies>

</project>

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/CommonException.java
================================================
package ginyi.common.exception;

import ginyi.common.result.StateCode;
import lombok.Data;

/**
 * 通用的异常处理
 */
@Data
public class CommonException extends RuntimeException{

    private StateCode state;
    private Object data;

    public CommonException(StateCode state, Object data) {
        this.state = state;
        this.data = data;
    }

    public CommonException(StateCode state) {
        this.state = state;
        this.data = data;
    }

}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/UnPermissionException.java
================================================
package ginyi.common.exception;

import ginyi.common.result.StateCode;
import lombok.Data;

/**
 * 没有对应的接口权限
 */
@Data
public class UnPermissionException extends RuntimeException{
    private static final long serialVersionUID = 1L;

}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/UserPasswordNotMatchException.java
================================================
package ginyi.common.exception;

/**
 * 用户密码不正确或不符合规范异常类
 */
public class UserPasswordNotMatchException extends RuntimeException{
    private static final long serialVersionUID = 1L;

}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/UserPasswordRetryLimitExceedException.java
================================================
package ginyi.common.exception;

import ginyi.common.result.StateCode;
import lombok.Data;

/**
 * 用户错误最大次数异常类
 */
@Data
public class UserPasswordRetryLimitExceedException extends RuntimeException {

    private static final long serialVersionUID = 1L;
    private StateCode state;
    private Object data;

    public UserPasswordRetryLimitExceedException(StateCode state, Object data) {
        this.state = state;
        this.data = data;
    }

    public UserPasswordRetryLimitExceedException(StateCode state) {
        this.state = state;
        this.data = data;
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/handler/GlobalExceptionHandler.java
================================================
package ginyi.common.exception.handler;

import com.alibaba.fastjson2.JSON;
import ginyi.common.constant.CommonMessageConstants;
import ginyi.common.exception.CommonException;
import ginyi.common.exception.UnPermissionException;
import ginyi.common.exception.UserPasswordNotMatchException;
import ginyi.common.exception.UserPasswordRetryLimitExceedException;
import ginyi.common.result.CommonResult;
import ginyi.common.result.StateCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartException;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * 全局异常处理类
 */
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {

    /**
     * 业务异常 ===>>> 处理数据异常处理
     *
     * @param e
     * @return
     */
    @ExceptionHandler(CommonException.class)
    @ResponseStatus(HttpStatus.OK)
    public CommonResult BusinessExceptionHandler(CommonException e) {
        if (e.getState() == StateCode.ERROR_SYSTEM) {
            return CommonResult.error(e.getState(), CommonMessageConstants.SYS_ERROR);
        }
        return CommonResult.error(e.getState(), e.getData());
    }

    /**
     * 参数校验 ===> 方法参数错误异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    @ResponseStatus(HttpStatus.OK)
    public CommonResult MethodArgumentNotValidExceptionHandler(MethodArgumentNotValidException e) {
        List<String> errorList = new ArrayList<>();
        // 从异常对象中获取 ObjectError 对象
        if (!e.getBindingResult().getAllErrors().isEmpty()) {
            for (ObjectError error : e.getBindingResult().getAllErrors()) {
                errorList.add(error.getDefaultMessage());
            }
        }
        HashMap<String, Object> map = new HashMap<>();
        map.put("errorMessageList", errorList);
        log.info(JSON.toJSONString(CommonResult.error(StateCode.ERROR_PARAMS, map)));
        return CommonResult.error(StateCode.ERROR_PARAMS, map);
    }

    /**
     * 参数校验 ===>>> 请求参数不合法
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(HttpMessageNotReadableException.class)
    public CommonResult HttpMessageNotReadableExceptionHandler(HttpMessageNotReadableException e) {
        return CommonResult.error(StateCode.ERROR_REQUEST_PARAMS, CommonMessageConstants.SYS_REQUEST_ILLEGAL);
    }

    /**
     * 登录认证异常 ===> 用户名密码不匹配
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(UserPasswordNotMatchException.class)
    public CommonResult UserPasswordNotMatchExceptionHandler(UserPasswordNotMatchException e) {
        return CommonResult.error(StateCode.ERROR_UNAUTHENTICATION, CommonMessageConstants.USER_PASSWORD_NOT_MATCH);
    }

    /**
     * 登录认证异常 ===> 用户登录失败次数超最大限制异常
     */
    @ResponseStatus(HttpStatus.OK)
    @ExceptionHandler(UserPasswordRetryLimitExceedException.class)
    public CommonResult UserPasswordRetryLimitExceedExceptionHandler(UserPasswordRetryLimitExceedException e) {
        return CommonResult.error(e.getState(), e.getData());
    }


    /**
     * 上传文件异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(MultipartException.class)
    @ResponseStatus(HttpStatus.OK)
    public CommonResult MultipartExceptionHandler(MultipartException e) {
        if (e instanceof MaxUploadSizeExceededException) {
            return CommonResult.error(StateCode.ERROR_MULTIPART, CommonMessageConstants.UPLOAD_SIZE_EXCEED);
        }
        return CommonResult.error(StateCode.ERROR_MULTIPART, CommonMessageConstants.UPLOAD_FILE_ERROR);
    }

    /**
     * 权限异常 ===>>>> 访问接口无权限
     *
     * @param e
     * @return
     */
    @ExceptionHandler({UnPermissionException.class})
    @ResponseStatus(HttpStatus.OK)
    public CommonResult UnPermissionExceptionHandler(UnPermissionException e) {
        return CommonResult.error(StateCode.ERROR_NOT_PERMISSION, CommonMessageConstants.SYS_ERROR);
    }


    /**
     * 全局异常处理 ===> 处理其他所有未知异常
     *
     * @param e
     * @return
     */
    @ExceptionHandler(Exception.class)
    @ResponseStatus(HttpStatus.OK)
    public CommonResult ExceptionHandler(Exception e) {
        log.error("系统异常", e);
        return CommonResult.error(StateCode.ERROR_SYSTEM, CommonMessageConstants.SYS_ERROR);
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-mysql/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ginyi-common</artifactId>
        <groupId>com.ginyi</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ginyi-common-mysql</artifactId>

    <dependencies>
        <!-- mysql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!-- druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>

        <!-- SpringBoot集成mybatis框架 -->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
        </dependency>

        <!-- mybatis-plus -->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>
        <!-- 公用常量包 -->
        <dependency>
            <groupId>com.ginyi</groupId>
            <artifactId>ginyi-common-constants</artifactId>
            <version>${ginyi.version}</version>
        </dependency>
        <!-- 公用注解包 -->
        <dependency>
            <groupId>com.ginyi</groupId>
            <artifactId>ginyi-common-annotation</artifactId>
            <version>${ginyi.version}</version>
        </dependency>
    </dependencies>

</project>

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/MyPage.java
================================================
package ginyi.common.mysql;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.Data;

/**
 * 分页参数有传,根据分页查询,没传,查询所有
 */
@Data
public class MyPage {

    /**
     * 当前页
     */
    private Long pageNum;
    /**
     * 每页条数
     */
    private Long pageSize;
    /**
     * 是否进行分页
     */
    private boolean isPage;

    public MyPage() {
    }

    public MyPage(Long page, Long pageSize) {
        if ((page != null && page > 0) && (pageSize != null && pageSize > 0)) {
            this.pageNum = page;
            this.pageSize = pageSize;
            this.isPage = true;
        }else {
            this.pageNum = 1L;
            this.pageSize = 10L;
            this.isPage = false;
        }
    }

    public Page getPage(){
        return this.isPage ? new Page(this.pageNum, this.pageSize) : new Page().setSize(10000L);
    }

}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/config/MyBatisPlusInterceptorConfig.java
================================================
package ginyi.common.mysql.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisPlusInterceptorConfig {

    @Bean
    public MybatisPlusInterceptor myBatisPlusInterceptor() {
        // 定义拦截器
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 分页拦截器
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/handler/JacksonArrayTypeHandler.java
================================================
package ginyi.common.mysql.handler;

import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

@Slf4j
public class JacksonArrayTypeHandler extends AbstractJsonTypeHandler<List> {

    private final Class<? extends Object> type;

    private final ObjectMapper objectMapper;

    public JacksonArrayTypeHandler(Class<?> type) {
        objectMapper = new ObjectMapper();
        this.type = type;
    }


    @SneakyThrows
    @Override
    protected List parse(String json) {
        if (type.equals(List.class)) {
            return objectMapper.readValue(json, List.class);
        } else {
            return JSON.parseArray(json, type);
        }
    }

    @SneakyThrows
    @Override
    protected String toJson(List obj) {
        return objectMapper.writeValueAsString(obj);
    }
}



================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/handler/MyMetaObjectHandler.java
================================================
package ginyi.common.mysql.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import ginyi.common.constant.UserConstants;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Date;

@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Resource
    private HttpServletRequest request;

    /**
     * 插入时的填充策略
     *
     * @param metaObject
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("createBy", request.getAttribute(UserConstants.CURRENT_USER), metaObject);
        this.setFieldValByName("createTime", new Date(), metaObject);
        this.setFieldValByName("updateBy", request.getAttribute(UserConstants.CURRENT_USER), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }

    /**
     * 更新时的填充策略
     *
     * @param metaObject
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("updateBy", request.getAttribute(UserConstants.CURRENT_USER), metaObject);
        this.setFieldValByName("updateTime", new Date(), metaObject);
    }

}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/interceptor/MyInterceptor.java
================================================
package ginyi.common.mysql.interceptor;

import ginyi.common.annotation.CreateBy;
import ginyi.common.annotation.CreateTime;
import ginyi.common.annotation.UpdateBy;
import ginyi.common.annotation.UpdateTime;
import ginyi.common.constant.UserConstants;
import org.apache.ibatis.binding.MapperMethod;
import org.apache.ibatis.executor.Executor;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlCommandType;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Signature;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.util.Date;
import java.util.Set;

/**
 * 自定义 Mybatis 插件,自动设置 createTime、createBy 和 updateTime、updateBy 的值。
 * 拦截 update 操作(添加和修改)
 */
@Component
@Intercepts({@Signature(
        type = Executor.class,
        method = "update",
        args = {MappedStatement.class, Object.class}
)})
public class MyInterceptor implements Interceptor {

    @Resource
    private HttpServletRequest request;

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0];

        // 获取 SQL 命令
        SqlCommandType sqlCommandType = mappedStatement.getSqlCommandType();
        //只判断新增和修改
        if (SqlCommandType.INSERT.equals(sqlCommandType) || SqlCommandType.UPDATE.equals(sqlCommandType)) {
            // 获取参数
            Object parameter = invocation.getArgs()[1];
            //批量操作时
            if (parameter instanceof MapperMethod.ParamMap) {
                MapperMethod.ParamMap map = (MapperMethod.ParamMap) parameter;
                Set keys = map.keySet();
                for (Object key : keys) {
                    if (map.get(key) != null) {
                        setParameter(map.get(key), sqlCommandType);
                    }
                }
            } else {
                setParameter(parameter, sqlCommandType);
            }
        }
        return invocation.proceed();
    }

    public void setParameter(Object parameter, SqlCommandType sqlCommandType) throws Throwable {
        Class<?> aClass = parameter.getClass();
        Field[] declaredFields = aClass.getSuperclass().getDeclaredFields();

        for (Field field : declaredFields) {
            if (SqlCommandType.INSERT.equals(sqlCommandType)) {
                // insert 语句插入 createBy
                if (field.getAnnotation(CreateBy.class) != null) {
                    field.setAccessible(true);
                    field.set(parameter, request.getAttribute(UserConstants.CURRENT_USER));
                }

                // insert 语句插入 createTime
                if (field.getAnnotation(CreateTime.class) != null) {
                    field.setAccessible(true);
                    field.set(parameter, new Date());
                }
            }

            if (SqlCommandType.UPDATE.equals(sqlCommandType)) {
                // update 语句插入 updateBy
                if (field.getAnnotation(UpdateBy.class) != null) {
                    field.setAccessible(true);
                    field.set(parameter, request.getAttribute(UserConstants.CURRENT_USER));
                }
                // update 语句插入 updateTime
                if (field.getAnnotation(UpdateTime.class) != null) {
                    field.setAccessible(true);
                    field.set(parameter, new Date());
                }
            }
        }
    }
}

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-redis/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ginyi-common</artifactId>
        <groupId>com.ginyi</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ginyi-common-redis</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
        </dependency>
    </dependencies>

</project>

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-redis/src/main/java/ginyi/common/redis/cache/RedisCache.java
================================================
package ginyi.common.redis.cache;

import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.connection.DataType;
import org.springframework.data.redis.core.BoundSetOperations;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.*;
import java.util.concurrent.TimeUnit;

/**
 * spring redis 工具类
 *
 * @author ruoyi
 **/
@SuppressWarnings(value = {"unchecked", "rawtypes"})
@Component
public class RedisCache {
    @Autowired
    public RedisTemplate redisTemplate;

    /**
     * 缓存基本的对象,Integer、String、实体类等,时间为30分钟
     *
     * @param key   缓存的键值
     * @param value 缓存的值
     */
    public <T> void setCacheObject(final String key, final T value) {
        redisTemplate.opsForValue().set(key, value, 30, TimeUnit.MINUTES);
    }

    /**
     * 缓存基本的对象,Integer、String、实体类等
     *
     * @param key      缓存的键值
     * @param value    缓存的值
     * @param timeout  时间
     * @param timeUnit 时间颗粒度
     */
    public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit) {
        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
    }

    /**
     * 设置有效时间
     *
     * @param key     Redis键
     * @param timeout 超时时间
     * @return true=设置成功;false=设置失败
     */
    public boolean expire(final String key, final long timeout) {
        return expire(key, timeout, TimeUnit.SECONDS);
    }

    /**
     * 设置有效时间
     *
     * @param key     Redis键
     * @param timeout 超时时间
     * @param unit    时间单位
     * @return true=设置成功;false=设置失败
     */
    public boolean expire(final String key, final long timeout, final TimeUnit unit) {
        return redisTemplate.expire(key, timeout, unit);
    }

    /**
     * 获取有效时间
     *
     * @param key Redis键
     * @return 有效时间
     */
    public long getExpire(final String key) {
        return redisTemplate.getExpire(key);
    }

    /**
     * 判断 key是否存在
     *
     * @param key 键
     * @return true 存在 false不存在
     */
    public Boolean hasKey(String key) {
        return redisTemplate.hasKey(key);
    }

    /**
     * 获取数据类型
     * @param key
     * @return
     */
    public DataType getType(String key){
        return redisTemplate.type(key);
    }

    /**
     * 获得缓存的基本对象。
     *
     * @param key 缓存键值
     * @return 缓存键值对应的数据
     */
    public <T> T getCacheObject(final String key, Class<T> clazz) {
        Object o = redisTemplate.opsForValue().get(key);
        if (o == null) {
            return null;
        }
        return JSON.parseObject(JSON.toJSONString(o), clazz);
    }

    /**
     * 删除单个对象
     *
     * @param key
     */
    public boolean removeCacheObject(final String key) {
        Set<String> keys = redisTemplate.keys(key);
        return redisTemplate.delete(keys) > 0;
    }

    /**
     * 删除集合对象
     *
     * @param collection 多个对象
     * @return
     */
    public boolean removeCacheObject(final Collection collection) {
        return redisTemplate.delete(collection) > 0;
    }

    /**
     * 获取指定前缀的所有key
     *
     * @param key
     */
    public Set<String> getKeys(final String key) {
        return redisTemplate.keys(key);
    }

    /**
     * 获取数据
     * @param key
     * @return
     */
    public Object getValue(String key){
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 缓存List数据
     *
     * @param key      缓存的键值
     * @param dataList 待缓存的List数据
     * @return 缓存的对象
     */
    public <T> long setCacheList(final String key, final List<T> dataList) {
        Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
        return count == null ? 0 : count;
    }

    /**
     * 获得缓存的list对象
     *
     * @param key 缓存的键值
     * @return 缓存键值对应的数据
     */
    public <T> List<T> getCacheList(final String key, Class<T> clazz) {
        ArrayList<T> resultList = new ArrayList<>();
        List list = redisTemplate.opsForList().range(key, 0, -1);
        for (Object o : list) {
            T t = JSON.parseObject(JSON.toJSONString(o), clazz);
            resultList.add(t);
        }
        return resultList;
    }

    /**
     * 缓存Set
     *
     * @param key     缓存键值
     * @param dataSet 缓存的数据
     * @return 缓存数据的对象
     */
    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet) {
        BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
        Iterator<T> it = dataSet.iterator();
        while (it.hasNext()) {
            setOperation.add(it.next());
        }
        return setOperation;
    }

    /**
     * 获得缓存的set
     *
     * @param key
     * @return
     */
    public <T> Set<T> getCacheSet(final String key) {
        return redisTemplate.opsForSet().members(key);
    }

    /**
     * 缓存Map
     *
     * @param key
     * @param dataMap
     */
    public <T> void setCacheMap(final String key, final Map<String, T> dataMap) {
        if (dataMap != null) {
            redisTemplate.opsForHash().putAll(key, dataMap);
        }
    }

    /**
     * 获得缓存的Map
     *
     * @param key
     * @return
     */
    public <T> Map<String, T> getCacheMap(final String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    /**
     * 往Hash中存入数据
     *
     * @param key   Redis键
     * @param hKey  Hash键
     * @param value 值
     */
    public <T> void setCacheMapValue(final String key, final String hKey, final T value) {
        redisTemplate.opsForHash().put(key, hKey, value);
    }

    /**
     * 获取Hash中的数据
     *
     * @param key  Redis键
     * @param hKey Hash键
     * @return Hash中的对象
     */
    public <T> T getCacheMapValue(final String key, final String hKey) {
        HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
        return opsForHash.get(key, hKey);
    }

    /**
     * 获取多个Hash中的数据
     *
     * @param key   Redis键
     * @param hKeys Hash键集合
     * @return Hash对象集合
     */
    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys) {
        return redisTemplate.opsForHash().multiGet(key, hKeys);
    }

    /**
     * 删除Hash中的某条数据
     *
     * @param key  Redis键
     * @param hKey Hash键
     * @return 是否成功
     */
    public boolean deleteCacheMapValue(final String key, final String hKey) {
        return redisTemplate.opsForHash().delete(key, hKey) > 0;
    }

    /**
     * 获得缓存的基本对象列表
     *
     * @param pattern 字符串前缀
     * @return 对象列表
     */
    public Collection<String> keys(final String pattern) {
        return redisTemplate.keys(pattern);
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-redis/src/main/java/ginyi/common/redis/config/RedisConfig.java
================================================
package ginyi.common.redis.config;

import com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
@ConditionalOnClass(RedisOperations.class)
@EnableConfigurationProperties(RedisProperties.class)
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    @SuppressWarnings(value = {"unchecked", "rawtypes"})
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();

        //使用fastjson序列化
        FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer(Object.class);

        // value值的序列化采用fastJsonRedisSerializer
        template.setValueSerializer(fastJsonRedisSerializer);
        template.setHashValueSerializer(fastJsonRedisSerializer);
        // key的序列化采用StringRedisSerializer
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());

        template.setConnectionFactory(connectionFactory);
        return template;
    }

    @Bean
    public DefaultRedisScript<Long> limitScript() {
        DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
        redisScript.setScriptText(limitScriptText());
        redisScript.setResultType(Long.class);
        return redisScript;
    }

    /**
     * 限流脚本
     */
    private String limitScriptText() {
        return "local key = KEYS[1]\n" +
                "local count = tonumber(ARGV[1])\n" +
                "local time = tonumber(ARGV[2])\n" +
                "local current = redis.call('get', key);\n" +
                "if current and tonumber(current) > count then\n" +
                "    return tonumber(current);\n" +
                "end\n" +
                "current = redis.call('incr', key)\n" +
                "if tonumber(current) == 1 then\n" +
                "    redis.call('expire', key, time)\n" +
                "end\n" +
                "return tonumber(current);";
    }
}

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-result/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ginyi-common</artifactId>
        <groupId>com.ginyi</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ginyi-common-result</artifactId>

    <dependencies>
        <!-- swagger2接口文档 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
        </dependency>
    </dependencies>

</project>

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-result/src/main/java/ginyi/common/result/CommonResult.java
================================================
package ginyi.common.result;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.io.Serializable;

@Data
@ApiModel(value = "结果类")
public class CommonResult<T> implements Serializable {

    private static final long serialVersionUID = 1L;

    @ApiModelProperty(value = "状态码")
    private Integer code;

    @ApiModelProperty(value = "状态信息")
    private String msg;

    @ApiModelProperty(value = "返回数据")
    private T data;

    /**
     * 返回格式
     * @param state
     * @param data
     * @param <T>
     * @return
     */
    private static <T> CommonResult<T> res(StateCode state, T data){
        CommonResult<T> commonResult = new CommonResult<>();
        commonResult.setCode(state.getCode());
        commonResult.setMsg(state.getMessage());
        commonResult.setData(data);
        return commonResult;
    }

    /**
     * 成功的返回,不需要 data
     * @param <T>
     * @return
     */
    public static <T> CommonResult<T> success(){
        return res(StateCode.SUCCESS, null);
    }

    /**
     * 成功的返回,需要 data
     * @param data
     * @param <T>
     * @return
     */
    public static <T> CommonResult<T> success(T data){
        return res(StateCode.SUCCESS, data);
    }

    /**
     * 失败的返回,不需要 data
     * @param state
     * @return
     */
    public static <T> CommonResult<T> error(StateCode state){
        return res(state, null);
    }

    /**
     * 失败的返回,需要 data, 即错误信息
     * @param state
     * @param <T>
     * @return
     */
    public static <T> CommonResult<T> error(StateCode state, T data){
        return res(state, data);
    }

}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-result/src/main/java/ginyi/common/result/StateCode.java
================================================
package ginyi.common.result;


public enum StateCode {

    SUCCESS(200, "操作成功"),

    ERROR_SYSTEM(5000, "系统异常"),
    ERROR_UNAUTHENTICATION(5001, "登陆授权异常"),
    ERROR_TIMEOUT_REQUEST(5002, "请求超时"),
    ERROR_TIMEOUT_TOKEN(5003, "无效令牌"),
    ERROR_INVALID_SIGN(5004, "无效签名"),
    ERROR_AUTHENTICATION_VALID(5005, "认证失败或令牌已过期"),
    ERROR_NOT_PERMISSION(5006, "权限不足"),
    ERROR_LIMITED(5007, "操作受限"),

    ERROR_BUSINESS(6000,"业务逻辑异常"),
    ERROR_PARAMS(6001,"参数校验错误"),
    ERROR_REQUEST_PARAMS(6002,"请求参数异常"),
    ERROR_PARAMS_SERVICE(6003,"参数逻辑校验错误"),
    ERROR_DATA_FORMAT(6004, "数据格式错误"),
    ERROR_EXIST(6005, "数据已存在"),
    ERROR_NOT_EXIST(6006, "数据不存在"),

    ERROR_NOT_SUPPORT(7000, "不支持该文件类型"),
    ERROR_LIMIT_EXCEEDED(7001, "超出请求次数上限"),
    ERROR_MULTIPART(7002, "文件上传异常"),
    ;

    private final int code;
    private final String message;

    StateCode(final int code, final String message) {
        this.code = code;
        this.message = message;
    }

    public int getCode(){
        return this.code;
    }

    public String getMessage() {
        return message;
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-swagger/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ginyi-common</artifactId>
        <groupId>com.ginyi</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ginyi-common-swagger</artifactId>

    <dependencies>
        <!-- swagger2接口文档 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
        </dependency>
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
        </dependency>

        <!-- Knife4j -->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-spring-boot-starter</artifactId>
        </dependency>
    </dependencies>
</project>

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-swagger/src/main/java/ginyi/common/swagger/AddGroup.java
================================================
package ginyi.common.swagger;

/**
 * 此接口不要删除,用于参数校验的分组
 */
public interface AddGroup {
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-swagger/src/main/java/ginyi/common/swagger/Swagger2Config.java
================================================
package ginyi.common.swagger;

import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

import static springfox.documentation.builders.RequestHandlerSelectors.basePackage;


public class Swagger2Config {

    /**
     * 标题
     */
    @Value("${swagger.swagger-title}")
    private String title;

    /**
     * 分组
     */
    @Value("${swagger.group-name}")
    private String groupName;

    /**
     * 描述
     */
    @Value("${swagger.swagger-description}")
    private String description;

    /**
     * URL
     */
    @Value("${swagger.swagger-url}")
    private String url;

    /**
     * 作者
     */
    @Value("${swagger.swagger-contact.name}")
    private String contactName;


    /**
     * 作者邮箱
     */
    @Value("${swagger.swagger-contact.email}")
    private String contactEmail;

    /**
     * 版本
     */
    @Value("${swagger.swagger-version}")
    private String version;

    @Bean
    public Docket createAdminApiDoc() {
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName(groupName)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
                .paths(PathSelectors.any())
                .build();
    }

    // 构建 api 文档的详细信息函数
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                .title(title)
                .description(description)
                .termsOfServiceUrl(url)
                .contact(new Contact(contactName, null, contactEmail))
                .version(version)
                .build();
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-swagger/src/main/java/ginyi/common/swagger/UpdateGroup.java
================================================
package ginyi.common.swagger;

/**
 * 此接口不要删除,用于参数校验的分组
 */
public interface UpdateGroup {
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ginyi-common</artifactId>
        <groupId>com.ginyi</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ginyi-common-utils</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- SpringBoot Web容器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!--常用工具类 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

        <!-- Token生成与解析-->
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>${jwt.version}</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.fastjson2</groupId>
            <artifactId>fastjson2</artifactId>
        </dependency>

        <!-- 邮箱 -->
        <dependency>
            <groupId>com.sun.mail</groupId>
            <artifactId>javax.mail</artifactId>
        </dependency>
    </dependencies>

</project>

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/Constants.java
================================================
package ginyi.common.utils;

/**
 * 通用常量信息
 *
 * @author ruoyi
 */
public class Constants {
    /**
     * UTF-8 字符集
     */
    public static final String UTF8 = "UTF-8";

    /**
     * GBK 字符集
     */
    public static final String GBK = "GBK";

    /**
     * 通用成功标识
     */
    public static final String SUCCESS = "0";

    /**
     * 通用失败标识
     */
    public static final String FAIL = "1";

    /**
     * 登录成功
     */
    public static final String LOGIN_SUCCESS = "Success";

    /**
     * 注销
     */
    public static final String LOGOUT = "Logout";

    /**
     * 注册
     */
    public static final String REGISTER = "Register";

    /**
     * 登录失败
     */
    public static final String LOGIN_FAIL = "Error";


    /**
     * 令牌前缀
     */
    public static final String TOKEN_PREFIX = "Bearer ";

    /**
     * 令牌前缀
     */
    public static final String LOGIN_USER_KEY = "login_user_key";

    /**
     * 资源映射路径 前缀
     */
    public static final String RESOURCE_PREFIX = "/profile";

    /**
     * 令牌
     */
    public static final String TOKEN = "token";


    /**
     * 验证码有效期(分钟)
     */
    public static final Integer CAPTCHA_EXPIRATION = 2;


}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/DateUtils.java
================================================
package ginyi.common.utils;

import org.apache.commons.lang3.time.DateFormatUtils;

import java.lang.management.ManagementFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.*;
import java.util.Date;

/**
 * 时间工具类
 *
 * @author ruoyi
 */
public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
    public static String YYYY = "yyyy";

    public static String YYYY_MM = "yyyy-MM";

    public static String YYYY_MM_DD = "yyyy-MM-dd";

    public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";

    public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";

    private static String[] parsePatterns = {
            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};

    /**
     * 获取当前Date型日期
     *
     * @return Date() 当前日期
     */
    public static Date getNowDate() {
        return new Date();
    }

    /**
     * 获取当前日期, 默认格式为yyyy-MM-dd
     *
     * @return String
     */
    public static String getDate() {
        return dateTimeNow(YYYY_MM_DD);
    }

    public static final String getTime() {
        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
    }

    public static final String dateTimeNow() {
        return dateTimeNow(YYYYMMDDHHMMSS);
    }

    public static final String dateTimeNow(final String format) {
        return parseDateToStr(format, new Date());
    }

    public static final String dateTime(final Date date) {
        return parseDateToStr(YYYY_MM_DD, date);
    }

    public static final String parseDateToStr(final String format, final Date date) {
        return new SimpleDateFormat(format).format(date);
    }

    public static final Date dateTime(final String format, final String ts) {
        try {
            return new SimpleDateFormat(format).parse(ts);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 日期路径 即年/月/日 如2018/08/08
     */
    public static final String datePath() {
        Date now = new Date();
        return DateFormatUtils.format(now, "yyyy/MM/dd");
    }

    /**
     * 日期路径 即年/月/日 如20180808
     */
    public static final String dateTime() {
        Date now = new Date();
        return DateFormatUtils.format(now, "yyyyMMdd");
    }

    /**
     * 日期型字符串转化为日期 格式
     */
    public static Date parseDate(Object str) {
        if (str == null) {
            return null;
        }
        try {
            return parseDate(str.toString(), parsePatterns);
        } catch (ParseException e) {
            return null;
        }
    }

    /**
     * 获取服务器启动时间
     */
    public static Date getServerStartDate() {
        long time = ManagementFactory.getRuntimeMXBean().getStartTime();
        return new Date(time);
    }

    /**
     * 计算相差天数
     */
    public static int differentDaysByMillisecond(Date date1, Date date2) {
        return Math.abs((int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24)));
    }

    /**
     * 计算两个时间差
     */
    public static String getDatePoor(Date endDate, Date nowDate) {
        long nd = 1000 * 24 * 60 * 60;
        long nh = 1000 * 60 * 60;
        long nm = 1000 * 60;
        // long ns = 1000;
        // 获得两个时间的毫秒时间差异
        long diff = endDate.getTime() - nowDate.getTime();
        // 计算差多少天
        long day = diff / nd;
        // 计算差多少小时
        long hour = diff % nd / nh;
        // 计算差多少分钟
        long min = diff % nd % nh / nm;
        // 计算差多少秒//输出结果
        // long sec = diff % nd % nh % nm / ns;
        return day + "天" + hour + "小时" + min + "分钟";
    }

    /**
     * 增加 LocalDateTime ==> Date
     */
    public static Date toDate(LocalDateTime temporalAccessor) {
        ZonedDateTime zdt = temporalAccessor.atZone(ZoneId.systemDefault());
        return Date.from(zdt.toInstant());
    }

    /**
     * 增加 LocalDate ==> Date
     */
    public static Date toDate(LocalDate temporalAccessor) {
        LocalDateTime localDateTime = LocalDateTime.of(temporalAccessor, LocalTime.of(0, 0, 0));
        ZonedDateTime zdt = localDateTime.atZone(ZoneId.systemDefault());
        return Date.from(zdt.toInstant());
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/EmailUtils.java
================================================
package ginyi.common.utils;

import cn.hutool.extra.mail.MailUtil;

/**
 * 邮箱工具类
 * 如何使用:
 *   1、需要在对应的应用服务模块下(如ginyi-server-admin)的resource目录下,新建config目录,再新建mail.setting配置文件
 *   2、具体配置信息参考 https://www.hutool.cn/docs/#/extra/邮件工具-MailUtil
 */
public class EmailUtils {

    /**
     * 单点发送
     * @param to 目标
     * @param subject 标题
     * @param message 信息
     * @param isHtml 是否为html信息
     * @return
     */
    public static boolean sendToOne(String to, String subject, String message, Boolean isHtml) {
        String result = MailUtil.send(to, subject, message, isHtml);
        return result != null;
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/LogUtils.java
================================================
package ginyi.common.utils;

/**
 * 处理并记录日志文件
 *
 * @author ruoyi
 */
public class LogUtils {
    public static String getBlock(Object msg) {
        if (msg == null) {
            msg = "";
        }
        return "[" + msg.toString() + "]";
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/LunarCalendarUtil.java
================================================
package ginyi.common.utils;

import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 工具类,实现阴阳历互转
 */
public class LunarCalendarUtil {
    /**
     * 支持转换的最小农历年份
     */
    public static final int MIN_YEAR = 1900;

    /**
     * 支持转换的最大农历年份
     */
    public static final int MAX_YEAR = 2099;

    /**
     * 公历每月前的天数
     */
    private static final int[] DAYS_BEFORE_MONTH = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
    /**
     * 用来表示1900年到2099年间农历年份的相关信息,共24位bit的16进制表示,其中:
     * 1. 前4位表示该年闰哪个月;
     * 2. 5-17位表示农历年份13个月的大小月分布,0表示小,1表示大;
     * 3. 最后7位表示农历年首(正月初一)对应的公历日期。
     * 以2014年的数据0x955ABF为例说明:
     * 1001 0101 0101 1010 1011 1111
     * 闰九月   农历正月初一对应公历1月31号
     */
    private static final int[] LUNAR_INFO = {
            /*1900*/
            0x84B6BF,
            /*1901-1910*/
            0x04AE53, 0x0A5748, 0x5526BD, 0x0D2650, 0x0D9544, 0x46AAB9, 0x056A4D, 0x09AD42, 0x24AEB6, 0x04AE4A,
            /*1911-1920*/
            0x6A4DBE, 0x0A4D52, 0x0D2546, 0x5D52BA, 0x0B544E, 0x0D6A43, 0x296D37, 0x095B4B, 0x749BC1, 0x049754,
            /*1921-1930*/
            0x0A4B48, 0x5B25BC, 0x06A550, 0x06D445, 0x4ADAB8, 0x02B64D, 0x095742, 0x2497B7, 0x04974A, 0x664B3E,
            /*1931-1940*/
            0x0D4A51, 0x0EA546, 0x56D4BA, 0x05AD4E, 0x02B644, 0x393738, 0x092E4B, 0x7C96BF, 0x0C9553, 0x0D4A48,
            /*1941-1950*/
            0x6DA53B, 0x0B554F, 0x056A45, 0x4AADB9, 0x025D4D, 0x092D42, 0x2C95B6, 0x0A954A, 0x7B4ABD, 0x06CA51,
            /*1951-1960*/
            0x0B5546, 0x555ABB, 0x04DA4E, 0x0A5B43, 0x352BB8, 0x052B4C, 0x8A953F, 0x0E9552, 0x06AA48, 0x6AD53C,
            /*1961-1970*/
            0x0AB54F, 0x04B645, 0x4A5739, 0x0A574D, 0x052642, 0x3E9335, 0x0D9549, 0x75AABE, 0x056A51, 0x096D46,
            /*1971-1980*/
            0x54AEBB, 0x04AD4F, 0x0A4D43, 0x4D26B7, 0x0D254B, 0x8D52BF, 0x0B5452, 0x0B6A47, 0x696D3C, 0x095B50,
            /*1981-1990*/
            0x049B45, 0x4A4BB9, 0x0A4B4D, 0xAB25C2, 0x06A554, 0x06D449, 0x6ADA3D, 0x0AB651, 0x095746, 0x5497BB,
            /*1991-2000*/
            0x04974F, 0x064B44, 0x36A537, 0x0EA54A, 0x86B2BF, 0x05AC53, 0x0AB647, 0x5936BC, 0x092E50, 0x0C9645,
            /*2001-2010*/
            0x4D4AB8, 0x0D4A4C, 0x0DA541, 0x25AAB6, 0x056A49, 0x7AADBD, 0x025D52, 0x092D47, 0x5C95BA, 0x0A954E,
            /*2011-2020*/
            0x0B4A43, 0x4B5537, 0x0AD54A, 0x955ABF, 0x04BA53, 0x0A5B48, 0x652BBC, 0x052B50, 0x0A9345, 0x474AB9,
            /*2021-2030*/
            0x06AA4C, 0x0AD541, 0x24DAB6, 0x04B64A, 0x6a573D, 0x0A4E51, 0x0D2646, 0x5E933A, 0x0D534D, 0x05AA43,
            /*2031-2040*/
            0x36B537, 0x096D4B, 0xB4AEBF, 0x04AD53, 0x0A4D48, 0x6D25BC, 0x0D254F, 0x0D5244, 0x5DAA38, 0x0B5A4C,
            /*2041-2050*/
            0x056D41, 0x24ADB6, 0x049B4A, 0x7A4BBE, 0x0A4B51, 0x0AA546, 0x5B52BA, 0x06D24E, 0x0ADA42, 0x355B37,
            /*2051-2060*/
            0x09374B, 0x8497C1, 0x049753, 0x064B48, 0x66A53C, 0x0EA54F, 0x06AA44, 0x4AB638, 0x0AAE4C, 0x092E42,
            /*2061-2070*/
            0x3C9735, 0x0C9649, 0x7D4ABD, 0x0D4A51, 0x0DA545, 0x55AABA, 0x056A4E, 0x0A6D43, 0x452EB7, 0x052D4B,
            /*2071-2080*/
            0x8A95BF, 0x0A9553, 0x0B4A47, 0x6B553B, 0x0AD54F, 0x055A45, 0x4A5D38, 0x0A5B4C, 0x052B42, 0x3A93B6,
            /*2081-2090*/
            0x069349, 0x7729BD, 0x06AA51, 0x0AD546, 0x54DABA, 0x04B64E, 0x0A5743, 0x452738, 0x0D264A, 0x8E933E,
            /*2091-2099*/
            0x0D5252, 0x0DAA47, 0x66B53B, 0x056D4F, 0x04AE45, 0x4A4EB9, 0x0A4D4C, 0x0D1541, 0x2D92B5
    };

    /**
     * 将农历日期转换为公历日期
     *
     * @param year        农历年份
     * @param month       农历月
     * @param monthDay    农历日
     * @param isLeapMonth 该月是否是闰月(该参数可以根据本类中leapMonth()方法,先判断一下要查询的年份是否有闰月,并且闰的几月)
     * @return 返回农历日期对应的公历日期,year0, month1, day2.
     */
    public static final int[] lunarToSolar(int year, int month, int monthDay, boolean isLeapMonth) {
        int dayOffset;
        int leapMonth;
        int i;
        if (year < MIN_YEAR || year > MAX_YEAR || month < 1 || month > 12
                || monthDay < 1 || monthDay > 30) {
            throw new IllegalArgumentException(
                    "Illegal lunar date, must be like that:\n\t" +
                            "year : 1900~2099\n\t" +
                            "month : 1~12\n\t" +
                            "day : 1~30");
        }
        dayOffset = (LUNAR_INFO[year - MIN_YEAR] & 0x001F) - 1;
        if (((LUNAR_INFO[year - MIN_YEAR] & 0x0060) >> 5) == 2) {
            dayOffset += 31;
        }
        for (i = 1; i < month; i++) {
            if ((LUNAR_INFO[year - MIN_YEAR] & (0x80000 >> (i - 1))) == 0) {
                dayOffset += 29;
            } else {
                dayOffset += 30;
            }
        }
        dayOffset += monthDay;
        leapMonth = (LUNAR_INFO[year - MIN_YEAR] & 0xf00000) >> 20;
        // 这一年有闰月
        if (leapMonth != 0) {
            if (month > leapMonth || (month == leapMonth && isLeapMonth)) {
                if ((LUNAR_INFO[year - MIN_YEAR] & (0x80000 >> (month - 1))) == 0) {
                    dayOffset += 29;
                } else {
                    dayOffset += 30;
                }
            }
        }
        if (dayOffset > 366 || (year % 4 != 0 && dayOffset > 365)) {
            year += 1;
            if (year % 4 == 1) {
                dayOffset -= 366;
            } else {
                dayOffset -= 365;
            }
        }
        int[] solarInfo = new int[3];
        for (i = 1; i < 13; i++) {
            int iPos = DAYS_BEFORE_MONTH[i];
            if (year % 4 == 0 && i > 2) {
                iPos += 1;
            }
            if (year % 4 == 0 && i == 2 && iPos + 1 == dayOffset) {
                solarInfo[1] = i;
                solarInfo[2] = dayOffset - 31;
                break;
            }
            if (iPos >= dayOffset) {
                solarInfo[1] = i;
                iPos = DAYS_BEFORE_MONTH[i - 1];
                if (year % 4 == 0 && i > 2) {
                    iPos += 1;
                }
                if (dayOffset > iPos) {
                    solarInfo[2] = dayOffset - iPos;
                } else if (dayOffset == iPos) {
                    if (year % 4 == 0 && i == 2) {
                        solarInfo[2] = DAYS_BEFORE_MONTH[i] - DAYS_BEFORE_MONTH[i - 1] + 1;
                    } else {
                        solarInfo[2] = DAYS_BEFORE_MONTH[i] - DAYS_BEFORE_MONTH[i - 1];
                    }
                } else {
                    solarInfo[2] = dayOffset;
                }
                break;
            }
        }
        solarInfo[0] = year;
        return solarInfo;
    }

    /**
     * 将公历日期转换为农历日期,且标识是否是闰月
     * (如果当年有闰月,被闰的阴历月份所对应的阳历日期计算出来不对,后期自己根据本方法leap3 返回值判断如果为1,给月份+1,如果为0就是正确的,不用在操作,阴历闰月对应的阳历日期计算出来的阴历闰月日期正确,leap3为0)
     *
     * @param year
     * @param month    传入需要为单数如 08 为8
     * @param monthDay
     * @return 返回公历日期对应的农历日期,year0,month1,day2,leap3(0 为计算正常  1 月份会比正确少一个月,需要月份+1)
     */
    public static final int[] solarToLunar(int year, int month, int monthDay) {
        int[] lunarDate = new int[4];
        Date baseDate = new GregorianCalendar(1900, 0, 31).getTime();
        Date objDate = new GregorianCalendar(year, month - 1, monthDay).getTime();
        int offset = (int) ((objDate.getTime() - baseDate.getTime()) / 86400000L);
        // 用offset减去每农历年的天数计算当天是农历第几天
        // iYear最终结果是农历的年份, offset是当年的第几天
        int iYear, daysOfYear = 0;
        for (iYear = MIN_YEAR; iYear <= MAX_YEAR && offset > 0; iYear++) {
            daysOfYear = daysInLunarYear(iYear);
            offset -= daysOfYear;
        }
        if (offset < 0) {
            offset += daysOfYear;
            iYear--;
        }
        // 农历年份
        lunarDate[0] = iYear;
        int leapMonth = leapMonth(iYear);
        // 闰哪个月,1-12
        boolean isLeap = false;
        // 用当年的天数offset,逐个减去每月(农历)的天数,求出当天是本月的第几天
        int iMonth, daysOfMonth = 0;
        for (iMonth = 1; iMonth <= 13 && offset > 0; iMonth++) {
            daysOfMonth = daysInLunarMonth(iYear, iMonth);
            offset -= daysOfMonth;
        }
        // 当前月超过闰月,要校正
        if (leapMonth != 0 && iMonth > leapMonth) {
            --iMonth;
            if (iMonth == leapMonth) {
                isLeap = true;
            }
        }
        // offset小于0时,也要校正
        if (offset < 0) {
            offset += daysOfMonth;
            --iMonth;
        }
        lunarDate[1] = iMonth;
        lunarDate[2] = offset + 1;
        lunarDate[3] = isLeap ? 1 : 0;
        return lunarDate;
    }

    /**
     * 传回农历year年month月的总天数
     *
     * @param year  要计算的年份
     * @param month 要计算的月
     * @return 传回天数
     */
    final public static int daysInMonth(int year, int month) {
        return daysInMonth(year, month, false);
    }

    /**
     * 传回农历year年month月的总天数
     *
     * @param year  要计算的年份
     * @param month 要计算的月
     * @param leap  当月是否是闰月
     * @return 传回天数,如果闰月是错误的,返回0.
     */
    public static final int daysInMonth(int year, int month, boolean leap) {
        int leapMonth = leapMonth(year);
        int offset = 0;
        // 如果本年有闰月且month大于闰月时,需要校正
        if (leapMonth != 0 && month > leapMonth) {
            offset = 1;
        }
        // 不考虑闰月
        if (!leap) {
            return daysInLunarMonth(year, month + offset);
        } else {
            // 传入的闰月是正确的月份
            if (leapMonth != 0 && leapMonth == month) {
                return daysInLunarMonth(year, month + 1);
            }
        }
        return 0;
    }

    /**
     * 传回农历 year年的总天数
     *
     * @param year 将要计算的年份
     * @return 返回传入年份的总天数
     */
    private static int daysInLunarYear(int year) {
        int i, sum = 348;
        if (leapMonth(year) != 0) {
            sum = 377;
        }
        int monthInfo = LUNAR_INFO[year - MIN_YEAR] & 0x0FFF80;
        for (i = 0x80000; i > 0x7; i >>= 1) {
            if ((monthInfo & i) != 0) {
                sum += 1;
            }
        }
        return sum;
    }

    /**
     * 传回农历 year年month月的总天数,总共有13个月包括闰月
     *
     * @param year  将要计算的年份
     * @param month 将要计算的月份
     * @return 传回农历 year年month月的总天数
     */
    public static int daysInLunarMonth(int year, int month) {
        if ((LUNAR_INFO[year - MIN_YEAR] & (0x100000 >> month)) == 0) {
            return 29;
        } else {
            return 30;
        }
    }

    /**
     * 传回农历 year年闰哪个月 1-12 , 没闰传回 0
     *
     * @param year 将要计算的年份
     * @return 传回农历 year年闰哪个月1-12, 没闰传回 0
     */
    public static int leapMonth(int year) {
        return ((LUNAR_INFO[year - MIN_YEAR] & 0xF00000)) >> 20;
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/MessageUtils.java
================================================
package ginyi.common.utils;

import ginyi.common.utils.spring.SpringUtils;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;

/**
 * 获取i18n资源文件
 *
 * @author ruoyi
 */
public class MessageUtils {
    /**
     * 根据消息键和参数 获取消息 委托给spring messageSource
     *
     * @param code 消息键
     * @param args 参数
     * @return 获取国际化翻译值
     */
    public static String message(String code, Object... args) {
        MessageSource messageSource = SpringUtils.getBean(MessageSource.class);
        return messageSource.getMessage(code, args, LocaleContextHolder.getLocale());
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/NumberUtils.java
================================================
package ginyi.common.utils;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class NumberUtils {

    public static double round(double number, int decimalPlaces) {
        BigDecimal bigDecimal = new BigDecimal(Double.toString(number));
        bigDecimal = bigDecimal.setScale(decimalPlaces, RoundingMode.HALF_UP);
        return bigDecimal.doubleValue();
    }

}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/ServletUtils.java
================================================
package ginyi.common.utils;

import ginyi.common.utils.text.Convert;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

/**
 * 客户端工具类
 *
 * @author ruoyi
 */
public class ServletUtils {
    /**
     * 获取String参数
     */
    public static String getParameter(String name) {
        return getRequest().getParameter(name);
    }

    /**
     * 获取String参数
     */
    public static String getParameter(String name, String defaultValue) {
        return Convert.toStr(getRequest().getParameter(name), defaultValue);
    }

    /**
     * 获取Integer参数
     */
    public static Integer getParameterToInt(String name) {
        return Convert.toInt(getRequest().getParameter(name));
    }

    /**
     * 获取Integer参数
     */
    public static Integer getParameterToInt(String name, Integer defaultValue) {
        return Convert.toInt(getRequest().getParameter(name), defaultValue);
    }

    /**
     * 获取Boolean参数
     */
    public static Boolean getParameterToBool(String name) {
        return Convert.toBool(getRequest().getParameter(name));
    }

    /**
     * 获取Boolean参数
     */
    public static Boolean getParameterToBool(String name, Boolean defaultValue) {
        return Convert.toBool(getRequest().getParameter(name), defaultValue);
    }

    /**
     * 获得所有请求参数
     *
     * @param request 请求对象{@link ServletRequest}
     * @return Map
     */
    public static Map<String, String[]> getParams(ServletRequest request) {
        final Map<String, String[]> map = request.getParameterMap();
        return Collections.unmodifiableMap(map);
    }

    /**
     * 获得所有请求参数
     *
     * @param request 请求对象{@link ServletRequest}
     * @return Map
     */
    public static Map<String, String> getParamMap(ServletRequest request) {
        Map<String, String> params = new HashMap<>();
        for (Map.Entry<String, String[]> entry : getParams(request).entrySet()) {
            params.put(entry.getKey(), StringUtils.join(entry.getValue(), ","));
        }
        return params;
    }

    /**
     * 获取request
     */
    public static HttpServletRequest getRequest() {
        return getRequestAttributes().getRequest();
    }

    /**
     * 获取response
     */
    public static HttpServletResponse getResponse() {
        return getRequestAttributes().getResponse();
    }

    /**
     * 获取session
     */
    public static HttpSession getSession() {
        return getRequest().getSession();
    }

    public static ServletRequestAttributes getRequestAttributes() {
        RequestAttributes attributes = RequestContextHolder.getRequestAttributes();
        return (ServletRequestAttributes) attributes;
    }

    /**
     * 将字符串渲染到客户端
     *
     * @param response 渲染对象
     * @param string   待渲染的字符串
     */
    public static void renderString(HttpServletResponse response, String string) {
        try {
            response.setStatus(200);
            response.setContentType("application/json");
            response.setCharacterEncoding("utf-8");
            response.getWriter().print(string);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 是否是Ajax异步请求
     *
     * @param request
     */
    public static boolean isAjaxRequest(HttpServletRequest request) {
        String accept = request.getHeader("accept");
        if (accept != null && accept.contains("application/json")) {
            return true;
        }

        String xRequestedWith = request.getHeader("X-Requested-With");
        if (xRequestedWith != null && xRequestedWith.contains("XMLHttpRequest")) {
            return true;
        }

        String uri = request.getRequestURI();
        if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) {
            return true;
        }

        String ajax = request.getParameter("__ajax");
        return StringUtils.inStringIgnoreCase(ajax, "json", "xml");
    }

    /**
     * 内容编码
     *
     * @param str 内容
     * @return 编码后的内容
     */
    public static String urlEncode(String str) {
        try {
            return URLEncoder.encode(str, Constants.UTF8);
        } catch (UnsupportedEncodingException e) {
            return StringUtils.EMPTY;
        }
    }

    /**
     * 内容解码
     *
     * @param str 内容
     * @return 解码后的内容
     */
    public static String urlDecode(String str) {
        try {
            return URLDecoder.decode(str, Constants.UTF8);
        } catch (UnsupportedEncodingException e) {
            return StringUtils.EMPTY;
        }
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/StringUtils.java
================================================
package ginyi.common.utils;

import ginyi.common.utils.text.StrFormatter;

/**
 * 字符串工具类
 *
 * @author ruoyi
 */
public class StringUtils extends org.apache.commons.lang3.StringUtils {

    /**
     * 空字符串
     */
    private static final String NULLSTR = "";


    /**
     * * 判断一个字符串是否为空串
     *
     * @param str String
     * @return true:为空 false:非空
     */
    public static boolean isEmpty(String str) {
        return isNull(str) || NULLSTR.equals(str.trim());
    }

    /**
     * * 判断一个对象是否为空
     *
     * @param object Object
     * @return true:为空 false:非空
     */
    public static boolean isNull(Object object) {
        return object == null;
    }

    /**
     * * 判断一个对象是否非空
     *
     * @param object Object
     * @return true:非空 false:空
     */
    public static boolean isNotNull(Object object) {
        return !isNull(object);
    }

    /**
     * 获取参数不为空值
     *
     * @param value defaultValue 要判断的value
     * @return value 返回值
     */
    public static <T> T nvl(T value, T defaultValue) {
        return value != null ? value : defaultValue;
    }

    /**
     * 是否包含字符串
     *
     * @param str  验证字符串
     * @param strs 字符串组
     * @return 包含返回true
     */
    public static boolean inStringIgnoreCase(String str, String... strs) {
        if (str != null && strs != null) {
            for (String s : strs) {
                if (str.equalsIgnoreCase(trim(s))) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * 去空格
     */
    public static String trim(String str) {
        return (str == null ? "" : str.trim());
    }


    /**
     * 格式化文本, {} 表示占位符<br>
     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
     * 例:<br>
     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
     *
     * @param template 文本模板,被替换的部分用 {} 表示
     * @param params   参数值
     * @return 格式化后的文本
     */
    public static String format(String template, Object... params) {
        if (isEmpty(params) || isEmpty(template)) {
            return template;
        }
        return StrFormatter.format(template, params);
    }

    /**
     * * 判断一个对象数组是否为空
     *
     * @param objects 要判断的对象数组
     *                * @return true:为空 false:非空
     */
    public static boolean isEmpty(Object[] objects) {
        return isNull(objects) || (objects.length == 0);
    }

    /**
     * * 判断一个对象数组是否非空
     *
     * @param objects 要判断的对象数组
     * @return true:非空 false:空
     */
    public static boolean isNotEmpty(Object[] objects) {
        return !isEmpty(objects);
    }
}

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/Threads.java
================================================
package ginyi.common.utils;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.concurrent.*;

/**
 * 线程相关工具类.
 *
 * @author ruoyi
 */
public class Threads {
    private static final Logger logger = LoggerFactory.getLogger(Threads.class);

    /**
     * sleep等待,单位为毫秒
     */
    public static void sleep(long milliseconds) {
        try {
            Thread.sleep(milliseconds);
        } catch (InterruptedException e) {
            return;
        }
    }

    /**
     * 停止线程池
     * 先使用shutdown, 停止接收新任务并尝试完成所有已存在任务.
     * 如果超时, 则调用shutdownNow, 取消在workQueue中Pending的任务,并中断所有阻塞函数.
     * 如果仍然超時,則強制退出.
     * 另对在shutdown时线程本身被调用中断做了处理.
     */
    public static void shutdownAndAwaitTermination(ExecutorService pool) {
        if (pool != null && !pool.isShutdown()) {
            pool.shutdown();
            try {
                if (!pool.awaitTermination(120, TimeUnit.SECONDS)) {
                    pool.shutdownNow();
                    if (!pool.awaitTermination(120, TimeUnit.SECONDS)) {
                        logger.info("Pool did not terminate");
                    }
                }
            } catch (InterruptedException ie) {
                pool.shutdownNow();
                Thread.currentThread().interrupt();
            }
        }
    }

    /**
     * 打印线程异常信息
     */
    public static void printException(Runnable r, Throwable t) {
        if (t == null && r instanceof Future<?>) {
            try {
                Future<?> future = (Future<?>) r;
                if (future.isDone()) {
                    future.get();
                }
            } catch (CancellationException ce) {
                t = ce;
            } catch (ExecutionException ee) {
                t = ee.getCause();
            } catch (InterruptedException ie) {
                Thread.currentThread().interrupt();
            }
        }
        if (t != null) {
            logger.error(t.getMessage(), t);
        }
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/enums/UserStatus.java
================================================
package ginyi.common.utils.enums;

/**
 * 用户状态
 *
 * @author ruoyi
 */
public enum UserStatus {
    OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除");

    private final String code;
    private final String info;

    UserStatus(String code, String info) {
        this.code = code;
        this.info = info;
    }

    public String getCode() {
        return code;
    }

    public String getInfo() {
        return info;
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/http/HttpHelper.java
================================================
package ginyi.common.utils.http;

import org.apache.commons.lang3.exception.ExceptionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.ServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;

/**
 * 通用http工具封装
 *
 * @author ruoyi
 */
public class HttpHelper {
    private static final Logger LOGGER = LoggerFactory.getLogger(HttpHelper.class);

    public static String getBodyString(ServletRequest request) {
        StringBuilder sb = new StringBuilder();
        BufferedReader reader = null;
        try (InputStream inputStream = request.getInputStream()) {
            reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
            String line = "";
            while ((line = reader.readLine()) != null) {
                sb.append(line);
            }
        } catch (IOException e) {
            LOGGER.warn("getBodyString出现问题!");
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e) {
                    LOGGER.error(ExceptionUtils.getMessage(e));
                }
            }
        }
        return sb.toString();
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/http/HttpUtils.java
================================================
package ginyi.common.utils.http;

import ginyi.common.utils.Constants;
import ginyi.common.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.net.ssl.*;
import java.io.*;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.security.cert.X509Certificate;

/**
 * 通用http发送方法
 *
 * @author ruoyi
 */
public class HttpUtils {
    private static final Logger log = LoggerFactory.getLogger(HttpUtils.class);

    /**
     * 向指定 URL 发送GET方法的请求
     *
     * @param url 发送请求的 URL
     * @return 所代表远程资源的响应结果
     */
    public static String sendGet(String url) {
        return sendGet(url, StringUtils.EMPTY);
    }

    /**
     * 向指定 URL 发送GET方法的请求
     *
     * @param url   发送请求的 URL
     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return 所代表远程资源的响应结果
     */
    public static String sendGet(String url, String param) {
        return sendGet(url, param, Constants.UTF8);
    }

    /**
     * 向指定 URL 发送GET方法的请求
     *
     * @param url         发送请求的 URL
     * @param param       请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @param contentType 编码类型
     * @return 所代表远程资源的响应结果
     */
    public static String sendGet(String url, String param, String contentType) {
        StringBuilder result = new StringBuilder();
        BufferedReader in = null;
        try {
            String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url;
            log.info("sendGet - {}", urlNameString);
            URL realUrl = new URL(urlNameString);
            URLConnection connection = realUrl.openConnection();
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            connection.connect();
            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
            log.info("recv - {}", result);
        } catch (ConnectException e) {
            log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e);
        } catch (SocketTimeoutException e) {
            log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e);
        } catch (IOException e) {
            log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e);
        } catch (Exception e) {
            log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e);
        } finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception ex) {
                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
            }
        }
        return result.toString();
    }

    /**
     * 向指定 URL 发送POST方法的请求
     *
     * @param url   发送请求的 URL
     * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
     * @return 所代表远程资源的响应结果
     */
    public static String sendPost(String url, String param) {
        PrintWriter out = null;
        BufferedReader in = null;
        StringBuilder result = new StringBuilder();
        try {
            log.info("sendPost - {}", url);
            URL realUrl = new URL(url);
            URLConnection conn = realUrl.openConnection();
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            conn.setRequestProperty("Accept-Charset", "utf-8");
            conn.setRequestProperty("contentType", "utf-8");
            conn.setDoOutput(true);
            conn.setDoInput(true);
            out = new PrintWriter(conn.getOutputStream());
            out.print(param);
            out.flush();
            in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
            log.info("recv - {}", result);
        } catch (ConnectException e) {
            log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e);
        } catch (SocketTimeoutException e) {
            log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e);
        } catch (IOException e) {
            log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e);
        } catch (Exception e) {
            log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e);
        } finally {
            try {
                if (out != null) {
                    out.close();
                }
                if (in != null) {
                    in.close();
                }
            } catch (IOException ex) {
                log.error("调用in.close Exception, url=" + url + ",param=" + param, ex);
            }
        }
        return result.toString();
    }

    public static String sendSSLPost(String url, String param) {
        StringBuilder result = new StringBuilder();
        String urlNameString = url + "?" + param;
        try {
            log.info("sendSSLPost - {}", urlNameString);
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, new TrustManager[]{new TrustAnyTrustManager()}, new java.security.SecureRandom());
            URL console = new URL(urlNameString);
            HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            conn.setRequestProperty("Accept-Charset", "utf-8");
            conn.setRequestProperty("contentType", "utf-8");
            conn.setDoOutput(true);
            conn.setDoInput(true);

            conn.setSSLSocketFactory(sc.getSocketFactory());
            conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
            conn.connect();
            InputStream is = conn.getInputStream();
            BufferedReader br = new BufferedReader(new InputStreamReader(is));
            String ret = "";
            while ((ret = br.readLine()) != null) {
                if (ret != null && !"".equals(ret.trim())) {
                    result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8));
                }
            }
            log.info("recv - {}", result);
            conn.disconnect();
            br.close();
        } catch (ConnectException e) {
            log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e);
        } catch (SocketTimeoutException e) {
            log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e);
        } catch (IOException e) {
            log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e);
        } catch (Exception e) {
            log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e);
        }
        return result.toString();
    }

    private static class TrustAnyTrustManager implements X509TrustManager {
        @Override
        public void checkClientTrusted(X509Certificate[] chain, String authType) {
        }

        @Override
        public void checkServerTrusted(X509Certificate[] chain, String authType) {
        }

        @Override
        public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[]{};
        }
    }

    private static class TrustAnyHostnameVerifier implements HostnameVerifier {
        @Override
        public boolean verify(String hostname, SSLSession session) {
            return true;
        }
    }
}

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/ip/AddressUtils.java
================================================
package ginyi.common.utils.ip;

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import ginyi.common.utils.Constants;
import ginyi.common.utils.StringUtils;
import ginyi.common.utils.http.HttpUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 获取地址类
 *
 * @author ruoyi
 */
public class AddressUtils {
    private static final Logger log = LoggerFactory.getLogger(AddressUtils.class);

    // IP地址查询
    public static final String IP_URL = "http://whois.pconline.com.cn/ipJson.jsp";

    // 未知地址
    public static final String UNKNOWN = "XX XX";

    public static String getRealAddressByIP(String ip) {
        // 内网不查询
        if (IpUtils.internalIp(ip)) {
            return "内网IP";
        }
        try {
            String rspStr = HttpUtils.sendGet(IP_URL, "ip=" + ip + "&json=true", Constants.GBK);
            if (StringUtils.isEmpty(rspStr)) {
                log.error("获取地理位置异常 {}", ip);
                return UNKNOWN;
            }
            JSONObject obj = JSON.parseObject(rspStr);
            String region = obj.getString("pro");
            String city = obj.getString("city");
            return String.format("%s %s", region, city);
        } catch (Exception e) {
            log.error("获取地理位置异常 {}", ip);
        }
        return UNKNOWN;
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/ip/IpUtils.java
================================================
package ginyi.common.utils.ip;

import ginyi.common.utils.StringUtils;

import javax.servlet.http.HttpServletRequest;
import java.net.InetAddress;
import java.net.UnknownHostException;

/**
 * 获取IP方法
 *
 * @author ruoyi
 */
public class IpUtils {
    /**
     * 获取客户端IP
     *
     * @param request 请求对象
     * @return IP地址
     */
    public static String getIpAddr(HttpServletRequest request) {
        if (request == null) {
            return "unknown";
        }
        String ip = request.getHeader("x-forwarded-for");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Forwarded-For");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Real-IP");
        }

        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }

        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : getMultistageReverseProxyIp(ip);
    }

    /**
     * 检查是否为内部IP地址
     *
     * @param ip IP地址
     * @return 结果
     */
    public static boolean internalIp(String ip) {
        byte[] addr = textToNumericFormatV4(ip);
        return internalIp(addr) || "127.0.0.1".equals(ip);
    }

    /**
     * 检查是否为内部IP地址
     *
     * @param addr byte地址
     * @return 结果
     */
    private static boolean internalIp(byte[] addr) {
        if (StringUtils.isNull(addr) || addr.length < 2) {
            return true;
        }
        final byte b0 = addr[0];
        final byte b1 = addr[1];
        // 10.x.x.x/8
        final byte SECTION_1 = 0x0A;
        // 172.16.x.x/12
        final byte SECTION_2 = (byte) 0xAC;
        final byte SECTION_3 = (byte) 0x10;
        final byte SECTION_4 = (byte) 0x1F;
        // 192.168.x.x/16
        final byte SECTION_5 = (byte) 0xC0;
        final byte SECTION_6 = (byte) 0xA8;
        switch (b0) {
            case SECTION_1:
                return true;
            case SECTION_2:
                if (b1 >= SECTION_3 && b1 <= SECTION_4) {
                    return true;
                }
            case SECTION_5:
                switch (b1) {
                    case SECTION_6:
                        return true;
                }
            default:
                return false;
        }
    }

    /**
     * 将IPv4地址转换成字节
     *
     * @param text IPv4地址
     * @return byte 字节
     */
    public static byte[] textToNumericFormatV4(String text) {
        if (text.length() == 0) {
            return null;
        }

        byte[] bytes = new byte[4];
        String[] elements = text.split("\\.", -1);
        try {
            long l;
            int i;
            switch (elements.length) {
                case 1:
                    l = Long.parseLong(elements[0]);
                    if ((l < 0L) || (l > 4294967295L)) {
                        return null;
                    }
                    bytes[0] = (byte) (int) (l >> 24 & 0xFF);
                    bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
                    bytes[3] = (byte) (int) (l & 0xFF);
                    break;
                case 2:
                    l = Integer.parseInt(elements[0]);
                    if ((l < 0L) || (l > 255L)) {
                        return null;
                    }
                    bytes[0] = (byte) (int) (l & 0xFF);
                    l = Integer.parseInt(elements[1]);
                    if ((l < 0L) || (l > 16777215L)) {
                        return null;
                    }
                    bytes[1] = (byte) (int) (l >> 16 & 0xFF);
                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
                    bytes[3] = (byte) (int) (l & 0xFF);
                    break;
                case 3:
                    for (i = 0; i < 2; ++i) {
                        l = Integer.parseInt(elements[i]);
                        if ((l < 0L) || (l > 255L)) {
                            return null;
                        }
                        bytes[i] = (byte) (int) (l & 0xFF);
                    }
                    l = Integer.parseInt(elements[2]);
                    if ((l < 0L) || (l > 65535L)) {
                        return null;
                    }
                    bytes[2] = (byte) (int) (l >> 8 & 0xFF);
                    bytes[3] = (byte) (int) (l & 0xFF);
                    break;
                case 4:
                    for (i = 0; i < 4; ++i) {
                        l = Integer.parseInt(elements[i]);
                        if ((l < 0L) || (l > 255L)) {
                            return null;
                        }
                        bytes[i] = (byte) (int) (l & 0xFF);
                    }
                    break;
                default:
                    return null;
            }
        } catch (NumberFormatException e) {
            return null;
        }
        return bytes;
    }

    /**
     * 获取IP地址
     *
     * @return 本地IP地址
     */
    public static String getHostIp() {
        try {
            return InetAddress.getLocalHost().getHostAddress();
        } catch (UnknownHostException e) {
        }
        return "127.0.0.1";
    }

    /**
     * 获取主机名
     *
     * @return 本地主机名
     */
    public static String getHostName() {
        try {
            return InetAddress.getLocalHost().getHostName();
        } catch (UnknownHostException e) {
        }
        return "未知";
    }

    /**
     * 从多级反向代理中获得第一个非unknown IP地址
     *
     * @param ip 获得的IP地址
     * @return 第一个非unknown IP地址
     */
    public static String getMultistageReverseProxyIp(String ip) {
        // 多级反向代理检测
        if (ip != null && ip.indexOf(",") > 0) {
            final String[] ips = ip.trim().split(",");
            for (String subIp : ips) {
                if (false == isUnknown(subIp)) {
                    ip = subIp;
                    break;
                }
            }
        }
        return ip;
    }

    /**
     * 检测给定字符串是否为未知,多用于检测HTTP请求相关
     *
     * @param checkString 被检测的字符串
     * @return 是否未知
     */
    public static boolean isUnknown(String checkString) {
        return StringUtils.isBlank(checkString) || "unknown".equalsIgnoreCase(checkString);
    }
}

================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/spring/SpringUtils.java
================================================
package ginyi.common.utils.spring;

import ginyi.common.utils.StringUtils;
import org.springframework.aop.framework.AopContext;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;
import org.springframework.beans.factory.config.BeanFactoryPostProcessor;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * spring工具类 方便在非spring管理环境中获取bean
 *
 * @author ruoyi
 */
@Component
public final class SpringUtils implements BeanFactoryPostProcessor, ApplicationContextAware {

    /**
     * Spring应用上下文环境
     */
    private static ConfigurableListableBeanFactory beanFactory;

    private static ApplicationContext applicationContext;

    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        SpringUtils.beanFactory = beanFactory;
    }

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringUtils.applicationContext = applicationContext;
    }

    /**
     * 获取对象
     *
     * @param name
     * @return Object 一个以所给名字注册的bean的实例
     * @throws org.springframework.beans.BeansException
     */
    @SuppressWarnings("unchecked")
    public static <T> T getBean(String name) throws BeansException {
        return (T) beanFactory.getBean(name);
    }

    /**
     * 获取类型为requiredType的对象
     *
     * @param clz
     * @return
     * @throws org.springframework.beans.BeansException
     */
    public static <T> T getBean(Class<T> clz) throws BeansException {
        T result = (T) beanFactory.getBean(clz);
        return result;
    }

    /**
     * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true
     *
     * @param name
     * @return boolean
     */
    public static boolean containsBean(String name) {
        return beanFactory.containsBean(name);
    }

    /**
     * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException)
     *
     * @param name
     * @return boolean
     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
     */
    public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException {
        return beanFactory.isSingleton(name);
    }

    /**
     * @param name
     * @return Class 注册对象的类型
     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
     */
    public static Class<?> getType(String name) throws NoSuchBeanDefinitionException {
        return beanFactory.getType(name);
    }

    /**
     * 如果给定的bean名字在bean定义中有别名,则返回这些别名
     *
     * @param name
     * @return
     * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException
     */
    public static String[] getAliases(String name) throws NoSuchBeanDefinitionException {
        return beanFactory.getAliases(name);
    }

    /**
     * 获取aop代理对象
     *
     * @param invoker
     * @return
     */
    @SuppressWarnings("unchecked")
    public static <T> T getAopProxy(T invoker) {
        return (T) AopContext.currentProxy();
    }

    /**
     * 获取当前的环境配置,无配置返回null
     *
     * @return 当前的环境配置
     */
    public static String[] getActiveProfiles() {
        return applicationContext.getEnvironment().getActiveProfiles();
    }

    /**
     * 获取当前的环境配置,当有多个环境配置时,只获取第一个
     *
     * @return 当前的环境配置
     */
    public static String getActiveProfile() {
        final String[] activeProfiles = getActiveProfiles();
        return StringUtils.isNotEmpty(activeProfiles) ? activeProfiles[0] : null;
    }

    /**
     * 获取配置文件中的值
     *
     * @param key 配置文件的key
     * @return 当前的配置文件的值
     */
    public static String getRequiredProperty(String key) {
        return applicationContext.getEnvironment().getRequiredProperty(key);
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/text/CharsetKit.java
================================================
package ginyi.common.utils.text;

import ginyi.common.utils.StringUtils;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * 字符集工具类
 *
 * @author ruoyi
 */
public class CharsetKit {
    /**
     * ISO-8859-1
     */
    public static final String ISO_8859_1 = "ISO-8859-1";
    /**
     * UTF-8
     */
    public static final String UTF_8 = "UTF-8";
    /**
     * GBK
     */
    public static final String GBK = "GBK";

    /**
     * ISO-8859-1
     */
    public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1);
    /**
     * UTF-8
     */
    public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8);
    /**
     * GBK
     */
    public static final Charset CHARSET_GBK = Charset.forName(GBK);

    /**
     * 转换为Charset对象
     *
     * @param charset 字符集,为空则返回默认字符集
     * @return Charset
     */
    public static Charset charset(String charset) {
        return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
    }

    /**
     * 转换字符串的字符集编码
     *
     * @param source      字符串
     * @param srcCharset  源字符集,默认ISO-8859-1
     * @param destCharset 目标字符集,默认UTF-8
     * @return 转换后的字符集
     */
    public static String convert(String source, String srcCharset, String destCharset) {
        return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
    }

    /**
     * 转换字符串的字符集编码
     *
     * @param source      字符串
     * @param srcCharset  源字符集,默认ISO-8859-1
     * @param destCharset 目标字符集,默认UTF-8
     * @return 转换后的字符集
     */
    public static String convert(String source, Charset srcCharset, Charset destCharset) {
        if (null == srcCharset) {
            srcCharset = StandardCharsets.ISO_8859_1;
        }

        if (null == destCharset) {
            destCharset = StandardCharsets.UTF_8;
        }

        if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) {
            return source;
        }
        return new String(source.getBytes(srcCharset), destCharset);
    }

    /**
     * @return 系统字符集编码
     */
    public static String systemCharset() {
        return Charset.defaultCharset().name();
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/text/Convert.java
================================================
package ginyi.common.utils.text;

import ginyi.common.utils.StringUtils;
import org.apache.commons.lang3.ArrayUtils;

import java.nio.ByteBuffer;
import java.nio.charset.Charset;

public class Convert {

    /**
     * 转换为字符串<br>
     * 如果给定的值为null,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static String toStr(Object value, String defaultValue) {
        if (null == value) {
            return defaultValue;
        }
        if (value instanceof String) {
            return (String) value;
        }
        return value.toString();
    }

    /**
     * 转换为字符串<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static String toStr(Object value) {
        return toStr(value, null);
    }


    /**
     * 转换为boolean<br>
     * 如果给定的值为空,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Boolean toBool(Object value) {
        return toBool(value, null);
    }

    /**
     * 转换为boolean<br>
     * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Boolean toBool(Object value, Boolean defaultValue) {
        if (value == null) {
            return defaultValue;
        }
        if (value instanceof Boolean) {
            return (Boolean) value;
        }
        String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr)) {
            return defaultValue;
        }
        valueStr = valueStr.trim().toLowerCase();
        switch (valueStr) {
            case "true":
            case "yes":
            case "ok":
            case "1":
                return true;
            case "false":
            case "no":
            case "0":
                return false;
            default:
                return defaultValue;
        }
    }

    /**
     * 转换为int<br>
     * 如果给定的值为<code>null</code>,或者转换失败,返回默认值<code>null</code><br>
     * 转换失败不会报错
     *
     * @param value 被转换的值
     * @return 结果
     */
    public static Integer toInt(Object value) {
        return toInt(value, null);
    }

    /**
     * 转换为int<br>
     * 如果给定的值为空,或者转换失败,返回默认值<br>
     * 转换失败不会报错
     *
     * @param value        被转换的值
     * @param defaultValue 转换错误时的默认值
     * @return 结果
     */
    public static Integer toInt(Object value, Integer defaultValue) {
        if (value == null) {
            return defaultValue;
        }
        if (value instanceof Integer) {
            return (Integer) value;
        }
        if (value instanceof Number) {
            return ((Number) value).intValue();
        }
        final String valueStr = toStr(value, null);
        if (StringUtils.isEmpty(valueStr)) {
            return defaultValue;
        }
        try {
            return Integer.parseInt(valueStr.trim());
        } catch (Exception e) {
            return defaultValue;
        }
    }

    /**
     * 将对象转为字符串<br>
     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
     *
     * @param obj 对象
     * @return 字符串
     */
    public static String utf8Str(Object obj) {
        return str(obj, CharsetKit.CHARSET_UTF_8);
    }

    /**
     * 将对象转为字符串<br>
     * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法
     *
     * @param obj     对象
     * @param charset 字符集
     * @return 字符串
     */
    public static String str(Object obj, Charset charset) {
        if (null == obj) {
            return null;
        }

        if (obj instanceof String) {
            return (String) obj;
        } else if (obj instanceof byte[]) {
            return str((byte[]) obj, charset);
        } else if (obj instanceof Byte[]) {
            byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj);
            return str(bytes, charset);
        } else if (obj instanceof ByteBuffer) {
            return str((ByteBuffer) obj, charset);
        }
        return obj.toString();
    }


}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/text/StrFormatter.java
================================================
package ginyi.common.utils.text;

import ginyi.common.utils.StringUtils;

/**
 * 字符串格式化
 *
 * @author ruoyi
 */
public class StrFormatter {
    public static final String EMPTY_JSON = "{}";
    public static final char C_BACKSLASH = '\\';
    public static final char C_DELIM_START = '{';
    public static final char C_DELIM_END = '}';

    /**
     * 格式化字符串<br>
     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
     * 例:<br>
     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
     *
     * @param strPattern 字符串模板
     * @param argArray   参数列表
     * @return 结果
     */
    public static String format(final String strPattern, final Object... argArray) {
        if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray)) {
            return strPattern;
        }
        final int strPatternLength = strPattern.length();

        // 初始化定义好的长度以获得更好的性能
        StringBuilder sbuf = new StringBuilder(strPatternLength + 50);

        int handledPosition = 0;
        int delimIndex;// 占位符所在位置
        for (int argIndex = 0; argIndex < argArray.length; argIndex++) {
            delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
            if (delimIndex == -1) {
                if (handledPosition == 0) {
                    return strPattern;
                } else { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
                    sbuf.append(strPattern, handledPosition, strPatternLength);
                    return sbuf.toString();
                }
            } else {
                if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH) {
                    if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH) {
                        // 转义符之前还有一个转义符,占位符依旧有效
                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
                        sbuf.append(Convert.utf8Str(argArray[argIndex]));
                        handledPosition = delimIndex + 2;
                    } else {
                        // 占位符被转义
                        argIndex--;
                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
                        sbuf.append(C_DELIM_START);
                        handledPosition = delimIndex + 1;
                    }
                } else {
                    // 正常占位符
                    sbuf.append(strPattern, handledPosition, delimIndex);
                    sbuf.append(Convert.utf8Str(argArray[argIndex]));
                    handledPosition = delimIndex + 2;
                }
            }
        }
        // 加入最后一个占位符后所有的字符
        sbuf.append(strPattern, handledPosition, strPattern.length());

        return sbuf.toString();
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/uuid/IdUtils.java
================================================
package ginyi.common.utils.uuid;

/**
 * ID生成器工具类
 *
 * @author ruoyi
 */
public class IdUtils {
    /**
     * 获取随机UUID
     *
     * @return 随机UUID
     */
    public static String randomUUID() {
        return UUID.randomUUID().toString();
    }

    /**
     * 简化的UUID,去掉了横线
     *
     * @return 简化的UUID,去掉了横线
     */
    public static String simpleUUID() {
        return UUID.randomUUID().toString(true);
    }

    /**
     * 获取随机UUID,使用性能更好的ThreadLocalRandom生成UUID
     *
     * @return 随机UUID
     */
    public static String fastUUID() {
        return UUID.fastUUID().toString();
    }

    /**
     * 简化的UUID,去掉了横线,使用性能更好的ThreadLocalRandom生成UUID
     *
     * @return 简化的UUID,去掉了横线
     */
    public static String fastSimpleUUID() {
        return UUID.fastUUID().toString(true);
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/uuid/UUID.java
================================================
package ginyi.common.utils.uuid;

import cn.hutool.core.exceptions.UtilException;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.Random;
import java.util.concurrent.ThreadLocalRandom;

/**
 * 提供通用唯一识别码(universally unique identifier)(UUID)实现
 *
 * @author ruoyi
 */
public final class UUID implements java.io.Serializable, Comparable<UUID> {
    private static final long serialVersionUID = -1185015143654744140L;

    /**
     * SecureRandom 的单例
     */
    private static class Holder {
        static final SecureRandom numberGenerator = getSecureRandom();
    }

    /**
     * 此UUID的最高64有效位
     */
    private final long mostSigBits;

    /**
     * 此UUID的最低64有效位
     */
    private final long leastSigBits;

    /**
     * 私有构造
     *
     * @param data 数据
     */
    private UUID(byte[] data) {
        long msb = 0;
        long lsb = 0;
        assert data.length == 16 : "data must be 16 bytes in length";
        for (int i = 0; i < 8; i++) {
            msb = (msb << 8) | (data[i] & 0xff);
        }
        for (int i = 8; i < 16; i++) {
            lsb = (lsb << 8) | (data[i] & 0xff);
        }
        this.mostSigBits = msb;
        this.leastSigBits = lsb;
    }

    /**
     * 使用指定的数据构造新的 UUID。
     *
     * @param mostSigBits  用于 {@code UUID} 的最高有效 64 位
     * @param leastSigBits 用于 {@code UUID} 的最低有效 64 位
     */
    public UUID(long mostSigBits, long leastSigBits) {
        this.mostSigBits = mostSigBits;
        this.leastSigBits = leastSigBits;
    }

    /**
     * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的本地线程伪随机数生成器生成该 UUID。
     *
     * @return 随机生成的 {@code UUID}
     */
    public static UUID fastUUID() {
        return randomUUID(false);
    }

    /**
     * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。
     *
     * @return 随机生成的 {@code UUID}
     */
    public static UUID randomUUID() {
        return randomUUID(true);
    }

    /**
     * 获取类型 4(伪随机生成的)UUID 的静态工厂。 使用加密的强伪随机数生成器生成该 UUID。
     *
     * @param isSecure 是否使用{@link SecureRandom}如果是可以获得更安全的随机码,否则可以得到更好的性能
     * @return 随机生成的 {@code UUID}
     */
    public static UUID randomUUID(boolean isSecure) {
        final Random ng = isSecure ? Holder.numberGenerator : getRandom();

        byte[] randomBytes = new byte[16];
        ng.nextBytes(randomBytes);
        randomBytes[6] &= 0x0f; /* clear version */
        randomBytes[6] |= 0x40; /* set to version 4 */
        randomBytes[8] &= 0x3f; /* clear variant */
        randomBytes[8] |= 0x80; /* set to IETF variant */
        return new UUID(randomBytes);
    }

    /**
     * 根据指定的字节数组获取类型 3(基于名称的)UUID 的静态工厂。
     *
     * @param name 用于构造 UUID 的字节数组。
     * @return 根据指定数组生成的 {@code UUID}
     */
    public static UUID nameUUIDFromBytes(byte[] name) {
        MessageDigest md;
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException nsae) {
            throw new InternalError("MD5 not supported");
        }
        byte[] md5Bytes = md.digest(name);
        md5Bytes[6] &= 0x0f; /* clear version */
        md5Bytes[6] |= 0x30; /* set to version 3 */
        md5Bytes[8] &= 0x3f; /* clear variant */
        md5Bytes[8] |= 0x80; /* set to IETF variant */
        return new UUID(md5Bytes);
    }

    /**
     * 根据 {@link #toString()} 方法中描述的字符串标准表示形式创建{@code UUID}。
     *
     * @param name 指定 {@code UUID} 字符串
     * @return 具有指定值的 {@code UUID}
     * @throws IllegalArgumentException 如果 name 与 {@link #toString} 中描述的字符串表示形式不符抛出此异常
     */
    public static UUID fromString(String name) {
        String[] components = name.split("-");
        if (components.length != 5) {
            throw new IllegalArgumentException("Invalid UUID string: " + name);
        }
        for (int i = 0; i < 5; i++) {
            components[i] = "0x" + components[i];
        }

        long mostSigBits = Long.decode(components[0]).longValue();
        mostSigBits <<= 16;
        mostSigBits |= Long.decode(components[1]).longValue();
        mostSigBits <<= 16;
        mostSigBits |= Long.decode(components[2]).longValue();

        long leastSigBits = Long.decode(components[3]).longValue();
        leastSigBits <<= 48;
        leastSigBits |= Long.decode(components[4]).longValue();

        return new UUID(mostSigBits, leastSigBits);
    }

    /**
     * 返回此 UUID 的 128 位值中的最低有效 64 位。
     *
     * @return 此 UUID 的 128 位值中的最低有效 64 位。
     */
    public long getLeastSignificantBits() {
        return leastSigBits;
    }

    /**
     * 返回此 UUID 的 128 位值中的最高有效 64 位。
     *
     * @return 此 UUID 的 128 位值中最高有效 64 位。
     */
    public long getMostSignificantBits() {
        return mostSigBits;
    }

    /**
     * 与此 {@code UUID} 相关联的版本号. 版本号描述此 {@code UUID} 是如何生成的。
     * <p>
     * 版本号具有以下含意:
     * <ul>
     * <li>1 基于时间的 UUID
     * <li>2 DCE 安全 UUID
     * <li>3 基于名称的 UUID
     * <li>4 随机生成的 UUID
     * </ul>
     *
     * @return 此 {@code UUID} 的版本号
     */
    public int version() {
        // Version is bits masked by 0x000000000000F000 in MS long
        return (int) ((mostSigBits >> 12) & 0x0f);
    }

    /**
     * 与此 {@code UUID} 相关联的变体号。变体号描述 {@code UUID} 的布局。
     * <p>
     * 变体号具有以下含意:
     * <ul>
     * <li>0 为 NCS 向后兼容保留
     * <li>2 <a href="http://www.ietf.org/rfc/rfc4122.txt">IETF&nbsp;RFC&nbsp;4122</a>(Leach-Salz), 用于此类
     * <li>6 保留,微软向后兼容
     * <li>7 保留供以后定义使用
     * </ul>
     *
     * @return 此 {@code UUID} 相关联的变体号
     */
    public int variant() {
        // This field is composed of a varying number of bits.
        // 0 - - Reserved for NCS backward compatibility
        // 1 0 - The IETF aka Leach-Salz variant (used by this class)
        // 1 1 0 Reserved, Microsoft backward compatibility
        // 1 1 1 Reserved for future definition.
        return (int) ((leastSigBits >>> (64 - (leastSigBits >>> 62))) & (leastSigBits >> 63));
    }

    /**
     * 与此 UUID 相关联的时间戳值。
     *
     * <p>
     * 60 位的时间戳值根据此 {@code UUID} 的 time_low、time_mid 和 time_hi 字段构造。<br>
     * 所得到的时间戳以 100 毫微秒为单位,从 UTC(通用协调时间) 1582 年 10 月 15 日零时开始。
     *
     * <p>
     * 时间戳值仅在在基于时间的 UUID(其 version 类型为 1)中才有意义。<br>
     * 如果此 {@code UUID} 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。
     *
     * @throws UnsupportedOperationException 如果此 {@code UUID} 不是 version 为 1 的 UUID。
     */
    public long timestamp() throws UnsupportedOperationException {
        checkTimeBase();
        return (mostSigBits & 0x0FFFL) << 48//
                | ((mostSigBits >> 16) & 0x0FFFFL) << 32//
                | mostSigBits >>> 32;
    }

    /**
     * 与此 UUID 相关联的时钟序列值。
     *
     * <p>
     * 14 位的时钟序列值根据此 UUID 的 clock_seq 字段构造。clock_seq 字段用于保证在基于时间的 UUID 中的时间唯一性。
     * <p>
     * {@code clockSequence} 值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。 如果此 UUID 不是基于时间的 UUID,则此方法抛出
     * UnsupportedOperationException。
     *
     * @return 此 {@code UUID} 的时钟序列
     * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1
     */
    public int clockSequence() throws UnsupportedOperationException {
        checkTimeBase();
        return (int) ((leastSigBits & 0x3FFF000000000000L) >>> 48);
    }

    /**
     * 与此 UUID 相关的节点值。
     *
     * <p>
     * 48 位的节点值根据此 UUID 的 node 字段构造。此字段旨在用于保存机器的 IEEE 802 地址,该地址用于生成此 UUID 以保证空间唯一性。
     * <p>
     * 节点值仅在基于时间的 UUID(其 version 类型为 1)中才有意义。<br>
     * 如果此 UUID 不是基于时间的 UUID,则此方法抛出 UnsupportedOperationException。
     *
     * @return 此 {@code UUID} 的节点值
     * @throws UnsupportedOperationException 如果此 UUID 的 version 不为 1
     */
    public long node() throws UnsupportedOperationException {
        checkTimeBase();
        return leastSigBits & 0x0000FFFFFFFFFFFFL;
    }

    /**
     * 返回此{@code UUID} 的字符串表现形式。
     *
     * <p>
     * UUID 的字符串表示形式由此 BNF 描述:
     *
     * <pre>
     * {@code
     * UUID                   = <time_low>-<time_mid>-<time_high_and_version>-<variant_and_sequence>-<node>
     * time_low               = 4*<hexOctet>
     * time_mid               = 2*<hexOctet>
     * time_high_and_version  = 2*<hexOctet>
     * variant_and_sequence   = 2*<hexOctet>
     * node                   = 6*<hexOctet>
     * hexOctet               = <hexDigit><hexDigit>
     * hexDigit               = [0-9a-fA-F]
     * }
     * </pre>
     *
     * </blockquote>
     *
     * @return 此{@code UUID} 的字符串表现形式
     * @see #toString(boolean)
     */
    @Override
    public String toString() {
        return toString(false);
    }

    /**
     * 返回此{@code UUID} 的字符串表现形式。
     *
     * <p>
     * UUID 的字符串表示形式由此 BNF 描述:
     *
     * <pre>
     * {@code
     * UUID                   = <time_low>-<time_mid>-<time_high_and_version>-<variant_and_sequence>-<node>
     * time_low               = 4*<hexOctet>
     * time_mid               = 2*<hexOctet>
     * time_high_and_version  = 2*<hexOctet>
     * variant_and_sequence   = 2*<hexOctet>
     * node                   = 6*<hexOctet>
     * hexOctet               = <hexDigit><hexDigit>
     * hexDigit               = [0-9a-fA-F]
     * }
     * </pre>
     *
     * </blockquote>
     *
     * @param isSimple 是否简单模式,简单模式为不带'-'的UUID字符串
     * @return 此{@code UUID} 的字符串表现形式
     */
    public String toString(boolean isSimple) {
        final StringBuilder builder = new StringBuilder(isSimple ? 32 : 36);
        // time_low
        builder.append(digits(mostSigBits >> 32, 8));
        if (!isSimple) {
            builder.append('-');
        }
        // time_mid
        builder.append(digits(mostSigBits >> 16, 4));
        if (!isSimple) {
            builder.append('-');
        }
        // time_high_and_version
        builder.append(digits(mostSigBits, 4));
        if (!isSimple) {
            builder.append('-');
        }
        // variant_and_sequence
        builder.append(digits(leastSigBits >> 48, 4));
        if (!isSimple) {
            builder.append('-');
        }
        // node
        builder.append(digits(leastSigBits, 12));

        return builder.toString();
    }

    /**
     * 返回此 UUID 的哈希码。
     *
     * @return UUID 的哈希码值。
     */
    @Override
    public int hashCode() {
        long hilo = mostSigBits ^ leastSigBits;
        return ((int) (hilo >> 32)) ^ (int) hilo;
    }

    /**
     * 将此对象与指定对象比较。
     * <p>
     * 当且仅当参数不为 {@code null}、而是一个 UUID 对象、具有与此 UUID 相同的 varriant、包含相同的值(每一位均相同)时,结果才为 {@code true}。
     *
     * @param obj 要与之比较的对象
     * @return 如果对象相同,则返回 {@code true};否则返回 {@code false}
     */
    @Override
    public boolean equals(Object obj) {
        if ((null == obj) || (obj.getClass() != UUID.class)) {
            return false;
        }
        UUID id = (UUID) obj;
        return (mostSigBits == id.mostSigBits && leastSigBits == id.leastSigBits);
    }

    // Comparison Operations

    /**
     * 将此 UUID 与指定的 UUID 比较。
     *
     * <p>
     * 如果两个 UUID 不同,且第一个 UUID 的最高有效字段大于第二个 UUID 的对应字段,则第一个 UUID 大于第二个 UUID。
     *
     * @param val 与此 UUID 比较的 UUID
     * @return 在此 UUID 小于、等于或大于 val 时,分别返回 -1、0 或 1。
     */
    @Override
    public int compareTo(UUID val) {
        // The ordering is intentionally set up so that the UUIDs
        // can simply be numerically compared as two numbers
        return (this.mostSigBits < val.mostSigBits ? -1 : //
                (this.mostSigBits > val.mostSigBits ? 1 : //
                        (this.leastSigBits < val.leastSigBits ? -1 : //
                                (this.leastSigBits > val.leastSigBits ? 1 : //
                                        0))));
    }

    // -------------------------------------------------------------------------------------------------------------------
    // Private method start

    /**
     * 返回指定数字对应的hex值
     *
     * @param val    值
     * @param digits 位
     * @return 值
     */
    private static String digits(long val, int digits) {
        long hi = 1L << (digits * 4);
        return Long.toHexString(hi | (val & (hi - 1))).substring(1);
    }

    /**
     * 检查是否为time-based版本UUID
     */
    private void checkTimeBase() {
        if (version() != 1) {
            throw new UnsupportedOperationException("Not a time-based UUID");
        }
    }

    /**
     * 获取{@link SecureRandom},类提供加密的强随机数生成器 (RNG)
     *
     * @return {@link SecureRandom}
     */
    public static SecureRandom getSecureRandom() {
        try {
            return SecureRandom.getInstance("SHA1PRNG");
        } catch (NoSuchAlgorithmException e) {
            throw new UtilException(e);
        }
    }

    /**
     * 获取随机数生成器对象<br>
     * ThreadLocalRandom是JDK 7之后提供并发产生随机数,能够解决多个线程发生的竞争争夺。
     *
     * @return {@link ThreadLocalRandom}
     */
    public static ThreadLocalRandom getRandom() {
        return ThreadLocalRandom.current();
    }
}


================================================
FILE: ginyi-springboot/ginyi-common/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ginyi-springboot</artifactId>
        <groupId>com.ginyi</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ginyi-common</artifactId>
    <packaging>pom</packaging>
    <modules>
        <module>ginyi-common-mysql</module>
        <module>ginyi-common-redis</module>
        <module>ginyi-common-exception</module>
        <module>ginyi-common-result</module>
        <module>ginyi-common-utils</module>
        <module>ginyi-common-swagger</module>
        <module>ginyi-common-constants</module>
        <module>ginyi-common-annotation</module>
        <module>ginyi-common-enums</module>
    </modules>

</project>

================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-core/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ginyi-framework</artifactId>
        <groupId>com.ginyi</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ginyi-framework-core</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <!-- aop -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
    </dependencies>

</project>

================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-core/src/main/java/ginyi/framework/core/config/AppConfig.java
================================================
package ginyi.framework.core.config;

import lombok.extern.slf4j.Slf4j;
import org.fusesource.jansi.Ansi;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.env.ConfigurableEnvironment;

import java.net.InetAddress;
import java.net.UnknownHostException;

@Slf4j
public class AppConfig {

    /**
     * 彩色打印字体
     */
    public static String colorPrint(String s, Ansi.Color color) {
        return Ansi.ansi().eraseScreen().fg(color).a(s).reset().toString();
    }

    public static void printAppInfo(ConfigurableApplicationContext context) throws UnknownHostException {
        // 获取环境配置信息
        ConfigurableEnvironment env = context.getEnvironment();
        String projectName = env.getProperty("ginyi.project-name");
        String contextPath = env.getProperty("server.servlet.context-path");
        String port = env.getProperty("server.port");
        String baseUrl = "http://" + InetAddress.getLocalHost().getHostAddress() + ":" + port + contextPath;
        String swaggerDoc = baseUrl + "swagger-ui.html";
        String knife4jDoc = baseUrl + "doc.html";

        String startSuccess = "\n" +
                "  _______  __   __   __  ____    ____  __     \n" +
                " /  _____||  | |  \\ |  | \\   \\  /   / |  | 项目名称:" + projectName + "\n" +
                "|  |  __  |  | |   \\|  |  \\   \\/   /  |  | 服务地址:" + baseUrl + "\n" +
                "|  | |_ | |  | |       |   \\_    _/   |  | 接口文档:" + knife4jDoc + " or " + swaggerDoc + "\n" +
                "|  |__| | |  | |  |\\   |     |  |     |  | 如果你喜欢这个项目,欢迎Star!https://gitee.com/Ginyi/ginyi-spring-vue \n" +
                " \\______| |__| |__| \\__|     |__|     |__| 启动成功...\n";

        log.info("\n{}", colorPrint(startSuccess, Ansi.Color.CYAN));
    }

}


================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-core/src/main/java/ginyi/framework/core/config/GinyiConfig.java
================================================
package ginyi.framework.core.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * 读取项目相关配置
 *
 * @author ruoyi
 */
@Component
public class GinyiConfig {

    /**
     * 上传路径
     */
    @Value("${ginyi.profile}")
    public static String profile;

    /**
     * 获取导入上传路径
     */
    public static String getImportPath() {
        return profile + "/import";
    }

    /**
     * 获取头像上传路径
     */
    public static String getAvatarPath() {
        return profile + "/avatar";
    }

    /**
     * 获取下载路径
     */
    public static String getDownloadPath() {
        return profile + "/download/";
    }

    /**
     * 获取上传路径
     */
    public static String getUploadPath() {
        return profile + "/upload";
    }
}


================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>ginyi-framework</artifactId>
        <groupId>com.ginyi</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ginyi-framework-security</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>com.ginyi</groupId>
            <artifactId>ginyi-framework-core</artifactId>
            <version>${ginyi.version}</version>
        </dependency>

        <!-- 解析客户端操作系统、浏览器等 -->
        <dependency>
            <groupId>eu.bitwalker</groupId>
            <artifactId>UserAgentUtils</artifactId>
        </dependency>
        <!-- 公用枚举包 -->
        <dependency>
            <groupId>com.ginyi</groupId>
            <artifactId>ginyi-common-enums</artifactId>
            <version>${ginyi.version}</version>
        </dependency>
    </dependencies>
</project>

================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/aspectj/LogAspect.java
================================================
package ginyi.framework.security.aspectj;

import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson2.JSON;
import ginyi.common.annotation.Log;
import ginyi.common.constant.CommonMessageConstants;
import ginyi.common.enums.BusinessStatus;
import ginyi.common.enums.HttpMethod;
import ginyi.common.exception.CommonException;
import ginyi.common.exception.UnPermissionException;
import ginyi.common.exception.UserPasswordNotMatchException;
import ginyi.common.exception.UserPasswordRetryLimitExceedException;
import ginyi.common.result.StateCode;
import ginyi.common.utils.ServletUtils;
import ginyi.common.utils.StringUtils;
import ginyi.common.utils.ip.IpUtils;
import ginyi.framework.security.filter.PropertyPreExcludeFilter;
import ginyi.framework.security.manager.AsyncManager;
import ginyi.framework.security.manager.factory.AsyncFactory;
import ginyi.framework.security.utils.SecurityUtils;
import ginyi.system.domain.LoginUser;
import ginyi.system.domain.SysLogOperation;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.fusesource.jansi.Ansi;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.stereotype.Component;
import org.springframework.validation.BindingResult;
import org.springframework.validation.ObjectError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;

/**
 * 操作日志记录处理
 *
 * @author ruoyi
 */
@Aspect
@Component
@Slf4j
public class LogAspect {
    /**
     * 排除敏感属性字段
     */
    public static final String[] EXCLUDE_PROPERTIES = {"password", "oldPassword", "newPassword", "confirmPassword"};

    /**
     * 处理完请求后执行
     *
     * @param joinPoint 切点
     */
    @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult")
    public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) {
        handleLog(joinPoint, controllerLog, null, jsonResult);
    }

    /**
     * 拦截异常操作
     *
     * @param joinPoint 切点
     * @param e         异常
     */
    @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e")
    public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) {
        handleLog(joinPoint, controllerLog, e, null);
    }

    protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) {
        try {
            // 获取当前的用户
            LoginUser loginUser = SecurityUtils.getLoginUser();
            // 数据库日志
            SysLogOperation operationLog = new SysLogOperation();
            operationLog.setStatus(BusinessStatus.SUCCESS.ordinal());
            // 请求的地址
            String ip = IpUtils.getIpAddr(ServletUtils.getRequest());
            operationLog.setOperationIp(ip);
            operationLog.setOperationUrl(StringUtils.substring(ServletUtils.getRequest().getRequestURI(), 0, 255));
            operationLog.setCreateTime(new Date());
            if (loginUser != null) {
                operationLog.setOperationName(loginUser.getUsername());
            }
            // 设置方法名称
            String className = joinPoint.getTarget().getClass().getName();
            String methodName = joinPoint.getSignature().getName();
            operationLog.setMethod(className + "." + methodName + "()");
            // 设置请求方式
            operationLog.setRequestMethod(ServletUtils.getRequest().getMethod());
            // 处理设置注解上的参数
            getControllerMethodDescription(joinPoint, controllerLog, operationLog, jsonResult);
            log.info("[ Log日志记录 ] 操作人员: {}", operationLog.getOperationName());
            log.info("[ Log日志记录 ] 操作主机: {}", operationLog.getOperationIp());
            log.info("[ Log日志记录 ] 请求时间: {}", DateUtil.date(System.currentTimeMillis()));
            log.info("[ Log日志记录 ] 请求模块: {}", operationLog.getTitle());
            log.info("[ Log日志记录 ] 请求地址: {}", operationLog.getOperationUrl());
            log.info("[ Log日志记录 ] 方法类型: {}", operationLog.getRequestMethod());
            log.info("[ Log日志记录 ] 操作类型: {}", operationLog.getBusinessType() == 0 ? "其他" :
                    operationLog.getBusinessType() == 1 ? "新增" : operationLog.getBusinessType() == 2 ? "修改" : "删除");
            log.info("[ Log日志记录 ] 方法名称: {}", operationLog.getMethod());
            log.info("[ Log日志记录 ] 请求参数: {}", operationLog.getOperationParam());

            if (e != null) {
                String msg = handleException(e);
                operationLog.setStatus(BusinessStatus.FAIL.ordinal());
                operationLog.setErrorMsg(msg);
                log.info("[ Log日志记录 ] 请求结果: {}", operationLog.getStatus() == 0 ? colorPrint("成功", Ansi.Color.GREEN) : colorPrint("失败", Ansi.Color.RED));
                log.info("[ Log日志记录 ] 响应结果: {}\n", msg);
            } else {
                log.info("[ Log日志记录 ] 请求结果: {}", operationLog.getStatus() == 0 ? colorPrint("成功", Ansi.Color.GREEN) : colorPrint("失败", Ansi.Color.RED));
                log.info("[ Log日志记录 ] 响应结果: {}\n", operationLog.getJsonResult());
            }
            // 保存数据库
            AsyncManager.me().execute(AsyncFactory.recordOper(operationLog));
        } catch (Exception exp) {
            // 记录本地异常日志
            log.error("记录本地日志时发生异常,异常信息:{}", exp.getMessage());
            exp.printStackTrace();
        }
    }

    /**
     * 处理并异常信息
     *
     * @param e
     * @return
     */
    private String handleException(Exception e) {
        HashMap<String, Object> map = new HashMap<>();
        // 公用异常
        if (e instanceof CommonException) {
            CommonException ce = (CommonException) e;
            map.put("code", ce.getState().getCode());
            map.put("msg", ce.getState().getMessage());
            map.put("data", ce.getData());
            return JSON.toJSONString(map);
        }
        // 请求参数不合法
        if (e instanceof HttpMessageNotReadableException) {
            HttpMessageNotReadableException he = (HttpMessageNotReadableException) e;
            map.put("code", StateCode.ERROR_REQUEST_PARAMS.getCode());
            map.put("msg", StateCode.ERROR_REQUEST_PARAMS.getMessage());
            map.put("data", CommonMessageConstants.SYS_REQUEST_ILLEGAL);
            return JSON.toJSONString(map);
        }
        // 用户名密码不匹配
        if (e instanceof UserPasswordNotMatchException) {
            UserPasswordNotMatchException ue = (UserPasswordNotMatchException) e;
            map.put("code", StateCode.ERROR_UNAUTHENTICATION.getCode());
            map.put("msg", StateCode.ERROR_UNAUTHENTICATION.getMessage());
            map.put("data", CommonMessageConstants.USER_PASSWORD_NOT_MATCH);
            return JSON.toJSONString(map);
        }
        // 用户登录失败次数超最大限制异常
        if (e instanceof UserPasswordRetryLimitExceedException) {
            UserPasswordRetryLimitExceedException upe = (UserPasswordRetryLimitExceedException) e;
            map.put("code", upe.getState().getCode());
            map.put("msg", upe.getState().getMessage());
            map.put("data", upe.getData());
            return JSON.toJSONString(map);
        }
        // 上传文件异常
        if (e instanceof MultipartException) {
            MultipartException mte = (MultipartException) e;
            map.put("code", StateCode.ERROR_MULTIPART.getCode());
            map.put("msg", StateCode.ERROR_MULTIPART.getMessage());
            if (mte instanceof MaxUploadSizeExceededException) {
                map.put("data", CommonMessageConstants.UPLOAD_SIZE_EXCEED);
                return JSON.toJSONString(map);
            }
            map.put("data", CommonMessageConstants.UPLOAD_FILE_ERROR);
            return JSON.toJSONString(map);
        }
        // 访问接口无权限
        if (e instanceof UnPermissionException) {
            UnPermissionException upe = (UnPermissionException) e;
            map.put("code", StateCode.ERROR_NOT_PERMISSION.getCode());
            map.put("msg", StateCode.ERROR_NOT_PERMISSION.getMessage());
            map.put("data", CommonMessageConstants.SYS_ERROR);
            return JSON.toJSONString(map);
        }
        // 处理其他所有未知异常
        map.put("code", StateCode.ERROR_SYSTEM.getCode());
        map.put("msg", StateCode.ERROR_SYSTEM.getMessage());
        map.put("data", CommonMessageConstants.SYS_ERROR);
        return JSON.toJSONString(map);
    }

    /**
     * 获取注解中对方法的描述信息 用于Controller层注解
     *
     * @param log          日志
     * @param operationLog 操作日志
     * @throws Exception
     */
    public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysLogOperation operationLog, Object jsonResult) throws Exception {
        // 设置action动作
        operationLog.setBusinessType(log.businessType().ordinal());
        // 设置标题
        operationLog.setTitle(log.title());
        // 设置操作人类别
        operationLog.setOperatorType(log.operatorType().ordinal());
        // 是否需要保存request,参数和值
        if (log.isSaveRequestData()) {
            // 获取参数的信息,传入到数据库中。
            setRequestValue(joinPoint, operationLog);
        }
        // 是否需要保存response,参数和值
        if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult)) {
            operationLog.setJsonResult(JSON.toJSONString(jsonResult));
        }
    }

    /**
     * 获取请求的参数,放到log中
     *
     * @param operationLog 操作日志
     * @throws Exception 异常
     */
    private void setRequestValue(JoinPoint joinPoint, SysLogOperation operationLog) throws Exception {
        String requestMethod = operationLog.getRequestMethod();
        if (HttpMethod.PUT.name().equals(requestMethod) || HttpMethod.POST.name().equals(requestMethod)) {
            String params = argsArrayToString(joinPoint.getArgs());
            operationLog.setOperationParam(params);
        } else {
            Map<?, ?> paramsMap = ServletUtils.getParamMap(ServletUtils.getRequest());
            operationLog.setOperationParam(StringUtils.substring(JSON.toJSONString(paramsMap, excludePropertyPreFilter()), 0, 2000));
        }
    }

    /**
     * 参数拼装
     */
    private String argsArrayToString(Object[] paramsArray) {
        String params = "";
        if (paramsArray != null && paramsArray.length > 0) {
            for (Object o : paramsArray) {
                if (StringUtils.isNotNull(o) && !isFilterObject(o)) {
                    try {
                        String jsonObj = JSON.toJSONString(o, excludePropertyPreFilter());
                        params += jsonObj.toString() + " ";
                    } catch (Exception e) {
                    }
                }
            }
        }
        return params.trim();
    }

    /**
     * 忽略敏感属性
     */
    public PropertyPreExcludeFilter excludePropertyPreFilter() {
        return new PropertyPreExcludeFilter().addExcludes(EXCLUDE_PROPERTIES);
    }

    /**
     * 判断是否需要过滤的对象。
     *
     * @param o 对象信息。
     * @return 如果是需要过滤的对象,则返回true;否则返回false。
     */
    @SuppressWarnings("rawtypes")
    public boolean isFilterObject(final Object o) {
        Class<?> clazz = o.getClass();
        if (clazz.isArray()) {
            return clazz.getComponentType().isAssignableFrom(MultipartFile.class);
        } else if (Collection.class.isAssignableFrom(clazz)) {
            Collection collection = (Collection) o;
            for (Object value : collection) {
                return value instanceof MultipartFile;
            }
        } else if (Map.class.isAssignableFrom(clazz)) {
            Map map = (Map) o;
            for (Object value : map.entrySet()) {
                Map.Entry entry = (Map.Entry) value;
                return entry.getValue() instanceof MultipartFile;
            }
        }
        return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse
                || o instanceof BindingResult;
    }

    /**
     * 彩色打印字体
     */
    public static String colorPrint(String s, Ansi.Color color) {
        return Ansi.ansi().eraseScreen().fg(color).a(s).reset().toString();
    }
}


================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/config/ResourcesConfig.java
================================================
package ginyi.framework.security.config;


import ginyi.framework.core.config.GinyiConfig;
import ginyi.common.utils.Constants;
import ginyi.framework.security.interceptor.PreviewEnvInterceptor;
import ginyi.framework.security.interceptor.RepeatSubmitInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.CacheControl;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * 通用配置
 *
 * @author ruoyi
 */
@Configuration
public class ResourcesConfig implements WebMvcConfigurer {

    @Resource
    private RepeatSubmitInterceptor repeatSubmitInterceptor;
    @Resource
    private PreviewEnvInterceptor previewEnvInterceptor;

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        /** 本地文件上传路径 */
        registry.addResourceHandler(Constants.RESOURCE_PREFIX + "/**")
                .addResourceLocations("file:" + GinyiConfig.profile + "/");

        /** swagger配置 */
        registry.addResourceHandler("/swagger-ui/**")
                .addResourceLocations("classpath:/META-INF/resources/webjars/springfox-swagger-ui/")
                .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());
        ;
    }

    /**
     * 自定义拦截规则
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(repeatSubmitInterceptor).addPathPatterns("/**");
        registry.addInterceptor(previewEnvInterceptor).addPathPatterns("/**");
    }

    /**
     * 跨域配置
     */
    @Bean
    public CorsFilter corsFilter() {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowCredentials(true);
        // 设置访问源地址
        config.addAllowedOriginPattern("*");
        // 设置访问源请求头
        config.addAllowedHeader("*");
        // 设置访问源请求方法
        config.addAllowedMethod("*");
        // 有效期 1800秒
        config.setMaxAge(1800L);
        // 添加映射路径,拦截一切请求
        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        source.registerCorsConfiguration("/**", config);
        // 返回新的CorsFilter
        return new CorsFilter(source);
    }
}

================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/config/SecurityConfig.java
================================================
package ginyi.framework.security.config;

import ginyi.framework.security.filter.JwtAuthenticationTokenFilter;
import ginyi.framework.security.handle.AuthenticationEntryPointImpl;
import ginyi.framework.security.handle.LogoutSuccessHandlerImpl;
import ginyi.framework.security.properties.PermitAllUrlProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.http.HttpMethod;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
import org.springframework.security.config.http.SessionCreationPolicy;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutFilter;
import org.springframework.web.filter.CorsFilter;

import javax.annotation.Resource;

/**
 * spring security配置
 *
 * @author ruoyi
 */
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    /**
     * 自定义用户认证逻辑
     */
    @Resource
    private UserDetailsService userDetailsService;

    /**
     * 认证失败处理类
     */
    @Resource
    private AuthenticationEntryPointImpl unauthorizedHandler;

    /**
     * 退出处理类
     */
    @Resource
    private LogoutSuccessHandlerImpl logoutSuccessHandler;

    /**
     * token认证过滤器
     */
    @Resource
    private JwtAuthenticationTokenFilter authenticationTokenFilter;

    /**
     * 跨域过滤器
     */
    @Resource
    private CorsFilter corsFilter;

    /**
     * 允许匿名访问的地址
     */
    @Resource
    private PermitAllUrlProperties permitAllUrl;

    /**
     * 解决 无法直接注入 AuthenticationManager
     *
     * @return
     * @throws Exception
     */
    @Bean
    @Override
    public AuthenticationManager authenticationManagerBean() throws Exception {
        return super.authenticationManagerBean();
    }

    /**
     * anyRequest          |   匹配所有请求路径
     * access              |   SpringEl表达式结果为true时可以访问
     * anonymous           |   匿名可以访问
     * denyAll             |   用户不能访问
     * fullyAuthenticated  |   用户完全认证可以访问(非remember-me下自动登录)
     * hasAnyAuthority     |   如果有参数,参数表示权限,则其中任何一个权限可以访问
     * hasAnyRole          |   如果有参数,参数表示角色,则其中任何一个角色可以访问
     * hasAuthority        |   如果有参数,参数表示权限,则其权限可以访问
     * hasIpAddress        |   如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问
     * hasRole             |   如果有参数,参数表示角色,则其角色可以访问
     * permitAll           |   用户可以任意访问
     * rememberMe          |   允许通过remember-me登录的用户访问
     * authenticated       |   用户登录后可访问
     */
    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        // 注解标记允许匿名访问的url
        ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = httpSecurity.authorizeRequests();
        permitAllUrl.getUrls().forEach(url -> registry.antMatchers(url).permitAll());

        httpSecurity
                // CSRF禁用,因为不使用session
                .csrf().disable()
                // 禁用HTTP响应标头
                .headers().cacheControl().disable().and()
                // 认证失败处理类
                .exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and()
                // 基于token,所以不需要session
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()
                // 过滤请求
                .authorizeRequests()
                // 对于登录login 注册register 验证码captchaImage 允许匿名访问
                .antMatchers("/api/user/login", "/api/user/register", "/api/verify/**").permitAll()
                // 静态资源,可匿名访问
                .antMatchers(HttpMethod.GET, "/", "/*.html", "/**/*.html", "/**/*.css", "/**/*.js", "/profile/**").permitAll()
                .antMatchers("/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs", "/druid/**").permitAll()
                // 放行websocket
                .antMatchers("/websocket/**").permitAll()
                // 除上面外的所有请求全部需要鉴权认证
                .anyRequest().authenticated()
                .and()
                .headers().frameOptions().disable();
        // 添加Logout filter
        httpSecurity.logout().logoutUrl("/**/logout").logoutSuccessHandler(logoutSuccessHandler);
        // 添加JWT filter
        httpSecurity.addFilterBefore(authenticationTokenFilter, UsernamePasswordAuthenticationFilter.class);
        // 添加CORS filter
        httpSecurity.addFilterBefore(corsFilter, JwtAuthenticationTokenFilter.class);
        httpSecurity.addFilterBefore(corsFilter, LogoutFilter.class);
    }

    /**
     * 强散列哈希加密实现
     */
    @Bean
    public BCryptPasswordEncoder bCryptPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }

    /**
     * 身份认证接口
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(bCryptPasswordEncoder());
    }
}


================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/config/ThreadPoolConfig.java
================================================
package ginyi.framework.security.config;

import ginyi.common.utils.Threads;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;

/**
 * 线程池配置
 *
 * @author ruoyi
 **/
@Configuration
public class ThreadPoolConfig {
    // 核心线程池大小
    private int corePoolSize = 50;

    // 最大可创建的线程数
    private int maxPoolSize = 200;

    // 队列最大长度
    private int queueCapacity = 1000;

    // 线程池维护线程所允许的空闲时间
    private int keepAliveSeconds = 300;

    @Bean(name = "threadPoolTaskExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setMaxPoolSize(maxPoolSize);
        executor.setCorePoolSize(corePoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.setKeepAliveSeconds(keepAliveSeconds);
        // 线程池对拒绝任务(无线程可用)的处理策略
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        return executor;
    }

    /**
     * 执行周期性或定时任务
     */
    @Bean(name = "scheduledExecutorService")
    protected ScheduledExecutorService scheduledExecutorService() {
        return new ScheduledThreadPoolExecutor(corePoolSize,
                new BasicThreadFactory.Builder().namingPattern("schedule-pool-%d").daemon(true).build(),
                new ThreadPoolExecutor.CallerRunsPolicy()) {
            @Override
            protected void afterExecute(Runnable r, Throwable t) {
                super.afterExecute(r, t);
                Threads.printException(r, t);
            }
        };
    }
}


================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/context/AuthenticationContextHolder.java
================================================
package ginyi.framework.security.context;

import org.springframework.security.core.Authentication;

/**
 * 身份验证信息
 *
 * @author ruoyi
 */
public class AuthenticationContextHolder {
    private static final ThreadLocal<Authentication> contextHolder = new ThreadLocal<>();

    public static Authentication getContext() {
        return contextHolder.get();
    }

    public static void setContext(Authentication context) {
        contextHolder.set(context);
    }

    public static void clearContext() {
        contextHolder.remove();
    }
}


================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/context/PermissionContextHolder.java
================================================
package ginyi.framework.security.context;

import ginyi.common.utils.text.Convert;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;

/**
 * 权限信息
 *
 * @author ruoyi
 */
public class PermissionContextHolder {
    private static final String PERMISSION_CONTEXT_ATTRIBUTES = "PERMISSION_CONTEXT";

    public static void setContext(String permission) {
        RequestContextHolder.currentRequestAttributes().setAttribute(PERMISSION_CONTEXT_ATTRIBUTES, permission,
                RequestAttributes.SCOPE_REQUEST);
    }

    public static String getContext() {
        return Convert.toStr(RequestContextHolder.currentRequestAttributes().getAttribute(PERMISSION_CONTEXT_ATTRIBUTES,
                RequestAttributes.SCOPE_REQUEST));
    }
}


================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/filter/JwtAuthenticationTokenFilter.java
================================================
package ginyi.framework.security.filter;

import ginyi.common.utils.StringUtils;
import ginyi.framework.security.utils.SecurityUtils;
import ginyi.system.domain.LoginUser;
import ginyi.system.service.ITokenService;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;

import javax.annotation.Resource;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * token过滤器 验证token有效性
 *
 * @author ruoyi
 */
@Component
public class JwtAuthenticationTokenFilter extends OncePerRequestFilter {
    @Resource
    private ITokenService tokenService;

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        LoginUser loginUser = tokenService.getLoginUser(request);
        if (StringUtils.isNotNull(loginUser) && StringUtils.isNull(SecurityUtils.getAuthentication())) {
            tokenService.verifyToken(loginUser);
            UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
            authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
            SecurityContextHolder.getContext().setAuthentication(authenticationToken);
        }
        chain.doFilter(request, response);
    }
}


================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/filter/PropertyPreExcludeFilter.java
================================================
package ginyi.framework.security.filter;

import com.alibaba.fastjson2.filter.SimplePropertyPreFilter;

/**
 * 排除JSON敏感属性
 *
 * @author ruoyi
 */
public class PropertyPreExcludeFilter extends SimplePropertyPreFilter {
    public PropertyPreExcludeFilter() {
    }

    public PropertyPreExcludeFilter addExcludes(String... filters) {
        for (int i = 0; i < filters.length; i++) {
            this.getExcludes().add(filters[i]);
        }
        return this;
    }
}


================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/filter/RepeatedlyRequestWrapper.java
================================================
package ginyi.framework.security.filter;

import ginyi.common.utils.Constants;
import ginyi.common.utils.http.HttpHelper;

import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 构建可重复读取inputStream的request
 *
 * @author ruoyi
 */
public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper {
    private final byte[] body;

    public RepeatedlyRequestWrapper(HttpServletRequest request, ServletResponse response) throws IOException {
        super(request);
        request.setCharacterEncoding(Constants.UTF8);
        response.setCharacterEncoding(Constants.UTF8);

        body = HttpHelper.getBodyString(request).getBytes(Constants.UTF8);
    }

    @Override
    public BufferedReader getReader() throws IOException {
        return new BufferedReader(new InputStreamReader(getInputStream()));
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {
        final ByteArrayInputStream bais = new ByteArrayInputStream(body);
        return new ServletInputStream() {
            @Override
            public int read() throws IOException {
                return bais.read();
            }

            @Override
            public int available() throws IOException {
                return body.length;
            }

            @Override
            public boolean isFinished() {
                return false;
            }

            @Override
            public boolean isReady() {
                return false;
            }

            @Override
            public void setReadListener(ReadListener readListener) {

            }
        };
    }
}


================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/handle/AuthenticationEntryPointImpl.java
================================================
package ginyi.framework.security.handle;

import com.alibaba.fastjson2.JSON;
import ginyi.common.constant.CommonMessageConstants;
import ginyi.common.result.CommonResult;
import ginyi.common.result.StateCode;
import ginyi.common.utils.ServletUtils;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.Serializable;

/**
 * 认证失败处理类 返回未授权
 *
 * @author ruoyi
 */
@Component
public class AuthenticationEntryPointImpl implements AuthenticationEntryPoint, Serializable {
    private static final long serialVersionUID = -8970718410437077606L;

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException e)
            throws IOException {
        ServletUtils.renderString(response, JSON.toJSONString(CommonResult.error(StateCode.ERROR_AUTHENTICATION_VALID, CommonMessageConstants.SYS_AUTHENTICATION_VALID)));
    }
}


================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/handle/LogoutSuccessHandlerImpl.java
================================================
package ginyi.framework.security.handle;

import com.alibaba.fastjson2.JSON;
import ginyi.common.result.CommonResult;
import ginyi.common.result.StateCode;
import ginyi.common.utils.Constants;
import ginyi.common.utils.ServletUtils;
import ginyi.common.utils.StringUtils;
import ginyi.framework.security.manager.AsyncManager;
import ginyi.framework.security.manager.factory.AsyncFactory;
import ginyi.system.domain.LoginUser;
import ginyi.system.service.ITokenService;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;

import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * 自定义退出处理类 返回成功
 *
 * @author ruoyi
 */
@Configuration
public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler {
    @Resource
    private ITokenService tokenService;

    /**
     * 退出处理
     *
     * @return
     */
    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
            throws IOException, ServletException {
        LoginUser loginUser = tokenService.getLoginUser(request);
        // 判断token是否存在
        if (StringUtils.isNull(loginUser)) {
            ServletUtils.renderString(response, JSON.toJSONString(CommonResult.error(StateCode.ERROR_TIMEOUT_TOKEN)));
        }

        String userName = loginUser.getUsername();
        // 删除用户缓存记录
        tokenService.delLoginUser(loginUser.getToken());
        // 记录用户退出日志
        AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功"));
        ServletUtils.renderString(response, JSON.toJSONString(CommonResult.success()));
    }
}


================================================
FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/interceptor/PreviewEnvInterceptor.java
================================================
package ginyi.framework.security.interceptor;

import cn.hutool.crypto.SecureUtil;
import cn.hutool.extra.servlet.ServletUtil;
import ginyi.common.constant.CacheConstants;
import ginyi.common.constant.CommonMessageConstants;
import ginyi.common.exception.CommonException;
import ginyi.common.redis.cache.RedisCache;
import ginyi.common.result.StateCode;
imp
Download .txt
gitextract_klywiall/

├── .gitignore
├── LICENSE
├── README.md
├── ginyi-springboot/
│   ├── .gitignore
│   ├── README.md
│   ├── ginyi-common/
│   │   ├── ginyi-common-annotation/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi.common.annotation/
│   │   │                   ├── Anonymous.java
│   │   │                   ├── CreateBy.java
│   │   │                   ├── CreateTime.java
│   │   │                   ├── Log.java
│   │   │                   ├── RepeatSubmit.java
│   │   │                   ├── UpdateBy.java
│   │   │                   └── UpdateTime.java
│   │   ├── ginyi-common-constants/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── constant/
│   │   │                           ├── CacheConstants.java
│   │   │                           ├── CommonMessageConstants.java
│   │   │                           ├── HttpStatus.java
│   │   │                           └── UserConstants.java
│   │   ├── ginyi-common-enums/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── enums/
│   │   │                           ├── BusinessStatus.java
│   │   │                           ├── BusinessType.java
│   │   │                           ├── HttpMethod.java
│   │   │                           └── OperatorType.java
│   │   ├── ginyi-common-exception/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── exception/
│   │   │                           ├── CommonException.java
│   │   │                           ├── UnPermissionException.java
│   │   │                           ├── UserPasswordNotMatchException.java
│   │   │                           ├── UserPasswordRetryLimitExceedException.java
│   │   │                           └── handler/
│   │   │                               └── GlobalExceptionHandler.java
│   │   ├── ginyi-common-mysql/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── mysql/
│   │   │                           ├── MyPage.java
│   │   │                           ├── config/
│   │   │                           │   └── MyBatisPlusInterceptorConfig.java
│   │   │                           ├── handler/
│   │   │                           │   ├── JacksonArrayTypeHandler.java
│   │   │                           │   └── MyMetaObjectHandler.java
│   │   │                           └── interceptor/
│   │   │                               └── MyInterceptor.java
│   │   ├── ginyi-common-redis/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── redis/
│   │   │                           ├── cache/
│   │   │                           │   └── RedisCache.java
│   │   │                           └── config/
│   │   │                               └── RedisConfig.java
│   │   ├── ginyi-common-result/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── result/
│   │   │                           ├── CommonResult.java
│   │   │                           └── StateCode.java
│   │   ├── ginyi-common-swagger/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── swagger/
│   │   │                           ├── AddGroup.java
│   │   │                           ├── Swagger2Config.java
│   │   │                           └── UpdateGroup.java
│   │   ├── ginyi-common-utils/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── common/
│   │   │                       └── utils/
│   │   │                           ├── Constants.java
│   │   │                           ├── DateUtils.java
│   │   │                           ├── EmailUtils.java
│   │   │                           ├── LogUtils.java
│   │   │                           ├── LunarCalendarUtil.java
│   │   │                           ├── MessageUtils.java
│   │   │                           ├── NumberUtils.java
│   │   │                           ├── ServletUtils.java
│   │   │                           ├── StringUtils.java
│   │   │                           ├── Threads.java
│   │   │                           ├── enums/
│   │   │                           │   └── UserStatus.java
│   │   │                           ├── http/
│   │   │                           │   ├── HttpHelper.java
│   │   │                           │   └── HttpUtils.java
│   │   │                           ├── ip/
│   │   │                           │   ├── AddressUtils.java
│   │   │                           │   └── IpUtils.java
│   │   │                           ├── spring/
│   │   │                           │   └── SpringUtils.java
│   │   │                           ├── text/
│   │   │                           │   ├── CharsetKit.java
│   │   │                           │   ├── Convert.java
│   │   │                           │   └── StrFormatter.java
│   │   │                           └── uuid/
│   │   │                               ├── IdUtils.java
│   │   │                               └── UUID.java
│   │   └── pom.xml
│   ├── ginyi-framework/
│   │   ├── ginyi-framework-core/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── framework/
│   │   │                       └── core/
│   │   │                           └── config/
│   │   │                               ├── AppConfig.java
│   │   │                               └── GinyiConfig.java
│   │   ├── ginyi-framework-security/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── framework/
│   │   │                       └── security/
│   │   │                           ├── aspectj/
│   │   │                           │   └── LogAspect.java
│   │   │                           ├── config/
│   │   │                           │   ├── ResourcesConfig.java
│   │   │                           │   ├── SecurityConfig.java
│   │   │                           │   └── ThreadPoolConfig.java
│   │   │                           ├── context/
│   │   │                           │   ├── AuthenticationContextHolder.java
│   │   │                           │   └── PermissionContextHolder.java
│   │   │                           ├── filter/
│   │   │                           │   ├── JwtAuthenticationTokenFilter.java
│   │   │                           │   ├── PropertyPreExcludeFilter.java
│   │   │                           │   └── RepeatedlyRequestWrapper.java
│   │   │                           ├── handle/
│   │   │                           │   ├── AuthenticationEntryPointImpl.java
│   │   │                           │   └── LogoutSuccessHandlerImpl.java
│   │   │                           ├── interceptor/
│   │   │                           │   ├── PreviewEnvInterceptor.java
│   │   │                           │   ├── RepeatSubmitInterceptor.java
│   │   │                           │   └── impl/
│   │   │                           │       └── SameUrlDataInterceptor.java
│   │   │                           ├── manager/
│   │   │                           │   ├── AsyncManager.java
│   │   │                           │   └── factory/
│   │   │                           │       └── AsyncFactory.java
│   │   │                           ├── properties/
│   │   │                           │   └── PermitAllUrlProperties.java
│   │   │                           ├── service/
│   │   │                           │   ├── ISysNoticeServiceImpl.java
│   │   │                           │   ├── MonitorServiceImpl.java
│   │   │                           │   ├── PermissionService.java
│   │   │                           │   ├── SysConfigServiceImpl.java
│   │   │                           │   ├── SysDeptServiceImpl.java
│   │   │                           │   ├── SysLogServiceImpl.java
│   │   │                           │   ├── SysLoginLogServiceImpl.java
│   │   │                           │   ├── SysLoginServiceImpl.java
│   │   │                           │   ├── SysMenuServiceImpl.java
│   │   │                           │   ├── SysMonitorServiceImpl.java
│   │   │                           │   ├── SysOperationLogServiceImpl.java
│   │   │                           │   ├── SysPasswordServiceImpl.java
│   │   │                           │   ├── SysPermissionServiceImpl.java
│   │   │                           │   ├── SysPostServiceImpl.java
│   │   │                           │   ├── SysRoleServiceImpl.java
│   │   │                           │   ├── SysUserServiceImpl.java
│   │   │                           │   ├── SysVerifyServiceImpl.java
│   │   │                           │   ├── TokenServiceImpl.java
│   │   │                           │   └── UserDetailsServiceImpl.java
│   │   │                           └── utils/
│   │   │                               └── SecurityUtils.java
│   │   ├── ginyi-framework-websocket/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           └── java/
│   │   │               └── ginyi/
│   │   │                   └── framework/
│   │   │                       └── websocket/
│   │   │                           ├── WebSocket.java
│   │   │                           └── config/
│   │   │                               └── WebSocketConfig.java
│   │   └── pom.xml
│   ├── ginyi-server/
│   │   ├── ginyi-server-admin/
│   │   │   ├── Dockerfile
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ginyi/
│   │   │           │       └── server/
│   │   │           │           └── admin/
│   │   │           │               ├── AdminApplication.java
│   │   │           │               ├── controller/
│   │   │           │               │   ├── SysDeptController.java
│   │   │           │               │   ├── SysLogController.java
│   │   │           │               │   ├── SysLoginController.java
│   │   │           │               │   ├── SysMenuController.java
│   │   │           │               │   ├── SysMonitorController.java
│   │   │           │               │   ├── SysNoticeController.java
│   │   │           │               │   ├── SysOnlineController.java
│   │   │           │               │   ├── SysPostController.java
│   │   │           │               │   ├── SysRoleController.java
│   │   │           │               │   ├── SysUserController.java
│   │   │           │               │   └── SysVerifyController.java
│   │   │           │               └── swagger/
│   │   │           │                   └── AdminSwagger2Config.java
│   │   │           └── resources/
│   │   │               ├── config/
│   │   │               │   └── application.yml
│   │   │               └── static/
│   │   │                   └── i18n/
│   │   │                       └── messages.properties
│   │   ├── ginyi-server-common/
│   │   │   └── pom.xml
│   │   ├── ginyi-server-web/
│   │   │   ├── pom.xml
│   │   │   └── src/
│   │   │       └── main/
│   │   │           ├── java/
│   │   │           │   └── ginyi/
│   │   │           │       └── server/
│   │   │           │           └── web/
│   │   │           │               ├── WebApplication.java
│   │   │           │               ├── controller/
│   │   │           │               │   └── Test.java
│   │   │           │               └── swagger/
│   │   │           │                   └── WebSwagger2Config.java
│   │   │           └── resources/
│   │   │               └── config/
│   │   │                   └── application.yml
│   │   └── pom.xml
│   ├── ginyi-system/
│   │   ├── pom.xml
│   │   └── src/
│   │       └── main/
│   │           ├── java/
│   │           │   └── ginyi/
│   │           │       └── system/
│   │           │           ├── domain/
│   │           │           │   ├── BaseEntity.java
│   │           │           │   ├── LoginUser.java
│   │           │           │   ├── Sys.java
│   │           │           │   ├── SysConfig.java
│   │           │           │   ├── SysCpu.java
│   │           │           │   ├── SysDept.java
│   │           │           │   ├── SysFile.java
│   │           │           │   ├── SysJvm.java
│   │           │           │   ├── SysLogLogin.java
│   │           │           │   ├── SysLogOperation.java
│   │           │           │   ├── SysMemory.java
│   │           │           │   ├── SysMenu.java
│   │           │           │   ├── SysNotice.java
│   │           │           │   ├── SysPost.java
│   │           │           │   ├── SysRole.java
│   │           │           │   ├── SysServer.java
│   │           │           │   ├── SysUser.java
│   │           │           │   └── model/
│   │           │           │       ├── dto/
│   │           │           │       │   ├── CacheDto.java
│   │           │           │       │   ├── DeptDto.java
│   │           │           │       │   ├── LoginDto.java
│   │           │           │       │   ├── MenuDto.java
│   │           │           │       │   ├── NoticeDto.java
│   │           │           │       │   ├── PostDto.java
│   │           │           │       │   ├── RegisterDto.java
│   │           │           │       │   ├── RoleDto.java
│   │           │           │       │   └── UserDto.java
│   │           │           │       └── vo/
│   │           │           │           ├── BaseVo.java
│   │           │           │           ├── CacheKeyVo.java
│   │           │           │           ├── CacheVo.java
│   │           │           │           ├── DeptVo.java
│   │           │           │           ├── LoginVo.java
│   │           │           │           ├── NoticeVo.java
│   │           │           │           ├── PostVo.java
│   │           │           │           ├── RoleVo.java
│   │           │           │           ├── SessionUserVo.java
│   │           │           │           └── UserVo.java
│   │           │           ├── mapper/
│   │           │           │   ├── SysConfigMapper.java
│   │           │           │   ├── SysDeptMapper.java
│   │           │           │   ├── SysLogininforMapper.java
│   │           │           │   ├── SysMenuMapper.java
│   │           │           │   ├── SysNoticeMapper.java
│   │           │           │   ├── SysOperLogMapper.java
│   │           │           │   ├── SysPostMapper.java
│   │           │           │   ├── SysRoleMapper.java
│   │           │           │   └── SysUserMapper.java
│   │           │           └── service/
│   │           │               ├── ISysConfigService.java
│   │           │               ├── ISysDeptService.java
│   │           │               ├── ISysLogService.java
│   │           │               ├── ISysLoginService.java
│   │           │               ├── ISysLogininforService.java
│   │           │               ├── ISysMenuService.java
│   │           │               ├── ISysMonitorService.java
│   │           │               ├── ISysNoticeService.java
│   │           │               ├── ISysOnlineService.java
│   │           │               ├── ISysOperLogService.java
│   │           │               ├── ISysPasswordService.java
│   │           │               ├── ISysPermissionService.java
│   │           │               ├── ISysPostService.java
│   │           │               ├── ISysRoleService.java
│   │           │               ├── ISysUserService.java
│   │           │               ├── ITokenService.java
│   │           │               └── IVerifyService.java
│   │           └── resources/
│   │               ├── application.yml
│   │               ├── logging-config.xml
│   │               └── mapper/
│   │                   ├── SysDeptMapper.xml
│   │                   ├── SysMenuMapper.xml
│   │                   ├── SysNoticeMapper.xml
│   │                   ├── SysPostMapper.xml
│   │                   ├── SysRoleMapper.xml
│   │                   └── SysUserMapper.xml
│   ├── pom.xml
│   └── sql/
│       ├── ginyi-spring-vue-mongo.sql
│       └── ginyi-spring-vue-mysql.sql
└── ginyi-vue3/
    ├── .editorconfig
    ├── .gitignore
    ├── README.md
    ├── index.html
    ├── package.json
    ├── src/
    │   ├── App.vue
    │   ├── api/
    │   │   ├── controller/
    │   │   │   ├── deptController.ts
    │   │   │   ├── logController.ts
    │   │   │   ├── menuController.ts
    │   │   │   ├── monitorController.ts
    │   │   │   ├── onlineController.ts
    │   │   │   ├── postController.ts
    │   │   │   ├── roleController.ts
    │   │   │   └── userController.ts
    │   │   ├── index.ts
    │   │   └── useRequest.tsx
    │   ├── components/
    │   │   ├── commonForm/
    │   │   │   ├── index.vue
    │   │   │   ├── props.ts
    │   │   │   └── useCommonForm.ts
    │   │   ├── commonModal/
    │   │   │   ├── index.vue
    │   │   │   ├── props.ts
    │   │   │   └── useCommonModal.ts
    │   │   ├── commonTable/
    │   │   │   ├── index.vue
    │   │   │   ├── props.ts
    │   │   │   └── useCommonTable.ts
    │   │   └── monacoEditor/
    │   │       ├── index.vue
    │   │       └── monacoEditorType.ts
    │   ├── config/
    │   │   ├── console.log.ts
    │   │   ├── eventBus.ts
    │   │   └── setting.ts
    │   ├── dictionary/
    │   │   ├── useDynamicDict.ts
    │   │   └── useStaticDict.ts
    │   ├── directives/
    │   │   ├── draggable.ts
    │   │   ├── focus.ts
    │   │   ├── index.ts
    │   │   └── loading.ts
    │   ├── enums/
    │   │   ├── storeKeyEnums.ts
    │   │   └── tableActionEnums.ts
    │   ├── hooks/
    │   │   ├── useColor.ts
    │   │   ├── useCommonColums.ts
    │   │   ├── useDebthro.ts
    │   │   ├── useFormat.ts
    │   │   ├── useMenu.ts
    │   │   ├── useObject.ts
    │   │   ├── usePagination.ts
    │   │   ├── usePending.ts
    │   │   ├── useStorage.ts
    │   │   └── useTree.ts
    │   ├── interface/
    │   │   └── modules/
    │   │       └── system/
    │   │           └── index.ts
    │   ├── layout/
    │   │   ├── header/
    │   │   │   ├── breadcrumb.vue
    │   │   │   ├── index.vue
    │   │   │   └── personnel.vue
    │   │   ├── index.vue
    │   │   ├── logo/
    │   │   │   └── index.vue
    │   │   ├── menu/
    │   │   │   └── index.vue
    │   │   ├── tabs/
    │   │   │   └── index.vue
    │   │   └── theme/
    │   │       └── index.vue
    │   ├── main.ts
    │   ├── plugins/
    │   │   ├── naive-ui/
    │   │   │   └── common.tsx
    │   │   └── pinia/
    │   │       └── piniaPlugin.ts
    │   ├── router/
    │   │   └── index.ts
    │   ├── store/
    │   │   ├── index.ts
    │   │   └── modules/
    │   │       ├── useRouterStore.ts
    │   │       ├── useSystemStore.ts
    │   │       └── useUserStore.ts
    │   ├── style/
    │   │   └── index.css
    │   ├── views/
    │   │   ├── 404/
    │   │   │   └── index.vue
    │   │   ├── home/
    │   │   │   └── index.vue
    │   │   ├── login/
    │   │   │   ├── index.vue
    │   │   │   ├── loginForm.vue
    │   │   │   └── registerForm.vue
    │   │   └── pages/
    │   │       ├── monitor/
    │   │       │   ├── cache/
    │   │       │   │   └── index.vue
    │   │       │   ├── cacheList/
    │   │       │   │   ├── columns.tsx
    │   │       │   │   └── index.vue
    │   │       │   ├── data/
    │   │       │   │   └── index.vue
    │   │       │   ├── online/
    │   │       │   │   ├── columns.tsx
    │   │       │   │   └── index.vue
    │   │       │   ├── service/
    │   │       │   │   ├── columns.tsx
    │   │       │   │   └── index.vue
    │   │       │   └── task/
    │   │       │       └── index.vue
    │   │       ├── order/
    │   │       │   └── index.vue
    │   │       ├── product/
    │   │       │   └── index.vue
    │   │       ├── system/
    │   │       │   ├── department/
    │   │       │   │   ├── columns.tsx
    │   │       │   │   ├── deptEditForm.vue
    │   │       │   │   ├── deptQueryForm.vue
    │   │       │   │   └── index.vue
    │   │       │   ├── dict/
    │   │       │   │   └── index.vue
    │   │       │   ├── log/
    │   │       │   │   ├── login/
    │   │       │   │   │   ├── columns.tsx
    │   │       │   │   │   └── index.vue
    │   │       │   │   └── operation/
    │   │       │   │       ├── columns.tsx
    │   │       │   │       ├── index.vue
    │   │       │   │       └── useColumns.ts
    │   │       │   ├── menu/
    │   │       │   │   ├── columns.tsx
    │   │       │   │   ├── index.vue
    │   │       │   │   ├── menuEditForm.vue
    │   │       │   │   ├── menuQueryForm.vue
    │   │       │   │   └── useColumns.ts
    │   │       │   ├── notice/
    │   │       │   │   └── index.vue
    │   │       │   ├── params/
    │   │       │   │   └── index.vue
    │   │       │   ├── position/
    │   │       │   │   ├── columns.tsx
    │   │       │   │   ├── index.vue
    │   │       │   │   ├── postEditForm.vue
    │   │       │   │   └── postQueryForm.vue
    │   │       │   ├── role/
    │   │       │   │   ├── columns.tsx
    │   │       │   │   ├── index.vue
    │   │       │   │   ├── roleEditForm.vue
    │   │       │   │   └── roleQueryForm.vue
    │   │       │   └── user/
    │   │       │       ├── columns.tsx
    │   │       │       ├── index.vue
    │   │       │       ├── useColumns.ts
    │   │       │       ├── userEditForm.vue
    │   │       │       └── userQueryForm.vue
    │   │       └── systools/
    │   │           └── code/
    │   │               └── index.vue
    │   └── vite-env.d.ts
    ├── tsconfig.json
    ├── tsconfig.node.json
    ├── vite.config.ts
    └── web-types.json
Download .txt
SYMBOL INDEX (867 symbols across 192 files)

FILE: ginyi-springboot/ginyi-common/ginyi-common-constants/src/main/java/ginyi/common/constant/CacheConstants.java
  class CacheConstants (line 8) | public class CacheConstants {

FILE: ginyi-springboot/ginyi-common/ginyi-common-constants/src/main/java/ginyi/common/constant/CommonMessageConstants.java
  class CommonMessageConstants (line 6) | public class CommonMessageConstants {

FILE: ginyi-springboot/ginyi-common/ginyi-common-constants/src/main/java/ginyi/common/constant/HttpStatus.java
  class HttpStatus (line 8) | public class HttpStatus

FILE: ginyi-springboot/ginyi-common/ginyi-common-constants/src/main/java/ginyi/common/constant/UserConstants.java
  class UserConstants (line 8) | public class UserConstants {

FILE: ginyi-springboot/ginyi-common/ginyi-common-enums/src/main/java/ginyi/common/enums/BusinessStatus.java
  type BusinessStatus (line 8) | public enum BusinessStatus {

FILE: ginyi-springboot/ginyi-common/ginyi-common-enums/src/main/java/ginyi/common/enums/BusinessType.java
  type BusinessType (line 8) | public enum BusinessType {

FILE: ginyi-springboot/ginyi-common/ginyi-common-enums/src/main/java/ginyi/common/enums/HttpMethod.java
  type HttpMethod (line 13) | public enum HttpMethod {
    method resolve (line 24) | @Nullable
    method matches (line 29) | public boolean matches(String method) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-enums/src/main/java/ginyi/common/enums/OperatorType.java
  type OperatorType (line 8) | public enum OperatorType {

FILE: ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/CommonException.java
  class CommonException (line 9) | @Data
    method CommonException (line 15) | public CommonException(StateCode state, Object data) {
    method CommonException (line 20) | public CommonException(StateCode state) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/UnPermissionException.java
  class UnPermissionException (line 9) | @Data

FILE: ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/UserPasswordNotMatchException.java
  class UserPasswordNotMatchException (line 6) | public class UserPasswordNotMatchException extends RuntimeException{

FILE: ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/UserPasswordRetryLimitExceedException.java
  class UserPasswordRetryLimitExceedException (line 9) | @Data
    method UserPasswordRetryLimitExceedException (line 16) | public UserPasswordRetryLimitExceedException(StateCode state, Object d...
    method UserPasswordRetryLimitExceedException (line 21) | public UserPasswordRetryLimitExceedException(StateCode state) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/handler/GlobalExceptionHandler.java
  class GlobalExceptionHandler (line 29) | @RestControllerAdvice
    method BusinessExceptionHandler (line 39) | @ExceptionHandler(CommonException.class)
    method MethodArgumentNotValidExceptionHandler (line 54) | @ExceptionHandler(MethodArgumentNotValidException.class)
    method HttpMessageNotReadableExceptionHandler (line 73) | @ResponseStatus(HttpStatus.OK)
    method UserPasswordNotMatchExceptionHandler (line 82) | @ResponseStatus(HttpStatus.OK)
    method UserPasswordRetryLimitExceedExceptionHandler (line 91) | @ResponseStatus(HttpStatus.OK)
    method MultipartExceptionHandler (line 104) | @ExceptionHandler(MultipartException.class)
    method UnPermissionExceptionHandler (line 119) | @ExceptionHandler({UnPermissionException.class})
    method ExceptionHandler (line 132) | @ExceptionHandler(Exception.class)

FILE: ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/MyPage.java
  class MyPage (line 9) | @Data
    method MyPage (line 25) | public MyPage() {
    method MyPage (line 28) | public MyPage(Long page, Long pageSize) {
    method getPage (line 40) | public Page getPage(){

FILE: ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/config/MyBatisPlusInterceptorConfig.java
  class MyBatisPlusInterceptorConfig (line 9) | @Configuration
    method myBatisPlusInterceptor (line 12) | @Bean

FILE: ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/handler/JacksonArrayTypeHandler.java
  class JacksonArrayTypeHandler (line 11) | @Slf4j
    method JacksonArrayTypeHandler (line 18) | public JacksonArrayTypeHandler(Class<?> type) {
    method parse (line 24) | @SneakyThrows
    method toJson (line 34) | @SneakyThrows

FILE: ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/handler/MyMetaObjectHandler.java
  class MyMetaObjectHandler (line 12) | @Slf4j
    method insertFill (line 24) | @Override
    method updateFill (line 37) | @Override

FILE: ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/interceptor/MyInterceptor.java
  class MyInterceptor (line 28) | @Component
    method intercept (line 39) | @Override
    method setParameter (line 65) | public void setParameter(Object parameter, SqlCommandType sqlCommandTy...

FILE: ginyi-springboot/ginyi-common/ginyi-common-redis/src/main/java/ginyi/common/redis/cache/RedisCache.java
  class RedisCache (line 19) | @SuppressWarnings(value = {"unchecked", "rawtypes"})
    method setCacheObject (line 31) | public <T> void setCacheObject(final String key, final T value) {
    method setCacheObject (line 43) | public <T> void setCacheObject(final String key, final T value, final ...
    method expire (line 54) | public boolean expire(final String key, final long timeout) {
    method expire (line 66) | public boolean expire(final String key, final long timeout, final Time...
    method getExpire (line 76) | public long getExpire(final String key) {
    method hasKey (line 86) | public Boolean hasKey(String key) {
    method getType (line 95) | public DataType getType(String key){
    method getCacheObject (line 105) | public <T> T getCacheObject(final String key, Class<T> clazz) {
    method removeCacheObject (line 118) | public boolean removeCacheObject(final String key) {
    method removeCacheObject (line 129) | public boolean removeCacheObject(final Collection collection) {
    method getKeys (line 138) | public Set<String> getKeys(final String key) {
    method getValue (line 147) | public Object getValue(String key){
    method setCacheList (line 158) | public <T> long setCacheList(final String key, final List<T> dataList) {
    method getCacheList (line 169) | public <T> List<T> getCacheList(final String key, Class<T> clazz) {
    method setCacheSet (line 186) | public <T> BoundSetOperations<String, T> setCacheSet(final String key,...
    method getCacheSet (line 201) | public <T> Set<T> getCacheSet(final String key) {
    method setCacheMap (line 211) | public <T> void setCacheMap(final String key, final Map<String, T> dat...
    method getCacheMap (line 223) | public <T> Map<String, T> getCacheMap(final String key) {
    method setCacheMapValue (line 234) | public <T> void setCacheMapValue(final String key, final String hKey, ...
    method getCacheMapValue (line 245) | public <T> T getCacheMapValue(final String key, final String hKey) {
    method getMultiCacheMapValue (line 257) | public <T> List<T> getMultiCacheMapValue(final String key, final Colle...
    method deleteCacheMapValue (line 268) | public boolean deleteCacheMapValue(final String key, final String hKey) {
    method keys (line 278) | public Collection<String> keys(final String pattern) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-redis/src/main/java/ginyi/common/redis/config/RedisConfig.java
  class RedisConfig (line 16) | @Configuration
    method redisTemplate (line 21) | @Bean
    method limitScript (line 40) | @Bean
    method limitScriptText (line 51) | private String limitScriptText() {

FILE: ginyi-springboot/ginyi-common/ginyi-common-result/src/main/java/ginyi/common/result/CommonResult.java
  class CommonResult (line 9) | @Data
    method res (line 31) | private static <T> CommonResult<T> res(StateCode state, T data){
    method success (line 44) | public static <T> CommonResult<T> success(){
    method success (line 54) | public static <T> CommonResult<T> success(T data){
    method error (line 63) | public static <T> CommonResult<T> error(StateCode state){
    method error (line 73) | public static <T> CommonResult<T> error(StateCode state, T data){

FILE: ginyi-springboot/ginyi-common/ginyi-common-result/src/main/java/ginyi/common/result/StateCode.java
  type StateCode (line 4) | public enum StateCode {
    method StateCode (line 33) | StateCode(final int code, final String message) {
    method getCode (line 38) | public int getCode(){
    method getMessage (line 42) | public String getMessage() {

FILE: ginyi-springboot/ginyi-common/ginyi-common-swagger/src/main/java/ginyi/common/swagger/AddGroup.java
  type AddGroup (line 6) | public interface AddGroup {

FILE: ginyi-springboot/ginyi-common/ginyi-common-swagger/src/main/java/ginyi/common/swagger/Swagger2Config.java
  class Swagger2Config (line 20) | public class Swagger2Config {
    method createAdminApiDoc (line 65) | @Bean
    method apiInfo (line 77) | private ApiInfo apiInfo() {

FILE: ginyi-springboot/ginyi-common/ginyi-common-swagger/src/main/java/ginyi/common/swagger/UpdateGroup.java
  type UpdateGroup (line 6) | public interface UpdateGroup {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/Constants.java
  class Constants (line 8) | public class Constants {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/DateUtils.java
  class DateUtils (line 16) | public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
    method getNowDate (line 37) | public static Date getNowDate() {
    method getDate (line 46) | public static String getDate() {
    method getTime (line 50) | public static final String getTime() {
    method dateTimeNow (line 54) | public static final String dateTimeNow() {
    method dateTimeNow (line 58) | public static final String dateTimeNow(final String format) {
    method dateTime (line 62) | public static final String dateTime(final Date date) {
    method parseDateToStr (line 66) | public static final String parseDateToStr(final String format, final D...
    method dateTime (line 70) | public static final Date dateTime(final String format, final String ts) {
    method datePath (line 81) | public static final String datePath() {
    method dateTime (line 89) | public static final String dateTime() {
    method parseDate (line 97) | public static Date parseDate(Object str) {
    method getServerStartDate (line 111) | public static Date getServerStartDate() {
    method differentDaysByMillisecond (line 119) | public static int differentDaysByMillisecond(Date date1, Date date2) {
    method getDatePoor (line 126) | public static String getDatePoor(Date endDate, Date nowDate) {
    method toDate (line 147) | public static Date toDate(LocalDateTime temporalAccessor) {
    method toDate (line 155) | public static Date toDate(LocalDate temporalAccessor) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/EmailUtils.java
  class EmailUtils (line 11) | public class EmailUtils {
    method sendToOne (line 21) | public static boolean sendToOne(String to, String subject, String mess...

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/LogUtils.java
  class LogUtils (line 8) | public class LogUtils {
    method getBlock (line 9) | public static String getBlock(Object msg) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/LunarCalendarUtil.java
  class LunarCalendarUtil (line 9) | public class LunarCalendarUtil {
    method lunarToSolar (line 87) | public static final int[] lunarToSolar(int year, int month, int monthD...
    method solarToLunar (line 174) | public static final int[] solarToLunar(int year, int month, int monthD...
    method daysInMonth (line 226) | final public static int daysInMonth(int year, int month) {
    method daysInMonth (line 238) | public static final int daysInMonth(int year, int month, boolean leap) {
    method daysInLunarYear (line 263) | private static int daysInLunarYear(int year) {
    method daysInLunarMonth (line 284) | public static int daysInLunarMonth(int year, int month) {
    method leapMonth (line 298) | public static int leapMonth(int year) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/MessageUtils.java
  class MessageUtils (line 12) | public class MessageUtils {
    method message (line 20) | public static String message(String code, Object... args) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/NumberUtils.java
  class NumberUtils (line 6) | public class NumberUtils {
    method round (line 8) | public static double round(double number, int decimalPlaces) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/ServletUtils.java
  class ServletUtils (line 25) | public class ServletUtils {
    method getParameter (line 29) | public static String getParameter(String name) {
    method getParameter (line 36) | public static String getParameter(String name, String defaultValue) {
    method getParameterToInt (line 43) | public static Integer getParameterToInt(String name) {
    method getParameterToInt (line 50) | public static Integer getParameterToInt(String name, Integer defaultVa...
    method getParameterToBool (line 57) | public static Boolean getParameterToBool(String name) {
    method getParameterToBool (line 64) | public static Boolean getParameterToBool(String name, Boolean defaultV...
    method getParams (line 74) | public static Map<String, String[]> getParams(ServletRequest request) {
    method getParamMap (line 85) | public static Map<String, String> getParamMap(ServletRequest request) {
    method getRequest (line 96) | public static HttpServletRequest getRequest() {
    method getResponse (line 103) | public static HttpServletResponse getResponse() {
    method getSession (line 110) | public static HttpSession getSession() {
    method getRequestAttributes (line 114) | public static ServletRequestAttributes getRequestAttributes() {
    method renderString (line 125) | public static void renderString(HttpServletResponse response, String s...
    method isAjaxRequest (line 141) | public static boolean isAjaxRequest(HttpServletRequest request) {
    method urlEncode (line 167) | public static String urlEncode(String str) {
    method urlDecode (line 181) | public static String urlDecode(String str) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/StringUtils.java
  class StringUtils (line 10) | public class StringUtils extends org.apache.commons.lang3.StringUtils {
    method isEmpty (line 24) | public static boolean isEmpty(String str) {
    method isNull (line 34) | public static boolean isNull(Object object) {
    method isNotNull (line 44) | public static boolean isNotNull(Object object) {
    method nvl (line 54) | public static <T> T nvl(T value, T defaultValue) {
    method inStringIgnoreCase (line 65) | public static boolean inStringIgnoreCase(String str, String... strs) {
    method trim (line 79) | public static String trim(String str) {
    method format (line 97) | public static String format(String template, Object... params) {
    method isEmpty (line 110) | public static boolean isEmpty(Object[] objects) {
    method isNotEmpty (line 120) | public static boolean isNotEmpty(Object[] objects) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/Threads.java
  class Threads (line 13) | public class Threads {
    method sleep (line 19) | public static void sleep(long milliseconds) {
    method shutdownAndAwaitTermination (line 34) | public static void shutdownAndAwaitTermination(ExecutorService pool) {
    method printException (line 54) | public static void printException(Runnable r, Throwable t) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/enums/UserStatus.java
  type UserStatus (line 8) | public enum UserStatus {
    method UserStatus (line 14) | UserStatus(String code, String info) {
    method getCode (line 19) | public String getCode() {
    method getInfo (line 23) | public String getInfo() {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/http/HttpHelper.java
  class HttpHelper (line 19) | public class HttpHelper {
    method getBodyString (line 22) | public static String getBodyString(ServletRequest request) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/http/HttpUtils.java
  class HttpUtils (line 22) | public class HttpUtils {
    method sendGet (line 31) | public static String sendGet(String url) {
    method sendGet (line 42) | public static String sendGet(String url, String param) {
    method sendGet (line 54) | public static String sendGet(String url, String param, String contentT...
    method sendPost (line 99) | public static String sendPost(String url, String param) {
    method sendSSLPost (line 146) | public static String sendSSLPost(String url, String param) {
    class TrustAnyTrustManager (line 189) | private static class TrustAnyTrustManager implements X509TrustManager {
      method checkClientTrusted (line 190) | @Override
      method checkServerTrusted (line 194) | @Override
      method getAcceptedIssuers (line 198) | @Override
    class TrustAnyHostnameVerifier (line 204) | private static class TrustAnyHostnameVerifier implements HostnameVerif...
      method verify (line 205) | @Override

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/ip/AddressUtils.java
  class AddressUtils (line 16) | public class AddressUtils {
    method getRealAddressByIP (line 25) | public static String getRealAddressByIP(String ip) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/ip/IpUtils.java
  class IpUtils (line 14) | public class IpUtils {
    method getIpAddr (line 21) | public static String getIpAddr(HttpServletRequest request) {
    method internalIp (line 52) | public static boolean internalIp(String ip) {
    method internalIp (line 63) | private static boolean internalIp(byte[] addr) {
    method textToNumericFormatV4 (line 101) | public static byte[] textToNumericFormatV4(String text) {
    method getHostIp (line 174) | public static String getHostIp() {
    method getHostName (line 187) | public static String getHostName() {
    method getMultistageReverseProxyIp (line 201) | public static String getMultistageReverseProxyIp(String ip) {
    method isUnknown (line 221) | public static boolean isUnknown(String checkString) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/spring/SpringUtils.java
  class SpringUtils (line 18) | @Component
    method postProcessBeanFactory (line 28) | @Override
    method setApplicationContext (line 33) | @Override
    method getBean (line 45) | @SuppressWarnings("unchecked")
    method getBean (line 57) | public static <T> T getBean(Class<T> clz) throws BeansException {
    method containsBean (line 68) | public static boolean containsBean(String name) {
    method isSingleton (line 79) | public static boolean isSingleton(String name) throws NoSuchBeanDefini...
    method getType (line 88) | public static Class<?> getType(String name) throws NoSuchBeanDefinitio...
    method getAliases (line 99) | public static String[] getAliases(String name) throws NoSuchBeanDefini...
    method getAopProxy (line 109) | @SuppressWarnings("unchecked")
    method getActiveProfiles (line 119) | public static String[] getActiveProfiles() {
    method getActiveProfile (line 128) | public static String getActiveProfile() {
    method getRequiredProperty (line 139) | public static String getRequiredProperty(String key) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/text/CharsetKit.java
  class CharsetKit (line 13) | public class CharsetKit {
    method charset (line 46) | public static Charset charset(String charset) {
    method convert (line 58) | public static String convert(String source, String srcCharset, String ...
    method convert (line 70) | public static String convert(String source, Charset srcCharset, Charse...
    method systemCharset (line 88) | public static String systemCharset() {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/text/Convert.java
  class Convert (line 9) | public class Convert {
    method toStr (line 20) | public static String toStr(Object value, String defaultValue) {
    method toStr (line 38) | public static String toStr(Object value) {
    method toBool (line 51) | public static Boolean toBool(Object value) {
    method toBool (line 64) | public static Boolean toBool(Object value, Boolean defaultValue) {
    method toInt (line 99) | public static Integer toInt(Object value) {
    method toInt (line 112) | public static Integer toInt(Object value, Integer defaultValue) {
    method utf8Str (line 140) | public static String utf8Str(Object obj) {
    method str (line 152) | public static String str(Object obj, Charset charset) {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/text/StrFormatter.java
  class StrFormatter (line 10) | public class StrFormatter {
    method format (line 29) | public static String format(final String strPattern, final Object... a...

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/uuid/IdUtils.java
  class IdUtils (line 8) | public class IdUtils {
    method randomUUID (line 14) | public static String randomUUID() {
    method simpleUUID (line 23) | public static String simpleUUID() {
    method fastUUID (line 32) | public static String fastUUID() {
    method fastSimpleUUID (line 41) | public static String fastSimpleUUID() {

FILE: ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/uuid/UUID.java
  class UUID (line 16) | public final class UUID implements java.io.Serializable, Comparable<UUID> {
    class Holder (line 22) | private static class Holder {
    method UUID (line 41) | private UUID(byte[] data) {
    method UUID (line 61) | public UUID(long mostSigBits, long leastSigBits) {
    method fastUUID (line 71) | public static UUID fastUUID() {
    method randomUUID (line 80) | public static UUID randomUUID() {
    method randomUUID (line 90) | public static UUID randomUUID(boolean isSecure) {
    method nameUUIDFromBytes (line 108) | public static UUID nameUUIDFromBytes(byte[] name) {
    method fromString (line 130) | public static UUID fromString(String name) {
    method getLeastSignificantBits (line 157) | public long getLeastSignificantBits() {
    method getMostSignificantBits (line 166) | public long getMostSignificantBits() {
    method version (line 183) | public int version() {
    method variant (line 201) | public int variant() {
    method timestamp (line 223) | public long timestamp() throws UnsupportedOperationException {
    method clockSequence (line 242) | public int clockSequence() throws UnsupportedOperationException {
    method node (line 259) | public long node() throws UnsupportedOperationException {
    method toString (line 288) | @Override
    method toString (line 317) | public String toString(boolean isSimple) {
    method hashCode (line 350) | @Override
    method equals (line 364) | @Override
    method compareTo (line 384) | @Override
    method digits (line 405) | private static String digits(long val, int digits) {
    method checkTimeBase (line 413) | private void checkTimeBase() {
    method getSecureRandom (line 424) | public static SecureRandom getSecureRandom() {
    method getRandom (line 438) | public static ThreadLocalRandom getRandom() {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-core/src/main/java/ginyi/framework/core/config/AppConfig.java
  class AppConfig (line 11) | @Slf4j
    method colorPrint (line 17) | public static String colorPrint(String s, Ansi.Color color) {
    method printAppInfo (line 21) | public static void printAppInfo(ConfigurableApplicationContext context...

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-core/src/main/java/ginyi/framework/core/config/GinyiConfig.java
  class GinyiConfig (line 13) | @Component
    method getImportPath (line 25) | public static String getImportPath() {
    method getAvatarPath (line 32) | public static String getAvatarPath() {
    method getDownloadPath (line 39) | public static String getDownloadPath() {
    method getUploadPath (line 46) | public static String getUploadPath() {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/aspectj/LogAspect.java
  class LogAspect (line 47) | @Aspect
    method doAfterReturning (line 61) | @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "...
    method doAfterThrowing (line 72) | @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e")
    method handleLog (line 77) | protected void handleLog(final JoinPoint joinPoint, Log controllerLog,...
    method handleException (line 136) | private String handleException(Exception e) {
    method getControllerMethodDescription (line 204) | public void getControllerMethodDescription(JoinPoint joinPoint, Log lo...
    method setRequestValue (line 228) | private void setRequestValue(JoinPoint joinPoint, SysLogOperation oper...
    method argsArrayToString (line 242) | private String argsArrayToString(Object[] paramsArray) {
    method excludePropertyPreFilter (line 261) | public PropertyPreExcludeFilter excludePropertyPreFilter() {
    method isFilterObject (line 271) | @SuppressWarnings("rawtypes")
    method colorPrint (line 295) | public static String colorPrint(String s, Ansi.Color color) {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/config/ResourcesConfig.java
  class ResourcesConfig (line 26) | @Configuration
    method addResourceHandlers (line 34) | @Override
    method addInterceptors (line 50) | @Override
    method corsFilter (line 59) | @Bean

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/config/SecurityConfig.java
  class SecurityConfig (line 29) | @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
    method authenticationManagerBean (line 73) | @Bean
    method configure (line 94) | @Override
    method bCryptPasswordEncoder (line 134) | @Bean
    method configure (line 142) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/config/ThreadPoolConfig.java
  class ThreadPoolConfig (line 18) | @Configuration
    method threadPoolTaskExecutor (line 32) | @Bean(name = "threadPoolTaskExecutor")
    method scheduledExecutorService (line 47) | @Bean(name = "scheduledExecutorService")

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/context/AuthenticationContextHolder.java
  class AuthenticationContextHolder (line 10) | public class AuthenticationContextHolder {
    method getContext (line 13) | public static Authentication getContext() {
    method setContext (line 17) | public static void setContext(Authentication context) {
    method clearContext (line 21) | public static void clearContext() {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/context/PermissionContextHolder.java
  class PermissionContextHolder (line 12) | public class PermissionContextHolder {
    method setContext (line 15) | public static void setContext(String permission) {
    method getContext (line 20) | public static String getContext() {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/filter/JwtAuthenticationTokenFilter.java
  class JwtAuthenticationTokenFilter (line 25) | @Component
    method doFilterInternal (line 30) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/filter/PropertyPreExcludeFilter.java
  class PropertyPreExcludeFilter (line 10) | public class PropertyPreExcludeFilter extends SimplePropertyPreFilter {
    method PropertyPreExcludeFilter (line 11) | public PropertyPreExcludeFilter() {
    method addExcludes (line 14) | public PropertyPreExcludeFilter addExcludes(String... filters) {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/filter/RepeatedlyRequestWrapper.java
  class RepeatedlyRequestWrapper (line 21) | public class RepeatedlyRequestWrapper extends HttpServletRequestWrapper {
    method RepeatedlyRequestWrapper (line 24) | public RepeatedlyRequestWrapper(HttpServletRequest request, ServletRes...
    method getReader (line 32) | @Override
    method getInputStream (line 37) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/handle/AuthenticationEntryPointImpl.java
  class AuthenticationEntryPointImpl (line 22) | @Component
    method commence (line 26) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/handle/LogoutSuccessHandlerImpl.java
  class LogoutSuccessHandlerImpl (line 28) | @Configuration
    method onLogoutSuccess (line 38) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/interceptor/PreviewEnvInterceptor.java
  class PreviewEnvInterceptor (line 21) | @Slf4j
    method preHandle (line 30) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/interceptor/RepeatSubmitInterceptor.java
  class RepeatSubmitInterceptor (line 21) | @Component
    method preHandle (line 23) | @Override
    method isRepeatSubmit (line 49) | public abstract boolean isRepeatSubmit(HttpServletRequest request, Rep...

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/interceptor/impl/SameUrlDataInterceptor.java
  class SameUrlDataInterceptor (line 26) | @Component
    method isRepeatSubmit (line 39) | @SuppressWarnings("unchecked")
    method compareParams (line 84) | private boolean compareParams(Map<String, Object> nowMap, Map<String, ...
    method compareTime (line 93) | private boolean compareTime(Map<String, Object> nowMap, Map<String, Ob...

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/manager/AsyncManager.java
  class AsyncManager (line 15) | public class AsyncManager {
    method AsyncManager (line 29) | private AsyncManager() {
    method me (line 34) | public static AsyncManager me() {
    method execute (line 43) | public void execute(TimerTask task) {
    method shutdown (line 50) | public void shutdown() {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/manager/factory/AsyncFactory.java
  class AsyncFactory (line 26) | @Slf4j
    method recordLogininfor (line 39) | public static TimerTask recordLogininfor(final String username, final ...
    method recordOper (line 85) | public static TimerTask recordOper(final SysLogOperation operLog) {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/properties/PermitAllUrlProperties.java
  class PermitAllUrlProperties (line 26) | @Configuration
    method afterPropertiesSet (line 37) | @Override
    method setApplicationContext (line 57) | @Override
    method getUrls (line 62) | public List<String> getUrls() {
    method setUrls (line 66) | public void setUrls(List<String> urls) {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/ISysNoticeServiceImpl.java
  class ISysNoticeServiceImpl (line 31) | @Slf4j
    method list (line 49) | @Override
    method getUserNoticeList (line 68) | @Override
    method add (line 96) | @Override
    method updateNotice (line 125) | @Override
    method haveRead (line 150) | @Override
    method remove (line 190) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/MonitorServiceImpl.java
  class MonitorServiceImpl (line 22) | @Slf4j
    method getOnlineUserList (line 29) | @Override
    method removeUser (line 58) | @Override
    method removeUser (line 66) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/PermissionService.java
  class PermissionService (line 19) | @Service("ss")
    method hasPermission (line 41) | public boolean hasPermission(String permission) {
    method lacksPermi (line 59) | public boolean lacksPermi(String permission) {
    method hasAnyPermi (line 69) | public boolean hasAnyPermi(String permissions) {
    method hasRole (line 93) | public boolean hasRole(String role) {
    method lacksRole (line 116) | public boolean lacksRole(String role) {
    method hasAnyRoles (line 126) | public boolean hasAnyRoles(String roles) {
    method hasPermissions (line 149) | private boolean hasPermissions(Set<String> permissions, String permiss...

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysConfigServiceImpl.java
  class SysConfigServiceImpl (line 15) | @Service
    method selectCaptchaEnabled (line 28) | @Override
    method selectConfigByKey (line 43) | @Override
    method getCacheKey (line 65) | private String getCacheKey(String configKey) {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysDeptServiceImpl.java
  class SysDeptServiceImpl (line 28) | @Service
    method list (line 44) | @Override
    method getDeptByDeptId (line 63) | @Override
    method addDept (line 93) | @Override
    method updateDept (line 118) | @Override
    method removeDeptById (line 161) | @Override
    method removeDeptByIds (line 184) | @Override
    method updateStatus (line 216) | @Override
    method convertToDeptTree (line 246) | public SysDept convertToDeptTree(SysDept dept, List<SysDept> list) {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysLogServiceImpl.java
  class SysLogServiceImpl (line 17) | @Slf4j
    method getLoginLogList (line 25) | @Override
    method getOperationLogList (line 43) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysLoginLogServiceImpl.java
  class SysLoginLogServiceImpl (line 14) | @Service
    method insertLogininfor (line 22) | @Override
    method selectLogininforList (line 33) | @Override
    method deleteLogininforByIds (line 45) | @Override
    method cleanLogininfor (line 54) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysLoginServiceImpl.java
  class SysLoginServiceImpl (line 33) | @Service
    method login (line 57) | @Override
    method register (line 130) | @Override
    method recordLoginInfo (line 162) | public void recordLoginInfo(Long userId) {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysMenuServiceImpl.java
  class SysMenuServiceImpl (line 36) | @Slf4j
    method selectMenuPermsByRoleId (line 51) | @Override
    method selectMenuPermsByUserId (line 70) | @Override
    method selectMenuList (line 87) | @Override
    method list (line 121) | @Override
    method convertToMenuTree (line 140) | public SysMenu convertToMenuTree(SysMenu menu, List<SysMenu> list) {
    method addMenu (line 155) | @Override
    method getMenuById (line 186) | @Override
    method updateMenu (line 219) | @Override
    method removeMenuById (line 258) | @Override
    method removeMenuByIds (line 284) | @Override
    method updateStatus (line 316) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysMonitorServiceImpl.java
  class SysMonitorServiceImpl (line 31) | @Slf4j
    method getServerInfo (line 43) | @Override
    method getCacheList (line 134) | @Override
    method getCacheDetails (line 159) | @Override
    method removeCache (line 192) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysOperationLogServiceImpl.java
  class SysOperationLogServiceImpl (line 14) | @Service
    method insertOperlog (line 22) | @Override
    method selectOperLogList (line 33) | @Override
    method deleteOperLogByIds (line 45) | @Override
    method selectOperLogById (line 57) | @Override
    method cleanOperLog (line 66) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysPasswordServiceImpl.java
  class SysPasswordServiceImpl (line 19) | @Service
    method validate (line 30) | public void validate(SysUser user) {
    method matches (line 57) | public boolean matches(SysUser user, String rawPassword) {
    method getCacheKey (line 67) | private String getCacheKey(String username) {
    method clearLoginRecordCache (line 71) | public void clearLoginRecordCache(String loginName) {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysPermissionServiceImpl.java
  class SysPermissionServiceImpl (line 15) | @Service
    method getRolePermission (line 29) | @Override
    method getMenuPermission (line 47) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysPostServiceImpl.java
  class SysPostServiceImpl (line 26) | @Service
    method list (line 42) | @Override
    method getPostByPostId (line 57) | @Override
    method addPost (line 87) | @Override
    method updatePost (line 121) | @Override
    method removePostById (line 157) | @Override
    method removeDeptByIds (line 179) | @Override
    method updateStatus (line 211) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysRoleServiceImpl.java
  class SysRoleServiceImpl (line 29) | @Service
    method selectRolePermissionByUserId (line 45) | @Override
    method list (line 65) | @Override
    method getRoleByRoleId (line 80) | @Override
    method addRole (line 105) | @Override
    method updateRole (line 140) | @Override
    method removeByRoleId (line 207) | @Override
    method removeByRoleIds (line 229) | @Override
    method updateStatus (line 261) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysUserServiceImpl.java
  class SysUserServiceImpl (line 39) | @Service
    method updateUser (line 59) | @Override
    method addUser (line 81) | @Override
    method getUserByUserId (line 104) | @Override
    method list (line 134) | @Override
    method removeById (line 149) | @Override
    method removeUserByIds (line 170) | @Override
    method updateStatus (line 204) | @Override
    method getUserListByDeptIds (line 233) | @Override
    method getUserListByPostIds (line 274) | @Override
    method getUserListByRoleIds (line 322) | @Override
    method checkLogic (line 370) | public boolean checkLogic(UserDto userDto) {
    method registerUser (line 439) | @Override
    method selectUserByUserName (line 446) | @Override
    method checkUserNameUnique (line 457) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysVerifyServiceImpl.java
  class SysVerifyServiceImpl (line 22) | @Service
    method captcha (line 36) | @Override
    method checkImgCode (line 63) | @Override

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/TokenServiceImpl.java
  class TokenServiceImpl (line 28) | @Slf4j
    method createToken (line 65) | private String createToken(Map<String, Object> claims) {
    method createToken (line 79) | @Override
    method getLoginUser (line 96) | @Override
    method delLoginUser (line 118) | @Override
    method verifyToken (line 132) | @Override
    method setUserAgent (line 146) | public void setUserAgent(LoginUser loginUser) {
    method refreshToken (line 160) | public void refreshToken(LoginUser loginUser) {
    method getTokenKey (line 168) | private String getTokenKey(String uuid) {
    method getToken (line 178) | private String getToken(HttpServletRequest request) {
    method parseToken (line 192) | private Claims parseToken(String token) {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/UserDetailsServiceImpl.java
  class UserDetailsServiceImpl (line 22) | @Service
    method loadUserByUsername (line 34) | @Override
    method createLoginUser (line 52) | public UserDetails createLoginUser(SysUser user) {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/utils/SecurityUtils.java
  class SecurityUtils (line 16) | public class SecurityUtils {
    method getAuthentication (line 20) | public static Authentication getAuthentication() {
    method getLoginUser (line 27) | public static LoginUser getLoginUser() {
    method matchesPassword (line 42) | public static boolean matchesPassword(String rawPassword, String encod...
    method encryptPassword (line 53) | public static String encryptPassword(String password) {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-websocket/src/main/java/ginyi/framework/websocket/WebSocket.java
  class WebSocket (line 13) | @Slf4j
    method onOpen (line 41) | @OnOpen
    method onClose (line 56) | @OnClose
    method onMessage (line 71) | @OnMessage
    method onError (line 82) | @OnError
    method sendAllMessage (line 95) | public void sendAllMessage(String message) {
    method sendOneMessage (line 114) | public void sendOneMessage(String userId, String message) {
    method sendMoreMessage (line 132) | public void sendMoreMessage(String[] userIds, String message) {

FILE: ginyi-springboot/ginyi-framework/ginyi-framework-websocket/src/main/java/ginyi/framework/websocket/config/WebSocketConfig.java
  class WebSocketConfig (line 7) | @Configuration
    method serverEndpointExporter (line 13) | @Bean

FILE: ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/AdminApplication.java
  class AdminApplication (line 14) | @SpringBootApplication(scanBasePackages = {
    method main (line 26) | public static void main(String[] args) throws UnknownHostException {

FILE: ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysDeptController.java
  class SysDeptController (line 24) | @Api(tags = "部门模块")
    method delete (line 32) | @ApiOperation("删除部门")
    method delete (line 41) | @ApiOperation("批量删除部门")
    method getDeptByDeptId (line 50) | @ApiOperation("部门详情")
    method list (line 59) | @ApiOperation("部门列表")
    method addDept (line 78) | @ApiOperation("新增部门")
    method update (line 98) | @ApiOperation("更新部门")
    method updateStatus (line 117) | @ApiOperation("更新部门状态")

FILE: ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysLogController.java
  class SysLogController (line 15) | @Api(tags = "日志模块")
    method loginLogList (line 23) | @ApiOperation("登录日志")
    method operationLogList (line 32) | @ApiOperation("操作日志")

FILE: ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysLoginController.java
  class SysLoginController (line 18) | @RestController
    method login (line 27) | @ApiOperation("用户登录")
    method register (line 34) | @ApiOperation("用户注册")
    method logout (line 41) | @ApiOperation("退出登录")

FILE: ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysMenuController.java
  class SysMenuController (line 23) | @Api(tags = "菜单模块")
    method delete (line 31) | @ApiOperation("删除菜单")
    method delete (line 40) | @ApiOperation("批量删除菜单")
    method getMenuById (line 49) | @ApiOperation("菜单详情")
    method list (line 57) | @ApiOperation("路由菜单列表")
    method list (line 64) | @ApiOperation("菜单列表")
    method add (line 78) | @ApiOperation("新增菜单")
    method update (line 96) | @ApiOperation("更新菜单")
    method updateStatus (line 112) | @ApiOperation("更新菜单状态")

FILE: ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysMonitorController.java
  class SysMonitorController (line 18) | @Api(tags = "监控模块")
    method getServerInfo (line 26) | @ApiOperation("获取系统服务信息")
    method getCacheList (line 34) | @ApiOperation("获取缓存列表")
    method getCacheDetails (line 42) | @ApiOperation("获取缓存详情")
    method removeCache (line 50) | @ApiOperation("删除缓存")

FILE: ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysNoticeController.java
  class SysNoticeController (line 22) | @Api(tags = "通知公告模块")
    method list (line 30) | @ApiOperation("通知公告列表(管理员)")
    method getUserNoticeList (line 52) | @ApiOperation("获取用户通知公告列表")
    method add (line 61) | @ApiOperation("发布通知公告")
    method update (line 80) | @ApiOperation("更新通知公告")
    method haveRead (line 98) | @ApiOperation("确认收到通知公告")
    method remove (line 107) | @ApiOperation("删除通知公告")

FILE: ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysOnlineController.java
  class SysOnlineController (line 17) | @Api(tags = "在线用户")
    method getOnlineUserList (line 25) | @ApiOperation("在线用户列表")
    method removeUser (line 33) | @ApiOperation("强制用户退出")
    method removeUser (line 42) | @ApiOperation("批量强制用户退出")

FILE: ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysPostController.java
  class SysPostController (line 23) | @Api(tags = "岗位模块")
    method getPostByDeptId (line 31) | @ApiOperation("岗位详情")
    method delete (line 39) | @ApiOperation("删除岗位")
    method delete (line 48) | @ApiOperation("批量删除岗位")
    method list (line 57) | @ApiOperation("岗位列表")
    method addPost (line 76) | @ApiOperation("新增岗位")
    method update (line 95) | @ApiOperation("更新岗位")
    method updateStatus (line 113) | @ApiOperation("更新岗位状态")

FILE: ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysRoleController.java
  class SysRoleController (line 23) | @Api(tags = "角色模块")
    method list (line 31) | @ApiOperation("角色列表")
    method getRoleByRoleId (line 50) | @ApiOperation("角色详情")
    method addRole (line 58) | @ApiOperation("新增角色")
    method update (line 77) | @ApiOperation("更新角色")
    method delete (line 95) | @ApiOperation("删除角色")
    method delete (line 104) | @ApiOperation("批量删除角色")
    method updateStatus (line 113) | @ApiOperation("更新角色状态")

FILE: ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysUserController.java
  class SysUserController (line 28) | @Api(tags = "用户模块")
    method delete (line 37) | @ApiOperation("删除用户")
    method getUserByUserId (line 46) | @ApiOperation("用户详情")
    method delete (line 54) | @ApiOperation("批量删除用户")
    method updateStatus (line 63) | @ApiOperation("更新用户状态")
    method add (line 76) | @ApiOperation("添加用户")
    method update (line 99) | @ApiOperation("更新用户")
    method list (line 122) | @ApiOperation("用户列表")
    method getUserListByDeptIds (line 147) | @ApiOperation("根据部门id获取用户")
    method getUserListByPostIds (line 173) | @ApiOperation("根据岗位id获取用户")
    method getUserListByPostIds (line 195) | @ApiOperation("根据角色id获取用户")

FILE: ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysVerifyController.java
  class SysVerifyController (line 17) | @RestController
    method captcha (line 25) | @ApiOperation("图片验证码")

FILE: ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/swagger/AdminSwagger2Config.java
  class AdminSwagger2Config (line 9) | @EnableSwagger2

FILE: ginyi-springboot/ginyi-server/ginyi-server-web/src/main/java/ginyi/server/web/WebApplication.java
  class WebApplication (line 14) | @Slf4j
    method main (line 29) | public static void main(String[] args) throws UnknownHostException {

FILE: ginyi-springboot/ginyi-server/ginyi-server-web/src/main/java/ginyi/server/web/controller/Test.java
  class Test (line 18) | @RestController
    method login (line 27) | @ApiOperation("测试用户登录")

FILE: ginyi-springboot/ginyi-server/ginyi-server-web/src/main/java/ginyi/server/web/swagger/WebSwagger2Config.java
  class WebSwagger2Config (line 7) | @EnableSwagger2

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/BaseEntity.java
  class BaseEntity (line 23) | @Data
    method getParams (line 83) | public Map<String, Object> getParams() {
    method setParams (line 90) | public void setParams(Map<String, Object> params) {

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/LoginUser.java
  class LoginUser (line 17) | @Data
    method LoginUser (line 76) | public LoginUser() {
    method LoginUser (line 79) | public LoginUser(SysUser user, Set<String> permissions) {
    method LoginUser (line 84) | public LoginUser(Long userId, Long deptId, SysUser user, Set<String> p...
    method getPassword (line 91) | @JSONField(serialize = false)
    method getUsername (line 97) | @Override
    method isAccountNonExpired (line 105) | @JSONField(serialize = false)
    method isAccountNonLocked (line 116) | @JSONField(serialize = false)
    method isCredentialsNonExpired (line 127) | @JSONField(serialize = false)
    method isEnabled (line 138) | @JSONField(serialize = false)
    method getAuthorities (line 145) | @Override

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/Sys.java
  class Sys (line 11) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysConfig.java
  class SysConfig (line 13) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysCpu.java
  class SysCpu (line 10) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysDept.java
  class SysDept (line 24) | @EqualsAndHashCode(callSuper = true)

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysFile.java
  class SysFile (line 11) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysJvm.java
  class SysJvm (line 11) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysLogLogin.java
  class SysLogLogin (line 11) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysLogOperation.java
  class SysLogOperation (line 13) | @EqualsAndHashCode(callSuper = true)

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysMemory.java
  class SysMemory (line 12) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysMenu.java
  class SysMenu (line 17) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysNotice.java
  class SysNotice (line 10) | @EqualsAndHashCode(callSuper = true)

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysPost.java
  class SysPost (line 15) | @EqualsAndHashCode(callSuper = true)

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysRole.java
  class SysRole (line 20) | @Data
    method isAdmin (line 104) | public boolean isAdmin() {
    method isAdmin (line 108) | public static boolean isAdmin(Long roleId) {

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysServer.java
  class SysServer (line 13) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysUser.java
  class SysUser (line 11) | @Data
    method isAdmin (line 125) | public boolean isAdmin() {
    method isAdmin (line 129) | public static boolean isAdmin(Long userId) {

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/CacheDto.java
  class CacheDto (line 7) | @ApiModel("缓存数据请求参数")

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/DeptDto.java
  class DeptDto (line 14) | @EqualsAndHashCode(callSuper = true)

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/LoginDto.java
  class LoginDto (line 15) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/MenuDto.java
  class MenuDto (line 15) | @EqualsAndHashCode(callSuper = true)

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/NoticeDto.java
  class NoticeDto (line 17) | @EqualsAndHashCode(callSuper = true)

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/PostDto.java
  class PostDto (line 17) | @EqualsAndHashCode(callSuper = true)

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/RegisterDto.java
  class RegisterDto (line 6) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/RoleDto.java
  class RoleDto (line 17) | @EqualsAndHashCode(callSuper = true)

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/UserDto.java
  class UserDto (line 17) | @EqualsAndHashCode(callSuper = true)

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/BaseVo.java
  class BaseVo (line 11) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/CacheKeyVo.java
  class CacheKeyVo (line 6) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/CacheVo.java
  class CacheVo (line 6) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/DeptVo.java
  class DeptVo (line 9) | @EqualsAndHashCode(callSuper = true)

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/LoginVo.java
  class LoginVo (line 8) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/NoticeVo.java
  class NoticeVo (line 9) | @EqualsAndHashCode(callSuper = true)

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/PostVo.java
  class PostVo (line 11) | @EqualsAndHashCode(callSuper = true)

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/RoleVo.java
  class RoleVo (line 11) | @EqualsAndHashCode(callSuper = true)

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/SessionUserVo.java
  class SessionUserVo (line 5) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/UserVo.java
  class UserVo (line 10) | @Data

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysConfigMapper.java
  type SysConfigMapper (line 9) | public interface SysConfigMapper extends BaseMapper<SysConfig> {

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysDeptMapper.java
  type SysDeptMapper (line 10) | public interface SysDeptMapper extends BaseMapper<SysDept> {
    method list (line 18) | public IPage<SysDept> list(@Param("deptDto") DeptDto deptDto, Page page);
    method insertDept (line 25) | public void insertDept(@Param("deptDto") DeptDto deptDto);
    method updateDept (line 32) | public void updateDept(@Param("deptDto") DeptDto deptDto);
    method updateDeptStatus (line 39) | public void updateDeptStatus(@Param("deptDto") DeptDto deptDto);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysLogininforMapper.java
  type SysLogininforMapper (line 12) | public interface SysLogininforMapper {
    method insertLogininfor (line 18) | public void insertLogininfor(SysLogLogin logininfor);
    method selectLogininforList (line 26) | public List<SysLogLogin> selectLogininforList(SysLogLogin logininfor);
    method deleteLogininforByIds (line 34) | public int deleteLogininforByIds(Long[] infoIds);
    method cleanLogininfor (line 41) | public int cleanLogininfor();

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysMenuMapper.java
  type SysMenuMapper (line 15) | public interface SysMenuMapper extends BaseMapper<SysMenu> {
    method selectMenuPermsByUserId (line 22) | public List<String> selectMenuPermsByUserId(Long userId);
    method selectMenuPermsByRoleId (line 30) | public List<String> selectMenuPermsByRoleId(Long roleId);
    method selectMenuListByUserId (line 37) | public List<SysMenu> selectMenuListByUserId(Long userId);
    method selectMenuListByAdmin (line 43) | public List<SysMenu> selectMenuListByAdmin(@Param("menuDto") MenuDto m...
    method insertMenu (line 50) | public boolean insertMenu(@Param("menuDto") MenuDto menuDto);
    method updateMenu (line 56) | public void updateMenu(@Param("menuDto") MenuDto menuDto);
    method updateMenuStatus (line 62) | public void updateMenuStatus(@Param("menuDto") MenuDto menuDto);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysNoticeMapper.java
  type SysNoticeMapper (line 12) | public interface SysNoticeMapper extends BaseMapper<SysNotice> {
    method list (line 17) | public IPage<SysNotice> list(@Param("noticeDto") NoticeDto noticeDto, ...
    method addNotice (line 22) | public void addNotice(@Param("noticeDto") NoticeDto noticeDto);
    method getUserNoticeList (line 30) | public IPage<SysNotice> getUserNoticeList(Long userId, Page page);
    method haveRead (line 36) | public void haveRead(@Param("notice") SysNotice notice);
    method selectOne (line 43) | public SysNotice selectOne(Long noticeId);
    method updateNotice (line 49) | public void updateNotice(@Param("noticeDto") NoticeDto noticeDto);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysOperLogMapper.java
  type SysOperLogMapper (line 12) | public interface SysOperLogMapper {
    method insertOperlog (line 18) | public void insertOperlog(SysLogOperation operLog);
    method selectOperLogList (line 26) | public List<SysLogOperation> selectOperLogList(SysLogOperation operLog);
    method deleteOperLogByIds (line 34) | public int deleteOperLogByIds(Long[] operIds);
    method selectOperLogById (line 42) | public SysLogOperation selectOperLogById(Long operId);
    method cleanOperLog (line 47) | public void cleanOperLog();

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysPostMapper.java
  type SysPostMapper (line 14) | public interface SysPostMapper extends BaseMapper<SysPost> {
    method list (line 23) | public IPage<PostVo> list(@Param("postDto") PostDto postDto, Page page);
    method insertPost (line 30) | public void insertPost(@Param("postDto") PostDto postDto);
    method updatePost (line 37) | public void updatePost(@Param("postDto") PostDto postDto);
    method updatePostStatus (line 43) | public void updatePostStatus(@Param("postDto") PostDto postDto);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysRoleMapper.java
  type SysRoleMapper (line 18) | public interface SysRoleMapper extends BaseMapper<SysRole> {
    method selectRolePermissionByUserId (line 27) | public List<SysRole> selectRolePermissionByUserId(Long userId);
    method list (line 36) | public IPage<RoleVo> list(@Param("roleDto") RoleDto roleDto, Page page);
    method insertRole (line 43) | public void insertRole(@Param("roleDto") RoleDto roleDto);
    method insertRoleMenu (line 50) | public void insertRoleMenu(@Param("roleDto") RoleDto roleDto);
    method updateRole (line 57) | public void updateRole(@Param("roleDto") RoleDto roleDto);
    method updateRoleMenu (line 64) | public void updateRoleMenu(@Param("roleDto") RoleDto roleDto);
    method selectRoleByRoleId (line 71) | public RoleVo selectRoleByRoleId(Long roleId);
    method updateRoleStatus (line 77) | public void updateRoleStatus(@Param("roleDto") RoleDto roleDto);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysUserMapper.java
  type SysUserMapper (line 16) | public interface SysUserMapper extends BaseMapper<SysUser> {
    method selectUserByUserName (line 25) | public SysUser selectUserByUserName(String userName);
    method checkUserNameUnique (line 33) | public SysUser checkUserNameUnique(String userName);
    method insertUser (line 41) | public int insertUser(@Param("userDto") UserDto userDto);
    method insertUserPostIds (line 48) | public int insertUserPostIds(@Param("userDto") UserDto userDto);
    method insertUserRoleIds (line 55) | public int insertUserRoleIds(@Param("userDto") UserDto userDto);
    method updateUser (line 63) | public int updateUser(@Param("userDto") UserDto userDto);
    method updateUserPostIds (line 70) | public int updateUserPostIds(@Param("userDto") UserDto userDto);
    method updateUserRoleIds (line 77) | public int updateUserRoleIds(@Param("userDto") UserDto userDto);
    method selectUserByUserId (line 84) | public UserVo selectUserByUserId(String userId);
    method list (line 92) | public IPage<UserVo> list(@Param("userDto") UserDto userDto, Page page);
    method updateUserStatus (line 98) | public void updateUserStatus(@Param("userDto") UserDto userDto);
    method selectUserByDeptIds (line 105) | public List<SysUser> selectUserByDeptIds(List<Long> deptIds);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysConfigService.java
  type ISysConfigService (line 3) | public interface ISysConfigService {
    method selectCaptchaEnabled (line 10) | public boolean selectCaptchaEnabled();
    method selectConfigByKey (line 18) | public String selectConfigByKey(String configKey);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysDeptService.java
  type ISysDeptService (line 13) | public interface ISysDeptService {
    method list (line 21) | public BaseVo<SysDept> list(DeptDto deptDto, Long page, Long pageSize);
    method getDeptByDeptId (line 28) | public DeptVo getDeptByDeptId(Long deptId);
    method addDept (line 34) | public void addDept(DeptDto deptDto);
    method updateDept (line 40) | public void updateDept(DeptDto deptDto);
    method removeDeptById (line 46) | public void removeDeptById(Long deptId);
    method removeDeptByIds (line 52) | public void removeDeptByIds(Set<Long> ids);
    method updateStatus (line 58) | public void updateStatus(DeptDto deptDto);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysLogService.java
  type ISysLogService (line 10) | public interface ISysLogService {
    method getLoginLogList (line 18) | public BaseVo<SysLogLogin> getLoginLogList(Long page, Long pageSize);
    method getOperationLogList (line 26) | public BaseVo<SysLogOperation> getOperationLogList(Long page, Long pag...

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysLoginService.java
  type ISysLoginService (line 7) | public interface ISysLoginService {
    method login (line 14) | public LoginVo login(LoginDto loginDto);
    method register (line 20) | public void register(RegisterDto registerDto);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysLogininforService.java
  type ISysLogininforService (line 12) | public interface ISysLogininforService {
    method insertLogininfor (line 18) | public void insertLogininfor(SysLogLogin logininfor);
    method selectLogininforList (line 26) | public List<SysLogLogin> selectLogininforList(SysLogLogin logininfor);
    method deleteLogininforByIds (line 34) | public int deleteLogininforByIds(Long[] infoIds);
    method cleanLogininfor (line 39) | public void cleanLogininfor();

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysMenuService.java
  type ISysMenuService (line 14) | public interface ISysMenuService {
    method selectMenuPermsByRoleId (line 21) | public Set<String> selectMenuPermsByRoleId(Long roleId);
    method selectMenuPermsByUserId (line 29) | public Set<String> selectMenuPermsByUserId(Long userId);
    method selectMenuList (line 36) | public BaseVo<SysMenu> selectMenuList();
    method list (line 43) | public BaseVo<SysMenu> list(MenuDto menuDto);
    method addMenu (line 49) | public void addMenu(MenuDto menuDto);
    method getMenuById (line 56) | public SysMenu getMenuById(Long menuId);
    method updateMenu (line 62) | public void updateMenu(MenuDto menuDto);
    method removeMenuById (line 68) | public void removeMenuById(Long menuId);
    method removeMenuByIds (line 74) | public void removeMenuByIds(Set<Long> ids);
    method updateStatus (line 80) | public void updateStatus(MenuDto menuDto);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysMonitorService.java
  type ISysMonitorService (line 12) | public interface ISysMonitorService {
    method getServerInfo (line 17) | public SysServer getServerInfo() throws InterruptedException;
    method getCacheList (line 22) | public BaseVo<CacheKeyVo> getCacheList();
    method getCacheDetails (line 27) | public CacheVo getCacheDetails(CacheDto cacheDto);
    method removeCache (line 32) | public void removeCache(String key);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysNoticeService.java
  type ISysNoticeService (line 11) | public interface ISysNoticeService {
    method list (line 20) | public BaseVo<SysNotice> list(NoticeDto noticeDto, Long page, Long pag...
    method add (line 26) | public void add(NoticeDto noticeDto);
    method getUserNoticeList (line 34) | public BaseVo<NoticeVo> getUserNoticeList(Long page, Long pageSize);
    method haveRead (line 40) | public void haveRead(Long noticeId);
    method remove (line 46) | public void remove(Long noticeId);
    method updateNotice (line 52) | public void updateNotice(NoticeDto noticeDto);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysOnlineService.java
  type ISysOnlineService (line 8) | public interface ISysOnlineService {
    method getOnlineUserList (line 13) | public BaseVo<SessionUserVo> getOnlineUserList(Long page, Long pageSize);
    method removeUser (line 19) | public void removeUser(String sessionId);
    method removeUser (line 25) | public void removeUser(Set<String> ids);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysOperLogService.java
  type ISysOperLogService (line 12) | public interface ISysOperLogService {
    method insertOperlog (line 18) | public void insertOperlog(SysLogOperation operLog);
    method selectOperLogList (line 26) | public List<SysLogOperation> selectOperLogList(SysLogOperation operLog);
    method deleteOperLogByIds (line 34) | public int deleteOperLogByIds(Long[] operIds);
    method selectOperLogById (line 42) | public SysLogOperation selectOperLogById(Long operId);
    method cleanOperLog (line 47) | public void cleanOperLog();

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysPasswordService.java
  type ISysPasswordService (line 5) | public interface ISysPasswordService {
    method validate (line 7) | public void validate(SysUser user);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysPermissionService.java
  type ISysPermissionService (line 7) | public interface ISysPermissionService {
    method getRolePermission (line 15) | public Set<String> getRolePermission(SysUser user);
    method getMenuPermission (line 23) | public Set<String> getMenuPermission(SysUser user);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysPostService.java
  type ISysPostService (line 10) | public interface ISysPostService {
    method list (line 20) | public BaseVo<PostVo> list(PostDto postDto, Long page, Long pageSize);
    method getPostByPostId (line 28) | public PostVo getPostByPostId(Long postId);
    method addPost (line 35) | public void addPost(PostDto postDto);
    method updatePost (line 42) | public void updatePost(PostDto postDto);
    method removePostById (line 49) | public void removePostById(Long postId);
    method removeDeptByIds (line 56) | void removeDeptByIds(Set<Long> ids);
    method updateStatus (line 62) | public void updateStatus(PostDto postDto);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysRoleService.java
  type ISysRoleService (line 10) | public interface ISysRoleService {
    method selectRolePermissionByUserId (line 17) | public Set<String> selectRolePermissionByUserId(Long userId);
    method list (line 27) | BaseVo<RoleVo> list(RoleDto roleDto, Long page, Long pageSize);
    method getRoleByRoleId (line 35) | public RoleVo getRoleByRoleId(Long roleId);
    method addRole (line 42) | public void addRole(RoleDto roleDto);
    method updateRole (line 49) | public void updateRole(RoleDto roleDto);
    method removeByRoleId (line 56) | public void removeByRoleId(Long roleId);
    method removeByRoleIds (line 63) | public void removeByRoleIds(Set<Long> ids);
    method updateStatus (line 69) | public void updateStatus(RoleDto roleDto);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysUserService.java
  type ISysUserService (line 14) | public interface ISysUserService {
    method updateUser (line 22) | public void updateUser(UserDto userDto);
    method selectUserByUserName (line 30) | public SysUser selectUserByUserName(String userName);
    method checkUserNameUnique (line 38) | public String checkUserNameUnique(SysUser user);
    method registerUser (line 46) | public boolean registerUser(SysUser user);
    method addUser (line 53) | public void addUser(UserDto userDto);
    method getUserByUserId (line 59) | public UserVo getUserByUserId(String userId);
    method list (line 68) | public BaseVo<UserVo> list(UserDto userDto, Long page, Long pageSize);
    method removeById (line 74) | public void removeById(Long userId);
    method removeUserByIds (line 80) | public void removeUserByIds(Set<Long> ids);
    method updateStatus (line 86) | public void updateStatus(UserDto userDto);
    method getUserListByDeptIds (line 93) | public BaseVo<HashMap<String, Object>> getUserListByDeptIds(DeptDto de...
    method getUserListByPostIds (line 100) | public BaseVo<HashMap<String, Object>> getUserListByPostIds(PostDto po...
    method getUserListByRoleIds (line 107) | public BaseVo<HashMap<String, Object>> getUserListByRoleIds(RoleDto ro...

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ITokenService.java
  type ITokenService (line 7) | public interface ITokenService {
    method createToken (line 15) | public String createToken(LoginUser loginUser);
    method getLoginUser (line 22) | public LoginUser getLoginUser(HttpServletRequest request);
    method delLoginUser (line 27) | public void delLoginUser(String token);
    method verifyToken (line 35) | public void verifyToken(LoginUser loginUser);

FILE: ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/IVerifyService.java
  type IVerifyService (line 3) | public interface IVerifyService {
    method captcha (line 8) | public String captcha();
    method checkImgCode (line 13) | public void checkImgCode(String code);

FILE: ginyi-springboot/sql/ginyi-spring-vue-mysql.sql
  type `gen_table` (line 24) | CREATE TABLE `gen_table`  (
  type `gen_table_column` (line 56) | CREATE TABLE `gen_table_column`  (
  type `sys_config` (line 90) | CREATE TABLE `sys_config`  (
  type `sys_dept` (line 117) | CREATE TABLE `sys_dept`  (
  type `sys_dict_data` (line 154) | CREATE TABLE `sys_dict_data`  (
  type `sys_dict_type` (line 209) | CREATE TABLE `sys_dict_type`  (
  type `sys_job` (line 241) | CREATE TABLE `sys_job`  (
  type `sys_job_log` (line 269) | CREATE TABLE `sys_job_log`  (
  type `sys_menu` (line 289) | CREATE TABLE `sys_menu`  (
  type `sys_notice` (line 412) | CREATE TABLE `sys_notice`  (
  type `sys_post` (line 439) | CREATE TABLE `sys_post`  (
  type `sys_role` (line 467) | CREATE TABLE `sys_role`  (
  type `sys_role_dept` (line 497) | CREATE TABLE `sys_role_dept`  (
  type `sys_role_menu` (line 514) | CREATE TABLE `sys_role_menu`  (
  type `sys_user` (line 531) | CREATE TABLE `sys_user`  (
  type `sys_user_post` (line 570) | CREATE TABLE `sys_user_post`  (
  type `sys_user_role` (line 592) | CREATE TABLE `sys_user_role`  (

FILE: ginyi-vue3/src/api/controller/deptController.ts
  class deptController (line 4) | class deptController {
    method list (line 10) | static list(data: any, pagination?: IPage): Promise<any> {
    method getDeptDetailsById (line 23) | static getDeptDetailsById(deptId: number | string): Promise<any> {
    method add (line 34) | static add(data: any): Promise<any> {
    method edit (line 46) | static edit(data: any): Promise<any> {
    method deleteById (line 58) | static deleteById(deptId: number | string): Promise<any> {
    method deleteByIds (line 69) | static deleteByIds(data: Array<number | string>): Promise<any> {
    method updateStatus (line 81) | static updateStatus(data: any): Promise<any> {

FILE: ginyi-vue3/src/api/controller/logController.ts
  class logController (line 4) | class logController {
    method getOperationLogList (line 10) | static getOperationLogList(data: any, pagination?: IPage): Promise<any> {
    method getLoginLogList (line 23) | static getLoginLogList(data: any, pagination?: IPage): Promise<any> {

FILE: ginyi-vue3/src/api/controller/menuController.ts
  class menuController (line 4) | class menuController {
    method getRouterList (line 8) | static getRouterList(): Promise<any> {
    method list (line 20) | static list(data: any, pagination?: IPage): Promise<any> {
    method getMenuDetailsById (line 33) | static getMenuDetailsById(menuId: number | string): Promise<any> {
    method add (line 44) | static add(data: any): Promise<any> {
    method edit (line 56) | static edit(data: any): Promise<any> {
    method deleteById (line 68) | static deleteById(menuId: number | string): Promise<any> {
    method deleteByIds (line 79) | static deleteByIds(data: Array<number | string>): Promise<any> {
    method updateStatus (line 91) | static updateStatus(data: any): Promise<any> {

FILE: ginyi-vue3/src/api/controller/monitorController.ts
  class monitorController (line 3) | class monitorController {
    method getServerInfo (line 7) | static getServerInfo(): Promise<any> {
    method getCacheList (line 17) | static getCacheList(): Promise<any> {
    method getCacheValue (line 27) | static getCacheValue(data: any): Promise<any> {
    method removeCache (line 38) | static removeCache(key: string): Promise<any> {

FILE: ginyi-vue3/src/api/controller/onlineController.ts
  class onlineController (line 4) | class onlineController {
    method getOnlineUserList (line 10) | static getOnlineUserList(data: any, pagination?: IPage): Promise<any> {
    method removeUser (line 22) | static removeUser(token: any): Promise<any> {
    method batchRemoveUser (line 33) | static batchRemoveUser(data: any): Promise<any> {

FILE: ginyi-vue3/src/api/controller/postController.ts
  class postController (line 4) | class postController {
    method list (line 10) | static list(data: any, pagination?: IPage): Promise<any> {
    method getPostDetailsById (line 23) | static getPostDetailsById(postId: number | string): Promise<any> {
    method add (line 35) | static add(data: any): Promise<any> {
    method edit (line 47) | static edit(data: any): Promise<any> {
    method deleteById (line 59) | static deleteById(userId: number | string): Promise<any> {
    method deleteByIds (line 70) | static deleteByIds(data: Array<number | string>): Promise<any> {
    method updateStatus (line 82) | static updateStatus(data: any): Promise<any> {

FILE: ginyi-vue3/src/api/controller/roleController.ts
  class roleController (line 4) | class roleController {
    method list (line 10) | static list(data: any, pagination?: IPage): Promise<any> {
    method getRoleDetailsById (line 23) | static getRoleDetailsById(roleId: number | string): Promise<any> {
    method add (line 35) | static add(data: any): Promise<any> {
    method edit (line 47) | static edit(data: any): Promise<any> {
    method deleteById (line 59) | static deleteById(userId: number | string): Promise<any> {
    method deleteByIds (line 70) | static deleteByIds(data: Array<number | string>): Promise<any> {
    method updateStatus (line 82) | static updateStatus(data: any): Promise<any> {

FILE: ginyi-vue3/src/api/controller/userController.ts
  class userController (line 4) | class userController {
    method login (line 9) | static login(data: any): Promise<any> {
    method logout (line 21) | static logout(): Promise<any> {
    method captcha (line 31) | static captcha(): Promise<any> {
    method getUserList (line 41) | static getUserList(data: any, pagination?: IPage): Promise<any> {
    method getUserById (line 54) | static getUserById(userId: number | string): Promise<any> {
    method add (line 66) | static add(data: any): Promise<any> {
    method edit (line 79) | static edit(data: any): Promise<any> {
    method updateStatus (line 91) | static updateStatus(data: any): Promise<any> {
    method deleteById (line 103) | static deleteById(userId: number | string): Promise<any> {
    method deleteByIds (line 114) | static deleteByIds(data: Array<number | string>): Promise<any> {

FILE: ginyi-vue3/src/components/commonForm/useCommonForm.ts
  type actionEnum (line 3) | enum actionEnum {

FILE: ginyi-vue3/src/components/commonModal/useCommonModal.ts
  type actionEnum (line 3) | enum actionEnum {

FILE: ginyi-vue3/src/components/commonTable/useCommonTable.ts
  method prefix (line 17) | prefix(info: PaginationInfo) {

FILE: ginyi-vue3/src/components/monacoEditor/monacoEditorType.ts
  type Theme (line 3) | type Theme = 'vs' | 'hc-black' | 'vs-dark'
  type FoldingStrategy (line 4) | type FoldingStrategy = 'auto' | 'indentation'
  type RenderLineHighlight (line 5) | type RenderLineHighlight = 'all' | 'line' | 'none' | 'gutter'
  type Options (line 6) | interface Options {
  method validator (line 40) | validator(value: string): boolean {

FILE: ginyi-vue3/src/directives/draggable.ts
  method mounted (line 4) | mounted(el: HTMLElement) {

FILE: ginyi-vue3/src/directives/focus.ts
  method mounted (line 8) | mounted(el: HTMLElement, binding: DirectiveBinding) {

FILE: ginyi-vue3/src/enums/storeKeyEnums.ts
  type storeKeyEnums (line 1) | const enum storeKeyEnums {

FILE: ginyi-vue3/src/enums/tableActionEnums.ts
  type tableActionEnums (line 1) | enum tableActionEnums {

FILE: ginyi-vue3/src/hooks/useColor.ts
  function useAddLight (line 7) | function useAddLight(color: string, amount: number): string {
  function useLighten (line 19) | function useLighten(color: string, amount: number): string {

FILE: ginyi-vue3/src/hooks/useObject.ts
  function useDeepClone (line 10) | function useDeepClone<T>(obj: T): T {

FILE: ginyi-vue3/src/hooks/usePagination.ts
  method prefix (line 13) | prefix(info: PaginationInfo) {

FILE: ginyi-vue3/src/hooks/useStorage.ts
  class storage (line 3) | class storage {
    method set (line 16) | static set(key: string, value: any, expire?: number) {
    method get (line 28) | static get(key: string): any {
    method remove (line 46) | static remove(key: string) {
    method clear (line 53) | static clear() {

FILE: ginyi-vue3/src/interface/modules/system/index.ts
  type IProject (line 6) | interface IProject {
  type ISystemState (line 24) | interface ISystemState {
  type ITabType (line 55) | interface ITabType {
  type IRouterType (line 65) | interface IRouterType {
  type ILoginFormType (line 75) | interface ILoginFormType {
  type IRegisterFormType (line 87) | interface IRegisterFormType {
  type IUser (line 101) | interface IUser {
  type IColumnType (line 113) | interface IColumnType {
  type IPage (line 122) | interface IPage {
  type IButtonConfig (line 130) | interface IButtonConfig {
  type IButtonType (line 142) | interface IButtonType {

FILE: ginyi-vue3/src/plugins/naive-ui/common.tsx
  function initIcon (line 64) | function initIcon(app: App<Element>): void {

FILE: ginyi-vue3/src/store/modules/useRouterStore.ts
  method setRoutesList (line 14) | setRoutesList(data: Array<any>, prevRoute?: RouteRecordRaw) {
  method addRoutes (line 35) | addRoutes() {

FILE: ginyi-vue3/src/store/modules/useSystemStore.ts
  method getTheme (line 26) | getTheme(): BuiltInGlobalTheme | undefined {
  method getCollapsed (line 29) | getCollapsed(): boolean | undefined {
  method getMenuList (line 32) | getMenuList(): any {
  method setThemeColor (line 37) | setThemeColor(data: string | undefined) {
  method setClientHeight (line 40) | setClientHeight(data: number | undefined) {
  method setClientWidth (line 43) | setClientWidth(data: number | undefined) {
  method setCollapsed (line 46) | setCollapsed(data: boolean | undefined) {
  method setTagIndex (line 49) | setTagIndex(data: number | undefined) {
  method addTab (line 52) | addTab(data: ITabType) {
  method removeTab (line 71) | removeTab(tabId: number, index: number) {
  method removeLeftTabs (line 78) | removeLeftTabs(index: number) {
  method removeRightTabs (line 88) | removeRightTabs(index: number) {
  method removeOtherTabs (line 98) | removeOtherTabs(index: number) {
  method removeAllTabs (line 110) | removeAllTabs() {
  method setMenuList (line 119) | setMenuList(data: any) {
  method setBreadMenuList (line 151) | setBreadMenuList(data: Array<any>) {
  method resetBreadMenuList (line 158) | resetBreadMenuList() {

FILE: ginyi-vue3/src/store/modules/useUserStore.ts
  method getName (line 15) | getName(): string | undefined {
  method login (line 20) | login(username: string | undefined, data: any): Promise<any> {
  method logout (line 29) | logout(): Promise<any> {

FILE: ginyi-vue3/src/vite-env.d.ts
  type Window (line 8) | interface Window {
Condensed preview — 329 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (942K chars).
[
  {
    "path": ".gitignore",
    "chars": 599,
    "preview": "### gradle ###\n.gradle\n/build/\n!gradle/wrapper/gradle-wrapper.jar\n\n### STS ###\n.settings/\n.apt_generated\n.classpath\n.fac"
  },
  {
    "path": "LICENSE",
    "chars": 11558,
    "preview": "                                 Apache License\r\n                           Version 2.0, January 2004\r\n                 "
  },
  {
    "path": "README.md",
    "chars": 6104,
    "preview": "<p align=\"center\" style=\"margin-left: 20px;\">\n\t<img alt=\"logo\" src=\"https://gitee.com/my-images/typora-imgs/raw/master/%"
  },
  {
    "path": "ginyi-springboot/.gitignore",
    "chars": 560,
    "preview": "### gradle ###\n.gradle\n/build/\n!gradle/wrapper/gradle-wrapper.jar\n\n### STS ###\n.settings/\n.apt_generated\n.classpath\n.fac"
  },
  {
    "path": "ginyi-springboot/README.md",
    "chars": 1634,
    "preview": "### 项目地址\n\n接口文档:http://114.132.120.190:8066/doc.html\n\n代码仓库:https://gitee.com/Ginyi/ginyi-spring-vue\n\n\n\n### 帮助文档\n\n- 没有~不想写"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-annotation/pom.xml",
    "chars": 896,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-annotation/src/main/java/ginyi.common.annotation/Anonymous.java",
    "chars": 238,
    "preview": "package ginyi.common.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * 匿名访问不鉴权注解\n * \n * @author ruoyi\n */\n@Target({ El"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-annotation/src/main/java/ginyi.common.annotation/CreateBy.java",
    "chars": 341,
    "preview": "package ginyi.common.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-annotation/src/main/java/ginyi.common.annotation/CreateTime.java",
    "chars": 344,
    "preview": "package ginyi.common.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-annotation/src/main/java/ginyi.common.annotation/Log.java",
    "chars": 748,
    "preview": "package ginyi.common.annotation;\n\nimport ginyi.common.enums.BusinessType;\nimport ginyi.common.enums.OperatorType;\n\nimpor"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-annotation/src/main/java/ginyi.common.annotation/RepeatSubmit.java",
    "chars": 399,
    "preview": "package ginyi.common.annotation;\n\nimport java.lang.annotation.*;\n\n/**\n * 自定义注解防止表单重复提交\n *\n * @author ruoyi\n */\n@Inherite"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-annotation/src/main/java/ginyi.common.annotation/UpdateBy.java",
    "chars": 342,
    "preview": "package ginyi.common.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-annotation/src/main/java/ginyi.common.annotation/UpdateTime.java",
    "chars": 345,
    "preview": "package ginyi.common.annotation;\n\nimport java.lang.annotation.ElementType;\nimport java.lang.annotation.Retention;\nimport"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-constants/pom.xml",
    "chars": 667,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-constants/src/main/java/ginyi/common/constant/CacheConstants.java",
    "chars": 2961,
    "preview": "package ginyi.common.constant;\n\n/**\n * 缓存的key 常量\n *\n * @author ruoyi\n */\npublic class CacheConstants {\n    /**\n     * 参数"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-constants/src/main/java/ginyi/common/constant/CommonMessageConstants.java",
    "chars": 3528,
    "preview": "package ginyi.common.constant;\n\n/**\n * 错误信息常量\n */\npublic class CommonMessageConstants {\n\n    public static final String "
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-constants/src/main/java/ginyi/common/constant/HttpStatus.java",
    "chars": 1431,
    "preview": "package ginyi.common.constant;\n\n/**\n * 返回状态码\n * \n * @author ruoyi\n */\npublic class HttpStatus\n{\n    /**\n     * 操作成功\n    "
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-constants/src/main/java/ginyi/common/constant/UserConstants.java",
    "chars": 2010,
    "preview": "package ginyi.common.constant;\n\n/**\n * 用户常量信息\n *\n * @author ruoyi\n */\npublic class UserConstants {\n    /**\n     * 平台内系统用"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-enums/pom.xml",
    "chars": 663,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-enums/src/main/java/ginyi/common/enums/BusinessStatus.java",
    "chars": 172,
    "preview": "package ginyi.common.enums;\n\n/**\n * 操作状态\n *\n * @author ruoyi\n */\npublic enum BusinessStatus {\n    /**\n     * 成功\n     */\n"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-enums/src/main/java/ginyi/common/enums/BusinessType.java",
    "chars": 486,
    "preview": "package ginyi.common.enums;\n\n/**\n * 业务操作类型\n *\n * @author ruoyi\n */\npublic enum BusinessType {\n    /**\n     * 其它\n     */\n"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-enums/src/main/java/ginyi/common/enums/HttpMethod.java",
    "chars": 698,
    "preview": "package ginyi.common.enums;\n\nimport org.springframework.lang.Nullable;\n\nimport java.util.HashMap;\nimport java.util.Map;\n"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-enums/src/main/java/ginyi/common/enums/OperatorType.java",
    "chars": 214,
    "preview": "package ginyi.common.enums;\n\n/**\n * 操作人类别\n *\n * @author ruoyi\n */\npublic enum OperatorType {\n    /**\n     * 其它\n     */\n "
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-exception/pom.xml",
    "chars": 1183,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/CommonException.java",
    "chars": 457,
    "preview": "package ginyi.common.exception;\n\nimport ginyi.common.result.StateCode;\nimport lombok.Data;\n\n/**\n * 通用的异常处理\n */\n@Data\npub"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/UnPermissionException.java",
    "chars": 236,
    "preview": "package ginyi.common.exception;\n\nimport ginyi.common.result.StateCode;\nimport lombok.Data;\n\n/**\n * 没有对应的接口权限\n */\n@Data\np"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/UserPasswordNotMatchException.java",
    "chars": 186,
    "preview": "package ginyi.common.exception;\n\n/**\n * 用户密码不正确或不符合规范异常类\n */\npublic class UserPasswordNotMatchException extends RuntimeE"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/UserPasswordRetryLimitExceedException.java",
    "chars": 580,
    "preview": "package ginyi.common.exception;\n\nimport ginyi.common.result.StateCode;\nimport lombok.Data;\n\n/**\n * 用户错误最大次数异常类\n */\n@Data"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-exception/src/main/java/ginyi/common/exception/handler/GlobalExceptionHandler.java",
    "chars": 4771,
    "preview": "package ginyi.common.exception.handler;\n\nimport com.alibaba.fastjson2.JSON;\nimport ginyi.common.constant.CommonMessageCo"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-mysql/pom.xml",
    "chars": 1858,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/MyPage.java",
    "chars": 867,
    "preview": "package ginyi.common.mysql;\n\nimport com.baomidou.mybatisplus.extension.plugins.pagination.Page;\nimport lombok.Data;\n\n/**"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/config/MyBatisPlusInterceptorConfig.java",
    "chars": 722,
    "preview": "package ginyi.common.mysql.config;\n\nimport com.baomidou.mybatisplus.annotation.DbType;\nimport com.baomidou.mybatisplus.e"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/handler/JacksonArrayTypeHandler.java",
    "chars": 983,
    "preview": "package ginyi.common.mysql.handler;\n\nimport com.alibaba.fastjson.JSON;\nimport com.baomidou.mybatisplus.extension.handler"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/handler/MyMetaObjectHandler.java",
    "chars": 1323,
    "preview": "package ginyi.common.mysql.handler;\n\nimport com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;\nimport ginyi.commo"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-mysql/src/main/java/ginyi/common/mysql/interceptor/MyInterceptor.java",
    "chars": 3634,
    "preview": "package ginyi.common.mysql.interceptor;\n\nimport ginyi.common.annotation.CreateBy;\nimport ginyi.common.annotation.CreateT"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-redis/pom.xml",
    "chars": 1128,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-redis/src/main/java/ginyi/common/redis/cache/RedisCache.java",
    "chars": 6720,
    "preview": "package ginyi.common.redis.cache;\n\nimport com.alibaba.fastjson.JSON;\nimport org.springframework.beans.factory.annotation"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-redis/src/main/java/ginyi/common/redis/config/RedisConfig.java",
    "chars": 2772,
    "preview": "package ginyi.common.redis.config;\n\nimport com.alibaba.fastjson.support.spring.FastJsonRedisSerializer;\nimport org.sprin"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-result/pom.xml",
    "chars": 727,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-result/src/main/java/ginyi/common/result/CommonResult.java",
    "chars": 1646,
    "preview": "package ginyi.common.result;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelProperty;\nim"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-result/src/main/java/ginyi/common/result/StateCode.java",
    "chars": 1098,
    "preview": "package ginyi.common.result;\n\n\npublic enum StateCode {\n\n    SUCCESS(200, \"操作成功\"),\n\n    ERROR_SYSTEM(5000, \"系统异常\"),\n    E"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-swagger/pom.xml",
    "chars": 1057,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-swagger/src/main/java/ginyi/common/swagger/AddGroup.java",
    "chars": 90,
    "preview": "package ginyi.common.swagger;\n\n/**\n * 此接口不要删除,用于参数校验的分组\n */\npublic interface AddGroup {\n}\n"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-swagger/src/main/java/ginyi/common/swagger/Swagger2Config.java",
    "chars": 2288,
    "preview": "package ginyi.common.swagger;\n\nimport com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;\nimport io.swagger.an"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-swagger/src/main/java/ginyi/common/swagger/UpdateGroup.java",
    "chars": 93,
    "preview": "package ginyi.common.swagger;\n\n/**\n * 此接口不要删除,用于参数校验的分组\n */\npublic interface UpdateGroup {\n}\n"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/pom.xml",
    "chars": 1570,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/Constants.java",
    "chars": 1174,
    "preview": "package ginyi.common.utils;\n\n/**\n * 通用常量信息\n *\n * @author ruoyi\n */\npublic class Constants {\n    /**\n     * UTF-8 字符集\n   "
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/DateUtils.java",
    "chars": 4286,
    "preview": "package ginyi.common.utils;\n\nimport org.apache.commons.lang3.time.DateFormatUtils;\n\nimport java.lang.management.Manageme"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/EmailUtils.java",
    "chars": 620,
    "preview": "package ginyi.common.utils;\n\nimport cn.hutool.extra.mail.MailUtil;\n\n/**\n * 邮箱工具类\n * 如何使用:\n *   1、需要在对应的应用服务模块下(如ginyi-se"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/LogUtils.java",
    "chars": 252,
    "preview": "package ginyi.common.utils;\n\n/**\n * 处理并记录日志文件\n *\n * @author ruoyi\n */\npublic class LogUtils {\n    public static String g"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/LunarCalendarUtil.java",
    "chars": 10658,
    "preview": "package ginyi.common.utils;\n\nimport java.util.Date;\nimport java.util.GregorianCalendar;\n\n/**\n * 工具类,实现阴阳历互转\n */\npublic c"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/MessageUtils.java",
    "chars": 632,
    "preview": "package ginyi.common.utils;\n\nimport ginyi.common.utils.spring.SpringUtils;\nimport org.springframework.context.MessageSou"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/NumberUtils.java",
    "chars": 387,
    "preview": "package ginyi.common.utils;\n\nimport java.math.BigDecimal;\nimport java.math.RoundingMode;\n\npublic class NumberUtils {\n\n  "
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/ServletUtils.java",
    "chars": 5016,
    "preview": "package ginyi.common.utils;\n\nimport ginyi.common.utils.text.Convert;\nimport org.springframework.web.context.request.Requ"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/StringUtils.java",
    "chars": 2786,
    "preview": "package ginyi.common.utils;\n\nimport ginyi.common.utils.text.StrFormatter;\n\n/**\n * 字符串工具类\n *\n * @author ruoyi\n */\npublic "
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/Threads.java",
    "chars": 1971,
    "preview": "package ginyi.common.utils;\n\nimport org.slf4j.Logger;\nimport org.slf4j.LoggerFactory;\n\nimport java.util.concurrent.*;\n\n/"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/enums/UserStatus.java",
    "chars": 438,
    "preview": "package ginyi.common.utils.enums;\n\n/**\n * 用户状态\n *\n * @author ruoyi\n */\npublic enum UserStatus {\n    OK(\"0\", \"正常\"), DISAB"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/http/HttpHelper.java",
    "chars": 1336,
    "preview": "package ginyi.common.utils.http;\n\nimport org.apache.commons.lang3.exception.ExceptionUtils;\nimport org.slf4j.Logger;\nimp"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/http/HttpUtils.java",
    "chars": 8278,
    "preview": "package ginyi.common.utils.http;\n\nimport ginyi.common.utils.Constants;\nimport ginyi.common.utils.StringUtils;\nimport org"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/ip/AddressUtils.java",
    "chars": 1320,
    "preview": "package ginyi.common.utils.ip;\n\nimport com.alibaba.fastjson2.JSON;\nimport com.alibaba.fastjson2.JSONObject;\nimport ginyi"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/ip/IpUtils.java",
    "chars": 6650,
    "preview": "package ginyi.common.utils.ip;\n\nimport ginyi.common.utils.StringUtils;\n\nimport javax.servlet.http.HttpServletRequest;\nim"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/spring/SpringUtils.java",
    "chars": 3995,
    "preview": "package ginyi.common.utils.spring;\n\nimport ginyi.common.utils.StringUtils;\nimport org.springframework.aop.framework.AopC"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/text/CharsetKit.java",
    "chars": 2188,
    "preview": "package ginyi.common.utils.text;\n\nimport ginyi.common.utils.StringUtils;\n\nimport java.nio.charset.Charset;\nimport java.n"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/text/Convert.java",
    "chars": 4180,
    "preview": "package ginyi.common.utils.text;\n\nimport ginyi.common.utils.StringUtils;\nimport org.apache.commons.lang3.ArrayUtils;\n\nim"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/text/StrFormatter.java",
    "chars": 2911,
    "preview": "package ginyi.common.utils.text;\n\nimport ginyi.common.utils.StringUtils;\n\n/**\n * 字符串格式化\n *\n * @author ruoyi\n */\npublic c"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/uuid/IdUtils.java",
    "chars": 802,
    "preview": "package ginyi.common.utils.uuid;\n\n/**\n * ID生成器工具类\n *\n * @author ruoyi\n */\npublic class IdUtils {\n    /**\n     * 获取随机UUID"
  },
  {
    "path": "ginyi-springboot/ginyi-common/ginyi-common-utils/src/main/java/ginyi/common/utils/uuid/UUID.java",
    "chars": 12691,
    "preview": "package ginyi.common.utils.uuid;\n\nimport cn.hutool.core.exceptions.UtilException;\n\nimport java.security.MessageDigest;\ni"
  },
  {
    "path": "ginyi-springboot/ginyi-common/pom.xml",
    "chars": 983,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-core/pom.xml",
    "chars": 889,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-core/src/main/java/ginyi/framework/core/config/AppConfig.java",
    "chars": 1799,
    "preview": "package ginyi.framework.core.config;\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.fusesource.jansi.Ansi;\nimport org.spr"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-core/src/main/java/ginyi/framework/core/config/GinyiConfig.java",
    "chars": 890,
    "preview": "package ginyi.framework.core.config;\n\nimport lombok.Data;\nimport org.springframework.beans.factory.annotation.Value;\nimp"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/pom.xml",
    "chars": 1450,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/aspectj/LogAspect.java",
    "chars": 12391,
    "preview": "package ginyi.framework.security.aspectj;\n\nimport cn.hutool.core.date.DateUtil;\nimport com.alibaba.fastjson2.JSON;\nimpor"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/config/ResourcesConfig.java",
    "chars": 2637,
    "preview": "package ginyi.framework.security.config;\n\n\nimport ginyi.framework.core.config.GinyiConfig;\nimport ginyi.common.utils.Con"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/config/SecurityConfig.java",
    "chars": 5539,
    "preview": "package ginyi.framework.security.config;\n\nimport ginyi.framework.security.filter.JwtAuthenticationTokenFilter;\nimport gi"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/config/ThreadPoolConfig.java",
    "chars": 1906,
    "preview": "package ginyi.framework.security.config;\n\nimport ginyi.common.utils.Threads;\nimport org.apache.commons.lang3.concurrent."
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/context/AuthenticationContextHolder.java",
    "chars": 547,
    "preview": "package ginyi.framework.security.context;\n\nimport org.springframework.security.core.Authentication;\n\n/**\n * 身份验证信息\n *\n *"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/context/PermissionContextHolder.java",
    "chars": 825,
    "preview": "package ginyi.framework.security.context;\n\nimport ginyi.common.utils.text.Convert;\nimport org.springframework.web.contex"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/filter/JwtAuthenticationTokenFilter.java",
    "chars": 1797,
    "preview": "package ginyi.framework.security.filter;\n\nimport ginyi.common.utils.StringUtils;\nimport ginyi.framework.security.utils.S"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/filter/PropertyPreExcludeFilter.java",
    "chars": 472,
    "preview": "package ginyi.framework.security.filter;\n\nimport com.alibaba.fastjson2.filter.SimplePropertyPreFilter;\n\n/**\n * 排除JSON敏感属"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/filter/RepeatedlyRequestWrapper.java",
    "chars": 1905,
    "preview": "package ginyi.framework.security.filter;\n\nimport ginyi.common.utils.Constants;\nimport ginyi.common.utils.http.HttpHelper"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/handle/AuthenticationEntryPointImpl.java",
    "chars": 1141,
    "preview": "package ginyi.framework.security.handle;\n\nimport com.alibaba.fastjson2.JSON;\nimport ginyi.common.constant.CommonMessageC"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/handle/LogoutSuccessHandlerImpl.java",
    "chars": 1900,
    "preview": "package ginyi.framework.security.handle;\n\nimport com.alibaba.fastjson2.JSON;\nimport ginyi.common.result.CommonResult;\nim"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/interceptor/PreviewEnvInterceptor.java",
    "chars": 2472,
    "preview": "package ginyi.framework.security.interceptor;\n\nimport cn.hutool.crypto.SecureUtil;\nimport cn.hutool.extra.servlet.Servle"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/interceptor/RepeatSubmitInterceptor.java",
    "chars": 1731,
    "preview": "package ginyi.framework.security.interceptor;\n\nimport com.alibaba.fastjson2.JSON;\nimport ginyi.common.annotation.RepeatS"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/interceptor/impl/SameUrlDataInterceptor.java",
    "chars": 3628,
    "preview": "package ginyi.framework.security.interceptor.impl;\n\nimport com.alibaba.fastjson2.JSON;\nimport ginyi.common.annotation.Re"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/manager/AsyncManager.java",
    "chars": 1017,
    "preview": "package ginyi.framework.security.manager;\n\nimport ginyi.common.utils.Threads;\nimport ginyi.common.utils.spring.SpringUti"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/manager/factory/AsyncFactory.java",
    "chars": 3434,
    "preview": "package ginyi.framework.security.manager.factory;\n\nimport eu.bitwalker.useragentutils.UserAgent;\nimport ginyi.common.uti"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/properties/PermitAllUrlProperties.java",
    "chars": 2576,
    "preview": "package ginyi.framework.security.properties;\n\nimport ginyi.common.annotation.Anonymous;\nimport org.apache.commons.lang3."
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/ISysNoticeServiceImpl.java",
    "chars": 7635,
    "preview": "package ginyi.framework.security.service;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimp"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/MonitorServiceImpl.java",
    "chars": 2761,
    "preview": "package ginyi.framework.security.service;\n\nimport ginyi.common.constant.CacheConstants;\nimport ginyi.common.constant.Com"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/PermissionService.java",
    "chars": 4474,
    "preview": "package ginyi.framework.security.service;\n\nimport ginyi.common.exception.UnPermissionException;\nimport ginyi.common.util"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysConfigServiceImpl.java",
    "chars": 2046,
    "preview": "package ginyi.framework.security.service;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimp"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysDeptServiceImpl.java",
    "chars": 10547,
    "preview": "package ginyi.framework.security.service;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimp"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysLogServiceImpl.java",
    "chars": 2050,
    "preview": "package ginyi.framework.security.service;\n\nimport ginyi.common.mysql.MyPage;\nimport ginyi.system.domain.SysLogLogin;\nimp"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysLoginLogServiceImpl.java",
    "chars": 1056,
    "preview": "package ginyi.framework.security.service;\n\nimport ginyi.system.domain.SysLogLogin;\nimport ginyi.system.service.ISysLogin"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysLoginServiceImpl.java",
    "chars": 6901,
    "preview": "package ginyi.framework.security.service;\n\nimport ginyi.common.constant.CommonMessageConstants;\nimport ginyi.common.cons"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysMenuServiceImpl.java",
    "chars": 12435,
    "preview": "package ginyi.framework.security.service;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimp"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysMonitorServiceImpl.java",
    "chars": 8715,
    "preview": "package ginyi.framework.security.service;\n\nimport ginyi.common.constant.CommonMessageConstants;\nimport ginyi.common.exce"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysOperationLogServiceImpl.java",
    "chars": 1245,
    "preview": "package ginyi.framework.security.service;\n\nimport ginyi.system.domain.SysLogOperation;\nimport ginyi.system.service.ISysO"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysPasswordServiceImpl.java",
    "chars": 2768,
    "preview": "package ginyi.framework.security.service;\n\nimport ginyi.common.constant.CacheConstants;\nimport ginyi.common.exception.Us"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysPermissionServiceImpl.java",
    "chars": 1918,
    "preview": "package ginyi.framework.security.service;\n\nimport ginyi.system.domain.SysRole;\nimport ginyi.system.domain.SysUser;\nimpor"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysPostServiceImpl.java",
    "chars": 9992,
    "preview": "package ginyi.framework.security.service;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimp"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysRoleServiceImpl.java",
    "chars": 12153,
    "preview": "package ginyi.framework.security.service;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimp"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysUserServiceImpl.java",
    "chars": 17994,
    "preview": "package ginyi.framework.security.service;\n\nimport com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;\nimp"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/SysVerifyServiceImpl.java",
    "chars": 2805,
    "preview": "package ginyi.framework.security.service;\n\nimport cn.hutool.captcha.CaptchaUtil;\nimport cn.hutool.captcha.CircleCaptcha;"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/TokenServiceImpl.java",
    "chars": 5513,
    "preview": "package ginyi.framework.security.service;\n\nimport eu.bitwalker.useragentutils.UserAgent;\nimport ginyi.common.constant.Ca"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/service/UserDetailsServiceImpl.java",
    "chars": 2239,
    "preview": "package ginyi.framework.security.service;\n\nimport ginyi.common.exception.CommonException;\nimport ginyi.common.constant.C"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-security/src/main/java/ginyi/framework/security/utils/SecurityUtils.java",
    "chars": 1634,
    "preview": "package ginyi.framework.security.utils;\n\nimport ginyi.common.constant.CommonMessageConstants;\nimport ginyi.common.except"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-websocket/pom.xml",
    "chars": 729,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-websocket/src/main/java/ginyi/framework/websocket/WebSocket.java",
    "chars": 3801,
    "preview": "package ginyi.framework.websocket;\n\n\nimport lombok.extern.slf4j.Slf4j;\nimport org.springframework.stereotype.Component;\n"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/ginyi-framework-websocket/src/main/java/ginyi/framework/websocket/config/WebSocketConfig.java",
    "chars": 516,
    "preview": "package ginyi.framework.websocket.config;\n\nimport org.springframework.context.annotation.Bean;\nimport org.springframewor"
  },
  {
    "path": "ginyi-springboot/ginyi-framework/pom.xml",
    "chars": 966,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/Dockerfile",
    "chars": 81,
    "preview": "FROM java:8\nCOPY *.jar /app.jar\nEXPOSE 8066\nENTRYPOINT [\"java\",\"-jar\",\"/app.jar\"]"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/pom.xml",
    "chars": 1888,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/AdminApplication.java",
    "chars": 921,
    "preview": "package ginyi.server.admin;\n\n\nimport ginyi.framework.core.config.AppConfig;\nimport lombok.extern.slf4j.Slf4j;\nimport org"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysDeptController.java",
    "chars": 4647,
    "preview": "package ginyi.server.admin.controller;\n\nimport com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;\nimport ginyi"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysLogController.java",
    "chars": 1660,
    "preview": "package ginyi.server.admin.controller;\n\nimport ginyi.common.result.CommonResult;\nimport ginyi.system.domain.SysLogLogin;"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysLoginController.java",
    "chars": 1530,
    "preview": "package ginyi.server.admin.controller;\n\nimport ginyi.common.result.CommonResult;\nimport ginyi.system.domain.model.dto.Lo"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysMenuController.java",
    "chars": 4311,
    "preview": "package ginyi.server.admin.controller;\n\nimport com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;\nimport ginyi"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysMonitorController.java",
    "chars": 2038,
    "preview": "package ginyi.server.admin.controller;\n\nimport ginyi.common.annotation.Log;\nimport ginyi.common.result.CommonResult;\nimp"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysNoticeController.java",
    "chars": 4488,
    "preview": "package ginyi.server.admin.controller;\n\nimport com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;\nimport ginyi"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysOnlineController.java",
    "chars": 1889,
    "preview": "package ginyi.server.admin.controller;\n\nimport ginyi.common.annotation.Log;\nimport ginyi.common.enums.BusinessType;\nimpo"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysPostController.java",
    "chars": 4443,
    "preview": "package ginyi.server.admin.controller;\n\nimport com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;\nimport ginyi"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysRoleController.java",
    "chars": 4536,
    "preview": "package ginyi.server.admin.controller;\n\nimport com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;\nimport ginyi"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysUserController.java",
    "chars": 7697,
    "preview": "package ginyi.server.admin.controller;\n\nimport com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;\nimport ginyi"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/controller/SysVerifyController.java",
    "chars": 1053,
    "preview": "package ginyi.server.admin.controller;\n\nimport ginyi.common.result.CommonResult;\nimport ginyi.system.service.IVerifyServ"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/java/ginyi/server/admin/swagger/AdminSwagger2Config.java",
    "chars": 388,
    "preview": "package ginyi.server.admin.swagger;\n\nimport com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;\nimport ginyi.c"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/resources/config/application.yml",
    "chars": 383,
    "preview": "# 说明:\n#     1、这是 ginyi-server-admin 模块下特有的配置项\n#     2、更多全局通用的配置项在 ginyi-system 系统应用服务下\n#     3、如果需要对重写全局的配置项的话,可以将其对应的属性"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-admin/src/main/resources/static/i18n/messages.properties",
    "chars": 1088,
    "preview": "#错误消息\nnot.null=* 必须填写\nuser.jcaptcha.error=验证码错误\nuser.jcaptcha.expire=验证码已失效\nuser.not.exists=用户不存在/密码错误\nuser.password.not"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-common/pom.xml",
    "chars": 554,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-web/pom.xml",
    "chars": 1886,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-web/src/main/java/ginyi/server/web/WebApplication.java",
    "chars": 1037,
    "preview": "package ginyi.server.web;\n\nimport ginyi.framework.core.config.AppConfig;\nimport lombok.extern.slf4j.Slf4j;\nimport org.my"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-web/src/main/java/ginyi/server/web/controller/Test.java",
    "chars": 1104,
    "preview": "package ginyi.server.web.controller;\n\n\nimport ginyi.common.result.CommonResult;\nimport ginyi.system.domain.model.dto.Log"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-web/src/main/java/ginyi/server/web/swagger/WebSwagger2Config.java",
    "chars": 299,
    "preview": "package ginyi.server.web.swagger;\n\nimport ginyi.common.swagger.Swagger2Config;\nimport org.springframework.context.annota"
  },
  {
    "path": "ginyi-springboot/ginyi-server/ginyi-server-web/src/main/resources/config/application.yml",
    "chars": 379,
    "preview": "# 说明:\n#     1、这是 ginyi-server-web 模块下特有的配置项\n#     2、更多全局通用的配置项在 ginyi-system 系统应用服务下\n#     3、如果需要对重写全局的配置项的话,可以将其对应的属性配置"
  },
  {
    "path": "ginyi-springboot/ginyi-server/pom.xml",
    "chars": 1398,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-system/pom.xml",
    "chars": 3018,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project xmlns=\"http://maven.apache.org/POM/4.0.0\"\n         xmlns:xsi=\"http://www"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/BaseEntity.java",
    "chars": 2002,
    "preview": "package ginyi.system.domain;\n\nimport com.baomidou.mybatisplus.annotation.FieldFill;\nimport com.baomidou.mybatisplus.anno"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/LoginUser.java",
    "chars": 2521,
    "preview": "package ginyi.system.domain;\n\nimport com.alibaba.fastjson2.annotation.JSONField;\nimport ginyi.system.domain.SysUser;\nimp"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/Sys.java",
    "chars": 608,
    "preview": "package ginyi.system.domain;\n\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\n/**\n * 系统相关信息\n *\n * @"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysConfig.java",
    "chars": 685,
    "preview": "package ginyi.system.domain;\n\nimport com.baomidou.mybatisplus.annotation.TableId;\nimport lombok.Data;\nimport org.apache."
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysCpu.java",
    "chars": 756,
    "preview": "package ginyi.system.domain;\n\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\n/**\n * CPU相关信息\n * @au"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysDept.java",
    "chars": 2251,
    "preview": "package ginyi.system.domain;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.ann"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysFile.java",
    "chars": 710,
    "preview": "package ginyi.system.domain;\n\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\n/**\n * 系统文件相关信息\n *\n *"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysJvm.java",
    "chars": 1184,
    "preview": "package ginyi.system.domain;\n\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\n/**\n * JVM相关信息\n *\n * "
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysLogLogin.java",
    "chars": 982,
    "preview": "package ginyi.system.domain;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport io.swagger.annotations.ApiModel"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysLogOperation.java",
    "chars": 1638,
    "preview": "package ginyi.system.domain;\n\nimport com.fasterxml.jackson.annotation.JsonFormat;\nimport io.swagger.annotations.ApiModel"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysMemory.java",
    "chars": 533,
    "preview": "package ginyi.system.domain;\n\n\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\n/**\n * 內存相关信息\n *\n * "
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysMenu.java",
    "chars": 2197,
    "preview": "package ginyi.system.domain;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.ann"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysNotice.java",
    "chars": 946,
    "preview": "package ginyi.system.domain;\n\nimport ginyi.system.domain.BaseEntity;\nimport io.swagger.annotations.ApiModelProperty;\nimp"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysPost.java",
    "chars": 893,
    "preview": "package ginyi.system.domain;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.ann"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysRole.java",
    "chars": 2327,
    "preview": "package ginyi.system.domain;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.ann"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysServer.java",
    "chars": 624,
    "preview": "package ginyi.system.domain;\n\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java.util.List"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/SysUser.java",
    "chars": 2012,
    "preview": "package ginyi.system.domain;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybatisplus.ann"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/CacheDto.java",
    "chars": 365,
    "preview": "package ginyi.system.domain.model.dto;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelPr"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/DeptDto.java",
    "chars": 1741,
    "preview": "package ginyi.system.domain.model.dto;\n\nimport ginyi.common.swagger.AddGroup;\nimport ginyi.common.swagger.UpdateGroup;\ni"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/LoginDto.java",
    "chars": 760,
    "preview": "package ginyi.system.domain.model.dto;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelPr"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/MenuDto.java",
    "chars": 2270,
    "preview": "package ginyi.system.domain.model.dto;\n\nimport ginyi.common.swagger.AddGroup;\nimport ginyi.common.swagger.UpdateGroup;\ni"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/NoticeDto.java",
    "chars": 1776,
    "preview": "package ginyi.system.domain.model.dto;\n\nimport ginyi.common.swagger.AddGroup;\nimport ginyi.common.swagger.UpdateGroup;\ni"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/PostDto.java",
    "chars": 1622,
    "preview": "package ginyi.system.domain.model.dto;\n\nimport ginyi.common.swagger.AddGroup;\nimport ginyi.common.swagger.UpdateGroup;\ni"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/RegisterDto.java",
    "chars": 173,
    "preview": "package ginyi.system.domain.model.dto;\n\nimport io.swagger.annotations.ApiModel;\nimport lombok.Data;\n\n@Data\n@ApiModel(\"用户"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/RoleDto.java",
    "chars": 1786,
    "preview": "package ginyi.system.domain.model.dto;\n\nimport ginyi.common.swagger.AddGroup;\nimport ginyi.common.swagger.UpdateGroup;\ni"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/dto/UserDto.java",
    "chars": 2073,
    "preview": "package ginyi.system.domain.model.dto;\n\nimport com.baomidou.mybatisplus.annotation.TableLogic;\nimport ginyi.common.swagg"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/BaseVo.java",
    "chars": 295,
    "preview": "package ginyi.system.domain.model.vo;\n\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\nimport java."
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/CacheKeyVo.java",
    "chars": 303,
    "preview": "package ginyi.system.domain.model.vo;\n\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\n@Data\npublic"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/CacheVo.java",
    "chars": 381,
    "preview": "package ginyi.system.domain.model.vo;\n\nimport io.swagger.annotations.ApiModelProperty;\nimport lombok.Data;\n\n@Data\npublic"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/DeptVo.java",
    "chars": 888,
    "preview": "package ginyi.system.domain.model.vo;\n\nimport ginyi.system.domain.BaseEntity;\nimport io.swagger.annotations.ApiModel;\nim"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/LoginVo.java",
    "chars": 439,
    "preview": "package ginyi.system.domain.model.vo;\n\nimport io.swagger.annotations.ApiModel;\nimport io.swagger.annotations.ApiModelPro"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/NoticeVo.java",
    "chars": 892,
    "preview": "package ginyi.system.domain.model.vo;\n\nimport ginyi.system.domain.BaseEntity;\nimport io.swagger.annotations.ApiModel;\nim"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/PostVo.java",
    "chars": 788,
    "preview": "package ginyi.system.domain.model.vo;\n\nimport com.baomidou.mybatisplus.annotation.TableField;\nimport com.baomidou.mybati"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/RoleVo.java",
    "chars": 777,
    "preview": "package ginyi.system.domain.model.vo;\n\nimport ginyi.system.domain.BaseEntity;\nimport io.swagger.annotations.ApiModel;\nim"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/SessionUserVo.java",
    "chars": 500,
    "preview": "package ginyi.system.domain.model.vo;\n\nimport lombok.Data;\n\n@Data\npublic class SessionUserVo {\n\n    /**\n     * 用户唯一标识\n  "
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/domain/model/vo/UserVo.java",
    "chars": 1055,
    "preview": "package ginyi.system.domain.model.vo;\n\nimport ginyi.system.domain.BaseEntity;\nimport io.swagger.annotations.ApiModel;\nim"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysConfigMapper.java",
    "chars": 210,
    "preview": "package ginyi.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport ginyi.system.domain.SysConf"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysDeptMapper.java",
    "chars": 922,
    "preview": "package ginyi.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.co"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysLogininforMapper.java",
    "chars": 722,
    "preview": "package ginyi.system.mapper;\n\nimport ginyi.system.domain.SysLogLogin;\n\nimport java.util.List;\n\n/**\n * 系统访问日志情况信息 数据层\n *\n"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysMenuMapper.java",
    "chars": 1266,
    "preview": "package ginyi.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport ginyi.system.domain.SysMenu"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysNoticeMapper.java",
    "chars": 1199,
    "preview": "package ginyi.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.co"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysOperLogMapper.java",
    "chars": 824,
    "preview": "package ginyi.system.mapper;\n\nimport ginyi.system.domain.SysLogOperation;\n\nimport java.util.List;\n\n/**\n * 操作日志 数据层\n *\n *"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysPostMapper.java",
    "chars": 987,
    "preview": "package ginyi.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.co"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysRoleMapper.java",
    "chars": 1581,
    "preview": "package ginyi.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.co"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/mapper/SysUserMapper.java",
    "chars": 2236,
    "preview": "package ginyi.system.mapper;\n\nimport com.baomidou.mybatisplus.core.mapper.BaseMapper;\nimport com.baomidou.mybatisplus.co"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysConfigService.java",
    "chars": 332,
    "preview": "package ginyi.system.service;\n\npublic interface ISysConfigService {\n\n    /**\n     * 获取验证码开关\n     *\n     * @return true开启"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysDeptService.java",
    "chars": 1058,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.SysDept;\nimport ginyi.system.domain.model.dto.DeptDto;\nimport "
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysLogService.java",
    "chars": 613,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.SysLogLogin;\nimport ginyi.system.domain.SysLogOperation;\nimpor"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysLoginService.java",
    "chars": 430,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.model.dto.LoginDto;\nimport ginyi.system.domain.model.dto.Regis"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysLogininforService.java",
    "chars": 701,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.SysLogLogin;\n\nimport java.util.List;\n\n/**\n * 系统访问日志情况信息 服务层\n *"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysMenuService.java",
    "chars": 1388,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.SysMenu;\nimport ginyi.system.domain.model.dto.MenuDto;\nimport "
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysMonitorService.java",
    "chars": 653,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.SysServer;\nimport ginyi.system.domain.model.dto.CacheDto;\nimpo"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysNoticeService.java",
    "chars": 1017,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.SysNotice;\nimport ginyi.system.domain.model.dto.NoticeDto;\nimp"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysOnlineService.java",
    "chars": 497,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.model.vo.BaseVo;\nimport ginyi.system.domain.model.vo.SessionUs"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysOperLogService.java",
    "chars": 827,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.SysLogOperation;\n\nimport java.util.List;\n\n/**\n * 操作日志 服务层\n *\n "
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysPasswordService.java",
    "chars": 150,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.SysUser;\n\npublic interface ISysPasswordService {\n\n    public v"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysPermissionService.java",
    "chars": 419,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.SysUser;\n\nimport java.util.Set;\n\npublic interface ISysPermissi"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysPostService.java",
    "chars": 1105,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.model.dto.PostDto;\nimport ginyi.system.domain.model.dto.RoleDt"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysRoleService.java",
    "chars": 1252,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.model.dto.RoleDto;\nimport ginyi.system.domain.model.dto.UserDt"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ISysUserService.java",
    "chars": 2151,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.SysUser;\nimport ginyi.system.domain.model.dto.DeptDto;\nimport "
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/ITokenService.java",
    "chars": 634,
    "preview": "package ginyi.system.service;\n\nimport ginyi.system.domain.LoginUser;\n\nimport javax.servlet.http.HttpServletRequest;\n\npub"
  },
  {
    "path": "ginyi-springboot/ginyi-system/src/main/java/ginyi/system/service/IVerifyService.java",
    "chars": 200,
    "preview": "package ginyi.system.service;\n\npublic interface IVerifyService {\n\n    /**\n     * 图片验证码\n     */\n    public String captcha"
  }
]

// ... and 129 more files (download for full content)

About this extraction

This page contains the full source code of the Ginyi3705/ginyi-spring-vue GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 329 files (34.0 MB), approximately 220.3k tokens, and a symbol index with 867 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.

Copied to clipboard!