Selaa lähdekoodia

Merge branch 'likeadmin' of http://101.37.148.192:3000/baowu/taphole into likeadmin

# Conflicts:
#	pom.xml
#	taphole-admin/pom.xml
#	taphole-admin/src/main/java/com/sckj/admin/config/WebMvcConfig.java
#	taphole-admin/src/main/java/com/sckj/admin/config/quartz/InvokeUtils.java
#	taphole-admin/src/main/resources/application-dev.yml
#	taphole-admin/src/main/resources/application-prod.yml
#	taphole-admin/src/main/resources/application-test.yml
#	taphole-admin/src/main/resources/application.yml
#	taphole-admin/src/main/resources/banner.txt
#	taphole-common/pom.xml
#	taphole-common/src/main/java/com/sckj/common/core/ServerResult.java
#	taphole-common/src/main/java/com/sckj/common/util/ArithUtils.java
#	taphole-common/src/main/java/com/sckj/common/util/Base64Util.java
#	taphole-common/src/main/java/com/sckj/common/util/HttpUtils.java
#	taphole-generator/pom.xml
zhanghao 7 kuukautta sitten
vanhempi
commit
7dfb2c679f
100 muutettua tiedostoa jossa 5288 lisäystä ja 0 poistoa
  1. 4 0
      .gitignore
  2. BIN
      doc/Windows_master_2024-10-11.zip
  3. BIN
      doc/ffmpeg-2024-10-07-git-496b8d7a13-full_build.7z
  4. BIN
      doc/ffmpeg-5.1.tar.gz
  5. BIN
      doc/ffmpeg-7.1.tar.xz
  6. BIN
      doc/yasm-1.3.0.tar.gz
  7. BIN
      doc/炉前出铁系统技术要求6-14.docx
  8. BIN
      doc/炉前智能出铁需求.pptx
  9. 321 0
      pom.xml
  10. 82 0
      taphole-admin/pom.xml
  11. 25 0
      taphole-admin/src/main/java/com/sckj/admin/TapholeAdminApplication.java
  12. 214 0
      taphole-admin/src/main/java/com/sckj/admin/TapholeAdminInterceptor.java
  13. 77 0
      taphole-admin/src/main/java/com/sckj/admin/TapholeAdminThreadLocal.java
  14. 29 0
      taphole-admin/src/main/java/com/sckj/admin/aop/Log.java
  15. 170 0
      taphole-admin/src/main/java/com/sckj/admin/aop/aspect/LogAspect.java
  16. 16 0
      taphole-admin/src/main/java/com/sckj/admin/aop/aspect/RequestType.java
  17. 34 0
      taphole-admin/src/main/java/com/sckj/admin/cache/CaptchaCache.java
  18. 45 0
      taphole-admin/src/main/java/com/sckj/admin/config/KaptChaConfig.java
  19. 24 0
      taphole-admin/src/main/java/com/sckj/admin/config/MybatisPlusConfig.java
  20. 49 0
      taphole-admin/src/main/java/com/sckj/admin/config/SwaggerConfig.java
  21. 89 0
      taphole-admin/src/main/java/com/sckj/admin/config/WebMvcConfig.java
  22. 54 0
      taphole-admin/src/main/java/com/sckj/admin/config/quartz/CronUtils.java
  23. 152 0
      taphole-admin/src/main/java/com/sckj/admin/config/quartz/InvokeUtils.java
  24. 104 0
      taphole-admin/src/main/java/com/sckj/admin/config/quartz/QuartzUtils.java
  25. 20 0
      taphole-admin/src/main/java/com/sckj/admin/config/quartz/TaskConstants.java
  26. 81 0
      taphole-admin/src/main/java/com/sckj/admin/config/quartz/exceution/AbstractQuartzJob.java
  27. 19 0
      taphole-admin/src/main/java/com/sckj/admin/config/quartz/exceution/QuartzDisExecution.java
  28. 17 0
      taphole-admin/src/main/java/com/sckj/admin/config/quartz/exceution/QuartzJobExecution.java
  29. 42 0
      taphole-admin/src/main/java/com/sckj/admin/config/stp/StpInException.java
  30. 89 0
      taphole-admin/src/main/java/com/sckj/admin/config/stp/StpInterConfig.java
  31. 94 0
      taphole-admin/src/main/java/com/sckj/admin/controller/AlbumsController.java
  32. 86 0
      taphole-admin/src/main/java/com/sckj/admin/controller/ArtCateController.java
  33. 77 0
      taphole-admin/src/main/java/com/sckj/admin/controller/ArticleController.java
  34. 68 0
      taphole-admin/src/main/java/com/sckj/admin/controller/CrontabController.java
  35. 40 0
      taphole-admin/src/main/java/com/sckj/admin/controller/IndexController.java
  36. 100 0
      taphole-admin/src/main/java/com/sckj/admin/controller/UploadController.java
  37. 59 0
      taphole-admin/src/main/java/com/sckj/admin/controller/UserController.java
  38. 38 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelH5Controller.java
  39. 38 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelMpController.java
  40. 44 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaCallBackController.java
  41. 38 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaController.java
  42. 42 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaMenuController.java
  43. 68 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaReplyDefaultController.java
  44. 68 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaReplyFollowController.java
  45. 68 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaReplyKeywordController.java
  46. 36 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOpController.java
  47. 33 0
      taphole-admin/src/main/java/com/sckj/admin/controller/decorate/DecorateDataController.java
  48. 39 0
      taphole-admin/src/main/java/com/sckj/admin/controller/decorate/DecoratePagesController.java
  49. 38 0
      taphole-admin/src/main/java/com/sckj/admin/controller/decorate/DecorateTabbarController.java
  50. 53 0
      taphole-admin/src/main/java/com/sckj/admin/controller/finance/FinanceRechargerController.java
  51. 51 0
      taphole-admin/src/main/java/com/sckj/admin/controller/finance/FinanceRefundController.java
  52. 34 0
      taphole-admin/src/main/java/com/sckj/admin/controller/finance/FinanceWalletController.java
  53. 36 0
      taphole-admin/src/main/java/com/sckj/admin/controller/marketing/MarketingRechargeController.java
  54. 62 0
      taphole-admin/src/main/java/com/sckj/admin/controller/monitor/MonitorCacheController.java
  55. 33 0
      taphole-admin/src/main/java/com/sckj/admin/controller/monitor/MonitorServerController.java
  56. 39 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingCopyrightController.java
  57. 82 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingDictDataController.java
  58. 78 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingDictTypeController.java
  59. 38 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingLoginController.java
  60. 48 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingNoticeController.java
  61. 62 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingPaymentController.java
  62. 38 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingProtocolController.java
  63. 38 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingSearchController.java
  64. 47 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingSmsController.java
  65. 57 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingStorageController.java
  66. 38 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingUserController.java
  67. 38 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingWebsiteController.java
  68. 103 0
      taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemAuthAdminController.java
  69. 72 0
      taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemAuthDeptController.java
  70. 78 0
      taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemAuthMenuController.java
  71. 74 0
      taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemAuthPostController.java
  72. 78 0
      taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemAuthRoleController.java
  73. 32 0
      taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemCacheController.java
  74. 50 0
      taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemLoginController.java
  75. 44 0
      taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemLogsController.java
  76. 17 0
      taphole-admin/src/main/java/com/sckj/admin/crontab/MyJob.java
  77. 95 0
      taphole-admin/src/main/java/com/sckj/admin/service/IAlbumsService.java
  78. 75 0
      taphole-admin/src/main/java/com/sckj/admin/service/IArtCateService.java
  79. 66 0
      taphole-admin/src/main/java/com/sckj/admin/service/IArticleService.java
  80. 27 0
      taphole-admin/src/main/java/com/sckj/admin/service/IChannelH5ConfigService.java
  81. 27 0
      taphole-admin/src/main/java/com/sckj/admin/service/IChannelMpConfigService.java
  82. 29 0
      taphole-admin/src/main/java/com/sckj/admin/service/IChannelOaCallBackService.java
  83. 28 0
      taphole-admin/src/main/java/com/sckj/admin/service/IChannelOaConfigService.java
  84. 30 0
      taphole-admin/src/main/java/com/sckj/admin/service/IChannelOaMenusService.java
  85. 63 0
      taphole-admin/src/main/java/com/sckj/admin/service/IChannelOaReplyDefaultService.java
  86. 63 0
      taphole-admin/src/main/java/com/sckj/admin/service/IChannelOaReplyFollowService.java
  87. 64 0
      taphole-admin/src/main/java/com/sckj/admin/service/IChannelOaReplyKeywordService.java
  88. 27 0
      taphole-admin/src/main/java/com/sckj/admin/service/IChannelOpService.java
  89. 58 0
      taphole-admin/src/main/java/com/sckj/admin/service/ICrontabService.java
  90. 21 0
      taphole-admin/src/main/java/com/sckj/admin/service/IDecorateDataService.java
  91. 24 0
      taphole-admin/src/main/java/com/sckj/admin/service/IDecoratePageService.java
  92. 27 0
      taphole-admin/src/main/java/com/sckj/admin/service/IDecorateTabbarService.java
  93. 41 0
      taphole-admin/src/main/java/com/sckj/admin/service/IFinanceRechargerService.java
  94. 34 0
      taphole-admin/src/main/java/com/sckj/admin/service/IFinanceRefundService.java
  95. 23 0
      taphole-admin/src/main/java/com/sckj/admin/service/IFinanceWalletService.java
  96. 23 0
      taphole-admin/src/main/java/com/sckj/admin/service/IIndexService.java
  97. 27 0
      taphole-admin/src/main/java/com/sckj/admin/service/IMarketingRechargeService.java
  98. 29 0
      taphole-admin/src/main/java/com/sckj/admin/service/ISettingCopyrightService.java
  99. 68 0
      taphole-admin/src/main/java/com/sckj/admin/service/ISettingDictDataService.java
  100. 68 0
      taphole-admin/src/main/java/com/sckj/admin/service/ISettingDictTypeService.java

+ 4 - 0
.gitignore

@@ -0,0 +1,4 @@
+.idea
+/logs
+*.iml
+target

BIN
doc/Windows_master_2024-10-11.zip


BIN
doc/ffmpeg-2024-10-07-git-496b8d7a13-full_build.7z


BIN
doc/ffmpeg-5.1.tar.gz


BIN
doc/ffmpeg-7.1.tar.xz


BIN
doc/yasm-1.3.0.tar.gz


BIN
doc/炉前出铁系统技术要求6-14.docx


BIN
doc/炉前智能出铁需求.pptx


+ 321 - 0
pom.xml

@@ -0,0 +1,321 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <!-- 模块信息 -->
+    <groupId>com.sckj</groupId>
+    <artifactId>taphole-java</artifactId>
+    <packaging>pom</packaging>
+    <version>1.0.0</version>
+    <modelVersion>4.0.0</modelVersion>
+    <modules>
+        <module>taphole-admin</module>
+        <module>taphole-front</module>
+        <module>taphole-common</module>
+        <module>taphole-generator</module>
+        <module>taphole-camera</module>
+        <module>taphole-device</module>
+        <module>taphole-warn</module>
+    </modules>
+
+    <!-- 特性信息 -->
+    <properties>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+
+        <taphole.version>1.0.0</taphole.version>
+        <java.version>1.8</java.version>
+        <log4j2.version>2.16.0</log4j2.version>
+
+        <mysql-connector.version>5.1.49</mysql-connector.version>
+        <mybatis-plus.version>3.5.2</mybatis-plus.version>
+        <mybatis-plus-join.version>1.2.4</mybatis-plus-join.version>
+        <pagehelper.version>1.4.5</pagehelper.version>
+
+        <lombok.version>1.18.24</lombok.version>
+        <fastJson2.version>2.0.16</fastJson2.version>
+        <commons-lang3.version>3.12.0</commons-lang3.version>
+        <commons.io.version>2.11.0</commons.io.version>
+        <commons-pool2.version>2.11.1</commons-pool2.version>
+        <google-gson.version>2.9.0</google-gson.version>
+
+        <kaptcha.version>2.3.2</kaptcha.version>
+        <bitwalker.version>1.2.4</bitwalker.version>
+        <oshi-core.version>6.1.2</oshi-core.version>
+        <sa-token.version>1.32.0</sa-token.version>
+        <sa-token-redis.version>1.32.0</sa-token-redis.version>
+        <easyexcel.version>3.1.3</easyexcel.version>
+        <quartz-scheduler.version>2.3.2</quartz-scheduler.version>
+
+        <qiniu.version>7.9.5</qiniu.version>
+        <qcloud-version>5.6.54</qcloud-version>
+        <tencentcloudapi.version>3.1.411</tencentcloudapi.version>
+        <aliyun-oss.version>3.10.2</aliyun-oss.version>
+        <aliyun-java.version>4.5.16</aliyun-java.version>
+
+        <weixin.version>4.4.0</weixin.version>
+        <knife4j>3.0.3</knife4j>
+        <socketio>2.0.3</socketio>
+    </properties>
+
+    <!-- 依赖声明 -->
+    <dependencyManagement>
+        <dependencies>
+            <!-- SpringBoot-->
+            <dependency>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-dependencies</artifactId>
+                <version>2.7.5</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+
+            <!-- Mysql-Connector -->
+            <dependency>
+                <groupId>mysql</groupId>
+                <artifactId>mysql-connector-java</artifactId>
+                <version>${mysql-connector.version}</version>
+            </dependency>
+
+            <!-- MyBatis-Plus -->
+            <dependency>
+                <groupId>com.baomidou</groupId>
+                <artifactId>mybatis-plus-boot-starter</artifactId>
+                <version>${mybatis-plus.version}</version>
+            </dependency>
+
+            <!-- MyBatis-Plus-Join -->
+            <dependency>
+                <groupId>com.github.yulichang</groupId>
+                <artifactId>mybatis-plus-join</artifactId>
+                <version>${mybatis-plus-join.version}</version>
+            </dependency>
+
+            <!-- MyBatis-PageHelper -->
+            <dependency>
+                <groupId>com.github.pagehelper</groupId>
+                <artifactId>pagehelper-spring-boot-starter</artifactId>
+                <version>${pagehelper.version}</version>
+            </dependency>
+
+            <!-- Pool2 -->
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-pool2</artifactId>
+                <version>${commons-pool2.version}</version>
+            </dependency>
+
+            <!-- Lombok -->
+            <dependency>
+                <groupId>org.projectlombok</groupId>
+                <artifactId>lombok</artifactId>
+                <version>${lombok.version}</version>
+            </dependency>
+
+            <!-- Fastjson2 -->
+            <dependency>
+                <groupId>com.alibaba.fastjson2</groupId>
+                <artifactId>fastjson2</artifactId>
+                <version>${fastJson2.version}</version>
+            </dependency>
+
+            <!-- kaptCha -->
+            <dependency>
+                <groupId>com.github.penggle</groupId>
+                <artifactId>kaptcha</artifactId>
+                <version>${kaptcha.version}</version>
+            </dependency>
+
+            <!-- SaToken -->
+            <dependency>
+                <groupId>cn.dev33</groupId>
+                <artifactId>sa-token-spring-boot-starter</artifactId>
+                <version>${sa-token.version}</version>
+            </dependency>
+
+            <!-- SaToken-Redis -->
+            <dependency>
+                <groupId>cn.dev33</groupId>
+                <artifactId>sa-token-dao-redis-jackson</artifactId>
+                <version>${sa-token-redis.version}</version>
+            </dependency>
+
+            <!-- Quartz-Scheduler -->
+            <dependency>
+                <groupId>org.quartz-scheduler</groupId>
+                <artifactId>quartz</artifactId>
+                <version>${quartz-scheduler.version}</version>
+            </dependency>
+
+            <!-- Gson工具 -->
+            <dependency>
+                <groupId>com.google.code.gson</groupId>
+                <artifactId>gson</artifactId>
+                <version>${google-gson.version}</version>
+            </dependency>
+
+            <!-- UA工具 -->
+            <dependency>
+                <groupId>nl.bitwalker</groupId>
+                <artifactId>UserAgentUtils</artifactId>
+                <version>${bitwalker.version}</version>
+            </dependency>
+
+            <!-- Str工具 -->
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>${commons-lang3.version}</version>
+            </dependency>
+
+            <!-- IO工具 -->
+            <dependency>
+                <groupId>commons-io</groupId>
+                <artifactId>commons-io</artifactId>
+                <version>${commons.io.version}</version>
+            </dependency>
+
+            <!-- 七牛云OSS -->
+            <dependency>
+                <groupId>com.qiniu</groupId>
+                <artifactId>qiniu-java-sdk</artifactId>
+                <version>${qiniu.version}</version>
+            </dependency>
+
+            <!-- 腾讯云COS -->
+            <dependency>
+                <groupId>com.qcloud</groupId>
+                <artifactId>cos_api</artifactId>
+                <version>${qcloud-version}</version>
+            </dependency>
+
+            <!-- 阿里云OSS -->
+            <dependency>
+                <groupId>com.aliyun.oss</groupId>
+                <artifactId>aliyun-sdk-oss</artifactId>
+                <version>${aliyun-oss.version}</version>
+            </dependency>
+
+            <!-- 腾讯云短信 -->
+            <dependency>
+                <groupId>com.tencentcloudapi</groupId>
+                <artifactId>tencentcloud-sdk-java</artifactId>
+                <version>${tencentcloudapi.version}</version>
+            </dependency>
+
+            <!-- 阿里云短信 -->
+            <dependency>
+                <groupId>com.aliyun</groupId>
+                <artifactId>aliyun-java-sdk-core</artifactId>
+                <version>${aliyun-java.version}</version>
+            </dependency>
+
+            <!-- EasyExcel -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>easyexcel</artifactId>
+                <version>${easyexcel.version}</version>
+            </dependency>
+
+            <!-- 系统监控 -->
+            <dependency>
+                <groupId>com.github.oshi</groupId>
+                <artifactId>oshi-core</artifactId>
+                <version>${oshi-core.version}</version>
+            </dependency>
+
+            <!-- Swagger3 -->
+            <dependency>
+                <groupId>io.springfox</groupId>
+                <artifactId>springfox-boot-starter</artifactId>
+                <version>3.0.0</version>
+            </dependency>
+
+            <!-- 微信小程序 -->
+            <dependency>
+                <groupId>com.github.binarywang</groupId>
+                <artifactId>weixin-java-miniapp</artifactId>
+                <version>${weixin.version}</version>
+            </dependency>
+
+            <!-- 微信公众号 -->
+            <dependency>
+                <groupId>com.github.binarywang</groupId>
+                <artifactId>weixin-java-mp</artifactId>
+                <version>${weixin.version}</version>
+            </dependency>
+
+            <!-- 微信支付 -->
+            <dependency>
+                <groupId>com.github.binarywang</groupId>
+                <artifactId>weixin-java-pay</artifactId>
+                <version>${weixin.version}</version>
+            </dependency>
+
+            <!--knife4j-->
+            <dependency>
+                <groupId>com.github.xiaoymin</groupId>
+                <artifactId>knife4j-spring-boot-starter</artifactId>
+                <version>${knife4j}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.corundumstudio.socketio</groupId>
+                <artifactId>netty-socketio</artifactId>
+                <version>${socketio}</version>
+            </dependency>
+
+
+
+            <!-- 全局工具 -->
+            <dependency>
+                <groupId>com.sckj</groupId>
+                <artifactId>taphole-common</artifactId>
+                <version>${taphole.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.sckj</groupId>
+                <artifactId>taphole-camera</artifactId>
+                <version>${taphole.version}</version>
+            </dependency>
+
+            <dependency>
+                <groupId>com.sckj</groupId>
+                <artifactId>taphole-device</artifactId>
+                <version>${taphole.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sckj</groupId>
+                <artifactId>taphole-warn</artifactId>
+                <version>${taphole.version}</version>
+            </dependency>
+
+        </dependencies>
+    </dependencyManagement>
+
+    <!-- 插件管理 -->
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.6.4</version>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.10.0</version>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 82 - 0
taphole-admin/pom.xml

@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+    <!-- 父工程 -->
+    <parent>
+        <artifactId>taphole-java</artifactId>
+        <groupId>com.sckj</groupId>
+        <version>1.0.0</version>
+    </parent>
+
+    <!-- 模块信息 -->
+    <modelVersion>4.0.0</modelVersion>
+    <artifactId>taphole-admin</artifactId>
+    <packaging>jar</packaging>
+
+    <!-- 项目管理 -->
+    <dependencies>
+        <!-- 全局工具 -->
+        <dependency>
+            <groupId>com.sckj</groupId>
+            <artifactId>taphole-common</artifactId>
+        </dependency>
+
+        <!-- 代码生成 -->
+        <dependency>
+            <groupId>com.sckj</groupId>
+            <artifactId>taphole-generator</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+
+        <!-- 验证码 -->
+        <dependency>
+            <groupId>com.github.penggle</groupId>
+            <artifactId>kaptcha</artifactId>
+        </dependency>
+
+        <!-- SaToken -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-spring-boot-starter</artifactId>
+        </dependency>
+
+        <!-- SaToken-Redis -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-dao-redis-jackson</artifactId>
+        </dependency>
+
+        <!-- Quartz-Scheduler -->
+        <dependency>
+            <groupId>org.quartz-scheduler</groupId>
+            <artifactId>quartz</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sckj</groupId>
+            <artifactId>taphole-camera</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <!-- 插件管理 -->
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.6.4</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 25 - 0
taphole-admin/src/main/java/com/sckj/admin/TapholeAdminApplication.java

@@ -0,0 +1,25 @@
+package com.sckj.admin;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+/**
+ * 启动器
+ */
+@Configuration
+@ComponentScan(basePackages = {"com.sckj"})
+@MapperScan(basePackages = {"com.sckj.**.mapper"})
+@EnableTransactionManagement
+@SpringBootApplication(exclude = {RedisRepositoriesAutoConfiguration.class})
+public class TapholeAdminApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(TapholeAdminApplication.class, args);
+    }
+
+}

