Ver código fonte

Merge branch 'dev' of http://192.168.1.245:11111/jinjilong/onlineEducation-fwd into dev

chenbaoku 8 meses atrás
pai
commit
5baa506732
100 arquivos alterados com 2091 adições e 2633 exclusões
  1. 16 0
      pom.xml
  2. 12 0
      snowy-modules/snowy-web-app/pom.xml
  3. 87 5
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/pom.xml
  4. 4 4
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/component/AsyncTaskComp.java
  5. 6 5
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/component/FileDealComp.java
  6. 3 5
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CommonFileController.java
  7. 526 11
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/FileController.java
  8. 288 42
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/FiletransferController.java
  9. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/NoticeController.java
  10. 3 15
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/OfficeController.java
  11. 1 4
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/RecoveryFileController.java
  12. 5 7
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/ShareController.java
  13. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/SysParamController.java
  14. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/TaskController.java
  15. 42 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/TranscodingController.java
  16. 2 4
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/UserController.java
  17. 2 6
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/UserFile.java
  18. 3 3
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/user/UserBean.java
  19. 31 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/file/TranscodingReqDTO.java
  20. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/ShareMapper.xml
  21. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/provider/NetDiskApiProvider.java
  22. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ICommonFileService.java
  23. 0 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IElasticSearchService.java
  24. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IFilePermissionService.java
  25. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IFileService.java
  26. 2 4
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IFiletransferService.java
  27. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/INoticeService.java
  28. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IOperationLogService.java
  29. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IRecoveryFileService.java
  30. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IShareFileService.java
  31. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IShareService.java
  32. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IStorageService.java
  33. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ISysParamService.java
  34. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUploadTaskDetailService.java
  35. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUploadTaskService.java
  36. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUserFileService.java
  37. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUserLoginInfoService.java
  38. 1 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUserService.java
  39. 22 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/TranscodingService.java
  40. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/CommonFileService.java
  41. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/FilePermissionService.java
  42. 2 4
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/FileService.java
  43. 14 17
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/FiletransferService.java
  44. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/NoticeService.java
  45. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/OperationLogService.java
  46. 2 3
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/RecoveryFileService.java
  47. 2 10
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/ShareFileService.java
  48. 2 6
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/ShareService.java
  49. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/StorageService.java
  50. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/SysParamService.java
  51. 130 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/TranscodingServiceImpl.java
  52. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UploadTaskDetailService.java
  53. 2 8
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UploadTaskService.java
  54. 7 18
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UserFileService.java
  55. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UserLoginInfoService.java
  56. 2 2
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UserService.java
  57. 172 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/OfficeConverter.java
  58. 244 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/PdfUtils.java
  59. 2 1
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/QiwenFileUtil.java
  60. 324 0
      snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/VideoConverter.java
  61. 13 30
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/pom.xml
  62. 4 4
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/base/BaseApiController.java
  63. 0 49
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/application/ApplicationContextProvider.java
  64. 0 28
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/property/CookieConfig.java
  65. 0 50
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/property/PasswordKeyConfig.java
  66. 0 92
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/property/QnConfig.java
  67. 0 94
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/property/SystemConfig.java
  68. 0 93
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/property/WxConfig.java
  69. 0 73
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/exception/ExceptionHandle.java
  70. 0 70
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/mvc/WebMvcConfiguration.java
  71. 0 68
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/AuthenticationBean.java
  72. 0 35
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/LoginAuthenticationEntryPoint.java
  73. 0 26
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestAccessDeniedHandler.java
  74. 0 27
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestAuthenticationFailureHandler.java
  75. 0 83
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestAuthenticationProvider.java
  76. 0 64
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestAuthenticationSuccessHandler.java
  77. 0 52
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestDetailsServiceImpl.java
  78. 0 67
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestLoginAuthenticationFilter.java
  79. 0 54
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestLogoutSuccessHandler.java
  80. 0 31
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestTokenBasedRememberMeServices.java
  81. 0 63
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestUtil.java
  82. 0 136
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/SecurityConfigurer.java
  83. 0 68
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/wx/TokenHandlerInterceptor.java
  84. 13 27
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/context/WebContext.java
  85. 0 50
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/context/WxContext.java
  86. 0 40
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/ErrorController.java
  87. 12 12
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/admin/ExamPaperAnswerController.java
  88. 25 26
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/admin/MessageController.java
  89. 0 103
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/admin/UploadController.java
  90. 0 152
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/admin/UserController.java
  91. 12 15
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/student/DashboardController.java
  92. 8 5
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/student/EducationController.java
  93. 7 6
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/student/ExamPaperAnswerController.java
  94. 0 51
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/student/UploadController.java
  95. 0 140
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/student/UserController.java
  96. 0 22
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/wx/BaseWXApiController.java
  97. 0 85
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/wx/student/AuthController.java
  98. 0 129
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/wx/student/DashboardController.java
  99. 0 135
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/wx/student/ExamPaperAnswerController.java
  100. 0 57
      snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/wx/student/ExamPaperController.java

+ 16 - 0
pom.xml

@@ -346,6 +346,22 @@
                 <version>${snowy.version}</version>
             </dependency>
 
+            <!-- snowy-plugin-exam-func -->
+            <dependency>
+                <groupId>vip.xiaonuo</groupId>
+                <artifactId>snowy-plugin-exam-api</artifactId>
+                <version>${snowy.version}</version>
+            </dependency>
+
+
+            <dependency>
+                <groupId>vip.xiaonuo</groupId>
+                <artifactId>snowy-plugin-exam-func</artifactId>
+                <version>${snowy.version}</version>
+            </dependency>
+
+
+
             <!-- snowy-plugin-urp-api -->
             <dependency>
                 <groupId>vip.xiaonuo</groupId>

+ 12 - 0
snowy-modules/snowy-web-app/pom.xml

@@ -150,6 +150,18 @@
             <artifactId>snowy-plugin-disk-func</artifactId>
         </dependency>
 
+        <!-- snowy-plugin-exam-func -->
+        <dependency>
+            <groupId>vip.xiaonuo</groupId>
+            <artifactId>snowy-plugin-exam-api</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>vip.xiaonuo</groupId>
+            <artifactId>snowy-plugin-exam-func</artifactId>
+        </dependency>
+
         <!-- bootstrap 配置加载 -->
         <dependency>
             <groupId>org.springframework.cloud</groupId>

+ 87 - 5
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/pom.xml

@@ -14,9 +14,21 @@
     <version>2.0.0</version>
     <packaging>jar</packaging>
     <description>业务功能插件func实现</description>
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>14</source>
+                    <target>14</target>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
     <name>qiwen-file</name>
     <properties>
-        <java.version>1.8</java.version>
+<!--        <java.version>1.8</java.version>-->
         <spring-cloud.version>Hoxton.SR1</spring-cloud.version>
         <skipTests>true</skipTests>
         <docker.image.prefix>scp</docker.image.prefix>
@@ -37,7 +49,7 @@
         <commons-io.version>2.11.0</commons-io.version>
         <jjwt.version>0.9.1</jjwt.version>
         <thumbnailator.version>0.4.16</thumbnailator.version>
-        <fastjson2.version>2.0.5.graal</fastjson2.version>
+        <fastjson2.version>2.0.34</fastjson2.version>
         <swagger-annotations.version>2.1.4</swagger-annotations.version>
         <mybatis-plus.version>3.5.2</mybatis-plus.version>
         <poi-version>5.2.2</poi-version>
@@ -46,7 +58,7 @@
         <javacpp.version>1.5.7</javacpp.version>
         <javacv.version>1.5.7</javacv.version>
         <ffmpeg.version>5.0-1.5.7</ffmpeg.version>
-        <minio.version>8.3.4</minio.version>
+        <minio.version>8.5.7</minio.version>
         <qiniu.version>7.9.2</qiniu.version>
         <hutool.version>5.8.16</hutool.version>
         <springdoc-openapi.version>1.6.1</springdoc-openapi.version>
@@ -56,10 +68,17 @@
         <jpinyin.version>1.1.8</jpinyin.version>
         <jaudiotagger.version>2.0.1</jaudiotagger.version>
         <htmlunit.version>2.62.0</htmlunit.version>
+        <poi.version>5.2.3</poi.version>
     </properties>
 
-
     <dependencies>
+
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>8.4.0</version>
+        </dependency>
+
         <!-- 每个插件都要引入自己的对外接口 -->
         <dependency>
             <groupId>vip.xiaonuo</groupId>
@@ -123,7 +142,6 @@
             <scope>runtime</scope>
         </dependency>
 
-
         <!--jpa-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -200,5 +218,69 @@
             <scope>runtime</scope>
         </dependency>
 
+        <!-- Apache POI -->
+<!--        <dependency>-->
+<!--            <groupId>org.apache.poi</groupId>-->
+<!--            <artifactId>poi</artifactId>-->
+<!--            <version>5.2.3</version>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>org.apache.poi</groupId>-->
+<!--            <artifactId>poi-ooxml</artifactId>-->
+<!--            <version>5.2.3</version>-->
+<!--        </dependency>-->
+
+        <!-- Apache POI核心依赖 -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-scratchpad</artifactId>
+            <version>5.2.5</version>
+        </dependency>
+
+        <!-- Apache Commons IO -->
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.13.0</version>
+        </dependency>
+
+
     </dependencies>
+
+    <repositories>
+        <repository>
+            <id>jcenter</id>
+            <url>https://jcenter.bintray.com/</url>
+        </repository>
+        <repository>
+            <id>aliyunmaven</id>
+            <url>https://maven.aliyun.com/repository/public</url>
+            <releases><enabled>true</enabled></releases>
+            <snapshots><enabled>false</enabled></snapshots>
+        </repository>
+        <repository>
+            <id>central</id>
+            <url>https://repo.maven.apache.org/maven2</url>
+            <releases><enabled>true</enabled></releases>
+            <snapshots><enabled>false</enabled></snapshots>
+        </repository>
+        <repository>
+            <id>apache.snapshots</id>
+            <url>https://repository.apache.org/snapshots</url>
+            <releases><enabled>false</enabled></releases>
+            <snapshots><enabled>true</enabled></snapshots>
+        </repository>
+    </repositories>
+
+
 </project>

+ 4 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/component/AsyncTaskComp.java

@@ -17,8 +17,8 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.scheduling.annotation.AsyncResult;
 import org.springframework.stereotype.Component;
-import vip.xiaonuo.disk.api.IFiletransferService;
-import vip.xiaonuo.disk.api.IRecoveryFileService;
+import vip.xiaonuo.disk.service.IFiletransferService;
+import vip.xiaonuo.disk.service.IRecoveryFileService;
 import vip.xiaonuo.disk.domain.UserFile;
 
 import javax.annotation.Resource;
@@ -79,7 +79,7 @@ public class AsyncTaskComp {
                             filetransferService.deleteFile(fileBean);
                             fileMapper.deleteById(fileBean.getFileId());
                         } catch (Exception e) {
-                            log.error("删除本地文件失败:" + JSON.toJSONString(fileBean));
+//                            log.error("删除本地文件失败:" + JSON.toJSONString(fileBean));
                         }
                     }
 
@@ -97,7 +97,7 @@ public class AsyncTaskComp {
                     filetransferService.deleteFile(fileBean);
                     fileMapper.deleteById(fileBean.getFileId());
                 } catch (Exception e) {
-                    log.error("删除本地文件失败:" + JSON.toJSONString(fileBean));
+//                    log.error("删除本地文件失败:" + JSON.toJSONString(fileBean));
                 }
             }
         }

+ 6 - 5
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/component/FileDealComp.java

@@ -3,15 +3,16 @@ package vip.xiaonuo.disk.component;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.IdUtil;
 import co.elastic.clients.elasticsearch.ElasticsearchClient;
-import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.qiwenshare.common.util.DateUtil;
 import com.qiwenshare.common.util.MusicUtils;
 import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.IShareFileService;
-import vip.xiaonuo.disk.api.IShareService;
-import vip.xiaonuo.disk.api.IUserService;
+import vip.xiaonuo.disk.service.IShareFileService;
+import vip.xiaonuo.disk.service.IShareService;
+import vip.xiaonuo.disk.service.IUserService;
 import vip.xiaonuo.disk.config.es.FileSearch;
 import vip.xiaonuo.disk.domain.*;
 import vip.xiaonuo.disk.io.QiwenFile;
