Pārlūkot izejas kodu

影像解译平台初始化

lamphua 18 stundas atpakaļ
revīzija
dc4eab8fba
100 mainītis faili ar 10180 papildinājumiem un 0 dzēšanām
  1. 3
    0
      LICENSE
  2. 10
    0
      README.md
  3. 1
    0
      smart-classify-back/.github/FUNDING.yml
  4. 47
    0
      smart-classify-back/.gitignore
  5. 20
    0
      smart-classify-back/LICENSE
  6. 97
    0
      smart-classify-back/README.md
  7. 12
    0
      smart-classify-back/bin/clean.bat
  8. 12
    0
      smart-classify-back/bin/package.bat
  9. 14
    0
      smart-classify-back/bin/run.bat
  10. Binārs
      smart-classify-back/doc/GDAL.zip
  11. Binārs
      smart-classify-back/doc/若依环境使用手册.docx
  12. 225
    0
      smart-classify-back/pom.xml
  13. 175
    0
      smart-classify-back/ruoyi-admin/pom.xml
  14. 21
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
  15. 18
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java
  16. 94
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java
  17. 163
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java
  18. 32
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/image/segment/ImageSegController.java
  19. 98
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/image/segment/PaddleSegController.java
  20. 73
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/image/segment/PreprocessController.java
  21. 97
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/map/controller/ModelController.java
  22. 394
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/map/controller/MultiDataSourceController.java
  23. 139
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/map/util/CoordinateUtil.java
  24. 191
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/map/util/GeoJsonUtil.java
  25. 120
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java
  26. 27
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java
  27. 82
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java
  28. 69
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java
  29. 83
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java
  30. 133
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java
  31. 132
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java
  32. 121
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java
  33. 131
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java
  34. 29
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java
  35. 86
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
  36. 142
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
  37. 91
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java
  38. 129
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java
  39. 141
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java
  40. 38
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java
  41. 262
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java
  42. 251
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java
  43. 183
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java
  44. 125
    0
      smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java
  45. 1
    0
      smart-classify-back/ruoyi-admin/src/main/resources/META-INF/spring-devtools.properties
  46. 68
    0
      smart-classify-back/ruoyi-admin/src/main/resources/application-druid.yml
  47. 132
    0
      smart-classify-back/ruoyi-admin/src/main/resources/application.yml
  48. 2
    0
      smart-classify-back/ruoyi-admin/src/main/resources/banner.txt
  49. Binārs
      smart-classify-back/ruoyi-admin/src/main/resources/gdal/gdal.jar
  50. 38
    0
      smart-classify-back/ruoyi-admin/src/main/resources/i18n/messages.properties
  51. 93
    0
      smart-classify-back/ruoyi-admin/src/main/resources/logback.xml
  52. 20
    0
      smart-classify-back/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml
  53. Binārs
      smart-classify-back/ruoyi-admin/src/main/resources/paddle/paddle-serving-sdk-java-0.0.1.jar
  54. Binārs
      smart-classify-back/ruoyi-admin/src/main/resources/static/ry_sqlite_20230607.db
  55. 131
    0
      smart-classify-back/ruoyi-common/pom.xml
  56. 19
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java
  57. 33
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java
  58. 28
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java
  59. 187
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java
  60. 18
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java
  61. 51
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java
  62. 40
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java
  63. 31
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java
  64. 135
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java
  65. 44
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java
  66. 142
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java
  67. 117
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java
  68. 94
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java
  69. 50
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java
  70. 78
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java
  71. 202
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java
  72. 185
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java
  73. 118
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java
  74. 115
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java
  75. 79
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java
  76. 77
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java
  77. 203
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java
  78. 176
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java
  79. 96
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java
  80. 259
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java
  81. 241
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java
  82. 324
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java
  83. 69
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java
  84. 266
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java
  85. 11
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java
  86. 101
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java
  87. 85
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java
  88. 56
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java
  89. 268
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java
  90. 86
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java
  91. 1000
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java
  92. 92
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java
  93. 20
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java
  94. 59
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java
  95. 19
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java
  96. 36
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java
  97. 20
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java
  98. 24
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java
  99. 30
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java
  100. 0
    0
      smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java

+ 3
- 0
LICENSE Parādīt failu

@@ -0,0 +1,3 @@
1
+Copyright (C) 2006 by Rob Landley <rob@landley.net>
2
+Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.
3
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

+ 10
- 0
README.md Parādīt failu

@@ -0,0 +1,10 @@
1
+# Smart-Data-Loading
2
+
3
+智慧多源数据加载平台(若依版)
4
+
5
+使用Cesium + openlayers + Vue3 + Spring Boot 搭建Web端一体化智慧多源数据加载平台
6
+能够加载shp压缩包、dxf、kml、GeoJson数据
7
+
8
+# 前端:
9
+npm install 加载所有的依赖包
10
+

+ 1
- 0
smart-classify-back/.github/FUNDING.yml Parādīt failu

@@ -0,0 +1 @@
1
+custom: http://doc.ruoyi.vip/ruoyi-vue/other/donate.html

+ 47
- 0
smart-classify-back/.gitignore Parādīt failu

@@ -0,0 +1,47 @@
1
+######################################################################
2
+# Build Tools
3
+
4
+.gradle
5
+/build/
6
+!gradle/wrapper/gradle-wrapper.jar
7
+
8
+target/
9
+!.mvn/wrapper/maven-wrapper.jar
10
+
11
+######################################################################
12
+# IDE
13
+
14
+### STS ###
15
+.apt_generated
16
+.classpath
17
+.factorypath
18
+.project
19
+.settings
20
+.springBeans
21
+
22
+### IntelliJ IDEA ###
23
+.idea
24
+*.iws
25
+*.iml
26
+*.ipr
27
+
28
+### JRebel ###
29
+rebel.xml
30
+
31
+### NetBeans ###
32
+nbproject/private/
33
+build/*
34
+nbbuild/
35
+dist/
36
+nbdist/
37
+.nb-gradle/
38
+
39
+######################################################################
40
+# Others
41
+*.log
42
+*.xml.versionsBackup
43
+*.swp
44
+
45
+!*/build/*.java
46
+!*/build/*.html
47
+!*/build/*.xml

+ 20
- 0
smart-classify-back/LICENSE Parādīt failu

@@ -0,0 +1,20 @@
1
+The MIT License (MIT)
2
+
3
+Copyright (c) 2018 RuoYi
4
+
5
+Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+this software and associated documentation files (the "Software"), to deal in
7
+the Software without restriction, including without limitation the rights to
8
+use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+the Software, and to permit persons to whom the Software is furnished to do so,
10
+subject to the following conditions:
11
+
12
+The above copyright notice and this permission notice shall be included in all
13
+copies or substantial portions of the Software.
14
+
15
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
17
+FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

+ 97
- 0
smart-classify-back/README.md Parādīt failu

@@ -0,0 +1,97 @@
1
+<p align="center">
2
+	<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
3
+</p>
4
+<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v3.8.5</h1>
5
+<h4 align="center">基于SpringBoot+Vue前后端分离的Java快速开发框架</h4>
6
+<p align="center">
7
+	<a href="https://gitee.com/y_project/RuoYi-Vue/stargazers"><img src="https://gitee.com/y_project/RuoYi-Vue/badge/star.svg?theme=dark"></a>
8
+	<a href="https://gitee.com/y_project/RuoYi-Vue"><img src="https://img.shields.io/badge/RuoYi-v3.8.5-brightgreen.svg"></a>
9
+	<a href="https://gitee.com/y_project/RuoYi-Vue/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
10
+</p>
11
+
12
+## 平台简介
13
+
14
+若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
15
+
16
+* 前端采用Vue、Element UI。
17
+* 后端采用Spring Boot、Spring Security、Redis & Jwt。
18
+* 权限认证使用Jwt,支持多终端认证系统。
19
+* 支持加载动态权限菜单,多方式轻松权限控制。
20
+* 高效率开发,使用代码生成器可以一键生成前后端代码。
21
+* 提供了技术栈([Vue3](https://v3.cn.vuejs.org) [Element Plus](https://element-plus.org/zh-CN) [Vite](https://cn.vitejs.dev))版本[RuoYi-Vue3](https://github.com/yangzongzhuan/RuoYi-Vue3),保持同步更新。
22
+* 提供了单应用版本[RuoYi-Vue-fast](https://github.com/yangzongzhuan/RuoYi-Vue-fast),Oracle版本[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。
23
+* 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud)
24
+* 特别鸣谢:[element](https://github.com/ElemeFE/element),[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin),[eladmin-web](https://github.com/elunez/eladmin-web)。
25
+* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)&nbsp;&nbsp;
26
+* 阿里云优惠券:[点我领取](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)&nbsp;&nbsp;
27
+
28
+## 内置功能
29
+
30
+1.  用户管理:用户是系统操作者,该功能主要完成系统用户配置。
31
+2.  部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
32
+3.  岗位管理:配置系统用户所属担任职务。
33
+4.  菜单管理:配置系统菜单,操作权限,按钮权限标识等。
34
+5.  角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
35
+6.  字典管理:对系统中经常使用的一些较为固定的数据进行维护。
36
+7.  参数管理:对系统动态配置常用参数。
37
+8.  通知公告:系统通知公告信息发布维护。
38
+9.  操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
39
+10. 登录日志:系统登录日志记录查询包含登录异常。
40
+11. 在线用户:当前系统中活跃用户状态监控。
41
+12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
42
+13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。
43
+14. 系统接口:根据业务代码自动生成相关的api接口文档。
44
+15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。
45
+16. 缓存监控:对系统的缓存信息查询,命令统计等。
46
+17. 在线构建器:拖动表单元素生成相应的HTML代码。
47
+18. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。
48
+
49
+## 在线体验
50
+
51
+- admin/admin123  
52
+- 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。
53
+
54
+演示地址:http://vue.ruoyi.vip  
55
+文档地址:http://doc.ruoyi.vip
56
+
57
+## 演示图
58
+
59
+<table>
60
+    <tr>
61
+        <td><img src="https://oscimg.oschina.net/oscnet/cd1f90be5f2684f4560c9519c0f2a232ee8.jpg"/></td>
62
+        <td><img src="https://oscimg.oschina.net/oscnet/1cbcf0e6f257c7d3a063c0e3f2ff989e4b3.jpg"/></td>
63
+    </tr>
64
+    <tr>
65
+        <td><img src="https://oscimg.oschina.net/oscnet/up-8074972883b5ba0622e13246738ebba237a.png"/></td>
66
+        <td><img src="https://oscimg.oschina.net/oscnet/up-9f88719cdfca9af2e58b352a20e23d43b12.png"/></td>
67
+    </tr>
68
+    <tr>
69
+        <td><img src="https://oscimg.oschina.net/oscnet/up-39bf2584ec3a529b0d5a3b70d15c9b37646.png"/></td>
70
+        <td><img src="https://oscimg.oschina.net/oscnet/up-936ec82d1f4872e1bc980927654b6007307.png"/></td>
71
+    </tr>
72
+	<tr>
73
+        <td><img src="https://oscimg.oschina.net/oscnet/up-b2d62ceb95d2dd9b3fbe157bb70d26001e9.png"/></td>
74
+        <td><img src="https://oscimg.oschina.net/oscnet/up-d67451d308b7a79ad6819723396f7c3d77a.png"/></td>
75
+    </tr>	 
76
+    <tr>
77
+        <td><img src="https://oscimg.oschina.net/oscnet/5e8c387724954459291aafd5eb52b456f53.jpg"/></td>
78
+        <td><img src="https://oscimg.oschina.net/oscnet/644e78da53c2e92a95dfda4f76e6d117c4b.jpg"/></td>
79
+    </tr>
80
+	<tr>
81
+        <td><img src="https://oscimg.oschina.net/oscnet/up-8370a0d02977eebf6dbf854c8450293c937.png"/></td>
82
+        <td><img src="https://oscimg.oschina.net/oscnet/up-49003ed83f60f633e7153609a53a2b644f7.png"/></td>
83
+    </tr>
84
+	<tr>
85
+        <td><img src="https://oscimg.oschina.net/oscnet/up-d4fe726319ece268d4746602c39cffc0621.png"/></td>
86
+        <td><img src="https://oscimg.oschina.net/oscnet/up-c195234bbcd30be6927f037a6755e6ab69c.png"/></td>
87
+    </tr>
88
+    <tr>
89
+        <td><img src="https://oscimg.oschina.net/oscnet/b6115bc8c31de52951982e509930b20684a.jpg"/></td>
90
+        <td><img src="https://oscimg.oschina.net/oscnet/up-5e4daac0bb59612c5038448acbcef235e3a.png"/></td>
91
+    </tr>
92
+</table>
93
+
94
+
95
+## 若依前后端分离交流群
96
+
97
+QQ群: [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/已满-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![加入QQ群](https://img.shields.io/badge/已满-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![加入QQ群](https://img.shields.io/badge/已满-167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [![加入QQ群](https://img.shields.io/badge/已满-104748341-blue.svg)](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [![加入QQ群](https://img.shields.io/badge/已满-160110482-blue.svg)](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [![加入QQ群](https://img.shields.io/badge/已满-170801498-blue.svg)](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [![加入QQ群](https://img.shields.io/badge/已满-108482800-blue.svg)](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [![加入QQ群](https://img.shields.io/badge/已满-101046199-blue.svg)](https://jq.qq.com/?_wv=1027&k=SpyH2875) [![加入QQ群](https://img.shields.io/badge/136919097-blue.svg)](https://jq.qq.com/?_wv=1027&k=tKEt51dz) 点击按钮入群。

+ 12
- 0
smart-classify-back/bin/clean.bat Parādīt failu

@@ -0,0 +1,12 @@
1
+@echo off
2
+echo.
3
+echo [信息] 清理工程target生成路径。
4
+echo.
5
+
6
+%~d0
7
+cd %~dp0
8
+
9
+cd ..
10
+call mvn clean
11
+
12
+pause

+ 12
- 0
smart-classify-back/bin/package.bat Parādīt failu

@@ -0,0 +1,12 @@
1
+@echo off
2
+echo.
3
+echo [信息] 打包Web工程,生成war/jar包文件。
4
+echo.
5
+
6
+%~d0
7
+cd %~dp0
8
+
9
+cd ..
10
+call mvn clean package -Dmaven.test.skip=true
11
+
12
+pause

+ 14
- 0
smart-classify-back/bin/run.bat Parādīt failu

@@ -0,0 +1,14 @@
1
+@echo off
2
+echo.
3
+echo [信息] 使用Jar命令运行Web工程。
4
+echo.
5
+
6
+cd %~dp0
7
+cd ../ruoyi-admin/target
8
+
9
+set JAVA_OPTS=-Xms256m -Xmx1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=512m
10
+
11
+java -jar %JAVA_OPTS% ruoyi-admin.jar
12
+
13
+cd bin
14
+pause

Binārs
smart-classify-back/doc/GDAL.zip Parādīt failu


Binārs
smart-classify-back/doc/若依环境使用手册.docx Parādīt failu


+ 225
- 0
smart-classify-back/pom.xml Parādīt failu

@@ -0,0 +1,225 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project xmlns="http://maven.apache.org/POM/4.0.0"
3
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
+	<modelVersion>4.0.0</modelVersion>
6
+	
7
+    <groupId>com.ruoyi</groupId>
8
+    <artifactId>ruoyi</artifactId>
9
+    <version>3.8.5</version>
10
+
11
+    <name>ruoyi</name>
12
+    <url>http://www.ruoyi.vip</url>
13
+    <description>若依管理系统</description>
14
+    
15
+    <properties>
16
+        <ruoyi.version>3.8.5</ruoyi.version>
17
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
18
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
19
+        <java.version>1.8</java.version>
20
+        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
21
+        <druid.version>1.2.16</druid.version>
22
+        <bitwalker.version>1.21</bitwalker.version>
23
+        <swagger.version>3.0.0</swagger.version>
24
+        <kaptcha.version>2.3.3</kaptcha.version>
25
+        <pagehelper.boot.version>1.4.6</pagehelper.boot.version>
26
+        <fastjson.version>2.0.25</fastjson.version>
27
+        <oshi.version>6.4.0</oshi.version>
28
+        <commons.io.version>2.11.0</commons.io.version>
29
+        <commons.collections.version>3.2.2</commons.collections.version>
30
+        <poi.version>4.1.2</poi.version>
31
+        <velocity.version>2.3</velocity.version>
32
+        <jwt.version>0.9.1</jwt.version>
33
+    </properties>
34
+	
35
+    <!-- 依赖声明 -->
36
+    <dependencyManagement>
37
+        <dependencies>
38
+
39
+            <!-- SpringBoot的依赖配置-->
40
+            <dependency>
41
+                <groupId>org.springframework.boot</groupId>
42
+                <artifactId>spring-boot-dependencies</artifactId>
43
+                <version>2.5.14</version>
44
+                <type>pom</type>
45
+                <scope>import</scope>
46
+            </dependency>
47
+
48
+            <!-- 阿里数据库连接池 -->
49
+            <dependency>
50
+                <groupId>com.alibaba</groupId>
51
+                <artifactId>druid-spring-boot-starter</artifactId>
52
+                <version>${druid.version}</version>
53
+            </dependency>
54
+
55
+            <!-- 解析客户端操作系统、浏览器等 -->
56
+            <dependency>
57
+                <groupId>eu.bitwalker</groupId>
58
+                <artifactId>UserAgentUtils</artifactId>
59
+                <version>${bitwalker.version}</version>
60
+            </dependency>
61
+
62
+            <!-- pagehelper 分页插件 -->
63
+            <dependency>
64
+                <groupId>com.github.pagehelper</groupId>
65
+                <artifactId>pagehelper-spring-boot-starter</artifactId>
66
+                <version>${pagehelper.boot.version}</version>
67
+            </dependency>
68
+
69
+            <!-- 获取系统信息 -->
70
+            <dependency>
71
+                <groupId>com.github.oshi</groupId>
72
+                <artifactId>oshi-core</artifactId>
73
+                <version>${oshi.version}</version>
74
+            </dependency>
75
+
76
+            <!-- Swagger3依赖 -->
77
+            <dependency>
78
+                <groupId>io.springfox</groupId>
79
+                <artifactId>springfox-boot-starter</artifactId>
80
+                <version>${swagger.version}</version>
81
+                <exclusions>
82
+                    <exclusion>
83
+                        <groupId>io.swagger</groupId>
84
+                        <artifactId>swagger-models</artifactId>
85
+                    </exclusion>
86
+                </exclusions>
87
+            </dependency>
88
+
89
+            <!-- io常用工具类 -->
90
+            <dependency>
91
+                <groupId>commons-io</groupId>
92
+                <artifactId>commons-io</artifactId>
93
+                <version>${commons.io.version}</version>
94
+            </dependency>
95
+
96
+            <!-- excel工具 -->
97
+            <dependency>
98
+                <groupId>org.apache.poi</groupId>
99
+                <artifactId>poi-ooxml</artifactId>
100
+                <version>${poi.version}</version>
101
+            </dependency>
102
+
103
+            <!-- velocity代码生成使用模板 -->
104
+            <dependency>
105
+                <groupId>org.apache.velocity</groupId>
106
+                <artifactId>velocity-engine-core</artifactId>
107
+                <version>${velocity.version}</version>
108
+            </dependency>
109
+
110
+            <!-- collections工具类 -->
111
+            <dependency>
112
+                <groupId>commons-collections</groupId>
113
+                <artifactId>commons-collections</artifactId>
114
+                <version>${commons.collections.version}</version>
115
+            </dependency>
116
+
117
+            <!-- 阿里JSON解析器 -->
118
+            <dependency>
119
+                <groupId>com.alibaba.fastjson2</groupId>
120
+                <artifactId>fastjson2</artifactId>
121
+                <version>${fastjson.version}</version>
122
+            </dependency>
123
+
124
+            <!-- Token生成与解析-->
125
+            <dependency>
126
+                <groupId>io.jsonwebtoken</groupId>
127
+                <artifactId>jjwt</artifactId>
128
+                <version>${jwt.version}</version>
129
+            </dependency>
130
+
131
+            <!-- 验证码 -->
132
+            <dependency>
133
+                <groupId>pro.fessional</groupId>
134
+                <artifactId>kaptcha</artifactId>
135
+                <version>${kaptcha.version}</version>
136
+            </dependency>
137
+
138
+            <!-- 定时任务-->
139
+            <dependency>
140
+                <groupId>com.ruoyi</groupId>
141
+                <artifactId>ruoyi-quartz</artifactId>
142
+                <version>${ruoyi.version}</version>
143
+            </dependency>
144
+
145
+            <!-- 代码生成-->
146
+            <dependency>
147
+                <groupId>com.ruoyi</groupId>
148
+                <artifactId>ruoyi-generator</artifactId>
149
+                <version>${ruoyi.version}</version>
150
+            </dependency>
151
+
152
+            <!-- 核心模块-->
153
+            <dependency>
154
+                <groupId>com.ruoyi</groupId>
155
+                <artifactId>ruoyi-framework</artifactId>
156
+                <version>${ruoyi.version}</version>
157
+            </dependency>
158
+
159
+            <!-- 系统模块-->
160
+            <dependency>
161
+                <groupId>com.ruoyi</groupId>
162
+                <artifactId>ruoyi-system</artifactId>
163
+                <version>${ruoyi.version}</version>
164
+            </dependency>
165
+
166
+            <!-- 通用工具-->
167
+            <dependency>
168
+                <groupId>com.ruoyi</groupId>
169
+                <artifactId>ruoyi-common</artifactId>
170
+                <version>${ruoyi.version}</version>
171
+            </dependency>
172
+        </dependencies>
173
+    </dependencyManagement>
174
+
175
+    <modules>
176
+        <module>ruoyi-admin</module>
177
+        <module>ruoyi-framework</module>
178
+        <module>ruoyi-system</module>
179
+        <module>ruoyi-quartz</module>
180
+        <module>ruoyi-generator</module>
181
+        <module>ruoyi-common</module>
182
+    </modules>
183
+    <packaging>pom</packaging>
184
+
185
+    <build>
186
+        <plugins>
187
+            <plugin>
188
+                <groupId>org.apache.maven.plugins</groupId>
189
+                <artifactId>maven-compiler-plugin</artifactId>
190
+                <version>3.1</version>
191
+                <configuration>
192
+                    <source>${java.version}</source>
193
+                    <target>${java.version}</target>
194
+                    <encoding>${project.build.sourceEncoding}</encoding>
195
+                </configuration>
196
+            </plugin>
197
+        </plugins>
198
+    </build>
199
+
200
+    <repositories>
201
+        <repository>
202
+            <id>public</id>
203
+            <name>aliyun nexus</name>
204
+            <url>https://maven.aliyun.com/repository/public</url>
205
+            <releases>
206
+                <enabled>true</enabled>
207
+            </releases>
208
+        </repository>
209
+    </repositories>
210
+
211
+    <pluginRepositories>
212
+        <pluginRepository>
213
+            <id>public</id>
214
+            <name>aliyun nexus</name>
215
+            <url>https://maven.aliyun.com/repository/public</url>
216
+            <releases>
217
+                <enabled>true</enabled>
218
+            </releases>
219
+            <snapshots>
220
+                <enabled>false</enabled>
221
+            </snapshots>
222
+        </pluginRepository>
223
+    </pluginRepositories>
224
+
225
+</project>

+ 175
- 0
smart-classify-back/ruoyi-admin/pom.xml Parādīt failu

@@ -0,0 +1,175 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project xmlns="http://maven.apache.org/POM/4.0.0"
3
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
+    <parent>
6
+        <artifactId>ruoyi</artifactId>
7
+        <groupId>com.ruoyi</groupId>
8
+        <version>3.8.5</version>
9
+    </parent>
10
+    <modelVersion>4.0.0</modelVersion>
11
+    <packaging>jar</packaging>
12
+    <artifactId>ruoyi-admin</artifactId>
13
+
14
+    <description>
15
+        web服务入口
16
+    </description>
17
+
18
+    <dependencies>
19
+
20
+        <!-- spring-boot-devtools -->
21
+<!--        <dependency>-->
22
+<!--            <groupId>org.springframework.boot</groupId>-->
23
+<!--            <artifactId>spring-boot-devtools</artifactId>-->
24
+<!--            <optional>true</optional> &lt;!&ndash; 表示依赖不会传递 &ndash;&gt;-->
25
+<!--        </dependency>-->
26
+
27
+        <!-- spring-boot使用jetty容器配置begin -->
28
+        <dependency>
29
+            <groupId>org.springframework.boot</groupId>
30
+            <artifactId>spring-boot-starter-web</artifactId>
31
+            <!-- 排除默认的tomcat,引入jetty容器. -->
32
+            <exclusions>
33
+                <exclusion>
34
+                    <groupId>org.springframework.boot</groupId>
35
+                    <artifactId>spring-boot-starter-tomcat</artifactId>
36
+                </exclusion>
37
+            </exclusions>
38
+        </dependency>
39
+        <!-- jetty 容器. -->
40
+        <dependency>
41
+            <groupId>org.springframework.boot</groupId>
42
+            <artifactId>spring-boot-starter-jetty</artifactId>
43
+        </dependency>
44
+
45
+        <dependency>
46
+            <groupId>org.eclipse.jetty</groupId>
47
+            <artifactId>jetty-jsp</artifactId>
48
+            <version>9.2.30.v20200428</version>
49
+        </dependency>
50
+
51
+        <!-- swagger3-->
52
+        <dependency>
53
+            <groupId>io.springfox</groupId>
54
+            <artifactId>springfox-boot-starter</artifactId>
55
+        </dependency>
56
+
57
+        <!-- 防止进入swagger页面报类型转换错误,排除3.0.0中的引用,手动增加1.6.2版本 -->
58
+        <dependency>
59
+            <groupId>io.swagger</groupId>
60
+            <artifactId>swagger-models</artifactId>
61
+            <version>1.6.8</version>
62
+        </dependency>
63
+
64
+         <!-- Mysql驱动包 -->
65
+        <dependency>
66
+            <groupId>mysql</groupId>
67
+            <artifactId>mysql-connector-java</artifactId>
68
+        </dependency>
69
+
70
+        <!-- sqlite3驱动包 -->
71
+        <dependency>
72
+            <groupId>org.xerial</groupId>
73
+            <artifactId>sqlite-jdbc</artifactId>
74
+            <version>3.40.1.0</version>
75
+        </dependency>
76
+
77
+        <!-- 核心模块-->
78
+        <dependency>
79
+            <groupId>com.ruoyi</groupId>
80
+            <artifactId>ruoyi-framework</artifactId>
81
+        </dependency>
82
+
83
+        <!-- 定时任务-->
84
+        <dependency>
85
+            <groupId>com.ruoyi</groupId>
86
+            <artifactId>ruoyi-quartz</artifactId>
87
+        </dependency>
88
+
89
+        <!-- 代码生成-->
90
+        <dependency>
91
+            <groupId>com.ruoyi</groupId>
92
+            <artifactId>ruoyi-generator</artifactId>
93
+        </dependency>
94
+
95
+        <dependency>
96
+            <groupId>com.alibaba</groupId>
97
+            <artifactId>fastjson</artifactId>
98
+            <version>1.2.83</version>
99
+        </dependency>
100
+
101
+        <dependency>
102
+            <groupId>cn.hutool</groupId>
103
+            <artifactId>hutool-all</artifactId>
104
+            <version>5.8.15</version>
105
+        </dependency>
106
+
107
+        <dependency>
108
+            <groupId>com.google.code.gson</groupId>
109
+            <artifactId>gson</artifactId>
110
+            <version>2.10.1</version>
111
+        </dependency>
112
+
113
+        <dependency>
114
+            <groupId>org.gdal</groupId>
115
+            <artifactId>gdal</artifactId>
116
+            <version>3.7.4</version>
117
+            <scope>system</scope>
118
+            <systemPath>${project.basedir}/${gdal.bindir}/gdal.jar</systemPath>
119
+        </dependency>
120
+
121
+        <dependency>
122
+            <groupId>io.paddle.serving.client</groupId>
123
+            <artifactId>paddle-serving-sdk-java</artifactId>
124
+            <version>0.0.1</version>
125
+            <scope>system</scope>
126
+            <systemPath>${project.basedir}/${paddle.bindir}/paddle-serving-sdk-java-0.0.1.jar</systemPath>
127
+        </dependency>
128
+
129
+    </dependencies>
130
+
131
+    <repositories>
132
+        <repository>
133
+            <id>osgeo</id>
134
+            <name>OSGeo Release Repository</name>
135
+            <url>https://repo.osgeo.org/repository/release/</url>
136
+            <snapshots><enabled>false</enabled></snapshots>
137
+            <releases><enabled>true</enabled></releases>
138
+        </repository>
139
+    </repositories>
140
+
141
+    <build>
142
+        <plugins>
143
+            <plugin>
144
+                <groupId>org.springframework.boot</groupId>
145
+                <artifactId>spring-boot-maven-plugin</artifactId>
146
+                <version>2.1.1.RELEASE</version>
147
+                <configuration>
148
+                    <includeSystemScope>true</includeSystemScope>
149
+                    <fork>true</fork> <!-- 如果没有该配置,devtools不会生效 -->
150
+                </configuration>
151
+                <executions>
152
+                    <execution>
153
+                        <goals>
154
+                            <goal>repackage</goal>
155
+                        </goals>
156
+                    </execution>
157
+                </executions>
158
+            </plugin>
159
+            <plugin>
160
+                <groupId>org.apache.maven.plugins</groupId>
161
+                <artifactId>maven-war-plugin</artifactId>
162
+                <version>3.1.0</version>
163
+                <configuration>
164
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
165
+                    <warName>${project.artifactId}</warName>
166
+                </configuration>
167
+            </plugin>
168
+        </plugins>
169
+        <finalName>${project.artifactId}</finalName>
170
+    </build>
171
+    <properties>
172
+        <gdal.bindir>src/main/resources/gdal</gdal.bindir>
173
+        <paddle.bindir>src/main/resources/paddle</paddle.bindir>
174
+    </properties>
175
+</project>

+ 21
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java Parādīt failu

@@ -0,0 +1,21 @@
1
+package com.ruoyi;
2
+
3
+import org.springframework.boot.SpringApplication;
4
+import org.springframework.boot.autoconfigure.SpringBootApplication;
5
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
6
+
7
+/**
8
+ * 启动程序
9
+ * 
10
+ * @author ruoyi
11
+ */
12
+@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
13
+public class RuoYiApplication
14
+{
15
+    public static void main(String[] args)
16
+    {
17
+        // System.setProperty("spring.devtools.restart.enabled", "false");
18
+        SpringApplication.run(RuoYiApplication.class, args);
19
+        System.out.println("影像智能解译后台启动成功 \n");
20
+    }
21
+}

+ 18
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/RuoYiServletInitializer.java Parādīt failu

@@ -0,0 +1,18 @@
1
+package com.ruoyi;
2
+
3
+import org.springframework.boot.builder.SpringApplicationBuilder;
4
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
5
+
6
+/**
7
+ * web容器中进行部署
8
+ * 
9
+ * @author ruoyi
10
+ */
11
+public class RuoYiServletInitializer extends SpringBootServletInitializer
12
+{
13
+    @Override
14
+    protected SpringApplicationBuilder configure(SpringApplicationBuilder application)
15
+    {
16
+        return application.sources(RuoYiApplication.class);
17
+    }
18
+}

+ 94
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CaptchaController.java Parādīt failu

@@ -0,0 +1,94 @@
1
+package com.ruoyi.web.controller.common;
2
+
3
+import java.awt.image.BufferedImage;
4
+import java.io.IOException;
5
+import java.util.concurrent.TimeUnit;
6
+import javax.annotation.Resource;
7
+import javax.imageio.ImageIO;
8
+import javax.servlet.http.HttpServletResponse;
9
+import org.springframework.beans.factory.annotation.Autowired;
10
+import org.springframework.util.FastByteArrayOutputStream;
11
+import org.springframework.web.bind.annotation.GetMapping;
12
+import org.springframework.web.bind.annotation.RestController;
13
+import com.google.code.kaptcha.Producer;
14
+import com.ruoyi.common.config.RuoYiConfig;
15
+import com.ruoyi.common.constant.CacheConstants;
16
+import com.ruoyi.common.constant.Constants;
17
+import com.ruoyi.common.core.domain.AjaxResult;
18
+import com.ruoyi.common.core.redis.RedisCache;
19
+import com.ruoyi.common.utils.sign.Base64;
20
+import com.ruoyi.common.utils.uuid.IdUtils;
21
+import com.ruoyi.system.service.ISysConfigService;
22
+
23
+/**
24
+ * 验证码操作处理
25
+ * 
26
+ * @author ruoyi
27
+ */
28
+@RestController
29
+public class CaptchaController
30
+{
31
+    @Resource(name = "captchaProducer")
32
+    private Producer captchaProducer;
33
+
34
+    @Resource(name = "captchaProducerMath")
35
+    private Producer captchaProducerMath;
36
+
37
+    @Autowired
38
+    private RedisCache redisCache;
39
+    
40
+    @Autowired
41
+    private ISysConfigService configService;
42
+    /**
43
+     * 生成验证码
44
+     */
45
+    @GetMapping("/captchaImage")
46
+    public AjaxResult getCode(HttpServletResponse response) throws IOException
47
+    {
48
+        AjaxResult ajax = AjaxResult.success();
49
+        boolean captchaEnabled = configService.selectCaptchaEnabled();
50
+        ajax.put("captchaEnabled", captchaEnabled);
51
+        if (!captchaEnabled)
52
+        {
53
+            return ajax;
54
+        }
55
+
56
+        // 保存验证码信息
57
+        String uuid = IdUtils.simpleUUID();
58
+        String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
59
+
60
+        String capStr = null, code = null;
61
+        BufferedImage image = null;
62
+
63
+        // 生成验证码
64
+        String captchaType = RuoYiConfig.getCaptchaType();
65
+        if ("math".equals(captchaType))
66
+        {
67
+            String capText = captchaProducerMath.createText();
68
+            capStr = capText.substring(0, capText.lastIndexOf("@"));
69
+            code = capText.substring(capText.lastIndexOf("@") + 1);
70
+            image = captchaProducerMath.createImage(capStr);
71
+        }
72
+        else if ("char".equals(captchaType))
73
+        {
74
+            capStr = code = captchaProducer.createText();
75
+            image = captchaProducer.createImage(capStr);
76
+        }
77
+
78
+        redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
79
+        // 转换流信息写出
80
+        FastByteArrayOutputStream os = new FastByteArrayOutputStream();
81
+        try
82
+        {
83
+            ImageIO.write(image, "jpg", os);
84
+        }
85
+        catch (IOException e)
86
+        {
87
+            return AjaxResult.error(e.getMessage());
88
+        }
89
+
90
+        ajax.put("uuid", uuid);
91
+        ajax.put("img", Base64.encode(os.toByteArray()));
92
+        return ajax;
93
+    }
94
+}

+ 163
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/common/CommonController.java Parādīt failu

@@ -0,0 +1,163 @@
1
+package com.ruoyi.web.controller.common;
2
+
3
+import java.util.ArrayList;
4
+import java.util.List;
5
+import javax.servlet.http.HttpServletRequest;
6
+import javax.servlet.http.HttpServletResponse;
7
+import org.slf4j.Logger;
8
+import org.slf4j.LoggerFactory;
9
+import org.springframework.beans.factory.annotation.Autowired;
10
+import org.springframework.http.MediaType;
11
+import org.springframework.web.bind.annotation.GetMapping;
12
+import org.springframework.web.bind.annotation.PostMapping;
13
+import org.springframework.web.bind.annotation.RequestMapping;
14
+import org.springframework.web.bind.annotation.RestController;
15
+import org.springframework.web.multipart.MultipartFile;
16
+import com.ruoyi.common.config.RuoYiConfig;
17
+import com.ruoyi.common.constant.Constants;
18
+import com.ruoyi.common.core.domain.AjaxResult;
19
+import com.ruoyi.common.utils.StringUtils;
20
+import com.ruoyi.common.utils.file.FileUploadUtils;
21
+import com.ruoyi.common.utils.file.FileUtils;
22
+import com.ruoyi.framework.config.ServerConfig;
23
+
24
+/**
25
+ * 通用请求处理
26
+ * 
27
+ * @author ruoyi
28
+ */
29
+@RestController
30
+@RequestMapping("/common")
31
+public class CommonController
32
+{
33
+    private static final Logger log = LoggerFactory.getLogger(CommonController.class);
34
+
35
+    @Autowired
36
+    private ServerConfig serverConfig;
37
+
38
+    private static final String FILE_DELIMETER = ",";
39
+
40
+    /**
41
+     * 通用下载请求
42
+     * 
43
+     * @param fileName 文件名称
44
+     * @param delete 是否删除
45
+     */
46
+    @GetMapping("/download")
47
+    public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
48
+    {
49
+        try
50
+        {
51
+            if (!FileUtils.checkAllowDownload(fileName))
52
+            {
53
+                throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
54
+            }
55
+            String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
56
+            String filePath = RuoYiConfig.getDownloadPath() + fileName;
57
+
58
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
59
+            FileUtils.setAttachmentResponseHeader(response, realFileName);
60
+            FileUtils.writeBytes(filePath, response.getOutputStream());
61
+            if (delete)
62
+            {
63
+                FileUtils.deleteFile(filePath);
64
+            }
65
+        }
66
+        catch (Exception e)
67
+        {
68
+            log.error("下载文件失败", e);
69
+        }
70
+    }
71
+
72
+    /**
73
+     * 通用上传请求(单个)
74
+     */
75
+    @PostMapping("/upload")
76
+    public AjaxResult uploadFile(MultipartFile file) throws Exception
77
+    {
78
+        try
79
+        {
80
+            // 上传文件路径
81
+            String filePath = RuoYiConfig.getUploadPath();
82
+            // 上传并返回新文件名称
83
+            String fileName = FileUploadUtils.upload(filePath, file);
84
+            String url = serverConfig.getUrl() + fileName;
85
+            AjaxResult ajax = AjaxResult.success();
86
+            ajax.put("url", url);
87
+            ajax.put("fileName", fileName);
88
+            ajax.put("newFileName", FileUtils.getName(fileName));
89
+            ajax.put("originalFilename", file.getOriginalFilename());
90
+            return ajax;
91
+        }
92
+        catch (Exception e)
93
+        {
94
+            return AjaxResult.error(e.getMessage());
95
+        }
96
+    }
97
+
98
+    /**
99
+     * 通用上传请求(多个)
100
+     */
101
+    @PostMapping("/uploads")
102
+    public AjaxResult uploadFiles(List<MultipartFile> files) throws Exception
103
+    {
104
+        try
105
+        {
106
+            // 上传文件路径
107
+            String filePath = RuoYiConfig.getUploadPath();
108
+            List<String> urls = new ArrayList<String>();
109
+            List<String> fileNames = new ArrayList<String>();
110
+            List<String> newFileNames = new ArrayList<String>();
111
+            List<String> originalFilenames = new ArrayList<String>();
112
+            for (MultipartFile file : files)
113
+            {
114
+                // 上传并返回新文件名称
115
+                String fileName = FileUploadUtils.upload(filePath, file);
116
+                String url = serverConfig.getUrl() + fileName;
117
+                urls.add(url);
118
+                fileNames.add(fileName);
119
+                newFileNames.add(FileUtils.getName(fileName));
120
+                originalFilenames.add(file.getOriginalFilename());
121
+            }
122
+            AjaxResult ajax = AjaxResult.success();
123
+            ajax.put("urls", StringUtils.join(urls, FILE_DELIMETER));
124
+            ajax.put("fileNames", StringUtils.join(fileNames, FILE_DELIMETER));
125
+            ajax.put("newFileNames", StringUtils.join(newFileNames, FILE_DELIMETER));
126
+            ajax.put("originalFilenames", StringUtils.join(originalFilenames, FILE_DELIMETER));
127
+            return ajax;
128
+        }
129
+        catch (Exception e)
130
+        {
131
+            return AjaxResult.error(e.getMessage());
132
+        }
133
+    }
134
+
135
+    /**
136
+     * 本地资源通用下载
137
+     */
138
+    @GetMapping("/download/resource")
139
+    public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
140
+            throws Exception
141
+    {
142
+        try
143
+        {
144
+            if (!FileUtils.checkAllowDownload(resource))
145
+            {
146
+                throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
147
+            }
148
+            // 本地资源路径
149
+            String localPath = RuoYiConfig.getProfile();
150
+            // 数据库资源地址
151
+            String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
152
+            // 下载名称
153
+            String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
154
+            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
155
+            FileUtils.setAttachmentResponseHeader(response, downloadName);
156
+            FileUtils.writeBytes(downloadPath, response.getOutputStream());
157
+        }
158
+        catch (Exception e)
159
+        {
160
+            log.error("下载文件失败", e);
161
+        }
162
+    }
163
+}

+ 32
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/image/segment/ImageSegController.java Parādīt failu

@@ -0,0 +1,32 @@
1
+package com.ruoyi.web.controller.image.segment;
2
+
3
+import com.ruoyi.common.core.domain.AjaxResult;
4
+import org.springframework.web.bind.annotation.PostMapping;
5
+import org.springframework.web.bind.annotation.RequestMapping;
6
+import org.springframework.web.bind.annotation.RestController;
7
+
8
+/**
9
+ * @author: wrh
10
+ * @createTime: 2024/12/17 16:50
11
+ */
12
+@RestController
13
+@RequestMapping("/imageSeg")
14
+public class ImageSegController {
15
+
16
+    /**
17
+     * 根据范围获取水域
18
+     */
19
+    @PostMapping("/water")
20
+    public AjaxResult getWaterRegionByRange(String range) {
21
+        return AjaxResult.success();
22
+    }
23
+
24
+    /**
25
+     * 根据范围获取道路
26
+     */
27
+    @PostMapping("/road")
28
+    public AjaxResult getRoadRegionByRange(String range) {
29
+        return AjaxResult.success();
30
+    }
31
+
32
+}

+ 98
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/image/segment/PaddleSegController.java Parādīt failu

@@ -0,0 +1,98 @@
1
+package com.ruoyi.web.controller.image.segment;
2
+
3
+import com.alibaba.fastjson2.JSONObject;
4
+import org.springframework.beans.factory.annotation.Value;
5
+import org.springframework.http.HttpEntity;
6
+import org.springframework.http.HttpHeaders;
7
+import org.springframework.http.MediaType;
8
+import org.springframework.util.LinkedMultiValueMap;
9
+import org.springframework.util.MultiValueMap;
10
+import org.springframework.web.bind.annotation.PostMapping;
11
+import org.springframework.web.bind.annotation.RequestMapping;
12
+import org.springframework.web.bind.annotation.RequestParam;
13
+import org.springframework.web.bind.annotation.RestController;
14
+import org.springframework.web.client.RestTemplate;
15
+import org.springframework.web.multipart.MultipartFile;
16
+import sun.misc.BASE64Encoder;
17
+
18
+import java.io.*;
19
+import java.util.Objects;
20
+
21
+/**
22
+ * @author: wrh
23
+ * @createTime: 2024/12/12 10:01
24
+ */
25
+@RestController
26
+@RequestMapping("/paddleSeg")
27
+public class PaddleSegController {
28
+
29
+    @Value("${ruoyi.profile}")
30
+    private String profile;
31
+
32
+    @PostMapping("/upload")
33
+    public String fileUpload(@RequestParam("file") MultipartFile file) throws IOException {
34
+        try {
35
+            //接收上传文件
36
+            //Receiving uploaded files
37
+            File destFile = new File(profile);
38
+            if (!destFile.exists())//若此目录不存在,则创建
39
+                destFile.mkdirs();
40
+            File destFileName = new File( destFile + "/upload/uploadFiles/" + file.getOriginalFilename());
41
+            if (!destFile.exists())
42
+                file.transferTo(destFileName);
43
+            //开始准备请求API
44
+            //Start preparing the request API
45
+            //创建请求头
46
+            //Create request header
47
+            HttpHeaders headers = new HttpHeaders();
48
+            //设置请求头格式
49
+            //Set the request header format
50
+            headers.setContentType(MediaType.APPLICATION_JSON);
51
+            //构建请求参数
52
+            //Build request parameters
53
+            MultiValueMap<String, String> map = new LinkedMultiValueMap<String, String>();
54
+            //读入静态资源文件
55
+            //Read the static resource file
56
+            InputStream imagePath = new FileInputStream(destFile);
57
+            //添加请求参数images,并将Base64编码的图片传入
58
+            //Add the request parameter Images and pass in the Base64 encoded image
59
+            map.add("images", ImageToBase64(imagePath));
60
+            //构建请求
61
+            //Build request
62
+            HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<MultiValueMap<String, String>>(map, headers);
63
+            RestTemplate restTemplate = new RestTemplate();
64
+            //发送请求
65
+            //Send the request
66
+            JSONObject json = restTemplate.postForEntity("http://127.0.0.1:8868/predict/ocr_system", request,JSONObject.class).getBody();
67
+            System.out.println(json);
68
+            //解析Json返回值
69
+
70
+        } catch (FileNotFoundException e) {
71
+            e.printStackTrace();
72
+            return "上传失败," + e.getMessage();
73
+        }
74
+        return "OK";
75
+    }
76
+    private String ImageToBase64(InputStream imgPath) {
77
+        byte[] data = null;
78
+        // 读取图片字节数组
79
+        //Read the image byte array
80
+        try {
81
+            InputStream in = imgPath;
82
+            System.out.println(imgPath);
83
+            data = new byte[in.available()];
84
+            in.read(data);
85
+            in.close();
86
+        } catch (IOException e) {
87
+            e.printStackTrace();
88
+        }
89
+        // 对字节数组Base64编码
90
+        //Base64 encoding of byte array
91
+        BASE64Encoder encoder = new BASE64Encoder();
92
+        // 返回Base64编码过的字节数组字符串
93
+        //Returns a Base64 encoded byte array string
94
+        //System.out.println("图片转换Base64:" + encoder.encode(Objects.requireNonNull(data)));
95
+        return encoder.encode(Objects.requireNonNull(data));
96
+    }
97
+
98
+}

+ 73
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/image/segment/PreprocessController.java Parādīt failu

@@ -0,0 +1,73 @@
1
+package com.ruoyi.web.controller.image.segment;
2
+
3
+import com.alibaba.fastjson.JSONObject;
4
+import com.ruoyi.common.core.domain.AjaxResult;
5
+import io.swagger.annotations.ApiOperation;
6
+import org.springframework.web.bind.annotation.PostMapping;
7
+import org.springframework.web.bind.annotation.GetMapping;
8
+import org.springframework.web.bind.annotation.RequestMapping;
9
+import org.springframework.web.bind.annotation.RestController;
10
+
11
+import java.io.*;
12
+import java.nio.file.Files;
13
+import java.nio.file.Path;
14
+import java.nio.file.Paths;
15
+import java.util.ArrayList;
16
+import java.util.Arrays;
17
+import java.util.List;
18
+
19
+@RestController
20
+@RequestMapping("/preprocess")
21
+public class PreprocessController {
22
+
23
+    private JSONObject processValue = new JSONObject();
24
+
25
+    /**
26
+     * 删除无效TIFF
27
+     */
28
+    @ApiOperation(value = "删除无效TIFF", notes = "删除无效TIFF")
29
+    @PostMapping(value = "/deleteTiff")
30
+    public AjaxResult deleteTiff(String basePath) throws IOException {
31
+        List<File> nameList = deleteNodataTiff(basePath);
32
+        return AjaxResult.success(nameList);
33
+    }
34
+
35
+    /**
36
+     * 获取session中的进度值
37
+     */
38
+    @ApiOperation(value = "获取进度", notes = "获取进度")
39
+    @GetMapping(value = "/getProcess")
40
+    public AjaxResult getProcess() {
41
+        return AjaxResult.success(processValue);
42
+    }
43
+
44
+    public List<File> deleteNodataTiff(String basePath) throws IOException {
45
+        File dir = new File(basePath);
46
+        String basePathString = basePath.split("/")[basePath.split("/").length - 1];
47
+        Path path = Paths.get(basePath + "/" + basePathString + "list.txt");
48
+        byte[] data = Files.readAllBytes(path);
49
+        String result = new String(data, "utf-8");
50
+        List<String> resultList = Arrays.asList(result.split(" "));
51
+        List<File> fileList = new ArrayList<>(Arrays.asList(dir.listFiles()));
52
+        int total = fileList.size();
53
+        for (int f = 0; f < fileList.size(); f++) {
54
+            File file = fileList.get(f);
55
+            processValue.put("percentage", f + "/" + total);
56
+            processValue.put("remain", total - f);
57
+            if (file.getName().endsWith("tif")) {
58
+                if (resultList.contains(file.getName().split("\\.")[0])) {
59
+                    fileList.remove(f);
60
+                    fileList.remove(f - 1);
61
+                    fileList.remove(f - 2);
62
+                    if (f > 2)
63
+                        f = f - 3;
64
+                }
65
+            }
66
+        }
67
+        for (File file : fileList) {
68
+            file.delete();
69
+        }
70
+        return fileList;
71
+    }
72
+
73
+}

+ 97
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/map/controller/ModelController.java Parādīt failu

@@ -0,0 +1,97 @@
1
+package com.ruoyi.web.controller.map.controller;
2
+
3
+import java.util.List;
4
+import javax.servlet.http.HttpServletResponse;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.beans.factory.annotation.Value;
7
+import org.springframework.web.bind.annotation.GetMapping;
8
+import org.springframework.web.bind.annotation.PostMapping;
9
+import org.springframework.web.bind.annotation.PutMapping;
10
+import org.springframework.web.bind.annotation.DeleteMapping;
11
+import org.springframework.web.bind.annotation.PathVariable;
12
+import org.springframework.web.bind.annotation.RequestBody;
13
+import org.springframework.web.bind.annotation.RequestMapping;
14
+import org.springframework.web.bind.annotation.RestController;
15
+import com.ruoyi.common.core.controller.BaseController;
16
+import com.ruoyi.common.core.domain.AjaxResult;
17
+import com.ruoyi.map.domain.Model;
18
+import com.ruoyi.map.service.IModelService;
19
+import com.ruoyi.common.utils.poi.ExcelUtil;
20
+import com.ruoyi.common.core.page.TableDataInfo;
21
+
22
+/**
23
+ * 模型Controller
24
+ * 
25
+ * @author ruoyi
26
+ * @date 2023-07-03
27
+ */
28
+@RestController
29
+@RequestMapping("/map/model")
30
+public class ModelController extends BaseController
31
+{
32
+    @Autowired
33
+    private IModelService modelService;
34
+
35
+    @Value("${ruoyi.profile}")
36
+    private String upLoadPath;
37
+
38
+    /**
39
+     * 查询模型列表
40
+     */
41
+    @GetMapping("/list")
42
+    public TableDataInfo list(Model model)
43
+    {
44
+        startPage();
45
+        List<Model> list = modelService.selectModelList(model);
46
+        return getDataTable(list);
47
+    }
48
+
49
+    /**
50
+     * 导出模型列表
51
+     */
52
+    @PostMapping("/export")
53
+    public void export(HttpServletResponse response, Model model)
54
+    {
55
+        List<Model> list = modelService.selectModelList(model);
56
+        ExcelUtil<Model> util = new ExcelUtil<Model>(Model.class);
57
+        util.exportExcel(response, list, "模型数据");
58
+    }
59
+
60
+    /**
61
+     * 获取模型详细信息
62
+     */
63
+    @GetMapping(value = "/{id}")
64
+    public AjaxResult getInfo(@PathVariable("id") Integer id)
65
+    {
66
+        return success(modelService.selectModelById(id));
67
+    }
68
+
69
+    /**
70
+     * 新增模型
71
+     */
72
+    @PostMapping
73
+    public AjaxResult add(@RequestBody Model model)
74
+    {
75
+        if (model.getAddress() == null)
76
+            model.setAddress(System.getProperty("user.dir").split("\\\\")[0] + upLoadPath + "/" + model.getName().split(" ")[1] + "." + model.getName().split(" ")[0].toLowerCase());
77
+        return toAjax(modelService.insertModel(model));
78
+    }
79
+
80
+    /**
81
+     * 修改模型
82
+     */
83
+    @PutMapping
84
+    public AjaxResult edit(@RequestBody Model model)
85
+    {
86
+        return toAjax(modelService.updateModel(model));
87
+    }
88
+
89
+    /**
90
+     * 删除模型
91
+     */
92
+	@DeleteMapping("/{ids}")
93
+    public AjaxResult remove(@PathVariable Integer[] ids)
94
+    {
95
+        return toAjax(modelService.deleteModelByIds(ids));
96
+    }
97
+}

+ 394
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/map/controller/MultiDataSourceController.java Parādīt failu

@@ -0,0 +1,394 @@
1
+package com.ruoyi.web.controller.map.controller;
2
+
3
+import cn.hutool.core.io.file.FileReader;
4
+import com.alibaba.fastjson.JSON;
5
+import com.alibaba.fastjson.JSONArray;
6
+import com.alibaba.fastjson.JSONObject;
7
+import com.alibaba.fastjson.JSONReader;
8
+import com.alibaba.fastjson.serializer.SerializerFeature;
9
+import com.google.gson.stream.JsonReader;
10
+import com.ruoyi.common.core.domain.AjaxResult;
11
+import io.swagger.annotations.Api;
12
+import io.swagger.annotations.ApiOperation;
13
+import org.apache.commons.io.FileUtils;
14
+import org.eclipse.jetty.server.Server;
15
+import org.eclipse.jetty.webapp.WebAppContext;
16
+import org.gdal.gdal.gdal;
17
+import org.gdal.ogr.DataSource;
18
+import org.gdal.ogr.Driver;
19
+import org.gdal.ogr.ogr;
20
+import com.ruoyi.web.controller.map.util.CoordinateUtil;
21
+import com.ruoyi.web.controller.map.util.GeoJsonUtil;
22
+import org.springframework.beans.factory.annotation.Value;
23
+import org.springframework.web.bind.annotation.*;
24
+
25
+import org.springframework.web.multipart.MultipartFile;
26
+import org.springframework.web.multipart.MultipartHttpServletRequest;
27
+
28
+import javax.servlet.http.HttpServletRequest;
29
+import java.io.*;
30
+import java.net.InetSocketAddress;
31
+import java.nio.charset.StandardCharsets;
32
+import java.util.*;
33
+
34
+/**
35
+ * <p>
36
+ *  前端控制器
37
+ * </p>
38
+ *
39
+ * @author wrh
40
+ * @since 2023-03-29
41
+ */
42
+@RestController
43
+@Api(tags = "多源数据加载")
44
+@RequestMapping("/map/multiDataSource")
45
+public class MultiDataSourceController {
46
+
47
+    @Value("${ruoyi.profile}")
48
+    private String upLoadPath;
49
+
50
+    private JSONObject processValue = new JSONObject();
51
+
52
+    private int port = 6111;
53
+    private Server server = new Server(new InetSocketAddress("127.0.0.1", port));
54
+
55
+    private String workspace = "";
56
+    /**
57
+     * 文件夹映射
58
+     */
59
+    @ApiOperation(value = "文件夹映射", notes = "文件夹映射")
60
+    @RequestMapping(value = "/folderMapping", method = RequestMethod.GET)
61
+    public AjaxResult folderMapping(@RequestParam(name = "folderName") String folderName) {
62
+        String msg = "";
63
+        String timeStamp = String.valueOf(new Date().getTime());
64
+        if (startSeverWithTime(folderName, timeStamp)) {
65
+            msg = "http://localhost:" + 6111 + "/model/" + timeStamp;
66
+        }
67
+        return AjaxResult.success(msg);
68
+    }
69
+    private boolean startSeverWithTime(String folderName, String timeStamp) {
70
+        try {
71
+            if (server.isRunning()) {
72
+                System.out.println("正在停止");
73
+                server.stop();
74
+                server.join();
75
+            }
76
+            WebAppContext webContext = new WebAppContext(folderName, "/model/" + timeStamp);
77
+            server.setHandler(webContext);
78
+            server.start();
79
+        } catch (Exception e) {
80
+            e.printStackTrace();
81
+            return false;
82
+        }
83
+        return true;
84
+    }
85
+    private boolean startSever(String folderName) {
86
+        try {
87
+            if (server.isRunning()) {
88
+                System.out.println("正在停止");
89
+                server.stop();
90
+                server.join();
91
+            }
92
+            WebAppContext webContext = new WebAppContext(folderName, "/model");
93
+            server.setHandler(webContext);
94
+            server.start();
95
+        } catch (Exception e) {
96
+            e.printStackTrace();
97
+            return false;
98
+        }
99
+        return true;
100
+    }
101
+
102
+    /**
103
+     * 返回映射文件夹下含有tileset.json或tilemapresource.xml文件的子文件夹列表
104
+     */
105
+    @ApiOperation(value = "文件夹映射", notes = "文件夹映射")
106
+    @RequestMapping(value = "/getModelList", method = RequestMethod.GET)
107
+    public AjaxResult getModelList(@RequestParam(name = "folderName") String folderName) {
108
+        File dir = new File(folderName);
109
+        workspace = folderName;
110
+        List<String> fileFolderList = new ArrayList<>();
111
+        getAllFileFolder(dir, fileFolderList);
112
+        String msg = "";
113
+        if (startSever(folderName)) {
114
+            msg = "http://localhost:" + 6111 + "/model";
115
+        }
116
+        return AjaxResult.success(msg, fileFolderList);
117
+    }
118
+
119
+    public void getAllFileFolder(File fileInput, List<String> fileFolderList) {
120
+        // 获取文件列表
121
+        File[] fileList = fileInput.listFiles();
122
+        if ((fileList != null ? fileList.length : 0) > 0) {
123
+            for (File file : fileList) {
124
+                if (file.isDirectory()) {
125
+                    getAllFileFolder(file, fileFolderList);
126
+                } else {
127
+                    // 含有tileset.json或tilemapresource.xml文件
128
+                    if (file.getName().equals("tileset.json") || file.getName().equals("tilemapresource.xml")) {
129
+                        String fileFolder = file.getParent().replace("\\","/").replace(workspace,"") + "/" + file.getName();
130
+                        fileFolderList.add(fileFolder);
131
+                        break;
132
+                    }
133
+                    if (file.getName().endsWith(".kml") || file.getName().endsWith(".geojson")) {
134
+                        String fileFolder = file.getParent().replace("\\","/").replace(workspace,"") + "/" + file.getName();
135
+                        fileFolderList.add(fileFolder);
136
+                    }
137
+                }
138
+            }
139
+        }
140
+    }
141
+
142
+    /**
143
+     * 上传文件
144
+     */
145
+    @ApiOperation(value = "上传文件", notes = "上传文件")
146
+    @RequestMapping(value = "/uploadFile", method = RequestMethod.POST)
147
+    public AjaxResult uploadFile(HttpServletRequest request) throws IOException {
148
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
149
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
150
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
151
+            String fileName = entity.getValue().getOriginalFilename();
152
+            File dest = new File(upLoadPath + "/" + fileName);
153
+            FileUtils.copyInputStreamToFile(entity.getValue().getInputStream(), dest);
154
+        }
155
+        return AjaxResult.success("successful upload");
156
+    }
157
+
158
+    @ApiOperation(value = "dxf转geojson", notes = "dxf转geojson")
159
+    @RequestMapping(value = "/dxf2GeoJSON", method = RequestMethod.POST)
160
+    public AjaxResult dxf2GeoJSON(HttpServletRequest request) throws IOException {
161
+        AjaxResult ajax = new AjaxResult();
162
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
163
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
164
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
165
+            String fileName = entity.getValue().getOriginalFilename() + "";
166
+            File file = new File(upLoadPath + "/" + fileName);
167
+            FileUtils.copyInputStreamToFile(entity.getValue().getInputStream(), file);
168
+            processValue.put("percentage", "正在转换,请稍等");
169
+            File geoJsonFile = new File(file.getAbsolutePath().replace(".dxf", ".geojson").replace("\\","/"));
170
+            String geoJson = dxf2GeoJson(file, geoJsonFile);
171
+            if (geoJson.equals("success")) {
172
+                JSONObject newJsonObject = new JSONObject();
173
+                newJsonObject.put("type", "FeatureCollection");
174
+                newJsonObject.put("name", fileName.replace(".dxf", ""));
175
+                SplitGeoJson(geoJsonFile, newJsonObject);
176
+                ajax = AjaxResult.success("上传成功");
177
+            }
178
+            else
179
+                ajax = AjaxResult.error("加载失败");
180
+        }
181
+        return ajax;
182
+    }
183
+
184
+    @ApiOperation(value = "dxf转shp", notes = "dxf转shp")
185
+    @RequestMapping(value = "/dxf2Shp", method = RequestMethod.POST)
186
+    public AjaxResult dxf2Shp(HttpServletRequest request) throws IOException {
187
+        AjaxResult ajax = new AjaxResult();
188
+        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
189
+        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
190
+        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
191
+            String fileName = entity.getValue().getOriginalFilename() + "";
192
+            File file = new File(upLoadPath + "/" + fileName);
193
+            FileUtils.copyInputStreamToFile(entity.getValue().getInputStream(), file);
194
+            processValue.put("percentage", "正在转换,请稍等");
195
+            File shpFile = new File(file.getAbsolutePath().replace(".dxf", ".shp").replace("\\","/"));
196
+            String shp = dxf2Shp(file, shpFile);
197
+            if (shp.equals("success")) {
198
+                ajax = AjaxResult.success("上传成功");
199
+            }
200
+            else
201
+                ajax = AjaxResult.error("加载失败");
202
+        }
203
+        return ajax;
204
+    }
205
+
206
+    /**
207
+     * 获取session中的进度值
208
+     */
209
+    @ApiOperation(value = "获取上传进度", notes = "获取上传进度")
210
+    @RequestMapping(value = "/getProcess", method = RequestMethod.GET)
211
+    public AjaxResult getProcess() {
212
+        AjaxResult ajax;
213
+        if (processValue.size() == 0)
214
+            processValue.put("percentage", "正在转换,请稍等");
215
+        if (processValue.getString("fileNum") == null)
216
+            ajax = AjaxResult.success(processValue.getString("percentage") + "," + "0");
217
+        else
218
+            ajax = AjaxResult.success(processValue.getString("percentage") + "," + processValue.getString("fileNum"));
219
+        return ajax;
220
+    }
221
+
222
+    /**
223
+     * 获取GeoJSON文件
224
+     */
225
+    @ApiOperation(value = "获取单个geojson文件", notes = "获取单个geojson文件")
226
+    @RequestMapping(value = "/geoJSONFromDxf", method = RequestMethod.GET)
227
+    public AjaxResult geoJSONFromDxf(@RequestParam(name = "geoJsonName") String geoJsonName) {
228
+        if (new File(upLoadPath + "/" + geoJsonName + ".geojson").exists())
229
+//            return AjaxResult.success("", new FileReader(upLoadPath + "/" + geoJsonName + ".geojson").readString());
230
+            return AjaxResult.success("", new FileReader(upLoadPath + "/" + geoJsonName + ".geojson").readString());
231
+        else
232
+            return AjaxResult.success("加载完成");
233
+    }
234
+
235
+    /**
236
+     * 获取文件夹列表
237
+     */
238
+    @ApiOperation(value = "获取文件夹列表", notes = "获取文件夹列表")
239
+    @RequestMapping(value = "/getPath", method = RequestMethod.GET)
240
+    public AjaxResult getPath(@RequestParam(name = "pathName") String pathName) {
241
+        JSONObject ajaxResult = new JSONObject();
242
+        List<String> folderList = new ArrayList<>();
243
+        File[] roots;
244
+        if (pathName.equals(" ")) {
245
+            if (System.getProperty("os.name").toLowerCase().contains("linux")) {
246
+                roots = new File[1];
247
+                roots[0] = new File("/home");
248
+            }
249
+            else
250
+                roots = File.listRoots();
251
+        }
252
+        else {
253
+            roots = new File(pathName).listFiles();
254
+        }
255
+        if (roots != null) {
256
+            for (File root : roots)
257
+                folderList.add(root.getPath());
258
+        }
259
+        ajaxResult.put("folderList", folderList);
260
+        return AjaxResult.success(ajaxResult);
261
+    }
262
+    /**
263
+     * 拆分geojson
264
+     */
265
+    private void SplitGeoJson(File geoJsonFile, JSONObject newJsonObject) throws IOException {
266
+        String rootName;
267
+        int featuresLength = 0;
268
+        JsonReader reader = new JsonReader(new FileReader(geoJsonFile.getAbsolutePath()).getReader());
269
+        reader.beginObject();
270
+        while (reader.hasNext()) {
271
+            rootName = reader.nextName();
272
+            if (rootName.equals("features")) {
273
+                reader.beginArray();
274
+                while (reader.hasNext()) {
275
+                    reader.skipValue();
276
+                    featuresLength++;
277
+                }
278
+            }
279
+            else {
280
+                reader.skipValue();
281
+            }
282
+        }
283
+        reader.close();
284
+        JSONReader jsonReader = new JSONReader(new FileReader(geoJsonFile.getAbsolutePath()).getReader());
285
+        jsonReader.startObject();
286
+        JSONArray newFeaturesArray = new JSONArray();
287
+        String geometryType,geometryType1,flag;
288
+        StringBuilder jsonObjectString;
289
+        while (jsonReader.hasNext()) {
290
+            rootName = jsonReader.readString();
291
+            if (rootName.equals("features")) {
292
+                jsonReader.startArray();
293
+                int currentPercent;
294
+                int fileSize = 500;
295
+                if (featuresLength > 100000)
296
+                    fileSize = 5000;
297
+                int batch = (featuresLength % fileSize == 0) ? (featuresLength / fileSize) : (featuresLength / fileSize + 1);
298
+                int featuresNumber = 0;//记数
299
+                for (int j = 0; j < batch; j++) {
300
+                    File subFile = new File(upLoadPath + "/" + geoJsonFile.getName().split("\\.")[0] + j + ".geojson");
301
+                    jsonObjectString = new StringBuilder().append("[");
302
+                    int toIndex = j == batch - 1 ? featuresLength : fileSize * (j + 1);
303
+                    while (jsonReader.hasNext() && featuresNumber < toIndex && featuresNumber >= fileSize * j) {
304
+                        jsonObjectString.append(jsonReader.readObject()).append(",");
305
+                        featuresNumber++;
306
+                    }
307
+                    newFeaturesArray = JSONArray.parseArray(jsonObjectString.append("]").toString());
308
+                    jsonObjectString.setLength(0);
309
+                    if (!subFile.exists()) {
310
+                        geometryType = newFeaturesArray.getJSONObject(0).getJSONObject("geometry").getString("coordinates");
311
+                        geometryType1 = newFeaturesArray.getJSONObject(0).getJSONObject("geometry").getString("geometries");
312
+                        flag = geometryType == null ? JSONArray.parseArray(geometryType1).getJSONObject(0).getString("coordinates") : geometryType;
313
+                        double validate = Double.parseDouble(flag.split(",")[0].replace("[", ""));
314
+                        if (CoordinateUtil.outOfChina(validate,0))
315
+                            GeoJsonUtil.convertCoordinate(newFeaturesArray);
316
+                        newJsonObject.put("features", newFeaturesArray);
317
+                        String content = JSON.toJSONString(newJsonObject, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue,
318
+                                SerializerFeature.WriteDateUseDateFormat);
319
+                        Writer writer = new OutputStreamWriter(new FileOutputStream(subFile), StandardCharsets.UTF_8);
320
+                        writer.write(content);
321
+                        writer.flush();
322
+                        writer.close();
323
+                    }
324
+                    currentPercent = (int) Math.floor(((double) j / batch) * 100);
325
+                    processValue.put("percentage", "正在加载" + geoJsonFile.getName().replace(".geojson","") + ":" + currentPercent + "%");
326
+                    processValue.put("fileNum", j);
327
+                }
328
+                processValue.put("percentage", "正在加载" + geoJsonFile.getName().replace(".geojson","") + ":" + 100 + "%");
329
+                jsonReader.endArray();
330
+            }
331
+            else {
332
+                jsonReader.readObject();
333
+            }
334
+        }
335
+        jsonReader.endObject();
336
+        jsonReader.close();
337
+    }
338
+
339
+    /**
340
+     * 基于gdal实现dxf转GeoJson
341
+     */
342
+    private String dxf2GeoJson(File dxfFile, File geoJsonFile) {
343
+        ogr.RegisterAll();
344
+        gdal.SetConfigOption("DXF_ENCODING", "UTF-8");
345
+        if (!geoJsonFile.exists()) {
346
+            DataSource ds = ogr.Open(dxfFile.getAbsolutePath(), 0);
347
+            if (ds == null) {
348
+                return "打开文件失败!";
349
+            } else {
350
+                Driver driver = ogr.GetDriverByName("GeoJSON");
351
+                driver.CopyDataSource(ds, geoJsonFile.getAbsolutePath()).delete();
352
+                ds.delete();
353
+                return "success";
354
+            }
355
+        }
356
+        else
357
+            return "success";
358
+    }
359
+
360
+    /**
361
+     * 基于gdal实现dxf转Shp
362
+     */
363
+    private String dxf2Shp(File dxfFile, File shpFile) {
364
+        ogr.RegisterAll();
365
+        gdal.SetConfigOption("DXF_ENCODING", "UTF-8");
366
+        gdal.SetConfigOption("SHAPE_ENCODING","CP936");
367
+        if (!shpFile.exists()) {
368
+            DataSource ds = ogr.Open(dxfFile.getAbsolutePath(), 0);
369
+            if (ds == null) {
370
+                return "打开文件失败!";
371
+            } else {
372
+                Driver driver = ogr.GetDriverByName("ESRI Shapefile");
373
+                driver.CopyDataSource(ds, shpFile.getAbsolutePath()).delete();
374
+                ds.delete();
375
+                return "success";
376
+            }
377
+        }
378
+        else
379
+            return "success";
380
+    }
381
+
382
+    /**
383
+     * 创建文件夹
384
+     */
385
+    private void makeDir(String filePath) {
386
+        if (filePath.lastIndexOf('/') > 0) {
387
+            String dirPath = filePath.substring(0, filePath.lastIndexOf('/'));
388
+            File dir = new File(dirPath);
389
+            if (!dir.exists()) {
390
+                dir.mkdirs();
391
+            }
392
+        }
393
+    }
394
+}

+ 139
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/map/util/CoordinateUtil.java Parādīt failu

@@ -0,0 +1,139 @@
1
+package com.ruoyi.web.controller.map.util;
2
+
3
+public class CoordinateUtil {
4
+    private double a;//'椭球体长半轴
5
+    private double b;// '椭球体短半轴
6
+    private double f; //'扁率
7
+    private double e;// '第一偏心率
8
+    private double e1; //'第二偏心率
9
+    private double FE;//'东偏移
10
+    private double FN;//'北偏移
11
+    private double L0;//'中央经度
12
+    private double W0;//'原点纬线
13
+    private double k0;//'比例因子
14
+
15
+    /**
16
+     * 幂函数
17
+     * @param e
18
+     * @param i
19
+     * @return
20
+     */
21
+    private double MZ(double e, int i) {
22
+        return Math.pow(e,i);
23
+    }
24
+
25
+    /**
26
+     * 说明: 用于初始化转换参数
27
+     *
28
+     * @param TuoqiuCanshu    枚举类型,提供北京54、西安80和WGS84三个椭球参数
29
+     * @param CentralMeridian 中央经线
30
+     * @param OriginLatitude  原点纬度,如果是标准的分幅,则该参数是0
31
+     * @param EastOffset      东偏移
32
+     * @param NorthOffset     北偏移
33
+     */
34
+    public CoordinateUtil(int TuoqiuCanshu, double CentralMeridian, double OriginLatitude, double EastOffset, double NorthOffset) {
35
+        /**
36
+         * 'Krassovsky (北京54采用) 6378245 6356863.0188
37
+         * 'IAG 75(西安80采用) 6378140 6356755.2882
38
+         * 'WGS 84 6378137 6356752.3142
39
+         * 'CGC 2000 6378137 6356752.31414
40
+         */
41
+        if (TuoqiuCanshu == 0)//北京五四
42
+        {
43
+            a = 6378245;
44
+            b = 6356863.0188;
45
+        } else if (TuoqiuCanshu == 1)// '西安八零
46
+        {
47
+            a = 6378140;
48
+            b = 6356755.2882;
49
+        }
50
+        if (TuoqiuCanshu == 2)//'WGS84
51
+        {
52
+            a = 6378137;
53
+            b = 6356752.3142;
54
+        }
55
+        if (TuoqiuCanshu == 3)//'CGC2000坐标
56
+        {
57
+            a = 6378137;
58
+            b = 6356752.31414;
59
+        }
60
+        f = (a - b) / a;//扁率
61
+        //e = Math.sqrt(1 - MZ((b / a) ,2));//'第一偏心率
62
+        e = Math.sqrt(2 * f - MZ(f, 2));//'第一偏心率
63
+        //eq = Math.sqrt(MZ((a / b) , 2) - 1);//'第二偏心率
64
+        e1 = e / Math.sqrt(1 - MZ(e, 2));//'第二偏心率
65
+        L0 = CentralMeridian;//中央经
66
+        W0 = OriginLatitude;//原点纬线
67
+        k0 = 1;//'比例因子
68
+        FE = EastOffset;//东偏移
69
+        FN = NorthOffset;//北偏移
70
+    }
71
+
72
+    /**
73
+     * 经纬度坐标转高斯投影坐标
74
+     * @param J 经度
75
+     * @param W 纬度
76
+     * @return
77
+     */
78
+    public double[] JWgetGK(double J, double W) {
79
+        //'给出经纬度坐标,转换为高克投影坐标
80
+        double[] resultP = new double[2];
81
+        double BR = (W - W0) * Math.PI / 180;//纬度弧长
82
+        double lo = (J - L0) * Math.PI / 180; //经差弧度
83
+        double N = a / Math.sqrt(1 - MZ((e * Math.sin(BR)), 2)); //卯酉圈曲率半径
84
+        //求解参数s
85
+        double B0;
86
+        double B2;
87
+        double B4;
88
+        double B6;
89
+        double B8;
90
+        double C = MZ(a, 2) / b;
91
+        B0 = 1 - 3 * MZ(e1, 2) / 4 + 45 * MZ(e1, 4) / 64 - 175 * MZ(e1, 6) / 256 + 11025 * MZ(e1, 8) / 16384;
92
+        B2 = B0 - 1;
93
+        B4 = 15 / 32 * MZ(e1, 4) - 175 / 384 * MZ(e1, 6) + 3675 / 8192 * MZ(e1, 8);
94
+        B6 = 0 - 35 / 96 * MZ(e1, 6) + 735 / 2048 * MZ(e1, 8);
95
+        B8 = 315 / 1024 * MZ(e1, 8);
96
+        double s = C * (B0 * BR + Math.sin(BR) * (B2 * Math.cos(BR) + B4 * MZ((Math.cos(BR)), 3) + B6 * MZ((Math.cos(BR)), 5) + B8 * MZ((Math.cos(BR)), 7)));
97
+        double t = Math.tan(BR);
98
+        double g = e1 * Math.cos(BR);
99
+        double XR = s + MZ(lo, 2) / 2 * N * Math.sin(BR) * Math.cos(BR) + MZ(lo, 4) * N * Math.sin(BR) * MZ((Math.cos(BR)), 3) / 24 * (5 - MZ(t, 2) + 9 * MZ(g, 2) + 4 * MZ(g, 4)) + MZ(lo, 6) * N * Math.sin(BR) * MZ((Math.cos(BR)), 5) * (61 - 58 * MZ(t, 2) + MZ(t, 4)) / 720;
100
+        double YR = lo * N * Math.cos(BR) + MZ(lo, 3) * N / 6 * MZ((Math.cos(BR)), 3) * (1 - MZ(t, 2) + MZ(g, 2)) + MZ(lo, 5) * N / 120 * MZ((Math.cos(BR)), 5) * (5 - 18 * MZ(t, 2) + MZ(t, 4) + 14 * MZ(g, 2) - 58 * MZ(g, 2) * MZ(t, 2));
101
+//        resultP[0] = YR + FE + 34000000;//条带号
102
+        resultP[0] = YR + FE;
103
+        resultP[1] = XR + FN;
104
+        return resultP;
105
+    }
106
+
107
+    /**
108
+     * 高斯投影坐标 转为 经纬度坐标
109
+     * @param X 高斯投影坐标X
110
+     * @param Y 高斯投影坐标Y
111
+     * @return
112
+     */
113
+    public double[] GKgetJW(double X, double Y) {
114
+        //'给出高克投影坐标,转换为经纬度坐标
115
+        double[] resultP =new double[2];
116
+        double El1 = (1 - Math.sqrt(1 - MZ(e, 2))) / (1 + Math.sqrt(1 - MZ(e, 2)));
117
+        double Mf = (Y - FN) / k0;//真实坐标值
118
+        double Q = Mf / (a * (1 - MZ(e, 2) / 4 - 3 * MZ(e, 4) / 64 - 5 * MZ(e, 6) / 256));//角度
119
+        double Bf = Q + (3 * El1 / 2 - 27 * MZ(El1, 3) / 32) * Math.sin(2 * Q) + (21 * MZ(El1, 2) / 16 - 55 * MZ(El1, 4) / 32) * Math.sin(4 * Q) + (151 * MZ(El1, 3) / 96) * Math.sin(6 * Q) + 1097 / 512 * MZ(El1, 4) * Math.sin(8 * Q);
120
+        double Rf = a * (1 - MZ(e, 2)) / Math.sqrt(MZ((1 - MZ((e * Math.sin(Bf)), 2)), 3));
121
+        double Nf = a / Math.sqrt(1 - MZ((e * Math.sin(Bf)), 2));//卯酉圈曲率半径
122
+        double Tf = MZ((Math.tan(Bf)), 2);
123
+//        double D = (X - FE - 34000000) / (k0 * Nf);
124
+        double D = (X - FE) / (k0 * Nf);
125
+        double Cf = MZ(e1, 2) * MZ((Math.cos(Bf)), 2);
126
+        double B = Bf - Nf * Math.tan(Bf) / Rf * (MZ(D, 2) / 2 - (5 + 3 * Tf + 10 * Cf - 9 * Tf * Cf - 4 * MZ(Cf, 2) - 9 * MZ(e1, 2)) * MZ(D, 4) / 24 + (61 + 90 * Tf + 45 * MZ(Tf, 2) - 256 * MZ(e1, 2) - 3 * MZ(Cf, 2)) * MZ(D, 6) / 720);
127
+        double L = L0 * Math.PI / 180 + 1 / Math.cos(Bf) * (D - (1 + 2 * Tf + Cf) * MZ(D, 3) / 6 + (5 - 2 * Cf + 28 * Tf - 3 * MZ(Cf, 2) + 8 * MZ(e1, 2) + 24 * MZ(Tf, 2)) * MZ(D, 5) / 120);
128
+        double Bangle = B * 180 / Math.PI;
129
+        double Langle = L * 180 / Math.PI;
130
+        resultP[0] = Langle;//RW * 180 / Math.PI;
131
+        resultP[1] = Bangle + W0;//RJ * 180 / Math.PI;
132
+        return resultP;
133
+    }
134
+
135
+    public static boolean outOfChina(double lng, double lat) {
136
+        return (lng < 72.004 || lng > 137.8347) || (lat < 0.8293 || lat > 55.8271);
137
+    }
138
+
139
+}

+ 191
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/map/util/GeoJsonUtil.java Parādīt failu

@@ -0,0 +1,191 @@
1
+package com.ruoyi.web.controller.map.util;
2
+
3
+import cn.hutool.core.util.NumberUtil;
4
+import com.alibaba.fastjson.JSONArray;
5
+import com.alibaba.fastjson.JSONObject;
6
+
7
+import java.util.List;
8
+
9
+public class GeoJsonUtil {
10
+
11
+    /**
12
+     * 转换投影坐标为经纬度
13
+     * @return
14
+     */
15
+    public static void convertCoordinate(JSONArray featuresArray) {
16
+        for (int i = 0; i < featuresArray.size(); i++) {
17
+            JSONObject properties = featuresArray.getJSONObject(i).getJSONObject("properties");
18
+            String layer = properties.getString("Layer");
19
+            properties.put("color", getColor(layer));
20
+            JSONObject geometry = featuresArray.getJSONObject(i).getJSONObject("geometry");
21
+            String geometryType = geometry.getString("type");
22
+            CoordinateUtil convert = new CoordinateUtil(0, 94.5, 0, 499980, 1345);
23
+            JSONArray latlngList = new JSONArray();
24
+            if (!geometryType.equals("GeometryCollection")) {
25
+                if (geometryType.equals("Point")) {
26
+                    featuresArray.getJSONObject(i).getJSONObject("geometry").put("coordinates", convertPoint(geometry, convert));
27
+                }
28
+                else {
29
+                    if (geometryType.equals("MultiPoint") || geometryType.equals("LineString")) {
30
+                        convertMultiPointOrLineString(geometry, convert, latlngList);
31
+                    }
32
+                    if (geometryType.equals("MultiLineString") || geometryType.equals("Polygon")) {
33
+                        convertMultiLineStringOrPolygon(geometry, convert, latlngList);
34
+                    }
35
+                    if (geometryType.equals("MultiPolygon")) {
36
+                        convertMultiPolygon(geometry, convert, latlngList);
37
+                    }
38
+                    featuresArray.getJSONObject(i).getJSONObject("geometry").put("coordinates", latlngList);
39
+                }
40
+            }
41
+            else {
42
+                JSONArray geometries = geometry.getJSONArray("geometries");
43
+                JSONArray geometryArray = new JSONArray();
44
+                for (Object geom : geometries){
45
+                    JSONObject geomObject = (JSONObject) geom;
46
+                    String geomObjectType = geomObject.getString("type");
47
+                    JSONArray latlngArray = new JSONArray();
48
+                    if (geomObjectType.equals("Point")) {
49
+                        geomObject.put("coordinates", convertPoint(geomObject, convert));
50
+                    }
51
+                    else {
52
+                        if (geomObjectType.equals("MultiPoint") || geomObjectType.equals("LineString")) {
53
+                            convertMultiPointOrLineString(geomObject, convert, latlngArray);
54
+                        }
55
+                        if (geomObjectType.equals("MultiLineString") || geomObjectType.equals("Polygon")) {
56
+                            convertMultiLineStringOrPolygon(geomObject, convert, latlngArray);
57
+                        }
58
+                        if (geomObjectType.equals("MultiPolygon")) {
59
+                            convertMultiPolygon(geomObject, convert, latlngArray);
60
+                        }
61
+                        geomObject.put("coordinates", latlngArray);
62
+                    }
63
+                    geometryArray.add(geomObject);
64
+                }
65
+                featuresArray.getJSONObject(i).getJSONObject("geometry").put("geometries", geometryArray);
66
+            }
67
+        }
68
+    }
69
+
70
+    private static String getColor(String layer) {
71
+        String color = "#FF0000";
72
+        if (NumberUtil.isNumber(layer)) {
73
+            int layerNum = Integer.parseInt(layer);
74
+            if (layerNum < 4000)
75
+                color = "#FF0000"; //1
76
+            else if (layerNum < 5000)
77
+                color = "#00FFFF"; //4
78
+            else if (layerNum < 5300)
79
+                color = "#FF0000"; //1
80
+            else if (layerNum < 5500)
81
+                color = "#0000FF"; //5
82
+            else if (layerNum < 6000)
83
+                color = "#FF0000"; //1
84
+            else if (layerNum < 6400)
85
+                color = "#0000FF"; //5
86
+            else if (layerNum < 6740)
87
+                color = "#FF0000"; //1
88
+            else if (layerNum < 6742)
89
+                color = "#FFFFFF"; //7
90
+            else if (layerNum < 6743)
91
+                color = "#FFFF00"; //2
92
+            else if (layerNum < 6752)
93
+                color = "#FFFFFF"; //7
94
+            else if (layerNum < 6753)
95
+                color = "#FFFF00"; //2
96
+            else if (layerNum < 8000)
97
+                color = "#FF0000"; //1
98
+            else if (layerNum < 8111)
99
+                color = "#FFFFFF"; //7
100
+            else if (layerNum < 8121)
101
+                color = "#FFFF00"; //2
102
+            else if (layerNum < 8122)
103
+                color = "#FF0000"; //1
104
+            else if (layerNum < 8131)
105
+                color = "#FFFFFF"; //7
106
+            else if (layerNum < 8300)
107
+                color = "#FFFF00"; //2
108
+            else if (layerNum < 8700)
109
+                color = "#FF0000"; //1
110
+            else if (layerNum < 9612)
111
+                color = "#00FF00"; //3
112
+            else if (layerNum < 9613)
113
+                color = "#00FFFF"; //4
114
+            else if (layerNum < 9614)
115
+                color = "#00FF00"; //3
116
+            else if (layerNum < 9801)
117
+                color = "#FF0000"; //1
118
+            else if (layerNum < 10000)
119
+                color = "#00FF00"; //3
120
+        }
121
+        return color;
122
+    }
123
+
124
+    private static double[] convertPoint(JSONObject geometry, CoordinateUtil convert) {
125
+        JSONArray coordinates = geometry.getJSONArray("coordinates");
126
+        double[] latlng = new double[3];
127
+        String lat = coordinates.get(0).toString();
128
+        String lng = coordinates.get(1).toString();
129
+        String alt = coordinates.size() > 2 ? coordinates.get(2).toString() : "0";
130
+        latlng[0] = convert.GKgetJW(Double.parseDouble(lat), Double.parseDouble(lng))[0];
131
+        latlng[1] = convert.GKgetJW(Double.parseDouble(lat), Double.parseDouble(lng))[1];
132
+        latlng[2] = Double.parseDouble(alt);
133
+        return latlng;
134
+    }
135
+
136
+    private static void convertMultiPointOrLineString(JSONObject geometry, CoordinateUtil convert, JSONArray latlngList) {
137
+        JSONArray coordinates = geometry.getJSONArray("coordinates");
138
+        for (Object coordinate : coordinates) {
139
+            double[] latlng = new double[3];
140
+            String lat = coordinate.toString().split(",")[0].replace("[", "");
141
+            String lng = coordinate.toString().split(",")[1].replace("]", "");
142
+            String alt = coordinate.toString().split(",").length > 2 ? coordinate.toString().split(",")[2].replace("]", "") : "0";
143
+            latlng[0] = convert.GKgetJW(Double.parseDouble(lat), Double.parseDouble(lng))[0];
144
+            latlng[1] = convert.GKgetJW(Double.parseDouble(lat), Double.parseDouble(lng))[1];
145
+            latlng[2] = Double.parseDouble(alt);
146
+            latlngList.add(latlng);
147
+        }
148
+    }
149
+
150
+    private static void convertMultiLineStringOrPolygon(JSONObject geometry, CoordinateUtil convert, JSONArray latlngList) {
151
+        JSONArray coordinatesList = geometry.getJSONArray("coordinates");
152
+        for (Object coordinates : coordinatesList) {
153
+            List<JSONArray> coordinateList = (List<JSONArray>) coordinates;
154
+            JSONArray jwList = new JSONArray();
155
+            for (JSONArray coordinate : coordinateList) {
156
+                double[] latlng = new double[3];
157
+                String lat = coordinate.toString().split(",")[0].replace("[", "");
158
+                String lng = coordinate.toString().split(",")[1].replace("]", "");
159
+                String alt = coordinate.toString().split(",").length > 2 ? coordinate.toString().split(",")[2].replace("]", "") : "0";
160
+                latlng[0] = convert.GKgetJW(Double.parseDouble(lat), Double.parseDouble(lng))[0];
161
+                latlng[1] = convert.GKgetJW(Double.parseDouble(lat), Double.parseDouble(lng))[1];
162
+                latlng[2] = Double.parseDouble(alt);
163
+                jwList.add(latlng);
164
+            }
165
+            latlngList.add(jwList);
166
+        }
167
+    }
168
+    private static void convertMultiPolygon(JSONObject geometry, CoordinateUtil convert, JSONArray latlngList) {
169
+        JSONArray coordinatesList = geometry.getJSONArray("coordinates");
170
+        for (Object coordinates : coordinatesList) {
171
+            List<JSONArray> coordinateList = (List<JSONArray>) coordinates;
172
+            JSONArray jwList = new JSONArray();
173
+            for (JSONArray coordinate : coordinateList) {
174
+                JSONArray jwArray = new JSONArray();
175
+                for (Object coor : coordinate) {
176
+                    double[] latlng = new double[3];
177
+                    String lat = coor.toString().split(",")[0].replace("[", "");
178
+                    String lng = coor.toString().split(",")[1].replace("]", "");
179
+                    String alt = coor.toString().split(",").length > 2 ? coor.toString().split(",")[2].replace("]", "") : "0";
180
+                    latlng[0] = convert.GKgetJW(Double.parseDouble(lat), Double.parseDouble(lng))[0];
181
+                    latlng[1] = convert.GKgetJW(Double.parseDouble(lat), Double.parseDouble(lng))[1];
182
+                    latlng[2] = Double.parseDouble(alt);
183
+                    jwArray.add(latlng);
184
+                }
185
+                jwList.add(jwArray);
186
+            }
187
+            latlngList.add(jwList);
188
+        }
189
+    }
190
+
191
+}

+ 120
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/CacheController.java Parādīt failu

@@ -0,0 +1,120 @@
1
+package com.ruoyi.web.controller.monitor;
2
+
3
+import java.util.ArrayList;
4
+import java.util.Collection;
5
+import java.util.HashMap;
6
+import java.util.List;
7
+import java.util.Map;
8
+import java.util.Properties;
9
+import java.util.Set;
10
+import org.springframework.beans.factory.annotation.Autowired;
11
+import org.springframework.data.redis.core.RedisCallback;
12
+import org.springframework.data.redis.core.RedisTemplate;
13
+import org.springframework.security.access.prepost.PreAuthorize;
14
+import org.springframework.web.bind.annotation.DeleteMapping;
15
+import org.springframework.web.bind.annotation.GetMapping;
16
+import org.springframework.web.bind.annotation.PathVariable;
17
+import org.springframework.web.bind.annotation.RequestMapping;
18
+import org.springframework.web.bind.annotation.RestController;
19
+import com.ruoyi.common.constant.CacheConstants;
20
+import com.ruoyi.common.core.domain.AjaxResult;
21
+import com.ruoyi.common.utils.StringUtils;
22
+import com.ruoyi.system.domain.SysCache;
23
+
24
+/**
25
+ * 缓存监控
26
+ * 
27
+ * @author ruoyi
28
+ */
29
+@RestController
30
+@RequestMapping("/monitor/cache")
31
+public class CacheController
32
+{
33
+    @Autowired
34
+    private RedisTemplate<String, String> redisTemplate;
35
+
36
+    private final static List<SysCache> caches = new ArrayList<SysCache>();
37
+    {
38
+        caches.add(new SysCache(CacheConstants.LOGIN_TOKEN_KEY, "用户信息"));
39
+        caches.add(new SysCache(CacheConstants.SYS_CONFIG_KEY, "配置信息"));
40
+        caches.add(new SysCache(CacheConstants.SYS_DICT_KEY, "数据字典"));
41
+        caches.add(new SysCache(CacheConstants.CAPTCHA_CODE_KEY, "验证码"));
42
+        caches.add(new SysCache(CacheConstants.REPEAT_SUBMIT_KEY, "防重提交"));
43
+        caches.add(new SysCache(CacheConstants.RATE_LIMIT_KEY, "限流处理"));
44
+        caches.add(new SysCache(CacheConstants.PWD_ERR_CNT_KEY, "密码错误次数"));
45
+    }
46
+
47
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
48
+    @GetMapping()
49
+    public AjaxResult getInfo() throws Exception
50
+    {
51
+        Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info());
52
+        Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
53
+        Object dbSize = redisTemplate.execute((RedisCallback<Object>) connection -> connection.dbSize());
54
+
55
+        Map<String, Object> result = new HashMap<>(3);
56
+        result.put("info", info);
57
+        result.put("dbSize", dbSize);
58
+
59
+        List<Map<String, String>> pieList = new ArrayList<>();
60
+        commandStats.stringPropertyNames().forEach(key -> {
61
+            Map<String, String> data = new HashMap<>(2);
62
+            String property = commandStats.getProperty(key);
63
+            data.put("name", StringUtils.removeStart(key, "cmdstat_"));
64
+            data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
65
+            pieList.add(data);
66
+        });
67
+        result.put("commandStats", pieList);
68
+        return AjaxResult.success(result);
69
+    }
70
+
71
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
72
+    @GetMapping("/getNames")
73
+    public AjaxResult cache()
74
+    {
75
+        return AjaxResult.success(caches);
76
+    }
77
+
78
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
79
+    @GetMapping("/getKeys/{cacheName}")
80
+    public AjaxResult getCacheKeys(@PathVariable String cacheName)
81
+    {
82
+        Set<String> cacheKeys = redisTemplate.keys(cacheName + "*");
83
+        return AjaxResult.success(cacheKeys);
84
+    }
85
+
86
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
87
+    @GetMapping("/getValue/{cacheName}/{cacheKey}")
88
+    public AjaxResult getCacheValue(@PathVariable String cacheName, @PathVariable String cacheKey)
89
+    {
90
+        String cacheValue = redisTemplate.opsForValue().get(cacheKey);
91
+        SysCache sysCache = new SysCache(cacheName, cacheKey, cacheValue);
92
+        return AjaxResult.success(sysCache);
93
+    }
94
+
95
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
96
+    @DeleteMapping("/clearCacheName/{cacheName}")
97
+    public AjaxResult clearCacheName(@PathVariable String cacheName)
98
+    {
99
+        Collection<String> cacheKeys = redisTemplate.keys(cacheName + "*");
100
+        redisTemplate.delete(cacheKeys);
101
+        return AjaxResult.success();
102
+    }
103
+
104
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
105
+    @DeleteMapping("/clearCacheKey/{cacheKey}")
106
+    public AjaxResult clearCacheKey(@PathVariable String cacheKey)
107
+    {
108
+        redisTemplate.delete(cacheKey);
109
+        return AjaxResult.success();
110
+    }
111
+
112
+    @PreAuthorize("@ss.hasPermi('monitor:cache:list')")
113
+    @DeleteMapping("/clearCacheAll")
114
+    public AjaxResult clearCacheAll()
115
+    {
116
+        Collection<String> cacheKeys = redisTemplate.keys("*");
117
+        redisTemplate.delete(cacheKeys);
118
+        return AjaxResult.success();
119
+    }
120
+}

+ 27
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/ServerController.java Parādīt failu

@@ -0,0 +1,27 @@
1
+package com.ruoyi.web.controller.monitor;
2
+
3
+import org.springframework.security.access.prepost.PreAuthorize;
4
+import org.springframework.web.bind.annotation.GetMapping;
5
+import org.springframework.web.bind.annotation.RequestMapping;
6
+import org.springframework.web.bind.annotation.RestController;
7
+import com.ruoyi.common.core.domain.AjaxResult;
8
+import com.ruoyi.framework.web.domain.Server;
9
+
10
+/**
11
+ * 服务器监控
12
+ * 
13
+ * @author ruoyi
14
+ */
15
+@RestController
16
+@RequestMapping("/monitor/server")
17
+public class ServerController
18
+{
19
+    @PreAuthorize("@ss.hasPermi('monitor:server:list')")
20
+    @GetMapping()
21
+    public AjaxResult getInfo() throws Exception
22
+    {
23
+        Server server = new Server();
24
+        server.copyTo();
25
+        return AjaxResult.success(server);
26
+    }
27
+}

+ 82
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysLogininforController.java Parādīt failu

@@ -0,0 +1,82 @@
1
+package com.ruoyi.web.controller.monitor;
2
+
3
+import java.util.List;
4
+import javax.servlet.http.HttpServletResponse;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.security.access.prepost.PreAuthorize;
7
+import org.springframework.web.bind.annotation.DeleteMapping;
8
+import org.springframework.web.bind.annotation.GetMapping;
9
+import org.springframework.web.bind.annotation.PathVariable;
10
+import org.springframework.web.bind.annotation.PostMapping;
11
+import org.springframework.web.bind.annotation.RequestMapping;
12
+import org.springframework.web.bind.annotation.RestController;
13
+import com.ruoyi.common.annotation.Log;
14
+import com.ruoyi.common.core.controller.BaseController;
15
+import com.ruoyi.common.core.domain.AjaxResult;
16
+import com.ruoyi.common.core.page.TableDataInfo;
17
+import com.ruoyi.common.enums.BusinessType;
18
+import com.ruoyi.common.utils.poi.ExcelUtil;
19
+import com.ruoyi.framework.web.service.SysPasswordService;
20
+import com.ruoyi.system.domain.SysLogininfor;
21
+import com.ruoyi.system.service.ISysLogininforService;
22
+
23
+/**
24
+ * 系统访问记录
25
+ * 
26
+ * @author ruoyi
27
+ */
28
+@RestController
29
+@RequestMapping("/monitor/logininfor")
30
+public class SysLogininforController extends BaseController
31
+{
32
+    @Autowired
33
+    private ISysLogininforService logininforService;
34
+
35
+    @Autowired
36
+    private SysPasswordService passwordService;
37
+
38
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:list')")
39
+    @GetMapping("/list")
40
+    public TableDataInfo list(SysLogininfor logininfor)
41
+    {
42
+        startPage();
43
+        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
44
+        return getDataTable(list);
45
+    }
46
+
47
+    @Log(title = "登录日志", businessType = BusinessType.EXPORT)
48
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:export')")
49
+    @PostMapping("/export")
50
+    public void export(HttpServletResponse response, SysLogininfor logininfor)
51
+    {
52
+        List<SysLogininfor> list = logininforService.selectLogininforList(logininfor);
53
+        ExcelUtil<SysLogininfor> util = new ExcelUtil<SysLogininfor>(SysLogininfor.class);
54
+        util.exportExcel(response, list, "登录日志");
55
+    }
56
+
57
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
58
+    @Log(title = "登录日志", businessType = BusinessType.DELETE)
59
+    @DeleteMapping("/{infoIds}")
60
+    public AjaxResult remove(@PathVariable Long[] infoIds)
61
+    {
62
+        return toAjax(logininforService.deleteLogininforByIds(infoIds));
63
+    }
64
+
65
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:remove')")
66
+    @Log(title = "登录日志", businessType = BusinessType.CLEAN)
67
+    @DeleteMapping("/clean")
68
+    public AjaxResult clean()
69
+    {
70
+        logininforService.cleanLogininfor();
71
+        return success();
72
+    }
73
+
74
+    @PreAuthorize("@ss.hasPermi('monitor:logininfor:unlock')")
75
+    @Log(title = "账户解锁", businessType = BusinessType.OTHER)
76
+    @GetMapping("/unlock/{userName}")
77
+    public AjaxResult unlock(@PathVariable("userName") String userName)
78
+    {
79
+        passwordService.clearLoginRecordCache(userName);
80
+        return success();
81
+    }
82
+}

+ 69
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysOperlogController.java Parādīt failu

@@ -0,0 +1,69 @@
1
+package com.ruoyi.web.controller.monitor;
2
+
3
+import java.util.List;
4
+import javax.servlet.http.HttpServletResponse;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.security.access.prepost.PreAuthorize;
7
+import org.springframework.web.bind.annotation.DeleteMapping;
8
+import org.springframework.web.bind.annotation.GetMapping;
9
+import org.springframework.web.bind.annotation.PathVariable;
10
+import org.springframework.web.bind.annotation.PostMapping;
11
+import org.springframework.web.bind.annotation.RequestMapping;
12
+import org.springframework.web.bind.annotation.RestController;
13
+import com.ruoyi.common.annotation.Log;
14
+import com.ruoyi.common.core.controller.BaseController;
15
+import com.ruoyi.common.core.domain.AjaxResult;
16
+import com.ruoyi.common.core.page.TableDataInfo;
17
+import com.ruoyi.common.enums.BusinessType;
18
+import com.ruoyi.common.utils.poi.ExcelUtil;
19
+import com.ruoyi.system.domain.SysOperLog;
20
+import com.ruoyi.system.service.ISysOperLogService;
21
+
22
+/**
23
+ * 操作日志记录
24
+ * 
25
+ * @author ruoyi
26
+ */
27
+@RestController
28
+@RequestMapping("/monitor/operlog")
29
+public class SysOperlogController extends BaseController
30
+{
31
+    @Autowired
32
+    private ISysOperLogService operLogService;
33
+
34
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:list')")
35
+    @GetMapping("/list")
36
+    public TableDataInfo list(SysOperLog operLog)
37
+    {
38
+        startPage();
39
+        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
40
+        return getDataTable(list);
41
+    }
42
+
43
+    @Log(title = "操作日志", businessType = BusinessType.EXPORT)
44
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:export')")
45
+    @PostMapping("/export")
46
+    public void export(HttpServletResponse response, SysOperLog operLog)
47
+    {
48
+        List<SysOperLog> list = operLogService.selectOperLogList(operLog);
49
+        ExcelUtil<SysOperLog> util = new ExcelUtil<SysOperLog>(SysOperLog.class);
50
+        util.exportExcel(response, list, "操作日志");
51
+    }
52
+
53
+    @Log(title = "操作日志", businessType = BusinessType.DELETE)
54
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
55
+    @DeleteMapping("/{operIds}")
56
+    public AjaxResult remove(@PathVariable Long[] operIds)
57
+    {
58
+        return toAjax(operLogService.deleteOperLogByIds(operIds));
59
+    }
60
+
61
+    @Log(title = "操作日志", businessType = BusinessType.CLEAN)
62
+    @PreAuthorize("@ss.hasPermi('monitor:operlog:remove')")
63
+    @DeleteMapping("/clean")
64
+    public AjaxResult clean()
65
+    {
66
+        operLogService.cleanOperLog();
67
+        return success();
68
+    }
69
+}

+ 83
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/monitor/SysUserOnlineController.java Parādīt failu

@@ -0,0 +1,83 @@
1
+package com.ruoyi.web.controller.monitor;
2
+
3
+import java.util.ArrayList;
4
+import java.util.Collection;
5
+import java.util.Collections;
6
+import java.util.List;
7
+import org.springframework.beans.factory.annotation.Autowired;
8
+import org.springframework.security.access.prepost.PreAuthorize;
9
+import org.springframework.web.bind.annotation.DeleteMapping;
10
+import org.springframework.web.bind.annotation.GetMapping;
11
+import org.springframework.web.bind.annotation.PathVariable;
12
+import org.springframework.web.bind.annotation.RequestMapping;
13
+import org.springframework.web.bind.annotation.RestController;
14
+import com.ruoyi.common.annotation.Log;
15
+import com.ruoyi.common.constant.CacheConstants;
16
+import com.ruoyi.common.core.controller.BaseController;
17
+import com.ruoyi.common.core.domain.AjaxResult;
18
+import com.ruoyi.common.core.domain.model.LoginUser;
19
+import com.ruoyi.common.core.page.TableDataInfo;
20
+import com.ruoyi.common.core.redis.RedisCache;
21
+import com.ruoyi.common.enums.BusinessType;
22
+import com.ruoyi.common.utils.StringUtils;
23
+import com.ruoyi.system.domain.SysUserOnline;
24
+import com.ruoyi.system.service.ISysUserOnlineService;
25
+
26
+/**
27
+ * 在线用户监控
28
+ * 
29
+ * @author ruoyi
30
+ */
31
+@RestController
32
+@RequestMapping("/monitor/online")
33
+public class SysUserOnlineController extends BaseController
34
+{
35
+    @Autowired
36
+    private ISysUserOnlineService userOnlineService;
37
+
38
+    @Autowired
39
+    private RedisCache redisCache;
40
+
41
+    @PreAuthorize("@ss.hasPermi('monitor:online:list')")
42
+    @GetMapping("/list")
43
+    public TableDataInfo list(String ipaddr, String userName)
44
+    {
45
+        Collection<String> keys = redisCache.keys(CacheConstants.LOGIN_TOKEN_KEY + "*");
46
+        List<SysUserOnline> userOnlineList = new ArrayList<SysUserOnline>();
47
+        for (String key : keys)
48
+        {
49
+            LoginUser user = redisCache.getCacheObject(key);
50
+            if (StringUtils.isNotEmpty(ipaddr) && StringUtils.isNotEmpty(userName))
51
+            {
52
+                userOnlineList.add(userOnlineService.selectOnlineByInfo(ipaddr, userName, user));
53
+            }
54
+            else if (StringUtils.isNotEmpty(ipaddr))
55
+            {
56
+                userOnlineList.add(userOnlineService.selectOnlineByIpaddr(ipaddr, user));
57
+            }
58
+            else if (StringUtils.isNotEmpty(userName) && StringUtils.isNotNull(user.getUser()))
59
+            {
60
+                userOnlineList.add(userOnlineService.selectOnlineByUserName(userName, user));
61
+            }
62
+            else
63
+            {
64
+                userOnlineList.add(userOnlineService.loginUserToUserOnline(user));
65
+            }
66
+        }
67
+        Collections.reverse(userOnlineList);
68
+        userOnlineList.removeAll(Collections.singleton(null));
69
+        return getDataTable(userOnlineList);
70
+    }
71
+
72
+    /**
73
+     * 强退用户
74
+     */
75
+    @PreAuthorize("@ss.hasPermi('monitor:online:forceLogout')")
76
+    @Log(title = "在线用户", businessType = BusinessType.FORCE)
77
+    @DeleteMapping("/{tokenId}")
78
+    public AjaxResult forceLogout(@PathVariable String tokenId)
79
+    {
80
+        redisCache.deleteObject(CacheConstants.LOGIN_TOKEN_KEY + tokenId);
81
+        return success();
82
+    }
83
+}

+ 133
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysConfigController.java Parādīt failu

@@ -0,0 +1,133 @@
1
+package com.ruoyi.web.controller.system;
2
+
3
+import java.util.List;
4
+import javax.servlet.http.HttpServletResponse;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.security.access.prepost.PreAuthorize;
7
+import org.springframework.validation.annotation.Validated;
8
+import org.springframework.web.bind.annotation.DeleteMapping;
9
+import org.springframework.web.bind.annotation.GetMapping;
10
+import org.springframework.web.bind.annotation.PathVariable;
11
+import org.springframework.web.bind.annotation.PostMapping;
12
+import org.springframework.web.bind.annotation.PutMapping;
13
+import org.springframework.web.bind.annotation.RequestBody;
14
+import org.springframework.web.bind.annotation.RequestMapping;
15
+import org.springframework.web.bind.annotation.RestController;
16
+import com.ruoyi.common.annotation.Log;
17
+import com.ruoyi.common.core.controller.BaseController;
18
+import com.ruoyi.common.core.domain.AjaxResult;
19
+import com.ruoyi.common.core.page.TableDataInfo;
20
+import com.ruoyi.common.enums.BusinessType;
21
+import com.ruoyi.common.utils.poi.ExcelUtil;
22
+import com.ruoyi.system.domain.SysConfig;
23
+import com.ruoyi.system.service.ISysConfigService;
24
+
25
+/**
26
+ * 参数配置 信息操作处理
27
+ * 
28
+ * @author ruoyi
29
+ */
30
+@RestController
31
+@RequestMapping("/system/config")
32
+public class SysConfigController extends BaseController
33
+{
34
+    @Autowired
35
+    private ISysConfigService configService;
36
+
37
+    /**
38
+     * 获取参数配置列表
39
+     */
40
+    @PreAuthorize("@ss.hasPermi('system:config:list')")
41
+    @GetMapping("/list")
42
+    public TableDataInfo list(SysConfig config)
43
+    {
44
+        startPage();
45
+        List<SysConfig> list = configService.selectConfigList(config);
46
+        return getDataTable(list);
47
+    }
48
+
49
+    @Log(title = "参数管理", businessType = BusinessType.EXPORT)
50
+    @PreAuthorize("@ss.hasPermi('system:config:export')")
51
+    @PostMapping("/export")
52
+    public void export(HttpServletResponse response, SysConfig config)
53
+    {
54
+        List<SysConfig> list = configService.selectConfigList(config);
55
+        ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
56
+        util.exportExcel(response, list, "参数数据");
57
+    }
58
+
59
+    /**
60
+     * 根据参数编号获取详细信息
61
+     */
62
+    @PreAuthorize("@ss.hasPermi('system:config:query')")
63
+    @GetMapping(value = "/{configId}")
64
+    public AjaxResult getInfo(@PathVariable Long configId)
65
+    {
66
+        return success(configService.selectConfigById(configId));
67
+    }
68
+
69
+    /**
70
+     * 根据参数键名查询参数值
71
+     */
72
+    @GetMapping(value = "/configKey/{configKey}")
73
+    public AjaxResult getConfigKey(@PathVariable String configKey)
74
+    {
75
+        return success(configService.selectConfigByKey(configKey));
76
+    }
77
+
78
+    /**
79
+     * 新增参数配置
80
+     */
81
+    @PreAuthorize("@ss.hasPermi('system:config:add')")
82
+    @Log(title = "参数管理", businessType = BusinessType.INSERT)
83
+    @PostMapping
84
+    public AjaxResult add(@Validated @RequestBody SysConfig config)
85
+    {
86
+        if (!configService.checkConfigKeyUnique(config))
87
+        {
88
+            return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
89
+        }
90
+        config.setCreateBy(getUsername());
91
+        return toAjax(configService.insertConfig(config));
92
+    }
93
+
94
+    /**
95
+     * 修改参数配置
96
+     */
97
+    @PreAuthorize("@ss.hasPermi('system:config:edit')")
98
+    @Log(title = "参数管理", businessType = BusinessType.UPDATE)
99
+    @PutMapping
100
+    public AjaxResult edit(@Validated @RequestBody SysConfig config)
101
+    {
102
+        if (!configService.checkConfigKeyUnique(config))
103
+        {
104
+            return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
105
+        }
106
+        config.setUpdateBy(getUsername());
107
+        return toAjax(configService.updateConfig(config));
108
+    }
109
+
110
+    /**
111
+     * 删除参数配置
112
+     */
113
+    @PreAuthorize("@ss.hasPermi('system:config:remove')")
114
+    @Log(title = "参数管理", businessType = BusinessType.DELETE)
115
+    @DeleteMapping("/{configIds}")
116
+    public AjaxResult remove(@PathVariable Long[] configIds)
117
+    {
118
+        configService.deleteConfigByIds(configIds);
119
+        return success();
120
+    }
121
+
122
+    /**
123
+     * 刷新参数缓存
124
+     */
125
+    @PreAuthorize("@ss.hasPermi('system:config:remove')")
126
+    @Log(title = "参数管理", businessType = BusinessType.CLEAN)
127
+    @DeleteMapping("/refreshCache")
128
+    public AjaxResult refreshCache()
129
+    {
130
+        configService.resetConfigCache();
131
+        return success();
132
+    }
133
+}

+ 132
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDeptController.java Parādīt failu

@@ -0,0 +1,132 @@
1
+package com.ruoyi.web.controller.system;
2
+
3
+import java.util.List;
4
+import org.apache.commons.lang3.ArrayUtils;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.security.access.prepost.PreAuthorize;
7
+import org.springframework.validation.annotation.Validated;
8
+import org.springframework.web.bind.annotation.DeleteMapping;
9
+import org.springframework.web.bind.annotation.GetMapping;
10
+import org.springframework.web.bind.annotation.PathVariable;
11
+import org.springframework.web.bind.annotation.PostMapping;
12
+import org.springframework.web.bind.annotation.PutMapping;
13
+import org.springframework.web.bind.annotation.RequestBody;
14
+import org.springframework.web.bind.annotation.RequestMapping;
15
+import org.springframework.web.bind.annotation.RestController;
16
+import com.ruoyi.common.annotation.Log;
17
+import com.ruoyi.common.constant.UserConstants;
18
+import com.ruoyi.common.core.controller.BaseController;
19
+import com.ruoyi.common.core.domain.AjaxResult;
20
+import com.ruoyi.common.core.domain.entity.SysDept;
21
+import com.ruoyi.common.enums.BusinessType;
22
+import com.ruoyi.common.utils.StringUtils;
23
+import com.ruoyi.system.service.ISysDeptService;
24
+
25
+/**
26
+ * 部门信息
27
+ * 
28
+ * @author ruoyi
29
+ */
30
+@RestController
31
+@RequestMapping("/system/dept")
32
+public class SysDeptController extends BaseController
33
+{
34
+    @Autowired
35
+    private ISysDeptService deptService;
36
+
37
+    /**
38
+     * 获取部门列表
39
+     */
40
+    @PreAuthorize("@ss.hasPermi('system:dept:list')")
41
+    @GetMapping("/list")
42
+    public AjaxResult list(SysDept dept)
43
+    {
44
+        List<SysDept> depts = deptService.selectDeptList(dept);
45
+        return success(depts);
46
+    }
47
+
48
+    /**
49
+     * 查询部门列表(排除节点)
50
+     */
51
+    @PreAuthorize("@ss.hasPermi('system:dept:list')")
52
+    @GetMapping("/list/exclude/{deptId}")
53
+    public AjaxResult excludeChild(@PathVariable(value = "deptId", required = false) Long deptId)
54
+    {
55
+        List<SysDept> depts = deptService.selectDeptList(new SysDept());
56
+        depts.removeIf(d -> d.getDeptId().intValue() == deptId || ArrayUtils.contains(StringUtils.split(d.getAncestors(), ","), deptId + ""));
57
+        return success(depts);
58
+    }
59
+
60
+    /**
61
+     * 根据部门编号获取详细信息
62
+     */
63
+    @PreAuthorize("@ss.hasPermi('system:dept:query')")
64
+    @GetMapping(value = "/{deptId}")
65
+    public AjaxResult getInfo(@PathVariable Long deptId)
66
+    {
67
+        deptService.checkDeptDataScope(deptId);
68
+        return success(deptService.selectDeptById(deptId));
69
+    }
70
+
71
+    /**
72
+     * 新增部门
73
+     */
74
+    @PreAuthorize("@ss.hasPermi('system:dept:add')")
75
+    @Log(title = "部门管理", businessType = BusinessType.INSERT)
76
+    @PostMapping
77
+    public AjaxResult add(@Validated @RequestBody SysDept dept)
78
+    {
79
+        if (!deptService.checkDeptNameUnique(dept))
80
+        {
81
+            return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
82
+        }
83
+        dept.setCreateBy(getUsername());
84
+        return toAjax(deptService.insertDept(dept));
85
+    }
86
+
87
+    /**
88
+     * 修改部门
89
+     */
90
+    @PreAuthorize("@ss.hasPermi('system:dept:edit')")
91
+    @Log(title = "部门管理", businessType = BusinessType.UPDATE)
92
+    @PutMapping
93
+    public AjaxResult edit(@Validated @RequestBody SysDept dept)
94
+    {
95
+        Long deptId = dept.getDeptId();
96
+        deptService.checkDeptDataScope(deptId);
97
+        if (!deptService.checkDeptNameUnique(dept))
98
+        {
99
+            return error("修改部门'" + dept.getDeptName() + "'失败,部门名称已存在");
100
+        }
101
+        else if (dept.getParentId().equals(deptId))
102
+        {
103
+            return error("修改部门'" + dept.getDeptName() + "'失败,上级部门不能是自己");
104
+        }
105
+        else if (StringUtils.equals(UserConstants.DEPT_DISABLE, dept.getStatus()) && deptService.selectNormalChildrenDeptById(deptId) > 0)
106
+        {
107
+            return error("该部门包含未停用的子部门!");
108
+        }
109
+        dept.setUpdateBy(getUsername());
110
+        return toAjax(deptService.updateDept(dept));
111
+    }
112
+
113
+    /**
114
+     * 删除部门
115
+     */
116
+    @PreAuthorize("@ss.hasPermi('system:dept:remove')")
117
+    @Log(title = "部门管理", businessType = BusinessType.DELETE)
118
+    @DeleteMapping("/{deptId}")
119
+    public AjaxResult remove(@PathVariable Long deptId)
120
+    {
121
+        if (deptService.hasChildByDeptId(deptId))
122
+        {
123
+            return warn("存在下级部门,不允许删除");
124
+        }
125
+        if (deptService.checkDeptExistUser(deptId))
126
+        {
127
+            return warn("部门存在用户,不允许删除");
128
+        }
129
+        deptService.checkDeptDataScope(deptId);
130
+        return toAjax(deptService.deleteDeptById(deptId));
131
+    }
132
+}

+ 121
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictDataController.java Parādīt failu

@@ -0,0 +1,121 @@
1
+package com.ruoyi.web.controller.system;
2
+
3
+import java.util.ArrayList;
4
+import java.util.List;
5
+import javax.servlet.http.HttpServletResponse;
6
+import org.springframework.beans.factory.annotation.Autowired;
7
+import org.springframework.security.access.prepost.PreAuthorize;
8
+import org.springframework.validation.annotation.Validated;
9
+import org.springframework.web.bind.annotation.DeleteMapping;
10
+import org.springframework.web.bind.annotation.GetMapping;
11
+import org.springframework.web.bind.annotation.PathVariable;
12
+import org.springframework.web.bind.annotation.PostMapping;
13
+import org.springframework.web.bind.annotation.PutMapping;
14
+import org.springframework.web.bind.annotation.RequestBody;
15
+import org.springframework.web.bind.annotation.RequestMapping;
16
+import org.springframework.web.bind.annotation.RestController;
17
+import com.ruoyi.common.annotation.Log;
18
+import com.ruoyi.common.core.controller.BaseController;
19
+import com.ruoyi.common.core.domain.AjaxResult;
20
+import com.ruoyi.common.core.domain.entity.SysDictData;
21
+import com.ruoyi.common.core.page.TableDataInfo;
22
+import com.ruoyi.common.enums.BusinessType;
23
+import com.ruoyi.common.utils.StringUtils;
24
+import com.ruoyi.common.utils.poi.ExcelUtil;
25
+import com.ruoyi.system.service.ISysDictDataService;
26
+import com.ruoyi.system.service.ISysDictTypeService;
27
+
28
+/**
29
+ * 数据字典信息
30
+ * 
31
+ * @author ruoyi
32
+ */
33
+@RestController
34
+@RequestMapping("/system/dict/data")
35
+public class SysDictDataController extends BaseController
36
+{
37
+    @Autowired
38
+    private ISysDictDataService dictDataService;
39
+
40
+    @Autowired
41
+    private ISysDictTypeService dictTypeService;
42
+
43
+    @PreAuthorize("@ss.hasPermi('system:dict:list')")
44
+    @GetMapping("/list")
45
+    public TableDataInfo list(SysDictData dictData)
46
+    {
47
+        startPage();
48
+        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
49
+        return getDataTable(list);
50
+    }
51
+
52
+    @Log(title = "字典数据", businessType = BusinessType.EXPORT)
53
+    @PreAuthorize("@ss.hasPermi('system:dict:export')")
54
+    @PostMapping("/export")
55
+    public void export(HttpServletResponse response, SysDictData dictData)
56
+    {
57
+        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
58
+        ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class);
59
+        util.exportExcel(response, list, "字典数据");
60
+    }
61
+
62
+    /**
63
+     * 查询字典数据详细
64
+     */
65
+    @PreAuthorize("@ss.hasPermi('system:dict:query')")
66
+    @GetMapping(value = "/{dictCode}")
67
+    public AjaxResult getInfo(@PathVariable Long dictCode)
68
+    {
69
+        return success(dictDataService.selectDictDataById(dictCode));
70
+    }
71
+
72
+    /**
73
+     * 根据字典类型查询字典数据信息
74
+     */
75
+    @GetMapping(value = "/type/{dictType}")
76
+    public AjaxResult dictType(@PathVariable String dictType)
77
+    {
78
+        List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
79
+        if (StringUtils.isNull(data))
80
+        {
81
+            data = new ArrayList<SysDictData>();
82
+        }
83
+        return success(data);
84
+    }
85
+
86
+    /**
87
+     * 新增字典类型
88
+     */
89
+    @PreAuthorize("@ss.hasPermi('system:dict:add')")
90
+    @Log(title = "字典数据", businessType = BusinessType.INSERT)
91
+    @PostMapping
92
+    public AjaxResult add(@Validated @RequestBody SysDictData dict)
93
+    {
94
+        dict.setCreateBy(getUsername());
95
+        return toAjax(dictDataService.insertDictData(dict));
96
+    }
97
+
98
+    /**
99
+     * 修改保存字典类型
100
+     */
101
+    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
102
+    @Log(title = "字典数据", businessType = BusinessType.UPDATE)
103
+    @PutMapping
104
+    public AjaxResult edit(@Validated @RequestBody SysDictData dict)
105
+    {
106
+        dict.setUpdateBy(getUsername());
107
+        return toAjax(dictDataService.updateDictData(dict));
108
+    }
109
+
110
+    /**
111
+     * 删除字典类型
112
+     */
113
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
114
+    @Log(title = "字典类型", businessType = BusinessType.DELETE)
115
+    @DeleteMapping("/{dictCodes}")
116
+    public AjaxResult remove(@PathVariable Long[] dictCodes)
117
+    {
118
+        dictDataService.deleteDictDataByIds(dictCodes);
119
+        return success();
120
+    }
121
+}

+ 131
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysDictTypeController.java Parādīt failu

@@ -0,0 +1,131 @@
1
+package com.ruoyi.web.controller.system;
2
+
3
+import java.util.List;
4
+import javax.servlet.http.HttpServletResponse;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.security.access.prepost.PreAuthorize;
7
+import org.springframework.validation.annotation.Validated;
8
+import org.springframework.web.bind.annotation.DeleteMapping;
9
+import org.springframework.web.bind.annotation.GetMapping;
10
+import org.springframework.web.bind.annotation.PathVariable;
11
+import org.springframework.web.bind.annotation.PostMapping;
12
+import org.springframework.web.bind.annotation.PutMapping;
13
+import org.springframework.web.bind.annotation.RequestBody;
14
+import org.springframework.web.bind.annotation.RequestMapping;
15
+import org.springframework.web.bind.annotation.RestController;
16
+import com.ruoyi.common.annotation.Log;
17
+import com.ruoyi.common.core.controller.BaseController;
18
+import com.ruoyi.common.core.domain.AjaxResult;
19
+import com.ruoyi.common.core.domain.entity.SysDictType;
20
+import com.ruoyi.common.core.page.TableDataInfo;
21
+import com.ruoyi.common.enums.BusinessType;
22
+import com.ruoyi.common.utils.poi.ExcelUtil;
23
+import com.ruoyi.system.service.ISysDictTypeService;
24
+
25
+/**
26
+ * 数据字典信息
27
+ * 
28
+ * @author ruoyi
29
+ */
30
+@RestController
31
+@RequestMapping("/system/dict/type")
32
+public class SysDictTypeController extends BaseController
33
+{
34
+    @Autowired
35
+    private ISysDictTypeService dictTypeService;
36
+
37
+    @PreAuthorize("@ss.hasPermi('system:dict:list')")
38
+    @GetMapping("/list")
39
+    public TableDataInfo list(SysDictType dictType)
40
+    {
41
+        startPage();
42
+        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
43
+        return getDataTable(list);
44
+    }
45
+
46
+    @Log(title = "字典类型", businessType = BusinessType.EXPORT)
47
+    @PreAuthorize("@ss.hasPermi('system:dict:export')")
48
+    @PostMapping("/export")
49
+    public void export(HttpServletResponse response, SysDictType dictType)
50
+    {
51
+        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
52
+        ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class);
53
+        util.exportExcel(response, list, "字典类型");
54
+    }
55
+
56
+    /**
57
+     * 查询字典类型详细
58
+     */
59
+    @PreAuthorize("@ss.hasPermi('system:dict:query')")
60
+    @GetMapping(value = "/{dictId}")
61
+    public AjaxResult getInfo(@PathVariable Long dictId)
62
+    {
63
+        return success(dictTypeService.selectDictTypeById(dictId));
64
+    }
65
+
66
+    /**
67
+     * 新增字典类型
68
+     */
69
+    @PreAuthorize("@ss.hasPermi('system:dict:add')")
70
+    @Log(title = "字典类型", businessType = BusinessType.INSERT)
71
+    @PostMapping
72
+    public AjaxResult add(@Validated @RequestBody SysDictType dict)
73
+    {
74
+        if (!dictTypeService.checkDictTypeUnique(dict))
75
+        {
76
+            return error("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
77
+        }
78
+        dict.setCreateBy(getUsername());
79
+        return toAjax(dictTypeService.insertDictType(dict));
80
+    }
81
+
82
+    /**
83
+     * 修改字典类型
84
+     */
85
+    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
86
+    @Log(title = "字典类型", businessType = BusinessType.UPDATE)
87
+    @PutMapping
88
+    public AjaxResult edit(@Validated @RequestBody SysDictType dict)
89
+    {
90
+        if (!dictTypeService.checkDictTypeUnique(dict))
91
+        {
92
+            return error("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
93
+        }
94
+        dict.setUpdateBy(getUsername());
95
+        return toAjax(dictTypeService.updateDictType(dict));
96
+    }
97
+
98
+    /**
99
+     * 删除字典类型
100
+     */
101
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
102
+    @Log(title = "字典类型", businessType = BusinessType.DELETE)
103
+    @DeleteMapping("/{dictIds}")
104
+    public AjaxResult remove(@PathVariable Long[] dictIds)
105
+    {
106
+        dictTypeService.deleteDictTypeByIds(dictIds);
107
+        return success();
108
+    }
109
+
110
+    /**
111
+     * 刷新字典缓存
112
+     */
113
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
114
+    @Log(title = "字典类型", businessType = BusinessType.CLEAN)
115
+    @DeleteMapping("/refreshCache")
116
+    public AjaxResult refreshCache()
117
+    {
118
+        dictTypeService.resetDictCache();
119
+        return success();
120
+    }
121
+
122
+    /**
123
+     * 获取字典选择框列表
124
+     */
125
+    @GetMapping("/optionselect")
126
+    public AjaxResult optionselect()
127
+    {
128
+        List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();
129
+        return success(dictTypes);
130
+    }
131
+}

+ 29
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysIndexController.java Parādīt failu

@@ -0,0 +1,29 @@
1
+package com.ruoyi.web.controller.system;
2
+
3
+import org.springframework.beans.factory.annotation.Autowired;
4
+import org.springframework.web.bind.annotation.RequestMapping;
5
+import org.springframework.web.bind.annotation.RestController;
6
+import com.ruoyi.common.config.RuoYiConfig;
7
+import com.ruoyi.common.utils.StringUtils;
8
+
9
+/**
10
+ * 首页
11
+ *
12
+ * @author ruoyi
13
+ */
14
+@RestController
15
+public class SysIndexController
16
+{
17
+    /** 系统基础配置 */
18
+    @Autowired
19
+    private RuoYiConfig ruoyiConfig;
20
+
21
+    /**
22
+     * 访问首页,提示语
23
+     */
24
+    @RequestMapping("/")
25
+    public String index()
26
+    {
27
+        return StringUtils.format("欢迎使用{}后台管理框架,当前版本:v{},请通过前端地址访问。", ruoyiConfig.getName(), ruoyiConfig.getVersion());
28
+    }
29
+}

+ 86
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java Parādīt failu

@@ -0,0 +1,86 @@
1
+package com.ruoyi.web.controller.system;
2
+
3
+import java.util.List;
4
+import java.util.Set;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.web.bind.annotation.GetMapping;
7
+import org.springframework.web.bind.annotation.PostMapping;
8
+import org.springframework.web.bind.annotation.RequestBody;
9
+import org.springframework.web.bind.annotation.RestController;
10
+import com.ruoyi.common.constant.Constants;
11
+import com.ruoyi.common.core.domain.AjaxResult;
12
+import com.ruoyi.common.core.domain.entity.SysMenu;
13
+import com.ruoyi.common.core.domain.entity.SysUser;
14
+import com.ruoyi.common.core.domain.model.LoginBody;
15
+import com.ruoyi.common.utils.SecurityUtils;
16
+import com.ruoyi.framework.web.service.SysLoginService;
17
+import com.ruoyi.framework.web.service.SysPermissionService;
18
+import com.ruoyi.system.service.ISysMenuService;
19
+
20
+/**
21
+ * 登录验证
22
+ * 
23
+ * @author ruoyi
24
+ */
25
+@RestController
26
+public class SysLoginController
27
+{
28
+    @Autowired
29
+    private SysLoginService loginService;
30
+
31
+    @Autowired
32
+    private ISysMenuService menuService;
33
+
34
+    @Autowired
35
+    private SysPermissionService permissionService;
36
+
37
+    /**
38
+     * 登录方法
39
+     * 
40
+     * @param loginBody 登录信息
41
+     * @return 结果
42
+     */
43
+    @PostMapping("/login")
44
+    public AjaxResult login(@RequestBody LoginBody loginBody)
45
+    {
46
+        AjaxResult ajax = AjaxResult.success();
47
+        // 生成令牌
48
+        String token = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
49
+                loginBody.getUuid());
50
+        ajax.put(Constants.TOKEN, token);
51
+        return ajax;
52
+    }
53
+
54
+    /**
55
+     * 获取用户信息
56
+     * 
57
+     * @return 用户信息
58
+     */
59
+    @GetMapping("getInfo")
60
+    public AjaxResult getInfo()
61
+    {
62
+        SysUser user = SecurityUtils.getLoginUser().getUser();
63
+        // 角色集合
64
+        Set<String> roles = permissionService.getRolePermission(user);
65
+        // 权限集合
66
+        Set<String> permissions = permissionService.getMenuPermission(user);
67
+        AjaxResult ajax = AjaxResult.success();
68
+        ajax.put("user", user);
69
+        ajax.put("roles", roles);
70
+        ajax.put("permissions", permissions);
71
+        return ajax;
72
+    }
73
+
74
+    /**
75
+     * 获取路由信息
76
+     * 
77
+     * @return 路由信息
78
+     */
79
+    @GetMapping("getRouters")
80
+    public AjaxResult getRouters()
81
+    {
82
+        Long userId = SecurityUtils.getUserId();
83
+        List<SysMenu> menus = menuService.selectMenuTreeByUserId(userId);
84
+        return AjaxResult.success(menuService.buildMenus(menus));
85
+    }
86
+}

+ 142
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java Parādīt failu

@@ -0,0 +1,142 @@
1
+package com.ruoyi.web.controller.system;
2
+
3
+import java.util.List;
4
+import org.springframework.beans.factory.annotation.Autowired;
5
+import org.springframework.security.access.prepost.PreAuthorize;
6
+import org.springframework.validation.annotation.Validated;
7
+import org.springframework.web.bind.annotation.DeleteMapping;
8
+import org.springframework.web.bind.annotation.GetMapping;
9
+import org.springframework.web.bind.annotation.PathVariable;
10
+import org.springframework.web.bind.annotation.PostMapping;
11
+import org.springframework.web.bind.annotation.PutMapping;
12
+import org.springframework.web.bind.annotation.RequestBody;
13
+import org.springframework.web.bind.annotation.RequestMapping;
14
+import org.springframework.web.bind.annotation.RestController;
15
+import com.ruoyi.common.annotation.Log;
16
+import com.ruoyi.common.constant.UserConstants;
17
+import com.ruoyi.common.core.controller.BaseController;
18
+import com.ruoyi.common.core.domain.AjaxResult;
19
+import com.ruoyi.common.core.domain.entity.SysMenu;
20
+import com.ruoyi.common.enums.BusinessType;
21
+import com.ruoyi.common.utils.StringUtils;
22
+import com.ruoyi.system.service.ISysMenuService;
23
+
24
+/**
25
+ * 菜单信息
26
+ * 
27
+ * @author ruoyi
28
+ */
29
+@RestController
30
+@RequestMapping("/system/menu")
31
+public class SysMenuController extends BaseController
32
+{
33
+    @Autowired
34
+    private ISysMenuService menuService;
35
+
36
+    /**
37
+     * 获取菜单列表
38
+     */
39
+    @PreAuthorize("@ss.hasPermi('system:menu:list')")
40
+    @GetMapping("/list")
41
+    public AjaxResult list(SysMenu menu)
42
+    {
43
+        List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
44
+        return success(menus);
45
+    }
46
+
47
+    /**
48
+     * 根据菜单编号获取详细信息
49
+     */
50
+    @PreAuthorize("@ss.hasPermi('system:menu:query')")
51
+    @GetMapping(value = "/{menuId}")
52
+    public AjaxResult getInfo(@PathVariable Long menuId)
53
+    {
54
+        return success(menuService.selectMenuById(menuId));
55
+    }
56
+
57
+    /**
58
+     * 获取菜单下拉树列表
59
+     */
60
+    @GetMapping("/treeselect")
61
+    public AjaxResult treeselect(SysMenu menu)
62
+    {
63
+        List<SysMenu> menus = menuService.selectMenuList(menu, getUserId());
64
+        return success(menuService.buildMenuTreeSelect(menus));
65
+    }
66
+
67
+    /**
68
+     * 加载对应角色菜单列表树
69
+     */
70
+    @GetMapping(value = "/roleMenuTreeselect/{roleId}")
71
+    public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
72
+    {
73
+        List<SysMenu> menus = menuService.selectMenuList(getUserId());
74
+        AjaxResult ajax = AjaxResult.success();
75
+        ajax.put("checkedKeys", menuService.selectMenuListByRoleId(roleId));
76
+        ajax.put("menus", menuService.buildMenuTreeSelect(menus));
77
+        return ajax;
78
+    }
79
+
80
+    /**
81
+     * 新增菜单
82
+     */
83
+    @PreAuthorize("@ss.hasPermi('system:menu:add')")
84
+    @Log(title = "菜单管理", businessType = BusinessType.INSERT)
85
+    @PostMapping
86
+    public AjaxResult add(@Validated @RequestBody SysMenu menu)
87
+    {
88
+        if (!menuService.checkMenuNameUnique(menu))
89
+        {
90
+            return error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
91
+        }
92
+        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
93
+        {
94
+            return error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
95
+        }
96
+        menu.setCreateBy(getUsername());
97
+        return toAjax(menuService.insertMenu(menu));
98
+    }
99
+
100
+    /**
101
+     * 修改菜单
102
+     */
103
+    @PreAuthorize("@ss.hasPermi('system:menu:edit')")
104
+    @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
105
+    @PutMapping
106
+    public AjaxResult edit(@Validated @RequestBody SysMenu menu)
107
+    {
108
+        if (!menuService.checkMenuNameUnique(menu))
109
+        {
110
+            return error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
111
+        }
112
+        else if (UserConstants.YES_FRAME.equals(menu.getIsFrame()) && !StringUtils.ishttp(menu.getPath()))
113
+        {
114
+            return error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
115
+        }
116
+        else if (menu.getMenuId().equals(menu.getParentId()))
117
+        {
118
+            return error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
119
+        }
120
+        menu.setUpdateBy(getUsername());
121
+        return toAjax(menuService.updateMenu(menu));
122
+    }
123
+
124
+    /**
125
+     * 删除菜单
126
+     */
127
+    @PreAuthorize("@ss.hasPermi('system:menu:remove')")
128
+    @Log(title = "菜单管理", businessType = BusinessType.DELETE)
129
+    @DeleteMapping("/{menuId}")
130
+    public AjaxResult remove(@PathVariable("menuId") Long menuId)
131
+    {
132
+        if (menuService.hasChildByMenuId(menuId))
133
+        {
134
+            return warn("存在子菜单,不允许删除");
135
+        }
136
+        if (menuService.checkMenuExistRole(menuId))
137
+        {
138
+            return warn("菜单已分配,不允许删除");
139
+        }
140
+        return toAjax(menuService.deleteMenuById(menuId));
141
+    }
142
+}

+ 91
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysNoticeController.java Parādīt failu

@@ -0,0 +1,91 @@
1
+package com.ruoyi.web.controller.system;
2
+
3
+import java.util.List;
4
+import org.springframework.beans.factory.annotation.Autowired;
5
+import org.springframework.security.access.prepost.PreAuthorize;
6
+import org.springframework.validation.annotation.Validated;
7
+import org.springframework.web.bind.annotation.DeleteMapping;
8
+import org.springframework.web.bind.annotation.GetMapping;
9
+import org.springframework.web.bind.annotation.PathVariable;
10
+import org.springframework.web.bind.annotation.PostMapping;
11
+import org.springframework.web.bind.annotation.PutMapping;
12
+import org.springframework.web.bind.annotation.RequestBody;
13
+import org.springframework.web.bind.annotation.RequestMapping;
14
+import org.springframework.web.bind.annotation.RestController;
15
+import com.ruoyi.common.annotation.Log;
16
+import com.ruoyi.common.core.controller.BaseController;
17
+import com.ruoyi.common.core.domain.AjaxResult;
18
+import com.ruoyi.common.core.page.TableDataInfo;
19
+import com.ruoyi.common.enums.BusinessType;
20
+import com.ruoyi.system.domain.SysNotice;
21
+import com.ruoyi.system.service.ISysNoticeService;
22
+
23
+/**
24
+ * 公告 信息操作处理
25
+ * 
26
+ * @author ruoyi
27
+ */
28
+@RestController
29
+@RequestMapping("/system/notice")
30
+public class SysNoticeController extends BaseController
31
+{
32
+    @Autowired
33
+    private ISysNoticeService noticeService;
34
+
35
+    /**
36
+     * 获取通知公告列表
37
+     */
38
+    @PreAuthorize("@ss.hasPermi('system:notice:list')")
39
+    @GetMapping("/list")
40
+    public TableDataInfo list(SysNotice notice)
41
+    {
42
+        startPage();
43
+        List<SysNotice> list = noticeService.selectNoticeList(notice);
44
+        return getDataTable(list);
45
+    }
46
+
47
+    /**
48
+     * 根据通知公告编号获取详细信息
49
+     */
50
+    @PreAuthorize("@ss.hasPermi('system:notice:query')")
51
+    @GetMapping(value = "/{noticeId}")
52
+    public AjaxResult getInfo(@PathVariable Long noticeId)
53
+    {
54
+        return success(noticeService.selectNoticeById(noticeId));
55
+    }
56
+
57
+    /**
58
+     * 新增通知公告
59
+     */
60
+    @PreAuthorize("@ss.hasPermi('system:notice:add')")
61
+    @Log(title = "通知公告", businessType = BusinessType.INSERT)
62
+    @PostMapping
63
+    public AjaxResult add(@Validated @RequestBody SysNotice notice)
64
+    {
65
+        notice.setCreateBy(getUsername());
66
+        return toAjax(noticeService.insertNotice(notice));
67
+    }
68
+
69
+    /**
70
+     * 修改通知公告
71
+     */
72
+    @PreAuthorize("@ss.hasPermi('system:notice:edit')")
73
+    @Log(title = "通知公告", businessType = BusinessType.UPDATE)
74
+    @PutMapping
75
+    public AjaxResult edit(@Validated @RequestBody SysNotice notice)
76
+    {
77
+        notice.setUpdateBy(getUsername());
78
+        return toAjax(noticeService.updateNotice(notice));
79
+    }
80
+
81
+    /**
82
+     * 删除通知公告
83
+     */
84
+    @PreAuthorize("@ss.hasPermi('system:notice:remove')")
85
+    @Log(title = "通知公告", businessType = BusinessType.DELETE)
86
+    @DeleteMapping("/{noticeIds}")
87
+    public AjaxResult remove(@PathVariable Long[] noticeIds)
88
+    {
89
+        return toAjax(noticeService.deleteNoticeByIds(noticeIds));
90
+    }
91
+}

+ 129
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysPostController.java Parādīt failu

@@ -0,0 +1,129 @@
1
+package com.ruoyi.web.controller.system;
2
+
3
+import java.util.List;
4
+import javax.servlet.http.HttpServletResponse;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.security.access.prepost.PreAuthorize;
7
+import org.springframework.validation.annotation.Validated;
8
+import org.springframework.web.bind.annotation.DeleteMapping;
9
+import org.springframework.web.bind.annotation.GetMapping;
10
+import org.springframework.web.bind.annotation.PathVariable;
11
+import org.springframework.web.bind.annotation.PostMapping;
12
+import org.springframework.web.bind.annotation.PutMapping;
13
+import org.springframework.web.bind.annotation.RequestBody;
14
+import org.springframework.web.bind.annotation.RequestMapping;
15
+import org.springframework.web.bind.annotation.RestController;
16
+import com.ruoyi.common.annotation.Log;
17
+import com.ruoyi.common.core.controller.BaseController;
18
+import com.ruoyi.common.core.domain.AjaxResult;
19
+import com.ruoyi.common.core.page.TableDataInfo;
20
+import com.ruoyi.common.enums.BusinessType;
21
+import com.ruoyi.common.utils.poi.ExcelUtil;
22
+import com.ruoyi.system.domain.SysPost;
23
+import com.ruoyi.system.service.ISysPostService;
24
+
25
+/**
26
+ * 岗位信息操作处理
27
+ * 
28
+ * @author ruoyi
29
+ */
30
+@RestController
31
+@RequestMapping("/system/post")
32
+public class SysPostController extends BaseController
33
+{
34
+    @Autowired
35
+    private ISysPostService postService;
36
+
37
+    /**
38
+     * 获取岗位列表
39
+     */
40
+    @PreAuthorize("@ss.hasPermi('system:post:list')")
41
+    @GetMapping("/list")
42
+    public TableDataInfo list(SysPost post)
43
+    {
44
+        startPage();
45
+        List<SysPost> list = postService.selectPostList(post);
46
+        return getDataTable(list);
47
+    }
48
+    
49
+    @Log(title = "岗位管理", businessType = BusinessType.EXPORT)
50
+    @PreAuthorize("@ss.hasPermi('system:post:export')")
51
+    @PostMapping("/export")
52
+    public void export(HttpServletResponse response, SysPost post)
53
+    {
54
+        List<SysPost> list = postService.selectPostList(post);
55
+        ExcelUtil<SysPost> util = new ExcelUtil<SysPost>(SysPost.class);
56
+        util.exportExcel(response, list, "岗位数据");
57
+    }
58
+
59
+    /**
60
+     * 根据岗位编号获取详细信息
61
+     */
62
+    @PreAuthorize("@ss.hasPermi('system:post:query')")
63
+    @GetMapping(value = "/{postId}")
64
+    public AjaxResult getInfo(@PathVariable Long postId)
65
+    {
66
+        return success(postService.selectPostById(postId));
67
+    }
68
+
69
+    /**
70
+     * 新增岗位
71
+     */
72
+    @PreAuthorize("@ss.hasPermi('system:post:add')")
73
+    @Log(title = "岗位管理", businessType = BusinessType.INSERT)
74
+    @PostMapping
75
+    public AjaxResult add(@Validated @RequestBody SysPost post)
76
+    {
77
+        if (!postService.checkPostNameUnique(post))
78
+        {
79
+            return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
80
+        }
81
+        else if (!postService.checkPostCodeUnique(post))
82
+        {
83
+            return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
84
+        }
85
+        post.setCreateBy(getUsername());
86
+        return toAjax(postService.insertPost(post));
87
+    }
88
+
89
+    /**
90
+     * 修改岗位
91
+     */
92
+    @PreAuthorize("@ss.hasPermi('system:post:edit')")
93
+    @Log(title = "岗位管理", businessType = BusinessType.UPDATE)
94
+    @PutMapping
95
+    public AjaxResult edit(@Validated @RequestBody SysPost post)
96
+    {
97
+        if (!postService.checkPostNameUnique(post))
98
+        {
99
+            return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
100
+        }
101
+        else if (!postService.checkPostCodeUnique(post))
102
+        {
103
+            return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
104
+        }
105
+        post.setUpdateBy(getUsername());
106
+        return toAjax(postService.updatePost(post));
107
+    }
108
+
109
+    /**
110
+     * 删除岗位
111
+     */
112
+    @PreAuthorize("@ss.hasPermi('system:post:remove')")
113
+    @Log(title = "岗位管理", businessType = BusinessType.DELETE)
114
+    @DeleteMapping("/{postIds}")
115
+    public AjaxResult remove(@PathVariable Long[] postIds)
116
+    {
117
+        return toAjax(postService.deletePostByIds(postIds));
118
+    }
119
+
120
+    /**
121
+     * 获取岗位选择框列表
122
+     */
123
+    @GetMapping("/optionselect")
124
+    public AjaxResult optionselect()
125
+    {
126
+        List<SysPost> posts = postService.selectPostAll();
127
+        return success(posts);
128
+    }
129
+}

+ 141
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysProfileController.java Parādīt failu

@@ -0,0 +1,141 @@
1
+package com.ruoyi.web.controller.system;
2
+
3
+import org.springframework.beans.factory.annotation.Autowired;
4
+import org.springframework.web.bind.annotation.GetMapping;
5
+import org.springframework.web.bind.annotation.PostMapping;
6
+import org.springframework.web.bind.annotation.PutMapping;
7
+import org.springframework.web.bind.annotation.RequestBody;
8
+import org.springframework.web.bind.annotation.RequestMapping;
9
+import org.springframework.web.bind.annotation.RequestParam;
10
+import org.springframework.web.bind.annotation.RestController;
11
+import org.springframework.web.multipart.MultipartFile;
12
+import com.ruoyi.common.annotation.Log;
13
+import com.ruoyi.common.config.RuoYiConfig;
14
+import com.ruoyi.common.core.controller.BaseController;
15
+import com.ruoyi.common.core.domain.AjaxResult;
16
+import com.ruoyi.common.core.domain.entity.SysUser;
17
+import com.ruoyi.common.core.domain.model.LoginUser;
18
+import com.ruoyi.common.enums.BusinessType;
19
+import com.ruoyi.common.utils.SecurityUtils;
20
+import com.ruoyi.common.utils.StringUtils;
21
+import com.ruoyi.common.utils.file.FileUploadUtils;
22
+import com.ruoyi.common.utils.file.MimeTypeUtils;
23
+import com.ruoyi.framework.web.service.TokenService;
24
+import com.ruoyi.system.service.ISysUserService;
25
+
26
+/**
27
+ * 个人信息 业务处理
28
+ * 
29
+ * @author ruoyi
30
+ */
31
+@RestController
32
+@RequestMapping("/system/user/profile")
33
+public class SysProfileController extends BaseController
34
+{
35
+    @Autowired
36
+    private ISysUserService userService;
37
+
38
+    @Autowired
39
+    private TokenService tokenService;
40
+
41
+    /**
42
+     * 个人信息
43
+     */
44
+    @GetMapping
45
+    public AjaxResult profile()
46
+    {
47
+        LoginUser loginUser = getLoginUser();
48
+        SysUser user = loginUser.getUser();
49
+        AjaxResult ajax = AjaxResult.success(user);
50
+        ajax.put("roleGroup", userService.selectUserRoleGroup(loginUser.getUsername()));
51
+        ajax.put("postGroup", userService.selectUserPostGroup(loginUser.getUsername()));
52
+        return ajax;
53
+    }
54
+
55
+    /**
56
+     * 修改用户
57
+     */
58
+    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
59
+    @PutMapping
60
+    public AjaxResult updateProfile(@RequestBody SysUser user)
61
+    {
62
+        LoginUser loginUser = getLoginUser();
63
+        SysUser sysUser = loginUser.getUser();
64
+        user.setUserName(sysUser.getUserName());
65
+        if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
66
+        {
67
+            return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
68
+        }
69
+        if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
70
+        {
71
+            return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
72
+        }
73
+        user.setUserId(sysUser.getUserId());
74
+        user.setPassword(null);
75
+        user.setAvatar(null);
76
+        user.setDeptId(null);
77
+        if (userService.updateUserProfile(user) > 0)
78
+        {
79
+            // 更新缓存用户信息
80
+            sysUser.setNickName(user.getNickName());
81
+            sysUser.setPhonenumber(user.getPhonenumber());
82
+            sysUser.setEmail(user.getEmail());
83
+            sysUser.setSex(user.getSex());
84
+            tokenService.setLoginUser(loginUser);
85
+            return success();
86
+        }
87
+        return error("修改个人信息异常,请联系管理员");
88
+    }
89
+
90
+    /**
91
+     * 重置密码
92
+     */
93
+    @Log(title = "个人信息", businessType = BusinessType.UPDATE)
94
+    @PutMapping("/updatePwd")
95
+    public AjaxResult updatePwd(String oldPassword, String newPassword)
96
+    {
97
+        LoginUser loginUser = getLoginUser();
98
+        String userName = loginUser.getUsername();
99
+        String password = loginUser.getPassword();
100
+        if (!SecurityUtils.matchesPassword(oldPassword, password))
101
+        {
102
+            return error("修改密码失败,旧密码错误");
103
+        }
104
+        if (SecurityUtils.matchesPassword(newPassword, password))
105
+        {
106
+            return error("新密码不能与旧密码相同");
107
+        }
108
+        if (userService.resetUserPwd(userName, SecurityUtils.encryptPassword(newPassword)) > 0)
109
+        {
110
+            // 更新缓存用户密码
111
+            loginUser.getUser().setPassword(SecurityUtils.encryptPassword(newPassword));
112
+            tokenService.setLoginUser(loginUser);
113
+            return success();
114
+        }
115
+        return error("修改密码异常,请联系管理员");
116
+    }
117
+
118
+    /**
119
+     * 头像上传
120
+     */
121
+    @Log(title = "用户头像", businessType = BusinessType.UPDATE)
122
+    @PostMapping("/avatar")
123
+    public AjaxResult avatar(@RequestParam("avatarfile") MultipartFile file) throws Exception
124
+    {
125
+        if (!file.isEmpty())
126
+        {
127
+            LoginUser loginUser = getLoginUser();
128
+            String avatar = FileUploadUtils.upload(RuoYiConfig.getAvatarPath(), file, MimeTypeUtils.IMAGE_EXTENSION);
129
+            if (userService.updateUserAvatar(loginUser.getUsername(), avatar))
130
+            {
131
+                AjaxResult ajax = AjaxResult.success();
132
+                ajax.put("imgUrl", avatar);
133
+                // 更新缓存用户头像
134
+                loginUser.getUser().setAvatar(avatar);
135
+                tokenService.setLoginUser(loginUser);
136
+                return ajax;
137
+            }
138
+        }
139
+        return error("上传图片异常,请联系管理员");
140
+    }
141
+}

+ 38
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRegisterController.java Parādīt failu

@@ -0,0 +1,38 @@
1
+package com.ruoyi.web.controller.system;
2
+
3
+import org.springframework.beans.factory.annotation.Autowired;
4
+import org.springframework.web.bind.annotation.PostMapping;
5
+import org.springframework.web.bind.annotation.RequestBody;
6
+import org.springframework.web.bind.annotation.RestController;
7
+import com.ruoyi.common.core.controller.BaseController;
8
+import com.ruoyi.common.core.domain.AjaxResult;
9
+import com.ruoyi.common.core.domain.model.RegisterBody;
10
+import com.ruoyi.common.utils.StringUtils;
11
+import com.ruoyi.framework.web.service.SysRegisterService;
12
+import com.ruoyi.system.service.ISysConfigService;
13
+
14
+/**
15
+ * 注册验证
16
+ * 
17
+ * @author ruoyi
18
+ */
19
+@RestController
20
+public class SysRegisterController extends BaseController
21
+{
22
+    @Autowired
23
+    private SysRegisterService registerService;
24
+
25
+    @Autowired
26
+    private ISysConfigService configService;
27
+
28
+    @PostMapping("/register")
29
+    public AjaxResult register(@RequestBody RegisterBody user)
30
+    {
31
+        if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
32
+        {
33
+            return error("当前系统没有开启注册功能!");
34
+        }
35
+        String msg = registerService.register(user);
36
+        return StringUtils.isEmpty(msg) ? success() : error(msg);
37
+    }
38
+}

+ 262
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysRoleController.java Parādīt failu

@@ -0,0 +1,262 @@
1
+package com.ruoyi.web.controller.system;
2
+
3
+import java.util.List;
4
+import javax.servlet.http.HttpServletResponse;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.security.access.prepost.PreAuthorize;
7
+import org.springframework.validation.annotation.Validated;
8
+import org.springframework.web.bind.annotation.DeleteMapping;
9
+import org.springframework.web.bind.annotation.GetMapping;
10
+import org.springframework.web.bind.annotation.PathVariable;
11
+import org.springframework.web.bind.annotation.PostMapping;
12
+import org.springframework.web.bind.annotation.PutMapping;
13
+import org.springframework.web.bind.annotation.RequestBody;
14
+import org.springframework.web.bind.annotation.RequestMapping;
15
+import org.springframework.web.bind.annotation.RestController;
16
+import com.ruoyi.common.annotation.Log;
17
+import com.ruoyi.common.core.controller.BaseController;
18
+import com.ruoyi.common.core.domain.AjaxResult;
19
+import com.ruoyi.common.core.domain.entity.SysDept;
20
+import com.ruoyi.common.core.domain.entity.SysRole;
21
+import com.ruoyi.common.core.domain.entity.SysUser;
22
+import com.ruoyi.common.core.domain.model.LoginUser;
23
+import com.ruoyi.common.core.page.TableDataInfo;
24
+import com.ruoyi.common.enums.BusinessType;
25
+import com.ruoyi.common.utils.StringUtils;
26
+import com.ruoyi.common.utils.poi.ExcelUtil;
27
+import com.ruoyi.framework.web.service.SysPermissionService;
28
+import com.ruoyi.framework.web.service.TokenService;
29
+import com.ruoyi.system.domain.SysUserRole;
30
+import com.ruoyi.system.service.ISysDeptService;
31
+import com.ruoyi.system.service.ISysRoleService;
32
+import com.ruoyi.system.service.ISysUserService;
33
+
34
+/**
35
+ * 角色信息
36
+ * 
37
+ * @author ruoyi
38
+ */
39
+@RestController
40
+@RequestMapping("/system/role")
41
+public class SysRoleController extends BaseController
42
+{
43
+    @Autowired
44
+    private ISysRoleService roleService;
45
+
46
+    @Autowired
47
+    private TokenService tokenService;
48
+
49
+    @Autowired
50
+    private SysPermissionService permissionService;
51
+
52
+    @Autowired
53
+    private ISysUserService userService;
54
+
55
+    @Autowired
56
+    private ISysDeptService deptService;
57
+
58
+    @PreAuthorize("@ss.hasPermi('system:role:list')")
59
+    @GetMapping("/list")
60
+    public TableDataInfo list(SysRole role)
61
+    {
62
+        startPage();
63
+        List<SysRole> list = roleService.selectRoleList(role);
64
+        return getDataTable(list);
65
+    }
66
+
67
+    @Log(title = "角色管理", businessType = BusinessType.EXPORT)
68
+    @PreAuthorize("@ss.hasPermi('system:role:export')")
69
+    @PostMapping("/export")
70
+    public void export(HttpServletResponse response, SysRole role)
71
+    {
72
+        List<SysRole> list = roleService.selectRoleList(role);
73
+        ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
74
+        util.exportExcel(response, list, "角色数据");
75
+    }
76
+
77
+    /**
78
+     * 根据角色编号获取详细信息
79
+     */
80
+    @PreAuthorize("@ss.hasPermi('system:role:query')")
81
+    @GetMapping(value = "/{roleId}")
82
+    public AjaxResult getInfo(@PathVariable Long roleId)
83
+    {
84
+        roleService.checkRoleDataScope(roleId);
85
+        return success(roleService.selectRoleById(roleId));
86
+    }
87
+
88
+    /**
89
+     * 新增角色
90
+     */
91
+    @PreAuthorize("@ss.hasPermi('system:role:add')")
92
+    @Log(title = "角色管理", businessType = BusinessType.INSERT)
93
+    @PostMapping
94
+    public AjaxResult add(@Validated @RequestBody SysRole role)
95
+    {
96
+        if (!roleService.checkRoleNameUnique(role))
97
+        {
98
+            return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
99
+        }
100
+        else if (!roleService.checkRoleKeyUnique(role))
101
+        {
102
+            return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
103
+        }
104
+        role.setCreateBy(getUsername());
105
+        return toAjax(roleService.insertRole(role));
106
+
107
+    }
108
+
109
+    /**
110
+     * 修改保存角色
111
+     */
112
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
113
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
114
+    @PutMapping
115
+    public AjaxResult edit(@Validated @RequestBody SysRole role)
116
+    {
117
+        roleService.checkRoleAllowed(role);
118
+        roleService.checkRoleDataScope(role.getRoleId());
119
+        if (!roleService.checkRoleNameUnique(role))
120
+        {
121
+            return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
122
+        }
123
+        else if (!roleService.checkRoleKeyUnique(role))
124
+        {
125
+            return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
126
+        }
127
+        role.setUpdateBy(getUsername());
128
+        
129
+        if (roleService.updateRole(role) > 0)
130
+        {
131
+            // 更新缓存用户权限
132
+            LoginUser loginUser = getLoginUser();
133
+            if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
134
+            {
135
+                loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
136
+                loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
137
+                tokenService.setLoginUser(loginUser);
138
+            }
139
+            return success();
140
+        }
141
+        return error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
142
+    }
143
+
144
+    /**
145
+     * 修改保存数据权限
146
+     */
147
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
148
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
149
+    @PutMapping("/dataScope")
150
+    public AjaxResult dataScope(@RequestBody SysRole role)
151
+    {
152
+        roleService.checkRoleAllowed(role);
153
+        roleService.checkRoleDataScope(role.getRoleId());
154
+        return toAjax(roleService.authDataScope(role));
155
+    }
156
+
157
+    /**
158
+     * 状态修改
159
+     */
160
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
161
+    @Log(title = "角色管理", businessType = BusinessType.UPDATE)
162
+    @PutMapping("/changeStatus")
163
+    public AjaxResult changeStatus(@RequestBody SysRole role)
164
+    {
165
+        roleService.checkRoleAllowed(role);
166
+        roleService.checkRoleDataScope(role.getRoleId());
167
+        role.setUpdateBy(getUsername());
168
+        return toAjax(roleService.updateRoleStatus(role));
169
+    }
170
+
171
+    /**
172
+     * 删除角色
173
+     */
174
+    @PreAuthorize("@ss.hasPermi('system:role:remove')")
175
+    @Log(title = "角色管理", businessType = BusinessType.DELETE)
176
+    @DeleteMapping("/{roleIds}")
177
+    public AjaxResult remove(@PathVariable Long[] roleIds)
178
+    {
179
+        return toAjax(roleService.deleteRoleByIds(roleIds));
180
+    }
181
+
182
+    /**
183
+     * 获取角色选择框列表
184
+     */
185
+    @PreAuthorize("@ss.hasPermi('system:role:query')")
186
+    @GetMapping("/optionselect")
187
+    public AjaxResult optionselect()
188
+    {
189
+        return success(roleService.selectRoleAll());
190
+    }
191
+
192
+    /**
193
+     * 查询已分配用户角色列表
194
+     */
195
+    @PreAuthorize("@ss.hasPermi('system:role:list')")
196
+    @GetMapping("/authUser/allocatedList")
197
+    public TableDataInfo allocatedList(SysUser user)
198
+    {
199
+        startPage();
200
+        List<SysUser> list = userService.selectAllocatedList(user);
201
+        return getDataTable(list);
202
+    }
203
+
204
+    /**
205
+     * 查询未分配用户角色列表
206
+     */
207
+    @PreAuthorize("@ss.hasPermi('system:role:list')")
208
+    @GetMapping("/authUser/unallocatedList")
209
+    public TableDataInfo unallocatedList(SysUser user)
210
+    {
211
+        startPage();
212
+        List<SysUser> list = userService.selectUnallocatedList(user);
213
+        return getDataTable(list);
214
+    }
215
+
216
+    /**
217
+     * 取消授权用户
218
+     */
219
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
220
+    @Log(title = "角色管理", businessType = BusinessType.GRANT)
221
+    @PutMapping("/authUser/cancel")
222
+    public AjaxResult cancelAuthUser(@RequestBody SysUserRole userRole)
223
+    {
224
+        return toAjax(roleService.deleteAuthUser(userRole));
225
+    }
226
+
227
+    /**
228
+     * 批量取消授权用户
229
+     */
230
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
231
+    @Log(title = "角色管理", businessType = BusinessType.GRANT)
232
+    @PutMapping("/authUser/cancelAll")
233
+    public AjaxResult cancelAuthUserAll(Long roleId, Long[] userIds)
234
+    {
235
+        return toAjax(roleService.deleteAuthUsers(roleId, userIds));
236
+    }
237
+
238
+    /**
239
+     * 批量选择用户授权
240
+     */
241
+    @PreAuthorize("@ss.hasPermi('system:role:edit')")
242
+    @Log(title = "角色管理", businessType = BusinessType.GRANT)
243
+    @PutMapping("/authUser/selectAll")
244
+    public AjaxResult selectAuthUserAll(Long roleId, Long[] userIds)
245
+    {
246
+        roleService.checkRoleDataScope(roleId);
247
+        return toAjax(roleService.insertAuthUsers(roleId, userIds));
248
+    }
249
+
250
+    /**
251
+     * 获取对应角色部门树列表
252
+     */
253
+    @PreAuthorize("@ss.hasPermi('system:role:query')")
254
+    @GetMapping(value = "/deptTree/{roleId}")
255
+    public AjaxResult deptTree(@PathVariable("roleId") Long roleId)
256
+    {
257
+        AjaxResult ajax = AjaxResult.success();
258
+        ajax.put("checkedKeys", deptService.selectDeptListByRoleId(roleId));
259
+        ajax.put("depts", deptService.selectDeptTreeList(new SysDept()));
260
+        return ajax;
261
+    }
262
+}

+ 251
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysUserController.java Parādīt failu

@@ -0,0 +1,251 @@
1
+package com.ruoyi.web.controller.system;
2
+
3
+import java.util.List;
4
+import java.util.stream.Collectors;
5
+import javax.servlet.http.HttpServletResponse;
6
+import org.apache.commons.lang3.ArrayUtils;
7
+import org.springframework.beans.factory.annotation.Autowired;
8
+import org.springframework.security.access.prepost.PreAuthorize;
9
+import org.springframework.validation.annotation.Validated;
10
+import org.springframework.web.bind.annotation.DeleteMapping;
11
+import org.springframework.web.bind.annotation.GetMapping;
12
+import org.springframework.web.bind.annotation.PathVariable;
13
+import org.springframework.web.bind.annotation.PostMapping;
14
+import org.springframework.web.bind.annotation.PutMapping;
15
+import org.springframework.web.bind.annotation.RequestBody;
16
+import org.springframework.web.bind.annotation.RequestMapping;
17
+import org.springframework.web.bind.annotation.RestController;
18
+import org.springframework.web.multipart.MultipartFile;
19
+import com.ruoyi.common.annotation.Log;
20
+import com.ruoyi.common.core.controller.BaseController;
21
+import com.ruoyi.common.core.domain.AjaxResult;
22
+import com.ruoyi.common.core.domain.entity.SysDept;
23
+import com.ruoyi.common.core.domain.entity.SysRole;
24
+import com.ruoyi.common.core.domain.entity.SysUser;
25
+import com.ruoyi.common.core.page.TableDataInfo;
26
+import com.ruoyi.common.enums.BusinessType;
27
+import com.ruoyi.common.utils.SecurityUtils;
28
+import com.ruoyi.common.utils.StringUtils;
29
+import com.ruoyi.common.utils.poi.ExcelUtil;
30
+import com.ruoyi.system.service.ISysDeptService;
31
+import com.ruoyi.system.service.ISysPostService;
32
+import com.ruoyi.system.service.ISysRoleService;
33
+import com.ruoyi.system.service.ISysUserService;
34
+
35
+/**
36
+ * 用户信息
37
+ * 
38
+ * @author ruoyi
39
+ */
40
+@RestController
41
+@RequestMapping("/system/user")
42
+public class SysUserController extends BaseController
43
+{
44
+    @Autowired
45
+    private ISysUserService userService;
46
+
47
+    @Autowired
48
+    private ISysRoleService roleService;
49
+
50
+    @Autowired
51
+    private ISysDeptService deptService;
52
+
53
+    @Autowired
54
+    private ISysPostService postService;
55
+
56
+    /**
57
+     * 获取用户列表
58
+     */
59
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
60
+    @GetMapping("/list")
61
+    public TableDataInfo list(SysUser user)
62
+    {
63
+        startPage();
64
+        List<SysUser> list = userService.selectUserList(user);
65
+        return getDataTable(list);
66
+    }
67
+
68
+    @Log(title = "用户管理", businessType = BusinessType.EXPORT)
69
+    @PreAuthorize("@ss.hasPermi('system:user:export')")
70
+    @PostMapping("/export")
71
+    public void export(HttpServletResponse response, SysUser user)
72
+    {
73
+        List<SysUser> list = userService.selectUserList(user);
74
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
75
+        util.exportExcel(response, list, "用户数据");
76
+    }
77
+
78
+    @Log(title = "用户管理", businessType = BusinessType.IMPORT)
79
+    @PreAuthorize("@ss.hasPermi('system:user:import')")
80
+    @PostMapping("/importData")
81
+    public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
82
+    {
83
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
84
+        List<SysUser> userList = util.importExcel(file.getInputStream());
85
+        String operName = getUsername();
86
+        String message = userService.importUser(userList, updateSupport, operName);
87
+        return success(message);
88
+    }
89
+
90
+    @PostMapping("/importTemplate")
91
+    public void importTemplate(HttpServletResponse response)
92
+    {
93
+        ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);
94
+        util.importTemplateExcel(response, "用户数据");
95
+    }
96
+
97
+    /**
98
+     * 根据用户编号获取详细信息
99
+     */
100
+    @PreAuthorize("@ss.hasPermi('system:user:query')")
101
+    @GetMapping(value = { "/", "/{userId}" })
102
+    public AjaxResult getInfo(@PathVariable(value = "userId", required = false) Long userId)
103
+    {
104
+        userService.checkUserDataScope(userId);
105
+        AjaxResult ajax = AjaxResult.success();
106
+        List<SysRole> roles = roleService.selectRoleAll();
107
+        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
108
+        ajax.put("posts", postService.selectPostAll());
109
+        if (StringUtils.isNotNull(userId))
110
+        {
111
+            SysUser sysUser = userService.selectUserById(userId);
112
+            ajax.put(AjaxResult.DATA_TAG, sysUser);
113
+            ajax.put("postIds", postService.selectPostListByUserId(userId));
114
+            ajax.put("roleIds", sysUser.getRoles().stream().map(SysRole::getRoleId).collect(Collectors.toList()));
115
+        }
116
+        return ajax;
117
+    }
118
+
119
+    /**
120
+     * 新增用户
121
+     */
122
+    @PreAuthorize("@ss.hasPermi('system:user:add')")
123
+    @Log(title = "用户管理", businessType = BusinessType.INSERT)
124
+    @PostMapping
125
+    public AjaxResult add(@Validated @RequestBody SysUser user)
126
+    {
127
+        if (!userService.checkUserNameUnique(user))
128
+        {
129
+            return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
130
+        }
131
+        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
132
+        {
133
+            return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
134
+        }
135
+        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
136
+        {
137
+            return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
138
+        }
139
+        user.setCreateBy(getUsername());
140
+        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
141
+        return toAjax(userService.insertUser(user));
142
+    }
143
+
144
+    /**
145
+     * 修改用户
146
+     */
147
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
148
+    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
149
+    @PutMapping
150
+    public AjaxResult edit(@Validated @RequestBody SysUser user)
151
+    {
152
+        userService.checkUserAllowed(user);
153
+        userService.checkUserDataScope(user.getUserId());
154
+        if (!userService.checkUserNameUnique(user))
155
+        {
156
+            return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
157
+        }
158
+        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
159
+        {
160
+            return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
161
+        }
162
+        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
163
+        {
164
+            return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
165
+        }
166
+        user.setUpdateBy(getUsername());
167
+        return toAjax(userService.updateUser(user));
168
+    }
169
+
170
+    /**
171
+     * 删除用户
172
+     */
173
+    @PreAuthorize("@ss.hasPermi('system:user:remove')")
174
+    @Log(title = "用户管理", businessType = BusinessType.DELETE)
175
+    @DeleteMapping("/{userIds}")
176
+    public AjaxResult remove(@PathVariable Long[] userIds)
177
+    {
178
+        if (ArrayUtils.contains(userIds, getUserId()))
179
+        {
180
+            return error("当前用户不能删除");
181
+        }
182
+        return toAjax(userService.deleteUserByIds(userIds));
183
+    }
184
+
185
+    /**
186
+     * 重置密码
187
+     */
188
+    @PreAuthorize("@ss.hasPermi('system:user:resetPwd')")
189
+    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
190
+    @PutMapping("/resetPwd")
191
+    public AjaxResult resetPwd(@RequestBody SysUser user)
192
+    {
193
+        userService.checkUserAllowed(user);
194
+        userService.checkUserDataScope(user.getUserId());
195
+        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
196
+        user.setUpdateBy(getUsername());
197
+        return toAjax(userService.resetPwd(user));
198
+    }
199
+
200
+    /**
201
+     * 状态修改
202
+     */
203
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
204
+    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
205
+    @PutMapping("/changeStatus")
206
+    public AjaxResult changeStatus(@RequestBody SysUser user)
207
+    {
208
+        userService.checkUserAllowed(user);
209
+        userService.checkUserDataScope(user.getUserId());
210
+        user.setUpdateBy(getUsername());
211
+        return toAjax(userService.updateUserStatus(user));
212
+    }
213
+
214
+    /**
215
+     * 根据用户编号获取授权角色
216
+     */
217
+    @PreAuthorize("@ss.hasPermi('system:user:query')")
218
+    @GetMapping("/authRole/{userId}")
219
+    public AjaxResult authRole(@PathVariable("userId") Long userId)
220
+    {
221
+        AjaxResult ajax = AjaxResult.success();
222
+        SysUser user = userService.selectUserById(userId);
223
+        List<SysRole> roles = roleService.selectRolesByUserId(userId);
224
+        ajax.put("user", user);
225
+        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
226
+        return ajax;
227
+    }
228
+
229
+    /**
230
+     * 用户授权角色
231
+     */
232
+    @PreAuthorize("@ss.hasPermi('system:user:edit')")
233
+    @Log(title = "用户管理", businessType = BusinessType.GRANT)
234
+    @PutMapping("/authRole")
235
+    public AjaxResult insertAuthRole(Long userId, Long[] roleIds)
236
+    {
237
+        userService.checkUserDataScope(userId);
238
+        userService.insertUserAuth(userId, roleIds);
239
+        return success();
240
+    }
241
+
242
+    /**
243
+     * 获取部门树列表
244
+     */
245
+    @PreAuthorize("@ss.hasPermi('system:user:list')")
246
+    @GetMapping("/deptTree")
247
+    public AjaxResult deptTree(SysDept dept)
248
+    {
249
+        return success(deptService.selectDeptTreeList(dept));
250
+    }
251
+}

+ 183
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/tool/TestController.java Parādīt failu

@@ -0,0 +1,183 @@
1
+package com.ruoyi.web.controller.tool;
2
+
3
+import java.util.ArrayList;
4
+import java.util.LinkedHashMap;
5
+import java.util.List;
6
+import java.util.Map;
7
+import org.springframework.web.bind.annotation.DeleteMapping;
8
+import org.springframework.web.bind.annotation.GetMapping;
9
+import org.springframework.web.bind.annotation.PathVariable;
10
+import org.springframework.web.bind.annotation.PostMapping;
11
+import org.springframework.web.bind.annotation.PutMapping;
12
+import org.springframework.web.bind.annotation.RequestBody;
13
+import org.springframework.web.bind.annotation.RequestMapping;
14
+import org.springframework.web.bind.annotation.RestController;
15
+import com.ruoyi.common.core.controller.BaseController;
16
+import com.ruoyi.common.core.domain.R;
17
+import com.ruoyi.common.utils.StringUtils;
18
+import io.swagger.annotations.Api;
19
+import io.swagger.annotations.ApiImplicitParam;
20
+import io.swagger.annotations.ApiImplicitParams;
21
+import io.swagger.annotations.ApiModel;
22
+import io.swagger.annotations.ApiModelProperty;
23
+import io.swagger.annotations.ApiOperation;
24
+
25
+/**
26
+ * swagger 用户测试方法
27
+ * 
28
+ * @author ruoyi
29
+ */
30
+@Api("用户信息管理")
31
+@RestController
32
+@RequestMapping("/test/user")
33
+public class TestController extends BaseController
34
+{
35
+    private final static Map<Integer, UserEntity> users = new LinkedHashMap<Integer, UserEntity>();
36
+    {
37
+        users.put(1, new UserEntity(1, "admin", "admin123", "15888888888"));
38
+        users.put(2, new UserEntity(2, "ry", "admin123", "15666666666"));
39
+    }
40
+
41
+    @ApiOperation("获取用户列表")
42
+    @GetMapping("/list")
43
+    public R<List<UserEntity>> userList()
44
+    {
45
+        List<UserEntity> userList = new ArrayList<UserEntity>(users.values());
46
+        return R.ok(userList);
47
+    }
48
+
49
+    @ApiOperation("获取用户详细")
50
+    @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
51
+    @GetMapping("/{userId}")
52
+    public R<UserEntity> getUser(@PathVariable Integer userId)
53
+    {
54
+        if (!users.isEmpty() && users.containsKey(userId))
55
+        {
56
+            return R.ok(users.get(userId));
57
+        }
58
+        else
59
+        {
60
+            return R.fail("用户不存在");
61
+        }
62
+    }
63
+
64
+    @ApiOperation("新增用户")
65
+    @ApiImplicitParams({
66
+        @ApiImplicitParam(name = "userId", value = "用户id", dataType = "Integer", dataTypeClass = Integer.class),
67
+        @ApiImplicitParam(name = "username", value = "用户名称", dataType = "String", dataTypeClass = String.class),
68
+        @ApiImplicitParam(name = "password", value = "用户密码", dataType = "String", dataTypeClass = String.class),
69
+        @ApiImplicitParam(name = "mobile", value = "用户手机", dataType = "String", dataTypeClass = String.class)
70
+    })
71
+    @PostMapping("/save")
72
+    public R<String> save(UserEntity user)
73
+    {
74
+        if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
75
+        {
76
+            return R.fail("用户ID不能为空");
77
+        }
78
+        users.put(user.getUserId(), user);
79
+        return R.ok();
80
+    }
81
+
82
+    @ApiOperation("更新用户")
83
+    @PutMapping("/update")
84
+    public R<String> update(@RequestBody UserEntity user)
85
+    {
86
+        if (StringUtils.isNull(user) || StringUtils.isNull(user.getUserId()))
87
+        {
88
+            return R.fail("用户ID不能为空");
89
+        }
90
+        if (users.isEmpty() || !users.containsKey(user.getUserId()))
91
+        {
92
+            return R.fail("用户不存在");
93
+        }
94
+        users.remove(user.getUserId());
95
+        users.put(user.getUserId(), user);
96
+        return R.ok();
97
+    }
98
+
99
+    @ApiOperation("删除用户信息")
100
+    @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "int", paramType = "path", dataTypeClass = Integer.class)
101
+    @DeleteMapping("/{userId}")
102
+    public R<String> delete(@PathVariable Integer userId)
103
+    {
104
+        if (!users.isEmpty() && users.containsKey(userId))
105
+        {
106
+            users.remove(userId);
107
+            return R.ok();
108
+        }
109
+        else
110
+        {
111
+            return R.fail("用户不存在");
112
+        }
113
+    }
114
+}
115
+
116
+@ApiModel(value = "UserEntity", description = "用户实体")
117
+class UserEntity
118
+{
119
+    @ApiModelProperty("用户ID")
120
+    private Integer userId;
121
+
122
+    @ApiModelProperty("用户名称")
123
+    private String username;
124
+
125
+    @ApiModelProperty("用户密码")
126
+    private String password;
127
+
128
+    @ApiModelProperty("用户手机")
129
+    private String mobile;
130
+
131
+    public UserEntity()
132
+    {
133
+
134
+    }
135
+
136
+    public UserEntity(Integer userId, String username, String password, String mobile)
137
+    {
138
+        this.userId = userId;
139
+        this.username = username;
140
+        this.password = password;
141
+        this.mobile = mobile;
142
+    }
143
+
144
+    public Integer getUserId()
145
+    {
146
+        return userId;
147
+    }
148
+
149
+    public void setUserId(Integer userId)
150
+    {
151
+        this.userId = userId;
152
+    }
153
+
154
+    public String getUsername()
155
+    {
156
+        return username;
157
+    }
158
+
159
+    public void setUsername(String username)
160
+    {
161
+        this.username = username;
162
+    }
163
+
164
+    public String getPassword()
165
+    {
166
+        return password;
167
+    }
168
+
169
+    public void setPassword(String password)
170
+    {
171
+        this.password = password;
172
+    }
173
+
174
+    public String getMobile()
175
+    {
176
+        return mobile;
177
+    }
178
+
179
+    public void setMobile(String mobile)
180
+    {
181
+        this.mobile = mobile;
182
+    }
183
+}

+ 125
- 0
smart-classify-back/ruoyi-admin/src/main/java/com/ruoyi/web/core/config/SwaggerConfig.java Parādīt failu

@@ -0,0 +1,125 @@
1
+package com.ruoyi.web.core.config;
2
+
3
+import java.util.ArrayList;
4
+import java.util.List;
5
+import org.springframework.beans.factory.annotation.Autowired;
6
+import org.springframework.beans.factory.annotation.Value;
7
+import org.springframework.context.annotation.Bean;
8
+import org.springframework.context.annotation.Configuration;
9
+import com.ruoyi.common.config.RuoYiConfig;
10
+import io.swagger.annotations.ApiOperation;
11
+import io.swagger.models.auth.In;
12
+import springfox.documentation.builders.ApiInfoBuilder;
13
+import springfox.documentation.builders.PathSelectors;
14
+import springfox.documentation.builders.RequestHandlerSelectors;
15
+import springfox.documentation.service.ApiInfo;
16
+import springfox.documentation.service.ApiKey;
17
+import springfox.documentation.service.AuthorizationScope;
18
+import springfox.documentation.service.Contact;
19
+import springfox.documentation.service.SecurityReference;
20
+import springfox.documentation.service.SecurityScheme;
21
+import springfox.documentation.spi.DocumentationType;
22
+import springfox.documentation.spi.service.contexts.SecurityContext;
23
+import springfox.documentation.spring.web.plugins.Docket;
24
+
25
+/**
26
+ * Swagger2的接口配置
27
+ * 
28
+ * @author ruoyi
29
+ */
30
+@Configuration
31
+public class SwaggerConfig
32
+{
33
+    /** 系统基础配置 */
34
+    @Autowired
35
+    private RuoYiConfig ruoyiConfig;
36
+
37
+    /** 是否开启swagger */
38
+    @Value("${swagger.enabled}")
39
+    private boolean enabled;
40
+
41
+    /** 设置请求的统一前缀 */
42
+    @Value("${swagger.pathMapping}")
43
+    private String pathMapping;
44
+
45
+    /**
46
+     * 创建API
47
+     */
48
+    @Bean
49
+    public Docket createRestApi()
50
+    {
51
+        return new Docket(DocumentationType.OAS_30)
52
+                // 是否启用Swagger
53
+                .enable(enabled)
54
+                // 用来创建该API的基本信息,展示在文档的页面中(自定义展示的信息)
55
+                .apiInfo(apiInfo())
56
+                // 设置哪些接口暴露给Swagger展示
57
+                .select()
58
+                // 扫描所有有注解的api,用这种方式更灵活
59
+                .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class))
60
+                // 扫描指定包中的swagger注解
61
+                // .apis(RequestHandlerSelectors.basePackage("com.ruoyi.project.tool.swagger"))
62
+                // 扫描所有 .apis(RequestHandlerSelectors.any())
63
+                .paths(PathSelectors.any())
64
+                .build()
65
+                /* 设置安全模式,swagger可以设置访问token */
66
+                .securitySchemes(securitySchemes())
67
+                .securityContexts(securityContexts())
68
+                .pathMapping(pathMapping);
69
+    }
70
+
71
+    /**
72
+     * 安全模式,这里指定token通过Authorization头请求头传递
73
+     */
74
+    private List<SecurityScheme> securitySchemes()
75
+    {
76
+        List<SecurityScheme> apiKeyList = new ArrayList<SecurityScheme>();
77
+        apiKeyList.add(new ApiKey("Authorization", "Authorization", In.HEADER.toValue()));
78
+        return apiKeyList;
79
+    }
80
+
81
+    /**
82
+     * 安全上下文
83
+     */
84
+    private List<SecurityContext> securityContexts()
85
+    {
86
+        List<SecurityContext> securityContexts = new ArrayList<>();
87
+        securityContexts.add(
88
+                SecurityContext.builder()
89
+                        .securityReferences(defaultAuth())
90
+                        .operationSelector(o -> o.requestMappingPattern().matches("/.*"))
91
+                        .build());
92
+        return securityContexts;
93
+    }
94
+
95
+    /**
96
+     * 默认的安全上引用
97
+     */
98
+    private List<SecurityReference> defaultAuth()
99
+    {
100
+        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
101
+        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
102
+        authorizationScopes[0] = authorizationScope;
103
+        List<SecurityReference> securityReferences = new ArrayList<>();
104
+        securityReferences.add(new SecurityReference("Authorization", authorizationScopes));
105
+        return securityReferences;
106
+    }
107
+
108
+    /**
109
+     * 添加摘要信息
110
+     */
111
+    private ApiInfo apiInfo()
112
+    {
113
+        // 用ApiInfoBuilder进行定制
114
+        return new ApiInfoBuilder()
115
+                // 设置标题
116
+                .title("标题:若依管理系统_接口文档")
117
+                // 描述
118
+                .description("描述:用于管理集团旗下公司的人员信息,具体包括XXX,XXX模块...")
119
+                // 作者信息
120
+                .contact(new Contact(ruoyiConfig.getName(), null, null))
121
+                // 版本
122
+                .version("版本号:" + ruoyiConfig.getVersion())
123
+                .build();
124
+    }
125
+}

+ 1
- 0
smart-classify-back/ruoyi-admin/src/main/resources/META-INF/spring-devtools.properties Parādīt failu

@@ -0,0 +1 @@
1
+restart.include.json=/com.alibaba.fastjson.*.jar

+ 68
- 0
smart-classify-back/ruoyi-admin/src/main/resources/application-druid.yml Parādīt failu

@@ -0,0 +1,68 @@
1
+# 数据源配置
2
+spring:
3
+    datasource:
4
+        type: com.alibaba.druid.pool.DruidDataSource
5
+#        driverClassName: com.mysql.cj.jdbc.Driver
6
+#        druid:
7
+            # 主库数据源
8
+#            master:
9
+#                url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
10
+#                username: root
11
+#                password: password
12
+
13
+        driverClassName: org.sqlite.JDBC
14
+        druid:
15
+            master:
16
+                url: jdbc:sqlite::resource:static/ry_sqlite_20230607.db?date_string_format=yyyy-MM-dd HH:mm:ss
17
+                username:
18
+                password:
19
+            # 从库数据源
20
+            slave:
21
+                # 从数据源开关/默认关闭
22
+                enabled: false
23
+                url: 
24
+                username: 
25
+                password: 
26
+            # 初始连接数
27
+            initialSize: 5
28
+            # 最小连接池数量
29
+            minIdle: 10
30
+            # 最大连接池数量
31
+            maxActive: 20
32
+            # 配置获取连接等待超时的时间
33
+            maxWait: 60000
34
+            # 配置连接超时时间
35
+            connectTimeout: 30000
36
+            # 配置网络超时时间
37
+            socketTimeout: 60000
38
+            # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
39
+            timeBetweenEvictionRunsMillis: 60000
40
+            # 配置一个连接在池中最小生存的时间,单位是毫秒
41
+            minEvictableIdleTimeMillis: 300000
42
+            # 配置一个连接在池中最大生存的时间,单位是毫秒
43
+            maxEvictableIdleTimeMillis: 900000
44
+            # 配置检测连接是否有效
45
+            validationQuery: SELECT 1
46
+            testWhileIdle: true
47
+            testOnBorrow: false
48
+            testOnReturn: false
49
+            webStatFilter: 
50
+                enabled: true
51
+            statViewServlet:
52
+                enabled: true
53
+                # 设置白名单,不填则允许所有访问
54
+                allow:
55
+                url-pattern: /druid/*
56
+                # 控制台管理用户名和密码
57
+                login-username: ruoyi
58
+                login-password: 123456
59
+            filter:
60
+                stat:
61
+                    enabled: true
62
+                    # 慢SQL记录
63
+                    log-slow-sql: true
64
+                    slow-sql-millis: 1000
65
+                    merge-sql: true
66
+                wall:
67
+                    config:
68
+                        multi-statement-allow: true

+ 132
- 0
smart-classify-back/ruoyi-admin/src/main/resources/application.yml Parādīt failu

@@ -0,0 +1,132 @@
1
+# 项目相关配置
2
+ruoyi:
3
+  # 名称
4
+  name: RuoYi
5
+  # 版本
6
+  version: 3.8.5
7
+  # 版权年份
8
+  copyrightYear: 2023
9
+  # 实例演示开关
10
+  demoEnabled: true
11
+  # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
12
+#  profile: /home/cmc/Java-server/数据加载平台/uploadPath
13
+  profile: D:/ruoyi/uploadPath
14
+  # 获取ip地址开关
15
+  addressEnabled: false
16
+  # 验证码类型 math 数组计算 char 字符验证
17
+  captchaType: math
18
+
19
+# 开发环境配置
20
+server:
21
+  # 服务器的HTTP端口,默认为8080
22
+  port: 8081
23
+  servlet:
24
+    # 应用的访问路径
25
+    context-path: /
26
+  tomcat:
27
+    # tomcat的URI编码
28
+    uri-encoding: UTF-8
29
+    # 连接数满后的排队数,默认为100
30
+    accept-count: 1000
31
+    threads:
32
+      # tomcat最大线程数,默认为200
33
+      max: 800
34
+      # Tomcat启动初始化的线程数,默认值10
35
+      min-spare: 100
36
+
37
+# 日志配置
38
+logging:
39
+  level:
40
+    com.ruoyi: debug
41
+    org.springframework: warn
42
+
43
+# 用户配置
44
+user:
45
+  password:
46
+    # 密码最大错误次数
47
+    maxRetryCount: 5
48
+    # 密码锁定时间(默认10分钟)
49
+    lockTime: 10
50
+
51
+# Spring配置
52
+spring:
53
+  # 资源信息
54
+  messages:
55
+    # 国际化资源文件路径
56
+    basename: i18n/messages
57
+  profiles: 
58
+    active: druid
59
+  # 文件上传
60
+  servlet:
61
+     multipart:
62
+       # 单个文件大小
63
+       max-file-size:  200MB
64
+       # 设置总上传的文件大小
65
+       max-request-size:  200MB
66
+  # 服务模块
67
+  devtools:
68
+    restart:
69
+      # 热部署开关
70
+      enabled: true
71
+  # redis 配置
72
+  redis:
73
+    # 地址
74
+    host: localhost
75
+    # 端口,默认为6379
76
+    port: 6379
77
+    # 数据库索引
78
+    database: 0
79
+    # 密码
80
+    password: 
81
+    # 连接超时时间
82
+    timeout: 10s
83
+    lettuce:
84
+      pool:
85
+        # 连接池中的最小空闲连接
86
+        min-idle: 0
87
+        # 连接池中的最大空闲连接
88
+        max-idle: 8
89
+        # 连接池的最大数据库连接数
90
+        max-active: 8
91
+        # #连接池最大阻塞等待时间(使用负值表示没有限制)
92
+        max-wait: -1ms
93
+
94
+# token配置
95
+token:
96
+    # 令牌自定义标识
97
+    header: Authorization
98
+    # 令牌密钥
99
+    secret: abcdefghijklmnopqrstuvwxyz
100
+    # 令牌有效期(默认30分钟)
101
+    expireTime: 120
102
+  
103
+# MyBatis配置
104
+mybatis:
105
+    # 搜索指定包别名
106
+    typeAliasesPackage: com.ruoyi.**.domain
107
+    # 配置mapper的扫描,找到所有的mapper.xml映射文件
108
+    mapperLocations: classpath*:mapper/**/*Mapper.xml
109
+    # 加载全局的配置文件
110
+    configLocation: classpath:mybatis/mybatis-config.xml
111
+
112
+# PageHelper分页插件
113
+pagehelper: 
114
+  helperDialect: mysql
115
+  supportMethodsArguments: true
116
+  params: count=countSql 
117
+
118
+# Swagger配置
119
+swagger:
120
+  # 是否开启swagger
121
+  enabled: true
122
+  # 请求前缀
123
+  pathMapping: /dev-api
124
+
125
+# 防止XSS攻击
126
+xss: 
127
+  # 过滤开关
128
+  enabled: true
129
+  # 排除链接(多个用逗号分隔)
130
+  excludes: /system/notice
131
+  # 匹配链接
132
+  urlPatterns: /system/*,/monitor/*,/tool/*

+ 2
- 0
smart-classify-back/ruoyi-admin/src/main/resources/banner.txt Parādīt failu

@@ -0,0 +1,2 @@
1
+Application Version: ${ruoyi.version}
2
+Spring Boot Version: ${spring-boot.version}

Binārs
smart-classify-back/ruoyi-admin/src/main/resources/gdal/gdal.jar Parādīt failu


+ 38
- 0
smart-classify-back/ruoyi-admin/src/main/resources/i18n/messages.properties Parādīt failu

@@ -0,0 +1,38 @@
1
+#错误消息
2
+not.null=* 必须填写
3
+user.jcaptcha.error=验证码错误
4
+user.jcaptcha.expire=验证码已失效
5
+user.not.exists=用户不存在/密码错误
6
+user.password.not.match=用户不存在/密码错误
7
+user.password.retry.limit.count=密码输入错误{0}次
8
+user.password.retry.limit.exceed=密码输入错误{0}次,帐户锁定{1}分钟
9
+user.password.delete=对不起,您的账号已被删除
10
+user.blocked=用户已封禁,请联系管理员
11
+role.blocked=角色已封禁,请联系管理员
12
+login.blocked=很遗憾,访问IP已被列入系统黑名单
13
+user.logout.success=退出成功
14
+
15
+length.not.valid=长度必须在{min}到{max}个字符之间
16
+
17
+user.username.not.valid=* 2到20个汉字、字母、数字或下划线组成,且必须以非数字开头
18
+user.password.not.valid=* 5-50个字符
19
+ 
20
+user.email.not.valid=邮箱格式错误
21
+user.mobile.phone.number.not.valid=手机号格式错误
22
+user.login.success=登录成功
23
+user.register.success=注册成功
24
+user.notfound=请重新登录
25
+user.forcelogout=管理员强制退出,请重新登录
26
+user.unknown.error=未知错误,请重新登录
27
+
28
+##文件上传消息
29
+upload.exceed.maxSize=上传的文件大小超出限制的文件大小!<br/>允许的文件最大大小是:{0}MB!
30
+upload.filename.exceed.length=上传的文件名最长{0}个字符
31
+
32
+##权限
33
+no.permission=您没有数据的权限,请联系管理员添加权限 [{0}]
34
+no.create.permission=您没有创建数据的权限,请联系管理员添加权限 [{0}]
35
+no.update.permission=您没有修改数据的权限,请联系管理员添加权限 [{0}]
36
+no.delete.permission=您没有删除数据的权限,请联系管理员添加权限 [{0}]
37
+no.export.permission=您没有导出数据的权限,请联系管理员添加权限 [{0}]
38
+no.view.permission=您没有查看数据的权限,请联系管理员添加权限 [{0}]

+ 93
- 0
smart-classify-back/ruoyi-admin/src/main/resources/logback.xml Parādīt failu

@@ -0,0 +1,93 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<configuration>
3
+    <!-- 日志存放路径 -->
4
+	<property name="log.path" value="/home/cmc/Java-server/数据加载平台/logs" />
5
+    <!-- 日志输出格式 -->
6
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
7
+
8
+	<!-- 控制台输出 -->
9
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
10
+		<encoder>
11
+			<pattern>${log.pattern}</pattern>
12
+		</encoder>
13
+	</appender>
14
+	
15
+	<!-- 系统日志输出 -->
16
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
17
+	    <file>${log.path}/sys-info.log</file>
18
+        <!-- 循环政策:基于时间创建日志文件 -->
19
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
20
+            <!-- 日志文件名格式 -->
21
+			<fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
22
+			<!-- 日志最大的历史 60天 -->
23
+			<maxHistory>60</maxHistory>
24
+		</rollingPolicy>
25
+		<encoder>
26
+			<pattern>${log.pattern}</pattern>
27
+		</encoder>
28
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
29
+            <!-- 过滤的级别 -->
30
+            <level>INFO</level>
31
+            <!-- 匹配时的操作:接收(记录) -->
32
+            <onMatch>ACCEPT</onMatch>
33
+            <!-- 不匹配时的操作:拒绝(不记录) -->
34
+            <onMismatch>DENY</onMismatch>
35
+        </filter>
36
+	</appender>
37
+	
38
+	<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
39
+	    <file>${log.path}/sys-error.log</file>
40
+        <!-- 循环政策:基于时间创建日志文件 -->
41
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
42
+            <!-- 日志文件名格式 -->
43
+            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
44
+			<!-- 日志最大的历史 60天 -->
45
+			<maxHistory>60</maxHistory>
46
+        </rollingPolicy>
47
+        <encoder>
48
+            <pattern>${log.pattern}</pattern>
49
+        </encoder>
50
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
51
+            <!-- 过滤的级别 -->
52
+            <level>ERROR</level>
53
+			<!-- 匹配时的操作:接收(记录) -->
54
+            <onMatch>ACCEPT</onMatch>
55
+			<!-- 不匹配时的操作:拒绝(不记录) -->
56
+            <onMismatch>DENY</onMismatch>
57
+        </filter>
58
+    </appender>
59
+	
60
+	<!-- 用户访问日志输出  -->
61
+    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
62
+		<file>${log.path}/sys-user.log</file>
63
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
64
+            <!-- 按天回滚 daily -->
65
+            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
66
+            <!-- 日志最大的历史 60天 -->
67
+            <maxHistory>60</maxHistory>
68
+        </rollingPolicy>
69
+        <encoder>
70
+            <pattern>${log.pattern}</pattern>
71
+        </encoder>
72
+    </appender>
73
+	
74
+	<!-- 系统模块日志级别控制  -->
75
+	<logger name="com.ruoyi" level="info" />
76
+	<!-- Spring日志级别控制  -->
77
+	<logger name="org.springframework" level="warn" />
78
+
79
+	<root level="info">
80
+		<appender-ref ref="console" />
81
+	</root>
82
+	
83
+	<!--系统操作日志-->
84
+    <root level="info">
85
+        <appender-ref ref="file_info" />
86
+        <appender-ref ref="file_error" />
87
+    </root>
88
+	
89
+	<!--系统用户操作日志-->
90
+    <logger name="sys-user" level="info">
91
+        <appender-ref ref="sys-user"/>
92
+    </logger>
93
+</configuration> 

+ 20
- 0
smart-classify-back/ruoyi-admin/src/main/resources/mybatis/mybatis-config.xml Parādīt failu

@@ -0,0 +1,20 @@
1
+<?xml version="1.0" encoding="UTF-8" ?>
2
+<!DOCTYPE configuration
3
+PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
4
+"http://mybatis.org/dtd/mybatis-3-config.dtd">
5
+<configuration>
6
+    <!-- 全局参数 -->
7
+    <settings>
8
+        <!-- 使全局的映射器启用或禁用缓存 -->
9
+        <setting name="cacheEnabled"             value="true"   />
10
+        <!-- 允许JDBC 支持自动生成主键 -->
11
+        <setting name="useGeneratedKeys"         value="true"   />
12
+        <!-- 配置默认的执行器.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
13
+        <setting name="defaultExecutorType"      value="SIMPLE" />
14
+		<!-- 指定 MyBatis 所用日志的具体实现 -->
15
+        <setting name="logImpl"                  value="SLF4J"  />
16
+        <!-- 使用驼峰命名法转换字段 -->
17
+		<!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
18
+	</settings>
19
+	
20
+</configuration>

Binārs
smart-classify-back/ruoyi-admin/src/main/resources/paddle/paddle-serving-sdk-java-0.0.1.jar Parādīt failu


Binārs
smart-classify-back/ruoyi-admin/src/main/resources/static/ry_sqlite_20230607.db Parādīt failu


+ 131
- 0
smart-classify-back/ruoyi-common/pom.xml Parādīt failu

@@ -0,0 +1,131 @@
1
+<?xml version="1.0" encoding="UTF-8"?>
2
+<project xmlns="http://maven.apache.org/POM/4.0.0"
3
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
5
+    <parent>
6
+        <artifactId>ruoyi</artifactId>
7
+        <groupId>com.ruoyi</groupId>
8
+        <version>3.8.5</version>
9
+    </parent>
10
+    <modelVersion>4.0.0</modelVersion>
11
+
12
+    <artifactId>ruoyi-common</artifactId>
13
+
14
+    <description>
15
+        common通用工具
16
+    </description>
17
+
18
+    <dependencies>
19
+
20
+        <!-- Spring框架基本的核心工具 -->
21
+        <dependency>
22
+            <groupId>org.springframework</groupId>
23
+            <artifactId>spring-context-support</artifactId>
24
+        </dependency>
25
+
26
+        <!-- SpringWeb模块 -->
27
+        <dependency>
28
+            <groupId>org.springframework</groupId>
29
+            <artifactId>spring-web</artifactId>
30
+        </dependency>
31
+
32
+        <!-- spring security 安全认证 -->
33
+        <dependency>
34
+            <groupId>org.springframework.boot</groupId>
35
+            <artifactId>spring-boot-starter-security</artifactId>
36
+        </dependency>
37
+
38
+        <!-- pagehelper 分页插件 -->
39
+        <dependency>
40
+            <groupId>com.github.pagehelper</groupId>
41
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
42
+        </dependency>
43
+
44
+        <!-- 自定义验证注解 -->
45
+        <dependency>
46
+            <groupId>org.springframework.boot</groupId>
47
+            <artifactId>spring-boot-starter-validation</artifactId>
48
+        </dependency>
49
+
50
+        <!--常用工具类 -->
51
+        <dependency>
52
+            <groupId>org.apache.commons</groupId>
53
+            <artifactId>commons-lang3</artifactId>
54
+        </dependency>
55
+  
56
+        <!-- JSON工具类 -->
57
+        <dependency>
58
+            <groupId>com.fasterxml.jackson.core</groupId>
59
+            <artifactId>jackson-databind</artifactId>
60
+        </dependency>
61
+        
62
+        <!-- 动态数据源 -->
63
+		<dependency>
64
+			<groupId>com.baomidou</groupId>
65
+			<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
66
+			<version>3.5.2</version>
67
+		</dependency>
68
+
69
+        <!-- 阿里JSON解析器 -->
70
+        <dependency>
71
+            <groupId>com.alibaba.fastjson2</groupId>
72
+            <artifactId>fastjson2</artifactId>
73
+        </dependency>
74
+
75
+        <!-- io常用工具类 -->
76
+        <dependency>
77
+            <groupId>commons-io</groupId>
78
+            <artifactId>commons-io</artifactId>
79
+        </dependency>
80
+
81
+        <!-- excel工具 -->
82
+        <dependency>
83
+            <groupId>org.apache.poi</groupId>
84
+            <artifactId>poi-ooxml</artifactId>
85
+        </dependency>
86
+
87
+        <!-- yml解析器 -->
88
+        <dependency>
89
+            <groupId>org.yaml</groupId>
90
+            <artifactId>snakeyaml</artifactId>
91
+        </dependency>
92
+
93
+        <!-- Token生成与解析-->
94
+        <dependency>
95
+            <groupId>io.jsonwebtoken</groupId>
96
+            <artifactId>jjwt</artifactId>
97
+        </dependency>
98
+
99
+        <!-- Jaxb -->
100
+        <dependency>
101
+            <groupId>javax.xml.bind</groupId>
102
+            <artifactId>jaxb-api</artifactId>
103
+        </dependency>
104
+
105
+        <!-- redis 缓存操作 -->
106
+        <dependency>
107
+            <groupId>org.springframework.boot</groupId>
108
+            <artifactId>spring-boot-starter-data-redis</artifactId>
109
+        </dependency>
110
+
111
+        <!-- pool 对象池 -->
112
+        <dependency>
113
+            <groupId>org.apache.commons</groupId>
114
+            <artifactId>commons-pool2</artifactId>
115
+        </dependency>
116
+
117
+        <!-- 解析客户端操作系统、浏览器等 -->
118
+        <dependency>
119
+            <groupId>eu.bitwalker</groupId>
120
+            <artifactId>UserAgentUtils</artifactId>
121
+        </dependency>
122
+
123
+        <!-- servlet包 -->
124
+        <dependency>
125
+            <groupId>javax.servlet</groupId>
126
+            <artifactId>javax.servlet-api</artifactId>
127
+        </dependency>
128
+
129
+    </dependencies>
130
+
131
+</project>

+ 19
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Anonymous.java Parādīt failu

@@ -0,0 +1,19 @@
1
+package com.ruoyi.common.annotation;
2
+
3
+import java.lang.annotation.Documented;
4
+import java.lang.annotation.ElementType;
5
+import java.lang.annotation.Retention;
6
+import java.lang.annotation.RetentionPolicy;
7
+import java.lang.annotation.Target;
8
+
9
+/**
10
+ * 匿名访问不鉴权注解
11
+ * 
12
+ * @author ruoyi
13
+ */
14
+@Target({ ElementType.METHOD, ElementType.TYPE })
15
+@Retention(RetentionPolicy.RUNTIME)
16
+@Documented
17
+public @interface Anonymous
18
+{
19
+}

+ 33
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataScope.java Parādīt failu

@@ -0,0 +1,33 @@
1
+package com.ruoyi.common.annotation;
2
+
3
+import java.lang.annotation.Documented;
4
+import java.lang.annotation.ElementType;
5
+import java.lang.annotation.Retention;
6
+import java.lang.annotation.RetentionPolicy;
7
+import java.lang.annotation.Target;
8
+
9
+/**
10
+ * 数据权限过滤注解
11
+ * 
12
+ * @author ruoyi
13
+ */
14
+@Target(ElementType.METHOD)
15
+@Retention(RetentionPolicy.RUNTIME)
16
+@Documented
17
+public @interface DataScope
18
+{
19
+    /**
20
+     * 部门表的别名
21
+     */
22
+    public String deptAlias() default "";
23
+
24
+    /**
25
+     * 用户表的别名
26
+     */
27
+    public String userAlias() default "";
28
+
29
+    /**
30
+     * 权限字符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来
31
+     */
32
+    public String permission() default "";
33
+}

+ 28
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/DataSource.java Parādīt failu

@@ -0,0 +1,28 @@
1
+package com.ruoyi.common.annotation;
2
+
3
+import java.lang.annotation.Documented;
4
+import java.lang.annotation.ElementType;
5
+import java.lang.annotation.Inherited;
6
+import java.lang.annotation.Retention;
7
+import java.lang.annotation.RetentionPolicy;
8
+import java.lang.annotation.Target;
9
+import com.ruoyi.common.enums.DataSourceType;
10
+
11
+/**
12
+ * 自定义多数据源切换注解
13
+ *
14
+ * 优先级:先方法,后类,如果方法覆盖了类上的数据源类型,以方法的为准,否则以类上的为准
15
+ *
16
+ * @author ruoyi
17
+ */
18
+@Target({ ElementType.METHOD, ElementType.TYPE })
19
+@Retention(RetentionPolicy.RUNTIME)
20
+@Documented
21
+@Inherited
22
+public @interface DataSource
23
+{
24
+    /**
25
+     * 切换数据源名称
26
+     */
27
+    public DataSourceType value() default DataSourceType.MASTER;
28
+}

+ 187
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excel.java Parādīt failu

@@ -0,0 +1,187 @@
1
+package com.ruoyi.common.annotation;
2
+
3
+import java.lang.annotation.ElementType;
4
+import java.lang.annotation.Retention;
5
+import java.lang.annotation.RetentionPolicy;
6
+import java.lang.annotation.Target;
7
+import java.math.BigDecimal;
8
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
9
+import org.apache.poi.ss.usermodel.IndexedColors;
10
+import com.ruoyi.common.utils.poi.ExcelHandlerAdapter;
11
+
12
+/**
13
+ * 自定义导出Excel数据注解
14
+ * 
15
+ * @author ruoyi
16
+ */
17
+@Retention(RetentionPolicy.RUNTIME)
18
+@Target(ElementType.FIELD)
19
+public @interface Excel
20
+{
21
+    /**
22
+     * 导出时在excel中排序
23
+     */
24
+    public int sort() default Integer.MAX_VALUE;
25
+
26
+    /**
27
+     * 导出到Excel中的名字.
28
+     */
29
+    public String name() default "";
30
+
31
+    /**
32
+     * 日期格式, 如: yyyy-MM-dd
33
+     */
34
+    public String dateFormat() default "";
35
+
36
+    /**
37
+     * 如果是字典类型,请设置字典的type值 (如: sys_user_sex)
38
+     */
39
+    public String dictType() default "";
40
+
41
+    /**
42
+     * 读取内容转表达式 (如: 0=男,1=女,2=未知)
43
+     */
44
+    public String readConverterExp() default "";
45
+
46
+    /**
47
+     * 分隔符,读取字符串组内容
48
+     */
49
+    public String separator() default ",";
50
+
51
+    /**
52
+     * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化)
53
+     */
54
+    public int scale() default -1;
55
+
56
+    /**
57
+     * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN
58
+     */
59
+    public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
60
+
61
+    /**
62
+     * 导出时在excel中每个列的高度 单位为字符
63
+     */
64
+    public double height() default 14;
65
+
66
+    /**
67
+     * 导出时在excel中每个列的宽 单位为字符
68
+     */
69
+    public double width() default 16;
70
+
71
+    /**
72
+     * 文字后缀,如% 90 变成90%
73
+     */
74
+    public String suffix() default "";
75
+
76
+    /**
77
+     * 当值为空时,字段的默认值
78
+     */
79
+    public String defaultValue() default "";
80
+
81
+    /**
82
+     * 提示信息
83
+     */
84
+    public String prompt() default "";
85
+
86
+    /**
87
+     * 设置只能选择不能输入的列内容.
88
+     */
89
+    public String[] combo() default {};
90
+
91
+    /**
92
+     * 是否需要纵向合并单元格,应对需求:含有list集合单元格)
93
+     */
94
+    public boolean needMerge() default false;
95
+
96
+    /**
97
+     * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
98
+     */
99
+    public boolean isExport() default true;
100
+
101
+    /**
102
+     * 另一个类中的属性名称,支持多级获取,以小数点隔开
103
+     */
104
+    public String targetAttr() default "";
105
+
106
+    /**
107
+     * 是否自动统计数据,在最后追加一行统计数据总和
108
+     */
109
+    public boolean isStatistics() default false;
110
+
111
+    /**
112
+     * 导出类型(0数字 1字符串 2图片)
113
+     */
114
+    public ColumnType cellType() default ColumnType.STRING;
115
+
116
+    /**
117
+     * 导出列头背景色
118
+     */
119
+    public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT;
120
+
121
+    /**
122
+     * 导出列头字体颜色
123
+     */
124
+    public IndexedColors headerColor() default IndexedColors.WHITE;
125
+
126
+    /**
127
+     * 导出单元格背景色
128
+     */
129
+    public IndexedColors backgroundColor() default IndexedColors.WHITE;
130
+
131
+    /**
132
+     * 导出单元格字体颜色
133
+     */
134
+    public IndexedColors color() default IndexedColors.BLACK;
135
+
136
+    /**
137
+     * 导出字段对齐方式
138
+     */
139
+    public HorizontalAlignment align() default HorizontalAlignment.CENTER;
140
+
141
+    /**
142
+     * 自定义数据处理器
143
+     */
144
+    public Class<?> handler() default ExcelHandlerAdapter.class;
145
+
146
+    /**
147
+     * 自定义数据处理器参数
148
+     */
149
+    public String[] args() default {};
150
+
151
+    /**
152
+     * 字段类型(0:导出导入;1:仅导出;2:仅导入)
153
+     */
154
+    Type type() default Type.ALL;
155
+
156
+    public enum Type
157
+    {
158
+        ALL(0), EXPORT(1), IMPORT(2);
159
+        private final int value;
160
+
161
+        Type(int value)
162
+        {
163
+            this.value = value;
164
+        }
165
+
166
+        public int value()
167
+        {
168
+            return this.value;
169
+        }
170
+    }
171
+
172
+    public enum ColumnType
173
+    {
174
+        NUMERIC(0), STRING(1), IMAGE(2);
175
+        private final int value;
176
+
177
+        ColumnType(int value)
178
+        {
179
+            this.value = value;
180
+        }
181
+
182
+        public int value()
183
+        {
184
+            return this.value;
185
+        }
186
+    }
187
+}

+ 18
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Excels.java Parādīt failu

@@ -0,0 +1,18 @@
1
+package com.ruoyi.common.annotation;
2
+
3
+import java.lang.annotation.ElementType;
4
+import java.lang.annotation.Retention;
5
+import java.lang.annotation.RetentionPolicy;
6
+import java.lang.annotation.Target;
7
+
8
+/**
9
+ * Excel注解集
10
+ * 
11
+ * @author ruoyi
12
+ */
13
+@Target(ElementType.FIELD)
14
+@Retention(RetentionPolicy.RUNTIME)
15
+public @interface Excels
16
+{
17
+    public Excel[] value();
18
+}

+ 51
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/Log.java Parādīt failu

@@ -0,0 +1,51 @@
1
+package com.ruoyi.common.annotation;
2
+
3
+import java.lang.annotation.Documented;
4
+import java.lang.annotation.ElementType;
5
+import java.lang.annotation.Retention;
6
+import java.lang.annotation.RetentionPolicy;
7
+import java.lang.annotation.Target;
8
+import com.ruoyi.common.enums.BusinessType;
9
+import com.ruoyi.common.enums.OperatorType;
10
+
11
+/**
12
+ * 自定义操作日志记录注解
13
+ * 
14
+ * @author ruoyi
15
+ *
16
+ */
17
+@Target({ ElementType.PARAMETER, ElementType.METHOD })
18
+@Retention(RetentionPolicy.RUNTIME)
19
+@Documented
20
+public @interface Log
21
+{
22
+    /**
23
+     * 模块
24
+     */
25
+    public String title() default "";
26
+
27
+    /**
28
+     * 功能
29
+     */
30
+    public BusinessType businessType() default BusinessType.OTHER;
31
+
32
+    /**
33
+     * 操作人类别
34
+     */
35
+    public OperatorType operatorType() default OperatorType.MANAGE;
36
+
37
+    /**
38
+     * 是否保存请求的参数
39
+     */
40
+    public boolean isSaveRequestData() default true;
41
+
42
+    /**
43
+     * 是否保存响应的参数
44
+     */
45
+    public boolean isSaveResponseData() default true;
46
+
47
+    /**
48
+     * 排除指定的请求参数
49
+     */
50
+    public String[] excludeParamNames() default {};
51
+}

+ 40
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RateLimiter.java Parādīt failu

@@ -0,0 +1,40 @@
1
+package com.ruoyi.common.annotation;
2
+
3
+import java.lang.annotation.Documented;
4
+import java.lang.annotation.ElementType;
5
+import java.lang.annotation.Retention;
6
+import java.lang.annotation.RetentionPolicy;
7
+import java.lang.annotation.Target;
8
+import com.ruoyi.common.constant.CacheConstants;
9
+import com.ruoyi.common.enums.LimitType;
10
+
11
+/**
12
+ * 限流注解
13
+ * 
14
+ * @author ruoyi
15
+ */
16
+@Target(ElementType.METHOD)
17
+@Retention(RetentionPolicy.RUNTIME)
18
+@Documented
19
+public @interface RateLimiter
20
+{
21
+    /**
22
+     * 限流key
23
+     */
24
+    public String key() default CacheConstants.RATE_LIMIT_KEY;
25
+
26
+    /**
27
+     * 限流时间,单位秒
28
+     */
29
+    public int time() default 60;
30
+
31
+    /**
32
+     * 限流次数
33
+     */
34
+    public int count() default 100;
35
+
36
+    /**
37
+     * 限流类型
38
+     */
39
+    public LimitType limitType() default LimitType.DEFAULT;
40
+}

+ 31
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/annotation/RepeatSubmit.java Parādīt failu

@@ -0,0 +1,31 @@
1
+package com.ruoyi.common.annotation;
2
+
3
+import java.lang.annotation.Documented;
4
+import java.lang.annotation.ElementType;
5
+import java.lang.annotation.Inherited;
6
+import java.lang.annotation.Retention;
7
+import java.lang.annotation.RetentionPolicy;
8
+import java.lang.annotation.Target;
9
+
10
+/**
11
+ * 自定义注解防止表单重复提交
12
+ * 
13
+ * @author ruoyi
14
+ *
15
+ */
16
+@Inherited
17
+@Target(ElementType.METHOD)
18
+@Retention(RetentionPolicy.RUNTIME)
19
+@Documented
20
+public @interface RepeatSubmit
21
+{
22
+    /**
23
+     * 间隔时间(ms),小于此时间视为重复提交
24
+     */
25
+    public int interval() default 5000;
26
+
27
+    /**
28
+     * 提示消息
29
+     */
30
+    public String message() default "不允许重复提交,请稍候再试";
31
+}

+ 135
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java Parādīt failu

@@ -0,0 +1,135 @@
1
+package com.ruoyi.common.config;
2
+
3
+import org.springframework.boot.context.properties.ConfigurationProperties;
4
+import org.springframework.stereotype.Component;
5
+
6
+/**
7
+ * 读取项目相关配置
8
+ * 
9
+ * @author ruoyi
10
+ */
11
+@Component
12
+@ConfigurationProperties(prefix = "ruoyi")
13
+public class RuoYiConfig
14
+{
15
+    /** 项目名称 */
16
+    private String name;
17
+
18
+    /** 版本 */
19
+    private String version;
20
+
21
+    /** 版权年份 */
22
+    private String copyrightYear;
23
+
24
+    /** 实例演示开关 */
25
+    private boolean demoEnabled;
26
+
27
+    /** 上传路径 */
28
+    private static String profile;
29
+
30
+    /** 获取地址开关 */
31
+    private static boolean addressEnabled;
32
+
33
+    /** 验证码类型 */
34
+    private static String captchaType;
35
+
36
+    public String getName()
37
+    {
38
+        return name;
39
+    }
40
+
41
+    public void setName(String name)
42
+    {
43
+        this.name = name;
44
+    }
45
+
46
+    public String getVersion()
47
+    {
48
+        return version;
49
+    }
50
+
51
+    public void setVersion(String version)
52
+    {
53
+        this.version = version;
54
+    }
55
+
56
+    public String getCopyrightYear()
57
+    {
58
+        return copyrightYear;
59
+    }
60
+
61
+    public void setCopyrightYear(String copyrightYear)
62
+    {
63
+        this.copyrightYear = copyrightYear;
64
+    }
65
+
66
+    public boolean isDemoEnabled()
67
+    {
68
+        return demoEnabled;
69
+    }
70
+
71
+    public void setDemoEnabled(boolean demoEnabled)
72
+    {
73
+        this.demoEnabled = demoEnabled;
74
+    }
75
+
76
+    public static String getProfile()
77
+    {
78
+        return profile;
79
+    }
80
+
81
+    public void setProfile(String profile)
82
+    {
83
+        RuoYiConfig.profile = profile;
84
+    }
85
+
86
+    public static boolean isAddressEnabled()
87
+    {
88
+        return addressEnabled;
89
+    }
90
+
91
+    public void setAddressEnabled(boolean addressEnabled)
92
+    {
93
+        RuoYiConfig.addressEnabled = addressEnabled;
94
+    }
95
+
96
+    public static String getCaptchaType() {
97
+        return captchaType;
98
+    }
99
+
100
+    public void setCaptchaType(String captchaType) {
101
+        RuoYiConfig.captchaType = captchaType;
102
+    }
103
+
104
+    /**
105
+     * 获取导入上传路径
106
+     */
107
+    public static String getImportPath()
108
+    {
109
+        return getProfile() + "/import";
110
+    }
111
+
112
+    /**
113
+     * 获取头像上传路径
114
+     */
115
+    public static String getAvatarPath()
116
+    {
117
+        return getProfile() + "/avatar";
118
+    }
119
+
120
+    /**
121
+     * 获取下载路径
122
+     */
123
+    public static String getDownloadPath()
124
+    {
125
+        return getProfile() + "/download/";
126
+    }
127
+
128
+    /**
129
+     * 获取上传路径
130
+     */
131
+    public static String getUploadPath()
132
+    {
133
+        return getProfile() + "/upload";
134
+    }
135
+}

+ 44
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/constant/CacheConstants.java Parādīt failu

@@ -0,0 +1,44 @@
1
+package com.ruoyi.common.constant;
2
+
3
+/**
4
+ * 缓存的key 常量
5
+ * 
6
+ * @author ruoyi
7
+ */
8
+public class CacheConstants
9
+{
10
+    /**
11
+     * 登录用户 redis key
12
+     */
13
+    public static final String LOGIN_TOKEN_KEY = "login_tokens:";
14
+
15
+    /**
16
+     * 验证码 redis key
17
+     */
18
+    public static final String CAPTCHA_CODE_KEY = "captcha_codes:";
19
+
20
+    /**
21
+     * 参数管理 cache key
22
+     */
23
+    public static final String SYS_CONFIG_KEY = "sys_config:";
24
+
25
+    /**
26
+     * 字典管理 cache key
27
+     */
28
+    public static final String SYS_DICT_KEY = "sys_dict:";
29
+
30
+    /**
31
+     * 防重提交 redis key
32
+     */
33
+    public static final String REPEAT_SUBMIT_KEY = "repeat_submit:";
34
+
35
+    /**
36
+     * 限流 redis key
37
+     */
38
+    public static final String RATE_LIMIT_KEY = "rate_limit:";
39
+
40
+    /**
41
+     * 登录账户密码错误次数 redis key
42
+     */
43
+    public static final String PWD_ERR_CNT_KEY = "pwd_err_cnt:";
44
+}

+ 142
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/constant/Constants.java Parādīt failu

@@ -0,0 +1,142 @@
1
+package com.ruoyi.common.constant;
2
+
3
+import io.jsonwebtoken.Claims;
4
+
5
+/**
6
+ * 通用常量信息
7
+ * 
8
+ * @author ruoyi
9
+ */
10
+public class Constants
11
+{
12
+    /**
13
+     * UTF-8 字符集
14
+     */
15
+    public static final String UTF8 = "UTF-8";
16
+
17
+    /**
18
+     * GBK 字符集
19
+     */
20
+    public static final String GBK = "GBK";
21
+
22
+    /**
23
+     * www主域
24
+     */
25
+    public static final String WWW = "www.";
26
+
27
+    /**
28
+     * http请求
29
+     */
30
+    public static final String HTTP = "http://";
31
+
32
+    /**
33
+     * https请求
34
+     */
35
+    public static final String HTTPS = "https://";
36
+
37
+    /**
38
+     * 通用成功标识
39
+     */
40
+    public static final String SUCCESS = "0";
41
+
42
+    /**
43
+     * 通用失败标识
44
+     */
45
+    public static final String FAIL = "1";
46
+
47
+    /**
48
+     * 登录成功
49
+     */
50
+    public static final String LOGIN_SUCCESS = "Success";
51
+
52
+    /**
53
+     * 注销
54
+     */
55
+    public static final String LOGOUT = "Logout";
56
+
57
+    /**
58
+     * 注册
59
+     */
60
+    public static final String REGISTER = "Register";
61
+
62
+    /**
63
+     * 登录失败
64
+     */
65
+    public static final String LOGIN_FAIL = "Error";
66
+ 
67
+    /**
68
+     * 验证码有效期(分钟)
69
+     */
70
+    public static final Integer CAPTCHA_EXPIRATION = 2;
71
+
72
+    /**
73
+     * 令牌
74
+     */
75
+    public static final String TOKEN = "token";
76
+
77
+    /**
78
+     * 令牌前缀
79
+     */
80
+    public static final String TOKEN_PREFIX = "Bearer ";
81
+
82
+    /**
83
+     * 令牌前缀
84
+     */
85
+    public static final String LOGIN_USER_KEY = "login_user_key";
86
+
87
+    /**
88
+     * 用户ID
89
+     */
90
+    public static final String JWT_USERID = "userid";
91
+
92
+    /**
93
+     * 用户名称
94
+     */
95
+    public static final String JWT_USERNAME = Claims.SUBJECT;
96
+
97
+    /**
98
+     * 用户头像
99
+     */
100
+    public static final String JWT_AVATAR = "avatar";
101
+
102
+    /**
103
+     * 创建时间
104
+     */
105
+    public static final String JWT_CREATED = "created";
106
+
107
+    /**
108
+     * 用户权限
109
+     */
110
+    public static final String JWT_AUTHORITIES = "authorities";
111
+
112
+    /**
113
+     * 资源映射路径 前缀
114
+     */
115
+    public static final String RESOURCE_PREFIX = "/profile";
116
+
117
+    /**
118
+     * RMI 远程方法调用
119
+     */
120
+    public static final String LOOKUP_RMI = "rmi:";
121
+
122
+    /**
123
+     * LDAP 远程方法调用
124
+     */
125
+    public static final String LOOKUP_LDAP = "ldap:";
126
+
127
+    /**
128
+     * LDAPS 远程方法调用
129
+     */
130
+    public static final String LOOKUP_LDAPS = "ldaps:";
131
+
132
+    /**
133
+     * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加)
134
+     */
135
+    public static final String[] JOB_WHITELIST_STR = { "com.ruoyi" };
136
+
137
+    /**
138
+     * 定时任务违规的字符
139
+     */
140
+    public static final String[] JOB_ERROR_STR = { "java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml",
141
+            "org.springframework", "org.apache", "com.ruoyi.common.utils.file", "com.ruoyi.common.config" };
142
+}

+ 117
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/constant/GenConstants.java Parādīt failu

@@ -0,0 +1,117 @@
1
+package com.ruoyi.common.constant;
2
+
3
+/**
4
+ * 代码生成通用常量
5
+ * 
6
+ * @author ruoyi
7
+ */
8
+public class GenConstants
9
+{
10
+    /** 单表(增删改查) */
11
+    public static final String TPL_CRUD = "crud";
12
+
13
+    /** 树表(增删改查) */
14
+    public static final String TPL_TREE = "tree";
15
+
16
+    /** 主子表(增删改查) */
17
+    public static final String TPL_SUB = "sub";
18
+
19
+    /** 树编码字段 */
20
+    public static final String TREE_CODE = "treeCode";
21
+
22
+    /** 树父编码字段 */
23
+    public static final String TREE_PARENT_CODE = "treeParentCode";
24
+
25
+    /** 树名称字段 */
26
+    public static final String TREE_NAME = "treeName";
27
+
28
+    /** 上级菜单ID字段 */
29
+    public static final String PARENT_MENU_ID = "parentMenuId";
30
+
31
+    /** 上级菜单名称字段 */
32
+    public static final String PARENT_MENU_NAME = "parentMenuName";
33
+
34
+    /** 数据库字符串类型 */
35
+    public static final String[] COLUMNTYPE_STR = { "char", "varchar", "nvarchar", "varchar2" };
36
+
37
+    /** 数据库文本类型 */
38
+    public static final String[] COLUMNTYPE_TEXT = { "tinytext", "text", "mediumtext", "longtext" };
39
+
40
+    /** 数据库时间类型 */
41
+    public static final String[] COLUMNTYPE_TIME = { "datetime", "time", "date", "timestamp" };
42
+
43
+    /** 数据库数字类型 */
44
+    public static final String[] COLUMNTYPE_NUMBER = { "tinyint", "smallint", "mediumint", "int", "number", "integer",
45
+            "bit", "bigint", "float", "double", "decimal" };
46
+
47
+    /** 页面不需要编辑字段 */
48
+    public static final String[] COLUMNNAME_NOT_EDIT = { "id", "create_by", "create_time", "del_flag" };
49
+
50
+    /** 页面不需要显示的列表字段 */
51
+    public static final String[] COLUMNNAME_NOT_LIST = { "id", "create_by", "create_time", "del_flag", "update_by",
52
+            "update_time" };
53
+
54
+    /** 页面不需要查询字段 */
55
+    public static final String[] COLUMNNAME_NOT_QUERY = { "id", "create_by", "create_time", "del_flag", "update_by",
56
+            "update_time", "remark" };
57
+
58
+    /** Entity基类字段 */
59
+    public static final String[] BASE_ENTITY = { "createBy", "createTime", "updateBy", "updateTime", "remark" };
60
+
61
+    /** Tree基类字段 */
62
+    public static final String[] TREE_ENTITY = { "parentName", "parentId", "orderNum", "ancestors", "children" };
63
+
64
+    /** 文本框 */
65
+    public static final String HTML_INPUT = "input";
66
+
67
+    /** 文本域 */
68
+    public static final String HTML_TEXTAREA = "textarea";
69
+
70
+    /** 下拉框 */
71
+    public static final String HTML_SELECT = "select";
72
+
73
+    /** 单选框 */
74
+    public static final String HTML_RADIO = "radio";
75
+
76
+    /** 复选框 */
77
+    public static final String HTML_CHECKBOX = "checkbox";
78
+
79
+    /** 日期控件 */
80
+    public static final String HTML_DATETIME = "datetime";
81
+
82
+    /** 图片上传控件 */
83
+    public static final String HTML_IMAGE_UPLOAD = "imageUpload";
84
+
85
+    /** 文件上传控件 */
86
+    public static final String HTML_FILE_UPLOAD = "fileUpload";
87
+
88
+    /** 富文本控件 */
89
+    public static final String HTML_EDITOR = "editor";
90
+
91
+    /** 字符串类型 */
92
+    public static final String TYPE_STRING = "String";
93
+
94
+    /** 整型 */
95
+    public static final String TYPE_INTEGER = "Integer";
96
+
97
+    /** 长整型 */
98
+    public static final String TYPE_LONG = "Long";
99
+
100
+    /** 浮点型 */
101
+    public static final String TYPE_DOUBLE = "Double";
102
+
103
+    /** 高精度计算类型 */
104
+    public static final String TYPE_BIGDECIMAL = "BigDecimal";
105
+
106
+    /** 时间类型 */
107
+    public static final String TYPE_DATE = "Date";
108
+
109
+    /** 模糊查询 */
110
+    public static final String QUERY_LIKE = "LIKE";
111
+
112
+    /** 相等查询 */
113
+    public static final String QUERY_EQ = "EQ";
114
+
115
+    /** 需要 */
116
+    public static final String REQUIRE = "1";
117
+}

+ 94
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/constant/HttpStatus.java Parādīt failu

@@ -0,0 +1,94 @@
1
+package com.ruoyi.common.constant;
2
+
3
+/**
4
+ * 返回状态码
5
+ * 
6
+ * @author ruoyi
7
+ */
8
+public class HttpStatus
9
+{
10
+    /**
11
+     * 操作成功
12
+     */
13
+    public static final int SUCCESS = 200;
14
+
15
+    /**
16
+     * 对象创建成功
17
+     */
18
+    public static final int CREATED = 201;
19
+
20
+    /**
21
+     * 请求已经被接受
22
+     */
23
+    public static final int ACCEPTED = 202;
24
+
25
+    /**
26
+     * 操作已经执行成功,但是没有返回数据
27
+     */
28
+    public static final int NO_CONTENT = 204;
29
+
30
+    /**
31
+     * 资源已被移除
32
+     */
33
+    public static final int MOVED_PERM = 301;
34
+
35
+    /**
36
+     * 重定向
37
+     */
38
+    public static final int SEE_OTHER = 303;
39
+
40
+    /**
41
+     * 资源没有被修改
42
+     */
43
+    public static final int NOT_MODIFIED = 304;
44
+
45
+    /**
46
+     * 参数列表错误(缺少,格式不匹配)
47
+     */
48
+    public static final int BAD_REQUEST = 400;
49
+
50
+    /**
51
+     * 未授权
52
+     */
53
+    public static final int UNAUTHORIZED = 401;
54
+
55
+    /**
56
+     * 访问受限,授权过期
57
+     */
58
+    public static final int FORBIDDEN = 403;
59
+
60
+    /**
61
+     * 资源,服务未找到
62
+     */
63
+    public static final int NOT_FOUND = 404;
64
+
65
+    /**
66
+     * 不允许的http方法
67
+     */
68
+    public static final int BAD_METHOD = 405;
69
+
70
+    /**
71
+     * 资源冲突,或者资源被锁
72
+     */
73
+    public static final int CONFLICT = 409;
74
+
75
+    /**
76
+     * 不支持的数据,媒体类型
77
+     */
78
+    public static final int UNSUPPORTED_TYPE = 415;
79
+
80
+    /**
81
+     * 系统内部错误
82
+     */
83
+    public static final int ERROR = 500;
84
+
85
+    /**
86
+     * 接口未实现
87
+     */
88
+    public static final int NOT_IMPLEMENTED = 501;
89
+
90
+    /**
91
+     * 系统警告消息
92
+     */
93
+    public static final int WARN = 601;
94
+}

+ 50
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/constant/ScheduleConstants.java Parādīt failu

@@ -0,0 +1,50 @@
1
+package com.ruoyi.common.constant;
2
+
3
+/**
4
+ * 任务调度通用常量
5
+ * 
6
+ * @author ruoyi
7
+ */
8
+public class ScheduleConstants
9
+{
10
+    public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME";
11
+
12
+    /** 执行目标key */
13
+    public static final String TASK_PROPERTIES = "TASK_PROPERTIES";
14
+
15
+    /** 默认 */
16
+    public static final String MISFIRE_DEFAULT = "0";
17
+
18
+    /** 立即触发执行 */
19
+    public static final String MISFIRE_IGNORE_MISFIRES = "1";
20
+
21
+    /** 触发一次执行 */
22
+    public static final String MISFIRE_FIRE_AND_PROCEED = "2";
23
+
24
+    /** 不触发立即执行 */
25
+    public static final String MISFIRE_DO_NOTHING = "3";
26
+
27
+    public enum Status
28
+    {
29
+        /**
30
+         * 正常
31
+         */
32
+        NORMAL("0"),
33
+        /**
34
+         * 暂停
35
+         */
36
+        PAUSE("1");
37
+
38
+        private String value;
39
+
40
+        private Status(String value)
41
+        {
42
+            this.value = value;
43
+        }
44
+
45
+        public String getValue()
46
+        {
47
+            return value;
48
+        }
49
+    }
50
+}

+ 78
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/constant/UserConstants.java Parādīt failu

@@ -0,0 +1,78 @@
1
+package com.ruoyi.common.constant;
2
+
3
+/**
4
+ * 用户常量信息
5
+ * 
6
+ * @author ruoyi
7
+ */
8
+public class UserConstants
9
+{
10
+    /**
11
+     * 平台内系统用户的唯一标志
12
+     */
13
+    public static final String SYS_USER = "SYS_USER";
14
+
15
+    /** 正常状态 */
16
+    public static final String NORMAL = "0";
17
+
18
+    /** 异常状态 */
19
+    public static final String EXCEPTION = "1";
20
+
21
+    /** 用户封禁状态 */
22
+    public static final String USER_DISABLE = "1";
23
+
24
+    /** 角色封禁状态 */
25
+    public static final String ROLE_DISABLE = "1";
26
+
27
+    /** 部门正常状态 */
28
+    public static final String DEPT_NORMAL = "0";
29
+
30
+    /** 部门停用状态 */
31
+    public static final String DEPT_DISABLE = "1";
32
+
33
+    /** 字典正常状态 */
34
+    public static final String DICT_NORMAL = "0";
35
+
36
+    /** 是否为系统默认(是) */
37
+    public static final String YES = "Y";
38
+
39
+    /** 是否菜单外链(是) */
40
+    public static final String YES_FRAME = "0";
41
+
42
+    /** 是否菜单外链(否) */
43
+    public static final String NO_FRAME = "1";
44
+
45
+    /** 菜单类型(目录) */
46
+    public static final String TYPE_DIR = "M";
47
+
48
+    /** 菜单类型(菜单) */
49
+    public static final String TYPE_MENU = "C";
50
+
51
+    /** 菜单类型(按钮) */
52
+    public static final String TYPE_BUTTON = "F";
53
+
54
+    /** Layout组件标识 */
55
+    public final static String LAYOUT = "Layout";
56
+    
57
+    /** ParentView组件标识 */
58
+    public final static String PARENT_VIEW = "ParentView";
59
+
60
+    /** InnerLink组件标识 */
61
+    public final static String INNER_LINK = "InnerLink";
62
+
63
+    /** 校验是否唯一的返回标识 */
64
+    public final static boolean UNIQUE = true;
65
+    public final static boolean NOT_UNIQUE = false;
66
+
67
+    /**
68
+     * 用户名长度限制
69
+     */
70
+    public static final int USERNAME_MIN_LENGTH = 2;
71
+    public static final int USERNAME_MAX_LENGTH = 20;
72
+
73
+    /**
74
+     * 密码长度限制
75
+     */
76
+    public static final int PASSWORD_MIN_LENGTH = 5;
77
+    public static final int PASSWORD_MAX_LENGTH = 20;
78
+}

+ 202
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/controller/BaseController.java Parādīt failu

@@ -0,0 +1,202 @@
1
+package com.ruoyi.common.core.controller;
2
+
3
+import java.beans.PropertyEditorSupport;
4
+import java.util.Date;
5
+import java.util.List;
6
+import org.slf4j.Logger;
7
+import org.slf4j.LoggerFactory;
8
+import org.springframework.web.bind.WebDataBinder;
9
+import org.springframework.web.bind.annotation.InitBinder;
10
+import com.github.pagehelper.PageHelper;
11
+import com.github.pagehelper.PageInfo;
12
+import com.ruoyi.common.constant.HttpStatus;
13
+import com.ruoyi.common.core.domain.AjaxResult;
14
+import com.ruoyi.common.core.domain.model.LoginUser;
15
+import com.ruoyi.common.core.page.PageDomain;
16
+import com.ruoyi.common.core.page.TableDataInfo;
17
+import com.ruoyi.common.core.page.TableSupport;
18
+import com.ruoyi.common.utils.DateUtils;
19
+import com.ruoyi.common.utils.PageUtils;
20
+import com.ruoyi.common.utils.SecurityUtils;
21
+import com.ruoyi.common.utils.StringUtils;
22
+import com.ruoyi.common.utils.sql.SqlUtil;
23
+
24
+/**
25
+ * web层通用数据处理
26
+ * 
27
+ * @author ruoyi
28
+ */
29
+public class BaseController
30
+{
31
+    protected final Logger logger = LoggerFactory.getLogger(this.getClass());
32
+
33
+    /**
34
+     * 将前台传递过来的日期格式的字符串,自动转化为Date类型
35
+     */
36
+    @InitBinder
37
+    public void initBinder(WebDataBinder binder)
38
+    {
39
+        // Date 类型转换
40
+        binder.registerCustomEditor(Date.class, new PropertyEditorSupport()
41
+        {
42
+            @Override
43
+            public void setAsText(String text)
44
+            {
45
+                setValue(DateUtils.parseDate(text));
46
+            }
47
+        });
48
+    }
49
+
50
+    /**
51
+     * 设置请求分页数据
52
+     */
53
+    protected void startPage()
54
+    {
55
+        PageUtils.startPage();
56
+    }
57
+
58
+    /**
59
+     * 设置请求排序数据
60
+     */
61
+    protected void startOrderBy()
62
+    {
63
+        PageDomain pageDomain = TableSupport.buildPageRequest();
64
+        if (StringUtils.isNotEmpty(pageDomain.getOrderBy()))
65
+        {
66
+            String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy());
67
+            PageHelper.orderBy(orderBy);
68
+        }
69
+    }
70
+
71
+    /**
72
+     * 清理分页的线程变量
73
+     */
74
+    protected void clearPage()
75
+    {
76
+        PageUtils.clearPage();
77
+    }
78
+
79
+    /**
80
+     * 响应请求分页数据
81
+     */
82
+    @SuppressWarnings({ "rawtypes", "unchecked" })
83
+    protected TableDataInfo getDataTable(List<?> list)
84
+    {
85
+        TableDataInfo rspData = new TableDataInfo();
86
+        rspData.setCode(HttpStatus.SUCCESS);
87
+        rspData.setMsg("查询成功");
88
+        rspData.setRows(list);
89
+        rspData.setTotal(new PageInfo(list).getTotal());
90
+        return rspData;
91
+    }
92
+
93
+    /**
94
+     * 返回成功
95
+     */
96
+    public AjaxResult success()
97
+    {
98
+        return AjaxResult.success();
99
+    }
100
+
101
+    /**
102
+     * 返回失败消息
103
+     */
104
+    public AjaxResult error()
105
+    {
106
+        return AjaxResult.error();
107
+    }
108
+
109
+    /**
110
+     * 返回成功消息
111
+     */
112
+    public AjaxResult success(String message)
113
+    {
114
+        return AjaxResult.success(message);
115
+    }
116
+    
117
+    /**
118
+     * 返回成功消息
119
+     */
120
+    public AjaxResult success(Object data)
121
+    {
122
+        return AjaxResult.success(data);
123
+    }
124
+
125
+    /**
126
+     * 返回失败消息
127
+     */
128
+    public AjaxResult error(String message)
129
+    {
130
+        return AjaxResult.error(message);
131
+    }
132
+
133
+    /**
134
+     * 返回警告消息
135
+     */
136
+    public AjaxResult warn(String message)
137
+    {
138
+        return AjaxResult.warn(message);
139
+    }
140
+
141
+    /**
142
+     * 响应返回结果
143
+     * 
144
+     * @param rows 影响行数
145
+     * @return 操作结果
146
+     */
147
+    protected AjaxResult toAjax(int rows)
148
+    {
149
+        return rows > 0 ? AjaxResult.success() : AjaxResult.error();
150
+    }
151
+
152
+    /**
153
+     * 响应返回结果
154
+     * 
155
+     * @param result 结果
156
+     * @return 操作结果
157
+     */
158
+    protected AjaxResult toAjax(boolean result)
159
+    {
160
+        return result ? success() : error();
161
+    }
162
+
163
+    /**
164
+     * 页面跳转
165
+     */
166
+    public String redirect(String url)
167
+    {
168
+        return StringUtils.format("redirect:{}", url);
169
+    }
170
+
171
+    /**
172
+     * 获取用户缓存信息
173
+     */
174
+    public LoginUser getLoginUser()
175
+    {
176
+        return SecurityUtils.getLoginUser();
177
+    }
178
+
179
+    /**
180
+     * 获取登录用户id
181
+     */
182
+    public Long getUserId()
183
+    {
184
+        return getLoginUser().getUserId();
185
+    }
186
+
187
+    /**
188
+     * 获取登录部门id
189
+     */
190
+    public Long getDeptId()
191
+    {
192
+        return getLoginUser().getDeptId();
193
+    }
194
+
195
+    /**
196
+     * 获取登录用户名
197
+     */
198
+    public String getUsername()
199
+    {
200
+        return getLoginUser().getUsername();
201
+    }
202
+}

+ 185
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/AjaxResult.java Parādīt failu

@@ -0,0 +1,185 @@
1
+package com.ruoyi.common.core.domain;
2
+
3
+import java.util.HashMap;
4
+import com.ruoyi.common.constant.HttpStatus;
5
+import com.ruoyi.common.utils.StringUtils;
6
+
7
+/**
8
+ * 操作消息提醒
9
+ * 
10
+ * @author ruoyi
11
+ */
12
+public class AjaxResult extends HashMap<String, Object>
13
+{
14
+    private static final long serialVersionUID = 1L;
15
+
16
+    /** 状态码 */
17
+    public static final String CODE_TAG = "code";
18
+
19
+    /** 返回内容 */
20
+    public static final String MSG_TAG = "msg";
21
+
22
+    /** 数据对象 */
23
+    public static final String DATA_TAG = "data";
24
+
25
+    /**
26
+     * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
27
+     */
28
+    public AjaxResult()
29
+    {
30
+    }
31
+
32
+    /**
33
+     * 初始化一个新创建的 AjaxResult 对象
34
+     * 
35
+     * @param code 状态码
36
+     * @param msg 返回内容
37
+     */
38
+    public AjaxResult(int code, String msg)
39
+    {
40
+        super.put(CODE_TAG, code);
41
+        super.put(MSG_TAG, msg);
42
+    }
43
+
44
+    /**
45
+     * 初始化一个新创建的 AjaxResult 对象
46
+     * 
47
+     * @param code 状态码
48
+     * @param msg 返回内容
49
+     * @param data 数据对象
50
+     */
51
+    public AjaxResult(int code, String msg, Object data)
52
+    {
53
+        super.put(CODE_TAG, code);
54
+        super.put(MSG_TAG, msg);
55
+        if (StringUtils.isNotNull(data))
56
+        {
57
+            super.put(DATA_TAG, data);
58
+        }
59
+    }
60
+
61
+    /**
62
+     * 返回成功消息
63
+     * 
64
+     * @return 成功消息
65
+     */
66
+    public static AjaxResult success()
67
+    {
68
+        return AjaxResult.success("操作成功");
69
+    }
70
+
71
+    /**
72
+     * 返回成功数据
73
+     * 
74
+     * @return 成功消息
75
+     */
76
+    public static AjaxResult success(Object data)
77
+    {
78
+        return AjaxResult.success("操作成功", data);
79
+    }
80
+
81
+    /**
82
+     * 返回成功消息
83
+     * 
84
+     * @param msg 返回内容
85
+     * @return 成功消息
86
+     */
87
+    public static AjaxResult success(String msg)
88
+    {
89
+        return AjaxResult.success(msg, null);
90
+    }
91
+
92
+    /**
93
+     * 返回成功消息
94
+     * 
95
+     * @param msg 返回内容
96
+     * @param data 数据对象
97
+     * @return 成功消息
98
+     */
99
+    public static AjaxResult success(String msg, Object data)
100
+    {
101
+        return new AjaxResult(HttpStatus.SUCCESS, msg, data);
102
+    }
103
+
104
+    /**
105
+     * 返回警告消息
106
+     *
107
+     * @param msg 返回内容
108
+     * @return 警告消息
109
+     */
110
+    public static AjaxResult warn(String msg)
111
+    {
112
+        return AjaxResult.warn(msg, null);
113
+    }
114
+
115
+    /**
116
+     * 返回警告消息
117
+     *
118
+     * @param msg 返回内容
119
+     * @param data 数据对象
120
+     * @return 警告消息
121
+     */
122
+    public static AjaxResult warn(String msg, Object data)
123
+    {
124
+        return new AjaxResult(HttpStatus.WARN, msg, data);
125
+    }
126
+
127
+    /**
128
+     * 返回错误消息
129
+     * 
130
+     * @return 错误消息
131
+     */
132
+    public static AjaxResult error()
133
+    {
134
+        return AjaxResult.error("操作失败");
135
+    }
136
+
137
+    /**
138
+     * 返回错误消息
139
+     * 
140
+     * @param msg 返回内容
141
+     * @return 错误消息
142
+     */
143
+    public static AjaxResult error(String msg)
144
+    {
145
+        return AjaxResult.error(msg, null);
146
+    }
147
+
148
+    /**
149
+     * 返回错误消息
150
+     * 
151
+     * @param msg 返回内容
152
+     * @param data 数据对象
153
+     * @return 错误消息
154
+     */
155
+    public static AjaxResult error(String msg, Object data)
156
+    {
157
+        return new AjaxResult(HttpStatus.ERROR, msg, data);
158
+    }
159
+
160
+    /**
161
+     * 返回错误消息
162
+     * 
163
+     * @param code 状态码
164
+     * @param msg 返回内容
165
+     * @return 错误消息
166
+     */
167
+    public static AjaxResult error(int code, String msg)
168
+    {
169
+        return new AjaxResult(code, msg, null);
170
+    }
171
+
172
+    /**
173
+     * 方便链式调用
174
+     *
175
+     * @param key 键
176
+     * @param value 值
177
+     * @return 数据对象
178
+     */
179
+    @Override
180
+    public AjaxResult put(String key, Object value)
181
+    {
182
+        super.put(key, value);
183
+        return this;
184
+    }
185
+}

+ 118
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/BaseEntity.java Parādīt failu

@@ -0,0 +1,118 @@
1
+package com.ruoyi.common.core.domain;
2
+
3
+import java.io.Serializable;
4
+import java.util.Date;
5
+import java.util.HashMap;
6
+import java.util.Map;
7
+import com.fasterxml.jackson.annotation.JsonFormat;
8
+import com.fasterxml.jackson.annotation.JsonIgnore;
9
+import com.fasterxml.jackson.annotation.JsonInclude;
10
+
11
+/**
12
+ * Entity基类
13
+ * 
14
+ * @author ruoyi
15
+ */
16
+public class BaseEntity implements Serializable
17
+{
18
+    private static final long serialVersionUID = 1L;
19
+
20
+    /** 搜索值 */
21
+    @JsonIgnore
22
+    private String searchValue;
23
+
24
+    /** 创建者 */
25
+    private String createBy;
26
+
27
+    /** 创建时间 */
28
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
29
+    private Date createTime;
30
+
31
+    /** 更新者 */
32
+    private String updateBy;
33
+
34
+    /** 更新时间 */
35
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
36
+    private Date updateTime;
37
+
38
+    /** 备注 */
39
+    private String remark;
40
+
41
+    /** 请求参数 */
42
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
43
+    private Map<String, Object> params;
44
+
45
+    public String getSearchValue()
46
+    {
47
+        return searchValue;
48
+    }
49
+
50
+    public void setSearchValue(String searchValue)
51
+    {
52
+        this.searchValue = searchValue;
53
+    }
54
+
55
+    public String getCreateBy()
56
+    {
57
+        return createBy;
58
+    }
59
+
60
+    public void setCreateBy(String createBy)
61
+    {
62
+        this.createBy = createBy;
63
+    }
64
+
65
+    public Date getCreateTime()
66
+    {
67
+        return createTime;
68
+    }
69
+
70
+    public void setCreateTime(Date createTime)
71
+    {
72
+        this.createTime = createTime;
73
+    }
74
+
75
+    public String getUpdateBy()
76
+    {
77
+        return updateBy;
78
+    }
79
+
80
+    public void setUpdateBy(String updateBy)
81
+    {
82
+        this.updateBy = updateBy;
83
+    }
84
+
85
+    public Date getUpdateTime()
86
+    {
87
+        return updateTime;
88
+    }
89
+
90
+    public void setUpdateTime(Date updateTime)
91
+    {
92
+        this.updateTime = updateTime;
93
+    }
94
+
95
+    public String getRemark()
96
+    {
97
+        return remark;
98
+    }
99
+
100
+    public void setRemark(String remark)
101
+    {
102
+        this.remark = remark;
103
+    }
104
+
105
+    public Map<String, Object> getParams()
106
+    {
107
+        if (params == null)
108
+        {
109
+            params = new HashMap<>();
110
+        }
111
+        return params;
112
+    }
113
+
114
+    public void setParams(Map<String, Object> params)
115
+    {
116
+        this.params = params;
117
+    }
118
+}

+ 115
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/R.java Parādīt failu

@@ -0,0 +1,115 @@
1
+package com.ruoyi.common.core.domain;
2
+
3
+import java.io.Serializable;
4
+import com.ruoyi.common.constant.HttpStatus;
5
+
6
+/**
7
+ * 响应信息主体
8
+ *
9
+ * @author ruoyi
10
+ */
11
+public class R<T> implements Serializable
12
+{
13
+    private static final long serialVersionUID = 1L;
14
+
15
+    /** 成功 */
16
+    public static final int SUCCESS = HttpStatus.SUCCESS;
17
+
18
+    /** 失败 */
19
+    public static final int FAIL = HttpStatus.ERROR;
20
+
21
+    private int code;
22
+
23
+    private String msg;
24
+
25
+    private T data;
26
+
27
+    public static <T> R<T> ok()
28
+    {
29
+        return restResult(null, SUCCESS, "操作成功");
30
+    }
31
+
32
+    public static <T> R<T> ok(T data)
33
+    {
34
+        return restResult(data, SUCCESS, "操作成功");
35
+    }
36
+
37
+    public static <T> R<T> ok(T data, String msg)
38
+    {
39
+        return restResult(data, SUCCESS, msg);
40
+    }
41
+
42
+    public static <T> R<T> fail()
43
+    {
44
+        return restResult(null, FAIL, "操作失败");
45
+    }
46
+
47
+    public static <T> R<T> fail(String msg)
48
+    {
49
+        return restResult(null, FAIL, msg);
50
+    }
51
+
52
+    public static <T> R<T> fail(T data)
53
+    {
54
+        return restResult(data, FAIL, "操作失败");
55
+    }
56
+
57
+    public static <T> R<T> fail(T data, String msg)
58
+    {
59
+        return restResult(data, FAIL, msg);
60
+    }
61
+
62
+    public static <T> R<T> fail(int code, String msg)
63
+    {
64
+        return restResult(null, code, msg);
65
+    }
66
+
67
+    private static <T> R<T> restResult(T data, int code, String msg)
68
+    {
69
+        R<T> apiResult = new R<>();
70
+        apiResult.setCode(code);
71
+        apiResult.setData(data);
72
+        apiResult.setMsg(msg);
73
+        return apiResult;
74
+    }
75
+
76
+    public int getCode()
77
+    {
78
+        return code;
79
+    }
80
+
81
+    public void setCode(int code)
82
+    {
83
+        this.code = code;
84
+    }
85
+
86
+    public String getMsg()
87
+    {
88
+        return msg;
89
+    }
90
+
91
+    public void setMsg(String msg)
92
+    {
93
+        this.msg = msg;
94
+    }
95
+
96
+    public T getData()
97
+    {
98
+        return data;
99
+    }
100
+
101
+    public void setData(T data)
102
+    {
103
+        this.data = data;
104
+    }
105
+
106
+    public static <T> Boolean isError(R<T> ret)
107
+    {
108
+        return !isSuccess(ret);
109
+    }
110
+
111
+    public static <T> Boolean isSuccess(R<T> ret)
112
+    {
113
+        return R.SUCCESS == ret.getCode();
114
+    }
115
+}

+ 79
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeEntity.java Parādīt failu

@@ -0,0 +1,79 @@
1
+package com.ruoyi.common.core.domain;
2
+
3
+import java.util.ArrayList;
4
+import java.util.List;
5
+
6
+/**
7
+ * Tree基类
8
+ * 
9
+ * @author ruoyi
10
+ */
11
+public class TreeEntity extends BaseEntity
12
+{
13
+    private static final long serialVersionUID = 1L;
14
+
15
+    /** 父菜单名称 */
16
+    private String parentName;
17
+
18
+    /** 父菜单ID */
19
+    private Long parentId;
20
+
21
+    /** 显示顺序 */
22
+    private Integer orderNum;
23
+
24
+    /** 祖级列表 */
25
+    private String ancestors;
26
+
27
+    /** 子部门 */
28
+    private List<?> children = new ArrayList<>();
29
+
30
+    public String getParentName()
31
+    {
32
+        return parentName;
33
+    }
34
+
35
+    public void setParentName(String parentName)
36
+    {
37
+        this.parentName = parentName;
38
+    }
39
+
40
+    public Long getParentId()
41
+    {
42
+        return parentId;
43
+    }
44
+
45
+    public void setParentId(Long parentId)
46
+    {
47
+        this.parentId = parentId;
48
+    }
49
+
50
+    public Integer getOrderNum()
51
+    {
52
+        return orderNum;
53
+    }
54
+
55
+    public void setOrderNum(Integer orderNum)
56
+    {
57
+        this.orderNum = orderNum;
58
+    }
59
+
60
+    public String getAncestors()
61
+    {
62
+        return ancestors;
63
+    }
64
+
65
+    public void setAncestors(String ancestors)
66
+    {
67
+        this.ancestors = ancestors;
68
+    }
69
+
70
+    public List<?> getChildren()
71
+    {
72
+        return children;
73
+    }
74
+
75
+    public void setChildren(List<?> children)
76
+    {
77
+        this.children = children;
78
+    }
79
+}

+ 77
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/TreeSelect.java Parādīt failu

@@ -0,0 +1,77 @@
1
+package com.ruoyi.common.core.domain;
2
+
3
+import java.io.Serializable;
4
+import java.util.List;
5
+import java.util.stream.Collectors;
6
+import com.fasterxml.jackson.annotation.JsonInclude;
7
+import com.ruoyi.common.core.domain.entity.SysDept;
8
+import com.ruoyi.common.core.domain.entity.SysMenu;
9
+
10
+/**
11
+ * Treeselect树结构实体类
12
+ * 
13
+ * @author ruoyi
14
+ */
15
+public class TreeSelect implements Serializable
16
+{
17
+    private static final long serialVersionUID = 1L;
18
+
19
+    /** 节点ID */
20
+    private Long id;
21
+
22
+    /** 节点名称 */
23
+    private String label;
24
+
25
+    /** 子节点 */
26
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
27
+    private List<TreeSelect> children;
28
+
29
+    public TreeSelect()
30
+    {
31
+
32
+    }
33
+
34
+    public TreeSelect(SysDept dept)
35
+    {
36
+        this.id = dept.getDeptId();
37
+        this.label = dept.getDeptName();
38
+        this.children = dept.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
39
+    }
40
+
41
+    public TreeSelect(SysMenu menu)
42
+    {
43
+        this.id = menu.getMenuId();
44
+        this.label = menu.getMenuName();
45
+        this.children = menu.getChildren().stream().map(TreeSelect::new).collect(Collectors.toList());
46
+    }
47
+
48
+    public Long getId()
49
+    {
50
+        return id;
51
+    }
52
+
53
+    public void setId(Long id)
54
+    {
55
+        this.id = id;
56
+    }
57
+
58
+    public String getLabel()
59
+    {
60
+        return label;
61
+    }
62
+
63
+    public void setLabel(String label)
64
+    {
65
+        this.label = label;
66
+    }
67
+
68
+    public List<TreeSelect> getChildren()
69
+    {
70
+        return children;
71
+    }
72
+
73
+    public void setChildren(List<TreeSelect> children)
74
+    {
75
+        this.children = children;
76
+    }
77
+}

+ 203
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDept.java Parādīt failu

@@ -0,0 +1,203 @@
1
+package com.ruoyi.common.core.domain.entity;
2
+
3
+import java.util.ArrayList;
4
+import java.util.List;
5
+import javax.validation.constraints.Email;
6
+import javax.validation.constraints.NotBlank;
7
+import javax.validation.constraints.NotNull;
8
+import javax.validation.constraints.Size;
9
+import org.apache.commons.lang3.builder.ToStringBuilder;
10
+import org.apache.commons.lang3.builder.ToStringStyle;
11
+import com.ruoyi.common.core.domain.BaseEntity;
12
+
13
+/**
14
+ * 部门表 sys_dept
15
+ * 
16
+ * @author ruoyi
17
+ */
18
+public class SysDept extends BaseEntity
19
+{
20
+    private static final long serialVersionUID = 1L;
21
+
22
+    /** 部门ID */
23
+    private Long deptId;
24
+
25
+    /** 父部门ID */
26
+    private Long parentId;
27
+
28
+    /** 祖级列表 */
29
+    private String ancestors;
30
+
31
+    /** 部门名称 */
32
+    private String deptName;
33
+
34
+    /** 显示顺序 */
35
+    private Integer orderNum;
36
+
37
+    /** 负责人 */
38
+    private String leader;
39
+
40
+    /** 联系电话 */
41
+    private String phone;
42
+
43
+    /** 邮箱 */
44
+    private String email;
45
+
46
+    /** 部门状态:0正常,1停用 */
47
+    private String status;
48
+
49
+    /** 删除标志(0代表存在 2代表删除) */
50
+    private String delFlag;
51
+
52
+    /** 父部门名称 */
53
+    private String parentName;
54
+    
55
+    /** 子部门 */
56
+    private List<SysDept> children = new ArrayList<SysDept>();
57
+
58
+    public Long getDeptId()
59
+    {
60
+        return deptId;
61
+    }
62
+
63
+    public void setDeptId(Long deptId)
64
+    {
65
+        this.deptId = deptId;
66
+    }
67
+
68
+    public Long getParentId()
69
+    {
70
+        return parentId;
71
+    }
72
+
73
+    public void setParentId(Long parentId)
74
+    {
75
+        this.parentId = parentId;
76
+    }
77
+
78
+    public String getAncestors()
79
+    {
80
+        return ancestors;
81
+    }
82
+
83
+    public void setAncestors(String ancestors)
84
+    {
85
+        this.ancestors = ancestors;
86
+    }
87
+
88
+    @NotBlank(message = "部门名称不能为空")
89
+    @Size(min = 0, max = 30, message = "部门名称长度不能超过30个字符")
90
+    public String getDeptName()
91
+    {
92
+        return deptName;
93
+    }
94
+
95
+    public void setDeptName(String deptName)
96
+    {
97
+        this.deptName = deptName;
98
+    }
99
+
100
+    @NotNull(message = "显示顺序不能为空")
101
+    public Integer getOrderNum()
102
+    {
103
+        return orderNum;
104
+    }
105
+
106
+    public void setOrderNum(Integer orderNum)
107
+    {
108
+        this.orderNum = orderNum;
109
+    }
110
+
111
+    public String getLeader()
112
+    {
113
+        return leader;
114
+    }
115
+
116
+    public void setLeader(String leader)
117
+    {
118
+        this.leader = leader;
119
+    }
120
+
121
+    @Size(min = 0, max = 11, message = "联系电话长度不能超过11个字符")
122
+    public String getPhone()
123
+    {
124
+        return phone;
125
+    }
126
+
127
+    public void setPhone(String phone)
128
+    {
129
+        this.phone = phone;
130
+    }
131
+
132
+    @Email(message = "邮箱格式不正确")
133
+    @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
134
+    public String getEmail()
135
+    {
136
+        return email;
137
+    }
138
+
139
+    public void setEmail(String email)
140
+    {
141
+        this.email = email;
142
+    }
143
+
144
+    public String getStatus()
145
+    {
146
+        return status;
147
+    }
148
+
149
+    public void setStatus(String status)
150
+    {
151
+        this.status = status;
152
+    }
153
+
154
+    public String getDelFlag()
155
+    {
156
+        return delFlag;
157
+    }
158
+
159
+    public void setDelFlag(String delFlag)
160
+    {
161
+        this.delFlag = delFlag;
162
+    }
163
+
164
+    public String getParentName()
165
+    {
166
+        return parentName;
167
+    }
168
+
169
+    public void setParentName(String parentName)
170
+    {
171
+        this.parentName = parentName;
172
+    }
173
+
174
+    public List<SysDept> getChildren()
175
+    {
176
+        return children;
177
+    }
178
+
179
+    public void setChildren(List<SysDept> children)
180
+    {
181
+        this.children = children;
182
+    }
183
+
184
+    @Override
185
+    public String toString() {
186
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
187
+            .append("deptId", getDeptId())
188
+            .append("parentId", getParentId())
189
+            .append("ancestors", getAncestors())
190
+            .append("deptName", getDeptName())
191
+            .append("orderNum", getOrderNum())
192
+            .append("leader", getLeader())
193
+            .append("phone", getPhone())
194
+            .append("email", getEmail())
195
+            .append("status", getStatus())
196
+            .append("delFlag", getDelFlag())
197
+            .append("createBy", getCreateBy())
198
+            .append("createTime", getCreateTime())
199
+            .append("updateBy", getUpdateBy())
200
+            .append("updateTime", getUpdateTime())
201
+            .toString();
202
+    }
203
+}

+ 176
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictData.java Parādīt failu

@@ -0,0 +1,176 @@
1
+package com.ruoyi.common.core.domain.entity;
2
+
3
+import javax.validation.constraints.NotBlank;
4
+import javax.validation.constraints.Size;
5
+import org.apache.commons.lang3.builder.ToStringBuilder;
6
+import org.apache.commons.lang3.builder.ToStringStyle;
7
+import com.ruoyi.common.annotation.Excel;
8
+import com.ruoyi.common.annotation.Excel.ColumnType;
9
+import com.ruoyi.common.constant.UserConstants;
10
+import com.ruoyi.common.core.domain.BaseEntity;
11
+
12
+/**
13
+ * 字典数据表 sys_dict_data
14
+ * 
15
+ * @author ruoyi
16
+ */
17
+public class SysDictData extends BaseEntity
18
+{
19
+    private static final long serialVersionUID = 1L;
20
+
21
+    /** 字典编码 */
22
+    @Excel(name = "字典编码", cellType = ColumnType.NUMERIC)
23
+    private Long dictCode;
24
+
25
+    /** 字典排序 */
26
+    @Excel(name = "字典排序", cellType = ColumnType.NUMERIC)
27
+    private Long dictSort;
28
+
29
+    /** 字典标签 */
30
+    @Excel(name = "字典标签")
31
+    private String dictLabel;
32
+
33
+    /** 字典键值 */
34
+    @Excel(name = "字典键值")
35
+    private String dictValue;
36
+
37
+    /** 字典类型 */
38
+    @Excel(name = "字典类型")
39
+    private String dictType;
40
+
41
+    /** 样式属性(其他样式扩展) */
42
+    private String cssClass;
43
+
44
+    /** 表格字典样式 */
45
+    private String listClass;
46
+
47
+    /** 是否默认(Y是 N否) */
48
+    @Excel(name = "是否默认", readConverterExp = "Y=是,N=否")
49
+    private String isDefault;
50
+
51
+    /** 状态(0正常 1停用) */
52
+    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
53
+    private String status;
54
+
55
+    public Long getDictCode()
56
+    {
57
+        return dictCode;
58
+    }
59
+
60
+    public void setDictCode(Long dictCode)
61
+    {
62
+        this.dictCode = dictCode;
63
+    }
64
+
65
+    public Long getDictSort()
66
+    {
67
+        return dictSort;
68
+    }
69
+
70
+    public void setDictSort(Long dictSort)
71
+    {
72
+        this.dictSort = dictSort;
73
+    }
74
+
75
+    @NotBlank(message = "字典标签不能为空")
76
+    @Size(min = 0, max = 100, message = "字典标签长度不能超过100个字符")
77
+    public String getDictLabel()
78
+    {
79
+        return dictLabel;
80
+    }
81
+
82
+    public void setDictLabel(String dictLabel)
83
+    {
84
+        this.dictLabel = dictLabel;
85
+    }
86
+
87
+    @NotBlank(message = "字典键值不能为空")
88
+    @Size(min = 0, max = 100, message = "字典键值长度不能超过100个字符")
89
+    public String getDictValue()
90
+    {
91
+        return dictValue;
92
+    }
93
+
94
+    public void setDictValue(String dictValue)
95
+    {
96
+        this.dictValue = dictValue;
97
+    }
98
+
99
+    @NotBlank(message = "字典类型不能为空")
100
+    @Size(min = 0, max = 100, message = "字典类型长度不能超过100个字符")
101
+    public String getDictType()
102
+    {
103
+        return dictType;
104
+    }
105
+
106
+    public void setDictType(String dictType)
107
+    {
108
+        this.dictType = dictType;
109
+    }
110
+
111
+    @Size(min = 0, max = 100, message = "样式属性长度不能超过100个字符")
112
+    public String getCssClass()
113
+    {
114
+        return cssClass;
115
+    }
116
+
117
+    public void setCssClass(String cssClass)
118
+    {
119
+        this.cssClass = cssClass;
120
+    }
121
+
122
+    public String getListClass()
123
+    {
124
+        return listClass;
125
+    }
126
+
127
+    public void setListClass(String listClass)
128
+    {
129
+        this.listClass = listClass;
130
+    }
131
+
132
+    public boolean getDefault()
133
+    {
134
+        return UserConstants.YES.equals(this.isDefault);
135
+    }
136
+
137
+    public String getIsDefault()
138
+    {
139
+        return isDefault;
140
+    }
141
+
142
+    public void setIsDefault(String isDefault)
143
+    {
144
+        this.isDefault = isDefault;
145
+    }
146
+
147
+    public String getStatus()
148
+    {
149
+        return status;
150
+    }
151
+
152
+    public void setStatus(String status)
153
+    {
154
+        this.status = status;
155
+    }
156
+    
157
+    @Override
158
+    public String toString() {
159
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
160
+            .append("dictCode", getDictCode())
161
+            .append("dictSort", getDictSort())
162
+            .append("dictLabel", getDictLabel())
163
+            .append("dictValue", getDictValue())
164
+            .append("dictType", getDictType())
165
+            .append("cssClass", getCssClass())
166
+            .append("listClass", getListClass())
167
+            .append("isDefault", getIsDefault())
168
+            .append("status", getStatus())
169
+            .append("createBy", getCreateBy())
170
+            .append("createTime", getCreateTime())
171
+            .append("updateBy", getUpdateBy())
172
+            .append("updateTime", getUpdateTime())
173
+            .append("remark", getRemark())
174
+            .toString();
175
+    }
176
+}

+ 96
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysDictType.java Parādīt failu

@@ -0,0 +1,96 @@
1
+package com.ruoyi.common.core.domain.entity;
2
+
3
+import javax.validation.constraints.NotBlank;
4
+import javax.validation.constraints.Pattern;
5
+import javax.validation.constraints.Size;
6
+import org.apache.commons.lang3.builder.ToStringBuilder;
7
+import org.apache.commons.lang3.builder.ToStringStyle;
8
+import com.ruoyi.common.annotation.Excel;
9
+import com.ruoyi.common.annotation.Excel.ColumnType;
10
+import com.ruoyi.common.core.domain.BaseEntity;
11
+
12
+/**
13
+ * 字典类型表 sys_dict_type
14
+ * 
15
+ * @author ruoyi
16
+ */
17
+public class SysDictType extends BaseEntity
18
+{
19
+    private static final long serialVersionUID = 1L;
20
+
21
+    /** 字典主键 */
22
+    @Excel(name = "字典主键", cellType = ColumnType.NUMERIC)
23
+    private Long dictId;
24
+
25
+    /** 字典名称 */
26
+    @Excel(name = "字典名称")
27
+    private String dictName;
28
+
29
+    /** 字典类型 */
30
+    @Excel(name = "字典类型")
31
+    private String dictType;
32
+
33
+    /** 状态(0正常 1停用) */
34
+    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
35
+    private String status;
36
+
37
+    public Long getDictId()
38
+    {
39
+        return dictId;
40
+    }
41
+
42
+    public void setDictId(Long dictId)
43
+    {
44
+        this.dictId = dictId;
45
+    }
46
+
47
+    @NotBlank(message = "字典名称不能为空")
48
+    @Size(min = 0, max = 100, message = "字典类型名称长度不能超过100个字符")
49
+    public String getDictName()
50
+    {
51
+        return dictName;
52
+    }
53
+
54
+    public void setDictName(String dictName)
55
+    {
56
+        this.dictName = dictName;
57
+    }
58
+
59
+    @NotBlank(message = "字典类型不能为空")
60
+    @Size(min = 0, max = 100, message = "字典类型类型长度不能超过100个字符")
61
+    @Pattern(regexp = "^[a-z][a-z0-9_]*$", message = "字典类型必须以字母开头,且只能为(小写字母,数字,下滑线)")
62
+    public String getDictType()
63
+    {
64
+        return dictType;
65
+    }
66
+
67
+    public void setDictType(String dictType)
68
+    {
69
+        this.dictType = dictType;
70
+    }
71
+
72
+    public String getStatus()
73
+    {
74
+        return status;
75
+    }
76
+
77
+    public void setStatus(String status)
78
+    {
79
+        this.status = status;
80
+    }
81
+    
82
+    @Override
83
+    public String toString() {
84
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
85
+            .append("dictId", getDictId())
86
+            .append("dictName", getDictName())
87
+            .append("dictType", getDictType())
88
+            .append("status", getStatus())
89
+            .append("createBy", getCreateBy())
90
+            .append("createTime", getCreateTime())
91
+            .append("updateBy", getUpdateBy())
92
+            .append("updateTime", getUpdateTime())
93
+            .append("remark", getRemark())
94
+            .toString();
95
+    }
96
+}

+ 259
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysMenu.java Parādīt failu

@@ -0,0 +1,259 @@
1
+package com.ruoyi.common.core.domain.entity;
2
+
3
+import java.util.ArrayList;
4
+import java.util.List;
5
+import javax.validation.constraints.NotBlank;
6
+import javax.validation.constraints.NotNull;
7
+import javax.validation.constraints.Size;
8
+import org.apache.commons.lang3.builder.ToStringBuilder;
9
+import org.apache.commons.lang3.builder.ToStringStyle;
10
+import com.ruoyi.common.core.domain.BaseEntity;
11
+
12
+/**
13
+ * 菜单权限表 sys_menu
14
+ * 
15
+ * @author ruoyi
16
+ */
17
+public class SysMenu extends BaseEntity
18
+{
19
+    private static final long serialVersionUID = 1L;
20
+
21
+    /** 菜单ID */
22
+    private Long menuId;
23
+
24
+    /** 菜单名称 */
25
+    private String menuName;
26
+
27
+    /** 父菜单名称 */
28
+    private String parentName;
29
+
30
+    /** 父菜单ID */
31
+    private Long parentId;
32
+
33
+    /** 显示顺序 */
34
+    private Integer orderNum;
35
+
36
+    /** 路由地址 */
37
+    private String path;
38
+
39
+    /** 组件路径 */
40
+    private String component;
41
+
42
+    /** 路由参数 */
43
+    private String query;
44
+
45
+    /** 是否为外链(0是 1否) */
46
+    private String isFrame;
47
+
48
+    /** 是否缓存(0缓存 1不缓存) */
49
+    private String isCache;
50
+
51
+    /** 类型(M目录 C菜单 F按钮) */
52
+    private String menuType;
53
+
54
+    /** 显示状态(0显示 1隐藏) */
55
+    private String visible;
56
+    
57
+    /** 菜单状态(0正常 1停用) */
58
+    private String status;
59
+
60
+    /** 权限字符串 */
61
+    private String perms;
62
+
63
+    /** 菜单图标 */
64
+    private String icon;
65
+
66
+    /** 子菜单 */
67
+    private List<SysMenu> children = new ArrayList<SysMenu>();
68
+
69
+    public Long getMenuId()
70
+    {
71
+        return menuId;
72
+    }
73
+
74
+    public void setMenuId(Long menuId)
75
+    {
76
+        this.menuId = menuId;
77
+    }
78
+
79
+    @NotBlank(message = "菜单名称不能为空")
80
+    @Size(min = 0, max = 50, message = "菜单名称长度不能超过50个字符")
81
+    public String getMenuName()
82
+    {
83
+        return menuName;
84
+    }
85
+
86
+    public void setMenuName(String menuName)
87
+    {
88
+        this.menuName = menuName;
89
+    }
90
+
91
+    public String getParentName()
92
+    {
93
+        return parentName;
94
+    }
95
+
96
+    public void setParentName(String parentName)
97
+    {
98
+        this.parentName = parentName;
99
+    }
100
+
101
+    public Long getParentId()
102
+    {
103
+        return parentId;
104
+    }
105
+
106
+    public void setParentId(Long parentId)
107
+    {
108
+        this.parentId = parentId;
109
+    }
110
+
111
+    @NotNull(message = "显示顺序不能为空")
112
+    public Integer getOrderNum()
113
+    {
114
+        return orderNum;
115
+    }
116
+
117
+    public void setOrderNum(Integer orderNum)
118
+    {
119
+        this.orderNum = orderNum;
120
+    }
121
+
122
+    @Size(min = 0, max = 200, message = "路由地址不能超过200个字符")
123
+    public String getPath()
124
+    {
125
+        return path;
126
+    }
127
+
128
+    public void setPath(String path)
129
+    {
130
+        this.path = path;
131
+    }
132
+
133
+    @Size(min = 0, max = 200, message = "组件路径不能超过255个字符")
134
+    public String getComponent()
135
+    {
136
+        return component;
137
+    }
138
+
139
+    public void setComponent(String component)
140
+    {
141
+        this.component = component;
142
+    }
143
+
144
+    public String getQuery()
145
+    {
146
+        return query;
147
+    }
148
+
149
+    public void setQuery(String query)
150
+    {
151
+        this.query = query;
152
+    }
153
+
154
+    public String getIsFrame()
155
+    {
156
+        return isFrame;
157
+    }
158
+
159
+    public void setIsFrame(String isFrame)
160
+    {
161
+        this.isFrame = isFrame;
162
+    }
163
+
164
+    public String getIsCache()
165
+    {
166
+        return isCache;
167
+    }
168
+
169
+    public void setIsCache(String isCache)
170
+    {
171
+        this.isCache = isCache;
172
+    }
173
+
174
+    @NotBlank(message = "菜单类型不能为空")
175
+    public String getMenuType()
176
+    {
177
+        return menuType;
178
+    }
179
+
180
+    public void setMenuType(String menuType)
181
+    {
182
+        this.menuType = menuType;
183
+    }
184
+
185
+    public String getVisible()
186
+    {
187
+        return visible;
188
+    }
189
+
190
+    public void setVisible(String visible)
191
+    {
192
+        this.visible = visible;
193
+    }
194
+
195
+    public String getStatus()
196
+    {
197
+        return status;
198
+    }
199
+
200
+    public void setStatus(String status)
201
+    {
202
+        this.status = status;
203
+    }
204
+
205
+    @Size(min = 0, max = 100, message = "权限标识长度不能超过100个字符")
206
+    public String getPerms()
207
+    {
208
+        return perms;
209
+    }
210
+
211
+    public void setPerms(String perms)
212
+    {
213
+        this.perms = perms;
214
+    }
215
+
216
+    public String getIcon()
217
+    {
218
+        return icon;
219
+    }
220
+
221
+    public void setIcon(String icon)
222
+    {
223
+        this.icon = icon;
224
+    }
225
+
226
+    public List<SysMenu> getChildren()
227
+    {
228
+        return children;
229
+    }
230
+
231
+    public void setChildren(List<SysMenu> children)
232
+    {
233
+        this.children = children;
234
+    }
235
+    
236
+    @Override
237
+    public String toString() {
238
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
239
+            .append("menuId", getMenuId())
240
+            .append("menuName", getMenuName())
241
+            .append("parentId", getParentId())
242
+            .append("orderNum", getOrderNum())
243
+            .append("path", getPath())
244
+            .append("component", getComponent())
245
+            .append("isFrame", getIsFrame())
246
+            .append("IsCache", getIsCache())
247
+            .append("menuType", getMenuType())
248
+            .append("visible", getVisible())
249
+            .append("status ", getStatus())
250
+            .append("perms", getPerms())
251
+            .append("icon", getIcon())
252
+            .append("createBy", getCreateBy())
253
+            .append("createTime", getCreateTime())
254
+            .append("updateBy", getUpdateBy())
255
+            .append("updateTime", getUpdateTime())
256
+            .append("remark", getRemark())
257
+            .toString();
258
+    }
259
+}

+ 241
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysRole.java Parādīt failu

@@ -0,0 +1,241 @@
1
+package com.ruoyi.common.core.domain.entity;
2
+
3
+import java.util.Set;
4
+import javax.validation.constraints.NotBlank;
5
+import javax.validation.constraints.NotNull;
6
+import javax.validation.constraints.Size;
7
+import org.apache.commons.lang3.builder.ToStringBuilder;
8
+import org.apache.commons.lang3.builder.ToStringStyle;
9
+import com.ruoyi.common.annotation.Excel;
10
+import com.ruoyi.common.annotation.Excel.ColumnType;
11
+import com.ruoyi.common.core.domain.BaseEntity;
12
+
13
+/**
14
+ * 角色表 sys_role
15
+ * 
16
+ * @author ruoyi
17
+ */
18
+public class SysRole extends BaseEntity
19
+{
20
+    private static final long serialVersionUID = 1L;
21
+
22
+    /** 角色ID */
23
+    @Excel(name = "角色序号", cellType = ColumnType.NUMERIC)
24
+    private Long roleId;
25
+
26
+    /** 角色名称 */
27
+    @Excel(name = "角色名称")
28
+    private String roleName;
29
+
30
+    /** 角色权限 */
31
+    @Excel(name = "角色权限")
32
+    private String roleKey;
33
+
34
+    /** 角色排序 */
35
+    @Excel(name = "角色排序")
36
+    private Integer roleSort;
37
+
38
+    /** 数据范围(1:所有数据权限;2:自定义数据权限;3:本部门数据权限;4:本部门及以下数据权限;5:仅本人数据权限) */
39
+    @Excel(name = "数据范围", readConverterExp = "1=所有数据权限,2=自定义数据权限,3=本部门数据权限,4=本部门及以下数据权限,5=仅本人数据权限")
40
+    private String dataScope;
41
+
42
+    /** 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示) */
43
+    private boolean menuCheckStrictly;
44
+
45
+    /** 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 ) */
46
+    private boolean deptCheckStrictly;
47
+
48
+    /** 角色状态(0正常 1停用) */
49
+    @Excel(name = "角色状态", readConverterExp = "0=正常,1=停用")
50
+    private String status;
51
+
52
+    /** 删除标志(0代表存在 2代表删除) */
53
+    private String delFlag;
54
+
55
+    /** 用户是否存在此角色标识 默认不存在 */
56
+    private boolean flag = false;
57
+
58
+    /** 菜单组 */
59
+    private Long[] menuIds;
60
+
61
+    /** 部门组(数据权限) */
62
+    private Long[] deptIds;
63
+
64
+    /** 角色菜单权限 */
65
+    private Set<String> permissions;
66
+
67
+    public SysRole()
68
+    {
69
+
70
+    }
71
+
72
+    public SysRole(Long roleId)
73
+    {
74
+        this.roleId = roleId;
75
+    }
76
+
77
+    public Long getRoleId()
78
+    {
79
+        return roleId;
80
+    }
81
+
82
+    public void setRoleId(Long roleId)
83
+    {
84
+        this.roleId = roleId;
85
+    }
86
+
87
+    public boolean isAdmin()
88
+    {
89
+        return isAdmin(this.roleId);
90
+    }
91
+
92
+    public static boolean isAdmin(Long roleId)
93
+    {
94
+        return roleId != null && 1L == roleId;
95
+    }
96
+
97
+    @NotBlank(message = "角色名称不能为空")
98
+    @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符")
99
+    public String getRoleName()
100
+    {
101
+        return roleName;
102
+    }
103
+
104
+    public void setRoleName(String roleName)
105
+    {
106
+        this.roleName = roleName;
107
+    }
108
+
109
+    @NotBlank(message = "权限字符不能为空")
110
+    @Size(min = 0, max = 100, message = "权限字符长度不能超过100个字符")
111
+    public String getRoleKey()
112
+    {
113
+        return roleKey;
114
+    }
115
+
116
+    public void setRoleKey(String roleKey)
117
+    {
118
+        this.roleKey = roleKey;
119
+    }
120
+
121
+    @NotNull(message = "显示顺序不能为空")
122
+    public Integer getRoleSort()
123
+    {
124
+        return roleSort;
125
+    }
126
+
127
+    public void setRoleSort(Integer roleSort)
128
+    {
129
+        this.roleSort = roleSort;
130
+    }
131
+
132
+    public String getDataScope()
133
+    {
134
+        return dataScope;
135
+    }
136
+
137
+    public void setDataScope(String dataScope)
138
+    {
139
+        this.dataScope = dataScope;
140
+    }
141
+
142
+    public boolean isMenuCheckStrictly()
143
+    {
144
+        return menuCheckStrictly;
145
+    }
146
+
147
+    public void setMenuCheckStrictly(boolean menuCheckStrictly)
148
+    {
149
+        this.menuCheckStrictly = menuCheckStrictly;
150
+    }
151
+
152
+    public boolean isDeptCheckStrictly()
153
+    {
154
+        return deptCheckStrictly;
155
+    }
156
+
157
+    public void setDeptCheckStrictly(boolean deptCheckStrictly)
158
+    {
159
+        this.deptCheckStrictly = deptCheckStrictly;
160
+    }
161
+
162
+    public String getStatus()
163
+    {
164
+        return status;
165
+    }
166
+
167
+    public void setStatus(String status)
168
+    {
169
+        this.status = status;
170
+    }
171
+
172
+    public String getDelFlag()
173
+    {
174
+        return delFlag;
175
+    }
176
+
177
+    public void setDelFlag(String delFlag)
178
+    {
179
+        this.delFlag = delFlag;
180
+    }
181
+
182
+    public boolean isFlag()
183
+    {
184
+        return flag;
185
+    }
186
+
187
+    public void setFlag(boolean flag)
188
+    {
189
+        this.flag = flag;
190
+    }
191
+
192
+    public Long[] getMenuIds()
193
+    {
194
+        return menuIds;
195
+    }
196
+
197
+    public void setMenuIds(Long[] menuIds)
198
+    {
199
+        this.menuIds = menuIds;
200
+    }
201
+
202
+    public Long[] getDeptIds()
203
+    {
204
+        return deptIds;
205
+    }
206
+
207
+    public void setDeptIds(Long[] deptIds)
208
+    {
209
+        this.deptIds = deptIds;
210
+    }
211
+
212
+    public Set<String> getPermissions()
213
+    {
214
+        return permissions;
215
+    }
216
+
217
+    public void setPermissions(Set<String> permissions)
218
+    {
219
+        this.permissions = permissions;
220
+    }
221
+
222
+    @Override
223
+    public String toString() {
224
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
225
+            .append("roleId", getRoleId())
226
+            .append("roleName", getRoleName())
227
+            .append("roleKey", getRoleKey())
228
+            .append("roleSort", getRoleSort())
229
+            .append("dataScope", getDataScope())
230
+            .append("menuCheckStrictly", isMenuCheckStrictly())
231
+            .append("deptCheckStrictly", isDeptCheckStrictly())
232
+            .append("status", getStatus())
233
+            .append("delFlag", getDelFlag())
234
+            .append("createBy", getCreateBy())
235
+            .append("createTime", getCreateTime())
236
+            .append("updateBy", getUpdateBy())
237
+            .append("updateTime", getUpdateTime())
238
+            .append("remark", getRemark())
239
+            .toString();
240
+    }
241
+}

+ 324
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/SysUser.java Parādīt failu

@@ -0,0 +1,324 @@
1
+package com.ruoyi.common.core.domain.entity;
2
+
3
+import java.util.Date;
4
+import java.util.List;
5
+import javax.validation.constraints.*;
6
+import org.apache.commons.lang3.builder.ToStringBuilder;
7
+import org.apache.commons.lang3.builder.ToStringStyle;
8
+import com.ruoyi.common.annotation.Excel;
9
+import com.ruoyi.common.annotation.Excel.ColumnType;
10
+import com.ruoyi.common.annotation.Excel.Type;
11
+import com.ruoyi.common.annotation.Excels;
12
+import com.ruoyi.common.core.domain.BaseEntity;
13
+import com.ruoyi.common.xss.Xss;
14
+
15
+/**
16
+ * 用户对象 sys_user
17
+ * 
18
+ * @author ruoyi
19
+ */
20
+public class SysUser extends BaseEntity
21
+{
22
+    private static final long serialVersionUID = 1L;
23
+
24
+    /** 用户ID */
25
+    @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号")
26
+    private Long userId;
27
+
28
+    /** 部门ID */
29
+    @Excel(name = "部门编号", type = Type.IMPORT)
30
+    private Long deptId;
31
+
32
+    /** 用户账号 */
33
+    @Excel(name = "登录名称")
34
+    private String userName;
35
+
36
+    /** 用户昵称 */
37
+    @Excel(name = "用户名称")
38
+    private String nickName;
39
+
40
+    /** 用户邮箱 */
41
+    @Excel(name = "用户邮箱")
42
+    private String email;
43
+
44
+    /** 手机号码 */
45
+    @Excel(name = "手机号码")
46
+    private String phonenumber;
47
+
48
+    /** 用户性别 */
49
+    @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")
50
+    private String sex;
51
+
52
+    /** 用户头像 */
53
+    private String avatar;
54
+
55
+    /** 密码 */
56
+    private String password;
57
+
58
+    /** 帐号状态(0正常 1停用) */
59
+    @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")
60
+    private String status;
61
+
62
+    /** 删除标志(0代表存在 2代表删除) */
63
+    private String delFlag;
64
+
65
+    /** 最后登录IP */
66
+    @Excel(name = "最后登录IP", type = Type.EXPORT)
67
+    private String loginIp;
68
+
69
+    /** 最后登录时间 */
70
+    @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)
71
+    private Date loginDate;
72
+
73
+    /** 部门对象 */
74
+    @Excels({
75
+        @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),
76
+        @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
77
+    })
78
+    private SysDept dept;
79
+
80
+    /** 角色对象 */
81
+    private List<SysRole> roles;
82
+
83
+    /** 角色组 */
84
+    private Long[] roleIds;
85
+
86
+    /** 岗位组 */
87
+    private Long[] postIds;
88
+
89
+    /** 角色ID */
90
+    private Long roleId;
91
+
92
+    public SysUser()
93
+    {
94
+
95
+    }
96
+
97
+    public SysUser(Long userId)
98
+    {
99
+        this.userId = userId;
100
+    }
101
+
102
+    public Long getUserId()
103
+    {
104
+        return userId;
105
+    }
106
+
107
+    public void setUserId(Long userId)
108
+    {
109
+        this.userId = userId;
110
+    }
111
+
112
+    public boolean isAdmin()
113
+    {
114
+        return isAdmin(this.userId);
115
+    }
116
+
117
+    public static boolean isAdmin(Long userId)
118
+    {
119
+        return userId != null && 1L == userId;
120
+    }
121
+
122
+    public Long getDeptId()
123
+    {
124
+        return deptId;
125
+    }
126
+
127
+    public void setDeptId(Long deptId)
128
+    {
129
+        this.deptId = deptId;
130
+    }
131
+
132
+    @Xss(message = "用户昵称不能包含脚本字符")
133
+    @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")
134
+    public String getNickName()
135
+    {
136
+        return nickName;
137
+    }
138
+
139
+    public void setNickName(String nickName)
140
+    {
141
+        this.nickName = nickName;
142
+    }
143
+
144
+    @Xss(message = "用户账号不能包含脚本字符")
145
+    @NotBlank(message = "用户账号不能为空")
146
+    @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")
147
+    public String getUserName()
148
+    {
149
+        return userName;
150
+    }
151
+
152
+    public void setUserName(String userName)
153
+    {
154
+        this.userName = userName;
155
+    }
156
+
157
+    @Email(message = "邮箱格式不正确")
158
+    @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")
159
+    public String getEmail()
160
+    {
161
+        return email;
162
+    }
163
+
164
+    public void setEmail(String email)
165
+    {
166
+        this.email = email;
167
+    }
168
+
169
+    @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")
170
+    public String getPhonenumber()
171
+    {
172
+        return phonenumber;
173
+    }
174
+
175
+    public void setPhonenumber(String phonenumber)
176
+    {
177
+        this.phonenumber = phonenumber;
178
+    }
179
+
180
+    public String getSex()
181
+    {
182
+        return sex;
183
+    }
184
+
185
+    public void setSex(String sex)
186
+    {
187
+        this.sex = sex;
188
+    }
189
+
190
+    public String getAvatar()
191
+    {
192
+        return avatar;
193
+    }
194
+
195
+    public void setAvatar(String avatar)
196
+    {
197
+        this.avatar = avatar;
198
+    }
199
+
200
+    public String getPassword()
201
+    {
202
+        return password;
203
+    }
204
+
205
+    public void setPassword(String password)
206
+    {
207
+        this.password = password;
208
+    }
209
+
210
+    public String getStatus()
211
+    {
212
+        return status;
213
+    }
214
+
215
+    public void setStatus(String status)
216
+    {
217
+        this.status = status;
218
+    }
219
+
220
+    public String getDelFlag()
221
+    {
222
+        return delFlag;
223
+    }
224
+
225
+    public void setDelFlag(String delFlag)
226
+    {
227
+        this.delFlag = delFlag;
228
+    }
229
+
230
+    public String getLoginIp()
231
+    {
232
+        return loginIp;
233
+    }
234
+
235
+    public void setLoginIp(String loginIp)
236
+    {
237
+        this.loginIp = loginIp;
238
+    }
239
+
240
+    public Date getLoginDate()
241
+    {
242
+        return loginDate;
243
+    }
244
+
245
+    public void setLoginDate(Date loginDate)
246
+    {
247
+        this.loginDate = loginDate;
248
+    }
249
+
250
+    public SysDept getDept()
251
+    {
252
+        return dept;
253
+    }
254
+
255
+    public void setDept(SysDept dept)
256
+    {
257
+        this.dept = dept;
258
+    }
259
+
260
+    public List<SysRole> getRoles()
261
+    {
262
+        return roles;
263
+    }
264
+
265
+    public void setRoles(List<SysRole> roles)
266
+    {
267
+        this.roles = roles;
268
+    }
269
+
270
+    public Long[] getRoleIds()
271
+    {
272
+        return roleIds;
273
+    }
274
+
275
+    public void setRoleIds(Long[] roleIds)
276
+    {
277
+        this.roleIds = roleIds;
278
+    }
279
+
280
+    public Long[] getPostIds()
281
+    {
282
+        return postIds;
283
+    }
284
+
285
+    public void setPostIds(Long[] postIds)
286
+    {
287
+        this.postIds = postIds;
288
+    }
289
+
290
+    public Long getRoleId()
291
+    {
292
+        return roleId;
293
+    }
294
+
295
+    public void setRoleId(Long roleId)
296
+    {
297
+        this.roleId = roleId;
298
+    }
299
+
300
+    @Override
301
+    public String toString() {
302
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
303
+            .append("userId", getUserId())
304
+            .append("deptId", getDeptId())
305
+            .append("userName", getUserName())
306
+            .append("nickName", getNickName())
307
+            .append("email", getEmail())
308
+            .append("phonenumber", getPhonenumber())
309
+            .append("sex", getSex())
310
+            .append("avatar", getAvatar())
311
+            .append("password", getPassword())
312
+            .append("status", getStatus())
313
+            .append("delFlag", getDelFlag())
314
+            .append("loginIp", getLoginIp())
315
+            .append("loginDate", getLoginDate())
316
+            .append("createBy", getCreateBy())
317
+            .append("createTime", getCreateTime())
318
+            .append("updateBy", getUpdateBy())
319
+            .append("updateTime", getUpdateTime())
320
+            .append("remark", getRemark())
321
+            .append("dept", getDept())
322
+            .toString();
323
+    }
324
+}

+ 69
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginBody.java Parādīt failu

@@ -0,0 +1,69 @@
1
+package com.ruoyi.common.core.domain.model;
2
+
3
+/**
4
+ * 用户登录对象
5
+ * 
6
+ * @author ruoyi
7
+ */
8
+public class LoginBody
9
+{
10
+    /**
11
+     * 用户名
12
+     */
13
+    private String username;
14
+
15
+    /**
16
+     * 用户密码
17
+     */
18
+    private String password;
19
+
20
+    /**
21
+     * 验证码
22
+     */
23
+    private String code;
24
+
25
+    /**
26
+     * 唯一标识
27
+     */
28
+    private String uuid;
29
+
30
+    public String getUsername()
31
+    {
32
+        return username;
33
+    }
34
+
35
+    public void setUsername(String username)
36
+    {
37
+        this.username = username;
38
+    }
39
+
40
+    public String getPassword()
41
+    {
42
+        return password;
43
+    }
44
+
45
+    public void setPassword(String password)
46
+    {
47
+        this.password = password;
48
+    }
49
+
50
+    public String getCode()
51
+    {
52
+        return code;
53
+    }
54
+
55
+    public void setCode(String code)
56
+    {
57
+        this.code = code;
58
+    }
59
+
60
+    public String getUuid()
61
+    {
62
+        return uuid;
63
+    }
64
+
65
+    public void setUuid(String uuid)
66
+    {
67
+        this.uuid = uuid;
68
+    }
69
+}

+ 266
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUser.java Parādīt failu

@@ -0,0 +1,266 @@
1
+package com.ruoyi.common.core.domain.model;
2
+
3
+import java.util.Collection;
4
+import java.util.Set;
5
+import org.springframework.security.core.GrantedAuthority;
6
+import org.springframework.security.core.userdetails.UserDetails;
7
+import com.alibaba.fastjson2.annotation.JSONField;
8
+import com.ruoyi.common.core.domain.entity.SysUser;
9
+
10
+/**
11
+ * 登录用户身份权限
12
+ * 
13
+ * @author ruoyi
14
+ */
15
+public class LoginUser implements UserDetails
16
+{
17
+    private static final long serialVersionUID = 1L;
18
+
19
+    /**
20
+     * 用户ID
21
+     */
22
+    private Long userId;
23
+
24
+    /**
25
+     * 部门ID
26
+     */
27
+    private Long deptId;
28
+
29
+    /**
30
+     * 用户唯一标识
31
+     */
32
+    private String token;
33
+
34
+    /**
35
+     * 登录时间
36
+     */
37
+    private Long loginTime;
38
+
39
+    /**
40
+     * 过期时间
41
+     */
42
+    private Long expireTime;
43
+
44
+    /**
45
+     * 登录IP地址
46
+     */
47
+    private String ipaddr;
48
+
49
+    /**
50
+     * 登录地点
51
+     */
52
+    private String loginLocation;
53
+
54
+    /**
55
+     * 浏览器类型
56
+     */
57
+    private String browser;
58
+
59
+    /**
60
+     * 操作系统
61
+     */
62
+    private String os;
63
+
64
+    /**
65
+     * 权限列表
66
+     */
67
+    private Set<String> permissions;
68
+
69
+    /**
70
+     * 用户信息
71
+     */
72
+    private SysUser user;
73
+
74
+    public Long getUserId()
75
+    {
76
+        return userId;
77
+    }
78
+
79
+    public void setUserId(Long userId)
80
+    {
81
+        this.userId = userId;
82
+    }
83
+
84
+    public Long getDeptId()
85
+    {
86
+        return deptId;
87
+    }
88
+
89
+    public void setDeptId(Long deptId)
90
+    {
91
+        this.deptId = deptId;
92
+    }
93
+
94
+    public String getToken()
95
+    {
96
+        return token;
97
+    }
98
+
99
+    public void setToken(String token)
100
+    {
101
+        this.token = token;
102
+    }
103
+
104
+    public LoginUser()
105
+    {
106
+    }
107
+
108
+    public LoginUser(SysUser user, Set<String> permissions)
109
+    {
110
+        this.user = user;
111
+        this.permissions = permissions;
112
+    }
113
+
114
+    public LoginUser(Long userId, Long deptId, SysUser user, Set<String> permissions)
115
+    {
116
+        this.userId = userId;
117
+        this.deptId = deptId;
118
+        this.user = user;
119
+        this.permissions = permissions;
120
+    }
121
+
122
+    @JSONField(serialize = false)
123
+    @Override
124
+    public String getPassword()
125
+    {
126
+        return user.getPassword();
127
+    }
128
+
129
+    @Override
130
+    public String getUsername()
131
+    {
132
+        return user.getUserName();
133
+    }
134
+
135
+    /**
136
+     * 账户是否未过期,过期无法验证
137
+     */
138
+    @JSONField(serialize = false)
139
+    @Override
140
+    public boolean isAccountNonExpired()
141
+    {
142
+        return true;
143
+    }
144
+
145
+    /**
146
+     * 指定用户是否解锁,锁定的用户无法进行身份验证
147
+     * 
148
+     * @return
149
+     */
150
+    @JSONField(serialize = false)
151
+    @Override
152
+    public boolean isAccountNonLocked()
153
+    {
154
+        return true;
155
+    }
156
+
157
+    /**
158
+     * 指示是否已过期的用户的凭据(密码),过期的凭据防止认证
159
+     * 
160
+     * @return
161
+     */
162
+    @JSONField(serialize = false)
163
+    @Override
164
+    public boolean isCredentialsNonExpired()
165
+    {
166
+        return true;
167
+    }
168
+
169
+    /**
170
+     * 是否可用 ,禁用的用户不能身份验证
171
+     * 
172
+     * @return
173
+     */
174
+    @JSONField(serialize = false)
175
+    @Override
176
+    public boolean isEnabled()
177
+    {
178
+        return true;
179
+    }
180
+
181
+    public Long getLoginTime()
182
+    {
183
+        return loginTime;
184
+    }
185
+
186
+    public void setLoginTime(Long loginTime)
187
+    {
188
+        this.loginTime = loginTime;
189
+    }
190
+
191
+    public String getIpaddr()
192
+    {
193
+        return ipaddr;
194
+    }
195
+
196
+    public void setIpaddr(String ipaddr)
197
+    {
198
+        this.ipaddr = ipaddr;
199
+    }
200
+
201
+    public String getLoginLocation()
202
+    {
203
+        return loginLocation;
204
+    }
205
+
206
+    public void setLoginLocation(String loginLocation)
207
+    {
208
+        this.loginLocation = loginLocation;
209
+    }
210
+
211
+    public String getBrowser()
212
+    {
213
+        return browser;
214
+    }
215
+
216
+    public void setBrowser(String browser)
217
+    {
218
+        this.browser = browser;
219
+    }
220
+
221
+    public String getOs()
222
+    {
223
+        return os;
224
+    }
225
+
226
+    public void setOs(String os)
227
+    {
228
+        this.os = os;
229
+    }
230
+
231
+    public Long getExpireTime()
232
+    {
233
+        return expireTime;
234
+    }
235
+
236
+    public void setExpireTime(Long expireTime)
237
+    {
238
+        this.expireTime = expireTime;
239
+    }
240
+
241
+    public Set<String> getPermissions()
242
+    {
243
+        return permissions;
244
+    }
245
+
246
+    public void setPermissions(Set<String> permissions)
247
+    {
248
+        this.permissions = permissions;
249
+    }
250
+
251
+    public SysUser getUser()
252
+    {
253
+        return user;
254
+    }
255
+
256
+    public void setUser(SysUser user)
257
+    {
258
+        this.user = user;
259
+    }
260
+
261
+    @Override
262
+    public Collection<? extends GrantedAuthority> getAuthorities()
263
+    {
264
+        return null;
265
+    }
266
+}

+ 11
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/RegisterBody.java Parādīt failu

@@ -0,0 +1,11 @@
1
+package com.ruoyi.common.core.domain.model;
2
+
3
+/**
4
+ * 用户注册对象
5
+ * 
6
+ * @author ruoyi
7
+ */
8
+public class RegisterBody extends LoginBody
9
+{
10
+
11
+}

+ 101
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/page/PageDomain.java Parādīt failu

@@ -0,0 +1,101 @@
1
+package com.ruoyi.common.core.page;
2
+
3
+import com.ruoyi.common.utils.StringUtils;
4
+
5
+/**
6
+ * 分页数据
7
+ * 
8
+ * @author ruoyi
9
+ */
10
+public class PageDomain
11
+{
12
+    /** 当前记录起始索引 */
13
+    private Integer pageNum;
14
+
15
+    /** 每页显示记录数 */
16
+    private Integer pageSize;
17
+
18
+    /** 排序列 */
19
+    private String orderByColumn;
20
+
21
+    /** 排序的方向desc或者asc */
22
+    private String isAsc = "asc";
23
+
24
+    /** 分页参数合理化 */
25
+    private Boolean reasonable = true;
26
+
27
+    public String getOrderBy()
28
+    {
29
+        if (StringUtils.isEmpty(orderByColumn))
30
+        {
31
+            return "";
32
+        }
33
+        return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc;
34
+    }
35
+
36
+    public Integer getPageNum()
37
+    {
38
+        return pageNum;
39
+    }
40
+
41
+    public void setPageNum(Integer pageNum)
42
+    {
43
+        this.pageNum = pageNum;
44
+    }
45
+
46
+    public Integer getPageSize()
47
+    {
48
+        return pageSize;
49
+    }
50
+
51
+    public void setPageSize(Integer pageSize)
52
+    {
53
+        this.pageSize = pageSize;
54
+    }
55
+
56
+    public String getOrderByColumn()
57
+    {
58
+        return orderByColumn;
59
+    }
60
+
61
+    public void setOrderByColumn(String orderByColumn)
62
+    {
63
+        this.orderByColumn = orderByColumn;
64
+    }
65
+
66
+    public String getIsAsc()
67
+    {
68
+        return isAsc;
69
+    }
70
+
71
+    public void setIsAsc(String isAsc)
72
+    {
73
+        if (StringUtils.isNotEmpty(isAsc))
74
+        {
75
+            // 兼容前端排序类型
76
+            if ("ascending".equals(isAsc))
77
+            {
78
+                isAsc = "asc";
79
+            }
80
+            else if ("descending".equals(isAsc))
81
+            {
82
+                isAsc = "desc";
83
+            }
84
+            this.isAsc = isAsc;
85
+        }
86
+    }
87
+
88
+    public Boolean getReasonable()
89
+    {
90
+        if (StringUtils.isNull(reasonable))
91
+        {
92
+            return Boolean.TRUE;
93
+        }
94
+        return reasonable;
95
+    }
96
+
97
+    public void setReasonable(Boolean reasonable)
98
+    {
99
+        this.reasonable = reasonable;
100
+    }
101
+}

+ 85
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableDataInfo.java Parādīt failu

@@ -0,0 +1,85 @@
1
+package com.ruoyi.common.core.page;
2
+
3
+import java.io.Serializable;
4
+import java.util.List;
5
+
6
+/**
7
+ * 表格分页数据对象
8
+ * 
9
+ * @author ruoyi
10
+ */
11
+public class TableDataInfo implements Serializable
12
+{
13
+    private static final long serialVersionUID = 1L;
14
+
15
+    /** 总记录数 */
16
+    private long total;
17
+
18
+    /** 列表数据 */
19
+    private List<?> rows;
20
+
21
+    /** 消息状态码 */
22
+    private int code;
23
+
24
+    /** 消息内容 */
25
+    private String msg;
26
+
27
+    /**
28
+     * 表格数据对象
29
+     */
30
+    public TableDataInfo()
31
+    {
32
+    }
33
+
34
+    /**
35
+     * 分页
36
+     * 
37
+     * @param list 列表数据
38
+     * @param total 总记录数
39
+     */
40
+    public TableDataInfo(List<?> list, int total)
41
+    {
42
+        this.rows = list;
43
+        this.total = total;
44
+    }
45
+
46
+    public long getTotal()
47
+    {
48
+        return total;
49
+    }
50
+
51
+    public void setTotal(long total)
52
+    {
53
+        this.total = total;
54
+    }
55
+
56
+    public List<?> getRows()
57
+    {
58
+        return rows;
59
+    }
60
+
61
+    public void setRows(List<?> rows)
62
+    {
63
+        this.rows = rows;
64
+    }
65
+
66
+    public int getCode()
67
+    {
68
+        return code;
69
+    }
70
+
71
+    public void setCode(int code)
72
+    {
73
+        this.code = code;
74
+    }
75
+
76
+    public String getMsg()
77
+    {
78
+        return msg;
79
+    }
80
+
81
+    public void setMsg(String msg)
82
+    {
83
+        this.msg = msg;
84
+    }
85
+}

+ 56
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/page/TableSupport.java Parādīt failu

@@ -0,0 +1,56 @@
1
+package com.ruoyi.common.core.page;
2
+
3
+import com.ruoyi.common.core.text.Convert;
4
+import com.ruoyi.common.utils.ServletUtils;
5
+
6
+/**
7
+ * 表格数据处理
8
+ * 
9
+ * @author ruoyi
10
+ */
11
+public class TableSupport
12
+{
13
+    /**
14
+     * 当前记录起始索引
15
+     */
16
+    public static final String PAGE_NUM = "pageNum";
17
+
18
+    /**
19
+     * 每页显示记录数
20
+     */
21
+    public static final String PAGE_SIZE = "pageSize";
22
+
23
+    /**
24
+     * 排序列
25
+     */
26
+    public static final String ORDER_BY_COLUMN = "orderByColumn";
27
+
28
+    /**
29
+     * 排序的方向 "desc" 或者 "asc".
30
+     */
31
+    public static final String IS_ASC = "isAsc";
32
+
33
+    /**
34
+     * 分页参数合理化
35
+     */
36
+    public static final String REASONABLE = "reasonable";
37
+
38
+    /**
39
+     * 封装分页对象
40
+     */
41
+    public static PageDomain getPageDomain()
42
+    {
43
+        PageDomain pageDomain = new PageDomain();
44
+        pageDomain.setPageNum(Convert.toInt(ServletUtils.getParameter(PAGE_NUM), 1));
45
+        pageDomain.setPageSize(Convert.toInt(ServletUtils.getParameter(PAGE_SIZE), 10));
46
+        pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN));
47
+        pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC));
48
+        pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE));
49
+        return pageDomain;
50
+    }
51
+
52
+    public static PageDomain buildPageRequest()
53
+    {
54
+        return getPageDomain();
55
+    }
56
+}

+ 268
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/redis/RedisCache.java Parādīt failu

@@ -0,0 +1,268 @@
1
+package com.ruoyi.common.core.redis;
2
+
3
+import java.util.Collection;
4
+import java.util.Iterator;
5
+import java.util.List;
6
+import java.util.Map;
7
+import java.util.Set;
8
+import java.util.concurrent.TimeUnit;
9
+import org.springframework.beans.factory.annotation.Autowired;
10
+import org.springframework.data.redis.core.BoundSetOperations;
11
+import org.springframework.data.redis.core.HashOperations;
12
+import org.springframework.data.redis.core.RedisTemplate;
13
+import org.springframework.data.redis.core.ValueOperations;
14
+import org.springframework.stereotype.Component;
15
+
16
+/**
17
+ * spring redis 工具类
18
+ *
19
+ * @author ruoyi
20
+ **/
21
+@SuppressWarnings(value = { "unchecked", "rawtypes" })
22
+@Component
23
+public class RedisCache
24
+{
25
+    @Autowired
26
+    public RedisTemplate redisTemplate;
27
+
28
+    /**
29
+     * 缓存基本的对象,Integer、String、实体类等
30
+     *
31
+     * @param key 缓存的键值
32
+     * @param value 缓存的值
33
+     */
34
+    public <T> void setCacheObject(final String key, final T value)
35
+    {
36
+        redisTemplate.opsForValue().set(key, value);
37
+    }
38
+
39
+    /**
40
+     * 缓存基本的对象,Integer、String、实体类等
41
+     *
42
+     * @param key 缓存的键值
43
+     * @param value 缓存的值
44
+     * @param timeout 时间
45
+     * @param timeUnit 时间颗粒度
46
+     */
47
+    public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit)
48
+    {
49
+        redisTemplate.opsForValue().set(key, value, timeout, timeUnit);
50
+    }
51
+
52
+    /**
53
+     * 设置有效时间
54
+     *
55
+     * @param key Redis键
56
+     * @param timeout 超时时间
57
+     * @return true=设置成功;false=设置失败
58
+     */
59
+    public boolean expire(final String key, final long timeout)
60
+    {
61
+        return expire(key, timeout, TimeUnit.SECONDS);
62
+    }
63
+
64
+    /**
65
+     * 设置有效时间
66
+     *
67
+     * @param key Redis键
68
+     * @param timeout 超时时间
69
+     * @param unit 时间单位
70
+     * @return true=设置成功;false=设置失败
71
+     */
72
+    public boolean expire(final String key, final long timeout, final TimeUnit unit)
73
+    {
74
+        return redisTemplate.expire(key, timeout, unit);
75
+    }
76
+
77
+    /**
78
+     * 获取有效时间
79
+     *
80
+     * @param key Redis键
81
+     * @return 有效时间
82
+     */
83
+    public long getExpire(final String key)
84
+    {
85
+        return redisTemplate.getExpire(key);
86
+    }
87
+
88
+    /**
89
+     * 判断 key是否存在
90
+     *
91
+     * @param key 键
92
+     * @return true 存在 false不存在
93
+     */
94
+    public Boolean hasKey(String key)
95
+    {
96
+        return redisTemplate.hasKey(key);
97
+    }
98
+
99
+    /**
100
+     * 获得缓存的基本对象。
101
+     *
102
+     * @param key 缓存键值
103
+     * @return 缓存键值对应的数据
104
+     */
105
+    public <T> T getCacheObject(final String key)
106
+    {
107
+        ValueOperations<String, T> operation = redisTemplate.opsForValue();
108
+        return operation.get(key);
109
+    }
110
+
111
+    /**
112
+     * 删除单个对象
113
+     *
114
+     * @param key
115
+     */
116
+    public boolean deleteObject(final String key)
117
+    {
118
+        return redisTemplate.delete(key);
119
+    }
120
+
121
+    /**
122
+     * 删除集合对象
123
+     *
124
+     * @param collection 多个对象
125
+     * @return
126
+     */
127
+    public boolean deleteObject(final Collection collection)
128
+    {
129
+        return redisTemplate.delete(collection) > 0;
130
+    }
131
+
132
+    /**
133
+     * 缓存List数据
134
+     *
135
+     * @param key 缓存的键值
136
+     * @param dataList 待缓存的List数据
137
+     * @return 缓存的对象
138
+     */
139
+    public <T> long setCacheList(final String key, final List<T> dataList)
140
+    {
141
+        Long count = redisTemplate.opsForList().rightPushAll(key, dataList);
142
+        return count == null ? 0 : count;
143
+    }
144
+
145
+    /**
146
+     * 获得缓存的list对象
147
+     *
148
+     * @param key 缓存的键值
149
+     * @return 缓存键值对应的数据
150
+     */
151
+    public <T> List<T> getCacheList(final String key)
152
+    {
153
+        return redisTemplate.opsForList().range(key, 0, -1);
154
+    }
155
+
156
+    /**
157
+     * 缓存Set
158
+     *
159
+     * @param key 缓存键值
160
+     * @param dataSet 缓存的数据
161
+     * @return 缓存数据的对象
162
+     */
163
+    public <T> BoundSetOperations<String, T> setCacheSet(final String key, final Set<T> dataSet)
164
+    {
165
+        BoundSetOperations<String, T> setOperation = redisTemplate.boundSetOps(key);
166
+        Iterator<T> it = dataSet.iterator();
167
+        while (it.hasNext())
168
+        {
169
+            setOperation.add(it.next());
170
+        }
171
+        return setOperation;
172
+    }
173
+
174
+    /**
175
+     * 获得缓存的set
176
+     *
177
+     * @param key
178
+     * @return
179
+     */
180
+    public <T> Set<T> getCacheSet(final String key)
181
+    {
182
+        return redisTemplate.opsForSet().members(key);
183
+    }
184
+
185
+    /**
186
+     * 缓存Map
187
+     *
188
+     * @param key
189
+     * @param dataMap
190
+     */
191
+    public <T> void setCacheMap(final String key, final Map<String, T> dataMap)
192
+    {
193
+        if (dataMap != null) {
194
+            redisTemplate.opsForHash().putAll(key, dataMap);
195
+        }
196
+    }
197
+
198
+    /**
199
+     * 获得缓存的Map
200
+     *
201
+     * @param key
202
+     * @return
203
+     */
204
+    public <T> Map<String, T> getCacheMap(final String key)
205
+    {
206
+        return redisTemplate.opsForHash().entries(key);
207
+    }
208
+
209
+    /**
210
+     * 往Hash中存入数据
211
+     *
212
+     * @param key Redis键
213
+     * @param hKey Hash键
214
+     * @param value 值
215
+     */
216
+    public <T> void setCacheMapValue(final String key, final String hKey, final T value)
217
+    {
218
+        redisTemplate.opsForHash().put(key, hKey, value);
219
+    }
220
+
221
+    /**
222
+     * 获取Hash中的数据
223
+     *
224
+     * @param key Redis键
225
+     * @param hKey Hash键
226
+     * @return Hash中的对象
227
+     */
228
+    public <T> T getCacheMapValue(final String key, final String hKey)
229
+    {
230
+        HashOperations<String, String, T> opsForHash = redisTemplate.opsForHash();
231
+        return opsForHash.get(key, hKey);
232
+    }
233
+
234
+    /**
235
+     * 获取多个Hash中的数据
236
+     *
237
+     * @param key Redis键
238
+     * @param hKeys Hash键集合
239
+     * @return Hash对象集合
240
+     */
241
+    public <T> List<T> getMultiCacheMapValue(final String key, final Collection<Object> hKeys)
242
+    {
243
+        return redisTemplate.opsForHash().multiGet(key, hKeys);
244
+    }
245
+
246
+    /**
247
+     * 删除Hash中的某条数据
248
+     *
249
+     * @param key Redis键
250
+     * @param hKey Hash键
251
+     * @return 是否成功
252
+     */
253
+    public boolean deleteCacheMapValue(final String key, final String hKey)
254
+    {
255
+        return redisTemplate.opsForHash().delete(key, hKey) > 0;
256
+    }
257
+
258
+    /**
259
+     * 获得缓存的基本对象列表
260
+     *
261
+     * @param pattern 字符串前缀
262
+     * @return 对象列表
263
+     */
264
+    public Collection<String> keys(final String pattern)
265
+    {
266
+        return redisTemplate.keys(pattern);
267
+    }
268
+}

+ 86
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/text/CharsetKit.java Parādīt failu

@@ -0,0 +1,86 @@
1
+package com.ruoyi.common.core.text;
2
+
3
+import java.nio.charset.Charset;
4
+import java.nio.charset.StandardCharsets;
5
+import com.ruoyi.common.utils.StringUtils;
6
+
7
+/**
8
+ * 字符集工具类
9
+ * 
10
+ * @author ruoyi
11
+ */
12
+public class CharsetKit
13
+{
14
+    /** ISO-8859-1 */
15
+    public static final String ISO_8859_1 = "ISO-8859-1";
16
+    /** UTF-8 */
17
+    public static final String UTF_8 = "UTF-8";
18
+    /** GBK */
19
+    public static final String GBK = "GBK";
20
+
21
+    /** ISO-8859-1 */
22
+    public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1);
23
+    /** UTF-8 */
24
+    public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8);
25
+    /** GBK */
26
+    public static final Charset CHARSET_GBK = Charset.forName(GBK);
27
+
28
+    /**
29
+     * 转换为Charset对象
30
+     * 
31
+     * @param charset 字符集,为空则返回默认字符集
32
+     * @return Charset
33
+     */
34
+    public static Charset charset(String charset)
35
+    {
36
+        return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset);
37
+    }
38
+
39
+    /**
40
+     * 转换字符串的字符集编码
41
+     * 
42
+     * @param source 字符串
43
+     * @param srcCharset 源字符集,默认ISO-8859-1
44
+     * @param destCharset 目标字符集,默认UTF-8
45
+     * @return 转换后的字符集
46
+     */
47
+    public static String convert(String source, String srcCharset, String destCharset)
48
+    {
49
+        return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset));
50
+    }
51
+
52
+    /**
53
+     * 转换字符串的字符集编码
54
+     * 
55
+     * @param source 字符串
56
+     * @param srcCharset 源字符集,默认ISO-8859-1
57
+     * @param destCharset 目标字符集,默认UTF-8
58
+     * @return 转换后的字符集
59
+     */
60
+    public static String convert(String source, Charset srcCharset, Charset destCharset)
61
+    {
62
+        if (null == srcCharset)
63
+        {
64
+            srcCharset = StandardCharsets.ISO_8859_1;
65
+        }
66
+
67
+        if (null == destCharset)
68
+        {
69
+            destCharset = StandardCharsets.UTF_8;
70
+        }
71
+
72
+        if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset))
73
+        {
74
+            return source;
75
+        }
76
+        return new String(source.getBytes(srcCharset), destCharset);
77
+    }
78
+
79
+    /**
80
+     * @return 系统字符集编码
81
+     */
82
+    public static String systemCharset()
83
+    {
84
+        return Charset.defaultCharset().name();
85
+    }
86
+}

+ 1000
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/text/Convert.java
Failā izmaiņas netiks attēlotas, jo tās ir par lielu
Parādīt failu


+ 92
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/core/text/StrFormatter.java Parādīt failu

@@ -0,0 +1,92 @@
1
+package com.ruoyi.common.core.text;
2
+
3
+import com.ruoyi.common.utils.StringUtils;
4
+
5
+/**
6
+ * 字符串格式化
7
+ * 
8
+ * @author ruoyi
9
+ */
10
+public class StrFormatter
11
+{
12
+    public static final String EMPTY_JSON = "{}";
13
+    public static final char C_BACKSLASH = '\\';
14
+    public static final char C_DELIM_START = '{';
15
+    public static final char C_DELIM_END = '}';
16
+
17
+    /**
18
+     * 格式化字符串<br>
19
+     * 此方法只是简单将占位符 {} 按照顺序替换为参数<br>
20
+     * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可<br>
21
+     * 例:<br>
22
+     * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b<br>
23
+     * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a<br>
24
+     * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b<br>
25
+     * 
26
+     * @param strPattern 字符串模板
27
+     * @param argArray 参数列表
28
+     * @return 结果
29
+     */
30
+    public static String format(final String strPattern, final Object... argArray)
31
+    {
32
+        if (StringUtils.isEmpty(strPattern) || StringUtils.isEmpty(argArray))
33
+        {
34
+            return strPattern;
35
+        }
36
+        final int strPatternLength = strPattern.length();
37
+
38
+        // 初始化定义好的长度以获得更好的性能
39
+        StringBuilder sbuf = new StringBuilder(strPatternLength + 50);
40
+
41
+        int handledPosition = 0;
42
+        int delimIndex;// 占位符所在位置
43
+        for (int argIndex = 0; argIndex < argArray.length; argIndex++)
44
+        {
45
+            delimIndex = strPattern.indexOf(EMPTY_JSON, handledPosition);
46
+            if (delimIndex == -1)
47
+            {
48
+                if (handledPosition == 0)
49
+                {
50
+                    return strPattern;
51
+                }
52
+                else
53
+                { // 字符串模板剩余部分不再包含占位符,加入剩余部分后返回结果
54
+                    sbuf.append(strPattern, handledPosition, strPatternLength);
55
+                    return sbuf.toString();
56
+                }
57
+            }
58
+            else
59
+            {
60
+                if (delimIndex > 0 && strPattern.charAt(delimIndex - 1) == C_BACKSLASH)
61
+                {
62
+                    if (delimIndex > 1 && strPattern.charAt(delimIndex - 2) == C_BACKSLASH)
63
+                    {
64
+                        // 转义符之前还有一个转义符,占位符依旧有效
65
+                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
66
+                        sbuf.append(Convert.utf8Str(argArray[argIndex]));
67
+                        handledPosition = delimIndex + 2;
68
+                    }
69
+                    else
70
+                    {
71
+                        // 占位符被转义
72
+                        argIndex--;
73
+                        sbuf.append(strPattern, handledPosition, delimIndex - 1);
74
+                        sbuf.append(C_DELIM_START);
75
+                        handledPosition = delimIndex + 1;
76
+                    }
77
+                }
78
+                else
79
+                {
80
+                    // 正常占位符
81
+                    sbuf.append(strPattern, handledPosition, delimIndex);
82
+                    sbuf.append(Convert.utf8Str(argArray[argIndex]));
83
+                    handledPosition = delimIndex + 2;
84
+                }
85
+            }
86
+        }
87
+        // 加入最后一个占位符后所有的字符
88
+        sbuf.append(strPattern, handledPosition, strPattern.length());
89
+
90
+        return sbuf.toString();
91
+    }
92
+}

+ 20
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessStatus.java Parādīt failu

@@ -0,0 +1,20 @@
1
+package com.ruoyi.common.enums;
2
+
3
+/**
4
+ * 操作状态
5
+ * 
6
+ * @author ruoyi
7
+ *
8
+ */
9
+public enum BusinessStatus
10
+{
11
+    /**
12
+     * 成功
13
+     */
14
+    SUCCESS,
15
+
16
+    /**
17
+     * 失败
18
+     */
19
+    FAIL,
20
+}

+ 59
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/BusinessType.java Parādīt failu

@@ -0,0 +1,59 @@
1
+package com.ruoyi.common.enums;
2
+
3
+/**
4
+ * 业务操作类型
5
+ * 
6
+ * @author ruoyi
7
+ */
8
+public enum BusinessType
9
+{
10
+    /**
11
+     * 其它
12
+     */
13
+    OTHER,
14
+
15
+    /**
16
+     * 新增
17
+     */
18
+    INSERT,
19
+
20
+    /**
21
+     * 修改
22
+     */
23
+    UPDATE,
24
+
25
+    /**
26
+     * 删除
27
+     */
28
+    DELETE,
29
+
30
+    /**
31
+     * 授权
32
+     */
33
+    GRANT,
34
+
35
+    /**
36
+     * 导出
37
+     */
38
+    EXPORT,
39
+
40
+    /**
41
+     * 导入
42
+     */
43
+    IMPORT,
44
+
45
+    /**
46
+     * 强退
47
+     */
48
+    FORCE,
49
+
50
+    /**
51
+     * 生成代码
52
+     */
53
+    GENCODE,
54
+    
55
+    /**
56
+     * 清空数据
57
+     */
58
+    CLEAN,
59
+}

+ 19
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/DataSourceType.java Parādīt failu

@@ -0,0 +1,19 @@
1
+package com.ruoyi.common.enums;
2
+
3
+/**
4
+ * 数据源
5
+ * 
6
+ * @author ruoyi
7
+ */
8
+public enum DataSourceType
9
+{
10
+    /**
11
+     * 主库
12
+     */
13
+    MASTER,
14
+
15
+    /**
16
+     * 从库
17
+     */
18
+    SLAVE
19
+}

+ 36
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/HttpMethod.java Parādīt failu

@@ -0,0 +1,36 @@
1
+package com.ruoyi.common.enums;
2
+
3
+import java.util.HashMap;
4
+import java.util.Map;
5
+import org.springframework.lang.Nullable;
6
+
7
+/**
8
+ * 请求方式
9
+ *
10
+ * @author ruoyi
11
+ */
12
+public enum HttpMethod
13
+{
14
+    GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE;
15
+
16
+    private static final Map<String, HttpMethod> mappings = new HashMap<>(16);
17
+
18
+    static
19
+    {
20
+        for (HttpMethod httpMethod : values())
21
+        {
22
+            mappings.put(httpMethod.name(), httpMethod);
23
+        }
24
+    }
25
+
26
+    @Nullable
27
+    public static HttpMethod resolve(@Nullable String method)
28
+    {
29
+        return (method != null ? mappings.get(method) : null);
30
+    }
31
+
32
+    public boolean matches(String method)
33
+    {
34
+        return (this == resolve(method));
35
+    }
36
+}

+ 20
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/LimitType.java Parādīt failu

@@ -0,0 +1,20 @@
1
+package com.ruoyi.common.enums;
2
+
3
+/**
4
+ * 限流类型
5
+ *
6
+ * @author ruoyi
7
+ */
8
+
9
+public enum LimitType
10
+{
11
+    /**
12
+     * 默认策略全局限流
13
+     */
14
+    DEFAULT,
15
+
16
+    /**
17
+     * 根据请求者IP进行限流
18
+     */
19
+    IP
20
+}

+ 24
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/OperatorType.java Parādīt failu

@@ -0,0 +1,24 @@
1
+package com.ruoyi.common.enums;
2
+
3
+/**
4
+ * 操作人类别
5
+ * 
6
+ * @author ruoyi
7
+ */
8
+public enum OperatorType
9
+{
10
+    /**
11
+     * 其它
12
+     */
13
+    OTHER,
14
+
15
+    /**
16
+     * 后台用户
17
+     */
18
+    MANAGE,
19
+
20
+    /**
21
+     * 手机端用户
22
+     */
23
+    MOBILE
24
+}

+ 30
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/enums/UserStatus.java Parādīt failu

@@ -0,0 +1,30 @@
1
+package com.ruoyi.common.enums;
2
+
3
+/**
4
+ * 用户状态
5
+ * 
6
+ * @author ruoyi
7
+ */
8
+public enum UserStatus
9
+{
10
+    OK("0", "正常"), DISABLE("1", "停用"), DELETED("2", "删除");
11
+
12
+    private final String code;
13
+    private final String info;
14
+
15
+    UserStatus(String code, String info)
16
+    {
17
+        this.code = code;
18
+        this.info = info;
19
+    }
20
+
21
+    public String getCode()
22
+    {
23
+        return code;
24
+    }
25
+
26
+    public String getInfo()
27
+    {
28
+        return info;
29
+    }
30
+}

+ 0
- 0
smart-classify-back/ruoyi-common/src/main/java/com/ruoyi/common/exception/DemoModeException.java Parādīt failu


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels

Notiek ielāde…
Atcelt
Saglabāt