+ 214 - 0
taphole-admin/src/main/java/com/sckj/admin/TapholeAdminInterceptor.java

@@ -0,0 +1,214 @@
+package com.sckj.admin;
+
+import cn.dev33.satoken.stp.StpUtil;
+import com.alibaba.fastjson2.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.sckj.common.aop.NotPower;
+import com.sckj.common.aop.NotLogin;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.entity.system.SystemAuthAdmin;
+import com.sckj.common.enums.ErrorEnum;
+import com.sckj.common.exception.LoginException;
+import com.sckj.common.mapper.system.SystemAuthAdminMapper;
+import com.sckj.common.util.StringUtils;
+import com.sckj.common.util.YmlUtils;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.stereotype.Component;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.lang.reflect.Method;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 拦截器
+ */
+@Component
+public class TapholeAdminInterceptor implements HandlerInterceptor {
+
+    @Resource
+    SystemAuthAdminMapper systemAuthAdminMapper;
+
+    /**
+     * 前置处理器
+     *
+     * @param request 请求
+     * @param response 响应
+     * @param handler 处理
+     * @return boolean
+     * @throws Exception 异常
+     */
+    @Override
+    public boolean preHandle(@NotNull HttpServletRequest request,
+                             @NotNull HttpServletResponse response,
+                             @NotNull Object handler) throws Exception {
+
+        // 请求方法类型
+        String reqUri = request.getRequestURI();
+        if (!(handler instanceof HandlerMethod) || !reqUri.startsWith("/api")) {
+            return HandlerInterceptor.super.preHandle(request, response, handler);
+        }
+
+        // 登录权限校验
+        try {
+            response.setContentType("application/json;charset=utf-8");
+            Method method = this.obtainAop(handler);
+            this.checkLogin(method, reqUri);
+        } catch (LoginException e) {
+            AjaxResult<Object> result = AjaxResult.failed(e.getCode(), e.getMsg());
+            response.getWriter().print(JSON.toJSONString(result));
+            return false;
+        }
+
+        // 演示环境拦截
+        String env = YmlUtils.get("like.production");
+        if (StringUtils.isNotNull(env) && env.equals("true")) {
+            String prefix = "/api/";
+            String route = request.getRequestURI().replaceFirst(prefix, "");
+            String auths = route.replace("/", ":");
+            List<String> ignoreUrl = Arrays.asList("system:login", "system:logout");
+            if (request.getMethod().equals("POST") && !ignoreUrl.contains(auths)) {
+                String message = "演示环境不支持修改数据,请下载源码本地部署体验";
+                AjaxResult<Object> result = AjaxResult.failed(ErrorEnum.NO_PERMISSION.getCode(), message);
+                response.getWriter().print(JSON.toJSONString(result));
+                return false;
+            }
+        }
+
+        // 验证通过继续
+        return HandlerInterceptor.super.preHandle(request, response, handler);
+    }
+
+    /**
+     * 后置处理器
+     *
+     * @param request 请求
+     * @param response 响应
+     * @param handler 处理
+     * @param ex 异常
+     * @throws Exception 异常
+     */
+    @Override
+    public void afterCompletion(@NotNull HttpServletRequest request,
+                                @NotNull HttpServletResponse response,
+                                @NotNull Object handler, Exception ex) throws Exception {
+        TapholeAdminThreadLocal.remove();
+        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
+    }
+
+    /**
+     * 提取注解
+     *
+     * @param handler 处理器
+     * @return Method
+     * @throws Exception 异常
+     */
+    private Method obtainAop(@NotNull Object handler) throws Exception {
+        String[] objArr = handler.toString().split("#");
+        String methodStr = objArr[1].split("\\(")[0];
+        String classStr = objArr[0];
+        Class<?> clazz = Class.forName(classStr);
+
+        Method[] methods = clazz.getDeclaredMethods();
+        for (Method method : methods) {
+            if (method.getName().equals(methodStr)) {
+                return method;
+            }
+        }
+
+        return null;
+    }
+
+    /**
+     * 登录验证
+     *
+     * @param method 方法类
+     * @author fzr
+     */
+    private void checkLogin(Method method, String reqUri) {
+        for (int i=0; i<=0; i++) {
+            // 免登校验
+            if (StringUtils.isNotNull(method) && method.isAnnotationPresent(NotLogin.class)) {
+                break;
+            }
+
+            // 令牌校验
+            String token = StpUtil.getTokenValue();
+            if (StringUtils.isNull(token) || StringUtils.isBlank(token)) {
+                Integer errCode = ErrorEnum.TOKEN_EMPTY.getCode();
+                String errMsg = ErrorEnum.TOKEN_EMPTY.getMsg();
+                throw new LoginException(errCode, errMsg);
+            }
+
+            // 登录校验
+            Object id = StpUtil.getLoginId();
+            if (StringUtils.isNull(id)) {
+                Integer errCode = ErrorEnum.TOKEN_INVALID.getCode();
+                String errMsg = ErrorEnum.TOKEN_INVALID.getMsg();
+                throw new LoginException(errCode, errMsg);
+            }
+
+            // 用户校验
+            SystemAuthAdmin adminUser = systemAuthAdminMapper.selectOne(
+                    new QueryWrapper<SystemAuthAdmin>()
+                        .select("id,username,role_ids,dept_ids,post_ids,is_disable")
+                        .eq("id", Integer.parseInt(id.toString()))
+                        .eq("is_delete", 0)
+                        .last("limit 1"));
+
+            // 删除校验
+            if (StringUtils.isNull(adminUser)) {
+                Integer errCode = ErrorEnum.TOKEN_INVALID.getCode();
+                String errMsg = ErrorEnum.TOKEN_INVALID.getMsg();
+                throw new LoginException(errCode, errMsg);
+            }
+
+            // 禁用校验
+            if (adminUser.getIsDisable().equals(1)) {
+                Integer errCode = ErrorEnum.LOGIN_DISABLE_ERROR.getCode();
+                String errMsg = ErrorEnum.LOGIN_DISABLE_ERROR.getMsg();
+                throw new LoginException(errCode, errMsg);
+            }
+
+            // 写入线程
+            TapholeAdminThreadLocal.put("adminId", id);
+            TapholeAdminThreadLocal.put("username", adminUser.getUsername());
+            TapholeAdminThreadLocal.put("roleIds", adminUser.getRoleIds());
+            TapholeAdminThreadLocal.put("deptIds", adminUser.getDeptIds());
+            TapholeAdminThreadLocal.put("postIds", adminUser.getPostIds());
+
+            // 权限校验
+            if (!adminUser.getId().equals(1)) {
+                this.checkAuth(method, reqUri);
+            }
+        }
+    }
+
+    /**
+     * 权限验证
+     *
+     * @param method 方法类
+     * @param uri 请求路由
+     * @author fzr
+     */
+    private void checkAuth(Method method, String uri) {
+        for (int i=0; i<=0; i++) {
+            // 免权限校验
+            if (StringUtils.isNotNull(method) && method.isAnnotationPresent(NotPower.class)) {
+                break;
+            }
+
+            // 路由转权限
+            String prefix = "/api/";
+            String route = uri.replaceFirst(prefix, "");
+            String auths = route.replace("/", ":");
+
+            // 校验权限
+            StpUtil.checkPermission(auths);
+        }
+    }
+}

+ 77 - 0
taphole-admin/src/main/java/com/sckj/admin/TapholeAdminThreadLocal.java

@@ -0,0 +1,77 @@
+package com.sckj.admin;
+
+
+
+import com.sckj.common.util.ListUtils;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentSkipListMap;
+
+/**
+ * 本地线程
+ */
+public class TapholeAdminThreadLocal {
+
+    /**
+     * 构造方法
+     */
+    public TapholeAdminThreadLocal() {}
+
+    /**
+     * 取得本地线程对象
+     */
+    private static final ThreadLocal<Map<String, Object>> MY_LOCAL = new ThreadLocal<>();
+
+    /**
+     * 写入本地线程
+     */
+    public static void put(String key, Object val) {
+        Map<String, Object> map = MY_LOCAL.get();
+        if (map == null) {
+            synchronized (MY_LOCAL) {
+                map = new ConcurrentSkipListMap<>();
+            }
+        }
+        map.put(key, val);
+        MY_LOCAL.set(map);
+    }
+
+    /**
+     * 获取本地线程
+     */
+    public static Object get(String key) {
+        return MY_LOCAL.get().getOrDefault(key, "");
+    }
+
+    /**
+     * 获取管理员ID
+     */
+    public static Integer getAdminId() {
+        String adminId = TapholeAdminThreadLocal.get("adminId").toString();
+        if (adminId.equals("")) {
+            return 0;
+        }
+        return Integer.parseInt(adminId);
+    }
+
+    /**
+     * 获取角色ID
+     */
+    public static List<Integer> getRoleIds() {
+        String roleIds = TapholeAdminThreadLocal.get("roleIds").toString();
+        if (roleIds.equals("") || roleIds.equals("0")) {
+            return Collections.emptyList();
+        }
+        return ListUtils.stringToListAsInt(roleIds, ",");
+    }
+
+    /**
+     * 删除本地线程
+     */
+    public static void remove() {
+        MY_LOCAL.remove();
+    }
+
+}

+ 29 - 0
taphole-admin/src/main/java/com/sckj/admin/aop/Log.java

@@ -0,0 +1,29 @@
+package com.sckj.admin.aop;
+
+import com.sckj.admin.aop.aspect.RequestType;
+
+import java.lang.annotation.*;
+
+/**
+ * 日志记录类
+ */
+@Target({ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface Log {
+
+    /**
+     * 模块名称
+     *
+     * @return String
+     */
+    String title() default "";
+
+    /**
+     * 请求类型
+     *
+     * @return String
+     */
+    RequestType requestType() default RequestType.Default;
+
+}

+ 170 - 0
taphole-admin/src/main/java/com/sckj/admin/aop/aspect/LogAspect.java

@@ -0,0 +1,170 @@
+package com.sckj.admin.aop.aspect;
+
+import com.alibaba.fastjson2.JSON;
+import com.sckj.admin.TapholeAdminThreadLocal;
+import com.sckj.admin.aop.Log;
+import com.sckj.common.entity.system.SystemLogOperate;
+import com.sckj.common.mapper.system.SystemLogOperateMapper;
+import com.sckj.common.util.IpUtils;
+import com.sckj.common.util.RequestUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.AfterThrowing;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.support.StandardMultipartHttpServletRequest;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
+
+@Aspect
+@Component
+public class LogAspect {
+
+    @Resource
+    SystemLogOperateMapper systemLogOperateMapper;
+
+    private static final Logger log = LoggerFactory.getLogger(LogAspect.class);
+
+    /**
+     * 线程本地变量
+     */
+    private static final ThreadLocal<Long> threadLocal = new ThreadLocal<>();
+
+    /**
+     * 单线程化的线程池
+     */
+    private final ExecutorService executor =  Executors.newSingleThreadExecutor();
+
+    /**
+     * 声明切面点拦截那些类
+     */
+    @Pointcut("@annotation(com.sckj.admin.aop.Log)")
+    private void pointCutMethodController() {}
+
+    /**
+     * 环绕通知前后增强
+     */
+    @Around(value = "pointCutMethodController()")
+    public Object doAroundService(ProceedingJoinPoint joinPoint) throws Throwable {
+        // 开始时间
+        threadLocal.set(System.currentTimeMillis());
+        // 执行方法
+        Object result = joinPoint.proceed();
+        // 保存日志
+        recordLog(joinPoint, null);
+        // 返回结果
+        return result;
+    }
+
+    /**
+     * 拦截异常操作
+     *
+     * @param joinPoint 切点
+     * @param e 异常
+     */
+    @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e")
+    public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) {
+        recordLog(joinPoint, e);
+    }
+
+    /**
+     * 记录日志信息
+     *
+     * @param joinPointObj joinPoint
+     * @param e Exception 错误异常
+     */
+    private void recordLog(Object joinPointObj, final Exception e) {
+        try {
+            long beginTime = threadLocal.get();
+            long endTime = System.currentTimeMillis();
+            ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+            if (requestAttributes != null) {
+                // 取得请求对象
+                HttpServletRequest request = requestAttributes.getRequest();
+
+                // 获取当前的用户
+                Integer adminId = TapholeAdminThreadLocal.getAdminId();
+
+                // 获取日志注解
+                ProceedingJoinPoint joinPoint = (ProceedingJoinPoint) joinPointObj;
+                MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+                Method method = signature.getMethod();
+                Log logAnnotation = method.getAnnotation(Log.class);
+
+                // 方法名称
+                String className = joinPoint.getTarget().getClass().getName();
+                String methodName = joinPoint.getSignature().getName();
+
+                // 获取请求参数
+                String queryString = request.getQueryString();
+                Object[] args = joinPoint.getArgs();
+                String params = "";
+                if (args.length > 0) {
+                    if("POST".equals(request.getMethod())){
+                        if (RequestType.File.equals(logAnnotation.requestType())){
+                            //文件类型获取文件名称作为参数
+                            StandardMultipartHttpServletRequest standardMultipartHttpServletRequest = (StandardMultipartHttpServletRequest) args[0];
+                            //提取文件名
+                            params = standardMultipartHttpServletRequest
+                                    .getMultiFileMap()
+                                    .values()
+                                    .stream()
+                                    .map(m -> m.stream()
+                                            .map(MultipartFile::getOriginalFilename)
+                                            .collect(Collectors.joining(",")))
+                                    .collect(Collectors.joining(","));
+                        } else {
+                            params = JSON.toJSONString(args);
+                        }
+
+                    } else if("GET".equals(request.getMethod())){
+                        params = queryString;
+                    }
+                }
+
+                // 错误信息
+                String error = "";
+                int status = 1;
+                if (e != null) {
+                    error = e.getMessage();
+                    status = 2; // 1=成功, 2=失败
+                }
+
+                // 数据库日志
+                SystemLogOperate model = new SystemLogOperate();
+                model.setAdminId(adminId);
+                model.setTitle(logAnnotation.title());
+                model.setIp(IpUtils.getIpAddress());
+                model.setType(request.getMethod());
+                model.setMethod(className + "." + methodName + "()");
+                model.setUrl(RequestUtils.route());
+                model.setArgs(params);
+                model.setError(error);
+                model.setStatus(status);
+                model.setStartTime(beginTime / 1000);
+                model.setEndTime(endTime / 1000);
+                model.setTaskTime(endTime - beginTime);
+                model.setCreateTime(System.currentTimeMillis() / 1000);
+                executor.submit(() -> {
+                    systemLogOperateMapper.insert(model);
+                });
+            }
+        } catch (Exception ex) {
+            log.error("异常信息:{}", ex.getMessage());
+        }
+    }
+
+}

+ 16 - 0
taphole-admin/src/main/java/com/sckj/admin/aop/aspect/RequestType.java

@@ -0,0 +1,16 @@
+package com.sckj.admin.aop.aspect;
+
+/**
+ * 请求参数类
+ */
+public enum RequestType {
+    /**
+     * 文件类型
+     */
+    File,
+    /**
+     * 默认数据类型
+     */
+    Default
+
+}

+ 34 - 0
taphole-admin/src/main/java/com/sckj/admin/cache/CaptchaCache.java

@@ -0,0 +1,34 @@
+package com.sckj.admin.cache;
+
+import com.sckj.common.util.IpUtils;
+import com.sckj.common.util.RedisUtils;
+import com.sckj.common.util.StringUtils;
+import com.sckj.common.util.YmlUtils;
+
+/**
+ * 验证码缓存器
+ */
+public class CaptchaCache {
+
+    public static String get(String uuid) {
+        String ip = IpUtils.getIpAddress().replaceAll("\\.", "");
+        String captchaKey = YmlUtils.get("like.captcha.token") + ip + ":" + uuid;
+        Object code = RedisUtils.get(captchaKey);
+
+        if (StringUtils.isNull(code) || StringUtils.isEmpty(code.toString())) {
+            return "";
+        }
+
+        RedisUtils.del(captchaKey);
+        return code.toString();
+    }
+
+    public static void set(String code, String uuid) {
+        String ip   = IpUtils.getIpAddress().replaceAll("\\.", "");
+        String verifyKey = YmlUtils.get("like.captcha.token") + ip + ":" + uuid;
+        long expireTime = Long.parseLong(YmlUtils.get("like.captcha.expire"));
+
+        RedisUtils.set(verifyKey, code.toLowerCase(), expireTime);
+    }
+
+}

+ 45 - 0
taphole-admin/src/main/java/com/sckj/admin/config/KaptChaConfig.java

@@ -0,0 +1,45 @@
+package com.sckj.admin.config;
+
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import com.google.code.kaptcha.util.Config;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.Properties;
+
+import static com.google.code.kaptcha.Constants.*;
+
+/**
+ * 验证码配置
+ */
+@Configuration
+public class KaptChaConfig {
+
+    @Bean(name = "captchaProducer")
+    public DefaultKaptcha getKaptchaBean() {
+        DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
+        Properties properties = new Properties();
+        // 是否边框
+        properties.setProperty(KAPTCHA_BORDER, "yes");
+        // 字符颜色
+        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
+        // 图片宽度
+        properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
+        // 图片高度
+        properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
+        // 字符大小
+        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
+        // 验证键码
+        properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
+        // 字符长度
+        properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
+        // 字体样式
+        properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
+        // 图片样式
+        properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
+        Config config = new Config(properties);
+        defaultKaptcha.setConfig(config);
+        return defaultKaptcha;
+    }
+}
+

+ 24 - 0
taphole-admin/src/main/java/com/sckj/admin/config/MybatisPlusConfig.java

@@ -0,0 +1,24 @@
+package com.sckj.admin.config;
+
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * MybatisPlus配置
+ */
+@Configuration
+public class MybatisPlusConfig {
+
+    /**
+     * 分页插件集成
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
+        return interceptor;
+    }
+
+}

+ 49 - 0
taphole-admin/src/main/java/com/sckj/admin/config/SwaggerConfig.java

@@ -0,0 +1,49 @@
+package com.sckj.admin.config;
+
+import com.sckj.common.config.GlobalConfig;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.oas.annotations.EnableOpenApi;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+@Configuration
+@EnableOpenApi
+public class SwaggerConfig {
+
+    @Value("${like.swagger.enabled}")
+    private boolean enabled;
+
+    @Value("${like.swagger.pathMapping}")
+    private String pathMapping;
+
+    @Bean
+    public Docket createRestApi(){
+        return new Docket(DocumentationType.OAS_30)
+                .apiInfo(apiInfo())
+                .enable(enabled)
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.sckj"))
+                .build()
+                .pathMapping(pathMapping);
+    }
+
+    private ApiInfo apiInfo(){
+        String author = "sckj";
+        String url = "https://gitee.com/likeadmin/likeadmin_java";
+        String email = "tinyants@163.com";
+
+        return new ApiInfoBuilder()
+                .title("宝钢智能出铁系统【后台】接口文档")
+                .description("likeadmin是一套使用流行的技术栈的快速开发管理后台")
+                .version(GlobalConfig.version)
+                .contact(new Contact(author, url, email))
+                .build();
+    }
+
+}

+ 89 - 0
taphole-admin/src/main/java/com/sckj/admin/config/WebMvcConfig.java

@@ -0,0 +1,89 @@
+package com.sckj.admin.config;
+
+import com.sckj.admin.TapholeAdminInterceptor;
+import com.sckj.common.config.GlobalConfig;
+import com.sckj.common.util.YmlUtils;
+import org.jetbrains.annotations.NotNull;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.CacheControl;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import javax.annotation.Resource;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Web配置
+ */
+@Configuration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+    @Resource
+    TapholeAdminInterceptor likeAdminInterceptor;
+
+    /**
+     * 配置允许跨域
+     */
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+        registry.addMapping("/**")
+                .allowedOrigins("*")
+                .allowedHeaders("*")
+                .allowedMethods("GET", "POST", "DELETE", "PUT")
+                .maxAge(3600);
+    }
+
+    /**
+     * 登录拦截器
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(likeAdminInterceptor)
+                .addPathPatterns("/**").excludePathPatterns("/doc.html","/swagger-ui.html", "/swagger-resources/**", "/webjars/**", "/*/api-docs");
+    }
+
+    /**
+     * 资源目录映射
+     */
+    @Override
+    public void addResourceHandlers(@NotNull ResourceHandlerRegistry registry) {
+        String directory = YmlUtils.get("like.upload-directory");
+        registry.addResourceHandler("/"+ GlobalConfig.publicPrefix +"/**")
+                .addResourceLocations("file:" + directory);
+
+        /** swagger配置 */
+        registry.addResourceHandler("/doc.html")
+                .addResourceLocations("classpath:/META-INF/resources/doc.html")
+                .setCacheControl(CacheControl.maxAge(5, TimeUnit.HOURS).cachePublic());
+    }
+
+    /**
+     * 跨域配置
+     */
+    @Bean
+    public CorsFilter corsFilter()
+    {
+        CorsConfiguration config = new CorsConfiguration();
+        config.setAllowCredentials(true);
+        // 设置访问源地址
+        config.addAllowedOriginPattern("*");
+        // 设置访问源请求头
+        config.addAllowedHeader("*");
+        // 设置访问源请求方法
+        config.addAllowedMethod("*");
+        // 有效期 1800秒
+        config.setMaxAge(1800L);
+        // 添加映射路径,拦截一切请求
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        source.registerCorsConfiguration("/**", config);
+        // 返回新的CorsFilter
+        return new CorsFilter(source);
+    }
+
+}