@@ -348,7 +349,7 @@ public class FileDealComp {
 
 //                String userId = userService.getUserIdByToken(token);
                 String userId = StpLoginUserUtil.getLoginUser().getId();
-                log.debug(JSON.toJSONString("当前登录session用户id:" + userId));
+//                log.debug(JSON.toJSONString("当前登录session用户id:" + userId));
                 if (userId == null) {
                     return false;
                 }

+ 3 - 5
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/CommonFileController.java

@@ -5,12 +5,10 @@ import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qiwenshare.common.anno.MyLog;
 import com.qiwenshare.common.result.RestResult;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.ICommonFileService;
-import vip.xiaonuo.disk.api.IFilePermissionService;
-import vip.xiaonuo.disk.api.IUserFileService;
+import vip.xiaonuo.disk.service.ICommonFileService;
+import vip.xiaonuo.disk.service.IFilePermissionService;
+import vip.xiaonuo.disk.service.IUserFileService;
 import vip.xiaonuo.disk.domain.CommonFile;
 import vip.xiaonuo.disk.domain.FilePermission;
 import vip.xiaonuo.disk.domain.UserFile;

+ 526 - 11
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/FileController.java

@@ -6,8 +6,6 @@ import co.elastic.clients.elasticsearch.ElasticsearchClient;
 import co.elastic.clients.elasticsearch.core.SearchResponse;
 import co.elastic.clients.elasticsearch.core.search.HighlighterEncoder;
 import co.elastic.clients.elasticsearch.core.search.Hit;
-import com.alibaba.fastjson2.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -15,11 +13,10 @@ import com.qiwenshare.common.anno.MyLog;
 import com.qiwenshare.common.exception.QiwenException;
 import com.qiwenshare.common.result.RestResult;
 import com.qiwenshare.common.util.DateUtil;
-import com.qiwenshare.common.util.security.JwtUser;
 import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.IFileService;
-import vip.xiaonuo.disk.api.IUserFileService;
+import vip.xiaonuo.disk.service.IFileService;
+import vip.xiaonuo.disk.service.IUserFileService;
 import vip.xiaonuo.disk.component.AsyncTaskComp;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.config.es.FileSearch;
@@ -39,8 +36,6 @@ import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.codec.digest.DigestUtils;
-import org.apache.commons.lang3.StringUtils;
 import org.eclipse.jetty.util.StringUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -57,8 +52,6 @@ import java.util.*;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
 
 @Tag(name = "file", description = "该接口为文件接口,主要用来做一些文件的基本操作,如创建目录,删除,移动,复制等。")
 @RestController
@@ -81,6 +74,9 @@ public class FileController {
     @Value("${ufop.storage-type}")
     private Integer storageType;
 
+    @Value("${common.account}")
+    private String commonUserId;
+
     public static Executor executor = Executors.newFixedThreadPool(20);
 
     public static final String CURRENT_MODULE = "文件接口";
@@ -154,6 +150,85 @@ public class FileController {
         }
     }
 
+
+
+
+
+
+
+    @Operation(summary = "创建文件", description = "创建文件", tags = {"file"})
+    @ResponseBody
+    @RequestMapping(value = "/createCommonFile", method = RequestMethod.POST)
+    public RestResult<Object> createCommonFile(@Valid @RequestBody CreateFileDTO createFileDTO) {
+
+        try {
+
+            String userId = commonUserId;
+            String filePath = createFileDTO.getFilePath();
+            String fileName = createFileDTO.getFileName();
+            String extendName = createFileDTO.getExtendName();
+            List<UserFile> userFiles = userFileService.selectSameUserFile(fileName, filePath, extendName, userId);
+            if (userFiles != null && !userFiles.isEmpty()) {
+                return RestResult.fail().message("同名文件已存在");
+            }
+            String uuid = UUID.randomUUID().toString().replaceAll("-", "");
+
+            String templateFilePath = "";
+            if ("docx".equals(extendName)) {
+                templateFilePath = "template/Word.docx";
+            } else if ("xlsx".equals(extendName)) {
+                templateFilePath = "template/Excel.xlsx";
+            } else if ("pptx".equals(extendName)) {
+                templateFilePath = "template/PowerPoint.pptx";
+            } else if ("txt".equals(extendName)) {
+                templateFilePath = "template/Text.txt";
+            } else if ("drawio".equals(extendName)) {
+                templateFilePath = "template/Drawio.drawio";
+            }
+            String url2 = ClassUtils.getDefaultClassLoader().getResource("static/" + templateFilePath).getPath();
+            url2 = URLDecoder.decode(url2, "UTF-8");
+            FileInputStream fileInputStream = new FileInputStream(url2);
+            Copier copier = ufopFactory.getCopier();
+            CopyFile copyFile = new CopyFile();
+            copyFile.setExtendName(extendName);
+            String fileUrl = copier.copy(fileInputStream, copyFile);
+
+            FileBean fileBean = new FileBean();
+            fileBean.setFileId(IdUtil.getSnowflakeNextIdStr());
+            fileBean.setFileSize(0L);
+            fileBean.setFileUrl(fileUrl);
+            fileBean.setStorageType(storageType);
+            fileBean.setIdentifier(uuid);
+            fileBean.setCreateTime(DateUtil.getCurrentTime());
+            fileBean.setCreateUserId(StpLoginUserUtil.getLoginUser().getId());
+            fileBean.setFileStatus(1);
+            boolean saveFlag = fileService.save(fileBean);
+            UserFile userFile = new UserFile();
+            if (saveFlag) {
+                userFile.setUserFileId(IdUtil.getSnowflakeNextIdStr());
+                userFile.setUserId(userId);
+                userFile.setFileName(fileName);
+                userFile.setFilePath(filePath);
+                userFile.setDeleteFlag(0);
+                userFile.setIsDir(0);
+                userFile.setExtendName(extendName);
+                userFile.setUploadTime(DateUtil.getCurrentTime());
+                userFile.setFileId(fileBean.getFileId());
+                userFile.setCreateTime(DateUtil.getCurrentTime());
+                userFile.setCreateUserId(SessionUtil.getUserId());
+                userFileService.save(userFile);
+            }
+            return RestResult.success().message("文件创建成功");
+        } catch (Exception e) {
+            log.error(e.getMessage());
+            return RestResult.fail().message(e.getMessage());
+        }
+    }
+
+
+
+
+
     @Operation(summary = "创建文件夹", description = "目录(文件夹)的创建", tags = {"file"})
     @RequestMapping(value = "/createFold", method = RequestMethod.POST)
     @MyLog(operation = "创建文件夹", module = CURRENT_MODULE)
@@ -178,6 +253,38 @@ public class FileController {
         return RestResult.success();
     }
 
+
+
+    @Operation(summary = "创建文件夹", description = "目录(文件夹)的创建", tags = {"file"})
+    @RequestMapping(value = "/createCommonFold", method = RequestMethod.POST)
+    @MyLog(operation = "创建文件夹", module = CURRENT_MODULE)
+    @ResponseBody
+    public RestResult<String> createCommonFold(@Valid @RequestBody CreateFoldDTO createFoldDto) {
+
+//        String userId = SessionUtil.getSession().getUserId();
+        String userId = commonUserId;
+        String filePath = createFoldDto.getFilePath();
+
+
+        boolean isDirExist = fileDealComp.isDirExist(createFoldDto.getFileName(), createFoldDto.getFilePath(), userId);
+
+        if (isDirExist) {
+            return RestResult.fail().message("同名文件夹已存在");
+        }
+
+        UserFile userFile = QiwenFileUtil.getQiwenDir(userId, filePath, createFoldDto.getFileName());
+
+        userFileService.save(userFile);
+        fileDealComp.uploadESByUserFileId(userFile.getUserFileId());
+        return RestResult.success();
+    }
+
+
+
+
+
+
+
     @Operation(summary = "文件搜索", description = "文件搜索", tags = {"file"})
     @GetMapping(value = "/search")
     @MyLog(operation = "文件搜索", module = CURRENT_MODULE)
@@ -243,6 +350,79 @@ public class FileController {
     }
 
 
+
+
+
+
+
+    @Operation(summary = "文件搜索", description = "文件搜索", tags = {"file"})
+    @GetMapping(value = "/searchCommon")
+    @MyLog(operation = "文件搜索", module = CURRENT_MODULE)
+    @ResponseBody
+    public RestResult<SearchFileVO> searchCommon(SearchFileDTO searchFileDTO) {
+        String userId = commonUserId;
+
+        int currentPage = (int)searchFileDTO.getCurrentPage() - 1;
+        int pageCount = (int)(searchFileDTO.getPageCount() == 0 ? 10 : searchFileDTO.getPageCount());
+
+        SearchResponse<FileSearch> search = null;
+        try {
+            search = elasticsearchClient.search(s -> s
+                            .index("filesearch")
+                            .query(_1 -> _1
+                                    .bool(_2 -> _2
+                                            .must(_3 -> _3
+                                                    .bool(_4 -> _4
+                                                            .should(_5 -> _5
+                                                                    .match(_6 -> _6
+                                                                            .field("fileName")
+                                                                            .query(searchFileDTO.getFileName())))
+                                                            .should(_5 -> _5
+                                                                    .wildcard(_6 -> _6
+                                                                            .field("fileName")
+                                                                            .wildcard("*" + searchFileDTO.getFileName() + "*")))
+                                                            .should(_5 -> _5
+                                                                    .match(_6 -> _6
+                                                                            .field("content")
+                                                                            .query(searchFileDTO.getFileName())))
+                                                            .should(_5 -> _5
+                                                                    .wildcard(_6 -> _6
+                                                                            .field("content")
+                                                                            .wildcard("*" + searchFileDTO.getFileName() + "*")))
+                                                    ))
+                                            .must(_3 -> _3
+                                                    .term(_4 -> _4
+                                                            .field("userId")
+                                                            .value(userId)))
+                                    ))
+                            .from(currentPage)
+                            .size(pageCount)
+                            .highlight(h -> h
+                                    .fields("fileName", f -> f.type("plain")
+                                            .preTags("<span class='keyword'>").postTags("</span>"))
+                                    .encoder(HighlighterEncoder.Html))
+                    ,
+                    FileSearch.class);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+
+        List<SearchFileVO> searchFileVOList = new ArrayList<>();
+        for (Hit<FileSearch> hit : search.hits().hits()) {
+            SearchFileVO searchFileVO = new SearchFileVO();
+            BeanUtil.copyProperties(hit.source(), searchFileVO);
+            searchFileVO.setHighLight(hit.highlight());
+            searchFileVOList.add(searchFileVO);
+            asyncTaskComp.checkESUserFileId(searchFileVO.getUserFileId());
+        }
+        return RestResult.success().dataList(searchFileVOList, searchFileVOList.size());
+    }
+
+
+
+
+
+
     @Operation(summary = "文件重命名", description = "文件重命名", tags = {"file"})
     @RequestMapping(value = "/renamefile", method = RequestMethod.POST)
     @MyLog(operation = "文件重命名", module = CURRENT_MODULE)
@@ -277,6 +457,51 @@ public class FileController {
         return RestResult.success();
     }
 
+
+
+
+
+
+
+    @Operation(summary = "文件重命名", description = "文件重命名", tags = {"file"})
+    @RequestMapping(value = "/renameCommonfile", method = RequestMethod.POST)
+    @MyLog(operation = "文件重命名", module = CURRENT_MODULE)
+    @ResponseBody
+    public RestResult<String> renameCommonfile(@RequestBody RenameFileDTO renameFileDto) {
+
+        String userId =commonUserId;
+        UserFile userFile = userFileService.getById(renameFileDto.getUserFileId());
+
+        List<UserFile> userFiles = userFileService.selectUserFileByNameAndPath(renameFileDto.getFileName(), userFile.getFilePath(), userId);
+        if (userFiles != null && !userFiles.isEmpty()) {
+            return RestResult.fail().message("同名文件已存在");
+        }
+
+        LambdaUpdateWrapper<UserFile> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
+        lambdaUpdateWrapper.set(UserFile::getFileName, renameFileDto.getFileName())
+                .set(UserFile::getUploadTime, DateUtil.getCurrentTime())
+                .eq(UserFile::getUserFileId, renameFileDto.getUserFileId());
+        userFileService.update(lambdaUpdateWrapper);
+        if (1 == userFile.getIsDir()) {
+            List<UserFile> list = userFileService.selectUserFileByLikeRightFilePath(new QiwenFile(userFile.getFilePath(), userFile.getFileName(), true).getPath(), userId);
+
+            for (UserFile newUserFile : list) {
+                String escapedPattern = Pattern.quote(new QiwenFile(userFile.getFilePath(), userFile.getFileName(), userFile.getIsDir() == 1).getPath());
+                newUserFile.setFilePath(newUserFile.getFilePath().replaceFirst(escapedPattern,
+                        new QiwenFile(userFile.getFilePath(), renameFileDto.getFileName(), userFile.getIsDir() == 1).getPath()));
+                userFileService.updateById(newUserFile);
+            }
+        }
+        fileDealComp.uploadESByUserFileId(renameFileDto.getUserFileId());
+        return RestResult.success();
+    }
+
+
+
+
+
+
+
     @Operation(summary = "获取文件列表", description = "用来做前台列表展示", tags = {"file"})
     @RequestMapping(value = "/getfilelist", method = RequestMethod.GET)
     @ResponseBody
@@ -287,7 +512,7 @@ public class FileController {
             @Parameter(description = "页面数量", required = true) long pageCount){
         String userId = StpLoginUserUtil.getLoginUser().getId();
         if ("0".equals(fileType)) {
-            IPage<FileListVO> fileList = userFileService.userFileList(null, filePath, currentPage, pageCount);
+            IPage<FileListVO> fileList = userFileService.userFileList(userId, filePath, currentPage, pageCount);
             return RestResult.success().dataList(fileList.getRecords(), fileList.getTotal());
         } else {
             IPage<FileListVO> fileList = userFileService.getFileByFileType(Integer.valueOf(fileType), currentPage, pageCount, userId);
@@ -296,6 +521,28 @@ public class FileController {
     }
 
 
+    @Operation(summary = "获取公共资源库文件列表", description = "用来做前台列表展示", tags = {"file"})
+    @RequestMapping(value = "/getcommonfilelist", method = RequestMethod.GET)
+    @ResponseBody
+    public RestResult<FileListVO> getcommonfilelist(
+            @Parameter(description = "文件类型", required = true) String fileType,
+            @Parameter(description = "文件路径", required = true) String filePath,
+            @Parameter(description = "当前页", required = true) long currentPage,
+            @Parameter(description = "页面数量", required = true) long pageCount
+    ){
+        String userId = commonUserId;
+        if ("0".equals(fileType)) {
+            IPage<FileListVO> fileList = userFileService.userFileList(userId, filePath, currentPage, pageCount);
+            return RestResult.success().dataList(fileList.getRecords(), fileList.getTotal());
+        } else {
+            IPage<FileListVO> fileList = userFileService.getFileByFileType(Integer.valueOf(fileType), currentPage, pageCount, userId);
+            return RestResult.success().dataList(fileList.getRecords(), fileList.getTotal());
+        }
+    }
+
+
+
+
     @Operation(summary = "批量删除文件", description = "批量删除文件", tags = {"file"})
     @RequestMapping(value = "/batchdeletefile", method = RequestMethod.POST)
     @MyLog(operation = "批量删除文件", module = CURRENT_MODULE)
@@ -315,6 +562,33 @@ public class FileController {
         return RestResult.success().message("批量删除文件成功");
     }
 
+
+
+    @Operation(summary = "批量删除文件", description = "批量删除文件", tags = {"file"})
+    @RequestMapping(value = "/batchdeleteCommonfile", method = RequestMethod.POST)
+    @MyLog(operation = "批量删除文件", module = CURRENT_MODULE)
+    @ResponseBody
+    public RestResult<String> batchdeleteCommonfile(@RequestBody BatchDeleteFileDTO batchDeleteFileDto) {
+        String userFileIds = commonUserId;
+        String[] userFileIdList = userFileIds.split(",");
+        userFileService.update(new UpdateWrapper<UserFile>().lambda().set(UserFile::getDeleteFlag, 1).in(UserFile::getUserFileId, Arrays.asList(userFileIdList)));
+        for (String userFileId : userFileIdList) {
+            executor.execute(()->{
+                userFileService.deleteUserFile(userFileId, SessionUtil.getUserId());
+            });
+
+            fileDealComp.deleteESByUserFileId(userFileId);
+        }
+
+        return RestResult.success().message("批量删除文件成功");
+    }
+
+
+
+
+
+
+
     @Operation(summary = "删除文件", description = "可以删除文件或者目录", tags = {"file"})
     @RequestMapping(value = "/deletefile", method = RequestMethod.POST)
     @MyLog(operation = "删除文件", module = CURRENT_MODULE)
@@ -330,6 +604,23 @@ public class FileController {
 
     }
 
+
+    @Operation(summary = "删除文件", description = "可以删除文件或者目录", tags = {"file"})
+    @RequestMapping(value = "/deleteCommonfile", method = RequestMethod.POST)
+    @MyLog(operation = "删除文件", module = CURRENT_MODULE)
+    @ResponseBody
+    public RestResult deleteCommonFile(@RequestBody DeleteFileDTO deleteFileDto) {
+        String userId =commonUserId;
+        userFileService.deleteUserFile(deleteFileDto.getUserFileId(), userId);
+        fileDealComp.deleteESByUserFileId(deleteFileDto.getUserFileId());
+
+        return RestResult.success();
+
+    }
+
+
+
+
     @Operation(summary = "解压文件", description = "解压文件。", tags = {"file"})
     @RequestMapping(value = "/unzipfile", method = RequestMethod.POST)
     @MyLog(operation = "解压文件", module = CURRENT_MODULE)
@@ -346,12 +637,30 @@ public class FileController {
 
     }
 
+
+
+    @Operation(summary = "解压文件", description = "解压文件。", tags = {"file"})
+    @RequestMapping(value = "/unzipCommonFile", method = RequestMethod.POST)
+    @MyLog(operation = "解压文件", module = CURRENT_MODULE)
+    @ResponseBody
+    public RestResult<String> unzipCommonFile(@RequestBody UnzipFileDTO unzipFileDto) {
+
+        try {
+            fileService.unzipFile(unzipFileDto.getUserFileId(), unzipFileDto.getUnzipMode(), unzipFileDto.getFilePath());
+        } catch (QiwenException e) {
+            return RestResult.fail().message(e.getMessage());
+        }
+
+        return RestResult.success();
+
+    }
+
     @Operation(summary = "文件复制", description = "可以复制文件或者目录", tags = {"file"})
     @RequestMapping(value = "/copyfile", method = RequestMethod.POST)
     @MyLog(operation = "文件复制", module = CURRENT_MODULE)
     @ResponseBody
     public RestResult<String> copyFile(@RequestBody CopyFileDTO copyFileDTO) {
-        String userId = SessionUtil.getUserId();
+        String userId = StpLoginUserUtil.getLoginUser().getId();
         String filePath = copyFileDTO.getFilePath();
         String userFileIds = copyFileDTO.getUserFileIds();
         String[] userFileIdArr = userFileIds.split(",");
@@ -374,6 +683,40 @@ public class FileController {
 
     }
 
+
+    @Operation(summary = "文件复制", description = "可以复制文件或者目录", tags = {"file"})
+    @RequestMapping(value = "/copyCommonfile", method = RequestMethod.POST)
+    @MyLog(operation = "文件复制", module = CURRENT_MODULE)
+    @ResponseBody
+    public RestResult<String> copyCommonfile(@RequestBody CopyFileDTO copyFileDTO) {
+        String userId = commonUserId;
+        String filePath = copyFileDTO.getFilePath();
+        String userFileIds = copyFileDTO.getUserFileIds();
+        String[] userFileIdArr = userFileIds.split(",");
+        for (String userFileId : userFileIdArr) {
+            UserFile userFile = userFileService.getById(userFileId);
+            String oldfilePath = userFile.getFilePath();
+            String fileName = userFile.getFileName();
+            if (userFile.isDirectory()) {
+                QiwenFile qiwenFile = new QiwenFile(oldfilePath, fileName, true);
+                if (filePath.startsWith(qiwenFile.getPath() + QiwenFile.separator) || filePath.equals(qiwenFile.getPath())) {
+                    return RestResult.fail().message("原路径与目标路径冲突,不能复制");
+                }
+            }
+
+            userFileService.userFileCopy(userId, userFileId, filePath);
+            fileDealComp.deleteRepeatSubDirFile(filePath, userId);
+        }
+
+        return RestResult.success();
+
+    }
+
+
+
+
+
+
     @Operation(summary = "文件移动", description = "可以移动文件或者目录", tags = {"file"})
     @RequestMapping(value = "/movefile", method = RequestMethod.POST)
     @MyLog(operation = "文件移动", module = CURRENT_MODULE)
@@ -401,6 +744,40 @@ public class FileController {
 
     }
 
+
+
+    @Operation(summary = "文件移动", description = "可以移动文件或者目录", tags = {"file"})
+    @RequestMapping(value = "/moveCommonFile", method = RequestMethod.POST)
+    @MyLog(operation = "文件移动", module = CURRENT_MODULE)
+    @ResponseBody
+    public RestResult<String> moveCommonFile(@RequestBody MoveFileDTO moveFileDto) {
+
+//        JwtUser sessionUserBean =  SessionUtil.getSession();
+        String userId =commonUserId;
+        UserFile userFile = userFileService.getById(moveFileDto.getUserFileId());
+        String oldfilePath = userFile.getFilePath();
+        String newfilePath = moveFileDto.getFilePath();
+        String fileName = userFile.getFileName();
+        String extendName = userFile.getExtendName();
+        if (StringUtil.isEmpty(extendName)) {
+            QiwenFile qiwenFile = new QiwenFile(oldfilePath, fileName, true);
+            if (newfilePath.startsWith(qiwenFile.getPath() + QiwenFile.separator) || newfilePath.equals(qiwenFile.getPath())) {
+                return RestResult.fail().message("原路径与目标路径冲突,不能移动");
+            }
+        }
+
+        userFileService.updateFilepathByUserFileId(moveFileDto.getUserFileId(), newfilePath, userId);
+
+        fileDealComp.deleteRepeatSubDirFile(newfilePath, userId);
+        return RestResult.success();
+
+    }
+
+
+
+
+
+
     @Operation(summary = "批量移动文件", description = "可以同时选择移动多个文件或者目录", tags = {"file"})
     @RequestMapping(value = "/batchmovefile", method = RequestMethod.POST)
     @MyLog(operation = "批量移动文件", module = CURRENT_MODULE)
@@ -430,6 +807,39 @@ public class FileController {
 
     }
 
+
+
+
+    @Operation(summary = "批量移动文件", description = "可以同时选择移动多个文件或者目录", tags = {"file"})
+    @RequestMapping(value = "/batchmoveCommonFile", method = RequestMethod.POST)
+    @MyLog(operation = "批量移动文件", module = CURRENT_MODULE)
+    @ResponseBody
+    public RestResult<String> batchmoveCommonFile(@RequestBody BatchMoveFileDTO batchMoveFileDto) {
+
+        String userId =commonUserId;
+
+        String newfilePath = batchMoveFileDto.getFilePath();
+
+        String userFileIds = batchMoveFileDto.getUserFileIds();
+        String[] userFileIdArr = userFileIds.split(",");
+
+        for (String userFileId : userFileIdArr) {
+            UserFile userFile = userFileService.getById(userFileId);
+            if (StringUtil.isEmpty(userFile.getExtendName())) {
+                QiwenFile qiwenFile = new QiwenFile(userFile.getFilePath(), userFile.getFileName(), true);
+                if (newfilePath.startsWith(qiwenFile.getPath() + QiwenFile.separator) || newfilePath.equals(qiwenFile.getPath())) {
+                    return RestResult.fail().message("原路径与目标路径冲突,不能移动");
+                }
+            }
+            userFileService.updateFilepathByUserFileId(userFile.getUserFileId(), newfilePath, userId);
+        }
+
+        return RestResult.success().data("批量移动文件成功");
+
+    }
+
+
+
     @Operation(summary = "获取文件树", description = "文件移动的时候需要用到该接口,用来展示目录树", tags = {"file"})
     @RequestMapping(value = "/getfiletree", method = RequestMethod.GET)
     @ResponseBody
@@ -476,6 +886,61 @@ public class FileController {
 
     }
 
+
+
+
+
+
+    @Operation(summary = "获取文件树", description = "文件移动的时候需要用到该接口,用来展示目录树", tags = {"file"})
+    @RequestMapping(value = "/getCommonFileTree", method = RequestMethod.GET)
+    @ResponseBody
+    public RestResult<TreeNode> getCommonFileTree() {
+        RestResult<TreeNode> result = new RestResult<TreeNode>();
+
+        String userId = commonUserId;
+        List<UserFile> userFileList = userFileService.selectFilePathTreeByUserId(userId);
+        TreeNode resultTreeNode = new TreeNode();
+        resultTreeNode.setLabel(QiwenFile.separator);
+        resultTreeNode.setId(0L);
+        long id = 1;
+        for (int i = 0; i < userFileList.size(); i++){
+            UserFile userFile = userFileList.get(i);
+            QiwenFile qiwenFile = new QiwenFile(userFile.getFilePath(), userFile.getFileName(), false);
+            String filePath = qiwenFile.getPath();
+
+            Queue<String> queue = new LinkedList<>();
+
+            String[] strArr = filePath.split(QiwenFile.separator);
+            for (int j = 0; j < strArr.length; j++){
+                if (!"".equals(strArr[j]) && strArr[j] != null){
+                    queue.add(strArr[j]);
+                }
+
+            }
+            if (queue.size() == 0){
+                continue;
+            }
+
+            resultTreeNode = fileDealComp.insertTreeNode(resultTreeNode, id++, QiwenFile.separator, queue);
+
+
+        }
+        List<TreeNode> treeNodeList = resultTreeNode.getChildren();
+        Collections.sort(treeNodeList, (o1, o2) -> {
+            long i = o1.getId() - o2.getId();
+            return (int) i;
+        });
+        result.setSuccess(true);
+        result.setData(resultTreeNode);
+        return result;
+
+    }
+
+
+
+
+
+
     @Operation(summary = "修改文件", description = "支持普通文本类文件的修改", tags = {"file"})
     @RequestMapping(value = "/update", method = RequestMethod.POST)
     @ResponseBody
@@ -512,6 +977,48 @@ public class FileController {
         return RestResult.success().message("修改文件成功");
     }
 
+
+
+    @Operation(summary = "修改文件", description = "支持普通文本类文件的修改", tags = {"file"})
+    @RequestMapping(value = "/updateCommon", method = RequestMethod.POST)
+    @ResponseBody
+    public RestResult<String> updateCommon(@RequestBody UpdateFileDTO updateFileDTO) {
+//        JwtUser sessionUserBean =  SessionUtil.getSession();
+        String userId = commonUserId;
+        UserFile userFile = userFileService.getById(updateFileDTO.getUserFileId());
+        FileBean fileBean = fileService.getById(userFile.getFileId());
+        Long pointCount = fileService.getFilePointCount(userFile.getFileId());
+        String fileUrl = fileBean.getFileUrl();
+        if (pointCount > 1) {
+            fileUrl = fileDealComp.copyFile(fileBean, userFile);
+        }
+        String content = updateFileDTO.getFileContent();
+        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(content.getBytes());
+        try {
+            int fileSize = byteArrayInputStream.available();
+            fileDealComp.saveFileInputStream(fileBean.getStorageType(), fileUrl, byteArrayInputStream);
+
+            String md5Str = fileDealComp.getIdentifierByFile(fileUrl, fileBean.getStorageType());
+
+            fileService.updateFileDetail(userFile.getUserFileId(), md5Str, fileSize);
+
+
+        } catch (Exception e) {
+            throw new QiwenException(999999, "修改文件异常");
+        } finally {
+            try {
+                byteArrayInputStream.close();
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return RestResult.success().message("修改文件成功");
+    }
+
+
+
+
+
     @Operation(summary = "查询文件详情", description = "查询文件详情", tags = {"file"})
     @RequestMapping(value = "/detail", method = RequestMethod.GET)
     @ResponseBody
@@ -523,5 +1030,13 @@ public class FileController {
 
 
 
+    @Operation(summary = "查询文件详情", description = "查询文件详情", tags = {"file"})
+    @RequestMapping(value = "/detailCommon", method = RequestMethod.GET)
+    @ResponseBody
+    public RestResult<FileDetailVO> detailCommon(
+            @Parameter(description = "用户文件Id", required = true) String userFileId){
+        FileDetailVO vo = fileService.getFileDetail(userFileId);
+        return RestResult.success().data(vo);
+    }
 
 }

+ 288 - 42
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/FiletransferController.java

@@ -1,26 +1,8 @@
 package vip.xiaonuo.disk.controller;
 
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.qiwenshare.common.anno.MyLog;
 import com.qiwenshare.common.result.RestResult;
 import com.qiwenshare.common.util.MimeUtils;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
-import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.IFileService;
-import vip.xiaonuo.disk.api.IFiletransferService;
-import vip.xiaonuo.disk.api.IUserFileService;
-import vip.xiaonuo.disk.component.FileDealComp;
-import vip.xiaonuo.disk.domain.FileBean;
-import vip.xiaonuo.disk.domain.StorageBean;
-import vip.xiaonuo.disk.domain.UserFile;
-import vip.xiaonuo.disk.dto.file.BatchDownloadFileDTO;
-import vip.xiaonuo.disk.dto.file.DownloadFileDTO;
-import vip.xiaonuo.disk.dto.file.PreviewDTO;
-import vip.xiaonuo.disk.dto.file.UploadFileDTO;
-import vip.xiaonuo.disk.io.QiwenFile;
-import vip.xiaonuo.disk.service.StorageService;
-import vip.xiaonuo.disk.vo.file.UploadFileVo;
 import com.qiwenshare.ufop.factory.UFOPFactory;
 import com.qiwenshare.ufop.operation.download.Downloader;
 import com.qiwenshare.ufop.operation.download.domain.DownloadFile;
@@ -31,10 +13,25 @@ import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.web.bind.annotation.*;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.disk.component.FileDealComp;
+import vip.xiaonuo.disk.domain.FileBean;
+import vip.xiaonuo.disk.domain.StorageBean;
+import vip.xiaonuo.disk.domain.UserFile;
+import vip.xiaonuo.disk.dto.file.BatchDownloadFileDTO;
+import vip.xiaonuo.disk.dto.file.DownloadFileDTO;
+import vip.xiaonuo.disk.dto.file.PreviewDTO;
+import vip.xiaonuo.disk.dto.file.UploadFileDTO;
+import vip.xiaonuo.disk.io.QiwenFile;
+import vip.xiaonuo.disk.service.IFileService;
+import vip.xiaonuo.disk.service.IFiletransferService;
+import vip.xiaonuo.disk.service.IUserFileService;
+import vip.xiaonuo.disk.service.impl.StorageService;
+import vip.xiaonuo.disk.vo.file.UploadFileVo;
 
 import javax.annotation.Resource;
-import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
@@ -66,6 +63,9 @@ public class FiletransferController {
     @Resource
     UFOPFactory ufopFactory;
 
+    @Value("${common.account}")
+    private String commonUserId;
+
 
     public static final String CURRENT_MODULE = "文件传输接口";
 
@@ -80,11 +80,29 @@ public class FiletransferController {
         if (!isCheckSuccess) {
             return RestResult.fail().message("存储空间不足");
         }
-        UploadFileVo uploadFileVo = filetransferService.uploadFileSpeed(uploadFileDto);
+        UploadFileVo uploadFileVo = filetransferService.uploadFileSpeed(userId,uploadFileDto);
+        return RestResult.success().data(uploadFileVo);
+
+    }
+
+
+    @Operation(summary = "极速上传", description = "校验文件MD5判断文件是否存在,如果存在直接上传成功并返回skipUpload=true,如果不存在返回skipUpload=false需要再次调用该接口的POST方法", tags = {"filetransfer"})
+    @RequestMapping(value = "/uploadCommonFile", method = RequestMethod.GET)
+    @MyLog(operation = "极速上传", module = CURRENT_MODULE)
+    @ResponseBody
+    public RestResult<UploadFileVo> uploadCommonFile(UploadFileDTO uploadFileDto) {
+        String userId = commonUserId;
+
+        boolean isCheckSuccess = storageService.checkStorage(userId, uploadFileDto.getTotalSize());
+        if (!isCheckSuccess) {
+            return RestResult.fail().message("存储空间不足");
+        }
+        UploadFileVo uploadFileVo = filetransferService.uploadFileSpeed(userId,uploadFileDto);
         return RestResult.success().data(uploadFileVo);
 
     }
 
+
     @Operation(summary = "上传文件", description = "真正的上传文件接口", tags = {"filetransfer"})
     @RequestMapping(value = "/uploadfile", method = RequestMethod.POST)
     @MyLog(operation = "上传文件", module = CURRENT_MODULE)
@@ -98,21 +116,76 @@ public class FiletransferController {
         return RestResult.success().data(uploadFileVo);
 
     }
+    @Operation(summary = "上传文件", description = "真正的上传文件接口", tags = {"filetransfer"})
+    @RequestMapping(value = "/uploadCommonFile", method = RequestMethod.POST)
+    @MyLog(operation = "上传文件", module = CURRENT_MODULE)
+    @ResponseBody
+    public RestResult<UploadFileVo> uploadCommonFile(HttpServletRequest request, UploadFileDTO uploadFileDto) {
+        String userId =commonUserId;
+
+        filetransferService.uploadFile(request, uploadFileDto, userId);
+
+        UploadFileVo uploadFileVo = new UploadFileVo();
+        return RestResult.success().data(uploadFileVo);
 
+    }
 
     @Operation(summary = "下载文件", description = "下载文件接口", tags = {"filetransfer"})
     @MyLog(operation = "下载文件", module = CURRENT_MODULE)
     @RequestMapping(value = "/downloadfile", method = RequestMethod.GET)
     public void downloadFile(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, DownloadFileDTO downloadFileDTO) {
-        Cookie[] cookieArr = httpServletRequest.getCookies();
+//        Cookie[] cookieArr = httpServletRequest.getCookies();
         String token = "";
-        if (cookieArr != null) {
-            for (Cookie cookie : cookieArr) {
-                if ("token".equals(cookie.getName())) {
-                    token = cookie.getValue();
-                }
-            }
+//        if (cookieArr != null) {
+//            for (Cookie cookie : cookieArr) {
+//                if ("token".equals(cookie.getName())) {
+//                    token = cookie.getValue();
+//                }
+//            }
+//        }
+        boolean authResult = fileDealComp.checkAuthDownloadAndPreview(downloadFileDTO.getShareBatchNum(),
+                downloadFileDTO.getExtractionCode(),
+                token,
+                downloadFileDTO.getUserFileId(), null);
+        if (!authResult) {
+            log.error("没有权限下载!!!");
+            return;
         }
+        httpServletResponse.setContentType("application/force-download");// 设置强制下载不打开
+        UserFile userFile = userFileService.getById(downloadFileDTO.getUserFileId());
+        String fileName = "";
+        if (userFile.getIsDir() == 1) {
+            fileName = userFile.getFileName() + ".zip";
+        } else {
+            fileName = userFile.getFileName() + "." + userFile.getExtendName();
+
+        }
+        try {
+            fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        httpServletResponse.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名
+
+        filetransferService.downloadFile(httpServletResponse, downloadFileDTO);
+    }
+
+
+
+    @Operation(summary = "下载文件", description = "下载文件接口", tags = {"filetransfer"})
+    @MyLog(operation = "下载文件", module = CURRENT_MODULE)
+    @RequestMapping(value = "/downloadCommonFile", method = RequestMethod.GET)
+    public void downloadCommonFile(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, DownloadFileDTO downloadFileDTO) {
+//        Cookie[] cookieArr = httpServletRequest.getCookies();
+        String token = "";
+//        if (cookieArr != null) {
+//            for (Cookie cookie : cookieArr) {
+//                if ("token".equals(cookie.getName())) {
+//                    token = cookie.getValue();
+//                }
+//            }
+//        }
         boolean authResult = fileDealComp.checkAuthDownloadAndPreview(downloadFileDTO.getShareBatchNum(),
                 downloadFileDTO.getExtractionCode(),
                 token,
@@ -141,20 +214,76 @@ public class FiletransferController {
         filetransferService.downloadFile(httpServletResponse, downloadFileDTO);
     }
 
+
+
+
+
+
+
+
     @Operation(summary = "批量下载文件", description = "批量下载文件", tags = {"filetransfer"})
     @RequestMapping(value = "/batchDownloadFile", method = RequestMethod.GET)
     @MyLog(operation = "批量下载文件", module = CURRENT_MODULE)
     @ResponseBody
     public void batchDownloadFile(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BatchDownloadFileDTO batchDownloadFileDTO) {
-        Cookie[] cookieArr = httpServletRequest.getCookies();
+//        Cookie[] cookieArr = httpServletRequest.getCookies();
         String token = "";
-        if (cookieArr != null) {
-            for (Cookie cookie : cookieArr) {
-                if ("token".equals(cookie.getName())) {
-                    token = cookie.getValue();
-                }
+//        if (cookieArr != null) {
+//            for (Cookie cookie : cookieArr) {
+//                if ("token".equals(cookie.getName())) {
+//                    token = cookie.getValue();
+//                }
+//            }
+//        }
+        boolean authResult = fileDealComp.checkAuthDownloadAndPreview(batchDownloadFileDTO.getShareBatchNum(),
+                batchDownloadFileDTO.getExtractionCode(),
+                token,
+                batchDownloadFileDTO.getUserFileIds(), null);
+        if (!authResult) {
+            log.error("没有权限下载!!!");
+            return;
+        }
+
+        String files = batchDownloadFileDTO.getUserFileIds();
+        String[] userFileIdStrs = files.split(",");
+        List<String> userFileIds = new ArrayList<>();
+        for(String userFileId : userFileIdStrs) {
+            UserFile userFile = userFileService.getById(userFileId);
+            if (userFile.getIsDir() == 0) {
+                userFileIds.add(userFileId);
+            } else {
+                QiwenFile qiwenFile = new QiwenFile(userFile.getFilePath(), userFile.getFileName(), true);
+                List<UserFile> userFileList = userFileService.selectUserFileByLikeRightFilePath(qiwenFile.getPath(), userFile.getUserId());
+                List<String> userFileIds1 = userFileList.stream().map(UserFile::getUserFileId).collect(Collectors.toList());
+                userFileIds.add(userFile.getUserFileId());
+                userFileIds.addAll(userFileIds1);
             }
+
         }
+        UserFile userFile = userFileService.getById(userFileIdStrs[0]);
+        httpServletResponse.setContentType("application/force-download");// 设置强制下载不打开
+        Date date = new Date();
+        String fileName = String.valueOf(date.getTime());
+        httpServletResponse.addHeader("Content-Disposition", "attachment;fileName=" + fileName + ".zip");// 设置文件名
+        filetransferService.downloadUserFileList(httpServletResponse, userFile.getFilePath(), fileName, userFileIds);
+    }
+
+
+
+    @Operation(summary = "批量下载文件", description = "批量下载文件", tags = {"filetransfer"})
+    @RequestMapping(value = "/batchCommonDownloadFile", method = RequestMethod.GET)
+    @MyLog(operation = "批量下载文件", module = CURRENT_MODULE)
+    @ResponseBody
+    public void batchCommonDownloadFile(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, BatchDownloadFileDTO batchDownloadFileDTO) {
+//        Cookie[] cookieArr = httpServletRequest.getCookies();
+        String token = "";
+//        if (cookieArr != null) {
+//            for (Cookie cookie : cookieArr) {
+//                if ("token".equals(cookie.getName())) {
+//                    token = cookie.getValue();
+//                }
+//            }
+//        }
         boolean authResult = fileDealComp.checkAuthDownloadAndPreview(batchDownloadFileDTO.getShareBatchNum(),
                 batchDownloadFileDTO.getExtractionCode(),
                 token,
@@ -188,6 +317,10 @@ public class FiletransferController {
         filetransferService.downloadUserFileList(httpServletResponse, userFile.getFilePath(), fileName, userFileIds);
     }
 
+
+
+
+
     @Operation(summary="预览文件", description="用于文件预览", tags = {"filetransfer"})
     @GetMapping("/preview")
     public void preview(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,  PreviewDTO previewDTO) throws IOException {
@@ -196,20 +329,110 @@ public class FiletransferController {
             filetransferService.previewPictureFile(httpServletResponse, previewDTO);
             return ;
         }
+        // token逻辑去掉
         String token = "";
-        if (StringUtils.isNotEmpty(previewDTO.getToken())) {
-            token = previewDTO.getToken();
-        } else {
-            Cookie[] cookieArr = httpServletRequest.getCookies();
-            if (cookieArr != null) {
-                for (Cookie cookie : cookieArr) {
-                    if ("token".equals(cookie.getName())) {
-                        token = cookie.getValue();
-                    }
+
+        UserFile userFile = userFileService.getById(previewDTO.getUserFileId());
+        boolean authResult = fileDealComp.checkAuthDownloadAndPreview(previewDTO.getShareBatchNum(),
+                previewDTO.getExtractionCode(),
+                token,
+                previewDTO.getUserFileId(),
+                previewDTO.getPlatform());
+
+        if (!authResult) {
+            log.error("没有权限预览!!!");
+            return;
+        }
+
+        String fileName = userFile.getFileName() + "." + userFile.getExtendName();
+        try {
+            fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");
+        } catch (UnsupportedEncodingException e) {
+            e.printStackTrace();
+        }
+
+        httpServletResponse.addHeader("Content-Disposition", "fileName=" + fileName);// 设置文件名
+        String mime = MimeUtils.getMime(userFile.getExtendName());
+        httpServletResponse.setHeader("Content-Type", mime);
+        if (UFOPUtils.isImageFile(userFile.getExtendName())) {
+            httpServletResponse.setHeader("cache-control", "public");
+        }
+
+        FileBean fileBean = fileService.getById(userFile.getFileId());
+        if (UFOPUtils.isVideoFile(userFile.getExtendName()) || "mp3".equalsIgnoreCase(userFile.getExtendName()) || "flac".equalsIgnoreCase(userFile.getExtendName())) {
+            //获取从那个字节开始读取文件
+            String rangeString = httpServletRequest.getHeader("Range");
+            int start = 0;
+            if (StringUtils.isNotBlank(rangeString)) {
+                start = Integer.parseInt(rangeString.substring(rangeString.indexOf("=") + 1, rangeString.indexOf("-")));
+            }
+
+            Downloader downloader = ufopFactory.getDownloader(fileBean.getStorageType());
+            DownloadFile downloadFile = new DownloadFile();
+            downloadFile.setFileUrl(fileBean.getFileUrl());
+            Range range = new Range();
+            range.setStart(start);
+
+            if (start + 1024 * 1024 * 1 >= fileBean.getFileSize().intValue()) {
+                range.setLength(fileBean.getFileSize().intValue() - start);
+            } else {
+                range.setLength(1024 * 1024 * 1);
+            }
+            downloadFile.setRange(range);
+            InputStream inputStream = downloader.getInputStream(downloadFile);
+
+            OutputStream outputStream = httpServletResponse.getOutputStream();
+            try {
+
+                //返回码需要为206,代表只处理了部分请求,响应了部分数据
+
+                httpServletResponse.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
+                // 每次请求只返回1MB的视频流
+
+                httpServletResponse.setHeader("Accept-Ranges", "bytes");
+                //设置此次相应返回的数据范围
+                httpServletResponse.setHeader("Content-Range", "bytes " + start + "-" + (fileBean.getFileSize() - 1) + "/" + fileBean.getFileSize());
+                IOUtils.copy(inputStream, outputStream);
+
+
+            } finally {
+                IOUtils.closeQuietly(inputStream);
+                IOUtils.closeQuietly(outputStream);
+                if (downloadFile.getOssClient() != null) {
+                    downloadFile.getOssClient().shutdown();
                 }
             }
+
+        } else {
+            filetransferService.previewFile(httpServletResponse, previewDTO);
         }
 
+    }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+    @Operation(summary="预览文件", description="用于文件预览", tags = {"filetransfer"})
+    @GetMapping("/previewCommon")
+    public void previewCommon(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse,  PreviewDTO previewDTO) throws IOException {
+
+        if (previewDTO.getPlatform() != null && previewDTO.getPlatform() == 2) {
+            filetransferService.previewPictureFile(httpServletResponse, previewDTO);
+            return ;
+        }
+        // token逻辑去掉
+        String token = "";
+
         UserFile userFile = userFileService.getById(previewDTO.getUserFileId());
         boolean authResult = fileDealComp.checkAuthDownloadAndPreview(previewDTO.getShareBatchNum(),
                 previewDTO.getExtractionCode(),
@@ -287,6 +510,10 @@ public class FiletransferController {
 
     }
 
+
+
+
+
     @Operation(summary = "获取存储信息", description = "获取存储信息", tags = {"filetransfer"})
     @RequestMapping(value = "/getstorage", method = RequestMethod.GET)
     @ResponseBody
@@ -309,5 +536,24 @@ public class FiletransferController {
 
     }
 
+    @Operation(summary = "获取存储信息", description = "获取存储信息", tags = {"filetransfer"})
+    @RequestMapping(value = "/getCommonStorage", method = RequestMethod.GET)
+    @ResponseBody
+    public RestResult<StorageBean> getCommonStorage() {
+
+        String userId = commonUserId;
+        StorageBean storageBean = new StorageBean();
+
+        storageBean.setUserId(userId);
+
 
+        Long storageSize = filetransferService.selectStorageSizeByUserId(userId);
+        StorageBean storage = new StorageBean();
+        storage.setUserId(userId);
+        storage.setStorageSize(storageSize);
+        Long totalStorageSize = storageService.getTotalStorageSize(userId);
+        storage.setTotalStorageSize(totalStorageSize);
+        return RestResult.success().data(storage);
+
+    }
 }

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/NoticeController.java

@@ -2,7 +2,7 @@ package vip.xiaonuo.disk.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.qiwenshare.common.result.RestResult;
-import vip.xiaonuo.disk.api.INoticeService;
+import vip.xiaonuo.disk.service.INoticeService;
 import vip.xiaonuo.disk.domain.Notice;
 import vip.xiaonuo.disk.dto.notice.NoticeListDTO;
 import io.swagger.v3.oas.annotations.Operation;

+ 3 - 15
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/OfficeController.java

@@ -1,23 +1,17 @@
 package vip.xiaonuo.disk.controller;
 
-import cn.hutool.core.util.IdUtil;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
-import com.baomidou.mybatisplus.core.toolkit.ClassUtils;
 import com.qiwenshare.common.exception.NotLoginException;
 import com.qiwenshare.common.result.RestResult;
-import com.qiwenshare.common.util.DateUtil;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.IFileService;
-import vip.xiaonuo.disk.api.IUserFileService;
-import vip.xiaonuo.disk.api.IUserService;
+import vip.xiaonuo.disk.service.IFileService;
+import vip.xiaonuo.disk.service.IUserFileService;
+import vip.xiaonuo.disk.service.IUserService;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.domain.FileBean;
 import vip.xiaonuo.disk.domain.UserFile;
 import vip.xiaonuo.disk.domain.user.UserBean;
-import vip.xiaonuo.disk.dto.file.CreateOfficeFileDTO;
 import vip.xiaonuo.disk.dto.file.EditOfficeFileDTO;
 import vip.xiaonuo.disk.dto.file.PreviewOfficeFileDTO;
 import vip.xiaonuo.disk.office.documentserver.managers.history.HistoryManager;
@@ -28,8 +22,6 @@ import vip.xiaonuo.disk.office.entities.User;
 import vip.xiaonuo.disk.office.services.configurers.FileConfigurer;
 import vip.xiaonuo.disk.office.services.configurers.wrappers.DefaultFileWrapper;
 import com.qiwenshare.ufop.factory.UFOPFactory;
-import com.qiwenshare.ufop.operation.copy.Copier;
-import com.qiwenshare.ufop.operation.copy.domain.CopyFile;
 import com.qiwenshare.ufop.operation.download.domain.DownloadFile;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -43,17 +35,13 @@ import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.PrintWriter;
 import java.net.HttpURLConnection;
 import java.net.URL;
-import java.net.URLDecoder;
-import java.util.List;
 import java.util.Locale;
 import java.util.Scanner;
-import java.util.UUID;
 
 @Tag(name = "office", description = "该接口为Onlyoffice文件操作接口,主要用来做一些文档的编辑,浏览等。")
 @RestController

+ 1 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/RecoveryFileController.java

@@ -1,18 +1,15 @@
 package vip.xiaonuo.disk.controller;
 
-import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qiwenshare.common.anno.MyLog;
 import com.qiwenshare.common.result.RestResult;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.*;
 import vip.xiaonuo.disk.component.AsyncTaskComp;
 import vip.xiaonuo.disk.domain.RecoveryFile;
 import vip.xiaonuo.disk.dto.file.DeleteRecoveryFileDTO;
 import vip.xiaonuo.disk.dto.recoveryfile.BatchDeleteRecoveryFileDTO;
 import vip.xiaonuo.disk.dto.recoveryfile.RestoreFileDTO;
+import vip.xiaonuo.disk.service.*;
 import vip.xiaonuo.disk.vo.file.RecoveryFileListVo;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;

+ 5 - 7
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/ShareController.java

@@ -9,12 +9,10 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qiwenshare.common.anno.MyLog;
 import com.qiwenshare.common.result.RestResult;
 import com.qiwenshare.common.util.DateUtil;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.IShareFileService;
-import vip.xiaonuo.disk.api.IShareService;
-import vip.xiaonuo.disk.api.IUserFileService;
+import vip.xiaonuo.disk.service.IShareFileService;
+import vip.xiaonuo.disk.service.IShareService;
+import vip.xiaonuo.disk.service.IUserFileService;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.domain.Share;
 import vip.xiaonuo.disk.domain.ShareFile;
@@ -150,7 +148,7 @@ public class ShareController {
                     userFile1.setUserId(userId);
                     userFile1.setFilePath(userFile1.getFilePath().replaceFirst(QiwenFile.formatPath(filePath + "/" + fileName), QiwenFile.formatPath(savefilePath + "/" + savefileName)));
                     saveUserFileList.add(userFile1);
-                    log.info("当前文件:" + JSON.toJSONString(userFile1));
+//                    log.info("当前文件:" + JSON.toJSONString(userFile1));
                 }
             }
             userFile2.setUserFileId(IdUtil.getSnowflakeNextIdStr());
@@ -160,7 +158,7 @@ public class ShareController {
             saveUserFileList.add(userFile2);
 
         }
-        log.info("----------" + JSON.toJSONString(saveUserFileList));
+//        log.info("----------" + JSON.toJSONString(saveUserFileList));
         userFileService.saveBatch(saveUserFileList);
 
         return RestResult.success();

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/SysParamController.java

@@ -3,7 +3,7 @@ package vip.xiaonuo.disk.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qiwenshare.common.result.RestResult;
-import vip.xiaonuo.disk.api.ISysParamService;
+import vip.xiaonuo.disk.service.ISysParamService;
 import vip.xiaonuo.disk.domain.SysParam;
 import vip.xiaonuo.disk.dto.param.QueryGroupParamDTO;
 import io.swagger.v3.oas.annotations.Operation;

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/TaskController.java

@@ -2,12 +2,12 @@ package vip.xiaonuo.disk.controller;
 
 import co.elastic.clients.elasticsearch.ElasticsearchClient;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import vip.xiaonuo.disk.api.IShareFileService;
+import vip.xiaonuo.disk.service.IShareFileService;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.domain.ShareFile;
 import vip.xiaonuo.disk.domain.UserFile;
 import vip.xiaonuo.disk.io.QiwenFile;
-import vip.xiaonuo.disk.service.UserFileService;
+import vip.xiaonuo.disk.service.impl.UserFileService;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Scheduled;

+ 42 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/TranscodingController.java

@@ -0,0 +1,42 @@
+package vip.xiaonuo.disk.controller;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.disk.dto.file.TranscodingReqDTO;
+import vip.xiaonuo.disk.service.TranscodingService;
+
+import javax.annotation.Resource;
+
+/**
+ * 资源转码controller
+ *
+ * @author jinjilong
+ */
+@RestController
+@Slf4j
+@Validated
+public class TranscodingController {
+
+    @Resource
+    private TranscodingService transcodingService;
+
+
+    /**
+     * 视频资源转码
+     *
+     * @param transcodingReqDTO 转码请求
+     * @return 转码结果
+     *
+     * @author jinjilong
+     */
+    @PostMapping("/transcoding/file")
+    public CommonResult<String> transcodingVideo(@RequestBody TranscodingReqDTO transcodingReqDTO) {
+        return transcodingService.transcodingVideo(transcodingReqDTO);
+    }
+
+
+}

+ 2 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/controller/UserController.java

@@ -6,12 +6,10 @@ import com.qiwenshare.common.anno.MyLog;
 import com.qiwenshare.common.result.RestResult;
 import com.qiwenshare.common.util.DateUtil;
 import com.qiwenshare.common.util.HashUtils;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
 import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
 import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.IUserLoginInfoService;
-import vip.xiaonuo.disk.api.IUserService;
+import vip.xiaonuo.disk.service.IUserLoginInfoService;
+import vip.xiaonuo.disk.service.IUserService;
 import vip.xiaonuo.disk.component.JwtComp;
 import vip.xiaonuo.disk.domain.UserLoginInfo;
 import vip.xiaonuo.disk.domain.user.UserBean;

+ 2 - 6
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/UserFile.java

@@ -5,17 +5,13 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.qiwenshare.common.util.DateUtil;
-import vip.xiaonuo.disk.io.QiwenFile;
 import lombok.Data;
-import lombok.Getter;
+import vip.xiaonuo.disk.io.QiwenFile;
 
 import javax.persistence.*;
-import javax.validation.constraints.NotNull;
 
 @Data
-@Table(name = "userfile", uniqueConstraints = {
-        @UniqueConstraint(name = "fileindex", columnNames = {"userId", "filePath", "fileName", "extendName", "deleteFlag", "isDir"})
-})
+@Table(name = "userfile")
 @Entity
 @TableName("userfile")
 public class UserFile {

+ 3 - 3
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/domain/user/UserBean.java

@@ -13,9 +13,9 @@ import javax.persistence.*;
  * @author ma116
  */
 @Data
-@Table(name = "user")
-@Entity
-@TableName("user")
+//@Table(name = "user")
+//@Entity
+//@TableName("user")
 public class UserBean {
 
     @Id

+ 31 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/dto/file/TranscodingReqDTO.java

@@ -0,0 +1,31 @@
+package vip.xiaonuo.disk.dto.file;
+
+import lombok.Data;
+
+/**
+ * 资源转码 请求参数
+ *
+ * @author jinjilong
+ */
+@Data
+public class TranscodingReqDTO {
+
+    /**
+     * 文件id
+     */
+    private String fileId;
+
+    /**
+     * 转码类型 0: 视频 1: 文档
+     */
+    private Integer transcodingType;
+
+    /**
+     * 转码格式
+     * 视频:mp4 wmv avi flv mpeg mpg rmvb mov
+     * 文档:pdf doc docx ppt pptx xls xlsx
+     */
+    private String format;
+
+
+}

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/mapper/mapping/ShareMapper.xml

@@ -25,7 +25,7 @@
         LEFT JOIN sharefile b ON b.SHARE_BATCH_NUM = a.SHARE_BATCH_NUM
         LEFT JOIN userfile c ON c.USER_FILE_ID = b.USER_FILE_ID
         LEFT JOIN file d ON d.FILE_ID = c.FILE_ID
-        WHERE shareFilePath = #{shareFilePath}
+        WHERE SHARE_FILE_PATH = #{shareFilePath}
         <if test="shareBatchNum != null">
             AND a.SHARE_BATCH_NUM = #{shareBatchNum}
         </if>

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/provider/NetDiskApiProvider.java

@@ -2,7 +2,7 @@ package vip.xiaonuo.disk.provider;
 
 import org.springframework.stereotype.Service;
 import vip.xiaonuo.disk.api.NetDiskApi;
-import vip.xiaonuo.disk.service.UserService;
+import vip.xiaonuo.disk.service.impl.UserService;
 
 import javax.annotation.Resource;
 

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/ICommonFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ICommonFileService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.CommonFile;

+ 0 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IElasticSearchService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IElasticSearchService.java


+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IFilePermissionService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IFilePermissionService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.FilePermission;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IFileService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.FileBean;

+ 2 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IFiletransferService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IFiletransferService.java

@@ -1,12 +1,10 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import vip.xiaonuo.disk.domain.FileBean;
-import vip.xiaonuo.disk.domain.UserFile;
 import vip.xiaonuo.disk.dto.file.DownloadFileDTO;
 import vip.xiaonuo.disk.dto.file.PreviewDTO;
 import vip.xiaonuo.disk.dto.file.UploadFileDTO;
 import vip.xiaonuo.disk.vo.file.UploadFileVo;
-import com.qiwenshare.ufop.constant.StorageTypeEnum;
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
@@ -14,7 +12,7 @@ import java.util.List;
 
 public interface IFiletransferService {
 
-    UploadFileVo uploadFileSpeed(UploadFileDTO uploadFileDTO);
+    UploadFileVo uploadFileSpeed(String userId,UploadFileDTO uploadFileDTO);
 
     void uploadFile(HttpServletRequest request, UploadFileDTO UploadFileDto, String userId);
 

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/INoticeService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/INoticeService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IOperationLogService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IOperationLogService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 
 import com.baomidou.mybatisplus.core.metadata.IPage;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IRecoveryFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IRecoveryFileService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.RecoveryFile;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IShareFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IShareFileService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.Share;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IShareService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IShareService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.RecoveryFile;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IStorageService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IStorageService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.StorageBean;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/ISysParamService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ISysParamService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.SysParam;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IUploadTaskDetailService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUploadTaskDetailService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.UploadTaskDetail;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IUploadTaskService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUploadTaskService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.UploadTask;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IUserFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUserFileService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IUserLoginInfoService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUserLoginInfoService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import vip.xiaonuo.disk.domain.UserLoginInfo;

+ 1 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/api/IUserService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/IUserService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.api;
+package vip.xiaonuo.disk.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qiwenshare.common.result.RestResult;

+ 22 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/TranscodingService.java

@@ -0,0 +1,22 @@
+package vip.xiaonuo.disk.service;
+
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.disk.dto.file.TranscodingReqDTO;
+
+/**
+ * 资源转码 service
+ */
+public interface TranscodingService {
+
+    /**
+     * 视频资源转码
+     *
+     * @param transcodingReqDTO 转码请求
+     * @return 转码结果
+     *
+     * @author jinjilong
+     */
+    CommonResult<String> transcodingVideo(TranscodingReqDTO transcodingReqDTO);
+
+
+}

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/CommonFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/CommonFileService.java

@@ -1,7 +1,7 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.ICommonFileService;
+import vip.xiaonuo.disk.service.ICommonFileService;
 import vip.xiaonuo.disk.domain.CommonFile;
 import vip.xiaonuo.disk.mapper.CommonFileMapper;
 import vip.xiaonuo.disk.vo.commonfile.CommonFileListVo;

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/FilePermissionService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/FilePermissionService.java

@@ -1,7 +1,7 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IFilePermissionService;
+import vip.xiaonuo.disk.service.IFilePermissionService;
 import vip.xiaonuo.disk.domain.FilePermission;
 import vip.xiaonuo.disk.mapper.FilePermissionMapper;
 import lombok.extern.slf4j.Slf4j;

+ 2 - 4
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/FileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/FileService.java

@@ -1,16 +1,14 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qiwenshare.common.exception.QiwenException;
 import com.qiwenshare.common.operation.FileOperation;
 import com.qiwenshare.common.util.DateUtil;
 import com.qiwenshare.common.util.security.SessionUtil;
-import vip.xiaonuo.disk.api.IFileService;
+import vip.xiaonuo.disk.service.IFileService;
 import vip.xiaonuo.disk.component.AsyncTaskComp;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.domain.FileBean;

+ 14 - 17
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/FiletransferService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/FiletransferService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson2.JSON;
@@ -7,18 +7,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.qiwenshare.common.util.DateUtil;
 import com.qiwenshare.common.util.MimeUtils;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
-import vip.xiaonuo.disk.api.IFiletransferService;
-import vip.xiaonuo.disk.component.FileDealComp;
-import vip.xiaonuo.disk.domain.*;
-import vip.xiaonuo.disk.dto.file.DownloadFileDTO;
-import vip.xiaonuo.disk.dto.file.PreviewDTO;
-import vip.xiaonuo.disk.dto.file.UploadFileDTO;
-import vip.xiaonuo.disk.io.QiwenFile;
-import vip.xiaonuo.disk.mapper.*;
-import vip.xiaonuo.disk.util.QiwenFileUtil;
-import vip.xiaonuo.disk.vo.file.UploadFileVo;
 import com.qiwenshare.ufop.constant.StorageTypeEnum;
 import com.qiwenshare.ufop.constant.UploadFileStatusEnum;
 import com.qiwenshare.ufop.exception.operation.DownloadException;
@@ -39,6 +27,15 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.disk.component.FileDealComp;
+import vip.xiaonuo.disk.domain.*;
+import vip.xiaonuo.disk.dto.file.DownloadFileDTO;
+import vip.xiaonuo.disk.dto.file.PreviewDTO;
+import vip.xiaonuo.disk.dto.file.UploadFileDTO;
+import vip.xiaonuo.disk.io.QiwenFile;
+import vip.xiaonuo.disk.mapper.*;
+import vip.xiaonuo.disk.service.IFiletransferService;
+import vip.xiaonuo.disk.vo.file.UploadFileVo;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
@@ -86,7 +83,7 @@ public class FiletransferService implements IFiletransferService {
     public static Executor exec = Executors.newFixedThreadPool(20);
 
     @Override
-    public UploadFileVo uploadFileSpeed(UploadFileDTO uploadFileDTO) {
+    public UploadFileVo uploadFileSpeed(String userId,UploadFileDTO uploadFileDTO) {
         UploadFileVo uploadFileVo = new UploadFileVo();
         Map<String, Object> param = new HashMap<>();
         param.put("identifier", uploadFileDTO.getIdentifier());
@@ -103,7 +100,7 @@ public class FiletransferService implements IFiletransferService {
 
         if (list != null && !list.isEmpty()) {
             FileBean file = list.get(0);
-            UserFile userFile = new UserFile(qiwenFile, SessionUtil.getUserId(), file.getFileId());
+            UserFile userFile = new UserFile(qiwenFile, userId, file.getFileId());
 
             try {
                 userFileMapper.insert(userFile);
@@ -116,7 +113,7 @@ public class FiletransferService implements IFiletransferService {
             if (relativePath.contains("/")) {
                 QiwenFile finalQiwenFile = qiwenFile;
                 exec.execute(()->{
-                    fileDealComp.restoreParentFilePath(finalQiwenFile, SessionUtil.getUserId());
+                    fileDealComp.restoreParentFilePath(finalQiwenFile, userId);
                 });
 
             }
@@ -141,7 +138,7 @@ public class FiletransferService implements IFiletransferService {
                     uploadTask.setFileName(qiwenFile.getNameNotExtend());
                     uploadTask.setFilePath(qiwenFile.getParent());
                     uploadTask.setExtendName(qiwenFile.getExtendName());
-                    uploadTask.setUserId(SessionUtil.getUserId());
+                    uploadTask.setUserId(userId);
                     uploadTaskMapper.insert(uploadTask);
                 }
             }

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/NoticeService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/NoticeService.java

@@ -1,9 +1,9 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.INoticeService;
+import vip.xiaonuo.disk.service.INoticeService;
 import vip.xiaonuo.disk.domain.Notice;
 import vip.xiaonuo.disk.dto.notice.NoticeListDTO;
 import vip.xiaonuo.disk.mapper.NoticeMapper;

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/OperationLogService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/OperationLogService.java

@@ -1,9 +1,9 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IOperationLogService;
+import vip.xiaonuo.disk.service.IOperationLogService;
 import vip.xiaonuo.disk.domain.OperationLogBean;
 import vip.xiaonuo.disk.mapper.OperationLogMapper;
 import org.springframework.stereotype.Service;

+ 2 - 3
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/RecoveryFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/RecoveryFileService.java

@@ -1,10 +1,9 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IRecoveryFileService;
+import vip.xiaonuo.disk.service.IRecoveryFileService;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.domain.RecoveryFile;
 import vip.xiaonuo.disk.domain.UserFile;

+ 2 - 10
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ShareFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/ShareFileService.java

@@ -1,23 +1,15 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
-import com.alibaba.fastjson2.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IShareFileService;
-import vip.xiaonuo.disk.api.IShareService;
-import vip.xiaonuo.disk.domain.Share;
+import vip.xiaonuo.disk.service.IShareFileService;
 import vip.xiaonuo.disk.domain.ShareFile;
-import vip.xiaonuo.disk.domain.UserFile;
 import vip.xiaonuo.disk.mapper.ShareFileMapper;
-import vip.xiaonuo.disk.mapper.ShareMapper;
-import vip.xiaonuo.disk.mapper.UserFileMapper;
 import vip.xiaonuo.disk.vo.share.ShareFileListVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
-import java.util.ArrayList;
 import java.util.List;
 
 @Slf4j

+ 2 - 6
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/ShareService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/ShareService.java

@@ -1,14 +1,10 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IShareService;
-import vip.xiaonuo.disk.domain.RecoveryFile;
+import vip.xiaonuo.disk.service.IShareService;
 import vip.xiaonuo.disk.domain.Share;
-import vip.xiaonuo.disk.domain.ShareFile;
 import vip.xiaonuo.disk.dto.sharefile.ShareListDTO;
-import vip.xiaonuo.disk.mapper.RecoveryFileMapper;
 import vip.xiaonuo.disk.mapper.ShareMapper;
-import vip.xiaonuo.disk.vo.share.ShareFileListVO;
 import vip.xiaonuo.disk.vo.share.ShareListVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/StorageService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/StorageService.java

@@ -1,8 +1,8 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IStorageService;
+import vip.xiaonuo.disk.service.IStorageService;
 import vip.xiaonuo.disk.domain.StorageBean;
 import vip.xiaonuo.disk.domain.SysParam;
 import vip.xiaonuo.disk.mapper.StorageMapper;

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/SysParamService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/SysParamService.java

@@ -1,8 +1,8 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.ISysParamService;
+import vip.xiaonuo.disk.service.ISysParamService;
 import vip.xiaonuo.disk.domain.SysParam;
 import vip.xiaonuo.disk.mapper.SysParamMapper;
 import lombok.extern.slf4j.Slf4j;

+ 130 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/TranscodingServiceImpl.java

@@ -0,0 +1,130 @@
+package vip.xiaonuo.disk.service.impl;
+
+import cn.hutool.core.util.IdUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qiwenshare.common.util.DateUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
+import vip.xiaonuo.common.pojo.CommonResult;
+import vip.xiaonuo.disk.domain.FileBean;
+import vip.xiaonuo.disk.domain.UserFile;
+import vip.xiaonuo.disk.dto.file.TranscodingReqDTO;
+import vip.xiaonuo.disk.mapper.FileMapper;
+import vip.xiaonuo.disk.mapper.UserFileMapper;
+import vip.xiaonuo.disk.service.TranscodingService;
+import vip.xiaonuo.disk.util.OfficeConverter;
+import vip.xiaonuo.disk.util.PdfUtils;
+import vip.xiaonuo.disk.util.VideoConverter;
+
+import javax.annotation.Resource;
+import java.util.ArrayList;
+
+/**
+ * 资源转码 service
+ * @author jinjilong
+ */
+@Service
+@Slf4j
+public class TranscodingServiceImpl implements TranscodingService {
+
+    @Resource
+    private VideoConverter videoConverter;
+
+    @Resource
+    private FileMapper fileMapper;
+
+    @Resource
+    private UserFileMapper userFileMapper;
+
+    @Resource
+    private PdfUtils pdfUtils;
+
+    @Resource
+    private OfficeConverter officeConverter;
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public CommonResult<String> transcodingVideo(TranscodingReqDTO transcodingReqDTO) {
+        // 校验目标文件是否存在,是否是本人的
+        String userId = StpLoginUserUtil.getLoginUser().getId();
+        QueryWrapper<UserFile> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(UserFile::getFileId, transcodingReqDTO.getFileId());
+        UserFile userFile = userFileMapper.selectOne(queryWrapper);
+        if (userFile == null || !userFile.getUserId().equals(userId)) {
+            return CommonResult.error("文件不存在或不是本人的");
+        }
+        FileBean fileBean = fileMapper.selectById(userFile.getFileId());
+        if (fileBean == null) {
+            return CommonResult.error("文件不存在");
+        }
+        // 构建转码格式列表
+        ArrayList<String> formatList = new ArrayList<>();
+        formatList.add(transcodingReqDTO.getFormat());
+        // 判断视频还是图片
+        if (transcodingReqDTO.getTranscodingType() == 0) {
+            try {
+                // 转码视频
+                // mp4 wmv avi flv mpeg mpg rmvb mov 互相转
+                videoConverter.convertAndUpload(fileBean.getFileUrl(), fileBean.getFileId(), new String[]{transcodingReqDTO.getFormat()});
+                // 转换后把文件信息新增到数据库
+                saveFile(userFile, fileBean, userId, transcodingReqDTO);
+            } catch (Exception ex) {
+                log.error(ex.getMessage());
+                return CommonResult.error("格式转换失败");
+            }
+        } else if (transcodingReqDTO.getTranscodingType() == 1) {
+            // 转码文档
+            // pdf doc docx ppt pptx xls xlsx
+            // doc转docx,ppt转pptx,xls转xlsx 所有均转pdf
+            // 判断目标格式
+            try {
+                if ("pdf".equals(transcodingReqDTO.getFormat())) {
+                    pdfUtils.convertToPdf(fileBean.getFileUrl(), fileBean.getFileId() + "." + transcodingReqDTO.getFormat());
+                } else {
+                    officeConverter.convertAndUpload(fileBean.getFileUrl(), fileBean.getFileId() + "." + transcodingReqDTO.getFormat());
+                }
+                // 转换后把文件信息新增到数据库
+                saveFile(userFile, fileBean, userId, transcodingReqDTO);
+            } catch (Exception ex) {
+                log.error("格式转换:"+ex.getMessage());
+                return CommonResult.error("格式转换失败");
+            }
+        }
+        return CommonResult.ok("格式转换成功");
+    }
+
+
+    /**
+     * 封装参数,存储进数据库
+     */
+    public void saveFile(UserFile userFile, FileBean fileBean, String userId, TranscodingReqDTO transcodingReqDTO) {
+        FileBean newFile = new FileBean();
+        newFile.setFileId(IdUtil.simpleUUID());
+        newFile.setFileUrl("converted/" + fileBean.getFileId() + "." + transcodingReqDTO.getFormat());
+        newFile.setCreateUserId(userId);
+        newFile.setFileSize(videoConverter.getConverterFileSize("converted/" + fileBean.getFileId() + "." + transcodingReqDTO.getFormat()));
+        newFile.setFileStatus(1);
+        newFile.setIdentifier(fileBean.getIdentifier());
+        newFile.setStorageType(3);
+        newFile.setCreateTime(DateUtil.getCurrentTime());
+        fileMapper.insert(newFile);
+        UserFile newUserFile = new UserFile();
+        newUserFile.setUserFileId(IdUtil.simpleUUID());
+        newUserFile.setCreateUserId(userId);
+        newUserFile.setDeleteFlag(0);
+        newUserFile.setExtendName(transcodingReqDTO.getFormat());
+        newUserFile.setFileId(newFile.getFileId());
+        newUserFile.setFileName(userFile.getFileName());
+        newUserFile.setFilePath(userFile.getFilePath());
+        newUserFile.setIsDir(userFile.getIsDir());
+        newUserFile.setUserId(userId);
+        newUserFile.setCreateTime(DateUtil.getCurrentTime());
+        newUserFile.setUploadTime(DateUtil.getCurrentTime());
+        userFileMapper.insert(newUserFile);
+    }
+
+
+
+}

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/UploadTaskDetailService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UploadTaskDetailService.java

@@ -1,7 +1,7 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IUploadTaskDetailService;
+import vip.xiaonuo.disk.service.IUploadTaskDetailService;
 import vip.xiaonuo.disk.domain.UploadTaskDetail;
 import vip.xiaonuo.disk.mapper.UploadTaskDetailMapper;
 import org.springframework.stereotype.Service;

+ 2 - 8
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/UploadTaskService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UploadTaskService.java

@@ -1,17 +1,11 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IUploadTaskDetailService;
-import vip.xiaonuo.disk.api.IUploadTaskService;
+import vip.xiaonuo.disk.service.IUploadTaskService;
 import vip.xiaonuo.disk.domain.UploadTask;
-import vip.xiaonuo.disk.domain.UploadTaskDetail;
-import vip.xiaonuo.disk.mapper.UploadTaskDetailMapper;
 import vip.xiaonuo.disk.mapper.UploadTaskMapper;
 import org.springframework.stereotype.Service;
 
-import javax.annotation.Resource;
-import java.util.List;
-
 @Service
 public class UploadTaskService extends ServiceImpl<UploadTaskMapper, UploadTask> implements IUploadTaskService {
 

+ 7 - 18
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/UserFileService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UserFileService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import cn.hutool.core.net.URLDecoder;
 import cn.hutool.core.util.IdUtil;
@@ -10,21 +10,18 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qiwenshare.common.constant.FileConstant;
 import com.qiwenshare.common.util.DateUtil;
-import com.qiwenshare.common.util.security.JwtUser;
-import com.qiwenshare.common.util.security.SessionUtil;
-import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
-import vip.xiaonuo.disk.api.IUserFileService;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.CollectionUtils;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import vip.xiaonuo.disk.component.FileDealComp;
 import vip.xiaonuo.disk.domain.RecoveryFile;
 import vip.xiaonuo.disk.domain.UserFile;
 import vip.xiaonuo.disk.io.QiwenFile;
 import vip.xiaonuo.disk.mapper.RecoveryFileMapper;
 import vip.xiaonuo.disk.mapper.UserFileMapper;
+import vip.xiaonuo.disk.service.IUserFileService;
 import vip.xiaonuo.disk.vo.file.FileListVO;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections4.CollectionUtils;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.nio.charset.StandardCharsets;
@@ -74,15 +71,8 @@ public class UserFileService extends ServiceImpl<UserFileMapper, UserFile> imple
     public IPage<FileListVO> userFileList(String userId, String filePath, Long currentPage, Long pageCount) {
         Page<FileListVO> page = new Page<>(currentPage, pageCount);
         UserFile userFile = new UserFile();
-//        JwtUser sessionUserBean = SessionUtil.getSession();
-        if (userId == null) {
-            userFile.setUserId(StpLoginUserUtil.getLoginUser().getId());
-        } else {
-            userFile.setUserId(userId);
-        }
-
+        userFile.setUserId(userId);
         userFile.setFilePath(URLDecoder.decodeForPath(filePath, StandardCharsets.UTF_8));
-
         return userFileMapper.selectPageVo(page, userFile, null);
     }
 
@@ -173,7 +163,6 @@ public class UserFileService extends ServiceImpl<UserFileMapper, UserFile> imple
     @Override
     public IPage<FileListVO> getFileByFileType(Integer fileTypeId, Long currentPage, Long pageCount, String userId) {
         Page<FileListVO> page = new Page<>(currentPage, pageCount);
-
         UserFile userFile = new UserFile();
         userFile.setUserId(userId);
         return userFileMapper.selectPageVo(page, userFile, fileTypeId);

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/UserLoginInfoService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UserLoginInfoService.java

@@ -1,7 +1,7 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import vip.xiaonuo.disk.api.IUserLoginInfoService;
+import vip.xiaonuo.disk.service.IUserLoginInfoService;
 import vip.xiaonuo.disk.domain.UserLoginInfo;
 import vip.xiaonuo.disk.mapper.UserLoginInfoMapper;
 import lombok.extern.slf4j.Slf4j;

+ 2 - 2
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/UserService.java → snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/service/impl/UserService.java

@@ -1,4 +1,4 @@
-package vip.xiaonuo.disk.service;
+package vip.xiaonuo.disk.service.impl;
 
 import cn.hutool.core.util.IdUtil;
 import com.alibaba.fastjson2.JSON;
@@ -9,7 +9,7 @@ import com.qiwenshare.common.util.DateUtil;
 import com.qiwenshare.common.util.HashUtils;
 import com.qiwenshare.common.util.PasswordUtil;
 import com.qiwenshare.common.util.security.JwtUser;
-import vip.xiaonuo.disk.api.IUserService;
+import vip.xiaonuo.disk.service.IUserService;
 import vip.xiaonuo.disk.component.JwtComp;
 import vip.xiaonuo.disk.component.UserDealComp;
 import vip.xiaonuo.disk.controller.UserController;

+ 172 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/OfficeConverter.java

@@ -0,0 +1,172 @@
+package vip.xiaonuo.disk.util;
+
+import io.minio.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.io.*;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+@Component
+public class OfficeConverter {
+
+
+    private final String minioEndpoint;
+    private final String accessKey;
+    private final String secretKey;
+    private final String bucketName;
+    private final MinioClient minioClient;
+
+    @Autowired
+    public OfficeConverter(
+            @Value("${ufop.minio.endpoint}") String minioEndpoint,
+            @Value("${ufop.minio.access-key}") String accessKey,
+            @Value("${ufop.minio.secret-key}") String secretKey,
+            @Value("${ufop.minio.bucket-name}") String bucketName
+    ) {
+        this.minioEndpoint = minioEndpoint;
+        this.accessKey = accessKey;
+        this.secretKey = secretKey;
+        this.bucketName = bucketName;
+        this.minioClient = MinioClient.builder()
+                .endpoint(minioEndpoint)
+                .credentials(accessKey, secretKey)
+                .build();
+    }
+
+    private static final String LIBRE_OFFICE_PATH = "soffice"; // Linux路径
+
+    public void main(String[] args) {
+        try {
+            convertAndUpload("upload/20241010/fba210e119de04088439e64b062665da.doc", "665da.docx");
+//            convertAndUpload("netdisk", "upload/20240705/7faa77badef7a854e3bf664a2ddb1a4f.ppt", "netdisk", "b1a4f.pptx");
+//            convertAndUpload("netdisk", "upload/20250611/答辩会议室号.xls", "netdisk", "室号.xlsx");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+    public void convertAndUpload(String inputFile, String outputFile) throws Exception {
+        // 1. 从MinIO下载文件
+        File tempInput = downloadFromMinio(bucketName, inputFile);
+
+        // 2. 执行LibreOffice转换
+        File tempOutput = convertWithLibreOffice(tempInput, getOutputFormat(outputFile));
+
+        // 3. 上传到MinIO
+        uploadToMinio(bucketName, outputFile, tempOutput);
+
+        // 4. 清理临时文件
+        deleteFiles(tempInput, tempOutput);
+    }
+
+    private File downloadFromMinio(String bucket, String objectName) throws Exception {
+        // 使用UUID确保唯一性
+        String uniqueId = UUID.randomUUID().toString();
+        Path tempDir = Files.createTempDirectory("minio-download-");
+        Path tempPath = tempDir.resolve(uniqueId + ".tmp");
+
+        try {
+            minioClient.downloadObject(
+                    DownloadObjectArgs.builder()
+                            .bucket(bucketName)
+                            .object(objectName)
+                            .filename(tempPath.toString())
+                            .build());
+            return tempPath.toFile();
+        } catch (Exception e) {
+            // 清理失败的文件
+            Files.deleteIfExists(tempPath);
+            Files.deleteIfExists(tempDir);
+            throw e;
+        }
+    }
+
+    private File convertWithLibreOffice(File inputFile, String outputFormat) throws Exception {
+        File outputFile = File.createTempFile("converted-", "." + outputFormat);
+
+        ProcessBuilder pb = new ProcessBuilder(
+                LIBRE_OFFICE_PATH,
+                "--headless",
+                "--convert-to", outputFormat,
+                "--outdir", outputFile.getParent(),
+                inputFile.getAbsolutePath());
+
+        Process process = pb.start();
+
+        // 等待转换完成(最长等待120秒)
+        if (!process.waitFor(120, TimeUnit.SECONDS)) {
+            process.destroyForcibly();
+            throw new RuntimeException("LibreOffice转换超时");
+        }
+
+        if (process.exitValue() != 0) {
+            throw new RuntimeException("LibreOffice转换失败,退出码: " + process.exitValue());
+        }
+
+        // 查找生成的文件(LibreOffice可能生成不同名称的文件)
+        File convertedFile = new File(outputFile.getParent(),
+                inputFile.getName().replaceAll("\\.\\w+$", "." + outputFormat));
+
+        if (!convertedFile.exists()) {
+            throw new FileNotFoundException("未找到转换后的文件: " + convertedFile.getAbsolutePath());
+        }
+
+        return convertedFile;
+    }
+
+//    private void uploadToMinio(String bucket, String objectName, File file) throws Exception {
+//        minioClient.uploadObject(
+//                UploadObjectArgs.builder()
+//                        .bucket(bucketName)
+//                        .object(objectName)
+//                        .filename("/convert")
+//                        .contentType(getMimeType(objectName))
+//                        .build());
+//    }
+
+    private void uploadToMinio(String bucket, String objectName, File file) throws Exception {
+        minioClient.uploadObject(
+                UploadObjectArgs.builder()
+                        .bucket(bucketName)
+                        .object("converted/"+objectName)
+                        .filename(file.getAbsolutePath())
+                        .contentType(getMimeType(objectName))
+                        .build());
+    }
+
+    private  void deleteFiles(File... files) {
+        for (File f : files) {
+            if (f != null && f.exists()) {
+                f.delete();
+            }
+        }
+    }
+
+    private  String getOutputFormat(String outputFile) {
+        if (outputFile.endsWith(".docx")) {
+            return "docx";
+        }
+        if (outputFile.endsWith(".pptx")) {
+            return "pptx";
+        }
+        if (outputFile.endsWith(".xlsx")) {
+            return "xlsx";
+        }
+        throw new IllegalArgumentException("不支持的输出格式: " + outputFile);
+    }
+
+    private String getMimeType(String fileName) {
+        return switch (fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase()) {
+            case "docx" -> "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
+            case "pptx" -> "application/vnd.openxmlformats-officedocument.presentationml.presentation";
+            case "xlsx" -> "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
+            default -> "application/octet-stream";
+        };
+    }
+
+}

+ 244 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/PdfUtils.java

@@ -0,0 +1,244 @@
+package vip.xiaonuo.disk.util;
+
+import io.minio.DownloadObjectArgs;
+import io.minio.MinioClient;
+import io.minio.UploadObjectArgs;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Component;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.UUID;
+
+@Component
+public class PdfUtils {
+
+    private final String minioEndpoint;
+    private final String accessKey;
+    private final String secretKey;
+    private final String bucketName;
+    private final MinioClient minioClient;
+    private final String tempDir = System.getProperty("java.io.tmpdir") + "/minio-converter/";
+
+    // 使用构造函数注入@Value属性
+    @Autowired
+    public PdfUtils(
+            @Value("${ufop.minio.endpoint}") String minioEndpoint,
+            @Value("${ufop.minio.access-key}") String accessKey,
+            @Value("${ufop.minio.secret-key}") String secretKey,
+            @Value("${ufop.minio.bucket-name}") String bucketName
+    ) {
+        this.minioEndpoint = minioEndpoint;
+        this.accessKey = accessKey;
+        this.secretKey = secretKey;
+        this.bucketName = bucketName;
+        this.minioClient = MinioClient.builder()
+                .endpoint(minioEndpoint)
+                .credentials(accessKey, secretKey)
+                .build();
+        createTempDir();
+    }
+
+    private void createTempDir() {
+        File dir = new File(tempDir);
+        if (!dir.exists() && !dir.mkdirs()) {
+            throw new RuntimeException("无法创建临时目录: " + tempDir);
+        }
+    }
+
+
+    public void main(String[] args) throws Exception {
+        convertToPdf("upload/20250611/答辩会议室号.xls","室号.pdf");
+    }
+
+//    @Async
+    public void convertToPdf(String objectName, String fileId) throws Exception {
+        long start = System.currentTimeMillis();
+        File tempFile = null;
+
+        try {
+            // 1. 下载源文件
+            tempFile = downloadFile(objectName);
+
+            // 2. 执行转换
+            String outputPath = convertToPdfLocal(tempFile.getAbsolutePath(), "convert");
+
+            // 3. 上传转换结果
+            uploadToMinio(outputPath, fileId);
+
+        } finally {
+            if (tempFile != null && tempFile.exists()) {
+                tempFile.delete();
+            }
+            cleanTempDir();
+        }
+        System.out.println("总耗时:" + (System.currentTimeMillis() - start) + "ms");
+    }
+
+    private File downloadFile(String objectName) throws Exception {
+        // 提取纯文件名(去除路径)
+        String fileName = new File(objectName).getName();
+        // 生成唯一临时文件名
+        String uniqueName = UUID.randomUUID() + "_" + fileName;
+        File tempFile = new File(tempDir, uniqueName);
+
+        minioClient.downloadObject(
+                DownloadObjectArgs.builder()
+                        .bucket(bucketName)
+                        .object(objectName)
+                        .filename(tempFile.getAbsolutePath())
+                        .build());
+        return tempFile;
+    }
+
+    // 新增路径创建工具方法
+    private void ensureDirectoryExists(String path) {
+        File dir = new File(path).getParentFile();
+        if (dir != null && !dir.exists()) {
+            if (!dir.mkdirs()) {
+                throw new RuntimeException("无法创建目录: " + dir.getAbsolutePath());
+            }
+        }
+    }
+
+    private String convertToPdfLocal(String filePath, String targetFolder) {
+        String osName = System.getProperty("os.name").toLowerCase();
+        String outputPath = tempDir + "converted_" + System.currentTimeMillis() + ".pdf";
+        // 在执行转换前确保输出目录存在
+        ensureDirectoryExists(outputPath);
+        try {
+            ProcessBuilder processBuilder = new ProcessBuilder();
+            if (osName.contains("windows")) {
+                processBuilder.command(
+                        "cmd.exe", "/c",
+                        "soffice", "--headless", "--convert-to", "pdf",
+                        filePath, "--outdir", tempDir);
+            } else {
+                processBuilder.command(
+                        "soffice", "--headless", "--convert-to", "pdf:writer_pdf_Export",
+                        filePath, "--outdir", tempDir);
+            }
+
+            Process process = processBuilder.start();
+            int exitCode = process.waitFor();
+            if (exitCode != 0) {
+                throw new RuntimeException("转换失败,退出码:" + exitCode);
+            }
+
+
+            // 查找生成的PDF文件
+            File outputDir = new File(tempDir);
+            File[] files = outputDir.listFiles((dir, name) ->
+                    name.toLowerCase().endsWith(".pdf") && !name.equals(filePath));
+
+            if (files != null && files.length > 0) {
+                File pdfFile = files[0];
+                Files.move(pdfFile.toPath(), new File(outputPath).toPath());
+                return outputPath;
+            }
+            throw new FileNotFoundException("未找到生成的PDF文件");
+
+        } catch (IOException | InterruptedException e) {
+            throw new RuntimeException("转换过程中发生错误", e);
+        }
+    }
+
+    private void uploadToMinio(String filePath, String fileId) throws Exception {
+        String fileName = new File(filePath).getName();
+
+        minioClient.uploadObject(
+                UploadObjectArgs.builder()
+                        .bucket(bucketName)
+                        .object("converted/"+fileId)
+                        .filename(filePath)
+                        .build());
+    }
+
+    private void cleanTempDir() {
+        File[] files = new File(tempDir).listFiles();
+        if (files != null) {
+            for (File file : files) {
+                if (file.getName().startsWith("converted_") ||
+                        file.getName().startsWith("temp_")) {
+                    file.delete();
+                }
+            }
+        }
+    }
+
+
+    public String getFileUrl(String objectName) {
+        return minioEndpoint + "/" + bucketName + "/" + objectName;
+    }
+
+//    public List<String> convertToPng(String pdfObjectName, int pages) throws Exception {
+//        File tempPdf = downloadFile(pdfObjectName);
+//        List<String> pngUrls = new ArrayList<>();
+//
+//        try (PDDocument document = PDDocument.load(tempPdf)) {
+//            PDFRenderer renderer = new PDFRenderer(document);
+//            String baseName = tempPdf.getName().replace(".pdf", "");
+//
+//            for (int i = 0; i < pages; i++) {
+//                BufferedImage image = renderer.renderImageWithDPI(i, 150);
+//                String outputPath = tempDir + baseName + "_" + (i + 1) + ".png";
+//                ImageIO.write(image, "PNG", new File(outputPath));
+//                uploadToMinio(outputPath, "png/" + baseName);
+//                pngUrls.add(getFileUrl("png/" + baseName + "/" + new File(outputPath).getName()));
+//            }
+//        } finally {
+//            tempPdf.delete();
+//            cleanTempDir();
+//        }
+//        return pngUrls;
+//    }
+//
+//    /***
+//     * PDF文件转PNG图片,全部页数
+//     *
+//     * @param PdfFilePath pdf文件路径 物理路径
+//     * @param dstImgFolder 图片存放的文件夹
+//     * @param dpi dpi越大转换后越清晰,相对转换速度越慢 dpi为96,100,105,120,150,200中,105显示效果较为清晰,体积稳定,dpi越高图片体积越大,一般电脑显示分辨率为96
+//     * @return
+//     */
+//    public int pdf2Image(String PdfFilePath, String dstImgFolder, int dpi) {
+//        int pages = 1;
+//        PDDocument pdDocument;
+//        try {
+//            File file = new File(PdfFilePath);
+//            while (!file.exists()) {
+//                System.out.println("文件未生成,等待1秒");
+//                Thread.sleep(1000);
+//            }
+//            pdDocument = PDDocument.load(file);
+//            int dot = PdfFilePath.lastIndexOf('.');
+//            int lastSep = PdfFilePath.lastIndexOf(File.separator) + 1;
+//            String imagePDFName = PdfFilePath.substring(lastSep, dot); // 获取图片文件名
+//
+//            PDFRenderer renderer = new PDFRenderer(pdDocument);
+//            /* dpi越大转换后越清晰,相对转换速度越慢 */
+//            pages = pdDocument.getNumberOfPages();
+//            StringBuffer imgFilePath = null;
+//            for (int i = 0; i < pages; i++) {
+//                String imgFilePathPrefix = dstImgFolder + File.separator + imagePDFName;
+//                imgFilePath = new StringBuffer();
+//                imgFilePath.append(imgFilePathPrefix);
+//                imgFilePath.append("_");
+//                imgFilePath.append(String.valueOf(i + 1));
+//                imgFilePath.append(".png");
+//                File dstFile = new File(imgFilePath.toString());
+//                BufferedImage image = renderer.renderImageWithDPI(i, dpi);
+//                ImageIO.write(image, "png", dstFile);
+//            }
+//            System.out.println("PDF文档转PNG图片成功!");
+//        } catch (IOException | InterruptedException e) {
+//            e.printStackTrace();
+//        }
+//        return pages;
+//    }
+
+}

+ 2 - 1
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/QiwenFileUtil.java

@@ -3,6 +3,7 @@ package vip.xiaonuo.disk.util;
 import cn.hutool.core.util.IdUtil;
 import com.qiwenshare.common.util.DateUtil;
 import com.qiwenshare.common.util.security.SessionUtil;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
 import vip.xiaonuo.disk.domain.UserFile;
 import vip.xiaonuo.disk.io.QiwenFile;
 
@@ -19,7 +20,7 @@ public class QiwenFileUtil {
         userFile.setExtendName(null);
         userFile.setIsDir(1);
         userFile.setUploadTime(DateUtil.getCurrentTime());
-        userFile.setCreateUserId(SessionUtil.getUserId());
+        userFile.setCreateUserId(StpLoginUserUtil.getLoginUser().getId());
         userFile.setCreateTime(DateUtil.getCurrentTime());
         userFile.setDeleteFlag(0);
         userFile.setDeleteBatchNum(null);

+ 324 - 0
snowy-plugin/snowy-plugin-disk/snowy-plugin-disk-func/src/main/java/vip/xiaonuo/disk/util/VideoConverter.java

@@ -0,0 +1,324 @@
+package vip.xiaonuo.disk.util;
+
+import io.minio.*;
+import io.minio.errors.ErrorResponseException;
+import io.minio.errors.InvalidResponseException;
+import io.minio.errors.XmlParserException;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.io.IOException;
+import java.io.*;
+import java.security.NoSuchAlgorithmException;
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public class VideoConverter {
+
+    // MinIO配置
+
+    @Value("${ufop.minio.endpoint}")
+    private String MINIO_ENDPOINT;
+    @Value("${ufop.minio.access-key}")
+    private String ACCESS_KEY;
+    @Value("${ufop.minio.secret-key}")
+    private String SECRET_KEY;
+    @Value("${ufop.minio.bucket-name}")
+    private String BUCKET_NAME;
+    @Value("${ufop.minio.FFMPEG_PATH}")
+    private String FFMPEG_PATH;
+
+
+    public void convertAndUpload(String inputKey, String outputPrefix, String[] formats) throws Exception {
+        MinioClient minioClient = MinioClient.builder()
+                .endpoint(MINIO_ENDPOINT)
+                .credentials(ACCESS_KEY, SECRET_KEY)
+                .build();
+
+        // 创建临时目录
+        File tempDir = new File("temp");
+        if (!tempDir.exists()) {
+            tempDir.mkdir();
+        }
+        List<File> filesToDelete = new ArrayList<>(); // 待删除文件列表
+
+        try {
+            // 下载源文件
+            File localInput = new File(tempDir, inputKey);
+            downloadFromMinio(minioClient, BUCKET_NAME, inputKey, localInput);
+            filesToDelete.add(localInput); // 添加到删除列表
+            // 执行格式转换
+            for (String format : formats) {
+                File outputFile = new File(tempDir, outputPrefix + "." + format);
+                convertVideo(localInput.getAbsolutePath(), outputFile.getAbsolutePath(), format);
+
+                // 上传转换后的文件
+                uploadToMinio(minioClient, BUCKET_NAME, outputFile.getName(), outputFile);
+                filesToDelete.add(outputFile); // 添加到删除列表
+            }
+        } finally {
+            // 清理临时文件(保留目录结构)
+            for (File file : filesToDelete) {
+                if (file.exists() && !file.delete()) {
+                    System.err.println("警告:无法删除临时文件 " + file.getAbsolutePath());
+                }
+            }
+        }
+    }
+
+//    private void convertVideo(String inputPath, String outputPath, String format) throws IOException, InterruptedException {
+//        List<String> command = new ArrayList<>();
+//        command.add(FFMPEG_PATH);
+//        command.add("-i");
+//        command.add(inputPath);
+//        command.add("-c:v");
+//        command.add("libx264");
+//        command.add("-c:a");
+//        command.add("aac");
+//        command.add(outputPath);
+//
+//        ProcessBuilder pb = new ProcessBuilder(command);
+//        pb.redirectErrorStream(true);
+//        Process process = pb.start();
+//
+//        // 读取输出日志
+//        try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
+//            String line;
+//            while ((line = reader.readLine()) != null) {
+//                System.out.println(line);
+//            }
+//        }
+//
+//        int exitCode = process.waitFor();
+//        if (exitCode != 0) {
+//            throw new RuntimeException("FFmpeg转换失败,退出码:" + exitCode);
+//        }
+//    }
+
+    // 修改convertVideo方法以接受文件路径参数
+    private void convertVideo(String inputPath, String outputPath, String format)
+            throws IOException, InterruptedException {
+
+        List<String> command = new ArrayList<>();
+        command.add(FFMPEG_PATH);
+        command.add("-y"); // 覆盖输出文件(避免重复转换问题)
+        command.add("-i");
+        command.add(inputPath);
+        command.add("-c:v");
+        command.add("libx264");
+        command.add("-c:a");
+        command.add("aac");
+        command.add(outputPath);
+
+        ProcessBuilder pb = new ProcessBuilder(command);
+        pb.redirectErrorStream(true);
+        Process process = pb.start();
+
+        // 读取输出日志
+        try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
+            String line;
+            while ((line = reader.readLine()) != null) {
+                System.out.println(line);
+            }
+        }
+
+        int exitCode = process.waitFor();
+        if (exitCode != 0) {
+            throw new RuntimeException("FFmpeg转换失败,退出码:" + exitCode);
+        }
+    }
+
+    private static void downloadFromMinio(MinioClient client, String bucket, String object, File dest) throws Exception {
+        if (!client.bucketExists(BucketExistsArgs.builder().bucket(bucket).build())) {
+            client.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
+        }
+        client.downloadObject(
+                DownloadObjectArgs.builder()
+                        .bucket(bucket)
+                        .object(object)
+                        .filename(dest.getAbsolutePath())
+                        .build()
+        );
+    }
+
+    private static void uploadToMinio(MinioClient client, String bucket, String object, File file) throws Exception {
+        client.uploadObject(
+                UploadObjectArgs.builder()
+                        .bucket(bucket)
+                        .object("convert/" + object)
+                        .filename(file.getAbsolutePath())
+                        .contentType(getMimeType(object))
+                        .build()
+        );
+    }
+
+    private static String getMimeType(String fileName) {
+        return switch (fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase()) {
+            case "mp4" -> "video/mp4";
+            case "wmv" -> "video/x-ms-wmv";
+            case "avi" -> "video/avi";
+            case "flv" -> "video/x-flv";
+            case "mpeg" -> "video/mpeg";
+            case "mpg" -> "video/mpeg";
+            case "rmvb" -> "application/vnd.rn-realmedia-vbr";
+            case "mov" -> "video/quicktime";
+            default -> "application/octet-stream";
+        };
+    }
+
+    private static void deleteDirectory(File dir) {
+        File[] files = dir.listFiles();
+        if (files != null) {
+            for (File f : files) {
+                if (f.isDirectory()) {
+                    deleteDirectory(f);
+                } else {
+                    f.delete();
+                }
+            }
+        }
+        dir.delete();
+    }
+
+
+    /**
+     * 获取转换后的文件大小
+     */
+    public Long getConverterFileSize(String filePath) {
+        Long size = 0L;
+        // 初始化MinIO客户端(需替换您的配置)
+        MinioClient minioClient = MinioClient.builder()
+                .endpoint(MINIO_ENDPOINT)
+                .credentials(ACCESS_KEY, SECRET_KEY)
+                .build();
+
+        try {
+            // 1. 构建查询参数
+            StatObjectArgs statArgs = StatObjectArgs.builder()
+                    .bucket(BUCKET_NAME)
+                    .object(filePath)
+                    .build();
+
+            // 2. 获取元数据
+            StatObjectResponse statObjectResponse = minioClient.statObject(statArgs);
+
+            // 3. 提取文件大小
+            size = statObjectResponse.size();
+            System.out.printf("文件大小: %.2f MB%n", size / (1024.0 * 1024.0));
+
+        } catch (Exception e) {
+
+        }
+        return size;
+    }
+
+
+
+
+//
+//    public static void convertAndUpload(String inputObjectPath, String outputPrefix, String[] formats) throws Exception {
+//        MinioClient minioClient = MinioClient.builder()
+//                .endpoint(MINIO_ENDPOINT)
+//                .credentials(ACCESS_KEY, SECRET_KEY)
+//                .build();
+//
+//        // 1. 从MinIO获取输入流
+//        InputStream minioInputStream = minioClient.getObject(
+//                GetObjectArgs.builder()
+//                        .bucket(BUCKET_NAME)
+//                        .object(inputObjectPath)
+//                        .build()
+//        );
+//
+//        // 2. 执行格式转换
+//        for (String format : formats) {
+//            // 创建FFmpeg进程
+//            ProcessBuilder pb = new ProcessBuilder(FFMPEG_PATH,
+//                    "-i", "pipe:0",          // 从标准输入读取
+//                    "-c:v", "mpeg4",         // 示例编码器配置
+//                    "-c:a", "pcm_s16le",
+//                    "-f", format,            // 强制指定输出格式
+//                    "pipe:1"                 // 输出到标准输出
+//            );
+//
+//            pb.redirectErrorStream(true);
+//            Process ffmpegProcess = pb.start();
+//
+//            // 3. 创建上传任务
+//            CompletableFuture.runAsync(() -> {
+//                try {
+//                    // 构建MinIO上传参数
+//                    PutObjectArgs putArgs = PutObjectArgs.builder()
+//                            .bucket(BUCKET_NAME)
+//                            .object(getOutputObjectName(inputObjectPath, format))
+//                            .contentType(getMimeType(format))
+//                            .build();
+//
+//                    // 获取可写的OutputStream(正确方式)
+//                    try () {
+//                        // 创建管道线程(单向传输:FFmpeg → MinIO)
+//                        Thread outputThread = new Thread(() -> {
+//                            try {
+//                                pipeStreams(
+//                                        ffmpegProcess.getInputStream(),
+//                                        minioOutputStream
+//                                );
+//                            } catch (IOException e) {
+//                                throw new RuntimeException(e);
+//                            }
+//                        });
+//
+//                        outputThread.start();
+//                        outputThread.join();
+//
+//                        // 等待FFmpeg进程完成
+//                        int exitCode = ffmpegProcess.waitFor();
+//                        if (exitCode != 0) {
+//                            throw new RuntimeException("FFmpeg转换失败,退出码:" + exitCode);
+//                        }
+//                    }
+//                } catch (Exception e) {
+//                    throw new RuntimeException("转换/上传过程出错", e);
+//                }
+//            }).join();
+//        }
+//    }
+//
+//    private static void pipeStreams(InputStream src, OutputStream dest) throws IOException {
+//        byte[] buffer = new byte[8192];
+//        int bytesRead;
+//        while ((bytesRead = src.read(buffer)) != -1) {
+//            dest.write(buffer, 0, bytesRead);
+//        }
+//    }
+//
+//    private static String getOutputObjectName(String inputPath, String format) {
+//        String baseName = inputPath.substring(0, inputPath.lastIndexOf('.'));
+//        return baseName + "_converted." + format;
+//    }
+//
+//    private static String getMimeType(String format) {
+//        String lowerFormat = format.toLowerCase();
+//        switch (lowerFormat) {
+//            case "mp4":
+//                return "video/mp4";
+//            case "wmv":
+//                return "video/x-ms-wmv";
+//            case "avi":
+//                return "video/x-msvideo";
+//            case "flv":
+//                return "video/x-flv";
+//            case "mpeg":
+//            case "mpg":
+//                return "video/mpeg";
+//            case "rmvb":
+//                return "application/vnd.rn-realmedia-vbr";
+//            case "mov":
+//                return "video/quicktime";
+//            default:
+//                return "application/octet-stream";
+//        }
+//    }
+
+}

+ 13 - 30
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/pom.xml

@@ -20,22 +20,6 @@
         <dependency>
             <groupId>vip.xiaonuo</groupId>
             <artifactId>snowy-common</artifactId>
-            <version>${project.parent.version}</version>
-            <exclusions>
-                <exclusion>
-                    <groupId>com.fhs-opensource</groupId>
-                    <artifactId>easy-trans-spring-boot-starter</artifactId>
-                </exclusion>
-                <exclusion>
-                    <groupId>com.fhs-opensource</groupId>
-                    <artifactId>easy-trans-mybatis-plus-extend</artifactId>
-                </exclusion>
-            </exclusions>
-        </dependency>
-        <dependency>
-            <groupId>org.springframework.boot</groupId>
-            <artifactId>spring-boot-starter-security</artifactId>
-            <version>${spring.boot.version}</version>
         </dependency>
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -58,18 +42,18 @@
             <artifactId>spring-boot-starter-undertow</artifactId>
             <version>${spring.boot.version}</version>
         </dependency>
+
         <dependency>
             <groupId>org.mybatis.spring.boot</groupId>
             <artifactId>mybatis-spring-boot-starter</artifactId>
             <version>2.1.0</version>
         </dependency>
+        <!-- 引入登录鉴权接口,用于获取登录用户 -->
         <dependency>
-            <groupId>com.github.pagehelper</groupId>
-            <artifactId>pagehelper-spring-boot-starter</artifactId>
-            <version>1.2.12</version>
+            <groupId>vip.xiaonuo</groupId>
+            <artifactId>snowy-plugin-auth-api</artifactId>
         </dependency>
 
-
         <dependency>
             <groupId>mysql</groupId>
             <artifactId>mysql-connector-java</artifactId>
@@ -93,18 +77,17 @@
             <artifactId>modelmapper</artifactId>
             <version>2.3.3</version>
         </dependency>
-
+        <dependency>
+            <groupId>com.github.jsqlparser</groupId>
+            <artifactId>jsqlparser</artifactId>
+            <version>4.4</version>
+        </dependency>
         <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-lang3</artifactId>
             <version>3.9</version>
         </dependency>
 
-        <dependency>
-            <groupId>com.qiniu</groupId>
-            <artifactId>qiniu-java-sdk</artifactId>
-            <version>7.2.25</version>
-        </dependency>
 
         <dependency>
             <groupId>org.springframework.boot</groupId>
@@ -112,12 +95,12 @@
             <version>${spring.boot.version}</version>
             <scope>test</scope>
         </dependency>
+
         <dependency>
-            <groupId>org.springframework.security</groupId>
-            <artifactId>spring-security-test</artifactId>
-            <scope>test</scope>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+            <version>1.2.12</version>
         </dependency>
-
         <!-- hot debug -->
         <dependency>
             <groupId>org.springframework.boot</groupId>

+ 4 - 4
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/base/BaseApiController.java

@@ -1,11 +1,11 @@
 package vip.xiaonuo.exam.base;
 
 
-import vip.xiaonuo.exam.context.WebContext;
-import vip.xiaonuo.exam.domain.User;
-import vip.xiaonuo.exam.utility.ModelMapperSingle;
 import org.modelmapper.ModelMapper;
 import org.springframework.beans.factory.annotation.Autowired;
+import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
+import vip.xiaonuo.exam.context.WebContext;
+import vip.xiaonuo.exam.utility.ModelMapperSingle;
 
 /**
  * @version 3.3.0
@@ -33,7 +33,7 @@ public class BaseApiController {
      *
      * @return the current user
      */
-    protected User getCurrentUser() {
+    protected SaBaseLoginUser getCurrentUser() {
         return webContext.getCurrentUser();
     }
 }

+ 0 - 49
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/application/ApplicationContextProvider.java

@@ -1,49 +0,0 @@
-package vip.xiaonuo.exam.configuration.application;
-
-import org.springframework.beans.BeansException;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.stereotype.Component;
-
-/**
- * @version 3.5.0
- * @description: The type Application context provider.
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-@Component
-public class ApplicationContextProvider implements ApplicationContextAware {
-    private static ApplicationContext context;
-
-    private ApplicationContextProvider() {
-    }
-
-    @Override
-    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-        context = applicationContext;
-    }
-
-    /**
-     * Gets bean.
-     *
-     * @param <T>    the type parameter
-     * @param aClass the a class
-     * @return the bean
-     */
-    public static <T> T getBean(Class<T> aClass) {
-        return context.getBean(aClass);
-    }
-
-    /**
-     * Gets bean.
-     *
-     * @param <T>  the type parameter
-     * @param name the name
-     * @return the bean
-     */
-    @SuppressWarnings("unchecked")
-    public static <T> T getBean(String name) {
-        return (T) context.getBean(name);
-    }
-}
-

+ 0 - 28
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/property/CookieConfig.java

@@ -1,28 +0,0 @@
-package vip.xiaonuo.exam.configuration.property;
-
-/**
- * @version 3.5.0
- * @description: The type Cookie config.
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-public class CookieConfig {
-
-    /**
-     * Gets name.
-     *
-     * @return the name
-     */
-    public static String getName() {
-        return "xzs";
-    }
-
-    /**
-     * Gets interval.
-     *
-     * @return the interval
-     */
-    public static Integer getInterval() {
-        return 30 * 24 * 60 * 60;
-    }
-}

+ 0 - 50
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/property/PasswordKeyConfig.java

@@ -1,50 +0,0 @@
-package vip.xiaonuo.exam.configuration.property;
-
-/**
- * @version 3.5.0
- * @description: The type Password key config.
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-public class PasswordKeyConfig {
-    private String publicKey;
-
-    private String privateKey;
-
-    /**
-     * Gets public key.
-     *
-     * @return the public key
-     */
-    public String getPublicKey() {
-        return publicKey;
-    }
-
-    /**
-     * Sets public key.
-     *
-     * @param publicKey the public key
-     */
-    public void setPublicKey(String publicKey) {
-        this.publicKey = publicKey;
-    }
-
-    /**
-     * Gets private key.
-     *
-     * @return the private key
-     */
-    public String getPrivateKey() {
-        return privateKey;
-    }
-
-    /**
-     * Sets private key.
-     *
-     * @param privateKey the private key
-     */
-    public void setPrivateKey(String privateKey) {
-        this.privateKey = privateKey;
-    }
-
-}

+ 0 - 92
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/property/QnConfig.java

@@ -1,92 +0,0 @@
-package vip.xiaonuo.exam.configuration.property;
-
-
-import java.time.Duration;
-import java.util.List;
-
-/**
- * @version 3.5.0
- * @description: The type Qn config.
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-public class QnConfig {
-
-    private String url;
-    private String bucket;
-    private String accessKey;
-    private String secretKey;
-
-    /**
-     * Gets url.
-     *
-     * @return the url
-     */
-    public String getUrl() {
-        return url;
-    }
-
-    /**
-     * Sets url.
-     *
-     * @param url the url
-     */
-    public void setUrl(String url) {
-        this.url = url;
-    }
-
-    /**
-     * Gets bucket.
-     *
-     * @return the bucket
-     */
-    public String getBucket() {
-        return bucket;
-    }
-
-    /**
-     * Sets bucket.
-     *
-     * @param bucket the bucket
-     */
-    public void setBucket(String bucket) {
-        this.bucket = bucket;
-    }
-
-    /**
-     * Gets access key.
-     *
-     * @return the access key
-     */
-    public String getAccessKey() {
-        return accessKey;
-    }
-
-    /**
-     * Sets access key.
-     *
-     * @param accessKey the access key
-     */
-    public void setAccessKey(String accessKey) {
-        this.accessKey = accessKey;
-    }
-
-    /**
-     * Gets secret key.
-     *
-     * @return the secret key
-     */
-    public String getSecretKey() {
-        return secretKey;
-    }
-
-    /**
-     * Sets secret key.
-     *
-     * @param secretKey the secret key
-     */
-    public void setSecretKey(String secretKey) {
-        this.secretKey = secretKey;
-    }
-
-}

+ 0 - 94
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/property/SystemConfig.java

@@ -1,94 +0,0 @@
-package vip.xiaonuo.exam.configuration.property;
-
-import org.springframework.boot.context.properties.ConfigurationProperties;
-
-import java.util.List;
-
-
-/**
- * @version 3.5.0
- * @description: The type System config.
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-@ConfigurationProperties(prefix = "system")
-public class SystemConfig {
-
-    private PasswordKeyConfig pwdKey;
-    private List<String> securityIgnoreUrls;
-    private WxConfig wx;
-    private QnConfig qn;
-
-    /**
-     * Gets pwd key.
-     *
-     * @return the pwd key
-     */
-    public PasswordKeyConfig getPwdKey() {
-        return pwdKey;
-    }
-
-    /**
-     * Sets pwd key.
-     *
-     * @param pwdKey the pwd key
-     */
-    public void setPwdKey(PasswordKeyConfig pwdKey) {
-        this.pwdKey = pwdKey;
-    }
-
-    /**
-     * Gets security ignore urls.
-     *
-     * @return the security ignore urls
-     */
-    public List<String> getSecurityIgnoreUrls() {
-        return securityIgnoreUrls;
-    }
-
-    /**
-     * Sets security ignore urls.
-     *
-     * @param securityIgnoreUrls the security ignore urls
-     */
-    public void setSecurityIgnoreUrls(List<String> securityIgnoreUrls) {
-        this.securityIgnoreUrls = securityIgnoreUrls;
-    }
-
-    /**
-     * Gets wx.
-     *
-     * @return the wx
-     */
-    public WxConfig getWx() {
-        return wx;
-    }
-
-    /**
-     * Sets wx.
-     *
-     * @param wx the wx
-     */
-    public void setWx(WxConfig wx) {
-        this.wx = wx;
-    }
-
-    /**
-     * Gets qn.
-     *
-     * @return the qn
-     */
-    public QnConfig getQn() {
-        return qn;
-    }
-
-    /**
-     * Sets qn.
-     *
-     * @param qn the qn
-     */
-    public void setQn(QnConfig qn) {
-        this.qn = qn;
-    }
-
-}

+ 0 - 93
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/property/WxConfig.java

@@ -1,93 +0,0 @@
-package vip.xiaonuo.exam.configuration.property;
-
-
-import java.time.Duration;
-import java.util.List;
-
-/**
- * @version 3.5.0
- * @description: The type Wx config.
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-public class WxConfig {
-
-
-    private String appid;
-    private String secret;
-    private Duration tokenToLive;
-    private List<String> securityIgnoreUrls;
-
-    /**
-     * Gets appid.
-     *
-     * @return the appid
-     */
-    public String getAppid() {
-        return appid;
-    }
-
-    /**
-     * Sets appid.
-     *
-     * @param appid the appid
-     */
-    public void setAppid(String appid) {
-        this.appid = appid;
-    }
-
-    /**
-     * Gets secret.
-     *
-     * @return the secret
-     */
-    public String getSecret() {
-        return secret;
-    }
-
-    /**
-     * Sets secret.
-     *
-     * @param secret the secret
-     */
-    public void setSecret(String secret) {
-        this.secret = secret;
-    }
-
-    /**
-     * Gets token to live.
-     *
-     * @return the token to live
-     */
-    public Duration getTokenToLive() {
-        return tokenToLive;
-    }
-
-    /**
-     * Sets token to live.
-     *
-     * @param tokenToLive the token to live
-     */
-    public void setTokenToLive(Duration tokenToLive) {
-        this.tokenToLive = tokenToLive;
-    }
-
-    /**
-     * Gets security ignore urls.
-     *
-     * @return the security ignore urls
-     */
-    public List<String> getSecurityIgnoreUrls() {
-        return securityIgnoreUrls;
-    }
-
-    /**
-     * Sets security ignore urls.
-     *
-     * @param securityIgnoreUrls the security ignore urls
-     */
-    public void setSecurityIgnoreUrls(List<String> securityIgnoreUrls) {
-        this.securityIgnoreUrls = securityIgnoreUrls;
-    }
-
-}

+ 0 - 73
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/exception/ExceptionHandle.java

@@ -1,73 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.exception;
-
-import vip.xiaonuo.exam.base.RestResponse;
-import vip.xiaonuo.exam.base.SystemCode;
-import vip.xiaonuo.exam.utility.ErrorUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.validation.BindException;
-import org.springframework.validation.FieldError;
-import org.springframework.web.bind.MethodArgumentNotValidException;
-import org.springframework.web.bind.annotation.ControllerAdvice;
-import org.springframework.web.bind.annotation.ExceptionHandler;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import java.util.stream.Collectors;
-
-/**
- * @version 3.5.0
- * @description: The type Exception handle.
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-@ControllerAdvice
-public class ExceptionHandle {
-    private final static Logger logger = LoggerFactory.getLogger(ExceptionHandle.class);
-
-    /**
-     * Handler rest response.
-     *
-     * @param e the e
-     * @return the rest response
-     */
-    @ExceptionHandler(Exception.class)
-    @ResponseBody
-    public RestResponse handler(Exception e) {
-        logger.error(e.getMessage(), e);
-        return new RestResponse<>(SystemCode.InnerError.getCode(), SystemCode.InnerError.getMessage());
-    }
-
-    /**
-     * Handler rest response.
-     *
-     * @param e the e
-     * @return the rest response
-     */
-    @ExceptionHandler(MethodArgumentNotValidException.class)
-    @ResponseBody
-    public RestResponse handler(MethodArgumentNotValidException e) {
-        String errorMsg = e.getBindingResult().getAllErrors().stream().map(file -> {
-            FieldError fieldError = (FieldError) file;
-            return ErrorUtil.parameterErrorFormat(fieldError.getField(), fieldError.getDefaultMessage());
-        }).collect(Collectors.joining());
-        return new RestResponse<>(SystemCode.ParameterValidError.getCode(), errorMsg);
-    }
-
-    /**
-     * Handler rest response.
-     *
-     * @param e the e
-     * @return the rest response
-     */
-    @ExceptionHandler(BindException.class)
-    @ResponseBody
-    public RestResponse handler(BindException e) {
-        String errorMsg = e.getBindingResult().getAllErrors().stream().map(file -> {
-            FieldError fieldError = (FieldError) file;
-            return ErrorUtil.parameterErrorFormat(fieldError.getField(), fieldError.getDefaultMessage());
-        }).collect(Collectors.joining());
-        return new RestResponse<>(SystemCode.ParameterValidError.getCode(), errorMsg);
-    }
-
-
-}

+ 0 - 70
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/mvc/WebMvcConfiguration.java

@@ -1,70 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.mvc;
-
-import vip.xiaonuo.exam.configuration.property.SystemConfig;
-import vip.xiaonuo.exam.configuration.spring.wx.TokenHandlerInterceptor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.config.annotation.*;
-
-import java.util.List;
-
-
-/**
- * @version 3.5.0
- * @description: The type Web mvc configuration.
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-@Configuration
-public class WebMvcConfiguration extends WebMvcConfigurationSupport {
-
-    private final TokenHandlerInterceptor tokenHandlerInterceptor;
-    private final SystemConfig systemConfig;
-
-    /**
-     * Instantiates a new Web mvc configuration.
-     *
-     * @param tokenHandlerInterceptor the token handler interceptor
-     * @param systemConfig            the system config
-     */
-    @Autowired
-    public WebMvcConfiguration(TokenHandlerInterceptor tokenHandlerInterceptor, SystemConfig systemConfig) {
-        this.tokenHandlerInterceptor = tokenHandlerInterceptor;
-        this.systemConfig = systemConfig;
-    }
-
-    @Override
-    public void addViewControllers(ViewControllerRegistry registry) {
-        registry.addRedirectViewController("/", "/student/index.html");
-        registry.addRedirectViewController("/student", "/student/index.html");
-        registry.addRedirectViewController("/admin", "/admin/index.html");
-    }
-
-    @Override
-    public void addResourceHandlers(ResourceHandlerRegistry registry) {
-        registry.addResourceHandler("/**")
-                .addResourceLocations("classpath:/static/")
-                .setCachePeriod(31556926);
-    }
-
-    @Override
-    public void addInterceptors(InterceptorRegistry registry) {
-        List<String> securityIgnoreUrls = systemConfig.getWx().getSecurityIgnoreUrls();
-        String[] ignores = new String[securityIgnoreUrls.size()];
-        registry.addInterceptor(tokenHandlerInterceptor)
-                .addPathPatterns("/api/wx/**")
-                .excludePathPatterns(securityIgnoreUrls.toArray(ignores));
-        super.addInterceptors(registry);
-    }
-
-    @Override
-    public void addCorsMappings(CorsRegistry registry) {
-        registry.addMapping("/**")
-                .allowCredentials(true)
-                .allowedMethods("*")
-                .allowedOrigins("*")
-                .allowedHeaders("*");
-        super.addCorsMappings(registry);
-    }
-
-}

+ 0 - 68
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/AuthenticationBean.java

@@ -1,68 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.security;
-
-/**
- * @version 3.5.0
- * @description: The type Authentication bean.
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-public class AuthenticationBean {
-    private String userName;
-    private String password;
-    private boolean remember;
-
-    /**
-     * Gets user name.
-     *
-     * @return the user name
-     */
-    public String getUserName() {
-        return userName;
-    }
-
-    /**
-     * Sets user name.
-     *
-     * @param userName the user name
-     */
-    public void setUserName(String userName) {
-        this.userName = userName;
-    }
-
-    /**
-     * Gets password.
-     *
-     * @return the password
-     */
-    public String getPassword() {
-        return password;
-    }
-
-    /**
-     * Sets password.
-     *
-     * @param password the password
-     */
-    public void setPassword(String password) {
-        this.password = password;
-    }
-
-    /**
-     * Is remember boolean.
-     *
-     * @return the boolean
-     */
-    public boolean isRemember() {
-        return remember;
-    }
-
-    /**
-     * Sets remember.
-     *
-     * @param remember the remember
-     */
-    public void setRemember(boolean remember) {
-        this.remember = remember;
-    }
-
-}

+ 0 - 35
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/LoginAuthenticationEntryPoint.java

@@ -1,35 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.security;
-
-import vip.xiaonuo.exam.base.SystemCode;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-/**
- * @version 3.5.0
- * @description: 未登录
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-@Component
-public final class LoginAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {
-
-    /**
-     * Instantiates a new Login authentication entry point.
-     */
-    public LoginAuthenticationEntryPoint() {
-        super("/api/user/login");
-    }
-
-    @Override
-    public void commence(HttpServletRequest request, HttpServletResponse response,
-                         AuthenticationException authException) throws IOException, ServletException {
-        RestUtil.response(response, SystemCode.UNAUTHORIZED);
-    }
-
-}

+ 0 - 26
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestAccessDeniedHandler.java

@@ -1,26 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.security;
-
-import vip.xiaonuo.exam.base.SystemCode;
-import org.springframework.security.access.AccessDeniedException;
-import org.springframework.security.web.access.AccessDeniedHandler;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-
-/**
- * @version 3.5.0
- * @description: 没权限
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-@Component
-public class RestAccessDeniedHandler implements AccessDeniedHandler {
-    @Override
-    public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e) throws IOException, ServletException {
-        RestUtil.response(httpServletResponse, SystemCode.AccessDenied);
-    }
-}

+ 0 - 27
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestAuthenticationFailureHandler.java

@@ -1,27 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.security;
-
-import vip.xiaonuo.exam.base.SystemCode;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-
-/**
- * @version 3.5.0
- * @description: 账号验证异常
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-@Component
-public class RestAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
-
-    @Override
-    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
-        RestUtil.response(response, SystemCode.AuthError.getCode(), exception.getMessage());
-    }
-}

+ 0 - 83
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestAuthenticationProvider.java

@@ -1,83 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.security;
-
-
-import vip.xiaonuo.exam.context.WebContext;
-import vip.xiaonuo.exam.domain.enums.RoleEnum;
-import vip.xiaonuo.exam.domain.enums.UserStatusEnum;
-import vip.xiaonuo.exam.service.AuthenticationService;
-import vip.xiaonuo.exam.service.UserService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.authentication.AuthenticationProvider;
-import org.springframework.security.authentication.BadCredentialsException;
-import org.springframework.security.authentication.LockedException;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-
-
-/**
- * @version 3.5.0
- * @description: 登录用户名密码验证
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-@Component
-public class RestAuthenticationProvider implements AuthenticationProvider {
-
-    private final AuthenticationService authenticationService;
-    private final UserService userService;
-    private final WebContext webContext;
-
-    /**
-     * Instantiates a new Rest authentication provider.
-     *
-     * @param authenticationService the authentication service
-     * @param userService           the user service
-     * @param webContext            the web context
-     */
-    @Autowired
-    public RestAuthenticationProvider(AuthenticationService authenticationService, UserService userService, WebContext webContext) {
-        this.authenticationService = authenticationService;
-        this.userService = userService;
-        this.webContext = webContext;
-    }
-
-    @Override
-    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
-        String username = authentication.getName();
-        String password = (String) authentication.getCredentials();
-
-        vip.xiaonuo.exam.domain.User user = userService.getUserByUserName(username);
-        if (user == null) {
-            throw new UsernameNotFoundException("用户名或密码错误");
-        }
-
-        boolean result = authenticationService.authUser(user, username, password);
-        if (!result) {
-            throw new BadCredentialsException("用户名或密码错误");
-        }
-
-        UserStatusEnum userStatusEnum = UserStatusEnum.fromCode(user.getStatus());
-        if (UserStatusEnum.Disable == userStatusEnum) {
-            throw new LockedException("用户被禁用");
-        }
-
-        ArrayList<GrantedAuthority> grantedAuthorities = new ArrayList<>();
-        grantedAuthorities.add(new SimpleGrantedAuthority(RoleEnum.fromCode(user.getRole()).getRoleName()));
-
-        User authUser = new User(user.getUserName(), user.getPassword(), grantedAuthorities);
-        return new UsernamePasswordAuthenticationToken(authUser, authUser.getPassword(), authUser.getAuthorities());
-    }
-
-    @Override
-    public boolean supports(Class<?> aClass) {
-        return true;
-    }
-}

+ 0 - 64
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestAuthenticationSuccessHandler.java

@@ -1,64 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.security;
-
-import vip.xiaonuo.exam.base.SystemCode;
-import vip.xiaonuo.exam.domain.UserEventLog;
-import vip.xiaonuo.exam.event.UserEvent;
-import vip.xiaonuo.exam.service.UserService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.util.Date;
-
-
-/**
- * @version 3.5.0
- * @description: 登录成功返回
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-@Component
-public class RestAuthenticationSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
-
-    private final ApplicationEventPublisher eventPublisher;
-    private final UserService userService;
-
-    /**
-     * Instantiates a new Rest authentication success handler.
-     *
-     * @param eventPublisher the event publisher
-     * @param userService    the user service
-     */
-    @Autowired
-    public RestAuthenticationSuccessHandler(ApplicationEventPublisher eventPublisher, UserService userService) {
-        this.eventPublisher = eventPublisher;
-        this.userService = userService;
-    }
-
-    @Override
-    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
-        Object object = authentication.getPrincipal();
-        if (null != object) {
-            User springUser = (User) object;
-            vip.xiaonuo.exam.domain.User user = userService.getUserByUserName(springUser.getUsername());
-            if (null != user) {
-                UserEventLog userEventLog = new UserEventLog(user.getId(), user.getUserName(), user.getRealName(), new Date());
-                userEventLog.setContent(user.getUserName() + " 登录了学之思开源考试系统");
-                eventPublisher.publishEvent(new UserEvent(userEventLog));
-                vip.xiaonuo.exam.domain.User newUser = new vip.xiaonuo.exam.domain.User();
-                newUser.setUserName(user.getUserName());
-                newUser.setImagePath(user.getImagePath());
-                RestUtil.response(response, SystemCode.OK.getCode(), SystemCode.OK.getMessage(), newUser);
-            }
-        } else {
-            RestUtil.response(response, SystemCode.UNAUTHORIZED.getCode(), SystemCode.UNAUTHORIZED.getMessage());
-        }
-    }
-}

+ 0 - 52
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestDetailsServiceImpl.java

@@ -1,52 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.security;
-
-import vip.xiaonuo.exam.domain.enums.RoleEnum;
-import vip.xiaonuo.exam.service.UserService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.GrantedAuthority;
-import org.springframework.security.core.authority.SimpleGrantedAuthority;
-import org.springframework.security.core.userdetails.User;
-import org.springframework.security.core.userdetails.UserDetails;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.core.userdetails.UsernameNotFoundException;
-import org.springframework.stereotype.Component;
-
-import java.util.ArrayList;
-
-
-/**
- * @version 3.5.0
- * @description: 验证通过之后,第二、三...请求,会调用此类
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-@Component
-public class RestDetailsServiceImpl implements UserDetailsService {
-
-    private final UserService userService;
-
-    /**
-     * Instantiates a new Rest details service.
-     *
-     * @param userService the user service
-     */
-    @Autowired
-    public RestDetailsServiceImpl(UserService userService) {
-        this.userService = userService;
-    }
-
-    @Override
-    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
-
-        vip.xiaonuo.exam.domain.User user = userService.getUserByUserName(username);
-
-        if (user == null) {
-            throw new UsernameNotFoundException("Username  not found.");
-        }
-
-        ArrayList<GrantedAuthority> grantedAuthorities = new ArrayList<>();
-        grantedAuthorities.add(new SimpleGrantedAuthority(RoleEnum.fromCode(user.getRole()).getRoleName()));
-
-        return new User(user.getUserName(), user.getPassword(), grantedAuthorities);
-    }
-}

+ 0 - 67
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestLoginAuthenticationFilter.java

@@ -1,67 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.security;
-
-import vip.xiaonuo.exam.configuration.property.CookieConfig;
-
-import vip.xiaonuo.exam.utility.JsonUtil;
-import org.slf4j.LoggerFactory;
-import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.core.AuthenticationException;
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter;
-import org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices;
-import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.InputStream;
-
-
-/**
- * @version 3.5.0
- * @description: 登录参数序列化
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-public class RestLoginAuthenticationFilter extends AbstractAuthenticationProcessingFilter {
-    private final org.slf4j.Logger logger = LoggerFactory.getLogger(RestLoginAuthenticationFilter.class);
-
-    /**
-     * Instantiates a new Rest login authentication filter.
-     */
-    public RestLoginAuthenticationFilter() {
-        super(new AntPathRequestMatcher("/api/user/login", "POST"));
-    }
-
-    @Override
-    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
-        UsernamePasswordAuthenticationToken authRequest;
-        try (InputStream is = request.getInputStream()) {
-            AuthenticationBean authenticationBean = JsonUtil.toJsonObject(is, AuthenticationBean.class);
-            request.setAttribute(TokenBasedRememberMeServices.DEFAULT_PARAMETER, authenticationBean.isRemember());
-            authRequest = new UsernamePasswordAuthenticationToken(authenticationBean.getUserName(), authenticationBean.getPassword());
-        } catch (IOException e) {
-            logger.error(e.getMessage(), e);
-            authRequest = new UsernamePasswordAuthenticationToken("", "");
-        }
-        setDetails(request, authRequest);
-        return this.getAuthenticationManager().authenticate(authRequest);
-
-    }
-
-    /**
-     * Sets user details service.
-     *
-     * @param userDetailsService the user details service
-     */
-    void setUserDetailsService(UserDetailsService userDetailsService) {
-        RestTokenBasedRememberMeServices tokenBasedRememberMeServices = new RestTokenBasedRememberMeServices(CookieConfig.getName(), userDetailsService);
-        tokenBasedRememberMeServices.setTokenValiditySeconds(CookieConfig.getInterval());
-        setRememberMeServices(tokenBasedRememberMeServices);
-    }
-
-    private void setDetails(HttpServletRequest request, UsernamePasswordAuthenticationToken authRequest) {
-        authRequest.setDetails(authenticationDetailsSource.buildDetails(request));
-    }
-}

+ 0 - 54
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestLogoutSuccessHandler.java

@@ -1,54 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.security;
-
-import vip.xiaonuo.exam.base.SystemCode;
-import vip.xiaonuo.exam.domain.User;
-import vip.xiaonuo.exam.domain.UserEventLog;
-import vip.xiaonuo.exam.event.UserEvent;
-import vip.xiaonuo.exam.service.UserService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.security.core.Authentication;
-import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler;
-import org.springframework.stereotype.Component;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.Date;
-
-
-/**
- * @version 3.5.0
- * @description: 用户登出
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-@Component
-public class RestLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {
-
-    private final ApplicationEventPublisher eventPublisher;
-    private final UserService userService;
-
-    /**
-     * Instantiates a new Rest logout success handler.
-     *
-     * @param eventPublisher the event publisher
-     * @param userService    the user service
-     */
-    @Autowired
-    public RestLogoutSuccessHandler(ApplicationEventPublisher eventPublisher, UserService userService) {
-        this.eventPublisher = eventPublisher;
-        this.userService = userService;
-    }
-
-    @Override
-    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
-        org.springframework.security.core.userdetails.User springUser = (org.springframework.security.core.userdetails.User) authentication.getPrincipal();
-        if (null != springUser) {
-            User user = userService.getUserByUserName(springUser.getUsername());
-            UserEventLog userEventLog = new UserEventLog(user.getId(), user.getUserName(), user.getRealName(), new Date());
-            userEventLog.setContent(user.getUserName() + " 登出了学之思开源考试系统");
-            eventPublisher.publishEvent(new UserEvent(userEventLog));
-        }
-        RestUtil.response(response, SystemCode.OK);
-    }
-}

+ 0 - 31
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestTokenBasedRememberMeServices.java

@@ -1,31 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.security;
-
-import org.springframework.security.core.userdetails.UserDetailsService;
-import org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices;
-
-import javax.servlet.http.HttpServletRequest;
-
-
-/**
- * @version 3.5.0
- * @description: 记住我,Cookie
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-public class RestTokenBasedRememberMeServices extends TokenBasedRememberMeServices {
-    /**
-     * Instantiates a new Rest token based remember me services.
-     *
-     * @param key                the key
-     * @param userDetailsService the user details service
-     */
-    public RestTokenBasedRememberMeServices(String key, UserDetailsService userDetailsService) {
-        super(key, userDetailsService);
-    }
-
-    @Override
-    protected boolean rememberMeRequested(HttpServletRequest request, String parameter) {
-        return (boolean) request.getAttribute(DEFAULT_PARAMETER);
-    }
-
-}

+ 0 - 63
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/RestUtil.java

@@ -1,63 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.security;
-
-import vip.xiaonuo.exam.base.RestResponse;
-import vip.xiaonuo.exam.base.SystemCode;
-import vip.xiaonuo.exam.utility.JsonUtil;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-
-
-/**
- * @version 3.5.0
- * @description: The type Rest util.
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-public class RestUtil {
-    private static final Logger logger = LoggerFactory.getLogger(RestUtil.class);
-
-
-    /**
-     * Response.
-     *
-     * @param response   the response
-     * @param systemCode the system code
-     */
-    public static void response(HttpServletResponse response, SystemCode systemCode) {
-        response(response, systemCode.getCode(), systemCode.getMessage());
-    }
-
-    /**
-     * Response.
-     *
-     * @param response   the response
-     * @param systemCode the system code
-     * @param msg        the msg
-     */
-    public static void response(HttpServletResponse response, int systemCode, String msg) {
-        response(response, systemCode, msg, null);
-    }
-
-
-    /**
-     * Response.
-     *
-     * @param response   the response
-     * @param systemCode the system code
-     * @param msg        the msg
-     * @param content    the content
-     */
-    public static void response(HttpServletResponse response, int systemCode, String msg, Object content) {
-        try {
-            RestResponse res = new RestResponse<>(systemCode, msg, content);
-            String resStr = JsonUtil.toJsonStr(res);
-            response.setContentType("application/json;charset=utf-8");
-            response.getWriter().write(resStr);
-        } catch (IOException e) {
-            logger.error(e.getMessage(), e);
-        }
-    }
-}

+ 0 - 136
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/security/SecurityConfigurer.java

@@ -1,136 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.security;
-
-import vip.xiaonuo.exam.configuration.property.CookieConfig;
-import vip.xiaonuo.exam.configuration.property.SystemConfig;
-import vip.xiaonuo.exam.domain.enums.RoleEnum;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.security.config.annotation.web.builders.HttpSecurity;
-import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
-import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
-import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
-import org.springframework.web.cors.CorsConfiguration;
-import org.springframework.web.cors.CorsConfigurationSource;
-import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
-
-import java.util.Collections;
-import java.util.List;
-
-
-/**
- * @version 3.5.0
- * @description: The type Security configurer.
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/12/25 9:45
- */
-@Configuration
-@EnableWebSecurity
-public class SecurityConfigurer {
-
-    /**
-     * The type Form login web security configurer adapter.
-     */
-    @Configuration
-    public static class FormLoginWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
-
-        private final SystemConfig systemConfig;
-        private final LoginAuthenticationEntryPoint restAuthenticationEntryPoint;
-        private final RestAuthenticationProvider restAuthenticationProvider;
-        private final RestDetailsServiceImpl formDetailsService;
-        private final RestAuthenticationSuccessHandler restAuthenticationSuccessHandler;
-        private final RestAuthenticationFailureHandler restAuthenticationFailureHandler;
-        private final RestLogoutSuccessHandler restLogoutSuccessHandler;
-        private final RestAccessDeniedHandler restAccessDeniedHandler;
-
-        /**
-         * Instantiates a new Form login web security configurer adapter.
-         *
-         * @param systemConfig                     the system config
-         * @param restAuthenticationEntryPoint     the rest authentication entry point
-         * @param restAuthenticationProvider       the rest authentication provider
-         * @param formDetailsService               the form details service
-         * @param restAuthenticationSuccessHandler the rest authentication success handler
-         * @param restAuthenticationFailureHandler the rest authentication failure handler
-         * @param restLogoutSuccessHandler         the rest logout success handler
-         * @param restAccessDeniedHandler          the rest access denied handler
-         */
-        @Autowired
-        public FormLoginWebSecurityConfigurerAdapter(SystemConfig systemConfig, LoginAuthenticationEntryPoint restAuthenticationEntryPoint, RestAuthenticationProvider restAuthenticationProvider, RestDetailsServiceImpl formDetailsService, RestAuthenticationSuccessHandler restAuthenticationSuccessHandler, RestAuthenticationFailureHandler restAuthenticationFailureHandler, RestLogoutSuccessHandler restLogoutSuccessHandler, RestAccessDeniedHandler restAccessDeniedHandler) {
-            this.systemConfig = systemConfig;
-            this.restAuthenticationEntryPoint = restAuthenticationEntryPoint;
-            this.restAuthenticationProvider = restAuthenticationProvider;
-            this.formDetailsService = formDetailsService;
-            this.restAuthenticationSuccessHandler = restAuthenticationSuccessHandler;
-            this.restAuthenticationFailureHandler = restAuthenticationFailureHandler;
-            this.restLogoutSuccessHandler = restLogoutSuccessHandler;
-            this.restAccessDeniedHandler = restAccessDeniedHandler;
-        }
-
-        /**
-         * @param http http
-         * @throws Exception exception
-         *                   csrf is the from submit get method
-         */
-        @Override
-        protected void configure(HttpSecurity http) throws Exception {
-            http.headers().frameOptions().disable();
-
-            List<String> securityIgnoreUrls = systemConfig.getSecurityIgnoreUrls();
-            String[] ignores = new String[securityIgnoreUrls.size()];
-            http
-                    .addFilterAt(authenticationFilter(), UsernamePasswordAuthenticationFilter.class)
-                    .exceptionHandling().authenticationEntryPoint(restAuthenticationEntryPoint)
-                    .and().authenticationProvider(restAuthenticationProvider)
-                    .authorizeRequests()
-                    .antMatchers(securityIgnoreUrls.toArray(ignores)).permitAll()
-                    .antMatchers("/api/admin/**").hasRole(RoleEnum.ADMIN.getName())
-                    .antMatchers("/api/student/**").hasRole(RoleEnum.STUDENT.getName())
-                    .anyRequest().permitAll()
-                    .and().exceptionHandling().accessDeniedHandler(restAccessDeniedHandler)
-                    .and().formLogin().successHandler(restAuthenticationSuccessHandler).failureHandler(restAuthenticationFailureHandler)
-                    .and().logout().logoutUrl("/api/user/logout").logoutSuccessHandler(restLogoutSuccessHandler).invalidateHttpSession(true)
-                    .and().rememberMe().key(CookieConfig.getName()).tokenValiditySeconds(CookieConfig.getInterval()).userDetailsService(formDetailsService)
-                    .and().csrf().disable()
-                    .cors();
-        }
-
-
-        /**
-         * Cors configuration source cors configuration source.
-         *
-         * @return the cors configuration source
-         */
-        @Bean
-        public CorsConfigurationSource corsConfigurationSource() {
-            final CorsConfiguration configuration = new CorsConfiguration();
-            configuration.setMaxAge(3600L);
-            configuration.setAllowedOrigins(Collections.singletonList("*"));
-            configuration.setAllowedMethods(Collections.singletonList("*"));
-            configuration.setAllowCredentials(true);
-            configuration.setAllowedHeaders(Collections.singletonList("*"));
-            final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
-            source.registerCorsConfiguration("/api/**", configuration);
-            return source;
-        }
-
-
-        /**
-         * Authentication filter rest login authentication filter.
-         *
-         * @return the rest login authentication filter
-         * @throws Exception the exception
-         */
-        @Bean
-        public RestLoginAuthenticationFilter authenticationFilter() throws Exception {
-            RestLoginAuthenticationFilter authenticationFilter = new RestLoginAuthenticationFilter();
-            authenticationFilter.setAuthenticationSuccessHandler(restAuthenticationSuccessHandler);
-            authenticationFilter.setAuthenticationFailureHandler(restAuthenticationFailureHandler);
-            authenticationFilter.setAuthenticationManager(authenticationManagerBean());
-            authenticationFilter.setUserDetailsService(formDetailsService);
-            return authenticationFilter;
-        }
-
-
-    }
-}

+ 0 - 68
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/configuration/spring/wx/TokenHandlerInterceptor.java

@@ -1,68 +0,0 @@
-package vip.xiaonuo.exam.configuration.spring.wx;
-
-import vip.xiaonuo.exam.base.SystemCode;
-import vip.xiaonuo.exam.configuration.spring.security.RestUtil;
-import vip.xiaonuo.exam.context.WxContext;
-import vip.xiaonuo.exam.domain.User;
-import vip.xiaonuo.exam.domain.UserToken;
-import vip.xiaonuo.exam.service.UserService;
-import vip.xiaonuo.exam.service.UserTokenService;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-import org.springframework.web.servlet.HandlerInterceptor;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.util.Date;
-
-@Component
-public class TokenHandlerInterceptor implements HandlerInterceptor {
-
-    private final UserTokenService userTokenService;
-    private final UserService userService;
-    private final WxContext wxContext;
-
-    @Autowired
-    public TokenHandlerInterceptor(UserTokenService userTokenService, UserService userService, WxContext wxContext) {
-        this.userTokenService = userTokenService;
-        this.userService = userService;
-        this.wxContext = wxContext;
-    }
-
-    @Override
-    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-        String token = request.getHeader("token");
-        if (StringUtils.isEmpty(token)) {
-            RestUtil.response(response, SystemCode.UNAUTHORIZED);
-            return false;
-        }
-
-        if (StringUtils.isBlank(token)) {
-            RestUtil.response(response, SystemCode.UNAUTHORIZED);
-            return false;
-        }
-
-        if (token.length() != 36) {
-            RestUtil.response(response, SystemCode.UNAUTHORIZED);
-            return false;
-        }
-
-        UserToken userToken = userTokenService.getToken(token);
-        if (null == userToken) {
-            RestUtil.response(response, SystemCode.UNAUTHORIZED);
-            return false;
-        }
-
-        Date now = new Date();
-        User user = userService.getUserByUserName(userToken.getUserName());
-        if (now.before(userToken.getEndTime())) {
-            wxContext.setContext(user,userToken);
-            return true;
-        } else {   //refresh token
-            UserToken refreshToken = userTokenService.insertUserToken(user);
-            RestUtil.response(response, SystemCode.AccessTokenError.getCode(), SystemCode.AccessTokenError.getMessage(), refreshToken.getToken());
-            return false;
-        }
-    }
-}

+ 13 - 27
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/context/WebContext.java

@@ -1,12 +1,11 @@
 package vip.xiaonuo.exam.context;
 
-import vip.xiaonuo.exam.domain.User;
-import vip.xiaonuo.exam.service.UserService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.security.core.context.SecurityContextHolder;
+
 import org.springframework.stereotype.Component;
 import org.springframework.web.context.request.RequestAttributes;
 import org.springframework.web.context.request.RequestContextHolder;
+import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
+import vip.xiaonuo.auth.core.util.StpLoginUserUtil;
 
 /**
  * @version 3.3.0
@@ -17,17 +16,8 @@ import org.springframework.web.context.request.RequestContextHolder;
 @Component
 public class WebContext {
     private static final String USER_ATTRIBUTES = "USER_ATTRIBUTES";
-    private final UserService userService;
 
-    /**
-     * Instantiates a new Web context.
-     *
-     * @param userService the user service
-     */
-    @Autowired
-    public WebContext(UserService userService) {
-        this.userService = userService;
-    }
+
 
 
     /**
@@ -35,7 +25,7 @@ public class WebContext {
      *
      * @param user the user
      */
-    public void setCurrentUser(User user) {
+    public void setCurrentUser(SaBaseLoginUser user) {
         RequestContextHolder.currentRequestAttributes().setAttribute(USER_ATTRIBUTES, user, RequestAttributes.SCOPE_REQUEST);
     }
 
@@ -44,20 +34,16 @@ public class WebContext {
      *
      * @return the current user
      */
-    public User getCurrentUser() {
-        User user = (User) RequestContextHolder.currentRequestAttributes().getAttribute(USER_ATTRIBUTES, RequestAttributes.SCOPE_REQUEST);
-        if (null != user) {
-            return user;
+    public SaBaseLoginUser getCurrentUser() {
+        SaBaseLoginUser saBaseLoginUser = (SaBaseLoginUser) RequestContextHolder.currentRequestAttributes().getAttribute(USER_ATTRIBUTES, RequestAttributes.SCOPE_REQUEST);
+        if (null != saBaseLoginUser) {
+            return saBaseLoginUser;
         } else {
-            org.springframework.security.core.userdetails.User springUser = (org.springframework.security.core.userdetails.User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
-            if (null == springUser) {
-                return null;
-            }
-            user = userService.getUserByUserName(springUser.getUsername());
-            if (null != user) {
-                setCurrentUser(user);
+            saBaseLoginUser=StpLoginUserUtil.getLoginUser();
+            if (null != saBaseLoginUser) {
+                setCurrentUser(saBaseLoginUser);
             }
-            return user;
+            return saBaseLoginUser;
         }
     }
 }

+ 0 - 50
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/context/WxContext.java

@@ -1,50 +0,0 @@
-package vip.xiaonuo.exam.context;
-
-import vip.xiaonuo.exam.domain.User;
-import vip.xiaonuo.exam.domain.UserToken;
-import org.springframework.stereotype.Component;
-import org.springframework.web.context.request.RequestAttributes;
-import org.springframework.web.context.request.RequestContextHolder;
-
-/**
- * @version 3.3.0
- * @description: The enum System code.
- * Copyright (C), 2020-2024, 武汉思维跳跃科技有限公司
- * @date 2021/5/25 10:45
- */
-@Component
-public class WxContext {
-
-    private static final String USER_ATTRIBUTES = "USER_ATTRIBUTES";
-    private static final String USER_TOKEN_ATTRIBUTES = "USER_TOKEN_ATTRIBUTES";
-
-
-    /**
-     * Sets context.
-     *
-     * @param user      the user
-     * @param userToken the user token
-     */
-    public void setContext(User user, UserToken userToken) {
-        RequestContextHolder.currentRequestAttributes().setAttribute(USER_ATTRIBUTES, user, RequestAttributes.SCOPE_REQUEST);
-        RequestContextHolder.currentRequestAttributes().setAttribute(USER_TOKEN_ATTRIBUTES, userToken, RequestAttributes.SCOPE_REQUEST);
-    }
-
-    /**
-     * Gets current user.
-     *
-     * @return the current user
-     */
-    public User getCurrentUser() {
-        return (User) RequestContextHolder.currentRequestAttributes().getAttribute(USER_ATTRIBUTES, RequestAttributes.SCOPE_REQUEST);
-    }
-
-    /**
-     * Gets current user token.
-     *
-     * @return the current user token
-     */
-    public UserToken getCurrentUserToken() {
-        return (UserToken) RequestContextHolder.currentRequestAttributes().getAttribute(USER_TOKEN_ATTRIBUTES, RequestAttributes.SCOPE_REQUEST);
-    }
-}

+ 0 - 40
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/ErrorController.java

@@ -1,40 +0,0 @@
-package vip.xiaonuo.exam.controller;
-
-import vip.xiaonuo.exam.base.SystemCode;
-import org.springframework.boot.autoconfigure.web.ErrorProperties;
-import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
-import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.MediaType;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.RestController;
-
-import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
-import java.util.Map;
-
-@RestController
-public class ErrorController extends BasicErrorController {
-
-    private static final String PATH = "/error";
-
-    public ErrorController() {
-        super(new DefaultErrorAttributes(), new ErrorProperties());
-    }
-
-    @RequestMapping(produces = {MediaType.APPLICATION_JSON_VALUE})
-    @ResponseBody
-    public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
-        Map<String, Object> error = new HashMap<>(2);
-        error.put("code", SystemCode.InnerError.getCode());
-        error.put("message", SystemCode.InnerError.getMessage());
-        return new ResponseEntity<>(error, HttpStatus.OK);
-    }
-
-
-    public String getErrorPath() {
-        return PATH;
-    }
-}

+ 12 - 12
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/admin/ExamPaperAnswerController.java

@@ -1,22 +1,22 @@
 package vip.xiaonuo.exam.controller.admin;
 
+import com.github.pagehelper.PageInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
 import vip.xiaonuo.exam.base.BaseApiController;
 import vip.xiaonuo.exam.base.RestResponse;
 import vip.xiaonuo.exam.domain.ExamPaperAnswer;
 import vip.xiaonuo.exam.domain.Subject;
-import vip.xiaonuo.exam.domain.User;
-
 import vip.xiaonuo.exam.service.ExamPaperAnswerService;
 import vip.xiaonuo.exam.service.SubjectService;
-import vip.xiaonuo.exam.service.UserService;
 import vip.xiaonuo.exam.utility.DateTimeUtil;
 import vip.xiaonuo.exam.utility.ExamUtil;
 import vip.xiaonuo.exam.utility.PageInfoHelper;
-import vip.xiaonuo.exam.viewmodel.student.exampaper.ExamPaperAnswerPageResponseVM;
 import vip.xiaonuo.exam.viewmodel.admin.paper.ExamPaperAnswerPageRequestVM;
-import com.github.pagehelper.PageInfo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
+import vip.xiaonuo.exam.viewmodel.student.exampaper.ExamPaperAnswerPageResponseVM;
 
 @RestController("AdminExamPaperAnswerController")
 @RequestMapping(value = "/api/admin/examPaperAnswer")
@@ -24,13 +24,13 @@ public class ExamPaperAnswerController extends BaseApiController {
 
     private final ExamPaperAnswerService examPaperAnswerService;
     private final SubjectService subjectService;
-    private final UserService userService;
+
 
     @Autowired
-    public ExamPaperAnswerController(ExamPaperAnswerService examPaperAnswerService, SubjectService subjectService, UserService userService) {
+    public ExamPaperAnswerController(ExamPaperAnswerService examPaperAnswerService, SubjectService subjectService) {
         this.examPaperAnswerService = examPaperAnswerService;
         this.subjectService = subjectService;
-        this.userService = userService;
+
     }
 
 
@@ -46,8 +46,8 @@ public class ExamPaperAnswerController extends BaseApiController {
             vm.setPaperScore(ExamUtil.scoreToVM(e.getPaperScore()));
             vm.setSubjectName(subject.getName());
             vm.setCreateTime(DateTimeUtil.dateFormat(e.getCreateTime()));
-            User user = userService.selectById(e.getCreateUser());
-            vm.setUserName(user.getUserName());
+         //   User user = userService.selectById(Integer.valueOf(e.getCreateUser()));
+          //  vm.setUserName(user.getUserName());
             return vm;
         });
         return RestResponse.ok(page);

+ 25 - 26
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/admin/MessageController.java

@@ -1,24 +1,23 @@
 package vip.xiaonuo.exam.controller.admin;
 
 
+import com.github.pagehelper.PageInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
 import vip.xiaonuo.exam.base.BaseApiController;
 import vip.xiaonuo.exam.base.RestResponse;
 import vip.xiaonuo.exam.domain.Message;
 import vip.xiaonuo.exam.domain.MessageUser;
-import vip.xiaonuo.exam.domain.User;
 import vip.xiaonuo.exam.service.MessageService;
-import vip.xiaonuo.exam.service.UserService;
 import vip.xiaonuo.exam.utility.DateTimeUtil;
 import vip.xiaonuo.exam.utility.PageInfoHelper;
 import vip.xiaonuo.exam.viewmodel.admin.message.MessagePageRequestVM;
 import vip.xiaonuo.exam.viewmodel.admin.message.MessageResponseVM;
 import vip.xiaonuo.exam.viewmodel.admin.message.MessageSendVM;
-import com.github.pagehelper.PageInfo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
 import java.util.Date;
@@ -30,12 +29,12 @@ import java.util.stream.Collectors;
 public class MessageController extends BaseApiController {
 
     private final MessageService messageService;
-    private final UserService userService;
+
 
     @Autowired
-    public MessageController(MessageService messageService, UserService userService) {
+    public MessageController(MessageService messageService) {
         this.messageService = messageService;
-        this.userService = userService;
+
     }
 
     @RequestMapping(value = "/page", method = RequestMethod.POST)
@@ -57,28 +56,28 @@ public class MessageController extends BaseApiController {
 
     @RequestMapping(value = "/send", method = RequestMethod.POST)
     public RestResponse send(@RequestBody @Valid MessageSendVM model) {
-        User user = getCurrentUser();
-        List<User> receiveUser = userService.selectByIds(model.getReceiveUserIds());
+        SaBaseLoginUser user = getCurrentUser();
+  //      List<User> receiveUser = userService.selectByIds(model.getReceiveUserIds());
         Date now = new Date();
         Message message = new Message();
         message.setTitle(model.getTitle());
         message.setContent(model.getContent());
         message.setCreateTime(now);
         message.setReadCount(0);
-        message.setReceiveUserCount(receiveUser.size());
+      //  message.setReceiveUserCount(receiveUser.size());
         message.setSendUserId(user.getId());
-        message.setSendUserName(user.getUserName());
-        message.setSendRealName(user.getRealName());
-        List<MessageUser> messageUsers = receiveUser.stream().map(d -> {
-            MessageUser messageUser = new MessageUser();
-            messageUser.setCreateTime(now);
-            messageUser.setReaded(false);
-            messageUser.setReceiveRealName(d.getRealName());
-            messageUser.setReceiveUserId(d.getId());
-            messageUser.setReceiveUserName(d.getUserName());
-            return messageUser;
-        }).collect(Collectors.toList());
-        messageService.sendMessage(message, messageUsers);
+        message.setSendUserName(user.getName());
+        message.setSendRealName(user.getName());
+//        List<MessageUser> messageUsers = receiveUser.stream().map(d -> {
+//            MessageUser messageUser = new MessageUser();
+//            messageUser.setCreateTime(now);
+//            messageUser.setReaded(false);
+//            messageUser.setReceiveRealName(d.getRealName());
+//            messageUser.setReceiveUserId(d.getId());
+//            messageUser.setReceiveUserName(d.getUserName());
+//            return messageUser;
+//        }).collect(Collectors.toList());
+        messageService.sendMessage(message, null);
         return RestResponse.ok();
     }
 

+ 0 - 103
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/admin/UploadController.java

@@ -1,103 +0,0 @@
-package vip.xiaonuo.exam.controller.admin;
-
-
-import vip.xiaonuo.exam.base.BaseApiController;
-import vip.xiaonuo.exam.base.RestResponse;
-import vip.xiaonuo.exam.configuration.property.SystemConfig;
-import vip.xiaonuo.exam.service.FileUpload;
-import vip.xiaonuo.exam.service.UserService;
-import vip.xiaonuo.exam.viewmodel.admin.file.UeditorConfigVM;
-import vip.xiaonuo.exam.viewmodel.admin.file.UploadResultVM;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.multipart.MultipartHttpServletRequest;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Arrays;
-
-
-@RequestMapping("/api/admin/upload")
-@RestController("AdminUploadController")
-public class UploadController extends BaseApiController {
-
-    private final FileUpload fileUpload;
-    private final SystemConfig systemConfig;
-    private static final Logger logger = LoggerFactory.getLogger(UploadController.class);
-    private static final String IMAGE_UPLOAD = "imgUpload";
-    private static final String IMAGE_UPLOAD_FILE = "upFile";
-    private final UserService userService;
-
-    @Autowired
-    public UploadController(FileUpload fileUpload, SystemConfig systemConfig, UserService userService) {
-        this.fileUpload = fileUpload;
-        this.systemConfig = systemConfig;
-        this.userService = userService;
-    }
-
-    @ResponseBody
-    @RequestMapping("/configAndUpload")
-    public Object upload(HttpServletRequest request, HttpServletResponse response) {
-        String action = request.getParameter("action");
-        if (action.equals(IMAGE_UPLOAD)) {
-            try {
-                MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
-                MultipartFile multipartFile = multipartHttpServletRequest.getFile(IMAGE_UPLOAD_FILE);
-                long attachSize = multipartFile.getSize();
-                String imgName = multipartFile.getOriginalFilename();
-                String filePath;
-                try (InputStream inputStream = multipartFile.getInputStream()) {
-                    filePath = fileUpload.uploadFile(inputStream, attachSize, imgName);
-                }
-                String imageType = imgName.substring(imgName.lastIndexOf("."));
-                UploadResultVM uploadResultVM = new UploadResultVM();
-                uploadResultVM.setOriginal(imgName);
-                uploadResultVM.setName(imgName);
-                uploadResultVM.setUrl(filePath);
-                uploadResultVM.setSize(multipartFile.getSize());
-                uploadResultVM.setType(imageType);
-                uploadResultVM.setState("SUCCESS");
-                return uploadResultVM;
-            } catch (IOException e) {
-                logger.error(e.getMessage(), e);
-            }
-        } else {
-            UeditorConfigVM ueditorConfigVM = new UeditorConfigVM();
-            ueditorConfigVM.setImageActionName(IMAGE_UPLOAD);
-            ueditorConfigVM.setImageFieldName(IMAGE_UPLOAD_FILE);
-            ueditorConfigVM.setImageMaxSize(2048000L);
-            ueditorConfigVM.setImageAllowFiles(Arrays.asList(".png", ".jpg", ".jpeg", ".gif", ".bmp"));
-            ueditorConfigVM.setImageCompressEnable(true);
-            ueditorConfigVM.setImageCompressBorder(1600);
-            ueditorConfigVM.setImageInsertAlign("none");
-            ueditorConfigVM.setImageUrlPrefix("");
-            ueditorConfigVM.setImagePathFormat("");
-            return ueditorConfigVM;
-        }
-        return null;
-    }
-
-
-    @RequestMapping("/image")
-    @ResponseBody
-    public RestResponse questionUploadAndReadExcel(HttpServletRequest request) {
-        MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
-        MultipartFile multipartFile = multipartHttpServletRequest.getFile("file");
-        long attachSize = multipartFile.getSize();
-        String imgName = multipartFile.getOriginalFilename();
-        try (InputStream inputStream = multipartFile.getInputStream()) {
-            String filePath = fileUpload.uploadFile(inputStream, attachSize, imgName);
-            userService.changePicture(getCurrentUser(), filePath);
-            return RestResponse.ok(filePath);
-        } catch (IOException e) {
-            return RestResponse.fail(2, e.getMessage());
-        }
-    }
-
-
-}

+ 0 - 152
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/admin/UserController.java

@@ -1,152 +0,0 @@
-package vip.xiaonuo.exam.controller.admin;
-
-import vip.xiaonuo.exam.base.BaseApiController;
-import vip.xiaonuo.exam.base.RestResponse;
-import vip.xiaonuo.exam.domain.other.KeyValue;
-import vip.xiaonuo.exam.domain.User;
-import vip.xiaonuo.exam.domain.UserEventLog;
-import vip.xiaonuo.exam.domain.enums.UserStatusEnum;
-import vip.xiaonuo.exam.service.AuthenticationService;
-import vip.xiaonuo.exam.service.UserEventLogService;
-import vip.xiaonuo.exam.service.UserService;
-import vip.xiaonuo.exam.utility.DateTimeUtil;
-
-import vip.xiaonuo.exam.utility.PageInfoHelper;
-import com.github.pagehelper.PageInfo;
-
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
-import vip.xiaonuo.exam.viewmodel.admin.user.*;
-
-import javax.validation.Valid;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
-
-
-@RestController("AdminUserController")
-@RequestMapping(value = "/api/admin/user")
-public class UserController extends BaseApiController {
-
-    private final UserService userService;
-    private final UserEventLogService userEventLogService;
-    private final AuthenticationService authenticationService;
-
-    @Autowired
-    public UserController(UserService userService, UserEventLogService userEventLogService, AuthenticationService authenticationService) {
-        this.userService = userService;
-        this.userEventLogService = userEventLogService;
-        this.authenticationService = authenticationService;
-    }
-
-
-    @RequestMapping(value = "/page/list", method = RequestMethod.POST)
-    public RestResponse<PageInfo<UserResponseVM>> pageList(@RequestBody UserPageRequestVM model) {
-        PageInfo<User> pageInfo = userService.userPage(model);
-        PageInfo<UserResponseVM> page = PageInfoHelper.copyMap(pageInfo, d -> UserResponseVM.from(d));
-        return RestResponse.ok(page);
-    }
-
-
-    @RequestMapping(value = "/event/page/list", method = RequestMethod.POST)
-    public RestResponse<PageInfo<UserEventLogVM>> eventPageList(@RequestBody UserEventPageRequestVM model) {
-        PageInfo<UserEventLog> pageInfo = userEventLogService.page(model);
-        PageInfo<UserEventLogVM> page = PageInfoHelper.copyMap(pageInfo, d -> {
-            UserEventLogVM vm = modelMapper.map(d, UserEventLogVM.class);
-            vm.setCreateTime(DateTimeUtil.dateFormat(d.getCreateTime()));
-            return vm;
-        });
-        return RestResponse.ok(page);
-    }
-
-    @RequestMapping(value = "/select/{id}", method = RequestMethod.POST)
-    public RestResponse<UserResponseVM> select(@PathVariable Integer id) {
-        User user = userService.getUserById(id);
-        UserResponseVM userVm = UserResponseVM.from(user);
-        return RestResponse.ok(userVm);
-    }
-
-    @RequestMapping(value = "/current", method = RequestMethod.POST)
-    public RestResponse<UserResponseVM> current() {
-        User user = getCurrentUser();
-        UserResponseVM userVm = UserResponseVM.from(user);
-        return RestResponse.ok(userVm);
-    }
-
-
-    @RequestMapping(value = "/edit", method = RequestMethod.POST)
-    public RestResponse<User> edit(@RequestBody @Valid UserCreateVM model) {
-        if (model.getId() == null) {  //create
-            User existUser = userService.getUserByUserName(model.getUserName());
-            if (null != existUser) {
-                return new RestResponse<>(2, "用户已存在");
-            }
-
-            if (StringUtils.isBlank(model.getPassword())) {
-                return new RestResponse<>(3, "密码不能为空");
-            }
-        }
-        if (StringUtils.isBlank(model.getBirthDay())) {
-            model.setBirthDay(null);
-        }
-        User user = modelMapper.map(model, User.class);
-
-        if (model.getId() == null) {
-            String encodePwd = authenticationService.pwdEncode(model.getPassword());
-            user.setPassword(encodePwd);
-            user.setUserUuid(UUID.randomUUID().toString());
-            user.setCreateTime(new Date());
-            user.setLastActiveTime(new Date());
-            user.setDeleted(false);
-            userService.insertByFilter(user);
-        } else {
-            if (!StringUtils.isBlank(model.getPassword())) {
-                String encodePwd = authenticationService.pwdEncode(model.getPassword());
-                user.setPassword(encodePwd);
-            }
-            user.setModifyTime(new Date());
-            userService.updateByIdFilter(user);
-        }
-        return RestResponse.ok(user);
-    }
-
-
-    @RequestMapping(value = "/update", method = RequestMethod.POST)
-    public RestResponse update(@RequestBody @Valid UserUpdateVM model) {
-        User user = userService.selectById(getCurrentUser().getId());
-        modelMapper.map(model, user);
-        user.setModifyTime(new Date());
-        userService.updateByIdFilter(user);
-        return RestResponse.ok();
-    }
-
-
-    @RequestMapping(value = "/changeStatus/{id}", method = RequestMethod.POST)
-    public RestResponse<Integer> changeStatus(@PathVariable Integer id) {
-        User user = userService.getUserById(id);
-        UserStatusEnum userStatusEnum = UserStatusEnum.fromCode(user.getStatus());
-        Integer newStatus = userStatusEnum == UserStatusEnum.Enable ? UserStatusEnum.Disable.getCode() : UserStatusEnum.Enable.getCode();
-        user.setStatus(newStatus);
-        user.setModifyTime(new Date());
-        userService.updateByIdFilter(user);
-        return RestResponse.ok(newStatus);
-    }
-
-
-    @RequestMapping(value = "/delete/{id}", method = RequestMethod.POST)
-    public RestResponse delete(@PathVariable Integer id) {
-        User user = userService.getUserById(id);
-        user.setDeleted(true);
-        userService.updateByIdFilter(user);
-        return RestResponse.ok();
-    }
-
-
-    @RequestMapping(value = "/selectByUserName", method = RequestMethod.POST)
-    public RestResponse<List<KeyValue>> selectByUserName(@RequestBody String userName) {
-        List<KeyValue> keyValues = userService.selectByUserName(userName);
-        return RestResponse.ok(keyValues);
-    }
-
-}

+ 12 - 15
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/student/DashboardController.java

@@ -1,23 +1,21 @@
 package vip.xiaonuo.exam.controller.student;
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
 import vip.xiaonuo.exam.base.BaseApiController;
 import vip.xiaonuo.exam.base.RestResponse;
 import vip.xiaonuo.exam.domain.TaskExam;
 import vip.xiaonuo.exam.domain.TaskExamCustomerAnswer;
 import vip.xiaonuo.exam.domain.TextContent;
-import vip.xiaonuo.exam.domain.User;
 import vip.xiaonuo.exam.domain.enums.ExamPaperTypeEnum;
 import vip.xiaonuo.exam.domain.task.TaskItemAnswerObject;
 import vip.xiaonuo.exam.domain.task.TaskItemObject;
-
 import vip.xiaonuo.exam.service.*;
 import vip.xiaonuo.exam.utility.DateTimeUtil;
 import vip.xiaonuo.exam.utility.JsonUtil;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.RestController;
 import vip.xiaonuo.exam.viewmodel.student.dashboard.*;
 
 import java.util.ArrayList;
@@ -29,7 +27,7 @@ import java.util.stream.Collectors;
 @RequestMapping(value = "/api/student/dashboard")
 public class DashboardController extends BaseApiController {
 
-    private final UserService userService;
+
     private final ExamPaperService examPaperService;
     private final QuestionService questionService;
     private final TaskExamService taskExamService;
@@ -37,8 +35,7 @@ public class DashboardController extends BaseApiController {
     private final TextContentService textContentService;
 
     @Autowired
-    public DashboardController(UserService userService, ExamPaperService examPaperService, QuestionService questionService, TaskExamService taskExamService, TaskExamCustomerAnswerService taskExamCustomerAnswerService, TextContentService textContentService) {
-        this.userService = userService;
+    public DashboardController( ExamPaperService examPaperService, QuestionService questionService, TaskExamService taskExamService, TaskExamCustomerAnswerService taskExamCustomerAnswerService, TextContentService textContentService) {
         this.examPaperService = examPaperService;
         this.questionService = questionService;
         this.taskExamService = taskExamService;
@@ -49,16 +46,16 @@ public class DashboardController extends BaseApiController {
     @RequestMapping(value = "/index", method = RequestMethod.POST)
     public RestResponse<IndexVM> index() {
         IndexVM indexVM = new IndexVM();
-        User user = getCurrentUser();
+        SaBaseLoginUser user = getCurrentUser();
 
         PaperFilter fixedPaperFilter = new PaperFilter();
-        fixedPaperFilter.setGradeLevel(user.getUserLevel());
+        fixedPaperFilter.setGradeLevel(user.getSortCode());
         fixedPaperFilter.setExamPaperType(ExamPaperTypeEnum.Fixed.getCode());
         indexVM.setFixedPaper(examPaperService.indexPaper(fixedPaperFilter));
 
         PaperFilter timeLimitPaperFilter = new PaperFilter();
         timeLimitPaperFilter.setDateTime(new Date());
-        timeLimitPaperFilter.setGradeLevel(user.getUserLevel());
+        timeLimitPaperFilter.setGradeLevel(user.getSortCode());
         timeLimitPaperFilter.setExamPaperType(ExamPaperTypeEnum.TimeLimit.getCode());
 
         List<PaperInfo> limitPaper = examPaperService.indexPaper(timeLimitPaperFilter);
@@ -75,8 +72,8 @@ public class DashboardController extends BaseApiController {
 
     @RequestMapping(value = "/task", method = RequestMethod.POST)
     public RestResponse<List<TaskItemVm>> task() {
-        User user = getCurrentUser();
-        List<TaskExam> taskExams = taskExamService.getByGradeLevel(user.getUserLevel());
+        SaBaseLoginUser user = getCurrentUser();
+        List<TaskExam> taskExams = taskExamService.getByGradeLevel(user.getSortCode());
         if (taskExams.size() == 0) {
             return RestResponse.ok(new ArrayList<>());
         }

+ 8 - 5
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/student/EducationController.java

@@ -1,15 +1,18 @@
 package vip.xiaonuo.exam.controller.student;
 
 
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
 import vip.xiaonuo.exam.base.BaseApiController;
 import vip.xiaonuo.exam.base.RestResponse;
 import vip.xiaonuo.exam.domain.Subject;
-import vip.xiaonuo.exam.domain.User;
 import vip.xiaonuo.exam.service.SubjectService;
 import vip.xiaonuo.exam.viewmodel.student.education.SubjectEditRequestVM;
 import vip.xiaonuo.exam.viewmodel.student.education.SubjectVM;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
 import java.util.stream.Collectors;
@@ -27,8 +30,8 @@ public class EducationController extends BaseApiController {
 
     @RequestMapping(value = "/subject/list", method = RequestMethod.POST)
     public RestResponse<List<SubjectVM>> list() {
-        User user = getCurrentUser();
-        List<Subject> subjects = subjectService.getSubjectByLevel(user.getUserLevel());
+        SaBaseLoginUser user = getCurrentUser();
+        List<Subject> subjects = subjectService.getSubjectByLevel(user.getSortCode());
         List<SubjectVM> subjectVMS = subjects.stream().map(d -> {
             SubjectVM subjectVM = modelMapper.map(d, SubjectVM.class);
             subjectVM.setId(String.valueOf(d.getId()));

+ 7 - 6
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/student/ExamPaperAnswerController.java

@@ -1,5 +1,6 @@
 package vip.xiaonuo.exam.controller.student;
 
+import vip.xiaonuo.auth.core.pojo.SaBaseLoginUser;
 import vip.xiaonuo.exam.base.BaseApiController;
 import vip.xiaonuo.exam.base.RestResponse;
 
@@ -65,7 +66,7 @@ public class ExamPaperAnswerController extends BaseApiController {
 
     @RequestMapping(value = "/answerSubmit", method = RequestMethod.POST)
     public RestResponse answerSubmit(@RequestBody @Valid ExamPaperSubmitVM examPaperSubmitVM) {
-        User user = getCurrentUser();
+        SaBaseLoginUser user = getCurrentUser();
         ExamPaperAnswerInfo examPaperAnswerInfo = examPaperAnswerService.calculateExamPaperAnswer(examPaperSubmitVM, user);
         if (null == examPaperAnswerInfo) {
             return RestResponse.fail(2, "试卷不能重复做");
@@ -73,8 +74,8 @@ public class ExamPaperAnswerController extends BaseApiController {
         ExamPaperAnswer examPaperAnswer = examPaperAnswerInfo.getExamPaperAnswer();
         Integer userScore = examPaperAnswer.getUserScore();
         String scoreVm = ExamUtil.scoreToVM(userScore);
-        UserEventLog userEventLog = new UserEventLog(user.getId(), user.getUserName(), user.getRealName(), new Date());
-        String content = user.getUserName() + " 提交试卷:" + examPaperAnswerInfo.getExamPaper().getName()
+        UserEventLog userEventLog = new UserEventLog(user.getId(), user.getName(), user.getName(), new Date());
+        String content = user.getName() + " 提交试卷:" + examPaperAnswerInfo.getExamPaper().getName()
                 + " 得分:" + scoreVm
                 + " 耗时:" + ExamUtil.secondToVM(examPaperAnswer.getDoTime());
         userEventLog.setContent(content);
@@ -97,9 +98,9 @@ public class ExamPaperAnswerController extends BaseApiController {
             return RestResponse.fail(3, "试卷已完成");
         }
         String score = examPaperAnswerService.judge(examPaperSubmitVM);
-        User user = getCurrentUser();
-        UserEventLog userEventLog = new UserEventLog(user.getId(), user.getUserName(), user.getRealName(), new Date());
-        String content = user.getUserName() + " 批改试卷:" + examPaperAnswer.getPaperName() + " 得分:" + score;
+        SaBaseLoginUser user = getCurrentUser();
+        UserEventLog userEventLog = new UserEventLog(user.getId(), user.getName(), user.getName(), new Date());
+        String content = user.getName() + " 批改试卷:" + examPaperAnswer.getPaperName() + " 得分:" + score;
         userEventLog.setContent(content);
         eventPublisher.publishEvent(new UserEvent(userEventLog));
         return RestResponse.ok(score);

+ 0 - 51
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/student/UploadController.java

@@ -1,51 +0,0 @@
-package vip.xiaonuo.exam.controller.student;
-
-
-import vip.xiaonuo.exam.base.BaseApiController;
-import vip.xiaonuo.exam.base.RestResponse;
-import vip.xiaonuo.exam.service.FileUpload;
-import vip.xiaonuo.exam.service.UserService;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-import org.springframework.web.bind.annotation.RestController;
-import org.springframework.web.multipart.MultipartFile;
-import org.springframework.web.multipart.MultipartHttpServletRequest;
-
-import javax.servlet.http.HttpServletRequest;
-import java.io.IOException;
-import java.io.InputStream;
-
-
-@RequestMapping("/api/student/upload")
-@RestController("StudentUploadController")
-public class UploadController extends BaseApiController {
-
-    private final FileUpload fileUpload;
-    private final UserService userService;
-
-    @Autowired
-    public UploadController(FileUpload fileUpload, UserService userService) {
-        this.fileUpload = fileUpload;
-        this.userService = userService;
-    }
-
-
-    @RequestMapping("/image")
-    @ResponseBody
-    public RestResponse questionUploadAndReadExcel(HttpServletRequest request) {
-        MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request;
-        MultipartFile multipartFile = multipartHttpServletRequest.getFile("file");
-        long attachSize = multipartFile.getSize();
-        String imgName = multipartFile.getOriginalFilename();
-        try (InputStream inputStream = multipartFile.getInputStream()) {
-            String filePath = fileUpload.uploadFile(inputStream, attachSize, imgName);
-            userService.changePicture(getCurrentUser(), filePath);
-            return RestResponse.ok(filePath);
-        } catch (IOException e) {
-            return RestResponse.fail(2, e.getMessage());
-        }
-    }
-
-
-}

+ 0 - 140
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/student/UserController.java

@@ -1,140 +0,0 @@
-package vip.xiaonuo.exam.controller.student;
-
-import vip.xiaonuo.exam.base.BaseApiController;
-import vip.xiaonuo.exam.base.RestResponse;
-import vip.xiaonuo.exam.domain.Message;
-import vip.xiaonuo.exam.domain.MessageUser;
-import vip.xiaonuo.exam.domain.User;
-import vip.xiaonuo.exam.domain.UserEventLog;
-import vip.xiaonuo.exam.domain.enums.RoleEnum;
-import vip.xiaonuo.exam.domain.enums.UserStatusEnum;
-import vip.xiaonuo.exam.event.UserEvent;
-import vip.xiaonuo.exam.service.AuthenticationService;
-import vip.xiaonuo.exam.service.MessageService;
-import vip.xiaonuo.exam.service.UserEventLogService;
-import vip.xiaonuo.exam.service.UserService;
-import vip.xiaonuo.exam.utility.DateTimeUtil;
-import vip.xiaonuo.exam.utility.PageInfoHelper;
-
-import com.github.pagehelper.PageInfo;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.web.bind.annotation.*;
-import vip.xiaonuo.exam.viewmodel.student.user.*;
-
-import javax.validation.Valid;
-import java.util.Date;
-import java.util.List;
-import java.util.UUID;
-import java.util.stream.Collectors;
-
-@RestController("StudentUserController")
-@RequestMapping(value = "/api/student/user")
-public class UserController extends BaseApiController {
-
-    private final UserService userService;
-    private final UserEventLogService userEventLogService;
-    private final MessageService messageService;
-    private final AuthenticationService authenticationService;
-    private final ApplicationEventPublisher eventPublisher;
-
-    @Autowired
-    public UserController(UserService userService, UserEventLogService userEventLogService, MessageService messageService, AuthenticationService authenticationService, ApplicationEventPublisher eventPublisher) {
-        this.userService = userService;
-        this.userEventLogService = userEventLogService;
-        this.messageService = messageService;
-        this.authenticationService = authenticationService;
-        this.eventPublisher = eventPublisher;
-    }
-
-    @RequestMapping(value = "/current", method = RequestMethod.POST)
-    public RestResponse<UserResponseVM> current() {
-        User user = getCurrentUser();
-        UserResponseVM userVm = UserResponseVM.from(user);
-        return RestResponse.ok(userVm);
-    }
-
-
-    @RequestMapping(value = "/register", method = RequestMethod.POST)
-    public RestResponse register(@RequestBody @Valid UserRegisterVM model) {
-        User existUser = userService.getUserByUserName(model.getUserName());
-        if (null != existUser) {
-            return new RestResponse<>(2, "用户已存在");
-        }
-        User user = modelMapper.map(model, User.class);
-        String encodePwd = authenticationService.pwdEncode(model.getPassword());
-        user.setUserUuid(UUID.randomUUID().toString());
-        user.setPassword(encodePwd);
-        user.setRole(RoleEnum.STUDENT.getCode());
-        user.setStatus(UserStatusEnum.Enable.getCode());
-        user.setLastActiveTime(new Date());
-        user.setCreateTime(new Date());
-        user.setDeleted(false);
-        userService.insertByFilter(user);
-        UserEventLog userEventLog = new UserEventLog(user.getId(), user.getUserName(), user.getRealName(), new Date());
-        userEventLog.setContent("欢迎 " + user.getUserName() + " 注册来到学之思开源考试系统");
-        eventPublisher.publishEvent(new UserEvent(userEventLog));
-        return RestResponse.ok();
-    }
-
-
-    @RequestMapping(value = "/update", method = RequestMethod.POST)
-    public RestResponse update(@RequestBody @Valid UserUpdateVM model) {
-        if (StringUtils.isBlank(model.getBirthDay())) {
-            model.setBirthDay(null);
-        }
-        User user = userService.selectById(getCurrentUser().getId());
-        modelMapper.map(model, user);
-        user.setModifyTime(new Date());
-        userService.updateByIdFilter(user);
-        UserEventLog userEventLog = new UserEventLog(user.getId(), user.getUserName(), user.getRealName(), new Date());
-        userEventLog.setContent(user.getUserName() + " 更新了个人资料");
-        eventPublisher.publishEvent(new UserEvent(userEventLog));
-        return RestResponse.ok();
-    }
-
-    @RequestMapping(value = "/log", method = RequestMethod.POST)
-    public RestResponse<List<UserEventLogVM>> log() {
-        User user = getCurrentUser();
-        List<UserEventLog> userEventLogs = userEventLogService.getUserEventLogByUserId(user.getId());
-        List<UserEventLogVM> userEventLogVMS = userEventLogs.stream().map(d -> {
-            UserEventLogVM vm = modelMapper.map(d, UserEventLogVM.class);
-            vm.setCreateTime(DateTimeUtil.dateFormat(d.getCreateTime()));
-            return vm;
-        }).collect(Collectors.toList());
-        return RestResponse.ok(userEventLogVMS);
-    }
-
-    @RequestMapping(value = "/message/page", method = RequestMethod.POST)
-    public RestResponse<PageInfo<MessageResponseVM>> messagePageList(@RequestBody MessageRequestVM messageRequestVM) {
-        messageRequestVM.setReceiveUserId(getCurrentUser().getId());
-        PageInfo<MessageUser> messageUserPageInfo = messageService.studentPage(messageRequestVM);
-        List<Integer> ids = messageUserPageInfo.getList().stream().map(d -> d.getMessageId()).collect(Collectors.toList());
-        List<Message> messages = ids.size() != 0 ? messageService.selectMessageByIds(ids) : null;
-        PageInfo<MessageResponseVM> page = PageInfoHelper.copyMap(messageUserPageInfo, e -> {
-            MessageResponseVM vm = modelMapper.map(e, MessageResponseVM.class);
-            messages.stream().filter(d -> e.getMessageId().equals(d.getId())).findFirst().ifPresent(message -> {
-                vm.setTitle(message.getTitle());
-                vm.setContent(message.getContent());
-                vm.setSendUserName(message.getSendUserName());
-            });
-            vm.setCreateTime(DateTimeUtil.dateFormat(e.getCreateTime()));
-            return vm;
-        });
-        return RestResponse.ok(page);
-    }
-
-    @RequestMapping(value = "/message/unreadCount", method = RequestMethod.POST)
-    public RestResponse unReadCount() {
-        Integer count = messageService.unReadCount(getCurrentUser().getId());
-        return RestResponse.ok(count);
-    }
-
-    @RequestMapping(value = "/message/read/{id}", method = RequestMethod.POST)
-    public RestResponse read(@PathVariable Integer id) {
-        messageService.read(id);
-        return RestResponse.ok();
-    }
-
-}

+ 0 - 22
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/wx/BaseWXApiController.java

@@ -1,22 +0,0 @@
-package vip.xiaonuo.exam.controller.wx;
-
-import vip.xiaonuo.exam.context.WxContext;
-import vip.xiaonuo.exam.domain.User;
-import vip.xiaonuo.exam.domain.UserToken;
-import vip.xiaonuo.exam.utility.ModelMapperSingle;
-import org.modelmapper.ModelMapper;
-import org.springframework.beans.factory.annotation.Autowired;
-
-public class BaseWXApiController {
-    protected final static ModelMapper modelMapper = ModelMapperSingle.Instance();
-    @Autowired
-    private WxContext wxContext;
-
-    protected User getCurrentUser() {
-        return wxContext.getCurrentUser();
-    }
-
-    protected UserToken getUserToken() {
-        return wxContext.getCurrentUserToken();
-    }
-}

+ 0 - 85
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/wx/student/AuthController.java

@@ -1,85 +0,0 @@
-package vip.xiaonuo.exam.controller.wx.student;
-
-import vip.xiaonuo.exam.base.RestResponse;
-import vip.xiaonuo.exam.configuration.property.SystemConfig;
-import vip.xiaonuo.exam.controller.wx.BaseWXApiController;
-import vip.xiaonuo.exam.domain.UserToken;
-import vip.xiaonuo.exam.domain.enums.UserStatusEnum;
-import vip.xiaonuo.exam.service.AuthenticationService;
-import vip.xiaonuo.exam.service.UserService;
-import vip.xiaonuo.exam.service.UserTokenService;
-import vip.xiaonuo.exam.utility.WxUtil;
-import vip.xiaonuo.exam.viewmodel.wx.student.user.BindInfo;
-import vip.xiaonuo.exam.domain.User;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.*;
-
-import javax.validation.Valid;
-import javax.validation.constraints.NotBlank;
-
-
-@Controller("WXStudentAuthController")
-@RequestMapping(value = "/api/wx/student/auth")
-@ResponseBody
-public class AuthController extends BaseWXApiController {
-
-    private final SystemConfig systemConfig;
-    private final AuthenticationService authenticationService;
-    private final UserService userService;
-    private final UserTokenService userTokenService;
-
-    @Autowired
-    public AuthController(SystemConfig systemConfig, AuthenticationService authenticationService, UserService userService, UserTokenService userTokenService) {
-        this.systemConfig = systemConfig;
-        this.authenticationService = authenticationService;
-        this.userService = userService;
-        this.userTokenService = userTokenService;
-    }
-
-    @RequestMapping(value = "/bind", method = RequestMethod.POST)
-    public RestResponse bind(@Valid BindInfo model) {
-        User user = userService.getUserByUserName(model.getUserName());
-        if (user == null) {
-            return RestResponse.fail(2, "用户名或密码错误");
-        }
-        boolean result = authenticationService.authUser(user, model.getUserName(), model.getPassword());
-        if (!result) {
-            return RestResponse.fail(2, "用户名或密码错误");
-        }
-        UserStatusEnum userStatusEnum = UserStatusEnum.fromCode(user.getStatus());
-        if (UserStatusEnum.Disable == userStatusEnum) {
-            return RestResponse.fail(3, "用户被禁用");
-        }
-        String code = model.getCode();
-        String openid = WxUtil.getOpenId(systemConfig.getWx().getAppid(), systemConfig.getWx().getSecret(), code);
-        if (null == openid) {
-            return RestResponse.fail(4, "获取微信OpenId失败");
-        }
-        user.setWxOpenId(openid);
-        UserToken userToken = userTokenService.bind(user);
-        return RestResponse.ok(userToken.getToken());
-    }
-
-
-    @RequestMapping(value = "/checkBind", method = RequestMethod.POST)
-    public RestResponse checkBind(@Valid @NotBlank String code) {
-        String openid = WxUtil.getOpenId(systemConfig.getWx().getAppid(), systemConfig.getWx().getSecret(), code);
-        if (null == openid) {
-            return RestResponse.fail(3, "获取微信OpenId失败");
-        }
-        UserToken userToken = userTokenService.checkBind(openid);
-        if (null != userToken) {
-            return RestResponse.ok(userToken.getToken());
-        }
-        return RestResponse.fail(2, "用户未绑定");
-    }
-
-
-    @RequestMapping(value = "/unBind", method = RequestMethod.POST)
-    public RestResponse unBind() {
-        UserToken userToken = getUserToken();
-        userTokenService.unBind(userToken);
-        return RestResponse.ok();
-    }
-}

+ 0 - 129
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/wx/student/DashboardController.java

@@ -1,129 +0,0 @@
-package vip.xiaonuo.exam.controller.wx.student;
-
-import vip.xiaonuo.exam.base.RestResponse;
-import vip.xiaonuo.exam.controller.wx.BaseWXApiController;
-import vip.xiaonuo.exam.domain.TaskExam;
-import vip.xiaonuo.exam.domain.TaskExamCustomerAnswer;
-import vip.xiaonuo.exam.domain.TextContent;
-import vip.xiaonuo.exam.domain.User;
-import vip.xiaonuo.exam.domain.enums.ExamPaperTypeEnum;
-import vip.xiaonuo.exam.domain.task.TaskItemAnswerObject;
-import vip.xiaonuo.exam.domain.task.TaskItemObject;
-import vip.xiaonuo.exam.service.ExamPaperService;
-import vip.xiaonuo.exam.service.TaskExamCustomerAnswerService;
-import vip.xiaonuo.exam.service.TaskExamService;
-import vip.xiaonuo.exam.service.TextContentService;
-import vip.xiaonuo.exam.utility.DateTimeUtil;
-import vip.xiaonuo.exam.utility.JsonUtil;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestMethod;
-import org.springframework.web.bind.annotation.ResponseBody;
-import vip.xiaonuo.exam.viewmodel.student.dashboard.*;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import java.util.stream.Collectors;
-
-
-@Controller("WXStudentDashboardController")
-@RequestMapping(value = "/api/wx/student/dashboard")
-@ResponseBody
-public class DashboardController extends BaseWXApiController {
-
-    private final ExamPaperService examPaperService;
-    private final TextContentService textContentService;
-    private final TaskExamService taskExamService;
-    private final TaskExamCustomerAnswerService taskExamCustomerAnswerService;
-
-    @Autowired
-    public DashboardController(ExamPaperService examPaperService, TextContentService textContentService, TaskExamService taskExamService, TaskExamCustomerAnswerService taskExamCustomerAnswerService) {
-        this.examPaperService = examPaperService;
-        this.textContentService = textContentService;
-        this.taskExamService = taskExamService;
-        this.taskExamCustomerAnswerService = taskExamCustomerAnswerService;
-    }
-
-    @RequestMapping(value = "/index", method = RequestMethod.POST)
-    public RestResponse<IndexVM> index() {
-        IndexVM indexVM = new IndexVM();
-        User user = getCurrentUser();
-
-        PaperFilter fixedPaperFilter = new PaperFilter();
-        fixedPaperFilter.setGradeLevel(user.getUserLevel());
-        fixedPaperFilter.setExamPaperType(ExamPaperTypeEnum.Fixed.getCode());
-        indexVM.setFixedPaper(examPaperService.indexPaper(fixedPaperFilter));
-
-        PaperFilter timeLimitPaperFilter = new PaperFilter();
-        timeLimitPaperFilter.setDateTime(new Date());
-        timeLimitPaperFilter.setGradeLevel(user.getUserLevel());
-        timeLimitPaperFilter.setExamPaperType(ExamPaperTypeEnum.TimeLimit.getCode());
-
-        List<PaperInfo> limitPaper = examPaperService.indexPaper(timeLimitPaperFilter);
-        List<PaperInfoVM> paperInfoVMS = limitPaper.stream().map(d -> {
-            PaperInfoVM vm = modelMapper.map(d, PaperInfoVM.class);
-            vm.setStartTime(DateTimeUtil.dateFormat(d.getLimitStartTime()));
-            vm.setEndTime(DateTimeUtil.dateFormat(d.getLimitEndTime()));
-            return vm;
-        }).collect(Collectors.toList());
-        indexVM.setTimeLimitPaper(paperInfoVMS);
-        return RestResponse.ok(indexVM);
-    }
-
-    @RequestMapping(value = "/task", method = RequestMethod.POST)
-    public RestResponse<List<TaskItemVm>> task() {
-        User user = getCurrentUser();
-        List<TaskExam> taskExams = taskExamService.getByGradeLevel(user.getUserLevel());
-        if (taskExams.size() == 0) {
-            return RestResponse.ok(new ArrayList<>());
-        }
-        List<Integer> tIds = taskExams.stream().map(taskExam -> taskExam.getId()).collect(Collectors.toList());
-        List<TaskExamCustomerAnswer> taskExamCustomerAnswers = taskExamCustomerAnswerService.selectByTUid(tIds, user.getId());
-        List<TaskItemVm> vm = taskExams.stream().map(t -> {
-            TaskItemVm itemVm = new TaskItemVm();
-            itemVm.setId(t.getId());
-            itemVm.setTitle(t.getTitle());
-            TaskExamCustomerAnswer taskExamCustomerAnswer = taskExamCustomerAnswers.stream()
-                    .filter(tc -> tc.getTaskExamId().equals(t.getId())).findFirst().orElse(null);
-            List<TaskItemPaperVm> paperItemVMS = getTaskItemPaperVm(t.getFrameTextContentId(), taskExamCustomerAnswer);
-            itemVm.setPaperItems(paperItemVMS);
-            return itemVm;
-        }).collect(Collectors.toList());
-        return RestResponse.ok(vm);
-    }
-
-
-    private List<TaskItemPaperVm> getTaskItemPaperVm(Integer tFrameId, TaskExamCustomerAnswer taskExamCustomerAnswers) {
-        TextContent textContent = textContentService.selectById(tFrameId);
-        List<TaskItemObject> paperItems = JsonUtil.toJsonListObject(textContent.getContent(), TaskItemObject.class);
-
-        List<TaskItemAnswerObject> answerPaperItems = null;
-        if (null != taskExamCustomerAnswers) {
-            TextContent answerTextContent = textContentService.selectById(taskExamCustomerAnswers.getTextContentId());
-            answerPaperItems = JsonUtil.toJsonListObject(answerTextContent.getContent(), TaskItemAnswerObject.class);
-        }
-
-
-        List<TaskItemAnswerObject> finalAnswerPaperItems = answerPaperItems;
-        return paperItems.stream().map(p -> {
-                    TaskItemPaperVm ivm = new TaskItemPaperVm();
-                    ivm.setExamPaperId(p.getExamPaperId());
-                    ivm.setExamPaperName(p.getExamPaperName());
-                    if (null != finalAnswerPaperItems) {
-                        finalAnswerPaperItems.stream()
-                                .filter(a -> a.getExamPaperId().equals(p.getExamPaperId()))
-                                .findFirst()
-                                .ifPresent(a -> {
-                                    ivm.setExamPaperAnswerId(a.getExamPaperAnswerId());
-                                    ivm.setStatus(a.getStatus());
-                                });
-                    }
-                    return ivm;
-                }
-        ).collect(Collectors.toList());
-    }
-
-
-}

+ 0 - 135
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/wx/student/ExamPaperAnswerController.java

@@ -1,135 +0,0 @@
-package vip.xiaonuo.exam.controller.wx.student;
-
-import vip.xiaonuo.exam.base.RestResponse;
-import vip.xiaonuo.exam.controller.wx.BaseWXApiController;
-import vip.xiaonuo.exam.domain.*;
-import vip.xiaonuo.exam.domain.enums.QuestionTypeEnum;
-import vip.xiaonuo.exam.event.CalculateExamPaperAnswerCompleteEvent;
-import vip.xiaonuo.exam.event.UserEvent;
-import vip.xiaonuo.exam.service.ExamPaperAnswerService;
-import vip.xiaonuo.exam.service.ExamPaperService;
-import vip.xiaonuo.exam.service.SubjectService;
-import vip.xiaonuo.exam.utility.DateTimeUtil;
-import vip.xiaonuo.exam.utility.ExamUtil;
-import vip.xiaonuo.exam.utility.PageInfoHelper;
-import vip.xiaonuo.exam.viewmodel.admin.exam.ExamPaperEditRequestVM;
-import vip.xiaonuo.exam.viewmodel.student.exampaper.ExamPaperAnswerPageResponseVM;
-import vip.xiaonuo.exam.viewmodel.student.exampaper.ExamPaperAnswerPageVM;
-import com.github.pagehelper.PageInfo;
-import vip.xiaonuo.exam.viewmodel.student.exam.ExamPaperReadVM;
-import vip.xiaonuo.exam.viewmodel.student.exam.ExamPaperSubmitItemVM;
-import vip.xiaonuo.exam.viewmodel.student.exam.ExamPaperSubmitVM;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.validation.Valid;
-import java.util.*;
-import java.util.stream.Collectors;
-
-
-@Controller("WXStudentExamPaperAnswerController")
-@RequestMapping(value = "/api/wx/student/exampaper/answer")
-@ResponseBody
-public class ExamPaperAnswerController extends BaseWXApiController {
-
-    private final ExamPaperAnswerService examPaperAnswerService;
-    private final SubjectService subjectService;
-    private final ApplicationEventPublisher eventPublisher;
-    private final ExamPaperService examPaperService;
-
-    @Autowired
-    public ExamPaperAnswerController(ExamPaperAnswerService examPaperAnswerService, SubjectService subjectService, ApplicationEventPublisher eventPublisher, ExamPaperService examPaperService) {
-        this.examPaperAnswerService = examPaperAnswerService;
-        this.subjectService = subjectService;
-        this.eventPublisher = eventPublisher;
-        this.examPaperService = examPaperService;
-    }
-
-    @RequestMapping(value = "/pageList", method = RequestMethod.POST)
-    public RestResponse<PageInfo<ExamPaperAnswerPageResponseVM>> pageList(@Valid ExamPaperAnswerPageVM model) {
-        model.setCreateUser(getCurrentUser().getId());
-        PageInfo<ExamPaperAnswer> pageInfo = examPaperAnswerService.studentPage(model);
-        PageInfo<ExamPaperAnswerPageResponseVM> page = PageInfoHelper.copyMap(pageInfo, e -> {
-            ExamPaperAnswerPageResponseVM vm = modelMapper.map(e, ExamPaperAnswerPageResponseVM.class);
-            Subject subject = subjectService.selectById(vm.getSubjectId());
-            vm.setDoTime(ExamUtil.secondToVM(e.getDoTime()));
-            vm.setSystemScore(ExamUtil.scoreToVM(e.getSystemScore()));
-            vm.setUserScore(ExamUtil.scoreToVM(e.getUserScore()));
-            vm.setPaperScore(ExamUtil.scoreToVM(e.getPaperScore()));
-            vm.setSubjectName(subject.getName());
-            vm.setCreateTime(DateTimeUtil.dateFormat(e.getCreateTime()));
-            return vm;
-        });
-        return RestResponse.ok(page);
-    }
-
-
-    @RequestMapping(value = "/answerSubmit", method = RequestMethod.POST)
-    public RestResponse answerSubmit(HttpServletRequest request) {
-        ExamPaperSubmitVM examPaperSubmitVM = requestToExamPaperSubmitVM(request);
-        User user = getCurrentUser();
-        ExamPaperAnswerInfo examPaperAnswerInfo = examPaperAnswerService.calculateExamPaperAnswer(examPaperSubmitVM, user);
-        if (null == examPaperAnswerInfo) {
-            return RestResponse.fail(2, "试卷不能重复做");
-        }
-        ExamPaperAnswer examPaperAnswer = examPaperAnswerInfo.getExamPaperAnswer();
-        Integer userScore = examPaperAnswer.getUserScore();
-        String scoreVm = ExamUtil.scoreToVM(userScore);
-        UserEventLog userEventLog = new UserEventLog(user.getId(), user.getUserName(), user.getRealName(), new Date());
-        String content = user.getUserName() + " 提交试卷:" + examPaperAnswerInfo.getExamPaper().getName()
-                + " 得分:" + scoreVm
-                + " 耗时:" + ExamUtil.secondToVM(examPaperAnswer.getDoTime());
-        userEventLog.setContent(content);
-        eventPublisher.publishEvent(new CalculateExamPaperAnswerCompleteEvent(examPaperAnswerInfo));
-        eventPublisher.publishEvent(new UserEvent(userEventLog));
-        return RestResponse.ok(scoreVm);
-    }
-
-    private ExamPaperSubmitVM requestToExamPaperSubmitVM(HttpServletRequest request) {
-        ExamPaperSubmitVM examPaperSubmitVM = new ExamPaperSubmitVM();
-        examPaperSubmitVM.setId(Integer.parseInt(request.getParameter("id")));
-        examPaperSubmitVM.setDoTime(Integer.parseInt(request.getParameter("doTime")));
-        List<String> parameterNames = Collections.list(request.getParameterNames()).stream()
-                .filter(n -> n.contains("_"))
-                .collect(Collectors.toList());
-        //题目答案按序号分组
-        Map<String, List<String>> questionGroup = parameterNames.stream().collect(Collectors.groupingBy(p -> p.substring(0, p.indexOf("_"))));
-        List<ExamPaperSubmitItemVM> answerItems = new ArrayList<>();
-        questionGroup.forEach((k, v) -> {
-            ExamPaperSubmitItemVM examPaperSubmitItemVM = new ExamPaperSubmitItemVM();
-            String p = v.get(0);
-            String[] keys = p.split("_");
-            examPaperSubmitItemVM.setQuestionId(Integer.parseInt(keys[1]));
-            examPaperSubmitItemVM.setItemOrder(Integer.parseInt(keys[0]));
-            QuestionTypeEnum typeEnum = QuestionTypeEnum.fromCode(Integer.parseInt(keys[2]));
-            if (v.size() == 1) {
-                String content = request.getParameter(p);
-                examPaperSubmitItemVM.setContent(content);
-                if (typeEnum == QuestionTypeEnum.MultipleChoice) {
-                    examPaperSubmitItemVM.setContentArray(Arrays.asList(content.split(",")));
-                }
-            } else {  //多个空 填空题
-                List<String> answers = v.stream().sorted(Comparator.comparingInt(ExamUtil::lastNum)).map(inputKey -> request.getParameter(inputKey)).collect(Collectors.toList());
-                examPaperSubmitItemVM.setContentArray(answers);
-            }
-            answerItems.add(examPaperSubmitItemVM);
-        });
-        examPaperSubmitVM.setAnswerItems(answerItems);
-        return examPaperSubmitVM;
-    }
-
-
-    @PostMapping(value = "/read/{id}")
-    public RestResponse<ExamPaperReadVM> read(@PathVariable Integer id) {
-        ExamPaperReadVM vm = new ExamPaperReadVM();
-        ExamPaperAnswer examPaperAnswer = examPaperAnswerService.selectById(id);
-        ExamPaperEditRequestVM paper = examPaperService.examPaperToVM(examPaperAnswer.getExamPaperId());
-        ExamPaperSubmitVM answer = examPaperAnswerService.examPaperAnswerToVM(examPaperAnswer.getId());
-        vm.setPaper(paper);
-        vm.setAnswer(answer);
-        return RestResponse.ok(vm);
-    }
-}

+ 0 - 57
snowy-plugin/snowy-plugin-exam/snowy-plugin-exam-func/src/main/java/vip/xiaonuo/exam/controller/wx/student/ExamPaperController.java

@@ -1,57 +0,0 @@
-package vip.xiaonuo.exam.controller.wx.student;
-
-import vip.xiaonuo.exam.base.RestResponse;
-import vip.xiaonuo.exam.controller.wx.BaseWXApiController;
-import vip.xiaonuo.exam.domain.ExamPaper;
-import vip.xiaonuo.exam.domain.Subject;
-import vip.xiaonuo.exam.service.ExamPaperService;
-import vip.xiaonuo.exam.service.SubjectService;
-import vip.xiaonuo.exam.utility.DateTimeUtil;
-import vip.xiaonuo.exam.utility.PageInfoHelper;
-import vip.xiaonuo.exam.viewmodel.admin.exam.ExamPaperEditRequestVM;
-import vip.xiaonuo.exam.viewmodel.student.exam.ExamPaperPageResponseVM;
-import vip.xiaonuo.exam.viewmodel.student.exam.ExamPaperPageVM;
-import com.github.pagehelper.PageInfo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.*;
-
-import javax.validation.Valid;
-
-
-@Controller("WXStudentExamController")
-@RequestMapping(value = "/api/wx/student/exampaper")
-@ResponseBody
-public class ExamPaperController extends BaseWXApiController {
-
-    private final ExamPaperService examPaperService;
-    private final SubjectService subjectService;
-
-    @Autowired
-    public ExamPaperController(ExamPaperService examPaperService, SubjectService subjectService) {
-        this.examPaperService = examPaperService;
-        this.subjectService = subjectService;
-    }
-
-
-    @RequestMapping(value = "/select/{id}", method = RequestMethod.POST)
-    public RestResponse<ExamPaperEditRequestVM> select(@PathVariable Integer id) {
-        ExamPaperEditRequestVM vm = examPaperService.examPaperToVM(id);
-        return RestResponse.ok(vm);
-    }
-
-
-    @RequestMapping(value = "/pageList", method = RequestMethod.POST)
-    public RestResponse<PageInfo<ExamPaperPageResponseVM>> pageList(@Valid ExamPaperPageVM model) {
-        model.setLevelId(getCurrentUser().getUserLevel());
-        PageInfo<ExamPaper> pageInfo = examPaperService.studentPage(model);
-        PageInfo<ExamPaperPageResponseVM> page = PageInfoHelper.copyMap(pageInfo, e -> {
-            ExamPaperPageResponseVM vm = modelMapper.map(e, ExamPaperPageResponseVM.class);
-            Subject subject = subjectService.selectById(vm.getSubjectId());
-            vm.setSubjectName(subject.getName());
-            vm.setCreateTime(DateTimeUtil.dateFormat(e.getCreateTime()));
-            return vm;
-        });
-        return RestResponse.ok(page);
-    }
-}

Alguns arquivos não foram mostrados porque muitos arquivos mudaram nesse diff