+ 54 - 0
taphole-admin/src/main/java/com/sckj/admin/config/quartz/CronUtils.java

@@ -0,0 +1,54 @@
+package com.sckj.admin.config.quartz;
+
+import org.quartz.CronExpression;
+
+import java.text.ParseException;
+import java.util.Date;
+
+/**
+ * 表达式工具
+ */
+public class CronUtils {
+
+    /**
+     * 验证表达式是否有效
+     *
+     * @param cronExpression 表达式
+     * @return true=有效,false=无效
+     */
+    public static boolean isValid(String cronExpression) {
+        return CronExpression.isValidExpression(cronExpression);
+    }
+
+    /**
+     * 验证表达式消息无效给出有效性
+     *
+     * @param cronExpression 表达式
+     * @return null=有效, 其它=无效时的错误描述
+     */
+    public static String invalidMessage(String cronExpression) {
+        try {
+            new CronExpression(cronExpression);
+            return null;
+        } catch (ParseException pe) {
+            return pe.getMessage();
+        }
+    }
+
+    /**
+     * 下一个执行时间点
+     *
+     * @param cronExpression n表达式
+     * @return Date下次表达式执行时间
+     */
+    public static Date nextExecution(String cronExpression)
+    {
+        try {
+            CronExpression cron = new CronExpression(cronExpression);
+            return cron.getNextValidTimeAfter(new Date(System.currentTimeMillis()));
+        } catch (ParseException e) {
+            throw new IllegalArgumentException(e.getMessage());
+        }
+    }
+
+}

+ 152 - 0
taphole-admin/src/main/java/com/sckj/admin/config/quartz/InvokeUtils.java

@@ -0,0 +1,152 @@
+package com.sckj.admin.config.quartz;
+
+import com.sckj.common.entity.Crontab;
+import com.sckj.common.util.SpringUtils;
+import com.sckj.common.util.StringUtils;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * 执行工具
+ */
+public class InvokeUtils {
+
+    /**
+     * 执行方法
+     *
+     * @param crontab 系统任务
+     */
+    public static void invokeMethod(Crontab crontab) throws Exception {
+        String invokeTarget = crontab.getCommand();
+        String beanName = getBeanName(invokeTarget);
+        String methodName = getMethodName(invokeTarget);
+        List<Object[]> methodParams = getMethodParams(invokeTarget);
+
+        if (!isValidClassName(beanName)) {
+            Object bean = SpringUtils.getBean(beanName);
+            invokeMethod(bean, methodName, methodParams);
+        } else {
+            Object bean = Class.forName(beanName).newInstance();
+            invokeMethod(bean, methodName, methodParams);
+        }
+    }
+
+    /**
+     * 调用任务方法
+     *
+     * @param bean 目标对象
+     * @param methodName 方法名称
+     * @param methodParams 方法参数
+     */
+    private static void invokeMethod(Object bean, String methodName, List<Object[]> methodParams)
+            throws NoSuchMethodException, SecurityException, IllegalAccessException, IllegalArgumentException,
+            InvocationTargetException {
+        if (StringUtils.isNotNull(methodParams) && methodParams.size() > 0) {
+            Method method = bean.getClass().getMethod(methodName, getMethodParamsType(methodParams));
+            method.invoke(bean, getMethodParamsValue(methodParams));
+        } else {
+            Method method = bean.getClass().getMethod(methodName);
+            method.invoke(bean);
+        }
+    }
+
+
+    /**
+     * 校验是否为为class包名
+     *
+     * @param invokeTarget 名称
+     * @return true是 false否
+     */
+    public static boolean isValidClassName(String invokeTarget) {
+        return StringUtils.countMatches(invokeTarget, ".") > 1;
+    }
+
+    /**
+     * 获取bean名称
+     *
+     * @param invokeTarget 目标字符串
+     * @return bean名称
+     */
+    public static String getBeanName(String invokeTarget) {
+        String beanName = StringUtils.substringBefore(invokeTarget, "(");
+        return StringUtils.substringBeforeLast(beanName, ".");
+    }
+
+    /**
+     * 获取bean方法
+     *
+     * @param invokeTarget 目标字符串
+     * @return method方法
+     */
+    public static String getMethodName(String invokeTarget) {
+        String methodName = StringUtils.substringBefore(invokeTarget, "(");
+        return StringUtils.substringAfterLast(methodName, ".");
+    }
+
+    /**
+     * 获取method方法参数相关列表
+     *
+     * @param invokeTarget 目标字符串
+     * @return method方法相关参数列表
+     */
+    public static List<Object[]> getMethodParams(String invokeTarget) {
+        String methodStr = StringUtils.substringBetween(invokeTarget, "(", ")");
+        if (StringUtils.isEmpty(methodStr)) {
+            return null;
+        }
+        String[] methodParams = methodStr.split(",(?=([^\"']*[\"'][^\"']*[\"'])*[^\"']*$)");
+        List<Object[]> clazz = new LinkedList<>();
+        for (String methodParam : methodParams) {
+            String str = StringUtils.trimToEmpty(methodParam);
+            if (StringUtils.startsWithAny(str, "'", "\"")) {
+                clazz.add(new Object[]{StringUtils.substring(str, 1, str.length() - 1), String.class});
+            } else if ("true".equalsIgnoreCase(str) || "false".equalsIgnoreCase(str)) {
+                clazz.add(new Object[]{Boolean.valueOf(str), Boolean.class});
+            } else if (StringUtils.endsWith(str, "L")) {
+                clazz.add(new Object[]{Long.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Long.class});
+            } else if (StringUtils.endsWith(str, "D")) {
+                clazz.add(new Object[]{Double.valueOf(StringUtils.substring(str, 0, str.length() - 1)), Double.class});
+            } else {
+                clazz.add(new Object[]{Integer.valueOf(str), Integer.class});
+            }
+        }
+        return clazz;
+    }
+
+    /**
+     * 获取参数类型
+     *
+     * @param methodParams 参数相关列表
+     * @return 参数类型列表
+     */
+    public static Class<?>[] getMethodParamsType(List<Object[]> methodParams) {
+        Class<?>[] clazz = new Class<?>[methodParams.size()];
+        int index = 0;
+        for (Object[] os : methodParams)
+        {
+            clazz[index] = (Class<?>) os[1];
+            index++;
+        }
+        return clazz;
+    }
+
+    /**
+     * 获取参数值
+     *
+     * @param methodParams 参数相关列表
+     * @return 参数值列表
+     */
+    public static Object[] getMethodParamsValue(List<Object[]> methodParams) {
+        Object[] clazz = new Object[methodParams.size()];
+        int index = 0;
+        for (Object[] os : methodParams) {
+            clazz[index] = os[0];
+            index++;
+        }
+        return clazz;
+    }
+
+}

+ 104 - 0
taphole-admin/src/main/java/com/sckj/admin/config/quartz/QuartzUtils.java

@@ -0,0 +1,104 @@
+package com.sckj.admin.config.quartz;
+
+import com.sckj.admin.config.quartz.exceution.QuartzDisExecution;
+import com.sckj.admin.config.quartz.exceution.QuartzJobExecution;
+import com.sckj.common.entity.Crontab;
+import com.sckj.common.util.StringUtils;
+import org.quartz.*;
+
+/**
+ * 计划任务工具
+ */
+public class QuartzUtils {
+
+    /**
+     * 得到quartz任务类
+     *
+     * @param crontab 执行计划
+     * @return 具体执行任务类
+     */
+    private static Class<? extends Job> getQuartzJobClass(Crontab crontab) {
+        boolean isConcurrent = crontab.getConcurrent().equals(0);
+        return isConcurrent ? QuartzJobExecution.class : QuartzDisExecution.class;
+    }
+
+    /**
+     * 构建任务对象Key
+     *
+     * @param jobId (任务ID)
+     * @param jobGroup (任务分组)
+     * @return JobKey
+     */
+    public static JobKey getJobKey(Integer jobId, String jobGroup) {
+        return JobKey.jobKey(TaskConstants.TASK_CLASS_NAME + jobId, jobGroup);
+    }
+
+    /**
+     * 构建触发对象Key
+     *
+     * @param jobId (任务ID)
+     * @param jobGroup (任务分组)
+     * @return TriggerKey
+     */
+    public static TriggerKey getTriggerKey(Integer jobId, String jobGroup) {
+        return TriggerKey.triggerKey(TaskConstants.TASK_PROPERTIES + jobId, jobGroup);
+    }
+
+    /**
+     * 创建定时任务
+     *
+     * @param scheduler 调度器
+     * @param job 任务
+     * @throws SchedulerException 调度异常
+     */
+    public static void createScheduleJob(Scheduler scheduler, Crontab job) throws SchedulerException {
+        Integer jobId     = job.getId();
+        String jobGroup   = job.getTypes();
+        String expression = job.getRules();
+
+        // 构建任务
+        Class<? extends Job> jobClass = getQuartzJobClass(job);
+        JobDetail jobDetail = JobBuilder.newJob(jobClass)
+                .withIdentity(getJobKey(jobId, jobGroup))
+                .build();
+
+        // 构建时间
+        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(expression);
+        switch (job.getStrategy()) {
+            case 1: // 立即执行
+                cronScheduleBuilder = cronScheduleBuilder.withMisfireHandlingInstructionIgnoreMisfires();
+                break;
+            case 2: // 执行一次
+                cronScheduleBuilder = cronScheduleBuilder.withMisfireHandlingInstructionFireAndProceed();
+                break;
+            case 3: // 放弃执行
+                cronScheduleBuilder = cronScheduleBuilder.withMisfireHandlingInstructionDoNothing();
+                break;
+        }
+
+        // 注入参数
+        jobDetail.getJobDataMap().put(TaskConstants.TASK_PROPERTIES, job);
+
+        // 构建目标
+        CronTrigger trigger = TriggerBuilder.newTrigger()
+                .withIdentity(getTriggerKey(jobId, jobGroup))
+                .withSchedule(cronScheduleBuilder)
+                .build();
+
+        // 如果存在则删除
+        if (scheduler.checkExists(getJobKey(jobId, jobGroup))) {
+            scheduler.deleteJob(getJobKey(jobId, jobGroup));
+        }
+
+        // 如果过期则调度
+        if (StringUtils.isNotNull(CronUtils.nextExecution(job.getRules()))) {
+            scheduler.scheduleJob(jobDetail, trigger);
+        }
+
+        // 如果暂停则停止
+        if (!job.getStatus().equals(TaskConstants.STATUS_RUN)) {
+            scheduler.pauseJob(getJobKey(jobId, jobGroup));
+        }
+    }
+
+}

+ 20 - 0
taphole-admin/src/main/java/com/sckj/admin/config/quartz/TaskConstants.java

@@ -0,0 +1,20 @@
+package com.sckj.admin.config.quartz;
+
+/**
+ * 计划任务常量
+ */
+public class TaskConstants {
+
+    /** 执行任务名 */
+    public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME";
+
+    /** 执行目标键 */
+    public static final String TASK_PROPERTIES = "TASK_PROPERTIES";
+
+    /** 状态: 运行 */
+    public static final Integer STATUS_RUN   = 1;
+
+    /** 状态: 失败 */
+    public static final Integer STATUS_FAIL  = 2;
+
+}

+ 81 - 0
taphole-admin/src/main/java/com/sckj/admin/config/quartz/exceution/AbstractQuartzJob.java

@@ -0,0 +1,81 @@
+package com.sckj.admin.config.quartz.exceution;
+
+import com.sckj.admin.config.quartz.TaskConstants;
+import com.sckj.common.entity.Crontab;
+import com.sckj.common.mapper.CrontabMapper;
+import com.sckj.common.util.SpringUtils;
+import com.sckj.common.util.StringUtils;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+
+public abstract class AbstractQuartzJob implements Job {
+
+    private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class);
+
+    /**
+     * 线程本地变量
+     */
+    private static final ThreadLocal<Long> threadLocal = new ThreadLocal<>();
+
+    /**
+     * 执行
+     *
+     * @param context 上下文
+     */
+    @Override
+    public void execute(JobExecutionContext context) {
+        Crontab crontab = new Crontab();
+        BeanUtils.copyProperties(context.getMergedJobDataMap().get(TaskConstants.TASK_PROPERTIES), crontab);
+        try {
+            before();
+            doExecute(context, crontab);
+            after(crontab, null);
+        } catch (Exception e) {
+            log.error("任务执行异常:", e);
+            after(crontab, e);
+        }
+    }
+
+    /**
+     * 执行前
+     */
+    protected void before() {
+        threadLocal.set(System.currentTimeMillis());
+    }
+
+    /**
+     * 执行后
+     *
+     * @param crontab 系统计划任务
+     */
+    protected void after(Crontab crontab, Exception e)
+    {
+        long startTime = threadLocal.get();
+        long endTime = System.currentTimeMillis();
+        threadLocal.remove();
+
+        crontab.setError("");
+        crontab.setStartTime(startTime / 1000);
+        crontab.setEndTime(endTime / 1000);
+        crontab.setTaskTime(endTime - startTime);
+        if (StringUtils.isNotNull(e)) {
+            crontab.setError(e.getMessage());
+            crontab.setStatus(TaskConstants.STATUS_FAIL);
+        }
+
+        SpringUtils.getBean(CrontabMapper.class).updateById(crontab);
+    }
+
+    /**
+     * 执行方法
+     *
+     * @param context 工作执行上下文对象
+     * @param sysJob 系统计划任务
+     * @throws Exception 执行过程中的异常
+     */
+    protected abstract void doExecute(JobExecutionContext context, Crontab sysJob) throws Exception;
+
+}

+ 19 - 0
taphole-admin/src/main/java/com/sckj/admin/config/quartz/exceution/QuartzDisExecution.java

@@ -0,0 +1,19 @@
+package com.sckj.admin.config.quartz.exceution;
+
+import com.sckj.admin.config.quartz.InvokeUtils;
+import com.sckj.common.entity.Crontab;
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.JobExecutionContext;
+
+/**
+ * 禁止并发任务
+ */
+@DisallowConcurrentExecution
+public class QuartzDisExecution extends AbstractQuartzJob {
+
+    @Override
+    protected void doExecute(JobExecutionContext context, Crontab crontab) throws Exception {
+        InvokeUtils.invokeMethod(crontab);
+    }
+
+}

+ 17 - 0
taphole-admin/src/main/java/com/sckj/admin/config/quartz/exceution/QuartzJobExecution.java

@@ -0,0 +1,17 @@
+package com.sckj.admin.config.quartz.exceution;
+
+import com.sckj.admin.config.quartz.InvokeUtils;
+import com.sckj.common.entity.Crontab;
+import org.quartz.JobExecutionContext;
+
+/**
+ * 允许并发任务
+ */
+public class QuartzJobExecution extends AbstractQuartzJob {
+
+    @Override
+    protected void doExecute(JobExecutionContext context, Crontab crontab) throws Exception {
+        InvokeUtils.invokeMethod(crontab);
+    }
+
+}

+ 42 - 0
taphole-admin/src/main/java/com/sckj/admin/config/stp/StpInException.java

@@ -0,0 +1,42 @@
+package com.sckj.admin.config.stp;
+
+import cn.dev33.satoken.exception.NotLoginException;
+import cn.dev33.satoken.exception.NotPermissionException;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.enums.ErrorEnum;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.ResponseStatus;
+
+/**
+ * Sa-Token的异常拦截
+ */
+@Slf4j
+@ControllerAdvice
+public class StpInException {
+
+    /**
+     * 拦截登录异常
+     */
+    @ResponseStatus(HttpStatus.OK)
+    @ExceptionHandler(NotLoginException.class)
+    @ResponseBody
+    public AjaxResult<Object> handleNotLoginException(NotLoginException e){
+        String msg = e.getMessage().startsWith("Token无效") ? "尚未登录,请先登录!" : e.getMessage();
+        return AjaxResult.failed(ErrorEnum.TOKEN_INVALID.getCode(), msg);
+    }
+
+    /**
+     * 拦截权限异常
+     */
+    @ResponseStatus(HttpStatus.OK)
+    @ExceptionHandler(NotPermissionException.class)
+    @ResponseBody
+    public AjaxResult<Object> handleNotPermissionException(){
+        return AjaxResult.failed(ErrorEnum.NO_PERMISSION.getCode(), ErrorEnum.NO_PERMISSION.getMsg());
+    }
+
+}

+ 89 - 0
taphole-admin/src/main/java/com/sckj/admin/config/stp/StpInterConfig.java

@@ -0,0 +1,89 @@
+package com.sckj.admin.config.stp;
+
+import cn.dev33.satoken.stp.StpInterface;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.sckj.admin.TapholeAdminThreadLocal;
+import com.sckj.common.entity.system.SystemAuthMenu;
+import com.sckj.common.entity.system.SystemAuthPerm;
+import com.sckj.common.mapper.system.SystemAuthMenuMapper;
+import com.sckj.common.mapper.system.SystemAuthPermMapper;
+import com.sckj.common.util.StringUtils;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.Resource;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+
+/**
+ * Sa-Token自定义权限验证接口
+ */
+@Component
+public class StpInterConfig implements StpInterface {
+
+    @Resource
+    SystemAuthPermMapper systemAuthPermMapper;
+
+    @Resource
+    SystemAuthMenuMapper systemAuthMenuMapper;
+
+    /**
+     * 返回一个账号所拥有的权限码集合
+     *
+     * @param loginId 登录ID
+     * @param loginType 登录类型
+     * @return List<String>
+     */
+    @Override
+    public List<String> getPermissionList(Object loginId, String loginType) {
+        List<Integer> roleIds  = TapholeAdminThreadLocal.getRoleIds();
+        List<String> perms = new LinkedList<>();
+
+        if (roleIds.isEmpty()) {
+            return perms;
+        }
+
+        List<SystemAuthPerm> permList = systemAuthPermMapper.selectList(
+                new QueryWrapper<SystemAuthPerm>()
+                        .select("id,role_id,menu_id")
+                        .in("role_id", roleIds));
+
+        if (permList.isEmpty()) {
+            return perms;
+        }
+
+        List<Integer> menuIds = new LinkedList<>();
+        for (SystemAuthPerm systemAuthPerm : permList) {
+            menuIds.add(systemAuthPerm.getMenuId());
+        }
+
+        List<SystemAuthMenu> systemAuthMenus = systemAuthMenuMapper.selectList(
+                new QueryWrapper<SystemAuthMenu>()
+                        .select("id,perms")
+                        .eq("is_disable", 0)
+                        .in("id", menuIds)
+                        .in("menu_type", Arrays.asList("C", "A"))
+                        .orderByAsc(Arrays.asList("menu_sort", "id")));
+
+        for (SystemAuthMenu item : systemAuthMenus) {
+            if (StringUtils.isNotNull(item.getPerms()) && StringUtils.isNotEmpty(item.getPerms())) {
+                perms.add(item.getPerms().trim());
+            }
+        }
+
+        return perms;
+    }
+
+    /**
+     * 返回一个账号所拥有的角色标识集合
+     *
+     * @param loginId 登录ID
+     * @param loginType 登录类型
+     * @return List<String>
+     */
+    @Override
+    public List<String> getRoleList(Object loginId, String loginType) {
+        return null;
+    }
+
+}

+ 94 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/AlbumsController.java

@@ -0,0 +1,94 @@
+package com.sckj.admin.controller;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.IAlbumsService;
+import com.sckj.admin.validate.album.AlbumCateValidate;
+import com.sckj.admin.validate.album.AlbumMoveValidate;
+import com.sckj.admin.validate.album.AlbumRenameValidate;
+import com.sckj.admin.validate.album.AlbumSearchValidate;
+import com.sckj.admin.validate.commons.IdValidate;
+import com.sckj.admin.validate.commons.IdsValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.vo.album.AlbumVo;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/albums")
+@Api(tags = "相册数据管理")
+public class AlbumsController {
+
+    @Resource
+    IAlbumsService iAlbumsService;
+
+    @GetMapping("/albumList")
+    @ApiOperation(value="相册文件列表")
+    public AjaxResult<PageResult<AlbumVo>> albumList(@Validated PageValidate pageValidate,
+                                                     @Validated AlbumSearchValidate searchValidate) {
+        PageResult<AlbumVo> voPageResult = iAlbumsService.albumList(pageValidate, searchValidate);
+        return AjaxResult.success(voPageResult);
+    }
+
+    @Log(title = "相册文件重命名")
+    @PostMapping("/albumRename")
+    @ApiOperation(value="相册文件重命名")
+    public AjaxResult<Object> albumRename(@Validated @RequestBody AlbumRenameValidate renameValidate) {
+        iAlbumsService.albumRename(renameValidate.getId(), renameValidate.getName());
+        return AjaxResult.success();
+    }
+
+    @Log(title = "相册文件移动")
+    @PostMapping("/albumMove")
+    @ApiOperation(value="相册文件移动")
+    public AjaxResult<Object> albumMove(@Validated @RequestBody AlbumMoveValidate moveValidate) {
+        iAlbumsService.albumMove(moveValidate.getIds(), moveValidate.getCid());
+        return AjaxResult.success();
+    }
+
+    @Log(title = "相册文件删除")
+    @PostMapping("/albumDel")
+    @ApiOperation(value="相册文件删除")
+    public AjaxResult<Object> albumDel(@Validated @RequestBody IdsValidate idsValidate) {
+        iAlbumsService.albumDel(idsValidate.getIds());
+        return AjaxResult.success();
+    }
+
+    @GetMapping("/cateList")
+    @ApiOperation(value="相册分类列表")
+    public AjaxResult<JSONArray> cateList(@Validated AlbumSearchValidate searchValidate) {
+        JSONArray jsonArray = iAlbumsService.cateList(searchValidate);
+        return AjaxResult.success(jsonArray);
+    }
+
+    @Log(title = "相册分类新增")
+    @PostMapping("/cateAdd")
+    @ApiOperation(value="相册分类新增")
+    public AjaxResult<Object> cateAdd(@Validated @RequestBody AlbumCateValidate cateValidate) {
+        iAlbumsService.cateAdd(cateValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "相册分类重命名")
+    @PostMapping("/cateRename")
+    @ApiOperation(value="相册分类重命名")
+    public AjaxResult<Object> cateRename(@Validated @RequestBody AlbumRenameValidate renameValidate) {
+        iAlbumsService.cateRename(renameValidate.getId(), renameValidate.getName());
+        return AjaxResult.success();
+    }
+
+    @Log(title = "相册分类删除")
+    @PostMapping("/cateDel")
+    @ApiOperation(value="相册分类删除")
+    public AjaxResult<Object> cateDel(@Validated @RequestBody IdValidate idValidate) {
+        iAlbumsService.cateDel(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 86 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/ArtCateController.java

@@ -0,0 +1,86 @@
+package com.sckj.admin.controller;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.IArtCateService;
+import com.sckj.admin.validate.article.ArtCateCreateValidate;
+import com.sckj.admin.validate.article.ArtCateSearchValidate;
+import com.sckj.admin.validate.article.ArtCateUpdateValidate;
+import com.sckj.admin.validate.commons.IdValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.vo.article.ArticleCateVo;
+import com.sckj.common.aop.NotPower;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("api/article/cate")
+@Api(tags = "文章分类管理")
+public class ArtCateController {
+
+    @Resource
+    IArtCateService iArtCateService;
+
+    @NotPower
+    @GetMapping("/all")
+    @ApiOperation(value="所有分类")
+    public AjaxResult<List<ArticleCateVo>> all() {
+        List<ArticleCateVo> list = iArtCateService.all();
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value="分类列表")
+    public AjaxResult<PageResult<ArticleCateVo>> list(@Validated PageValidate pageValidate,
+                                                      @Validated ArtCateSearchValidate searchValidate) {
+        PageResult<ArticleCateVo> list = iArtCateService.list(pageValidate, searchValidate);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="分类详情")
+    public AjaxResult<ArticleCateVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        ArticleCateVo vo = iArtCateService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "文章分类新增")
+    @PostMapping("/add")
+    @ApiOperation(value="分类新增")
+    public AjaxResult<Object> add(@Validated @RequestBody ArtCateCreateValidate createValidate) {
+        iArtCateService.add(createValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "文章分类编辑")
+    @PostMapping("/edit")
+    @ApiOperation(value="分类编辑")
+    public AjaxResult<Object> edit(@Validated @RequestBody ArtCateUpdateValidate updateValidate) {
+        iArtCateService.edit(updateValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "文章分类删除")
+    @PostMapping("/del")
+    @ApiOperation(value="分类删除")
+    public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
+        iArtCateService.del(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+    @Log(title = "文章分类状态")
+    @PostMapping("/change")
+    @ApiOperation(value="分类状态")
+    public AjaxResult<Object> change(@Validated @RequestBody IdValidate idValidate) {
+        iArtCateService.change(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 77 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/ArticleController.java

@@ -0,0 +1,77 @@
+package com.sckj.admin.controller;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.IArticleService;
+import com.sckj.admin.validate.article.ArticleCreateValidate;
+import com.sckj.admin.validate.article.ArticleSearchValidate;
+import com.sckj.admin.validate.article.ArticleUpdateValidate;
+import com.sckj.admin.validate.commons.IdValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.vo.article.ArticleDetailVo;
+import com.sckj.admin.vo.article.ArticleListedVo;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/article")
+@Api(tags = "文章数据管理")
+public class ArticleController {
+
+    @Resource
+    IArticleService iArticleService;
+
+    @GetMapping("/list")
+    @ApiOperation(value="文章列表")
+    public AjaxResult<PageResult<ArticleListedVo>> list(@Validated PageValidate pageValidate,
+                                                        @Validated ArticleSearchValidate searchValidate) {
+        PageResult<ArticleListedVo> vos = iArticleService.list(pageValidate, searchValidate);
+        return AjaxResult.success(vos);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="文章详情")
+    public AjaxResult<ArticleDetailVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        ArticleDetailVo vo = iArticleService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "文章新增")
+    @PostMapping("/add")
+    @ApiOperation(value="文章新增")
+    public AjaxResult<Object> add(@Validated @RequestBody ArticleCreateValidate createValidate) {
+        iArticleService.add(createValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "文章编辑")
+    @PostMapping("/edit")
+    @ApiOperation(value="文章编辑")
+    public AjaxResult<Object> edit(@Validated @RequestBody ArticleUpdateValidate updateValidate) {
+        iArticleService.edit(updateValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "文章删除")
+    @PostMapping("/del")
+    @ApiOperation(value="文章删除")
+    public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
+        iArticleService.del(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+    @Log(title = "文章状态")
+    @PostMapping("/change")
+    @ApiOperation(value="文章状态")
+    public AjaxResult<Object> change(@Validated @RequestBody IdValidate idValidate) {
+        iArticleService.change(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 68 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/CrontabController.java

@@ -0,0 +1,68 @@
+package com.sckj.admin.controller;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ICrontabService;
+import com.sckj.admin.validate.commons.IdValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.crontab.CrontabCreateValidate;
+import com.sckj.admin.validate.crontab.CrontabUpdateValidate;
+import com.sckj.admin.vo.CrontabDetailVo;
+import com.sckj.admin.vo.CrontabListedVo;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.quartz.SchedulerException;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/crontab")
+@Api(tags = "计划任务管理")
+public class CrontabController {
+
+    @Resource
+    ICrontabService iCrontabService;
+
+    @GetMapping("/list")
+    @ApiOperation(value="计划任务列表")
+    public AjaxResult<PageResult<CrontabListedVo>> list(@Validated PageValidate pageValidate) {
+        PageResult<CrontabListedVo> list = iCrontabService.list(pageValidate);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="计划任务详情")
+    public AjaxResult<Object> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        CrontabDetailVo vo = iCrontabService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "计划任务新增")
+    @PostMapping("/add")
+    @ApiOperation(value="计划任务新增")
+    public AjaxResult<Object> add(@Validated @RequestBody CrontabCreateValidate createValidate) throws SchedulerException {
+        iCrontabService.add(createValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "计划任务编辑")
+    @PostMapping("/edit")
+    @ApiOperation(value="计划任务编辑")
+    public AjaxResult<Object> edit(@Validated @RequestBody CrontabUpdateValidate updateValidate) throws SchedulerException {
+        iCrontabService.edit(updateValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "计划任务删除")
+    @PostMapping("/del")
+    @ApiOperation(value="计划任务删除")
+    public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) throws SchedulerException {
+        iCrontabService.del(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 40 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/IndexController.java

@@ -0,0 +1,40 @@
+package com.sckj.admin.controller;
+
+import com.sckj.admin.service.IIndexService;
+import com.sckj.common.aop.NotLogin;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping("api/index")
+@Api(tags = "主页数据管理")
+public class IndexController {
+
+    @Resource
+    IIndexService iIndexService;
+
+    @GetMapping("/console")
+    @ApiOperation(value="控制台")
+    public AjaxResult<Map<String, Object>> console() {
+        Map<String, Object> map = iIndexService.console();
+        return AjaxResult.success(map);
+    }
+
+    @NotLogin
+    @GetMapping("/config")
+    @ApiOperation(value="公共配置")
+    public AjaxResult<Map<String, Object>> config() {
+        Map<String, Object> map = iIndexService.config();
+        return AjaxResult.success(map);
+    }
+
+}

+ 100 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/UploadController.java

@@ -0,0 +1,100 @@
+package com.sckj.admin.controller;
+
+import com.sckj.admin.TapholeAdminThreadLocal;
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.aop.aspect.RequestType;
+import com.sckj.admin.service.IAlbumsService;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.enums.AlbumEnum;
+import com.sckj.common.exception.OperateException;
+import com.sckj.common.plugin.storage.StorageDriver;
+import com.sckj.common.plugin.storage.UploadFilesVo;
+import com.sckj.common.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import org.springframework.web.multipart.MultipartRequest;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@RestController
+@RequestMapping("api/upload")
+@Api(tags = "上传文件管理")
+public class UploadController {
+
+    @Resource
+    IAlbumsService iAlbumsService;
+
+    @Log(title = "上传图片", requestType = RequestType.File)
+    @PostMapping("/image")
+    @ApiOperation(value="上传图片")
+    public AjaxResult<UploadFilesVo> image(HttpServletRequest request) {
+        MultipartFile multipartFile;
+        try {
+            multipartFile = ((MultipartRequest) request).getFile("file");
+        } catch (Exception e) {
+            throw new OperateException("请正确选择上传图片!");
+        }
+
+        if (multipartFile == null) {
+            throw new OperateException("请选择上传图片!");
+        }
+
+        StorageDriver storageDriver = new StorageDriver();
+        UploadFilesVo vo = storageDriver.upload(multipartFile, "image", AlbumEnum.IMAGE.getCode());
+        String cid = StringUtils.isNotEmpty(request.getParameter("cid")) ? request.getParameter("cid") : "0";
+
+        Map<String, String> album = new LinkedHashMap<>();
+        album.put("aid", String.valueOf(TapholeAdminThreadLocal.getAdminId()));
+        album.put("cid", cid);
+        album.put("type", String.valueOf(AlbumEnum.IMAGE.getCode()));
+        album.put("size", vo.getSize().toString());
+        album.put("ext", vo.getExt());
+        album.put("url", vo.getUrl());
+        album.put("name", vo.getName());
+        Integer id = iAlbumsService.albumAdd(album);
+
+        vo.setId(id);
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "上传视频", requestType = RequestType.File)
+    @PostMapping("/video")
+    @ApiOperation(value="上传视频")
+    public AjaxResult<UploadFilesVo> video(HttpServletRequest request) {
+        MultipartFile multipartFile;
+        try {
+            multipartFile = ((MultipartRequest) request).getFile("file");
+        } catch (Exception e) {
+            throw new OperateException("请选择上传视频!");
+        }
+
+        if (multipartFile == null) {
+            throw new OperateException("请选择上传视频!");
+        }
+
+        StorageDriver storageDriver = new StorageDriver();
+        UploadFilesVo vo = storageDriver.upload(multipartFile, "video", AlbumEnum.Video.getCode());
+        String cid = StringUtils.isNotEmpty(request.getParameter("cid")) ? request.getParameter("cid") : "0";
+
+        Map<String, String> album = new LinkedHashMap<>();
+        album.put("cid", cid);
+        album.put("aid", String.valueOf(TapholeAdminThreadLocal.getAdminId()));
+        album.put("type", String.valueOf(AlbumEnum.Video.getCode()));
+        album.put("ext", vo.getExt());
+        album.put("size", vo.getSize().toString());
+        album.put("url", vo.getUrl());
+        album.put("name", vo.getName());
+        Integer id = iAlbumsService.albumAdd(album);
+
+        vo.setId(id);
+        return AjaxResult.success(vo);
+    }
+
+}

+ 59 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/UserController.java

@@ -0,0 +1,59 @@
+package com.sckj.admin.controller;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.IUserService;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.user.UserSearchValidate;
+import com.sckj.admin.validate.user.UserUpdateValidate;
+import com.sckj.admin.validate.user.UserWalletValidate;
+import com.sckj.admin.vo.user.UserVo;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/user")
+@Api(tags = "用户数据管理")
+public class UserController {
+
+    @Resource
+    IUserService iUserService;
+
+    @GetMapping("/list")
+    @ApiOperation(value="用户列表")
+    public AjaxResult<PageResult<UserVo>> list(@Validated PageValidate pageValidate,
+                                               @Validated UserSearchValidate searchValidate) {
+        PageResult<UserVo> list = iUserService.list(pageValidate, searchValidate);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="用户详情")
+    public AjaxResult<UserVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        UserVo vo = iUserService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "用户编辑")
+    @PostMapping("/edit")
+    @ApiOperation(value="用户编辑")
+    public AjaxResult<Object> edit(@Validated @RequestBody UserUpdateValidate updateValidate) {
+        iUserService.edit(updateValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "余额调整")
+    @PostMapping("/adjustWallet")
+    @ApiOperation(value="余额调整")
+    public AjaxResult<Object> adjustWallet(@Validated @RequestBody UserWalletValidate walletValidate) {
+        iUserService.adjustWallet(walletValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 38 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelH5Controller.java

@@ -0,0 +1,38 @@
+package com.sckj.admin.controller.channel;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.IChannelH5ConfigService;
+import com.sckj.admin.validate.channel.ChannelH5Validate;
+import com.sckj.admin.vo.channel.ChannelH5Vo;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/channel/h5")
+@Api(tags = "移动渠道设置")
+public class ChannelH5Controller {
+
+    @Resource
+    IChannelH5ConfigService iChannelH5ConfigService;
+
+    @GetMapping("/detail")
+    @ApiOperation(value="H5渠道设置详情")
+    public AjaxResult<ChannelH5Vo> detail() {
+        ChannelH5Vo vo = iChannelH5ConfigService.detail();
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "H5渠道设置保存")
+    @PostMapping("/save")
+    @ApiOperation(value="H5渠道设置保存")
+    public AjaxResult<Object> save(@Validated @RequestBody ChannelH5Validate channelH5Validate) {
+        iChannelH5ConfigService.save(channelH5Validate);
+        return AjaxResult.success();
+    }
+
+}

+ 38 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelMpController.java

@@ -0,0 +1,38 @@
+package com.sckj.admin.controller.channel;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.IChannelMpConfigService;
+import com.sckj.admin.validate.channel.ChannelMpValidate;
+import com.sckj.admin.vo.channel.ChannelMpVo;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/channel/mp")
+@Api(tags = "微信程序渠道")
+public class ChannelMpController {
+
+    @Resource
+    IChannelMpConfigService iChannelMpConfigService;
+
+    @GetMapping("/detail")
+    @ApiOperation(value="微信程序渠道设置详情")
+    public AjaxResult<ChannelMpVo> detail() {
+        ChannelMpVo vo = iChannelMpConfigService.detail();
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "微信小程序渠道设置保存")
+    @PostMapping("/save")
+    @ApiOperation(value="微信程序渠道设置保存")
+    public AjaxResult<Object> save(@Validated @RequestBody ChannelMpValidate channelMpValidate) {
+        iChannelMpConfigService.save(channelMpValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 44 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaCallBackController.java

@@ -0,0 +1,44 @@
+package com.sckj.admin.controller.channel;
+
+import com.sckj.admin.service.IChannelOaCallBackService;
+import com.sckj.common.aop.NotLogin;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+
+@RestController
+@RequestMapping("api/channel/oa/callback")
+@Api(tags = "公众号服务器验证及消息回复")
+public class ChannelOaCallBackController {
+
+    @Resource
+    private IChannelOaCallBackService iChannelOaCallBackService;
+
+    @NotLogin
+    @GetMapping(produces = "text/plain;charset=utf-8")
+    @ApiOperation(value="公众号服务器地址验证")
+    public String authGet(@RequestParam(name = "signature", required = false) String signature,
+                          @RequestParam(name = "timestamp", required = false) String timestamp,
+                          @RequestParam(name = "nonce", required = false) String nonce,
+                          @RequestParam(name = "echostr", required = false) String echostr) {
+        return iChannelOaCallBackService.checkSignature(signature, timestamp, nonce, echostr);
+    }
+
+
+    @NotLogin
+    @PostMapping(produces = "application/xml; charset=UTF-8")
+    @ApiOperation(value="公众号消息回复")
+    public String post(@RequestBody String requestBody,
+                       @RequestParam("signature") String signature,
+                       @RequestParam("timestamp") String timestamp,
+                       @RequestParam("nonce") String nonce,
+                       @RequestParam(name = "encrypt_type", required = false) String encType,
+                       @RequestParam(name = "msg_signature", required = false) String msgSignature) {
+        return iChannelOaCallBackService.post(requestBody, signature, timestamp, nonce, encType, msgSignature);
+    }
+
+
+}

+ 38 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaController.java

@@ -0,0 +1,38 @@
+package com.sckj.admin.controller.channel;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.IChannelOaConfigService;
+import com.sckj.admin.validate.channel.ChannelOaValidate;
+import com.sckj.admin.vo.channel.ChannelOaVo;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/channel/oa")
+@Api(tags = "公众号渠道设置")
+public class ChannelOaController {
+
+    @Resource
+    IChannelOaConfigService iChannelOaConfigService;
+
+    @GetMapping("/detail")
+    @ApiOperation(value="公众号渠道设置详情")
+    public AjaxResult<ChannelOaVo> detail() {
+        ChannelOaVo vo = iChannelOaConfigService.detail();
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "公众号渠道设置保存")
+    @PostMapping("/save")
+    @ApiOperation(value="公众号渠道设置保存")
+    public AjaxResult<Object> save(@Validated @RequestBody ChannelOaValidate channelOaValidate) {
+        iChannelOaConfigService.save(channelOaValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 42 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaMenuController.java

@@ -0,0 +1,42 @@
+package com.sckj.admin.controller.channel;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.sckj.admin.service.IChannelOaMenusService;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("api/channel/oaMenu")
+@Api(tags = "公众号菜单管理")
+public class ChannelOaMenuController {
+
+    @Resource
+    IChannelOaMenusService iChannelOaMenusService;
+
+    @GetMapping("/detail")
+    @ApiOperation(value="菜单详情")
+    public AjaxResult<JSONArray> detail() {
+        JSONArray detail = iChannelOaMenusService.detail();
+        return AjaxResult.success(detail);
+    }
+
+    @PostMapping("/save")
+    @ApiOperation(value="仅是保存菜单")
+    public AjaxResult<Object> save(@RequestBody List<Object> params) {
+        iChannelOaMenusService.save(params, false);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/publish")
+    @ApiOperation(value="保存并发布菜单")
+    public AjaxResult<Object> publish(@RequestBody List<Object> params) {
+        iChannelOaMenusService.save(params, true);
+        return AjaxResult.success();
+    }
+
+}

+ 68 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaReplyDefaultController.java

@@ -0,0 +1,68 @@
+package com.sckj.admin.controller.channel;
+
+import com.sckj.admin.service.IChannelOaReplyDefaultService;
+import com.sckj.admin.validate.channel.ChannelRpDefaultValidate;
+import com.sckj.admin.validate.commons.IdValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.vo.channel.ChannelRpDefaultVo;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/channel/oaReplyDefault")
+@Api(tags = "公众号默认回复")
+public class ChannelOaReplyDefaultController {
+
+    @Resource
+    IChannelOaReplyDefaultService iChannelOaReplyDefaultService;
+
+    @GetMapping("/list")
+    @ApiOperation(value="默认回复列表")
+    public AjaxResult<PageResult<ChannelRpDefaultVo>> list(@Validated PageValidate pageValidate) {
+        PageResult<ChannelRpDefaultVo> list = iChannelOaReplyDefaultService.list(pageValidate);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="默认回复详情")
+    public AjaxResult<ChannelRpDefaultVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        ChannelRpDefaultVo vo = iChannelOaReplyDefaultService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @PostMapping("/add")
+    @ApiOperation(value="默认回复新增")
+    public AjaxResult<Object> add(@Validated @RequestBody ChannelRpDefaultValidate defaultValidate) {
+        iChannelOaReplyDefaultService.add(defaultValidate);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/edit")
+    @ApiOperation(value="默认回复编辑")
+    public AjaxResult<Object> edit(@Validated @RequestBody ChannelRpDefaultValidate defaultValidate) {
+        iChannelOaReplyDefaultService.edit(defaultValidate);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/del")
+    @ApiOperation(value="默认回复删除")
+    public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
+        iChannelOaReplyDefaultService.del(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/status")
+    @ApiOperation(value="默认回复状态")
+    public AjaxResult<Object> status(@Validated @RequestBody IdValidate idValidate) {
+        iChannelOaReplyDefaultService.status(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 68 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaReplyFollowController.java

@@ -0,0 +1,68 @@
+package com.sckj.admin.controller.channel;
+
+import com.sckj.admin.service.IChannelOaReplyFollowService;
+import com.sckj.admin.validate.channel.ChannelRpFollowsValidate;
+import com.sckj.admin.validate.commons.IdValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.vo.channel.ChannelRpFollowsVo;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/channel/oaReplyFollow")
+@Api(tags = "公众号关注回复")
+public class ChannelOaReplyFollowController {
+
+    @Resource
+    IChannelOaReplyFollowService iChannelOaReplyFollowService;
+
+    @GetMapping("/list")
+    @ApiOperation(value="关注回复列表")
+    public AjaxResult<PageResult<ChannelRpFollowsVo>> list(@Validated PageValidate pageValidate) {
+        PageResult<ChannelRpFollowsVo> list = iChannelOaReplyFollowService.list(pageValidate);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="关注回复详情")
+    public AjaxResult<ChannelRpFollowsVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        ChannelRpFollowsVo vo = iChannelOaReplyFollowService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @PostMapping("/add")
+    @ApiOperation(value="关注回复新增")
+    public AjaxResult<Object> add(@Validated @RequestBody ChannelRpFollowsValidate followsValidate) {
+        iChannelOaReplyFollowService.add(followsValidate);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/edit")
+    @ApiOperation(value="关注回复编辑")
+    public AjaxResult<Object> edit(@Validated @RequestBody ChannelRpFollowsValidate followsValidate) {
+        iChannelOaReplyFollowService.edit(followsValidate);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/del")
+    @ApiOperation(value="关注回复删除")
+    public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
+        iChannelOaReplyFollowService.del(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/status")
+    @ApiOperation(value="关注回复状态")
+    public AjaxResult<Object> status(@Validated @RequestBody IdValidate idValidate) {
+        iChannelOaReplyFollowService.status(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 68 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaReplyKeywordController.java

@@ -0,0 +1,68 @@
+package com.sckj.admin.controller.channel;
+
+import com.sckj.admin.service.IChannelOaReplyKeywordService;
+import com.sckj.admin.validate.channel.ChannelRpKeywordValidate;
+import com.sckj.admin.validate.commons.IdValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.vo.channel.ChannelRpKeywordVo;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/channel/oaReplyKeyword")
+@Api(tags = "公众号关键回复")
+public class ChannelOaReplyKeywordController {
+
+    @Resource
+    IChannelOaReplyKeywordService iChannelOaReplyKeywordService;
+
+    @GetMapping("/list")
+    @ApiOperation(value="关键词回复列表")
+    public AjaxResult<PageResult<ChannelRpKeywordVo>> list(@Validated PageValidate pageValidate) {
+        PageResult<ChannelRpKeywordVo> list = iChannelOaReplyKeywordService.list(pageValidate);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="关键词回复详情")
+    public AjaxResult<ChannelRpKeywordVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        ChannelRpKeywordVo vo = iChannelOaReplyKeywordService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @PostMapping("/add")
+    @ApiOperation(value="关键词回复新增")
+    public AjaxResult<Object> add(@Validated @RequestBody ChannelRpKeywordValidate keywordValidate) {
+        iChannelOaReplyKeywordService.add(keywordValidate);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/edit")
+    @ApiOperation(value="关键词回复编辑")
+    public AjaxResult<Object> edit(@Validated @RequestBody ChannelRpKeywordValidate keywordValidate) {
+        iChannelOaReplyKeywordService.edit(keywordValidate);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/del")
+    @ApiOperation(value="关键词回复删除")
+    public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
+        iChannelOaReplyKeywordService.del(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/status")
+    @ApiOperation(value="关键词回复状态")
+    public AjaxResult<Object> status(@Validated @RequestBody IdValidate idValidate) {
+        iChannelOaReplyKeywordService.status(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 36 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOpController.java

@@ -0,0 +1,36 @@
+package com.sckj.admin.controller.channel;
+
+import com.sckj.admin.service.IChannelOpService;
+import com.sckj.admin.validate.channel.ChannelOpValidate;
+import com.sckj.admin.vo.channel.ChannelOpVo;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/channel/op")
+@Api(tags = "微信开放渠道")
+public class ChannelOpController {
+
+    @Resource
+    IChannelOpService iChannelOpService;
+
+    @GetMapping("/detail")
+    @ApiOperation(value="开放平台设置详情")
+    public AjaxResult<Object> detail() {
+        ChannelOpVo vo = iChannelOpService.detail();
+        return AjaxResult.success(vo);
+    }
+
+    @PostMapping("/save")
+    @ApiOperation(value="开放平台设置保存")
+    public AjaxResult<Object> save(@Validated @RequestBody ChannelOpValidate opValidate) {
+        iChannelOpService.save(opValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 33 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/decorate/DecorateDataController.java

@@ -0,0 +1,33 @@
+package com.sckj.admin.controller.decorate;
+
+import com.sckj.admin.service.IDecorateDataService;
+import com.sckj.admin.vo.decorate.DecorateDataArticleVo;
+import com.sckj.common.aop.NotPower;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("api/decorate/data")
+@Api(tags = "装修数据管理")
+public class DecorateDataController {
+
+    @Resource
+    IDecorateDataService iDecorateDataService;
+
+    @NotPower
+    @GetMapping("/article")
+    @ApiOperation(value="获取文章数据")
+    public AjaxResult<List<DecorateDataArticleVo>> article(@RequestParam(defaultValue = "10") Integer limit) {
+        List<DecorateDataArticleVo> list = iDecorateDataService.article(limit);
+        return AjaxResult.success(list);
+    }
+
+}

+ 39 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/decorate/DecoratePagesController.java

@@ -0,0 +1,39 @@
+package com.sckj.admin.controller.decorate;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.IDecoratePageService;
+import com.sckj.admin.validate.decorate.DecoratePageValidate;
+import com.sckj.admin.vo.decorate.DecoratePageVo;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/decorate/pages")
+@Api(tags = "装修页面管理")
+public class DecoratePagesController {
+
+    @Resource
+    IDecoratePageService iDecoratePageService;
+
+    @GetMapping("/detail")
+    @ApiOperation(value="页面装修详情")
+    public AjaxResult<DecoratePageVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        DecoratePageVo vo = iDecoratePageService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "页面装修保存")
+    @PostMapping("/save")
+    @ApiOperation(value="页面装修保存")
+    public AjaxResult<Object> save(@RequestBody DecoratePageValidate decoratePageValidate) {
+        iDecoratePageService.save(decoratePageValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 38 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/decorate/DecorateTabbarController.java

@@ -0,0 +1,38 @@
+package com.sckj.admin.controller.decorate;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.IDecorateTabbarService;
+import com.sckj.admin.validate.decorate.DecorateTabsValidate;
+import com.sckj.admin.vo.decorate.DecorateTabbarVo;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/decorate/tabbar")
+@Api(tags = "装修导航管理")
+public class DecorateTabbarController {
+
+    @Resource
+    IDecorateTabbarService iDecorateTabbarService;
+
+    @GetMapping("/detail")
+    @ApiOperation(value="底部导航详情")
+    public AjaxResult<DecorateTabbarVo> detail() {
+        DecorateTabbarVo vo = iDecorateTabbarService.detail();
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "底部导航编辑")
+    @PostMapping("/save")
+    @ApiOperation(value="底部导航编辑")
+    public AjaxResult<Object> save(@Validated @RequestBody DecorateTabsValidate tabsValidate) {
+        iDecorateTabbarService.save(tabsValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 53 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/finance/FinanceRechargerController.java

@@ -0,0 +1,53 @@
+package com.sckj.admin.controller.finance;
+
+import com.sckj.admin.TapholeAdminThreadLocal;
+import com.sckj.admin.service.IFinanceRechargerService;
+import com.sckj.admin.validate.commons.IdValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.finance.FinanceRechargeSearchValidate;
+import com.sckj.admin.vo.finance.FinanceRechargeListVo;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/finance/recharger")
+@Api("充值记录管理")
+public class FinanceRechargerController {
+
+    @Resource
+    IFinanceRechargerService iFinanceRechargerService;
+
+    @GetMapping("/list")
+    @ApiOperation("充值记录")
+    public AjaxResult<PageResult<FinanceRechargeListVo>> list(@Validated PageValidate pageValidate,
+                                                              @Validated FinanceRechargeSearchValidate searchValidate) {
+        PageResult<FinanceRechargeListVo> list = iFinanceRechargerService.list(pageValidate, searchValidate);
+        return AjaxResult.success(list);
+    }
+
+    @PostMapping("/refund")
+    @ApiOperation("发起退款")
+    public AjaxResult<Object> refund(@Validated @RequestBody IdValidate idValidate) {
+        Integer adminId = TapholeAdminThreadLocal.getAdminId();
+
+        iFinanceRechargerService.refund(idValidate.getId(), adminId);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/refundAgain")
+    @ApiModelProperty("重新退款")
+    public AjaxResult<Object> refundAgain(@Validated @RequestBody IdValidate idValidate) {
+        Integer adminId = TapholeAdminThreadLocal.getAdminId();
+
+        iFinanceRechargerService.refundAgain(idValidate.getId(), adminId);
+        return AjaxResult.success();
+    }
+
+}

+ 51 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/finance/FinanceRefundController.java

@@ -0,0 +1,51 @@
+package com.sckj.admin.controller.finance;
+
+import com.sckj.admin.service.IFinanceRefundService;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.finance.FinanceRefundSearchValidate;
+import com.sckj.admin.vo.finance.FinanceRefundListVo;
+import com.sckj.admin.vo.finance.FinanceRefundLogVo;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("api/finance/refund")
+@Api("退款记录管理")
+public class FinanceRefundController {
+
+    @Resource
+    IFinanceRefundService iFinanceRefundService;
+
+    @GetMapping("/stat")
+    @ApiOperation("退还统计")
+    public AjaxResult<Object> stat() {
+        return AjaxResult.success();
+    }
+
+    @GetMapping("/list")
+    @ApiOperation("退款记录")
+    public AjaxResult<Object> list(@Validated PageValidate pageValidate,
+                                   @Validated FinanceRefundSearchValidate searchValidate) {
+        PageResult<FinanceRefundListVo> list = iFinanceRefundService.list(pageValidate, searchValidate);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/log")
+    @ApiOperation("退款日志")
+    public AjaxResult<Object> log(@Validated @IDMust() @RequestParam("id") Integer id) {
+        List<FinanceRefundLogVo> list = iFinanceRefundService.log(id);
+        return AjaxResult.success(list);
+    }
+
+}

+ 34 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/finance/FinanceWalletController.java

@@ -0,0 +1,34 @@
+package com.sckj.admin.controller.finance;
+
+import com.sckj.admin.service.IFinanceWalletService;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.finance.FinanceWalletSearchValidate;
+import com.sckj.admin.vo.finance.FinanceWalletListVo;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/finance/wallet")
+@Api("余额明细管理")
+public class FinanceWalletController {
+
+    @Resource
+    IFinanceWalletService iFinanceWalletService;
+
+    @GetMapping("/list")
+    @ApiOperation("记录列表")
+    public AjaxResult<Object> list(@Validated PageValidate pageValidate,
+                                   @Validated FinanceWalletSearchValidate searchValidate) {
+        PageResult<FinanceWalletListVo> list = iFinanceWalletService.list(pageValidate, searchValidate);
+        return AjaxResult.success(list);
+    }
+
+}

+ 36 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/marketing/MarketingRechargeController.java

@@ -0,0 +1,36 @@
+package com.sckj.admin.controller.marketing;
+
+import com.sckj.admin.service.IMarketingRechargeService;
+import com.sckj.admin.validate.marketing.MarketingRechargeValidate;
+import com.sckj.admin.vo.marketing.MarketingRechargeVo;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModelProperty;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/marketing/recharge")
+@Api("营销充值管理")
+public class MarketingRechargeController {
+
+    @Resource
+    IMarketingRechargeService iMarketingRechargeService;
+
+    @GetMapping("/detail")
+    @ApiModelProperty(value = "充值配置详情")
+    public AjaxResult<MarketingRechargeVo> detail() {
+        MarketingRechargeVo vo = iMarketingRechargeService.detail();
+        return AjaxResult.success(vo);
+    }
+
+    @PostMapping("/save")
+    @ApiModelProperty(value = "充值配置保存")
+    public AjaxResult<Object> save(@Validated @RequestBody MarketingRechargeValidate rechargeValidate) {
+        iMarketingRechargeService.save(rechargeValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 62 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/monitor/MonitorCacheController.java

@@ -0,0 +1,62 @@
+package com.sckj.admin.controller.monitor;
+
+
+import com.sckj.admin.aop.Log;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.util.StringUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.data.redis.connection.RedisServerCommands;
+import org.springframework.data.redis.core.RedisCallback;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.*;
+
+@RestController
+@RequestMapping("api/monitor")
+@Api(tags = "监控缓存管理")
+public class MonitorCacheController {
+
+    @Resource
+    private RedisTemplate<String, String> redisTemplate;
+
+    /**
+     * 缓存监控
+     *
+     * @author fzr
+     * @return AjaxResult<Object>
+     */
+    @Log(title = "缓存监控")
+    @GetMapping("/cache")
+    @ApiOperation(value="缓存监控")
+    public AjaxResult<Object> info() {
+        Properties info = (Properties) redisTemplate.execute((RedisCallback<Object>) RedisServerCommands::info);
+        Properties commandStats = (Properties) redisTemplate.execute((RedisCallback<Object>) connection -> connection.info("commandstats"));
+        Object dbSize = redisTemplate.execute((RedisCallback<Object>) RedisServerCommands::dbSize);
+
+        if (commandStats == null) {
+            return AjaxResult.failed("获取异常");
+        }
+
+        Map<String, Object> result = new HashMap<>(3);
+        result.put("info", info);
+        result.put("dbSize", dbSize);
+
+        List<Map<String, String>> pieList = new ArrayList<>();
+        commandStats.stringPropertyNames().forEach(key -> {
+            Map<String, String> data = new HashMap<>(2);
+            String property = commandStats.getProperty(key);
+            data.put("name", StringUtils.removeStart(key, "cmdstat_"));
+            data.put("value", StringUtils.substringBetween(property, "calls=", ",usec"));
+            pieList.add(data);
+        });
+
+        result.put("commandStats", pieList);
+        return AjaxResult.success(result);
+    }
+
+}

+ 33 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/monitor/MonitorServerController.java

@@ -0,0 +1,33 @@
+package com.sckj.admin.controller.monitor;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.ServerResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+@RestController
+@RequestMapping("api/monitor")
+@Api(tags = "监控服务管理")
+public class MonitorServerController {
+
+    /**
+     * 服务器信息
+     *
+     * @author fzr
+     * @return AjaxResult<Map<String, Object>>
+     */
+    @Log(title = "服务监控")
+    @GetMapping("/server")
+    @ApiOperation(value="服务监控")
+    public AjaxResult<Map<String, Object>> info() {
+        ServerResult server = new ServerResult();
+        return AjaxResult.success(server.copyTo());
+    }
+
+}

+ 39 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingCopyrightController.java

@@ -0,0 +1,39 @@
+package com.sckj.admin.controller.setting;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISettingCopyrightService;
+import com.sckj.admin.validate.setting.SettingCopyrightValidate;
+import com.sckj.admin.vo.setting.SettingCopyrightVo;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("api/setting/copyright")
+@Api(tags = "配置网站版权")
+public class SettingCopyrightController {
+
+    @Resource
+    ISettingCopyrightService iSettingCopyrightService;
+
+    @GetMapping("/detail")
+    @ApiOperation(value="网站版权信息")
+    public AjaxResult<List<SettingCopyrightVo>> detail() {
+        List<SettingCopyrightVo> list = iSettingCopyrightService.detail();
+        return AjaxResult.success(list);
+    }
+
+    @Log(title = "网站版权编辑")
+    @PostMapping("/save")
+    @ApiOperation(value="网站版权编辑")
+    public AjaxResult<Object> save(@Validated @RequestBody SettingCopyrightValidate copyrightValidate) {
+        iSettingCopyrightService.save(copyrightValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 82 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingDictDataController.java

@@ -0,0 +1,82 @@
+package com.sckj.admin.controller.setting;
+
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISettingDictDataService;
+import com.sckj.admin.validate.commons.IdsValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.setting.DictDataCreateValidate;
+import com.sckj.admin.validate.setting.DictDataUpdateValidate;
+import com.sckj.admin.vo.setting.SettingDictDataVo;
+import com.sckj.common.aop.NotPower;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import com.sckj.common.util.StringUtils;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("api/setting/dict/data")
+@Api(tags = "配置字典数据")
+public class SettingDictDataController {
+
+    @Resource
+    ISettingDictDataService iSettingDictDataService;
+
+    @NotPower
+    @GetMapping("/all")
+    @ApiOperation(value="字典数据所有")
+    public AjaxResult<List<SettingDictDataVo>> all(@RequestParam Map<String, String> params) {
+        Assert.isFalse(StringUtils.isEmpty(params.get("dictType")), "dictType缺失");
+        List<SettingDictDataVo> list = iSettingDictDataService.all(params);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value="字典数据列表")
+    public AjaxResult<PageResult<SettingDictDataVo>> list(@Validated PageValidate pageValidate,
+                                                          @RequestParam Map<String, String> params) {
+        Assert.isFalse(StringUtils.isEmpty(params.get("dictType")), "dictType缺失");
+        PageResult<SettingDictDataVo> list = iSettingDictDataService.list(pageValidate, params);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="字典数据详情")
+    public AjaxResult<SettingDictDataVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        SettingDictDataVo vo = iSettingDictDataService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "字典数据新增")
+    @PostMapping("/add")
+    @ApiOperation(value="字典数据新增")
+    public AjaxResult<Object> add(@Validated @RequestBody DictDataCreateValidate createValidate) {
+        iSettingDictDataService.add(createValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "字典数据编辑")
+    @PostMapping("/edit")
+    @ApiOperation(value="字典数据编辑")
+    public AjaxResult<Object> edit(@Validated @RequestBody DictDataUpdateValidate updateValidate) {
+        iSettingDictDataService.edit(updateValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "字典数据删除")
+    @PostMapping("/del")
+    @ApiOperation(value="字典数据删除")
+    public AjaxResult<Object> del(@Validated @RequestBody IdsValidate idsValidate) {
+        iSettingDictDataService.del(idsValidate.getIds());
+        return AjaxResult.success();
+    }
+
+}

+ 78 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingDictTypeController.java

@@ -0,0 +1,78 @@
+package com.sckj.admin.controller.setting;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISettingDictTypeService;
+import com.sckj.admin.validate.commons.IdsValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.setting.DictTypeCreateValidate;
+import com.sckj.admin.validate.setting.DictTypeUpdateValidate;
+import com.sckj.admin.vo.setting.SettingDictTypeVo;
+import com.sckj.common.aop.NotPower;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("api/setting/dict/type")
+@Api(tags = "配置字典类型")
+public class SettingDictTypeController {
+
+    @Resource
+    ISettingDictTypeService iSettingDictTypeService;
+
+    @NotPower
+    @GetMapping("/all")
+    @ApiOperation(value="字典类型所有")
+    public AjaxResult<List<SettingDictTypeVo>> all() {
+        List<SettingDictTypeVo> list = iSettingDictTypeService.all();
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value="字典类型列表")
+    public AjaxResult<PageResult<SettingDictTypeVo>> list(@Validated PageValidate pageValidate,
+                                                          @RequestParam Map<String, String> params) {
+        PageResult<SettingDictTypeVo> list = iSettingDictTypeService.list(pageValidate, params);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="字典类型详情")
+    public AjaxResult<SettingDictTypeVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        SettingDictTypeVo vo = iSettingDictTypeService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "字典类型新增")
+    @PostMapping("/add")
+    @ApiOperation(value="字典类型新增")
+    public AjaxResult<Object> add(@Validated @RequestBody DictTypeCreateValidate createValidate) {
+        iSettingDictTypeService.add(createValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "字典类型编辑")
+    @PostMapping("/edit")
+    @ApiOperation(value="字典类型编辑")
+    public AjaxResult<Object> edit(@Validated @RequestBody DictTypeUpdateValidate updateValidate) {
+        iSettingDictTypeService.edit(updateValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "字典类型删除")
+    @PostMapping("/del")
+    @ApiOperation(value="字典类型删除")
+    public AjaxResult<Object> del(@Validated @RequestBody IdsValidate idsValidate) {
+        iSettingDictTypeService.del(idsValidate.getIds());
+        return AjaxResult.success();
+    }
+
+}

+ 38 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingLoginController.java

@@ -0,0 +1,38 @@
+package com.sckj.admin.controller.setting;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISettingLoginService;
+import com.sckj.admin.validate.setting.SettingLoginValidate;
+import com.sckj.admin.vo.setting.SettingLoginVo;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/setting/login")
+@Api(tags = "配置用户登录")
+public class SettingLoginController {
+
+    @Resource
+    ISettingLoginService iSettingLoginService;
+
+    @GetMapping("/detail")
+    @ApiOperation(value="登录设置详情")
+    public AjaxResult<SettingLoginVo> detail() {
+        SettingLoginVo vo = iSettingLoginService.detail();
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "登录设置编辑")
+    @PostMapping("/save")
+    @ApiOperation(value="登录设置编辑")
+    public AjaxResult<Object> save(@Validated @RequestBody SettingLoginValidate loginValidate) {
+        iSettingLoginService.save(loginValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 48 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingNoticeController.java

@@ -0,0 +1,48 @@
+package com.sckj.admin.controller.setting;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISettingNoticeService;
+import com.sckj.admin.vo.setting.SettingNoticeDetailVo;
+import com.sckj.admin.vo.setting.SettingNoticeListedVo;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("api/setting/notice")
+@Api(tags = "配置消息通知")
+public class SettingNoticeController {
+
+    @Resource
+    ISettingNoticeService iSettingNoticeService;
+
+    @GetMapping("/list")
+    @ApiOperation(value="通知设置列表")
+    public AjaxResult<List<SettingNoticeListedVo>> list(@RequestParam Integer recipient) {
+        List<SettingNoticeListedVo> list = iSettingNoticeService.list(recipient);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="通知设置详情")
+    public AjaxResult<SettingNoticeDetailVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        SettingNoticeDetailVo vo = iSettingNoticeService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "通知设置编辑")
+    @PostMapping("/save")
+    @ApiOperation(value="通知设置编辑")
+    public AjaxResult<Object> save(@RequestBody Map<String, Object> params) {
+        iSettingNoticeService.save(params);
+        return AjaxResult.success();
+    }
+
+}

+ 62 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingPaymentController.java

@@ -0,0 +1,62 @@
+package com.sckj.admin.controller.setting;
+
+
+import com.sckj.admin.service.ISettingPaymentService;
+import com.sckj.admin.validate.setting.SettingPayConfigValidate;
+import com.sckj.admin.validate.setting.SettingPayMethodValidate;
+import com.sckj.admin.vo.setting.SettingPaymentMethodVo;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.entity.setting.DevPayConfig;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("api/setting/payment")
+@Api(tags = "配置支付参数")
+public class SettingPaymentController {
+
+    @Resource
+    ISettingPaymentService iSettingPaymentService;
+
+    @GetMapping("/method")
+    @ApiOperation(value="支付方式列表")
+    public AjaxResult<List<List<SettingPaymentMethodVo>>> method() {
+        List<List<SettingPaymentMethodVo>> list = iSettingPaymentService.method();
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value="支付配置列表")
+    public AjaxResult<List<DevPayConfig>> list() {
+        List<DevPayConfig> list = iSettingPaymentService.list();
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="支付配置详情")
+    public AjaxResult<Object> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        DevPayConfig vo = iSettingPaymentService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @PostMapping("/editConfig")
+    @ApiOperation(value="支付配置编辑")
+    public AjaxResult<Object> editConfig(@Validated @RequestBody SettingPayConfigValidate configValidate) {
+        iSettingPaymentService.editConfig(configValidate);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/editMethod")
+    @ApiOperation(value="支付方式编辑")
+    public AjaxResult<Object> editMethod(@Validated @RequestBody SettingPayMethodValidate methodValidate) {
+        iSettingPaymentService.editMethod(methodValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 38 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingProtocolController.java

@@ -0,0 +1,38 @@
+package com.sckj.admin.controller.setting;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISettingProtocolService;
+import com.sckj.admin.validate.setting.SettingProtocolValidate;
+import com.sckj.admin.vo.setting.SettingProtocolDetailVo;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/setting/protocol")
+@Api(tags = "配置政策协议")
+public class SettingProtocolController {
+
+    @Resource
+    ISettingProtocolService iSettingProtocolService;
+
+    @GetMapping("/detail")
+    @ApiOperation(value="政策协议信息")
+    public AjaxResult<SettingProtocolDetailVo> detail() {
+        SettingProtocolDetailVo detail = iSettingProtocolService.detail();
+        return AjaxResult.success(detail);
+    }
+
+    @Log(title = "政策协议编辑")
+    @PostMapping("/save")
+    @ApiOperation(value="政策协议编辑")
+    public AjaxResult<Object> save(@Validated @RequestBody SettingProtocolValidate protocolValidate) {
+        iSettingProtocolService.save(protocolValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 38 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingSearchController.java

@@ -0,0 +1,38 @@
+package com.sckj.admin.controller.setting;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISettingSearchService;
+import com.sckj.admin.validate.setting.SettingSearchValidate;
+import com.sckj.admin.vo.setting.SettingSearchDetailVo;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/setting/search")
+@Api(tags = "配置热门搜索")
+public class SettingSearchController {
+
+    @Resource
+    ISettingSearchService iSettingSearchService;
+
+    @GetMapping("/detail")
+    @ApiOperation(value="热门搜索详情")
+    public AjaxResult<SettingSearchDetailVo> detail() {
+        SettingSearchDetailVo vo = iSettingSearchService.detail();
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "热门搜索编辑")
+    @PostMapping("/save")
+    @ApiOperation(value="热门搜索编辑")
+    public AjaxResult<Object> save(@Validated @RequestBody SettingSearchValidate searchValidate) {
+        iSettingSearchService.save(searchValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 47 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingSmsController.java

@@ -0,0 +1,47 @@
+package com.sckj.admin.controller.setting;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISettingSmsService;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 短信设置管理
+ */
+@RestController
+@RequestMapping("api/setting/sms")
+@Api(tags = "配置短信引擎")
+public class SettingSmsController {
+
+    @Resource
+    ISettingSmsService iSettingSmsService;
+
+    @GetMapping("/list")
+    @ApiOperation(value="短信引擎列表")
+    public AjaxResult<List<Map<String, Object>>> list() {
+        List<Map<String, Object>> list = iSettingSmsService.list();
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="短信引擎详情")
+    public AjaxResult<Map<String, Object>> detail(String alias) {
+        Map<String, Object> map = iSettingSmsService.detail(alias);
+        return AjaxResult.success(map);
+    }
+
+    @Log(title = "短信引擎编辑")
+    @PostMapping("/save")
+    @ApiOperation(value="短信引擎编辑")
+    public AjaxResult<Object> save(@RequestBody Map<String, String> params) {
+        iSettingSmsService.save(params);
+        return AjaxResult.success();
+    }
+
+}

+ 57 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingStorageController.java

@@ -0,0 +1,57 @@
+package com.sckj.admin.controller.setting;
+
+import com.baomidou.mybatisplus.core.toolkit.Assert;
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISettingStorageService;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+import java.util.Map;
+
+@RestController
+@RequestMapping("api/setting/storage")
+@Api(tags = "配置存储方式")
+public class SettingStorageController {
+
+    @Resource
+    ISettingStorageService iSettingStorageService;
+
+    @GetMapping("/list")
+    @ApiOperation(value="存储列表")
+    public AjaxResult<List<Map<String, Object>>> list() {
+        List<Map<String, Object>> list = iSettingStorageService.list();
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="存储详情")
+    public AjaxResult<Map<String, Object>> detail(String alias) {
+        Map<String, Object> map = iSettingStorageService.detail(alias);
+        return AjaxResult.success(map);
+    }
+
+    @Log(title = "存储编辑")
+    @PostMapping("/edit")
+    @ApiOperation(value="存储编辑")
+    public AjaxResult<Object> edit(@RequestBody Map<String, String> params) {
+        iSettingStorageService.edit(params);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "存储切换")
+    @PostMapping("/change")
+    @ApiOperation(value="存储切换")
+    public AjaxResult<Object> change(@RequestBody Map<String, String> params) {
+        Assert.notNull(params.get("alias"), "alias参数缺失");
+        Assert.notNull(params.get("status"), "status参数缺失");
+        String alias = params.get("alias");
+        Integer status = Integer.parseInt(params.get("status"));
+        iSettingStorageService.change(alias, status);
+        return AjaxResult.success();
+    }
+
+}

+ 38 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingUserController.java

@@ -0,0 +1,38 @@
+package com.sckj.admin.controller.setting;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISettingUserService;
+import com.sckj.admin.validate.setting.SettingUserValidate;
+import com.sckj.admin.vo.setting.SettingUserVo;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/setting/user")
+@Api(tags = "配置用户参数")
+public class SettingUserController {
+
+    @Resource
+    ISettingUserService iSettingUserService;
+
+    @GetMapping("/detail")
+    @ApiOperation(value="用户设置详情")
+    public AjaxResult<SettingUserVo> detail() {
+        SettingUserVo vo = iSettingUserService.detail();
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "用户设置编辑")
+    @PostMapping("/save")
+    @ApiOperation(value="用户设置编辑")
+    public AjaxResult<Object> save(@Validated @RequestBody SettingUserValidate userValidate) {
+        iSettingUserService.save(userValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 38 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingWebsiteController.java

@@ -0,0 +1,38 @@
+package com.sckj.admin.controller.setting;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISettingWebsiteService;
+import com.sckj.admin.validate.setting.SettingWebsiteValidate;
+import com.sckj.admin.vo.setting.SettingWebsiteVo;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/setting/website")
+@Api(tags = "配置网站信息")
+public class SettingWebsiteController {
+
+    @Resource
+    ISettingWebsiteService iSettingWebsiteService;
+
+    @GetMapping("/detail")
+    @ApiOperation(value="网站配置信息")
+    public AjaxResult<SettingWebsiteVo> detail() {
+        SettingWebsiteVo detail = iSettingWebsiteService.detail();
+        return AjaxResult.success(detail);
+    }
+
+    @Log(title = "网站配置编辑")
+    @PostMapping("/save")
+    @ApiOperation(value="网站配置编辑")
+    public AjaxResult<Object> save(@Validated @RequestBody SettingWebsiteValidate websiteValidate) {
+        iSettingWebsiteService.save(websiteValidate);
+        return AjaxResult.success();
+    }
+
+}

+ 103 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemAuthAdminController.java

@@ -0,0 +1,103 @@
+package com.sckj.admin.controller.system;
+
+import com.sckj.admin.TapholeAdminThreadLocal;
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISystemAuthAdminService;
+import com.sckj.admin.validate.commons.IdValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.system.SystemAdminCreateValidate;
+import com.sckj.admin.validate.system.SystemAdminSearchValidate;
+import com.sckj.admin.validate.system.SystemAdminUpInfoValidate;
+import com.sckj.admin.validate.system.SystemAdminUpdateValidate;
+import com.sckj.admin.vo.system.SystemAuthAdminDetailVo;
+import com.sckj.admin.vo.system.SystemAuthAdminListedVo;
+import com.sckj.admin.vo.system.SystemAuthAdminSelvesVo;
+import com.sckj.common.aop.NotPower;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/system/admin")
+@Api(tags = "系统用户管理")
+public class SystemAuthAdminController {
+
+    @Resource
+    ISystemAuthAdminService iSystemAuthAdminService;
+
+    @GetMapping("/list")
+    @ApiOperation(value="管理员列表")
+    public AjaxResult<PageResult<SystemAuthAdminListedVo>> list(@Validated PageValidate pageValidate,
+                                                                @Validated SystemAdminSearchValidate searchValidate) {
+        PageResult<SystemAuthAdminListedVo> list = iSystemAuthAdminService.list(pageValidate, searchValidate);
+        return AjaxResult.success(list);
+    }
+
+    @NotPower
+    @GetMapping("/self")
+    @ApiOperation(value="管理员信息")
+    public AjaxResult<SystemAuthAdminSelvesVo> self() {
+        Integer adminId = TapholeAdminThreadLocal.getAdminId();
+        SystemAuthAdminSelvesVo vo = iSystemAuthAdminService.self(adminId);
+        return AjaxResult.success(vo);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="管理员详情")
+    public AjaxResult<SystemAuthAdminDetailVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        SystemAuthAdminDetailVo vo = iSystemAuthAdminService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "管理员新增")
+    @PostMapping("/add")
+    @ApiOperation(value="管理员新增")
+    public AjaxResult<Object> add(@Validated @RequestBody SystemAdminCreateValidate createValidate) {
+        iSystemAuthAdminService.add(createValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "管理员编辑")
+    @PostMapping("/edit")
+    @ApiOperation(value="管理员编辑")
+    public AjaxResult<Object> edit(@Validated @RequestBody SystemAdminUpdateValidate updateValidate) {
+        Integer adminId = TapholeAdminThreadLocal.getAdminId();
+        iSystemAuthAdminService.edit(updateValidate, adminId);
+        return AjaxResult.success();
+    }
+
+    @NotPower
+    @Log(title = "管理员更新")
+    @PostMapping("/upInfo")
+    @ApiOperation(value="当前管理员更新")
+    public AjaxResult<Object> upInfo(@Validated @RequestBody SystemAdminUpInfoValidate upInfoValidate) {
+        Integer adminId = TapholeAdminThreadLocal.getAdminId();
+        iSystemAuthAdminService.upInfo(upInfoValidate, adminId);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "管理员删除")
+    @PostMapping("/del")
+    @ApiOperation(value="管理员删除")
+    public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
+        Integer adminId = TapholeAdminThreadLocal.getAdminId();
+        iSystemAuthAdminService.del(idValidate.getId(), adminId);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "管理员状态")
+    @PostMapping("/disable")
+    @ApiOperation(value="管理员状态切换")
+    public AjaxResult<Object> disable(@Validated @RequestBody IdValidate idValidate) {
+        Integer adminId = TapholeAdminThreadLocal.getAdminId();
+        iSystemAuthAdminService.disable(idValidate.getId(), adminId);
+        return AjaxResult.success();
+    }
+
+}

+ 72 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemAuthDeptController.java

@@ -0,0 +1,72 @@
+package com.sckj.admin.controller.system;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.sckj.admin.service.ISystemAuthDeptService;
+import com.sckj.admin.validate.commons.IdValidate;
+import com.sckj.admin.validate.system.SystemDeptCreateValidate;
+import com.sckj.admin.validate.system.SystemDeptSearchValidate;
+import com.sckj.admin.validate.system.SystemDeptUpdateValidate;
+import com.sckj.admin.vo.system.SystemAuthDeptVo;
+import com.sckj.common.aop.NotPower;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("api/system/dept")
+@Api(tags = "系统部门管理")
+public class SystemAuthDeptController {
+
+    @Resource
+    ISystemAuthDeptService iSystemAuthDeptService;
+
+    @NotPower
+    @GetMapping("/all")
+    @ApiOperation(value="部门所有")
+    public AjaxResult<List<SystemAuthDeptVo>> all() {
+        List<SystemAuthDeptVo> list = iSystemAuthDeptService.all();
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value="部门列表")
+    public AjaxResult<JSONArray> list(@Validated SystemDeptSearchValidate searchValidate) {
+        JSONArray list = iSystemAuthDeptService.list(searchValidate);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="部门详情")
+    public AjaxResult<SystemAuthDeptVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        SystemAuthDeptVo vo = iSystemAuthDeptService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @PostMapping("/add")
+    @ApiOperation(value="部门新增")
+    public AjaxResult<Object> add(@Validated @RequestBody SystemDeptCreateValidate createValidate) {
+        iSystemAuthDeptService.add(createValidate);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/edit")
+    @ApiOperation(value="部门编辑")
+    public AjaxResult<Object> edit(@Validated @RequestBody SystemDeptUpdateValidate updateValidate) {
+        iSystemAuthDeptService.edit(updateValidate);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/del")
+    @ApiOperation(value="部门删除")
+    public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
+        iSystemAuthDeptService.del(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 78 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemAuthMenuController.java

@@ -0,0 +1,78 @@
+package com.sckj.admin.controller.system;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.sckj.admin.TapholeAdminThreadLocal;
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISystemAuthMenuService;
+import com.sckj.admin.validate.commons.IdValidate;
+import com.sckj.admin.validate.system.SystemMenuCreateValidate;
+import com.sckj.admin.validate.system.SystemMenuUpdateValidate;
+import com.sckj.admin.vo.system.SystemAuthMenuVo;
+import com.sckj.common.aop.NotPower;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("api/system/menu")
+@Api(tags = "系统菜单管理")
+public class SystemAuthMenuController {
+
+    @Resource
+    ISystemAuthMenuService iSystemAuthMenuService;
+
+    @NotPower
+    @GetMapping("/route")
+    @ApiOperation(value="获取菜单路由")
+    public AjaxResult<JSONArray> route() {
+        List<Integer> roleIds = TapholeAdminThreadLocal.getRoleIds();
+        JSONArray lists = iSystemAuthMenuService.selectMenuByRoleId(roleIds);
+        return AjaxResult.success(lists);
+    }
+
+    @NotPower
+    @GetMapping("/list")
+    @ApiOperation(value="获取菜单列表")
+    public AjaxResult<JSONArray> list() {
+        JSONArray lists = iSystemAuthMenuService.list();
+        return AjaxResult.success(lists);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="获取菜单详情")
+    public AjaxResult<SystemAuthMenuVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        SystemAuthMenuVo vo = iSystemAuthMenuService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "菜单新增")
+    @PostMapping("/add")
+    @ApiOperation(value="新增菜单")
+    public AjaxResult<Object> add(@Validated @RequestBody SystemMenuCreateValidate createValidate) {
+        iSystemAuthMenuService.add(createValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "菜单编辑")
+    @PostMapping("/edit")
+    @ApiOperation(value="菜单编辑")
+    public AjaxResult<Object> edit(@Validated @RequestBody SystemMenuUpdateValidate updateValidate) {
+        iSystemAuthMenuService.edit(updateValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "菜单删除")
+    @PostMapping("/del")
+    @ApiOperation(value="菜单删除")
+    public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
+        iSystemAuthMenuService.del(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 74 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemAuthPostController.java

@@ -0,0 +1,74 @@
+package com.sckj.admin.controller.system;
+
+import com.sckj.admin.service.ISystemAuthPostService;
+import com.sckj.admin.validate.commons.IdValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.system.SystemPostCreateValidate;
+import com.sckj.admin.validate.system.SystemPostSearchValidate;
+import com.sckj.admin.validate.system.SystemPostUpdateValidate;
+import com.sckj.admin.vo.system.SystemAuthPostVo;
+import com.sckj.common.aop.NotPower;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("api/system/post")
+@Api(tags = "系统岗位管理")
+public class SystemAuthPostController {
+
+    @Resource
+    ISystemAuthPostService iSystemAuthPostService;
+
+    @NotPower
+    @GetMapping("/all")
+    @ApiOperation(value="所有岗位")
+    public AjaxResult<List<SystemAuthPostVo>> all() {
+        List<SystemAuthPostVo> list = iSystemAuthPostService.all();
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/list")
+    @ApiOperation(value="岗位列表")
+    public AjaxResult<PageResult<SystemAuthPostVo>> list(@Validated PageValidate pageValidate,
+                                                         @Validated SystemPostSearchValidate searchValidate) {
+        PageResult<SystemAuthPostVo> list = iSystemAuthPostService.list(pageValidate, searchValidate);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/detail")
+    @ApiOperation(value="岗位详情")
+    public AjaxResult<SystemAuthPostVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        SystemAuthPostVo vo = iSystemAuthPostService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @PostMapping("/add")
+    @ApiOperation(value="岗位新增")
+    public AjaxResult<Object> add(@Validated @RequestBody SystemPostCreateValidate createValidate) {
+        iSystemAuthPostService.add(createValidate);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/edit")
+    @ApiOperation(value="岗位编辑")
+    public AjaxResult<Object> edit(@Validated @RequestBody SystemPostUpdateValidate updateValidate) {
+        iSystemAuthPostService.edit(updateValidate);
+        return AjaxResult.success();
+    }
+
+    @PostMapping("/del")
+    @ApiOperation(value="岗位删除")
+    public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
+        iSystemAuthPostService.del(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 78 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemAuthRoleController.java

@@ -0,0 +1,78 @@
+package com.sckj.admin.controller.system;
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISystemAuthRoleService;
+import com.sckj.admin.validate.commons.IdValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.system.SystemRoleCreateValidate;
+import com.sckj.admin.validate.system.SystemRoleUpdateValidate;
+import com.sckj.admin.vo.system.SystemAuthRoleVo;
+import com.sckj.common.aop.NotPower;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import com.sckj.common.validator.annotation.IDMust;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+@RestController
+@RequestMapping("api/system/role")
+@Api(tags = "系统角色管理")
+public class SystemAuthRoleController {
+
+    @Resource
+    ISystemAuthRoleService iSystemAuthRoleService;
+
+    @NotPower
+    @GetMapping("/all")
+    @ApiOperation(value="所有角色")
+    public AjaxResult<List<SystemAuthRoleVo>> all() {
+        List<SystemAuthRoleVo> list = iSystemAuthRoleService.all();
+        return AjaxResult.success(list);
+    }
+
+    @Log(title = "角色列表")
+    @GetMapping("/list")
+    @ApiOperation(value="角色列表")
+    public AjaxResult<PageResult<SystemAuthRoleVo>> list(@Validated PageValidate pageValidate) {
+        PageResult<SystemAuthRoleVo> list = iSystemAuthRoleService.list(pageValidate);
+        return AjaxResult.success(list);
+    }
+
+    @Log(title = "角色详情")
+    @GetMapping("/detail")
+    @ApiOperation(value="角色详情")
+    public AjaxResult<SystemAuthRoleVo> detail(@Validated @IDMust() @RequestParam("id") Integer id) {
+        SystemAuthRoleVo vo = iSystemAuthRoleService.detail(id);
+        return AjaxResult.success(vo);
+    }
+
+    @Log(title = "角色新增")
+    @PostMapping("/add")
+    @ApiOperation(value="角色新增")
+    public AjaxResult<Object> add(@Validated @RequestBody SystemRoleCreateValidate createValidate) {
+        iSystemAuthRoleService.add(createValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "角色编辑")
+    @PostMapping("/edit")
+    @ApiOperation(value="角色编辑")
+    public AjaxResult<Object> edit(@Validated @RequestBody SystemRoleUpdateValidate updateValidate) {
+        iSystemAuthRoleService.edit(updateValidate);
+        return AjaxResult.success();
+    }
+
+    @Log(title = "角色删除")
+    @PostMapping("/del")
+    @ApiOperation(value="角色删除")
+    public AjaxResult<Object> del(@Validated @RequestBody IdValidate idValidate) {
+        iSystemAuthRoleService.del(idValidate.getId());
+        return AjaxResult.success();
+    }
+
+}

+ 32 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemCacheController.java

@@ -0,0 +1,32 @@
+package com.sckj.admin.controller.system;
+
+
+import com.sckj.admin.aop.Log;
+import com.sckj.admin.service.ISystemCacheService;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/system/cache")
+@Api(tags = "系统缓存管理")
+public class SystemCacheController {
+
+    @Resource
+    ISystemCacheService iSystemCacheService;
+
+    @Log(title = "清除系统缓存")
+    @PostMapping("/clear")
+    @ApiOperation(value = "清除系统缓存")
+    public AjaxResult<Object> clear() {
+        iSystemCacheService.clear();
+        return AjaxResult.success();
+    }
+
+
+}

+ 50 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemLoginController.java

@@ -0,0 +1,50 @@
+package com.sckj.admin.controller.system;
+
+import com.sckj.admin.service.ISystemLoginService;
+import com.sckj.admin.validate.system.SystemAdminLoginsValidate;
+import com.sckj.admin.vo.system.SystemCaptchaVo;
+import com.sckj.admin.vo.system.SystemLoginVo;
+import com.sckj.common.aop.NotLogin;
+import com.sckj.common.aop.NotPower;
+import com.sckj.common.core.AjaxResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+
+@RestController
+@RequestMapping("api/system")
+@Api(tags = "系统登录管理")
+public class SystemLoginController {
+
+    @Resource
+    ISystemLoginService iSystemLoginService;
+
+    @NotLogin
+    @GetMapping("/captcha")
+    @ApiOperation(value="取验证码")
+    public AjaxResult<SystemCaptchaVo> captcha() {
+        SystemCaptchaVo vo = iSystemLoginService.captcha();
+        return AjaxResult.success(vo);
+    }
+
+    @NotLogin
+    @PostMapping("/login")
+    @ApiOperation(value="登录系统")
+    public AjaxResult<SystemLoginVo> login(@Validated() @RequestBody SystemAdminLoginsValidate loginsValidate) {
+        SystemLoginVo vo = iSystemLoginService.login(loginsValidate);
+        return AjaxResult.success(vo);
+    }
+
+    @NotPower
+    @PostMapping("/logout")
+    @ApiOperation(value="退出登录")
+    public AjaxResult<Object> logout(HttpServletRequest request) {
+        iSystemLoginService.logout(request.getHeader("token"));
+        return AjaxResult.success();
+    }
+
+}

+ 44 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/system/SystemLogsController.java

@@ -0,0 +1,44 @@
+package com.sckj.admin.controller.system;
+
+import com.sckj.admin.service.ISystemLogsServer;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.system.SystemSearchLoginsValidate;
+import com.sckj.admin.validate.system.SystemSearchOperateValidate;
+import com.sckj.admin.vo.system.SystemLogLoginVo;
+import com.sckj.admin.vo.system.SystemLogOperateVo;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.core.PageResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+
+@RestController
+@RequestMapping("api/system/log")
+@Api(tags = "系统日志管理")
+public class SystemLogsController {
+
+    @Resource
+    ISystemLogsServer iSystemLogsServer;
+
+    @GetMapping("/operate")
+    @ApiOperation(value="系统操作日志")
+    public AjaxResult<PageResult<SystemLogOperateVo>> operate(@Validated PageValidate pageValidate,
+                                                              @Validated SystemSearchOperateValidate searchValidate) {
+        PageResult<SystemLogOperateVo> list = iSystemLogsServer.operate(pageValidate, searchValidate);
+        return AjaxResult.success(list);
+    }
+
+    @GetMapping("/login")
+    @ApiOperation(value="系统登录日志")
+    public AjaxResult<PageResult<SystemLogLoginVo>> login(@Validated PageValidate pageValidate,
+                                                          @Validated SystemSearchLoginsValidate searchValidate) {
+        PageResult<SystemLogLoginVo> list = iSystemLogsServer.login(pageValidate, searchValidate);
+        return AjaxResult.success(list);
+    }
+
+}

+ 17 - 0
taphole-admin/src/main/java/com/sckj/admin/crontab/MyJob.java

@@ -0,0 +1,17 @@
+package com.sckj.admin.crontab;
+
+
+import org.springframework.stereotype.Component;
+
+
+/**
+ * 具体的定时任务
+ */
+@Component("myJob")
+public class MyJob  {
+
+    public void handle(String s) {
+        // System.out.println("有参数定时任务执行逻辑 : " + s);
+    }
+
+}

+ 95 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IAlbumsService.java

@@ -0,0 +1,95 @@
+package com.sckj.admin.service;
+
+import com.alibaba.fastjson2.JSONArray;
+import com.sckj.admin.validate.album.AlbumCateValidate;
+import com.sckj.admin.validate.album.AlbumSearchValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.vo.album.AlbumVo;
+import com.sckj.common.core.PageResult;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 相册服务接口类
+ */
+public interface IAlbumsService {
+
+    /**
+     * 文件列表
+     *
+     * @author fzr
+     * @param pageValidate 分页参数
+     * @param searchValidate 其他搜索参数
+     * @return PageResult<AlbumVo>
+     */
+    PageResult<AlbumVo> albumList(PageValidate pageValidate, AlbumSearchValidate searchValidate);
+
+    /**
+     * 文件重命名
+     *
+     * @param id 文件ID
+     * @param name 文件名称
+     */
+    void albumRename(Integer id, String name);
+
+    /**
+     * 文件移动
+     *
+     * @author fzr
+     * @param ids 文件ID
+     * @param cid 类目ID
+     */
+    void albumMove(List<Integer> ids, Integer cid);
+
+    /**
+     * 文件新增
+     *
+     * @author fzr
+     * @param params 文件信息参数
+     */
+    Integer albumAdd(Map<String, String> params);
+
+    /**
+     * 文件删除
+     *
+     * @author fzr
+     * @param ids 文件ID
+     */
+    void albumDel(List<Integer> ids);
+
+    /**
+     * 分类列表
+     *
+     * @author fzr
+     * @param searchValidate 搜索参数
+     * @return JSONArray
+     */
+    JSONArray cateList(AlbumSearchValidate searchValidate);
+
+    /**
+     * 分类新增
+     *
+     * @author fzr
+     * @param cateValidate 分类参数
+     */
+    void cateAdd(AlbumCateValidate cateValidate);
+
+    /**
+     * 分类编辑
+     *
+     * @author fzr
+     * @param id 分类ID
+     * @param name 分类名称
+     */
+    void cateRename(Integer id, String name);
+
+    /**
+     * 分类删除
+     *
+     * @author fzr
+     * @param id 分类ID
+     */
+    void cateDel(Integer id);
+
+}

+ 75 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IArtCateService.java

@@ -0,0 +1,75 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.article.ArtCateCreateValidate;
+import com.sckj.admin.validate.article.ArtCateSearchValidate;
+import com.sckj.admin.validate.article.ArtCateUpdateValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.vo.article.ArticleCateVo;
+import com.sckj.common.core.PageResult;
+
+import java.util.List;
+
+/**
+ * 文章分类服接口务类
+ */
+public interface IArtCateService {
+
+    /**
+     * 分类所有
+     *
+     * @author fzr
+     * @return List<CategoryVo>
+     */
+    List<ArticleCateVo> all();
+
+    /**
+     * 分类列表
+     *
+     * @author fzr
+     * @param pageValidate 分页参数
+     * @param searchValidate 搜索参数
+     * @return PageResult<CategoryVo>
+     */
+    PageResult<ArticleCateVo> list(PageValidate pageValidate, ArtCateSearchValidate searchValidate);
+
+    /**
+     * 分类详情
+     *
+     * @author fzr
+     * @param id 分类ID
+     */
+    ArticleCateVo detail(Integer id);
+
+    /**
+     * 分类新增
+     *
+     * @author fzr
+     * @param createValidate 参数
+     */
+    void add(ArtCateCreateValidate createValidate);
+
+    /**
+     * 分类编辑
+     *
+     * @author fzr
+     * @param updateValidate 参数
+     */
+    void edit(ArtCateUpdateValidate updateValidate);
+
+    /**
+     * 分类删除
+     *
+     * @author fzr
+     * @param id 分类ID
+     */
+    void del(Integer id);
+
+    /**
+     * 分类状态
+     *
+     * @author fzr
+     * @param id 分类ID
+     */
+    void change(Integer id);
+
+}

+ 66 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IArticleService.java

@@ -0,0 +1,66 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.article.ArticleCreateValidate;
+import com.sckj.admin.validate.article.ArticleSearchValidate;
+import com.sckj.admin.validate.article.ArticleUpdateValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.vo.article.ArticleDetailVo;
+import com.sckj.admin.vo.article.ArticleListedVo;
+import com.sckj.common.core.PageResult;
+
+/**
+ * 文章服务接口类
+ */
+public interface IArticleService {
+
+    /**
+     * 文章列表
+     *
+     * @author fzr
+     * @param pageValidate 分页参数
+     * @param searchValidate 搜索参数
+     * @return PageResult<ArticleListVo>
+     */
+    PageResult<ArticleListedVo> list(PageValidate pageValidate, ArticleSearchValidate searchValidate);
+
+    /**
+     * 文章详情
+     *
+     * @author fzr
+     * @param id 主键ID
+     */
+    ArticleDetailVo detail(Integer id);
+
+    /**
+     * 文章新增
+     *
+     * @author fzr
+     * @param createValidate 参数
+     */
+    void add(ArticleCreateValidate createValidate);
+
+    /**
+     * 文章编辑
+     *
+     * @author fzr
+     * @param updateValidate 参数
+     */
+    void edit(ArticleUpdateValidate updateValidate);
+
+    /**
+     * 文章删除
+     *
+     * @author fzr
+     * @param id 文章主键
+     */
+    void del(Integer id);
+
+    /**
+     * 文章状态
+     *
+     * @author fzr
+     * @param id 文章主键
+     */
+    void change(Integer id);
+
+}

+ 27 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IChannelH5ConfigService.java

@@ -0,0 +1,27 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.channel.ChannelH5Validate;
+import com.sckj.admin.vo.channel.ChannelH5Vo;
+
+/**
+ * H5渠道设置服务接口类
+ */
+public interface IChannelH5ConfigService {
+
+    /**
+     * H5设置详情
+     *
+     * @author fzr
+     * @return ChannelH5Vo
+     */
+    ChannelH5Vo detail();
+
+    /**
+     * H5设置保存
+     *
+     * @author fzr
+     * @param channelH5Validate 参数
+     */
+    void save(ChannelH5Validate channelH5Validate);
+
+}

+ 27 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IChannelMpConfigService.java

@@ -0,0 +1,27 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.channel.ChannelMpValidate;
+import com.sckj.admin.vo.channel.ChannelMpVo;
+
+/**
+ * 微信小程序渠道服务接口类
+ */
+public interface IChannelMpConfigService {
+
+    /**
+     * 微信小程序设置详情
+     *
+     * @author fzr
+     * @return ChannelMpVo
+     */
+    ChannelMpVo detail();
+
+    /**
+     * 微信小程序设置保存
+     *
+     * @author fzr
+     * @param channelMpValidate 参数
+     */
+    void save(ChannelMpValidate channelMpValidate);
+
+}

+ 29 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IChannelOaCallBackService.java

@@ -0,0 +1,29 @@
+package com.sckj.admin.service;
+
+
+/**
+ * 公众号服务器回调
+ */
+public interface IChannelOaCallBackService {
+
+
+    /**
+     * 服务器验证
+     */
+    String checkSignature(String signature, String timestamp, String nonce, String echostr);
+
+
+    /**
+     * 消息回复
+     *
+     * @param requestBody
+     * @param signature
+     * @param timestamp
+     * @param nonce
+     * @param encType
+     * @param msgSignature
+     * @return
+     */
+    String post(String requestBody, String signature, String timestamp, String nonce, String encType, String msgSignature);
+
+}

+ 28 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IChannelOaConfigService.java

@@ -0,0 +1,28 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.channel.ChannelOaValidate;
+import com.sckj.admin.vo.channel.ChannelOaVo;
+
+
+/**
+ * 公众号渠道设置服务接口类
+ */
+public interface IChannelOaConfigService {
+
+    /**
+     * 公众号设置详情
+     *
+     * @author fzr
+     * @return ChannelOaVo
+     */
+    ChannelOaVo detail();
+
+    /**
+     * 公众号设置保存
+     *
+     * @author fzr
+     * @param channelOaValidate 参数
+     */
+    void save(ChannelOaValidate channelOaValidate);
+
+}

+ 30 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IChannelOaMenusService.java

@@ -0,0 +1,30 @@
+package com.sckj.admin.service;
+
+import com.alibaba.fastjson2.JSONArray;
+
+import java.util.List;
+
+
+/**
+ * 公众号菜单服务接口类
+ */
+public interface IChannelOaMenusService {
+
+    /**
+     * 菜单详情
+     *
+     * @author fzr
+     * @return JSONArray
+     */
+    JSONArray detail();
+
+    /**
+     * 菜单保存
+     *
+     * @author fzr
+     * @param params 参数
+     * @param isPublish 是否发布
+     */
+    void save(List<Object> params, Boolean isPublish);
+
+}

+ 63 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IChannelOaReplyDefaultService.java

@@ -0,0 +1,63 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.channel.ChannelRpDefaultValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.vo.channel.ChannelRpDefaultVo;
+import com.sckj.common.core.PageResult;
+
+/**
+ * 公众号默认回复服务接口类
+ */
+public interface IChannelOaReplyDefaultService {
+
+    /**
+     * 默认回复列表
+     *
+     * @author fzr
+     * @param pageValidate 分页参数
+     * @return PageResult<ChannelRpDefaultVo>
+     */
+    PageResult<ChannelRpDefaultVo> list(PageValidate pageValidate);
+
+    /**
+     * 默认回复详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return ChannelRpDefaultVo
+     */
+    ChannelRpDefaultVo detail(Integer id);
+
+    /**
+     * 默认回复新增
+     *
+     * @author fzr
+     * @param defaultValidate 参数
+     */
+    void add(ChannelRpDefaultValidate defaultValidate);
+
+    /**
+     * 默认回复编辑
+     *
+     * @author fzr
+     * @param defaultValidate 参数
+     */
+    void edit(ChannelRpDefaultValidate defaultValidate);
+
+    /**
+     * 默认回复删除
+     *
+     * @author fzr
+     * @param id 主键
+     */
+    void del(Integer id);
+
+    /**
+     * 默认回复状态
+     *
+     * @author fzr
+     * @param id 主键
+     */
+    void status(Integer id);
+
+}

+ 63 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IChannelOaReplyFollowService.java

@@ -0,0 +1,63 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.channel.ChannelRpFollowsValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.vo.channel.ChannelRpFollowsVo;
+import com.sckj.common.core.PageResult;
+
+/**
+ * 公众号关注回复服务接口类
+ */
+public interface IChannelOaReplyFollowService {
+
+    /**
+     * 关注回复列表
+     *
+     * @author fzr
+     * @param pageValidate 分页参数
+     * @return PageResult<ChannelRpFollowsVo>
+     */
+    PageResult<ChannelRpFollowsVo> list(PageValidate pageValidate);
+
+    /**
+     * 关注回复详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return ChannelRpFollowsVo
+     */
+    ChannelRpFollowsVo detail(Integer id);
+
+    /**
+     * 关注回复新增
+     *
+     * @author fzr
+     * @param followsValidate 参数
+     */
+    void add(ChannelRpFollowsValidate followsValidate);
+
+    /**
+     * 关注回复编辑
+     *
+     * @author fzr
+     * @param followsValidate 参数
+     */
+    void edit(ChannelRpFollowsValidate followsValidate);
+
+    /**
+     * 关注回复删除
+     *
+     * @author fzr
+     * @param id 主键
+     */
+    void del(Integer id);
+
+    /**
+     * 关注回复状态
+     *
+     * @author fzr
+     * @param id 主键
+     */
+    void status(Integer id);
+
+}

+ 64 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IChannelOaReplyKeywordService.java

@@ -0,0 +1,64 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.channel.ChannelRpKeywordValidate;
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.vo.channel.ChannelRpKeywordVo;
+import com.sckj.common.core.PageResult;
+
+/**
+ * 公众号关键词回复服务接口类
+ */
+public interface IChannelOaReplyKeywordService {
+
+    /**
+     * 关键词回复列表
+     *
+     * @author fzr
+     * @param pageValidate 分页参数
+     * @return PageResult<ChannelRpKeywordVo>
+     */
+    PageResult<ChannelRpKeywordVo> list(PageValidate pageValidate);
+
+    /**
+     * 关键词回复详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return ChannelRpKeywordVo
+     */
+    ChannelRpKeywordVo detail(Integer id);
+
+
+    /**
+     * 关键词回复新增
+     *
+     * @author fzr
+     * @param keywordValidate 参数
+     */
+    void add(ChannelRpKeywordValidate keywordValidate);
+
+    /**
+     * 关键词回复编辑
+     *
+     * @author fzr
+     * @param keywordValidate 参数
+     */
+    void edit(ChannelRpKeywordValidate keywordValidate);
+
+    /**
+     * 关键词回复删除
+     *
+     * @author fzr
+     * @param id 主键
+     */
+    void del(Integer id);
+
+    /**
+     * 关键词回复状态
+     *
+     * @author fzr
+     * @param id 主键
+     */
+    void status(Integer id);
+
+}

+ 27 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IChannelOpService.java

@@ -0,0 +1,27 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.channel.ChannelOpValidate;
+import com.sckj.admin.vo.channel.ChannelOpVo;
+
+/**
+ * 微信开放渠道设置接口服务类
+ */
+public interface IChannelOpService {
+
+    /**
+     * 开放平台设置详情
+     *
+     * @author fzr
+     * @return ChannelOpVo
+     */
+    ChannelOpVo detail();
+
+    /**
+     * 开放平台设置保存
+     *
+     * @author fzr
+     * @param opValidate 参数
+     */
+    void save(ChannelOpValidate opValidate);
+
+}

+ 58 - 0
taphole-admin/src/main/java/com/sckj/admin/service/ICrontabService.java

@@ -0,0 +1,58 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.crontab.CrontabCreateValidate;
+import com.sckj.admin.validate.crontab.CrontabUpdateValidate;
+import com.sckj.admin.vo.CrontabDetailVo;
+import com.sckj.admin.vo.CrontabListedVo;
+import com.sckj.common.core.PageResult;
+import org.quartz.SchedulerException;
+
+/**
+ * 计划任务服务接口类
+ */
+public interface ICrontabService {
+
+    /**
+     * 计划任务列表
+     *
+     * @author fzr
+     * @param pageValidate 分页参数
+     * @return PageResult<CrontabListedVo>
+     */
+    PageResult<CrontabListedVo> list(PageValidate pageValidate);
+
+    /**
+     * 计划任务详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return CrontabDetailVo
+     */
+    CrontabDetailVo detail(Integer id);
+
+    /**
+     * 计划任务新增
+     *
+     * @author fzr
+     * @param createValidate 参数
+     */
+    void add(CrontabCreateValidate createValidate) throws SchedulerException;
+
+    /**
+     * 计划任务编辑
+     *
+     * @author fzr
+     * @param updateValidate 参数
+     */
+    void edit(CrontabUpdateValidate updateValidate) throws SchedulerException;
+
+    /**
+     * 计划任务删除
+     *
+     * @author fzr
+     * @param id 主键
+     */
+    void del(Integer id) throws SchedulerException;
+
+}

+ 21 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IDecorateDataService.java

@@ -0,0 +1,21 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.vo.decorate.DecorateDataArticleVo;
+
+import java.util.List;
+
+/**
+ * 装修数据服务接口类
+ */
+public interface IDecorateDataService {
+
+    /**
+     * 获取文章数据
+     *
+     * @author fzr
+     * @param limit 条数
+     * @return List<DecorateArticleDataVo>
+     */
+    List<DecorateDataArticleVo> article(Integer limit);
+
+}

+ 24 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IDecoratePageService.java

@@ -0,0 +1,24 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.decorate.DecoratePageValidate;
+import com.sckj.admin.vo.decorate.DecoratePageVo;
+
+public interface IDecoratePageService {
+
+    /**
+     * 页面装修详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return DecoratePageVo
+     */
+    DecoratePageVo detail(Integer id);
+
+    /**
+     * 页面装修保存
+     *
+     * @author fzr
+     * @param decoratePageValidate 参数
+     */
+    void save(DecoratePageValidate decoratePageValidate);
+}

+ 27 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IDecorateTabbarService.java

@@ -0,0 +1,27 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.decorate.DecorateTabsValidate;
+import com.sckj.admin.vo.decorate.DecorateTabbarVo;
+
+/**
+ * 底部导航服务接口类
+ */
+public interface IDecorateTabbarService {
+
+    /**
+     * 底部导航详情
+     *
+     * @author fzr
+     * @return DecorateTabbarVo
+     */
+    DecorateTabbarVo detail();
+
+    /**
+     * 底部导航保存
+     *
+     * @author fzr
+     * @param tabsValidate 参数
+     */
+    void save(DecorateTabsValidate tabsValidate);
+
+}

+ 41 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IFinanceRechargerService.java

@@ -0,0 +1,41 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.finance.FinanceRechargeSearchValidate;
+import com.sckj.admin.vo.finance.FinanceRechargeListVo;
+import com.sckj.common.core.PageResult;
+
+/**
+ * 充值记录服务接口类
+ */
+public interface IFinanceRechargerService {
+
+    /**
+     * 充值记录
+     *
+     * @author fzr
+     * @param pageValidate 分页参数
+     * @param searchValidate 搜索参数
+     * @return PageResult<FinanceRechargeListVo>
+     */
+    PageResult<FinanceRechargeListVo> list(PageValidate pageValidate, FinanceRechargeSearchValidate searchValidate);
+
+    /**
+     * 发起退款
+     *
+     * @author fzr
+     * @param orderId 订单ID
+     * @param adminId 管理员ID
+     */
+    void refund(Integer orderId, Integer adminId);
+
+    /**
+     * 重新退款
+     *
+     * @author fzr
+     * @param recordId 记录ID
+     * @param adminId 管理员ID
+     */
+    void refundAgain(Integer recordId, Integer adminId);
+
+}

+ 34 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IFinanceRefundService.java

@@ -0,0 +1,34 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.finance.FinanceRefundSearchValidate;
+import com.sckj.admin.vo.finance.FinanceRefundListVo;
+import com.sckj.admin.vo.finance.FinanceRefundLogVo;
+import com.sckj.common.core.PageResult;
+
+import java.util.List;
+
+/**
+ * 退款记录服务接口类
+ */
+public interface IFinanceRefundService {
+
+    /**
+     * 退款记录列表
+     *
+     * @author fzr
+     * @param pageValidate 分页参数
+     * @param searchValidate 搜索参数
+     * @return PageResult<FinanceRechargeListVo>
+     */
+    PageResult<FinanceRefundListVo> list(PageValidate pageValidate, FinanceRefundSearchValidate searchValidate);
+
+    /**
+     * 退款日志
+     *
+     * @param recordId 退款日志ID
+     * @return  List<FinanceRefundLogVo>
+     */
+    List<FinanceRefundLogVo> log(Integer recordId);
+
+}

+ 23 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IFinanceWalletService.java

@@ -0,0 +1,23 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.finance.FinanceWalletSearchValidate;
+import com.sckj.admin.vo.finance.FinanceWalletListVo;
+import com.sckj.common.core.PageResult;
+
+/**
+ * 用户余额记录服务接口类
+ */
+public interface IFinanceWalletService {
+
+    /**
+     * 余额明细列表
+     *
+     * @author fzr
+     * @param pageValidate 分页参数
+     * @param searchValidate 搜索参数
+     * @return PageResult<FinanceWalletListVo>
+     */
+    PageResult<FinanceWalletListVo> list(PageValidate pageValidate, FinanceWalletSearchValidate searchValidate);
+
+}

+ 23 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IIndexService.java

@@ -0,0 +1,23 @@
+package com.sckj.admin.service;
+
+import java.util.Map;
+
+/**
+ * 主页服务接口类
+ */
+public interface IIndexService {
+
+    /**
+     * 控制台数据
+     *
+     * @author fzr
+     * @return Map<String, Object>
+     */
+    Map<String, Object> console();
+
+    /**
+     * 公共配置
+     */
+    Map<String, Object> config();
+
+}

+ 27 - 0
taphole-admin/src/main/java/com/sckj/admin/service/IMarketingRechargeService.java

@@ -0,0 +1,27 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.marketing.MarketingRechargeValidate;
+import com.sckj.admin.vo.marketing.MarketingRechargeVo;
+
+/**
+ * 营销充值服务接口类
+ */
+public interface IMarketingRechargeService {
+
+    /**
+     * 充值配置详情
+     *
+     * @author fzr
+     * @return MarketingRechargeVo
+     */
+    MarketingRechargeVo detail();
+
+    /**
+     * 充值配置保存
+     *
+     * @author fzr
+     * @param rechargeValidate 充值参数
+     */
+    void save(MarketingRechargeValidate rechargeValidate);
+
+}

+ 29 - 0
taphole-admin/src/main/java/com/sckj/admin/service/ISettingCopyrightService.java

@@ -0,0 +1,29 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.setting.SettingCopyrightValidate;
+import com.sckj.admin.vo.setting.SettingCopyrightVo;
+
+import java.util.List;
+
+/**
+ * 网站备案服务接口类
+ */
+public interface ISettingCopyrightService {
+
+    /**
+     * 获取网站备案信息
+     *
+     * @author fzr
+     * @return List<SettingCopyrightVo>
+     */
+    List<SettingCopyrightVo> detail();
+
+    /**
+     * 保存网站备案信息
+     *
+     * @author fzr
+     * @param copyrightValidate 参数
+     */
+    void save(SettingCopyrightValidate copyrightValidate);
+
+}

+ 68 - 0
taphole-admin/src/main/java/com/sckj/admin/service/ISettingDictDataService.java

@@ -0,0 +1,68 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.setting.DictDataCreateValidate;
+import com.sckj.admin.validate.setting.DictDataUpdateValidate;
+import com.sckj.admin.vo.setting.SettingDictDataVo;
+import com.sckj.common.core.PageResult;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 字典数据服务接口类
+ */
+public interface ISettingDictDataService {
+
+    /**
+     * 字典数据所有
+     *
+     * @author fzr
+     * @return List<DictDataVo>
+     */
+    List<SettingDictDataVo> all(Map<String, String> params);
+
+    /**
+     * 字典数据列表
+     *
+     * @author fzr
+     * @param pageValidate 分页参数
+     * @param params 搜索参数
+     * @return PageResult<DictDataVo>
+     */
+    PageResult<SettingDictDataVo> list(PageValidate pageValidate, Map<String, String> params);
+
+    /**
+     * 字典数据详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return DictDataVo
+     */
+    SettingDictDataVo detail(Integer id);
+
+    /**
+     * 字典数据新增
+     *
+     * @author fzr
+     * @param createValidate 参数
+     */
+    void add(DictDataCreateValidate createValidate);
+
+    /**
+     * 字典数据编辑
+     *
+     * @author fzr
+     * @param updateValidate 参数
+     */
+    void edit(DictDataUpdateValidate updateValidate);
+
+    /**
+     * 字典数据删除
+     *
+     * @author fzr
+     * @param ids 主键
+     */
+    void del(List<Integer> ids);
+
+}

+ 68 - 0
taphole-admin/src/main/java/com/sckj/admin/service/ISettingDictTypeService.java

@@ -0,0 +1,68 @@
+package com.sckj.admin.service;
+
+import com.sckj.admin.validate.commons.PageValidate;
+import com.sckj.admin.validate.setting.DictTypeCreateValidate;
+import com.sckj.admin.validate.setting.DictTypeUpdateValidate;
+import com.sckj.admin.vo.setting.SettingDictTypeVo;
+import com.sckj.common.core.PageResult;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 字典类型服务接口类
+ */
+public interface ISettingDictTypeService {
+
+    /**
+     * 字典类型所有
+     *
+     * @author fzr
+     * @return List<DictTypeVo>
+     */
+    List<SettingDictTypeVo> all();
+
+    /**
+     * 字典类型列表
+     *
+     * @author fzr
+     * @param pageValidate 分页参数
+     * @param params 搜索参数
+     * @return PageResult<DictDataVo>
+     */
+    PageResult<SettingDictTypeVo> list(PageValidate pageValidate, Map<String, String> params);
+
+    /**
+     * 字典类型详情
+     *
+     * @author fzr
+     * @param id 主键
+     * @return DictDataVo
+     */
+    SettingDictTypeVo detail(Integer id);
+
+    /**
+     * 字典类型新增
+     *
+     * @author fzr
+     * @param createValidate 参数
+     */
+    void add(DictTypeCreateValidate createValidate);
+
+    /**
+     * 字典类型编辑
+     *
+     * @author fzr
+     * @param updateValidate 参数
+     */
+    void edit(DictTypeUpdateValidate updateValidate);
+
+    /**
+     * 字典类型删除
+     *
+     * @author fzr
+     * @param ids 主键
+     */
+    void del(List<Integer> ids);
+
+}

Kaikkia tiedostoja ei voida näyttää, sillä liian monta tiedostoa muuttui tässä diffissä