Przeglądaj źródła

Signed-off-by: ljx <809268652@qq.com>

ljx 9 miesięcy temu
commit
bb91cb9a6c
100 zmienionych plików z 6687 dodań i 0 usunięć
  1. 37 0
      430-platform-backend-master/.editorconfig
  2. 61 0
      430-platform-backend-master/.gitignore
  3. 231 0
      430-platform-backend-master/Jenkinsfile
  4. 3 0
      430-platform-backend-master/README.md
  5. 0 0
      430-platform-backend-master/_other/common-sql/常用SQL备份.sql
  6. 298 0
      430-platform-backend-master/_other/doc/微信支付-Java-SDK.md
  7. 9 0
      430-platform-backend-master/_other/nginx/README.md
  8. 46 0
      430-platform-backend-master/_other/upgrade-sql/430-platform.ndm2
  9. 52 0
      430-platform-backend-master/bin/start.sh
  10. 46 0
      430-platform-backend-master/bin/stop.sh
  11. 405 0
      430-platform-backend-master/pom.xml
  12. 38 0
      430-platform-backend-master/src/main/java/com/app/Application.java
  13. 19 0
      430-platform-backend-master/src/main/java/com/app/annotation/platform/OperationLog.java
  14. 192 0
      430-platform-backend-master/src/main/java/com/app/aspect/platform/ControllerAspect.java
  15. 69 0
      430-platform-backend-master/src/main/java/com/app/aspect/platform/HttpLoggerInterceptor.java
  16. 141 0
      430-platform-backend-master/src/main/java/com/app/aspect/platform/OperationLogAspect.java
  17. 60 0
      430-platform-backend-master/src/main/java/com/app/config/AsyncPoolConfig.java
  18. 42 0
      430-platform-backend-master/src/main/java/com/app/config/CorcConfig.java
  19. 23 0
      430-platform-backend-master/src/main/java/com/app/config/FeignConfig.java
  20. 30 0
      430-platform-backend-master/src/main/java/com/app/config/RestTemplateConfig.java
  21. 36 0
      430-platform-backend-master/src/main/java/com/app/config/ScheduleConfiguration.java
  22. 24 0
      430-platform-backend-master/src/main/java/com/app/config/WXMPConfig.java
  23. 123 0
      430-platform-backend-master/src/main/java/com/app/config/WXMPPayConfig.java
  24. 58 0
      430-platform-backend-master/src/main/java/com/app/config/WebMvcConfig.java
  25. 38 0
      430-platform-backend-master/src/main/java/com/app/config/mybatisplus/AutoFillEntityHandler.java
  26. 25 0
      430-platform-backend-master/src/main/java/com/app/config/mybatisplus/MybatisPlusConfig.java
  27. 151 0
      430-platform-backend-master/src/main/java/com/app/config/redis/RedisConfig.java
  28. 209 0
      430-platform-backend-master/src/main/java/com/app/config/swagger/SwaggerUIConfig.java
  29. 32 0
      430-platform-backend-master/src/main/java/com/app/constant/AccountConstant.java
  30. 32 0
      430-platform-backend-master/src/main/java/com/app/constant/EnumSerializer.java
  31. 24 0
      430-platform-backend-master/src/main/java/com/app/constant/JwtConstant.java
  32. 9 0
      430-platform-backend-master/src/main/java/com/app/constant/MenuConstant.java
  33. 10 0
      430-platform-backend-master/src/main/java/com/app/constant/OpenCourseConstant.java
  34. 32 0
      430-platform-backend-master/src/main/java/com/app/constant/OrderConstant.java
  35. 29 0
      430-platform-backend-master/src/main/java/com/app/constant/RedisKeyConstant.java
  36. 297 0
      430-platform-backend-master/src/main/java/com/app/constant/SchoolConstant.java
  37. 24 0
      430-platform-backend-master/src/main/java/com/app/constant/SystemConstant.java
  38. 73 0
      430-platform-backend-master/src/main/java/com/app/controller/CommonController.java
  39. 54 0
      430-platform-backend-master/src/main/java/com/app/controller/admin/CommentController.java
  40. 55 0
      430-platform-backend-master/src/main/java/com/app/controller/admin/OpenCourseOrderController.java
  41. 101 0
      430-platform-backend-master/src/main/java/com/app/controller/admin/OpenCourseRefundController.java
  42. 60 0
      430-platform-backend-master/src/main/java/com/app/controller/admin/ReportController.java
  43. 95 0
      430-platform-backend-master/src/main/java/com/app/controller/admin/basics/CourseController.java
  44. 105 0
      430-platform-backend-master/src/main/java/com/app/controller/admin/basics/OpenCourseController.java
  45. 92 0
      430-platform-backend-master/src/main/java/com/app/controller/admin/basics/SchoolController.java
  46. 60 0
      430-platform-backend-master/src/main/java/com/app/controller/admin/basics/TeacherController.java
  47. 66 0
      430-platform-backend-master/src/main/java/com/app/controller/admin/basics/YearSemesterController.java
  48. 75 0
      430-platform-backend-master/src/main/java/com/app/controller/admin/guardian/GuardianController.java
  49. 78 0
      430-platform-backend-master/src/main/java/com/app/controller/admin/info/NewsController.java
  50. 80 0
      430-platform-backend-master/src/main/java/com/app/controller/admin/organ/OrganController.java
  51. 71 0
      430-platform-backend-master/src/main/java/com/app/controller/api/GuardianChildRequest.java
  52. 84 0
      430-platform-backend-master/src/main/java/com/app/controller/api/GuardianController.java
  53. 101 0
      430-platform-backend-master/src/main/java/com/app/controller/api/OpenCourseController.java
  54. 140 0
      430-platform-backend-master/src/main/java/com/app/controller/api/OpenCourseOrderController.java
  55. 42 0
      430-platform-backend-master/src/main/java/com/app/controller/api/OpenCourseRefundController.java
  56. 80 0
      430-platform-backend-master/src/main/java/com/app/controller/api/OpenCourseShoppingCarController.java
  57. 106 0
      430-platform-backend-master/src/main/java/com/app/controller/api/PayController.java
  58. 70 0
      430-platform-backend-master/src/main/java/com/app/controller/api/SchoolController.java
  59. 73 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/AccountController.java
  60. 45 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/AddressController.java
  61. 89 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/DeptController.java
  62. 116 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/DictController.java
  63. 54 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/GitCommitController.java
  64. 87 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/JobController.java
  65. 62 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/LogController.java
  66. 55 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/OnlineAccountController.java
  67. 90 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/ResourceController.java
  68. 95 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/RoleController.java
  69. 20 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/TenantController.java
  70. 85 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/auth/AuthenticationController.java
  71. 40 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/request/WebAdminAccountLoginDto.java
  72. 35 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/response/AccountInfoResponse.java
  73. 28 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/response/ImgCodeDto.java
  74. 27 0
      430-platform-backend-master/src/main/java/com/app/controller/platform/response/LoginResponse.java
  75. 26 0
      430-platform-backend-master/src/main/java/com/app/dto/CommonImgDto.java
  76. 29 0
      430-platform-backend-master/src/main/java/com/app/dto/FileDto.java
  77. 38 0
      430-platform-backend-master/src/main/java/com/app/dto/PageResult.java
  78. 70 0
      430-platform-backend-master/src/main/java/com/app/dto/Result.java
  79. 22 0
      430-platform-backend-master/src/main/java/com/app/dto/SearchDto.java
  80. 31 0
      430-platform-backend-master/src/main/java/com/app/dto/SearchPageDto.java
  81. 36 0
      430-platform-backend-master/src/main/java/com/app/dto/account/operation/WXMPLoginDto.java
  82. 27 0
      430-platform-backend-master/src/main/java/com/app/dto/account/operation/WebLoginDto.java
  83. 48 0
      430-platform-backend-master/src/main/java/com/app/dto/account/search/SearchAccountDto.java
  84. 29 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/GradeClassDto.java
  85. 43 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/ResponseCourseDto.java
  86. 50 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/ResponseSchoolDto.java
  87. 39 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/ResponseTeacherDto.java
  88. 43 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/SaveTeacherDto.java
  89. 29 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/SchoolYearSemesterDto.java
  90. 45 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/operation/CourseDto.java
  91. 36 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/operation/NewsDto.java
  92. 98 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/operation/OpenCourseDto.java
  93. 45 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/operation/ResponseCommentDto.java
  94. 47 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/operation/SchoolDto.java
  95. 23 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/operation/TimetablesDto.java
  96. 41 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/search/SaveTeacherTagDto.java
  97. 46 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/search/SearchCommentDto.java
  98. 29 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/search/SearchCourseDto.java
  99. 29 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/search/SearchNewsDto.java
  100. 44 0
      430-platform-backend-master/src/main/java/com/app/dto/basics/search/SearchOpenCourseDto.java

+ 37 - 0
430-platform-backend-master/.editorconfig

@@ -0,0 +1,37 @@
+# 告诉EditorConfig插件,这是根文件,不用继续往上查找
+root = true
+
+# 匹配全部文件
+[*]
+# 结尾换行符,可选"lf"、"cr"、"crlf"
+end_of_line = lf
+# 在文件结尾插入新行
+insert_final_newline = true
+# 删除一行中的前后空格
+trim_trailing_whitespace = true
+# 匹配js和py结尾的文件
+[*.{js,py}]
+# 设置字符集
+charset = utf-8
+
+# 匹配py结尾的文件
+[*.py]
+# 缩进风格,可选"space"、"tab"
+indent_style = space
+# 缩进的空格数
+indent_size = 4
+
+# 以下匹配,类同
+[Makefile]
+indent_style = tab
+# tab的宽度
+tab_width = 4
+
+# 以下匹配,类同
+[lib/**.js]
+indent_style = space
+indent_size = 2
+
+[{package.json,.travis.yml}]
+indent_style = space
+indent_size = 2

+ 61 - 0
430-platform-backend-master/.gitignore

@@ -0,0 +1,61 @@
+# Created by .ignore support plugin (hsz.mobi)
+### macOS template
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+### Java template
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+### Example user template template
+### Example user template
+
+# IntelliJ project files
+.idea
+target
+*.iml
+out
+gen

+ 231 - 0
430-platform-backend-master/Jenkinsfile

@@ -0,0 +1,231 @@
+@Library('jenkins-share-library@master')
+
+def qyWechatRobot = new org.devops.notification.QYWechatRobot()
+
+pipeline {
+//   agent any
+  agent {
+    node {
+      label 'master' // 指定运行节点的标签或者名称
+//       customWorkspace "${workspace}" // 指定运行工作目录
+    }
+  }
+//   tools { node '' }
+//   parameters {}
+  environment {
+    _fullDisplayName = "430平台-服务端"
+    _qyWechatRobotToken = "a47cb467-8e94-4877-b275-832cc1f0d9af"
+    _remote = "root@47.97.230.53"
+    _buildTime = new Date().format('yyyyMMddHHmmss') // 生成当前时间戳
+    _git_tag = sh(returnStdout: true, script: 'git describe --tags --always').trim()
+    _git_branch = sh(returnStdout: true, script: 'echo ${GIT_BRANCH#*/}').trim()
+    _git_commit_email = sh(returnStdout: true, script: 'git --no-pager show -s --format=\'%ae\'').trim()
+    _git_commit_message = sh (script: 'git log -1 --pretty=%B ${GIT_COMMIT}', returnStdout: true).trim()
+    _productFileName = "430-platform-backend_${_git_branch}_${_buildTime}"
+    _productPath = '/app/430-platform/backend' // 产物启动目录
+    _productBackupPath = '/app/backup/430-platform/backend' // 产物备份目录
+  }
+  triggers {
+//     cron('0 0 * * *') // cron计划任务定期执行构建
+//     pollSCM('H/1 * * * *') // pollSCM与cron定义类似,但由Jenkins定期检测源码变化
+//     upstream( // upstream接受逗号分割的工作字符串和阀值。当字符串中的任何作业以最小阀值结束时,流水线被重新触发。
+//       upstreamProjects: 'job1, job2',
+//       threshold: hudson.model.Result.SUCCESS
+//     )
+    gitlab(
+      triggerOnPush: true,
+      triggerOnMergeRequest: true,
+      triggerOnNoteRequest: true,
+      branchFilterType: 'All',
+      secretToken: 'asdfghjkl'
+    )
+  }
+  options {
+    timestamps() // 添加日志打印时间
+//    checkoutToSubdirectory('sub') // Jenkins默认拉取源码至工作空间的根目录中,此选项可以指定检出到工作空间的子目录中
+    disableConcurrentBuilds() // 同一个pipeline,Jenkins默认是可以同时执行多次的,此选项为了禁止pipeline同时执行
+//    skipDefaultCheckout() // 删除隐式checkuot scm语句
+    retry(1) // 当发生失败时进行重试(包括第1次失败)
+    buildDiscarder(
+      logRotator(
+        daysToKeepStr: '30', // 构建记录将保存的天数
+        numToKeepStr: '10', // 最多此数目的构建记录将被保存
+        artifactDaysToKeepStr: '30', // 比此早的发布包将被删除,但构建的日志、操作历史、报告等将被保留
+        artifactNumToKeepStr: '10' // 最多此数目的构建将保留他们的发布包
+      )
+    )
+    timeout( // 流水线超时设置
+      time: 15, // 整型
+      unit: 'MINUTES', // 时间单位,默认分钟。支持NANOSECONDS,MICROSECONDS,MILLISECONDS,SECONDS,MINUTES(默认),HOURS,DAYS
+      activity: true // 布尔类型,true时 只有当日志没活动才算真正的超时
+    )
+    gitLabConnection('gitlab') // 连接gitlab服务(需要在Jenkins中设置Jenkins -> Configure System)
+  }
+  post {
+    always { // 不论当前完成状态是什么,都执行
+//       pom.xml中增加plugin -> maven-pmd-plugin
+//       Jenkins PMD插件[PMD](https://plugins.jenkins.io/pmd)
+//       pmd(canRunOnFailed: true, pattern: '**/target/pmd.xml')
+      cleanWs() // 清理工作空间插件[Workspace Cleanup Plugin](https://plugins.jenkins.io/ws-cleanup)
+    }
+    success { // 成功后执行
+      updateGitlabCommitStatus name: 'build', state: 'success'
+      script {
+        qyWechatRobot.endBuild('构建成功😀', _qyWechatRobotToken)
+      }
+    }
+    failure { // 失败后执行
+      updateGitlabCommitStatus name: 'build', state: 'failed'
+      script {
+        qyWechatRobot.endBuild('构建失败🤬', _qyWechatRobotToken)
+      }
+    }
+    aborted { // 取消后执行
+      script {
+        qyWechatRobot.endBuild('构建取消🤯', _qyWechatRobotToken)
+      }
+    }
+  }
+  stages {
+    stage('Start Notification') {
+      steps {
+        script {
+          qyWechatRobot.startBuild(_qyWechatRobotToken)
+        }
+      }
+    }
+    stage('Env & Param') {
+      parallel {
+        stage('Env') {
+          steps {
+            sh 'printenv'
+            echo "系统当前用户    [${env.USER}]"
+            echo "JENKINS_URL   [${env.JENKINS_URL}]"
+            echo "WORKSPACE     [${env.WORKSPACE}]"
+          }
+        }
+        stage('Job') {
+          steps {
+            echo "-------------------- --------------------"
+            echo "JOB_NAME         [${env.JOB_NAME}]"
+            echo "BUILD_NUMBER     [${env.BUILD_NUMBER}]"
+            echo "BUILD_URL        [${env.BUILD_URL}]"
+            echo "BUILD_NUMBER     [${env.BUILD_NUMBER}]"
+
+            echo "-------------------- --------------------"
+            echo "BRANCH_NAME      [${env.BRANCH_NAME}]"
+            echo "GIT_BRANCH       [${env.GIT_BRANCH}]"
+            echo "GIT_COMMIT       [${env.GIT_COMMIT}]"
+            echo "GIT_COMMIT       [${env.commit}]"
+            echo "_git_tag         [${_git_tag}]"
+            echo "_git_branch      [${_git_branch}]"
+
+            echo "-------------------- --------------------"
+            echo "产物名称          [${_productFileName}]"
+            sh   "java -version"
+            sh   "mvn -v"
+          }
+        }
+      }
+    }
+    stage('clone code') {
+      steps {
+        timeout(time: 1, unit: 'MINUTES') {
+          script {
+            println('clone code')
+          }
+        }
+      }
+    }
+    stage('Build services') {
+      failFast true // 当其中一个进程失败时,强制所以当parallel阶段都被终止
+      parallel {
+        stage('service') {
+          steps {
+            sh 'mvn clean package -Dautoconfig.skip=true -Dmaven.test.skip=true'
+          }
+        }
+      }
+    }
+    stage('Static check') {
+      parallel {
+        stage('service') {
+          steps {
+            echo "service"
+//          sh 'mvn pmd:pmd'
+//          sh "./mvnw clean test jacoco:report"
+//             withSonarQubeEnv( installationName: 'sonar_server') {
+//               sh './mvnw sonar:sonar'
+//             }
+//             timeout(time: 1, unit: 'HOURS') {
+//               waitForQualityGate abortPipeline: true
+//             }
+          }
+        }
+      }
+    }
+    stage('Product') {
+      parallel {
+        stage('service') {
+          steps {
+            sh "cp -rv ${env.WORKSPACE}/target/*.jar ${env.WORKSPACE}/${_productFileName}.jar"
+            sh "cp -rv ${env.WORKSPACE}/target/lib ${env.WORKSPACE}/lib"
+          }
+        }
+      }
+    }
+    stage('archiveArtifacts') {
+      steps {
+        archiveArtifacts(
+          artifacts: '*.jar', // 字符串类型,需要归档的文件路径,使用的是Ant风格路径表达式。
+          // excludes: '', // 字符串类型,需要排除的文件路径,使用的也是Ant风格路径表达式。
+          caseSensitive: true, // 布尔类型,对路径大小写是否敏感。
+          fingerprint: true, // 布尔类型,是否对归档的文件进行签名。
+          onlyIfSuccessful: true // 布尔类型,只在构建成功时进行归档。
+        )
+      }
+    }
+    stage('Pre-Release') {
+      steps {
+        script {
+          if ("${_git_branch}" == 'master') {
+            echo "当前分支为:[${_git_branch}], 准备发布ing..."
+          } else {
+            error("当前分支为:[${_git_branch}], 终止当前发布操作...")
+          }
+        }
+      }
+    }
+    stage('Release') {
+      parallel {
+        stage('service') {
+          steps {
+            script {
+              echo "当前分支为:[${_git_branch}], 准备发布ing..."
+              sh """
+                ssh ${_remote} "
+                  source /etc/profile
+                  mkdir -pv ${_productBackupPath}
+                  mkdir -pv ${_productPath}
+
+                  rm -rf ${_productPath}/lib
+                "
+              """
+              sh "scp -rv ${env.WORKSPACE}/${_productFileName}.jar ${_remote}:${_productBackupPath}/"
+              sh "scp -rv ${env.WORKSPACE}/lib ${_remote}:${_productPath}/lib"
+              sh """
+                ssh ${_remote} "
+                  source /etc/profile
+                  rm -rf ${_productPath}/*.jar
+                  cp ${_productBackupPath}/${_productFileName}.jar ${_productPath}/${_productFileName}.jar
+                  cd ${_productPath}
+                  sudo bash ./bin/start.sh ${_productFileName}.jar
+                "
+              """
+            }
+          }
+        }
+      }
+    }
+  }
+}

+ 3 - 0
430-platform-backend-master/README.md

@@ -0,0 +1,3 @@
+# 430-backend
+
+430服务端

+ 0 - 0
430-platform-backend-master/_other/common-sql/常用SQL备份.sql


+ 298 - 0
430-platform-backend-master/_other/doc/微信支付-Java-SDK.md

@@ -0,0 +1,298 @@
+微信支付 Java SDK
+------
+
+对[微信支付开发者文档](https://pay.weixin.qq.com/wiki/doc/api/index.html)中给出的API进行了封装。
+
+com.github.wxpay.sdk.WXPay类下提供了对应的方法:
+
+|方法名 | 说明 |
+|--------|--------|
+|microPay| 刷卡支付 |
+|unifiedOrder | 统一下单|
+|orderQuery | 查询订单 |
+|reverse | 撤销订单 |
+|closeOrder|关闭订单|
+|refund|申请退款|
+|refundQuery|查询退款|
+|downloadBill|下载对账单|
+|report|交易保障|
+|shortUrl|转换短链接|
+|authCodeToOpenid|授权码查询openid|
+
+* 注意:
+* 证书文件不能放在web服务器虚拟目录,应放在有访问权限控制的目录中,防止被他人下载
+* 建议将证书文件名改为复杂且不容易猜测的文件名
+* 商户服务器要做好病毒和木马防护工作,不被非法侵入者窃取证书文件
+* 请妥善保管商户支付密钥、公众帐号SECRET,避免密钥泄露
+* 参数为`Map<String, String>`对象,返回类型也是`Map<String, String>`
+* 方法内部会将参数会转换成含有`appid`、`mch_id`、`nonce_str`、`sign\_type`和`sign`的XML
+* 可选HMAC-SHA256算法和MD5算法签名
+* 通过HTTPS请求得到返回数据后会对其做必要的处理(例如验证签名,签名错误则抛出异常)
+* 对于downloadBill,无论是否成功都返回Map,且都含有`return_code`和`return_msg`,若成功,其中`return_code`为`SUCCESS`,另外`data`对应对账单数据
+
+
+## 示例
+配置类MyConfig:
+```java
+import com.github.wxpay.sdk.WXPayConfig;
+import java.io.*;
+
+public class MyConfig implements WXPayConfig{
+
+    private byte[] certData;
+
+    public MyConfig() throws Exception {
+        String certPath = "/path/to/apiclient_cert.p12";
+        File file = new File(certPath);
+        InputStream certStream = new FileInputStream(file);
+        this.certData = new byte[(int) file.length()];
+        certStream.read(this.certData);
+        certStream.close();
+    }
+
+    public String getAppID() {
+        return "wx8888888888888888";
+    }
+
+    public String getMchID() {
+        return "12888888";
+    }
+
+    public String getKey() {
+        return "88888888888888888888888888888888";
+    }
+
+    public InputStream getCertStream() {
+        ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData);
+        return certBis;
+    }
+
+    public int getHttpConnectTimeoutMs() {
+        return 8000;
+    }
+
+    public int getHttpReadTimeoutMs() {
+        return 10000;
+    }
+}
+```
+
+统一下单:
+
+```java
+import com.github.wxpay.sdk.WXPay;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class WXPayExample {
+
+    public static void main(String[] args) throws Exception {
+
+        MyConfig config = new MyConfig();
+        WXPay wxpay = new WXPay(config);
+
+        Map<String, String> data = new HashMap<String, String>();
+        data.put("body", "腾讯充值中心-QQ会员充值");
+        data.put("out_trade_no", "2016090910595900000012");
+        data.put("device_info", "");
+        data.put("fee_type", "CNY");
+        data.put("total_fee", "1");
+        data.put("spbill_create_ip", "123.12.12.123");
+        data.put("notify_url", "http://www.example.com/wxpay/notify");
+        data.put("trade_type", "NATIVE");  // 此处指定为扫码支付
+        data.put("product_id", "12");
+
+        try {
+            Map<String, String> resp = wxpay.unifiedOrder(data);
+            System.out.println(resp);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}
+```
+
+订单查询:
+```java
+import com.github.wxpay.sdk.WXPay;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class WXPayExample {
+
+    public static void main(String[] args) throws Exception {
+
+        MyConfig config = new MyConfig();
+        WXPay wxpay = new WXPay(config);
+
+        Map<String, String> data = new HashMap<String, String>();
+        data.put("out_trade_no", "2016090910595900000012");
+
+        try {
+            Map<String, String> resp = wxpay.orderQuery(data);
+            System.out.println(resp);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}
+```
+
+退款查询:
+
+```java
+import com.github.wxpay.sdk.WXPay;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class WXPayExample {
+
+    public static void main(String[] args) throws Exception {
+
+        MyConfig config = new MyConfig();
+        WXPay wxpay = new WXPay(config);
+
+        Map<String, String> data = new HashMap<String, String>();
+        data.put("out_trade_no", "2016090910595900000012");
+
+        try {
+            Map<String, String> resp = wxpay.refundQuery(data);
+            System.out.println(resp);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}
+```
+
+下载对账单:
+
+```java
+import com.github.wxpay.sdk.WXPay;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class WXPayExample {
+
+    public static void main(String[] args) throws Exception {
+
+        MyConfig config = new MyConfig();
+        WXPay wxpay = new WXPay(config);
+
+        Map<String, String> data = new HashMap<String, String>();
+        data.put("bill_date", "20140603");
+        data.put("bill_type", "ALL");
+
+        try {
+            Map<String, String> resp = wxpay.downloadBill(data);
+            System.out.println(resp);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}
+```
+
+其他API的使用和上面类似。
+
+暂时不支持下载压缩格式的对账单,但可以使用该SDK生成请求用的XML数据:
+```java
+import com.github.wxpay.sdk.WXPay;
+import com.github.wxpay.sdk.WXPayUtil;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class WXPayExample {
+
+    public static void main(String[] args) throws Exception {
+
+        MyConfig config = new MyConfig();
+        WXPay wxpay = new WXPay(config);
+
+        Map<String, String> data = new HashMap<String, String>();
+        data.put("bill_date", "20140603");
+        data.put("bill_type", "ALL");
+        data.put("tar_type", "GZIP");
+
+        try {
+            data = wxpay.fillRequestData(data);
+            System.out.println(WXPayUtil.mapToXml(data));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
+}
+```
+
+收到支付结果通知时,需要验证签名,可以这样做:
+```java
+
+import com.github.wxpay.sdk.WXPay;
+import com.github.wxpay.sdk.WXPayUtil;
+
+import java.util.Map;
+
+public class WXPayExample {
+
+    public static void main(String[] args) throws Exception {
+
+        String notifyData = "...."; // 支付结果通知的xml格式数据
+
+        MyConfig config = new MyConfig();
+        WXPay wxpay = new WXPay(config);
+
+        Map<String, String> notifyMap = WXPayUtil.xmlToMap(notifyData);  // 转换成map
+
+        if (wxpay.isPayResultNotifySignatureValid(notifyMap)) {
+            // 签名正确
+            // 进行处理。
+            // 注意特殊情况:订单已经退款,但收到了支付结果成功的通知,不应把商户侧订单状态从退款改成支付成功
+        }
+        else {
+            // 签名错误,如果数据里没有sign字段,也认为是签名错误
+        }
+    }
+
+}
+```
+
+HTTPS请求可选HMAC-SHA256算法和MD5算法签名:
+```
+import com.github.wxpay.sdk.WXPay;
+import com.github.wxpay.sdk.WXPayConstants;
+
+public class WXPayExample {
+
+    public static void main(String[] args) throws Exception {
+        MyConfig config = new MyConfig();
+        WXPay wxpay = new WXPay(config, WXPayConstants.SignType.HMACSHA256);
+        // ......
+    }
+}
+```
+
+若需要使用sandbox环境:
+```
+import com.github.wxpay.sdk.WXPay;
+import com.github.wxpay.sdk.WXPayConstants;
+
+public class WXPayExample {
+
+    public static void main(String[] args) throws Exception {
+        MyConfig config = new MyConfig();
+        WXPay wxpay = new WXPay(config, WXPayConstants.SignType.MD5, true);
+        // ......
+    }
+
+}
+```

+ 9 - 0
430-platform-backend-master/_other/nginx/README.md

@@ -0,0 +1,9 @@
+# 安装目录
+`/etc/nginx`
+
+# 应用配置
+`/etc/nginx/sites-enabled`
+
+# 命令
+nginx -t
+nginx -s reload

+ 46 - 0
430-platform-backend-master/_other/upgrade-sql/430-platform.ndm2

@@ -0,0 +1,46 @@
+{
+  "paper": {
+    "name": "A4",
+    "leftMargin": 0.5,
+    "rightMargin": 0.5,
+    "topMargin": 0.5,
+    "bottomMargin": 0.5,
+    "isPortriat": true
+  },
+  "modelVersion": 2.01,
+  "defaultSchema": "Default",
+  "server": {
+    "objectType": "Server_MYSQL",
+    "name": "Default",
+    "serverVersion": 80099,
+    "edition": "Default",
+    "lowerCaseTableNames": 0,
+    "schemas": [
+      {
+        "objectType": "Schema_MYSQL",
+        "name": "Default",
+        "tables": [],
+        "views": []
+      }
+    ]
+  },
+  "diagrams": [
+    {
+      "name": "Diagram 1",
+      "paperWidth": 1,
+      "paperHeight": 1,
+      "tableFont": "Arial Unicode MS",
+      "tableFontSize": 14,
+      "isBalckWhite": false,
+      "showDBSchemaName": false,
+      "showViewRelations": true,
+      "notation": "default",
+      "showFieldComment": false,
+      "showTableComment": false,
+      "shapes": [],
+      "layers": [],
+      "relations": [],
+      "viewRelations": []
+    }
+  ]
+}

+ 52 - 0
430-platform-backend-master/bin/start.sh

@@ -0,0 +1,52 @@
+#!/bin/bash
+set -o nounset # 遇到没定义的变量报错后,终止继续执行脚本文件
+set -o errexit # 执行失败以后,终止继续执行脚本文件
+
+# 平滑关闭和启动 Spring Boot 应用
+# 给脚本增加执行权限
+# chmod +x start.sh
+
+# Jar包应用名称
+# ./bin/start.sh marketing-auth-server_test_20200514225829.jar
+# JAR_NAME=marketing-auth-server_test_20200514225829.jar
+# APPLICATION_NAME=marketing-auth-server
+JAR_NAME=$1
+APPLICATION_NAME=${JAR_NAME%%_*}
+
+# 应用启动环境
+SPRING_PROFILES_ACTIVE='dev'
+
+# 应用启动后日志输出目录
+LOG_PATH='./logs/log-info.log'
+
+JVM_OPTIONS='-Dloader.path=./lib'
+JAVA_OPTIONS=' --spring.profiles.active=dev --spring.config.location=file:./conf/ --logging.config=file:./conf/logback.xml'
+#JAVA_OPTS='-Xms128m -Xmx512m -XX:NewSize=128m -XX:MaxNewSize=512m -XX:MetaspaceSize=64m -XX:MaxMetaspaceSize=128m -XX:NewRatio=2 -XX:MaxTenuringThreshold=8 -XX:+DisableExplicitGC'
+
+# 应用端口
+# SERVER_PORT='8080'
+# echo nohup java -jar $JAVA_OPTIONS $JAR_NAME --server.port=$SERVER_PORT --spring.profiles.active=$SPRING_PROFILES_ACTIVE > /dev/null &
+# nohup java -jar $JAVA_OPTIONS $JAR_NAME --server.port=$SERVER_PORT --spring.profiles.active=$SPRING_PROFILES_ACTIVE > /dev/null &
+
+
+
+echo "---------- ---------- 停止应用 ---------- ----------"
+. ./bin/stop.sh ${APPLICATION_NAME}
+echo "---------- ---------- 停止应用 ---------- ----------"
+
+echo -e "\n\n\n"
+
+echo "---------- ---------- 启动应用 ---------- ----------"
+echo '【'$APPLICATION_NAME'】服务正在启动... ...'
+
+
+
+# 非挂起方式启动应用,并且跟踪启动日志文件
+nohup java $JVM_OPTIONS -jar $JAR_NAME $JAVA_OPTIONS > /dev/null 2>&1 &
+
+# 将jar包启动对应的pid写入文件中,为停止时提供pid
+echo $APPLICATION_NAME '启动后的pid:' $!
+echo $! > ${APPLICATION_NAME}.pid
+
+sleep 5s
+echo "---------- ---------- 启动应用 ---------- ----------"

+ 46 - 0
430-platform-backend-master/bin/stop.sh

@@ -0,0 +1,46 @@
+#!/bin/bash
+set -o nounset # 遇到没定义的变量报错后,终止继续执行脚本文件
+set -o errexit # 执行失败以后,终止继续执行脚本文件
+
+# Jar包应用名称
+STOP_APPLICATION_NAME=$1
+
+# 监听应用停止时间
+MAX_TIMEOUT=10
+
+oldPid=$(ps ax | grep $STOP_APPLICATION_NAME | grep java | head -1 | awk '{print $1}')
+if [ ${oldPid} ]; then
+    echo '开始停止【'$STOP_APPLICATION_NAME'】服务, pid【'$oldPid'】'
+    kill -15 $oldPid
+fi
+
+for((i=1;i<=$MAX_TIMEOUT;i++))
+do
+    # 等待1秒
+    sleep 1
+    oldPid=$(ps ax | grep $STOP_APPLICATION_NAME | grep java | head -1 | awk '{print $1}')
+    if [ ${oldPid} ]; then
+        echo '正在停止【'$STOP_APPLICATION_NAME'】服务, pid【'$oldPid'】... ... ('$i's)'
+    else
+        break
+    fi
+done
+
+if [ ${oldPid} ]; then
+    echo '尝试'$MAX_TIMEOUT'次优雅停止【'$STOP_APPLICATION_NAME'】服务, pid【'$oldPid'】失败,强制停止!!!'
+    kill -9 $oldPid
+else
+    echo '成功停止【'$STOP_APPLICATION_NAME'】服务, pid【'$oldPid'】'
+fi
+
+oldPid=$(ps ax | grep $STOP_APPLICATION_NAME | grep java | head -1 | awk '{print $1}')
+if [ ${oldPid} ]; then
+    echo 'App is running.'
+    sleep 2
+else
+    echo '【'$STOP_APPLICATION_NAME'】服务停止成功, pid【'$oldPid'】!'
+fi
+
+
+# 删除pid文件
+rm -f $STOP_APPLICATION_NAME.pid

+ 405 - 0
430-platform-backend-master/pom.xml

@@ -0,0 +1,405 @@
+<?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">
+    <modelVersion>4.0.0</modelVersion>
+
+    <name>430-platform</name>
+    <description>base project 4 spring-boot</description>
+
+    <groupId>com.app</groupId>
+    <artifactId>430-platform</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.1.5.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+
+    <properties>
+        <java-jwt.version>3.8.1</java-jwt.version>
+        <springfox-swagger.version>2.9.2</springfox-swagger.version>
+        <joda-time.version>2.10.3</joda-time.version>
+        <bcprov-jdk16.version>1.46</bcprov-jdk16.version>
+        <poi.version>4.1.0</poi.version>
+        <poi-ooxml.version>4.1.0</poi-ooxml.version>
+
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
+        <project.build.locales>zh_CN</project.build.locales>
+        <maven.compiler.source>1.8</maven.compiler.source>
+        <maven.compiler.target>1.8</maven.compiler.target>
+        <maven.compiler.encoding>UTF-8</maven.compiler.encoding>
+
+        <skipTests>true</skipTests> <!-- 项目打包的时候跳过单元测试 -->
+
+        <docker.image.prefix>/</docker.image.prefix>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+            <version>2.1.5.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger2</artifactId>
+            <version>${springfox-swagger.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.springfox</groupId>
+            <artifactId>springfox-swagger-ui</artifactId>
+            <version>${springfox-swagger.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.66</version>
+        </dependency>
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>${java-jwt.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.bouncycastle</groupId>
+            <artifactId>bcprov-jdk16</artifactId>
+            <version>${bcprov-jdk16.version}</version>
+        </dependency>
+
+        <!-- 微信支付SDK -->
+        <!-- SDK与DEMO下载-->
+        <!-- https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1 -->
+        <!-- 以下为最沙雕的引入方式。因为微信好像没有推送到公网Maven服务。就算有也拉不了... -->
+        <!-- [稍旧]https://mvnrepository.com/artifact/com.github.wxpay/wxpay-sdk/0.0.3 -->
+        <!-- [最新]https://mvnrepository.com/artifact/com.github.wxpay/WXPay-SDK-Java/0.0.4 -->
+        <!-- [最新]手动下载该jar包放在项目目录libs底下,也把plugin到includeSystemScope打开 -->
+        <dependency>
+            <groupId>com.github.wxpay</groupId>
+            <artifactId>WXPay-SDK-Java</artifactId>
+            <version>0.0.4</version>
+            <scope>system</scope>
+            <systemPath>${project.basedir}/libs/WXPay-SDK-Java-0.0.4.jar</systemPath>
+        </dependency>
+        <!-- 微信支付SDK -->
+
+
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.3.2</version>
+        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>com.baomidou</groupId>-->
+<!--            <artifactId>mybatis-plus-generator</artifactId>-->
+<!--            <version>3.3.2</version>-->
+<!--            <scope>provided</scope>&lt;!&ndash; 打包不需要该依赖,在Mybatis反向生成代码中使用到... &ndash;&gt;-->
+<!--        </dependency>-->
+        <!--    todo spring-cloud-starter-druid-monitor druid-admin    -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+            <version>1.2.4</version>
+        </dependency>
+
+
+
+        <!-- ==========  ========== 工具类依赖 ==========  ========== -->
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.4.4</version>
+        </dependency>
+
+        <dependency>
+            <groupId>joda-time</groupId>
+            <artifactId>joda-time</artifactId>
+            <version>${joda-time.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi</artifactId>
+            <version>${poi.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>${poi-ooxml.version}</version>
+        </dependency>
+
+        <!-- 分析客户端信息的工具类-->
+        <dependency>
+            <groupId>eu.bitwalker</groupId>
+            <artifactId>UserAgentUtils</artifactId>
+            <version>1.20</version>
+        </dependency>
+<!-- allow-bean-definition-overriding: true 不生效依赖-->
+<!--        <dependency>-->
+<!--            <groupId>org.springframework.cloud</groupId>-->
+<!--            <artifactId>spring-cloud-starter-bootstrap</artifactId>-->
+<!--            <version>3.1.3</version>-->
+<!--        </dependency>-->
+
+        <!--    https://gitee.com/lionsoul/ip2region/    -->
+        <dependency>
+            <groupId>org.lionsoul</groupId>
+            <artifactId>ip2region</artifactId>
+            <version>1.7.2</version>
+        </dependency>
+        <!-- ==========  ========== 工具类依赖 ==========  ========== -->
+    </dependencies>
+
+    <repositories>
+        <repository>
+            <id>spring-milestones</id>
+            <name>Spring Milestones</name>
+            <url>https://repo.spring.io/libs-milestone</url>
+            <releases>
+                <enabled>true</enabled>
+                <updatePolicy>daily</updatePolicy>
+            </releases>
+            <snapshots>
+                <enabled>false</enabled>
+                <checksumPolicy>warn</checksumPolicy>
+            </snapshots>
+            <layout>default</layout>
+        </repository>
+    </repositories>
+
+    <build>
+        <resources>
+            <resource>
+                <filtering>true</filtering>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <!-- 包含文件夹以及子文件夹下所有资源 -->
+                    <include>**/*.*</include>
+                </includes>
+                <excludes>
+                    <!-- 排除资源文件(注意会跟开发环境有关) -->
+                </excludes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <!-- 指定编译版本 -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+            <plugin>
+                <!-- maven打包时,跳过测试 -->
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <skip>true</skip>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <fork>true</fork> <!--热部署插件-->
+                    <includeSystemScope>true</includeSystemScope> <!-- 引入本地jar需要配置该变量使Maven也把本地jar进行打包 -->
+                    <mainClass>com.app.Application</mainClass>
+                    <layout>ZIP</layout>
+<!--                    <includes>-->
+<!--                        &lt;!&ndash; 或者 依赖jar不打进项目jar包中 &ndash;&gt;-->
+<!--                        <include>-->
+<!--                            <groupId>nothing</groupId>-->
+<!--                            <artifactId>nothing</artifactId>-->
+<!--                        </include>-->
+<!--                    </includes>-->
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>
+                                repackage
+                            </goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+<!--            <plugin>-->
+<!--                &lt;!&ndash; 拷贝依赖 copy-dependencies &ndash;&gt;-->
+<!--                <groupId>org.apache.maven.plugins</groupId>-->
+<!--                <artifactId>maven-dependency-plugin</artifactId>-->
+<!--                <executions>-->
+<!--                    <execution>-->
+<!--                        <id>copy-dependencies</id>-->
+<!--                        <phase>package</phase>-->
+<!--                        <goals>-->
+<!--                            <goal>copy-dependencies</goal>-->
+<!--                        </goals>-->
+<!--                        <configuration>-->
+<!--                            <outputDirectory>${project.build.directory}/lib</outputDirectory>-->
+<!--                        </configuration>-->
+<!--                    </execution>-->
+<!--                </executions>-->
+<!--            </plugin>-->
+<!--            <plugin>-->
+<!--                &lt;!&ndash; 拷贝资源文件 copy-resources &ndash;&gt;-->
+<!--                <groupId>org.apache.maven.plugins</groupId>-->
+<!--                <artifactId>maven-resources-plugin</artifactId>-->
+<!--                <executions>-->
+<!--                    <execution>-->
+<!--                        <id>copy-resources</id>-->
+<!--                        <phase>package</phase>-->
+<!--                        <goals>-->
+<!--                            <goal>copy-resources</goal>-->
+<!--                        </goals>-->
+<!--                        <configuration>-->
+<!--                            <resources>-->
+<!--                                <resource>-->
+<!--                                    <directory>src/main/resources</directory>-->
+<!--                                </resource>-->
+<!--                            </resources>-->
+<!--                            <outputDirectory>${project.build.directory}/conf</outputDirectory>-->
+<!--                        </configuration>-->
+<!--                    </execution>-->
+<!--                    &lt;!&ndash;copy 脚本,把bin目录下的文件复制到,打包目录下&ndash;&gt;-->
+<!--                    <execution>-->
+<!--                        <id>copy-bin</id>-->
+<!--                        <phase>package</phase>-->
+<!--                        <goals>-->
+<!--                            <goal>copy-resources</goal>-->
+<!--                        </goals>-->
+<!--                        <configuration>-->
+<!--                            <resources>-->
+<!--                                <resource>-->
+<!--                                    <directory>bin/</directory>-->
+<!--                                </resource>-->
+<!--                            </resources>-->
+<!--                            <outputDirectory>${project.build.directory}/bin</outputDirectory>-->
+<!--                        </configuration>-->
+<!--                    </execution>-->
+<!--                </executions>-->
+<!--                <configuration>-->
+<!--                    <encoding>UTF-8</encoding>-->
+<!--                    <useDefaultDelimiters>false</useDefaultDelimiters>-->
+<!--                    <delimiters>-->
+<!--                        <delimiter>$[*]</delimiter>-->
+<!--                    </delimiters>-->
+
+<!--                    &lt;!&ndash; 过滤后缀不需要转码的文件后缀名.crt/.p8 &ndash;&gt;-->
+<!--                    <nonFilteredFileExtensions>-->
+<!--                        <nonFilteredFileExtension>crt</nonFilteredFileExtension>-->
+<!--                        <nonFilteredFileExtension>p8</nonFilteredFileExtension>-->
+<!--                        <nonFilteredFileExtension>xls</nonFilteredFileExtension>-->
+<!--                        <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>-->
+<!--                        <nonFilteredFileExtension>doc</nonFilteredFileExtension>-->
+<!--                        <nonFilteredFileExtension>docx</nonFilteredFileExtension>-->
+<!--                        <nonFilteredFileExtension>zip</nonFilteredFileExtension>-->
+<!--                        <nonFilteredFileExtension>py</nonFilteredFileExtension>-->
+<!--                        <nonFilteredFileExtension>db</nonFilteredFileExtension>-->
+<!--                    </nonFilteredFileExtensions>-->
+<!--                </configuration>-->
+<!--            </plugin>-->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifestEntries>
+                            <SCM-Revision>${scmRevision}</SCM-Revision>
+                            <Built-Time>${buildTime}</Built-Time>
+                        </manifestEntries>
+                    </archive>
+                    <excludes>
+                        <exclude>*.conf</exclude>
+                        <exclude>*.yml</exclude>
+                        <exclude>*.xml</exclude>
+                        <exclude>*.properties</exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+
+<!--            <plugin>-->
+<!--                <groupId>pl.project13.maven</groupId>-->
+<!--                <artifactId>git-commit-id-plugin</artifactId>-->
+<!--                <version>2.1.15</version>-->
+<!--                <executions>-->
+<!--                    <execution>-->
+<!--                        <goals>-->
+<!--                            <goal>revision</goal>-->
+<!--                        </goals>-->
+<!--                    </execution>-->
+<!--                </executions>-->
+<!--                <configuration>-->
+<!--                    <dateFormat>yyyy.MM.dd HH:mm:ss</dateFormat>-->
+<!--                    &lt;!&ndash; 是否生 git.properties 属性文件 &ndash;&gt;-->
+<!--                    <generateGitPropertiesFile>true</generateGitPropertiesFile>-->
+<!--                    <dotGitDirectory>${project.basedir}/.git</dotGitDirectory>-->
+<!--                </configuration>-->
+<!--            </plugin>-->
+
+            <!-- Docker maven plugin -->
+            <plugin>
+                <groupId>com.spotify</groupId>
+                <artifactId>docker-maven-plugin</artifactId>
+                <version>1.0.0</version>
+                <configuration>
+                    <imageName>${docker.image.prefix}/${project.artifactId}</imageName>
+                    <dockerDirectory>src/main/docker</dockerDirectory>
+                    <resources>
+                        <resource>
+                            <targetPath>/</targetPath>
+                            <directory>${project.build.directory}</directory>
+                            <include>${project.build.finalName}.jar</include>
+                        </resource>
+                    </resources>
+                </configuration>
+            </plugin>
+            <!-- Docker maven plugin -->
+        </plugins>
+    </build>
+
+</project>

+ 38 - 0
430-platform-backend-master/src/main/java/com/app/Application.java

@@ -0,0 +1,38 @@
+package com.app;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.http.ResponseEntity;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@EnableFeignClients
+@EnableScheduling
+@EnableCaching
+@RestController
+@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
+public class Application {
+
+    public static void main(String[] args) {
+        //allow-bean-definition-overriding: true
+        SpringApplication springApplication = new SpringApplication(Application.class);
+        springApplication.setAllowBeanDefinitionOverriding(true);
+        springApplication.run(args);
+        //SpringApplication.run(Application.class, args);
+    }
+
+    @GetMapping("/")
+    public ResponseEntity index() {
+        return ResponseEntity.ok(null);
+    }
+
+    @GetMapping("/csrf")
+    public ResponseEntity csrf() {
+        return ResponseEntity.ok(null);
+    }
+
+}

+ 19 - 0
430-platform-backend-master/src/main/java/com/app/annotation/platform/OperationLog.java

@@ -0,0 +1,19 @@
+package com.app.annotation.platform;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * 功能描述:
+ *
+ * @Author 梁展鹏
+ */
+@Target(ElementType.METHOD)
+@Retention(RetentionPolicy.RUNTIME)
+public @interface OperationLog {
+
+    String value() default "";
+
+}

+ 192 - 0
430-platform-backend-master/src/main/java/com/app/aspect/platform/ControllerAspect.java

@@ -0,0 +1,192 @@
+package com.app.aspect.platform;
+
+import com.app.util.HttpUtil;
+import com.app.util.JacksonUtil;
+import com.app.util.UserAgentUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.*;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.bouncycastle.asn1.ocsp.ResponseData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.time.LocalDateTime;
+import java.util.Arrays;
+import java.util.Enumeration;
+
+/**
+ * 功能描述:
+ * todo https://juejin.im/post/5d2001bb6fb9a07edf276593
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Slf4j
+@Aspect
+@Component
+public class ControllerAspect {
+
+    @Autowired
+    private HttpUtil httpUtil;
+
+    /* 保证每个线程都有一个单独的实例 */
+    private ThreadLocal<Long> threadLocal = new ThreadLocal();
+
+    /**
+     * 功能描述:切点定义
+     * 切面 controller 对所有的方法起作用
+     */
+    @Pointcut("execution(* com.app.controller..*(..))")
+    public void executeController() {}
+
+    /**
+     * 功能描述:方法执行前调用
+     *
+     * @param joinPoint
+     */
+    @Before("executeController()")
+    public void before(JoinPoint joinPoint) {
+        /* 设置当前的时间 */
+        threadLocal.set(System.currentTimeMillis());
+        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        HttpServletRequest request = attributes.getRequest();
+
+        /* 记录请求的内容 */
+        log.info("请求开始时间:{}", LocalDateTime.now());
+        log.info("请求URL:【{}】 {}", request.getMethod(), request.getRequestURL().toString());
+        log.info("请求方法:{}.{}", joinPoint.getSignature().getDeclaringTypeName(), joinPoint.getSignature().getName());
+        log.info("请求ip:{}", request.getRemoteAddr());
+        log.info("请求参数:{}", Arrays.toString(joinPoint.getArgs()));
+        log.info("Cookies:{}", request.getCookies());
+
+        /* 系统信息 */
+        log.info("操作系统:{}, 浏览器:{}, 浏览器版本:{}", UserAgentUtil.getOperatingSystem(request), UserAgentUtil.getBrowserName(request), UserAgentUtil.getBrowserVersion(request));
+
+        /* 所有的请求的入参 */
+        Enumeration<String> enums = request.getParameterNames();
+        while (enums.hasMoreElements()) {
+            String paraName = enums.nextElement();
+            log.info(paraName + ":" + request.getParameter(paraName));
+        }
+
+        /* 记录操作日志 */
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        String className = joinPoint.getTarget().getClass().getName();
+        String methodName = signature.getName();
+    }
+
+    /**
+     * 功能描述:执行后调用
+     *
+     * @param joinPoint
+     */
+    @After("executeController()")
+    public void after(JoinPoint joinPoint) {
+        log.info("doAfter(): [{}]", joinPoint.toString());
+    }
+
+    /**
+     * 功能描述:执行返回值调用
+     *
+     * @param joinPoint
+     */
+    @AfterReturning(pointcut = "executeController()")
+    public void afterReturning(JoinPoint joinPoint) {
+        log.info("耗时: [{}]'ms", ((System.currentTimeMillis() - threadLocal.get())));
+    }
+
+    /**
+     * 异常通知:
+     * 1. 在目标方法非正常结束,发生异常或者抛出异常时执行
+     * 1. 在异常通知中设置异常信息,并将其保存
+     *
+     * @param throwable
+     */
+    @AfterThrowing(value = "executeController()", throwing = "throwable")
+    public void doAfterThrowing(Throwable throwable) {
+        log.error("发生异常时间:[{}]", LocalDateTime.now());
+        log.error("抛出异常:[{}]",throwable.getMessage());
+    }
+
+    @Around("@annotation(org.springframework.web.bind.annotation.RestController)")
+    public Object restController(ProceedingJoinPoint point) throws Throwable {
+        //记录请求开始执行时间:
+        long beginTime = System.currentTimeMillis();
+        //获取请求信息
+        ServletRequestAttributes sra = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
+        HttpServletRequest request = sra.getRequest();
+
+        //获取代理地址、请求地址、请求类名、方法名
+        String remoteAddress = httpUtil.getIpAddr(request);
+        String requestURI = request.getRequestURI();
+        String methodName = point.getSignature().getName();
+        String clazzName = point.getTarget().getClass().getSimpleName();
+
+        //获取请求参数:
+        MethodSignature ms = (MethodSignature) point.getSignature();
+        //获取请求参数类型
+        String[] parameterNames = ms.getParameterNames();
+        //获取请求参数值
+        Object[] parameterValues = point.getArgs();
+        StringBuilder sb = new StringBuilder();
+        //组合请求参数,进行日志打印
+        if (parameterNames != null && parameterNames.length > 0) {
+            for (int i = 0; i < parameterNames.length; i++) {
+                if (parameterNames[i].equals("bindingResult")) {
+                    break;
+                }
+                if ((parameterValues[i] instanceof HttpServletRequest) || (parameterValues[i] instanceof HttpServletResponse)) {
+                    sb.append("[")
+                            .append(parameterNames[i])
+                            .append("=")
+                            .append(parameterValues[i])
+                            .append("]");
+                } else {
+                    sb.append("[")
+                            .append(parameterNames[i]).append("=")
+                            .append(JacksonUtil.toJSON(parameterValues[i]))
+                            .append("]");
+                }
+            }
+        }
+
+        Object result = null;
+        try {
+            result = point.proceed();
+        } catch (Throwable throwable) {
+            //请求操纵失败
+            //记录错误日志
+            log.error("(ง•̀_•́)ง (っ•̀ω•́)っ          切面处理请求错误! IP信息(ง•̀_•́)ง->: 【{}}】 " +
+                            "URI信息(ง•̀_•́)ง->:【{}】 请求映射控制类(ง•̀_•́)ง->:【{}】 " +
+                            "请求方法(ง•̀_•́)ง->:【{}】 请求参数列表(ง•̀_•́)ง->:【{}】", remoteAddress, requestURI, clazzName, methodName,
+                    sb.toString());
+            throw throwable;
+        }
+        //请求操作成功
+        String resultJosnString = "";
+        if (result != null) {
+            if (result instanceof ResponseData) {
+                resultJosnString = JacksonUtil.toJSON(result);
+            } else {
+                resultJosnString = String.valueOf(result);
+            }
+        }
+        //记录请求完成执行时间:
+        long endTime = System.currentTimeMillis();
+        long usedTime = endTime - beginTime;
+        //记录日志
+        log.info("请求操作成功! 请求耗时:【{}】 " +
+                        "IP信息(◍'౪`◍)ノ゙->: 【{}}】  URI信息(◍'౪`◍)ノ゙->:【{}】 " +
+                        "请求映射控制类(◍'౪`◍)ノ゙->:【{}】 请求方法(◍'౪`◍)ノ゙->:【{}】 " +
+                        "请求参数列表(◍'౪`◍)ノ゙->:【{}】 返回值(◍'౪`◍)ノ゙->:【{}】", usedTime, remoteAddress, requestURI, clazzName,
+                methodName, sb.toString(), resultJosnString);
+
+        return result;
+    }
+
+}

+ 69 - 0
430-platform-backend-master/src/main/java/com/app/aspect/platform/HttpLoggerInterceptor.java

@@ -0,0 +1,69 @@
+package com.app.aspect.platform;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpRequest;
+import org.springframework.http.client.ClientHttpRequestExecution;
+import org.springframework.http.client.ClientHttpRequestInterceptor;
+import org.springframework.http.client.ClientHttpResponse;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+@Slf4j
+public class HttpLoggerInterceptor implements ClientHttpRequestInterceptor {
+
+    @Override
+    public ClientHttpResponse intercept(HttpRequest httpRequest, byte[] bytes, ClientHttpRequestExecution clientHttpRequestExecution) throws IOException {
+        traceRequest(httpRequest, bytes);
+        ClientHttpResponse response = clientHttpRequestExecution.execute(httpRequest, bytes);
+        traceResponse(response);
+        return response;
+    }
+
+    /**
+     * 功能描述:
+     *
+     * @param request
+     * @param body
+     * @throws IOException
+     */
+    private void traceRequest(HttpRequest request, byte[] body) throws IOException {
+        if (log.isDebugEnabled()) {
+            log.debug("===========================request begin================================================");
+            log.debug("URI         : [{}]", request.getURI());
+            log.debug("Method      : [{}]", request.getMethod());
+            log.debug("Headers     : [{}]", request.getHeaders());
+            log.debug("Request body: [{}]", new String(body, "UTF-8"));
+            log.debug("==========================request end================================================");
+        }
+    }
+
+    /**
+     * 功能描述:
+     *
+     * @param response
+     * @throws IOException
+     */
+    private void traceResponse(ClientHttpResponse response) throws IOException {
+        StringBuilder inputStringBuilder = new StringBuilder();
+        try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(response.getBody(), "UTF-8"))) {
+            String line = bufferedReader.readLine();
+            while (line != null) {
+                inputStringBuilder.append(line);
+                inputStringBuilder.append('\n');
+                line = bufferedReader.readLine();
+            }
+        }
+
+        if (log.isDebugEnabled()) {
+            log.debug("============================response begin==========================================");
+            log.debug("Status code  : [{}]", response.getStatusCode());
+            log.debug("Status text  : [{}]", response.getStatusText());
+            log.debug("Headers      : [{}]", response.getHeaders());
+            log.debug("Response body: [{}]", inputStringBuilder.toString());
+            log.debug("=======================response end=================================================");
+        }
+    }
+
+}

+ 141 - 0
430-platform-backend-master/src/main/java/com/app/aspect/platform/OperationLogAspect.java

@@ -0,0 +1,141 @@
+package com.app.aspect.platform;
+
+import cn.hutool.json.JSONUtil;
+import com.app.mapper.platform.OperationLogMapper;
+import com.app.service.platform.auth.AccountService;
+import com.app.service.platform.monitor.OperationLogService;
+import lombok.extern.slf4j.Slf4j;
+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.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.lang.reflect.Method;
+import java.lang.reflect.Parameter;
+import java.nio.charset.StandardCharsets;
+import java.util.*;
+
+/**
+ * 功能描述:
+ *
+ * @Author 梁展鹏
+ */
+@Slf4j
+@Aspect
+@Component
+public class OperationLogAspect {
+
+    @Autowired
+    private AccountService accountService;
+
+    @Autowired
+    private OperationLogService operationLogService;
+
+    @Autowired
+    private OperationLogMapper mapper;
+
+    private ThreadLocal<Long> currentTime = new ThreadLocal();
+
+    /**
+     * 功能描述:配置切入点
+     * 该方法无方法体,主要为了让同类中其他方法使用此切入点
+     */
+    @Pointcut("@annotation(com.app.annotation.platform.OperationLog)")
+    public void logPointcut() {}
+
+    /**
+     * 功能描述:配置环绕通知,使用在方法logPointcut()上注册的切入点
+     *
+     * @param joinPoint join point for advice
+     */
+    @Around("logPointcut()")
+    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Method method = signature.getMethod();
+        com.app.annotation.platform.OperationLog aopOperationLog = method.getAnnotation(com.app.annotation.platform.OperationLog.class);
+
+        currentTime.set(System.currentTimeMillis());
+        Object result = joinPoint.proceed();
+        Long time = System.currentTimeMillis() - currentTime.get();
+        currentTime.remove();
+
+        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
+        operationLogService.insertInfoLog(request, joinPoint.getTarget().getClass().getName(), signature.getName(), getParameter(method, joinPoint.getArgs()), time, aopOperationLog.value());
+
+        return result;
+    }
+
+    /**
+     * 功能描述:配置异常通知
+     *
+     * @param joinPoint join point for advice
+     * @param e         exception
+     */
+    @AfterThrowing(pointcut = "logPointcut()", throwing = "e")
+    public void logAfterThrowing(JoinPoint joinPoint, Throwable e) {
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Method method = signature.getMethod();
+        com.app.annotation.platform.OperationLog aopOperationLog = method.getAnnotation(com.app.annotation.platform.OperationLog.class);
+
+        Long time = System.currentTimeMillis() - currentTime.get();
+        currentTime.remove();
+
+        HttpServletRequest request = ((ServletRequestAttributes) Objects.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
+        operationLogService.insertErrorLog(request, joinPoint.getTarget().getClass().getName(), signature.getName(), getParameter(method, joinPoint.getArgs()), time, getStackTrace(e).getBytes(StandardCharsets.UTF_8), aopOperationLog.value());
+    }
+
+    private String getStackTrace(Throwable e) {
+        StringWriter sw = new StringWriter();
+        try (PrintWriter pw = new PrintWriter(sw)) {
+            e.printStackTrace(pw);
+            return sw.toString();
+        }
+    }
+
+    /**
+     * 根据方法和传入的参数获取请求参数
+     */
+    private String getParameter(Method method, Object[] args) {
+        List<Object> argList = new ArrayList<>();
+        Parameter[] parameters = method.getParameters();
+        for (int i = 0; i < parameters.length; i++) {
+            //将RequestBody注解修饰的参数作为请求参数
+            RequestBody requestBody = parameters[i].getAnnotation(RequestBody.class);
+            if (requestBody != null) {
+                argList.add(args[i]);
+            }
+
+            //将RequestParam注解修饰的参数作为请求参数
+            RequestParam requestParam = parameters[i].getAnnotation(RequestParam.class);
+            if (requestParam != null) {
+                Map<String, Object> map = new HashMap<>();
+                String key = parameters[i].getName();
+                if (!StringUtils.isEmpty(requestParam.value())) {
+                    key = requestParam.value();
+                }
+                map.put(key, args[i]);
+                argList.add(map);
+            }
+        }
+
+        if (argList.size() == 0) {
+            return "";
+        }
+
+        return argList.size() == 1 ? JSONUtil.toJsonStr(argList.get(0)) : JSONUtil.toJsonStr(argList);
+    }
+
+}

+ 60 - 0
430-platform-backend-master/src/main/java/com/app/config/AsyncPoolConfig.java

@@ -0,0 +1,60 @@
+package com.app.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * 功能描述:异步线程池调用
+ *
+ * 1. 异步使用
+ * @Async("asyncThreadPoolTaskExecutor")
+ * public void xxx() {
+ * }
+ *
+ * 2. 异步回调
+ * @Async("asyncThreadPoolTaskExecutor")
+ * public Future<String> asyncMethod2() {
+ *     sleep();
+ *     logger.info("异步方法内部线程名:" + Thread.currentThread().getName());
+ *     return new AsyncResult<>("hello async");
+ * }
+ *
+ * Future<String> stringFuture = testService.asyncMethod2();
+ * logger.info("异步方法返回值:" + stringFuture.get());
+ *
+ * 通过返回结果我们可以看出Future的get方法为阻塞方法,只有当异步方法返回内容了,程序才会继续往下执行。
+ * get还有一个get(long timeout, TimeUnit unit)重载方法,我们可以通过这个重载方法设置超时时间,
+ * 即异步方法在设定时间内没有返回值的话,直接抛出java.util.concurrent.TimeoutException异常。
+ * 比如设置超时时间为60秒:
+ * String result = stringFuture.get(60, TimeUnit.SECONDS);
+ */
+@Configuration
+public class AsyncPoolConfig {
+
+    @Bean
+    public ThreadPoolTaskExecutor asyncThreadPoolTaskExecutor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        executor.setCorePoolSize(20); // 线程池核心线程的数量,默认值为1(这就是默认情况下的异步线程池配置使得线程不能被重用的原因)。
+        executor.setMaxPoolSize(200); // 线程池维护的线程的最大数量,只有当核心线程都被用完并且缓冲队列满后,才会开始申超过请核心线程数的线程,默认值为Integer.MAX_VALUE。
+        executor.setQueueCapacity(25); // 缓冲队列。
+        executor.setKeepAliveSeconds(2 * 60); // 超出核心线程数外的线程在空闲时候的最大存活时间,默认为60秒。
+        executor.setThreadNamePrefix("async-thread"); // 线程名前缀。
+        executor.setWaitForTasksToCompleteOnShutdown(true); // 是否等待所有线程执行完毕才关闭线程池,默认值为false。
+        executor.setAwaitTerminationSeconds(60); // waitForTasksToCompleteOnShutdown的等待的时长,默认值为0,即不等待。
+
+        /**
+         * 1.  `callerRunsPolicy`:用于被拒绝任务的处理程序,它直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务。
+         * 2.  `abortPolicy`:直接抛出`java.util.concurrent.RejectedExecutionException`异常。
+         * 3.  `discardOldestPolicy`:当线程池中的数量等于最大线程数时、抛弃线程池中最后一个要执行的任务,并执行新传入的任务。
+         * 4.  `discardPolicy`:当线程池中的数量等于最大线程数时,不做任何动作。
+         */
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 当没有线程可以被使用时的处理策略(拒绝任务),默认策略为abortPolicy
+        executor.initialize();
+
+        return executor;
+    }
+
+}

+ 42 - 0
430-platform-backend-master/src/main/java/com/app/config/CorcConfig.java

@@ -0,0 +1,42 @@
+package com.app.config;
+
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.Ordered;
+import org.springframework.http.HttpHeaders;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+/**
+ * 功能描述:
+ * todo ??? 结合Security之后,还需要在SecurityConfig中设置`and().cors().and().csrf().disable()`
+ * @Author 梁展鹏
+ */
+@Configuration
+public class CorcConfig {
+
+    private CorsConfiguration buildConfig() {
+        CorsConfiguration config = new CorsConfiguration();
+        config.addAllowedOrigin("*"); // 设置允许跨域请求的域名
+        config.addAllowedHeader("*"); //允许任何请求头
+        config.addAllowedMethod("*"); //允许任何方法(post、get等)
+        config.setAllowCredentials(Boolean.TRUE); // 是否允许证书,不再默认开启
+        config.addExposedHeader(HttpHeaders.SET_COOKIE);
+        config.addExposedHeader(HttpHeaders.AUTHORIZATION); // 如果不设置这个属性前端无法通过response header获取到Authorization也就是token
+        config.setMaxAge(60 * 60L); //maxAge(3600)表明在3600秒内,不需要再发送预检验请求,可以缓存该结果
+        return config;
+    }
+
+    @Bean
+    public FilterRegistrationBean corsFilter() {
+        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+        source.registerCorsConfiguration("/**", buildConfig());
+
+        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
+        bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
+        return bean;
+    }
+
+}

+ 23 - 0
430-platform-backend-master/src/main/java/com/app/config/FeignConfig.java

@@ -0,0 +1,23 @@
+package com.app.config;
+
+import feign.Logger;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * 功能描述:
+ * logging:
+ *   level:
+ *     com.app.feign.WeChatWorkFeign: DEBUG
+ *
+ * @Author 梁展鹏
+ */
+@Configuration
+public class FeignConfig {
+
+    @Bean
+    Logger.Level feignLoggerLevel() {
+        return Logger.Level.FULL;
+    }
+
+}

+ 30 - 0
430-platform-backend-master/src/main/java/com/app/config/RestTemplateConfig.java

@@ -0,0 +1,30 @@
+package com.app.config;
+
+import org.springframework.boot.SpringBootConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.http.client.ClientHttpRequestFactory;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.charset.StandardCharsets;
+
+@SpringBootConfiguration
+public class RestTemplateConfig {
+
+    @Bean
+    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
+        RestTemplate restTemplate = new RestTemplate(factory);
+        restTemplate.getMessageConverters().add(new StringHttpMessageConverter(StandardCharsets.UTF_8));
+        return restTemplate;
+    }
+
+    @Bean
+    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
+        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
+        factory.setConnectTimeout(15 * 1000); // 连接超时时间
+        factory.setReadTimeout(10 * 1000); // 读取超时时间
+        return factory;
+    }
+
+}

+ 36 - 0
430-platform-backend-master/src/main/java/com/app/config/ScheduleConfiguration.java

@@ -0,0 +1,36 @@
+package com.app.config;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.SchedulingConfigurer;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.scheduling.config.ScheduledTaskRegistrar;
+
+/**
+ * 功能描述:
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/8/2 10:21
+ */
+@Slf4j
+@Configuration
+public class ScheduleConfiguration implements SchedulingConfigurer {
+
+    @Override
+    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
+        taskRegistrar.setTaskScheduler(threadPoolTaskScheduler());
+    }
+
+    @Bean
+    public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
+        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
+        taskScheduler.setPoolSize(5);
+        taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
+        taskScheduler.setThreadNamePrefix("schedule");
+        taskScheduler.setRemoveOnCancelPolicy(true);
+        taskScheduler.setErrorHandler(t -> log.error("Error occurs", t));
+        return taskScheduler;
+    }
+
+}

+ 24 - 0
430-platform-backend-master/src/main/java/com/app/config/WXMPConfig.java

@@ -0,0 +1,24 @@
+package com.app.config;
+
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * 功能描述:
+ * todo 配置文件增加加密
+ *
+ * @Auther: 梁展鹏 fsliangzp@163.com
+ * @Date: 2018/8/16 15:56
+ */
+@Data
+@Component
+public class WXMPConfig {
+
+    @Value("${wx.mp.app-id}")
+    private String appId;
+
+    @Value("${wx.mp.app-secret}")
+    private String appSecret;
+
+}

+ 123 - 0
430-platform-backend-master/src/main/java/com/app/config/WXMPPayConfig.java

@@ -0,0 +1,123 @@
+package com.app.config;
+
+import com.github.wxpay.sdk.WXPayConfig;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+import java.io.InputStream;
+
+@Slf4j
+@Data
+@Component
+public class WXMPPayConfig implements WXPayConfig {
+
+    /**
+     * 公众账号ID
+     */
+    @Value("${wx.pay.app-id}")
+    private String appID;
+
+    /**
+     * 商户号
+     */
+    @Value("${wx.pay.mch-id}")
+    private String mchID;
+
+    /**
+     * API 密钥
+     * 微信支付 - 商户平台
+     * https://pay.weixin.qq.com/index.php/core/cert/api_cert
+     * <p>
+     * 管理账号登录 -> 账户中心 -> API安全 -> API密钥
+     */
+    @Value("${wx.pay.key}")
+    private String key;
+
+    /**
+     * API证书绝对路径
+     * 不涉及高级接口不需要配置 API安全证书
+     */
+    @Value("${wx.pay.cert-path}")
+    private String certPath;
+
+    /**
+     * 签名方式
+     */
+    @Value("${wx.pay.sign-type}")
+    private String signType;
+
+    /**
+     * 交易类型
+     */
+    @Value("${wx.pay.trade-type}")
+    private String tradeType;
+
+    /**
+     * 退款异步通知地址
+     */
+    @Value("${wx.pay.notify-url}")
+    private String notifyUrl;
+
+    /**
+     * 是否使用沙箱模式
+     */
+    @Value("${wx.pay.use-sandbox}")
+    private Boolean useSandbox;
+
+    /**
+     * API 沙箱环境密钥
+     */
+    @Value("${wx.pay.sandbox-key}")
+    private String sandboxKey;
+
+    /**
+     * API 沙箱环境获取密钥URL
+     */
+    private String sandboxKeyUrl = "https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey";
+
+    /**
+     * HTTP(S) 连接超时时间,单位毫秒
+     */
+    private int httpConnectTimeoutMs = 120 * 1000;
+
+    /**
+     * HTTP(S) 读数据超时时间,单位毫秒
+     */
+    private int httpReadTimeoutMs = 120 * 1000;
+
+    @Override
+    public String getAppID() {
+        return this.appID;
+    }
+
+    @Override
+    public String getMchID() {
+        return this.mchID;
+    }
+
+    @Override
+    public String getKey() {
+        if (this.useSandbox) {
+            return this.sandboxKey;
+        }
+        return this.key;
+    }
+
+    @Override
+    public InputStream getCertStream() {
+        return Thread.currentThread().getContextClassLoader().getResourceAsStream("apiclient_cert.p12");
+    }
+
+    @Override
+    public int getHttpConnectTimeoutMs() {
+        return this.httpConnectTimeoutMs;
+    }
+
+    @Override
+    public int getHttpReadTimeoutMs() {
+        return this.httpReadTimeoutMs;
+    }
+
+}

+ 58 - 0
430-platform-backend-master/src/main/java/com/app/config/WebMvcConfig.java

@@ -0,0 +1,58 @@
+package com.app.config;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.SpringBootConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.accept.ContentNegotiationManager;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter;
+
+import java.util.Collections;
+
+/**
+ * 功能描述:
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/23 12:54
+ */
+@EnableWebMvc
+@ComponentScan(basePackages = "com.app")
+@SpringBootConfiguration
+public class WebMvcConfig implements WebMvcConfigurer {
+
+    @Value("${file.path}")
+    private String filePath;
+
+    @Bean
+    public RequestMappingHandlerAdapter requestMappingHandlerAdapter(@Autowired MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter, @Autowired ContentNegotiationManager mvcContentNegotiationManager) {
+        RequestMappingHandlerAdapter requestMappingHandlerAdapter = new RequestMappingHandlerAdapter();
+        requestMappingHandlerAdapter.setMessageConverters(Collections.singletonList(mappingJackson2HttpMessageConverter));
+        requestMappingHandlerAdapter.setContentNegotiationManager(mvcContentNegotiationManager);
+        return requestMappingHandlerAdapter;
+    }
+
+    @Bean
+    public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
+        return new MappingJackson2HttpMessageConverter();
+    }
+
+    @Override
+    public void addViewControllers(ViewControllerRegistry registry) {
+    }
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        /* 和页面有关的静态目录都放在项目的static目录下 */
+        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
+
+        /* 区分系统环境、自定义上传映射路径 */
+        registry.addResourceHandler("/file/**").addResourceLocations("file:" + filePath + "/");
+    }
+
+}

+ 38 - 0
430-platform-backend-master/src/main/java/com/app/config/mybatisplus/AutoFillEntityHandler.java

@@ -0,0 +1,38 @@
+package com.app.config.mybatisplus;
+
+import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
+import org.apache.ibatis.reflection.MetaObject;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.Objects;
+import java.util.function.Supplier;
+
+@Component
+public class AutoFillEntityHandler implements MetaObjectHandler {
+
+    @Override
+    public void insertFill(MetaObject metaObject) {
+        strictInsertFill(metaObject, "createBy", String.class, "1");
+        strictInsertFill(metaObject, "createAt", LocalDateTime.class, LocalDateTime.now());
+        strictInsertFill(metaObject, "updateBy", String.class, "1");
+        strictInsertFill(metaObject, "updateAt", LocalDateTime.class, LocalDateTime.now());
+        strictInsertFill(metaObject, "isDel", Boolean.class, Boolean.FALSE);
+    }
+
+    @Override
+    public void updateFill(MetaObject metaObject) {
+        strictUpdateFill(metaObject, "updateBy", String.class, "2");
+        strictUpdateFill(metaObject, "updateAt", LocalDateTime.class, LocalDateTime.now());
+    }
+
+    @Override
+    public MetaObjectHandler strictFillStrategy(MetaObject metaObject, String fieldName, Supplier<Object> fieldVal) {
+        Object obj = fieldVal.get();
+        if (Objects.nonNull(obj)) {
+            metaObject.setValue(fieldName, obj);
+        }
+        return this;
+    }
+
+}

+ 25 - 0
430-platform-backend-master/src/main/java/com/app/config/mybatisplus/MybatisPlusConfig.java

@@ -0,0 +1,25 @@
+package com.app.config.mybatisplus;
+
+
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MybatisPlusConfig {
+
+    /**
+     * 分页插件
+     * @return
+     */
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
+        // paginationInterceptor.setOverflow(false); // 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求  默认false
+        // paginationInterceptor.setLimit(500); // 设置最大单页限制数量,默认 500 条,-1 不受限制
+        paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true)); // 开启 count 的 join 优化,只针对部分 left join
+        return paginationInterceptor;
+    }
+
+}

+ 151 - 0
430-platform-backend-master/src/main/java/com/app/config/redis/RedisConfig.java

@@ -0,0 +1,151 @@
+package com.app.config.redis;
+
+import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.PropertyAccessor;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import org.springframework.cache.CacheManager;
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.core.*;
+import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+
+import java.time.Duration;
+
+@EnableCaching
+@Configuration
+public class RedisConfig extends CachingConfigurerSupport {
+
+    /**
+     * 功能描述:选择redis作为默认缓存工具
+     *
+     * @param lettuceConnectionFactory
+     * @return
+     */
+    @Primary
+    @Bean
+    public CacheManager defaultCacheManager(LettuceConnectionFactory lettuceConnectionFactory) {
+        RedisSerializationContext.SerializationPair<Object> objectSerializationPair = RedisSerializationContext.SerializationPair.fromSerializer(new GenericFastJsonRedisSerializer());
+        return RedisCacheManager.builder(lettuceConnectionFactory)
+                .cacheDefaults(RedisCacheConfiguration
+                        .defaultCacheConfig(Thread.currentThread().getContextClassLoader())
+                        .serializeValuesWith(objectSerializationPair)
+                )
+                .build();
+    }
+
+    /**
+     * 功能描述:带有效期的缓存设置
+     *
+     * @param lettuceConnectionFactory
+     * @return
+     */
+    @Bean(name = "ttlCacheManager")
+    public CacheManager cacheManager(LettuceConnectionFactory lettuceConnectionFactory) {
+        RedisSerializationContext.SerializationPair<Object> objectSerializationPair = RedisSerializationContext.SerializationPair.fromSerializer(new GenericFastJsonRedisSerializer());
+        return RedisCacheManager.builder(lettuceConnectionFactory)
+                .cacheDefaults(RedisCacheConfiguration
+                        .defaultCacheConfig(Thread.currentThread().getContextClassLoader())
+                        .serializeValuesWith(objectSerializationPair)
+                        .entryTtl(Duration.ofHours(2)) // 默认2H有效期
+                )
+                .build();
+    }
+
+    /**
+     * retemplate相关配置
+     *
+     * @param factory
+     * @return
+     */
+    @Bean
+    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
+        RedisTemplate<String, Object> template = new RedisTemplate<>();
+        template.setConnectionFactory(factory);
+        Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
+
+        ObjectMapper objectMapper = new ObjectMapper();
+        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
+        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
+        // 解决jackson2无法反序列化LocalDateTime的问题
+        objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+        objectMapper.registerModule(new JavaTimeModule());
+        jacksonSeial.setObjectMapper(objectMapper);
+
+        template.setValueSerializer(jacksonSeial);
+        template.setKeySerializer(new StringRedisSerializer());
+
+        template.setHashKeySerializer(new StringRedisSerializer());
+        template.setHashValueSerializer(jacksonSeial);
+        template.afterPropertiesSet();
+
+        return template;
+    }
+
+    /**
+     * 对hash类型的数据操作
+     *
+     * @param redisTemplate
+     * @return
+     */
+    @Bean
+    public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForHash();
+    }
+
+    /**
+     * 对redis字符串类型数据操作
+     *
+     * @param redisTemplate
+     * @return
+     */
+    @Bean
+    public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForValue();
+    }
+
+    /**
+     * 对链表类型的数据操作
+     *
+     * @param redisTemplate
+     * @return
+     */
+    @Bean
+    public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForList();
+    }
+
+    /**
+     * 对无序集合类型的数据操作
+     *
+     * @param redisTemplate
+     * @return
+     */
+    @Bean
+    public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForSet();
+    }
+
+    /**
+     * 对有序集合类型的数据操作
+     *
+     * @param redisTemplate
+     * @return
+     */
+    @Bean
+    public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
+        return redisTemplate.opsForZSet();
+    }
+
+}

+ 209 - 0
430-platform-backend-master/src/main/java/com/app/config/swagger/SwaggerUIConfig.java

@@ -0,0 +1,209 @@
+package com.app.config.swagger;
+
+import com.app.constant.JwtConstant;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.boot.SpringBootConfiguration;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Profile;
+import org.springframework.http.HttpHeaders;
+import org.springframework.util.StopWatch;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.ParameterBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.schema.ModelRef;
+import springfox.documentation.service.*;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spi.service.contexts.SecurityContext;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 功能描述:SwaggerUI配置类
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/8/2 10:21
+ */
+@Slf4j
+@Profile({"dev", "test"})
+@EnableSwagger2
+@SpringBootConfiguration
+public class SwaggerUIConfig implements WebMvcConfigurer {
+
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        registry.addResourceHandler("swagger-ui.html").addResourceLocations("classpath:/META-INF/resources/");
+        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+        registry.addResourceHandler("/web_frontend/**").addResourceLocations("classpath:/web_frontend/");
+    }
+
+    /**
+     * 功能描述:客户端接口API
+     *
+     * @return
+     * @Auther: 梁展鹏
+     * @Date: 2018/8/2 10:21
+     */
+    @Bean
+    public Docket frontEndUIAPI() {
+        StopWatch watch = new StopWatch();
+        watch.start();
+
+        List<Parameter> list = Arrays.asList(
+                new ParameterBuilder()
+                        .name(HttpHeaders.AUTHORIZATION)
+                        .description(HttpHeaders.AUTHORIZATION)
+                        .modelRef(new ModelRef("string"))
+                        .parameterType("header")
+                        .defaultValue(JwtConstant.PREFIX_HEADER_NAME + JwtConstant.TEST_TOKEN_VALUE)
+                        .required(Boolean.FALSE)
+                        .build()
+        );
+        Docket docket = new Docket(DocumentationType.SWAGGER_2)
+                .groupName("客户端接口 - 微信小程序") // 定义组
+                .apiInfo(apiInfo()) // 配置说明
+                .securitySchemes(securitySchemes())
+                .securityContexts(securityContexts())
+                .ignoredParameterTypes(HttpServletRequest.class) // 方法参数忽略,例如HttpServletRequest不想展示在Swagger上
+                .select() // 选中哪些路径和api会生成Document
+                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class)) // 拦截的包路径
+                .paths(PathSelectors.regex("(/api/.*)|(/common/.*)")) // 拦截的接口路径
+                .build(); // 创建
+
+        watch.stop();
+        log.info("Started Swagger(客户端接口API) in [{}] ms", watch.getTotalTimeMillis());
+
+        return docket;
+    }
+
+    /**
+     * 功能描述:管理后台界面接口API
+     *
+     * @return
+     * @Auther: 梁展鹏
+     * @Date: 2018/8/2 10:21
+     */
+    @Bean
+    public Docket backEndWebUIAPI() {
+        StopWatch watch = new StopWatch();
+        watch.start();
+
+        List<Parameter> list = Arrays.asList(
+                new ParameterBuilder()
+                        .name(HttpHeaders.AUTHORIZATION)
+                        .description(HttpHeaders.AUTHORIZATION)
+                        .modelRef(new ModelRef("string"))
+                        .parameterType("header")
+                        .defaultValue(JwtConstant.PREFIX_HEADER_NAME + JwtConstant.TEST_TOKEN_VALUE)
+                        .required(Boolean.FALSE)
+                        .build()
+        );
+        Docket docket = new Docket(DocumentationType.SWAGGER_2)
+                .groupName("Web管理后台") // 定义组
+                .apiInfo(apiInfo()) // 配置说明
+                .securitySchemes(securitySchemes())
+                .securityContexts(securityContexts())
+                .globalOperationParameters(list)
+                .ignoredParameterTypes(HttpServletRequest.class) // 方法参数忽略,例如HttpServletRequest不想展示在Swagger上
+                .select() // 选中哪些路径和api会生成Document
+                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class)) // 拦截的包路径
+                .paths(PathSelectors.regex("(/admin/.*)|(/common/.*)")) // 拦截的接口路径
+                .build(); // 创建
+
+        watch.stop();
+        log.info("Started Swagger(管理后台界面接口API) in [{}] ms", watch.getTotalTimeMillis());
+
+        return docket;
+    }
+
+    /**
+     * 功能描述:平台管理
+     *
+     * @return
+     * @Auther: 梁展鹏
+     * @Date: 2018/8/2 10:21
+     */
+    @Bean
+    public Docket backEndPlatformWebUIAPI() {
+        StopWatch watch = new StopWatch();
+        watch.start();
+
+        List<Parameter> list = Arrays.asList(
+                new ParameterBuilder()
+                        .name(HttpHeaders.AUTHORIZATION)
+                        .description(HttpHeaders.AUTHORIZATION)
+                        .modelRef(new ModelRef("string"))
+                        .parameterType("header")
+                        .defaultValue(JwtConstant.PREFIX_HEADER_NAME + JwtConstant.TEST_TOKEN_VALUE)
+                        .required(Boolean.FALSE)
+                        .build()
+        );
+        Docket docket = new Docket(DocumentationType.SWAGGER_2)
+                .groupName("Web管理后台 - 平台管理") // 定义组
+                .apiInfo(apiInfo()) // 配置说明
+                .securitySchemes(securitySchemes())
+                .securityContexts(securityContexts())
+                .globalOperationParameters(list)
+                .ignoredParameterTypes(HttpServletRequest.class) // 方法参数忽略,例如HttpServletRequest不想展示在Swagger上
+                .select() // 选中哪些路径和api会生成Document
+                .apis(RequestHandlerSelectors.withClassAnnotation(Api.class)) // 拦截的包路径
+                .paths(PathSelectors.regex("(/platform/.*)")) // 拦截的接口路径
+                .build(); // 创建
+
+        watch.stop();
+        log.info("Started Swagger(管理后台界面接口API) in [{}] ms", watch.getTotalTimeMillis());
+
+        return docket;
+    }
+
+    private List<ApiKey> securitySchemes() {
+        List<ApiKey> apiKeyList = new ArrayList<>();
+        apiKeyList.add(new ApiKey("token", "token", "header"));
+        return apiKeyList;
+    }
+
+    private List<SecurityContext> securityContexts() {
+        List<SecurityContext> securityContexts = new ArrayList<>();
+        securityContexts.add(SecurityContext
+                .builder()
+                .securityReferences(defaultAuth())
+                .forPaths(PathSelectors.regex("^(?!auth).*$"))
+                .build());
+        return securityContexts;
+    }
+
+    private List<SecurityReference> defaultAuth() {
+        AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything");
+        AuthorizationScope[] authorizationScopes = new AuthorizationScope[1];
+        authorizationScopes[0] = authorizationScope;
+        List<SecurityReference> securityReferences = new ArrayList<>();
+        securityReferences.add(new SecurityReference("token", authorizationScopes));
+        return securityReferences;
+    }
+
+    /**
+     * 功能描述:SwaggerUI文档的基本信息
+     *
+     * @return
+     * @Auther: 梁展鹏
+     * @Date: 2018/8/2 10:21
+     */
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("430平台")
+                .description("430平台")
+                .termsOfServiceUrl("")
+                .contact(new Contact("梁展鹏", "http://127.0.0.1", "fsliangzp@163.com"))
+                .version("v0.0.1")
+                .build();
+    }
+
+}

+ 32 - 0
430-platform-backend-master/src/main/java/com/app/constant/AccountConstant.java

@@ -0,0 +1,32 @@
+package com.app.constant;
+
+public final class AccountConstant {
+
+    /**
+     * 账号状态
+     */
+    public static final class State {
+        public static final Integer NORMAL = 1; // 正常
+    }
+
+    /**
+     * 账号授权类型
+     */
+    public static final class IdentityType {
+        public static final String USERNAME = "username";
+        public static final String EMAIL = "email";
+        public static final String PHONE = "phone";
+        public static final String WEIXIN = "weixin"; // 特指存放unionId
+        public static final String WEIXIN_MINI_PROGRAM = "weixin_mini_program"; // 特指存放微信小程序openId
+    }
+
+    /**
+     * 家长小孩回家方式
+     */
+    public static final class GoHome {
+        public static final String ONESELF = "自行回家";
+        public static final String TRANSFER = "家长接送";
+        public static final String TAKE_THE_SCHOOL_BUS = "乘坐校车";
+    }
+
+}

+ 32 - 0
430-platform-backend-master/src/main/java/com/app/constant/EnumSerializer.java

@@ -0,0 +1,32 @@
+package com.app.constant;
+
+import com.app.service.guardian.dto.WxmpLoginDto;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.databind.JsonSerializer;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import org.springframework.http.HttpStatus;
+
+import java.io.IOException;
+
+/**
+ * 功能描述:重写JSON序列化
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/8/2 10:21
+ */
+public class EnumSerializer extends JsonSerializer {
+
+    @Override
+    public void serialize(Object object, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException {
+        if (object instanceof HttpStatus) {
+            HttpStatus httpStatus = (HttpStatus) object;
+            jsonGenerator.writeNumber(httpStatus.value());
+        } else if (object instanceof WxmpLoginDto.StateEnum) {
+            WxmpLoginDto.StateEnum stateEnum = (WxmpLoginDto.StateEnum) object;
+            jsonGenerator.writeNumber(stateEnum.getValue());
+        } else {
+            jsonGenerator.writeString(object.toString());
+        }
+    }
+
+}

+ 24 - 0
430-platform-backend-master/src/main/java/com/app/constant/JwtConstant.java

@@ -0,0 +1,24 @@
+package com.app.constant;
+
+public class JwtConstant {
+
+    /* 请求头相关 */
+    public static final String HEADER_NAME = "Authorization"; // 存放Token的Header Key
+    public static final String PREFIX_HEADER_NAME = "Bearer "; // Token前缀
+    public static final String TEST_TOKEN_VALUE = "swagger-ui"; // token白名单
+
+    /* Token本身参数 */
+    public static final String SALT = "toceansoft"; // 盐值
+
+    public static final String ISSUER = "tocean";
+    public static final String SUBJECT = "tocean";
+
+    public static final String SECRET_KEY = "auth_chm"; // Secret密钥
+
+    public static final String EXP = "exp";
+    public static final String PAYLOAD = "payload";
+
+    public static final long TOKEN_EXPIRE_TIME = 2 * 60 * 60; // token过期时间(秒)
+    public static final long REFRESH_TOKEN_EXPIRE_TIME = 30 * 60; // refreshToken过期时间(秒)
+
+}

+ 9 - 0
430-platform-backend-master/src/main/java/com/app/constant/MenuConstant.java

@@ -0,0 +1,9 @@
+package com.app.constant;
+
+public class MenuConstant {
+    public static String TYPE_CATALOG = "1"; // 目录菜单类型
+
+    public static String TYPE_MENU = "2"; // 菜单类型
+
+    public static String TYPE_BUTTON = "3"; // 按钮菜单类型
+}

+ 10 - 0
430-platform-backend-master/src/main/java/com/app/constant/OpenCourseConstant.java

@@ -0,0 +1,10 @@
+package com.app.constant;
+
+public final class OpenCourseConstant {
+
+    public static final class OpenCourseType {
+        public static final String AFTER_CLASS_COURSE = "430课程";
+        public static final String PUBLIC_COURSE = "公共课程";
+    }
+
+}

+ 32 - 0
430-platform-backend-master/src/main/java/com/app/constant/OrderConstant.java

@@ -0,0 +1,32 @@
+package com.app.constant;
+
+public final class OrderConstant {
+
+    /**
+     * 订单支付状态
+     */
+    public static final class OrderState {
+        public static final Integer DELETED = -1; // 已删除
+        public static final Integer WAIT_PAY = 1; // 待支付
+        public static final Integer SUCCESS_PAY = 2; // 已支付
+        public static final Integer TIMEOUT_PAY = 3; // 已超时
+    }
+
+    /**
+     * 订单支付状态
+     */
+    public static final class OrderItemState {
+        public static final Integer DEFAULT = 0; // 默认(支付成功)
+        public static final Integer REFUND = -1; // 已退费
+    }
+
+    /**
+     * 订单退款审核状态
+     */
+    public static final class RefundState {
+        public static final Integer NOT_PASS = -1;
+        public static final Integer TO_BE_APPLY = 0;
+        public static final Integer PASSED = 1;
+    }
+
+}

+ 29 - 0
430-platform-backend-master/src/main/java/com/app/constant/RedisKeyConstant.java

@@ -0,0 +1,29 @@
+package com.app.constant;
+
+public class RedisKeyConstant {
+
+    /**
+     * 默认过期时长,单位:秒
+     */
+    public static final long DEFAULT_EXPIRE = 60 * 60 * 24;
+
+    /**
+     * 不设置过期时长
+     */
+    public static final long NOT_EXPIRE = -1;
+
+    public static String JWT_WXMP_SESSION(String jwtId) {
+        return String.format("jwt:wxmp:session:%s", jwtId);
+    }
+
+    public static final String MP_ACCESSTOKEN = "wx:mp_access_token";
+
+    public static String PlatformLoginImgCode(String uuid) {
+        return String.format("platform:web-login:img-code:%s", uuid);
+    }
+
+    public static String PlatformAccountLogin(String accountId) {
+        return String.format("platform:login:account:%s", accountId);
+    }
+
+}

+ 297 - 0
430-platform-backend-master/src/main/java/com/app/constant/SchoolConstant.java

@@ -0,0 +1,297 @@
+package com.app.constant;
+
+import com.app.dto.basics.GradeClassDto;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+public class SchoolConstant {
+    public static List<String> getPrimarySchool() {
+        return PRIMARY_SCHOOL;
+    }
+
+    public static List<String> getMiddleSchool() {
+        return MIDDLE_SCHOOL;
+    }
+
+    public static List<String> getHighSchool() {
+        return HIGH_SCHOOL;
+    }
+
+    /* 统一所有命名格式 */
+    private static final List<String> GRADE_NAME = new ArrayList<>();
+    private static final List<String> PRIMARY_SCHOOL = Stream.of("一年级", "二年级", "三年级", "四年级", "五年级", "六年级").collect(Collectors.toList()); // 小学
+    private static final List<String> MIDDLE_SCHOOL = Stream.of("初一", "初二", "初三").collect(Collectors.toList()); // 初中
+    private static final List<String> HIGH_SCHOOL = Stream.of("高一", "高二", "高三").collect(Collectors.toList()); // 高中
+    private static final List<String> CLASS_NAME_LIST = Stream.of("1班", "2班", "3班", "4班", "5班", "6班", "7班", "8班", "9班", "10班").collect(Collectors.toList()); // 班级
+
+    private static final List<String> GRADE_NUMBER_NAME = new ArrayList<>();
+    private static final List<String> PRIMARY_NUMBER_SCHOOL = Stream.of("1", "2", "3", "4", "5", "6").collect(Collectors.toList()); // 小学
+    private static final List<String> MIDDLE_NUMBER_SCHOOL = Stream.of("7", "8", "9").collect(Collectors.toList()); // 初中
+    private static final List<String> HIGH_NUMBER_SCHOOL = Stream.of("10", "11", "12").collect(Collectors.toList()); // 高中
+    private static final List<String> CLASS_NAME_NUMBER_LIST = Stream.of("01", "02", "03", "04", "05", "06", "07", "08", "09", "10").collect(Collectors.toList()); // 班级
+
+    static {
+        GRADE_NAME.addAll(PRIMARY_SCHOOL);
+        GRADE_NAME.addAll(MIDDLE_SCHOOL);
+        GRADE_NAME.addAll(HIGH_SCHOOL);
+
+        GRADE_NUMBER_NAME.addAll(PRIMARY_NUMBER_SCHOOL);
+        GRADE_NUMBER_NAME.addAll(MIDDLE_NUMBER_SCHOOL);
+        GRADE_NUMBER_NAME.addAll(HIGH_NUMBER_SCHOOL);
+    }
+
+    public static String formatGradeName(Integer gradeName) {
+        if (gradeName <= 6) {
+            return PRIMARY_SCHOOL.get(gradeName - 1);
+        } else if (gradeName <= 9) {
+            return MIDDLE_SCHOOL.get(gradeName - 1);
+        } else if (gradeName <= 12) {
+            return HIGH_SCHOOL.get(gradeName - 1);
+        }
+
+        return String.valueOf(gradeName);
+    }
+
+    public static String formatClassName(Integer glassName) {
+        return String.format("%s班", glassName);
+    }
+
+    /**
+     * 功能描述:格式化年级班级名称
+     * 一年级1班 -> 101
+     * 初一10班 -> 701
+     * 高一10班 -> 1010
+     *
+     * @param gradeName
+     * @param className
+     * @return
+     */
+    public static String formatSchoolClass(String gradeName, String className) {
+        String _gradeName = "";
+        if (PRIMARY_SCHOOL.indexOf(gradeName) >= 0) {
+            _gradeName = String.format("%s", PRIMARY_SCHOOL.indexOf(gradeName) + 1);
+        } else if (MIDDLE_SCHOOL.indexOf(gradeName) >= 0) {
+            _gradeName = String.format("%s", PRIMARY_SCHOOL.indexOf(gradeName) + 7);
+        } else if (HIGH_SCHOOL.indexOf(gradeName) >= 0) {
+            _gradeName = String.format("%s", PRIMARY_SCHOOL.indexOf(gradeName) + 10);
+        }
+
+        // 0 代表前面补充0
+        // 2 代表长度为2
+        // d 代表参数为正数型
+        String _className = String.format("%02d", CLASS_NAME_LIST.indexOf(className) + 1);
+
+        return String.format("%s%s", _gradeName, _className);
+    }
+
+    /**
+     * 功能描述:格式化年级班级名称
+     * 一年级1班 -> 101
+     * 初一10班 -> 701
+     * 高一10班 -> 1010
+     *
+     * @param gradeName
+     * @param className
+     * @return
+     */
+    public static String formatSchoolClass(Integer gradeName, Integer className) {
+        String _gradeName = "";
+        if (PRIMARY_SCHOOL.indexOf(gradeName) >= 0) {
+            _gradeName = String.format("%s", PRIMARY_SCHOOL.indexOf(gradeName) + 1);
+        } else if (MIDDLE_SCHOOL.indexOf(gradeName) >= 0) {
+            _gradeName = String.format("%s", PRIMARY_SCHOOL.indexOf(gradeName) + 7);
+        } else if (HIGH_SCHOOL.indexOf(gradeName) >= 0) {
+            _gradeName = String.format("%s", PRIMARY_SCHOOL.indexOf(gradeName) + 10);
+        }
+
+        // 0 代表前面补充0
+        // 2 代表长度为2
+        // d 代表参数为正数型
+        String _className = String.format("%02d", CLASS_NAME_LIST.indexOf(className) + 1);
+
+        return String.format("%s%s", _gradeName, _className);
+    }
+
+    /**
+     * 功能描述:根据学校的年级类型获取年级班对象
+     *
+     * @param gradeYear
+     * @return
+     */
+    public static List<GradeClassDto> getSchoolClass4GradeYear(String gradeYear) {
+        /* 根据学校年级定义初始化学校年级班级对象 */
+        List<GradeClassDto> list = new ArrayList<>();
+        if (gradeYear.indexOf("1") >= 0) {
+            list.addAll(SchoolConstant.getSchoolClass(1));
+        }
+        if (gradeYear.indexOf("2") >= 0) {
+            list.addAll(SchoolConstant.getSchoolClass(2));
+        }
+        if (gradeYear.indexOf("3") >= 0) {
+            list.addAll(SchoolConstant.getSchoolClass(3));
+        }
+
+        return list;
+    }
+
+    /**
+     * 功能描述:根据学校年级类型获取年级班对象
+     *
+     * @param grade 1:小学、2:中学、3:高中
+     * @return
+     */
+    public static List<GradeClassDto> getSchoolClass(Integer grade) {
+        List<GradeClassDto> list = new ArrayList<>();
+        switch (grade) {
+            case 1:
+                for (String gradeName : PRIMARY_SCHOOL) {
+                    for (String className : CLASS_NAME_LIST) {
+                        list.add(new GradeClassDto(gradeName, className));
+                    }
+                }
+                break;
+            case 2:
+                for (String gradeName : MIDDLE_SCHOOL) {
+                    for (String className : CLASS_NAME_LIST) {
+                        list.add(new GradeClassDto(gradeName, className));
+                    }
+                }
+                break;
+            case 3:
+                for (String gradeName : HIGH_SCHOOL) {
+                    for (String className : CLASS_NAME_LIST) {
+                        list.add(new GradeClassDto(gradeName, className));
+                    }
+                }
+                break;
+            default:
+        }
+
+        return list;
+    }
+
+    /**
+     * 功能描述:根据学校年级类型获取毕业年级名称
+     * 例如:
+     * 1:小学 -> 六年级
+     * 2:中学 -> 初三
+     * 3:高中 -> 高三
+     *
+     * @param gradeYear 1:小学、2:中学、3:高中
+     * @return
+     */
+    public static String getSchoolByIsGraduate(String gradeYear) {
+        switch (gradeYear) {
+            case "1":
+                return PRIMARY_SCHOOL.get(PRIMARY_SCHOOL.size() - 1);
+            case "2":
+                return MIDDLE_SCHOOL.get(MIDDLE_SCHOOL.size() - 1);
+            case "3":
+                return HIGH_SCHOOL.get(HIGH_SCHOOL.size() - 1);
+            default:
+                return "";
+        }
+    }
+
+    /**
+     * 功能描述:根据学校年级类型获取待升年级的年级名称
+     *
+     * @param gradeYear 1:小学、2:中学、3:高中
+     * @return
+     */
+    public static List<String> getSchoolByUpLevel(String gradeYear) {
+        switch (gradeYear) {
+            case "1":
+                return PRIMARY_SCHOOL.subList(0, PRIMARY_SCHOOL.size() - 1);
+            case "2":
+                return MIDDLE_SCHOOL.subList(0, MIDDLE_SCHOOL.size() - 1);
+            case "3":
+                return HIGH_SCHOOL.subList(0, HIGH_SCHOOL.size() - 1);
+            default:
+                return Collections.EMPTY_LIST;
+        }
+    }
+
+    /**
+     * 功能描述:根据学校年级类型获取下一年级名称
+     *
+     * @param gradeYear 1:小学、2:中学、3:高中
+     * @param gradeName 当前年级名称
+     * @return
+     */
+    public static String getSchoolNextGradeName(String gradeYear, String gradeName) {
+        switch (gradeYear) {
+            case "1":
+                return PRIMARY_SCHOOL.get(PRIMARY_SCHOOL.indexOf(gradeName) + 1);
+            case "2":
+                return MIDDLE_SCHOOL.get(MIDDLE_SCHOOL.indexOf(gradeName) + 1);
+            case "3":
+                return HIGH_SCHOOL.get(HIGH_SCHOOL.indexOf(gradeName) + 1);
+            default:
+                return "";
+        }
+    }
+
+    /**
+     * 功能描述:根据学校的年级类型获取年级班对象
+     *
+     * @param gradeYear
+     * @return
+     */
+    public static List<GradeClassDto> getSchoolClassNumber4GradeYear(String gradeYear) {
+        /* 根据学校年级定义初始化学校年级班级对象 */
+        List<GradeClassDto> list = new ArrayList<>();
+        if (gradeYear.indexOf("1") >= 0) {
+            list.addAll(SchoolConstant.getSchoolClassNumber(1));
+        }
+        if (gradeYear.indexOf("2") >= 0) {
+            list.addAll(SchoolConstant.getSchoolClassNumber(2));
+        }
+        if (gradeYear.indexOf("3") >= 0) {
+            list.addAll(SchoolConstant.getSchoolClassNumber(3));
+        }
+
+        return list;
+    }
+
+    /**
+     * 功能描述:根据学校年级类型获取年级班对象
+     *
+     * @param grade 1:小学、2:中学、3:高中
+     * @return
+     */
+    public static List<GradeClassDto> getSchoolClassNumber(Integer grade) {
+        List<GradeClassDto> list = new ArrayList<>();
+        switch (grade) {
+            case 1:
+                for (String gradeName : PRIMARY_NUMBER_SCHOOL) {
+                    for (String className : CLASS_NAME_NUMBER_LIST) {
+                        list.add(new GradeClassDto(gradeName, className));
+                    }
+                }
+                break;
+            case 2:
+                for (String gradeName : MIDDLE_NUMBER_SCHOOL) {
+                    for (String className : CLASS_NAME_NUMBER_LIST) {
+                        list.add(new GradeClassDto(gradeName, className));
+                    }
+                }
+                break;
+            case 3:
+                for (String gradeName : HIGH_NUMBER_SCHOOL) {
+                    for (String className : CLASS_NAME_NUMBER_LIST) {
+                        list.add(new GradeClassDto(gradeName, className));
+                    }
+                }
+                break;
+            default:
+        }
+
+        return list;
+    }
+
+}

+ 24 - 0
430-platform-backend-master/src/main/java/com/app/constant/SystemConstant.java

@@ -0,0 +1,24 @@
+package com.app.constant;
+
+public class SystemConstant {
+
+    public static final String ADMIN_ID = "1";
+
+    public static final String organId = "1"; // todo add by 梁展鹏 20201114 暂时只有一个机构(租户)
+
+    /* 梁展鹏 账号信息 */
+    public static final String SYS_ACCOUNT_ID = "616796877160972288";
+    public static final String SYS_OPEN_ID = "oZrcK496Zuqdkm62Kf_iQeoqBcTk";
+
+    public static final Integer ORDER_TIME_EXPIRE = 30; // 订单有效时间为30分钟
+
+    public static final class AddressType {
+        public static final String COUNTRY = "COUNTRY"; // 国家
+        public static final String PROVINCES = "PROVINCES"; // 省份
+        public static final String CITIES = "CITIES"; // 城市
+        public static final String AREA = "AREA"; // 区县
+        public static final String TOWN = "TOWN"; // 乡镇
+        public static final String VILLAGE = "VILLAGE"; // 村
+    }
+
+}

+ 73 - 0
430-platform-backend-master/src/main/java/com/app/controller/CommonController.java

@@ -0,0 +1,73 @@
+package com.app.controller;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.CommonImgDto;
+import com.app.dto.FileDto;
+import com.app.dto.Result;
+import com.app.util.file.FileUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Optional;
+
+/**
+ * 功能描述:账号
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(description = "公用Api接口")
+@Slf4j
+@RestController
+@RequestMapping("/common")
+public class CommonController {
+
+    @Autowired
+    private FileUtil fileUtil;
+
+    @OperationLog("更新 - 上传图片")
+    @ApiOperation(value = "上传图片")
+    @PostMapping("/upload")
+    public ResponseEntity<Result> upload(@RequestParam("file") MultipartFile file) {
+        if (file.isEmpty()) {
+            return new ResponseEntity(new Result().ok("文件为空"), HttpStatus.OK);
+        }
+
+        Optional<FileDto> dto = fileUtil.upload(file);
+        if (dto.isPresent()) {
+            return new ResponseEntity(new Result().ok(dto), HttpStatus.OK);
+        } else {
+            return new ResponseEntity(new Result().serverError(), HttpStatus.OK);
+        }
+    }
+
+    @ApiOperation(value = "公共图片")
+    @GetMapping("/img")
+    public ResponseEntity<Result<CommonImgDto>> img() {
+        CommonImgDto commonImgDto = new CommonImgDto();
+
+        /* 乐伴430 */
+//        commonImgDto.setWelcomeLogo("/file/32af5d6f-c177-4198-9e7a-30c7570ee6b9.png"); // 乐伴430
+//        commonImgDto.setPayAgreement("/file/32af5d6f-c177-4198-9e7a-30c7570ee6b9.png");
+//        commonImgDto.setAboutLogo("/file/32af5d6f-c177-4198-9e7a-30c7570ee6b9.png"); // 乐伴430
+
+        /* 红英小学 */
+//        commonImgDto.setWelcomeLogo("/file/e4cc3184-95e0-4944-8c25-0161d9c2d0ad.jpeg");
+//        commonImgDto.setPayAgreement("/file/830b6ace-6864-42b4-9f39-166e9158855a.png");
+//        commonImgDto.setAboutLogo("/file/e4cc3184-95e0-4944-8c25-0161d9c2d0ad.jpeg");
+
+        /* 启明小学 */
+        commonImgDto.setWelcomeLogo("/file/c9bf7892-393a-49f0-a746-04037605ba19.jpeg");
+        commonImgDto.setPayAgreement("/file/830b6ace-6864-42b4-9f39-166e9158855a.png");
+        commonImgDto.setAboutLogo("/file/c9bf7892-393a-49f0-a746-04037605ba19.jpeg");
+
+        return new ResponseEntity(new Result().ok(commonImgDto), HttpStatus.OK);
+    }
+
+}

+ 54 - 0
430-platform-backend-master/src/main/java/com/app/controller/admin/CommentController.java

@@ -0,0 +1,54 @@
+package com.app.controller.admin;
+
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.basics.operation.ResponseCommentDto;
+import com.app.dto.basics.search.SearchCommentDto;
+import com.app.service.basics.OpenCourseCommentService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 功能描述:学校
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(description = "学校")
+@Slf4j
+@Validated
+@RestController("AdminCommentController")
+@RequestMapping("/admin/comment")
+public class CommentController {
+
+    @Autowired
+    private OpenCourseCommentService service;
+
+    /**
+     * 功能描述:查询所有[学校]
+     *
+     * @param params 查询对象
+     * @return
+     */
+    @ApiOperation(value = "查询所有[学校]")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<ResponseCommentDto>>> page(@Valid @RequestBody SearchCommentDto params) {
+        return new ResponseEntity(new Result().ok(service.page(params)), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "查询所有[课程]")
+    @PostMapping("/audit/{commentId}")
+    public ResponseEntity<Result<?>> audit(@PathVariable("commentId") String commentId) {
+        service.audit2Pass(commentId);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+}

+ 55 - 0
430-platform-backend-master/src/main/java/com/app/controller/admin/OpenCourseOrderController.java

@@ -0,0 +1,55 @@
+package com.app.controller.admin;
+
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.order.OpenCourseOrderDto;
+import com.app.dto.order.operation.ExportOrderDto;
+import com.app.dto.order.search.SearchAdminOpenCourseOrderDto;
+import com.app.service.order.OpenCourseOrderExportService;
+import com.app.service.order.OpenCourseOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Api(description = "订单")
+@Slf4j
+@RestController("AdminOpenCourseOrderController")
+@RequestMapping("/admin/order")
+public class OpenCourseOrderController {
+
+    @Autowired
+    private OpenCourseOrderService openCourseOrderService;
+
+    @Autowired
+    private OpenCourseOrderExportService openCourseOrderExportService;
+
+    /**
+     * 功能描述:查询所有[订单]
+     *
+     * @param params 查询对象
+     * @return
+     */
+    @ApiOperation(value = "查询所有[订单]")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<OpenCourseOrderDto>>> page(@Valid @RequestBody SearchAdminOpenCourseOrderDto params) {
+        return new ResponseEntity(new Result().ok(openCourseOrderService.page(params)), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "导出[订单]")
+    @PostMapping("/export-excel")
+    public void exportExcel(@Valid @RequestBody ExportOrderDto params, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        openCourseOrderExportService.exportOrderExcel(params, request, response);
+    }
+
+}

+ 101 - 0
430-platform-backend-master/src/main/java/com/app/controller/admin/OpenCourseRefundController.java

@@ -0,0 +1,101 @@
+package com.app.controller.admin;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.constant.SystemConstant;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.order.operation.AuditRefundDto;
+import com.app.dto.order.operation.ExportOrderDto;
+import com.app.dto.order.operation.RefundDto;
+import com.app.dto.order.search.SearchAdminOpenCourseRefundDto;
+import com.app.entity.order.OpenCourseRefund;
+import com.app.service.order.OpenCourseOrderExportService;
+import com.app.service.order.OpenCourseRefundService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+
+@Api(description = "开课 - 退课")
+@Slf4j
+@Validated
+@RestController("AdminOpenCourseRefundController")
+@RequestMapping("/admin/order/refund")
+public class OpenCourseRefundController {
+
+    @Autowired
+    private OpenCourseRefundService openCourseRefundService;
+
+    @Autowired
+    private OpenCourseOrderExportService openCourseOrderExportService;
+
+    /**
+     * 功能描述:查询所有[退课申请]
+     *
+     * @param dto
+     * @return
+     */
+    @ApiOperation(value = "查询所有[订单]")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<OpenCourseRefund>>> page(@Valid @RequestBody SearchAdminOpenCourseRefundDto dto) {
+        return new ResponseEntity(new Result().ok(openCourseRefundService.page(
+                dto.getChildName(), dto.getPhoneNumber(), dto.getOpenCourseName(),
+                dto.getAccountId(), dto.getTransactionId(), dto.getState(),
+                dto.getSchoolYear(), dto.getSemester(),
+                dto.getSchoolId(), dto.getGradeName(), dto.getClassName(),dto.getOrganIds(),
+                dto.getPage(), dto.getSize()
+        )), HttpStatus.OK);
+    }
+
+    /**
+     * 功能描述:审核退课
+     *
+     * @param dto
+     * @return
+     */
+    @OperationLog("更新 - 审核退课")
+    @ApiOperation(value = "审核退课")
+    @PostMapping("/audit-refund")
+    public ResponseEntity<Result<PageResult<OpenCourseRefund>>> auditRefund(@Valid @RequestBody AuditRefundDto dto) {
+        String organId = SystemConstant.organId;
+        openCourseRefundService.auditRefund(organId, dto.getOpenCourseRefundId(), dto.getState(), dto.getRemarks(), dto.getRefundId());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "导出[订单]")
+    @PostMapping("/export-excel")
+    public void exportExcel(@Valid @RequestBody ExportOrderDto params, HttpServletRequest request, HttpServletResponse response) throws Exception {
+        openCourseOrderExportService.exportRefundExcel(params, request, response);
+    }
+
+    /**
+     * 功能描述:审核退课
+     *
+     * @param refundDto
+     * @return
+     */
+    @OperationLog("更新 - 退课")
+    @ApiOperation(value = "退课")
+    @PostMapping("/refund")
+    public ResponseEntity<Result<?>> refund(@Valid @RequestBody RefundDto refundDto) {
+       try {
+           String organId = SystemConstant.organId;
+           OpenCourseRefund refund = openCourseRefundService.apply(organId, refundDto.getOpenCourseOrderItemId(), refundDto.getRemarks(), refundDto.getAccountId(), refundDto.getWxmpFormId());
+           return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+       } catch (Exception e) {
+           return new ResponseEntity(new Result().serverError(e.getMessage()), HttpStatus.INTERNAL_SERVER_ERROR);
+       }
+    }
+
+}

+ 60 - 0
430-platform-backend-master/src/main/java/com/app/controller/admin/ReportController.java

@@ -0,0 +1,60 @@
+package com.app.controller.admin;
+
+import com.app.dto.Result;
+import com.app.dto.report.ReportHobbySeriesDto;
+import com.app.dto.report.SearchReportDto;
+import com.app.dto.report.ReportAllDto;
+import com.app.dto.report.ReportSchoolDto;
+import com.app.service.report.ReportService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 功能描述:学校
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(description = "报表")
+@Slf4j
+@Validated
+@RestController("ReportController")
+@RequestMapping("/admin/report")
+public class ReportController {
+
+    @Autowired
+    private ReportService reportService;
+
+    /**
+     * 功能描述:审核退课
+     *
+     * @param
+     * @return
+     */
+    @ApiOperation(value = "报表总览")
+    @PostMapping("/reportAll")
+    public ResponseEntity<Result<ReportAllDto>> reportAll(@Valid @RequestBody SearchReportDto searchReportDto) {
+        ReportAllDto reportAllDto = reportService.reportAll(searchReportDto);
+        return new ResponseEntity(new Result().ok(reportAllDto), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "行政班报表")
+    @PostMapping("/findReportByClass")
+    public  ResponseEntity<Result<ReportSchoolDto>> findReportByClass(@RequestBody SearchReportDto searchReportDto) {
+        return new ResponseEntity(new Result().ok(reportService.findReportByClass(searchReportDto)), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "兴趣班报表")
+    @PostMapping("/findReportByHobby")
+    public  ResponseEntity<Result<ReportHobbySeriesDto>> findReportByHobby(@RequestBody SearchReportDto searchReportDto) {
+        return new ResponseEntity(new Result().ok(reportService.findReportByHobby(searchReportDto)), HttpStatus.OK);
+    }
+}

+ 95 - 0
430-platform-backend-master/src/main/java/com/app/controller/admin/basics/CourseController.java

@@ -0,0 +1,95 @@
+package com.app.controller.admin.basics;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.SearchDto;
+import com.app.dto.basics.operation.CourseDto;
+import com.app.dto.basics.search.SearchCourseDto;
+import com.app.entity.basics.Course;
+import com.app.service.basics.CourseService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 功能描述:课程
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(description = "课程")
+@Slf4j
+@Validated
+@RestController("AdminCourseController")
+@RequestMapping("/admin/course")
+public class CourseController {
+
+    @Autowired
+    private CourseService courseService;
+
+    /**
+     * 功能描述:查询[课程]详情
+     *
+     * @param id 标识
+     * @return
+     */
+    @ApiOperation(value = "查询[课程]详情")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "标识", dataType = "String", paramType = "path", required = true, defaultValue = "")
+    })
+    @GetMapping("/{id}")
+    public ResponseEntity<Result<Course>> findById(@NotBlank @PathVariable("id") String id) {
+        return new ResponseEntity(new Result().ok(courseService.findById(id)), HttpStatus.OK);
+    }
+
+    /**
+     * 功能描述:查询[课程]列表
+     *
+     * @return
+     */
+    @ApiOperation(value = "查询[课程]列表")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<Course>>> page(@Valid @RequestBody SearchCourseDto params) {
+        return new ResponseEntity(new Result().ok(courseService.page(params)), HttpStatus.OK);
+    }
+
+    /**
+     * 功能描述:保存/更新[课程]
+     *
+     * @param courseDto
+     * @return
+     */
+    @OperationLog("更新 - 课程")
+    @ApiOperation(value = "保存/更新[课程]")
+    @PostMapping("/save-or-update")
+    public ResponseEntity<Result> saveOrUpdate(@Valid @RequestBody CourseDto courseDto) {
+        courseService.saveOrUpdate(courseDto);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    /**
+     * 功能描述:替换[课程]删除状态
+     *
+     * @param searchdto
+     * @return
+     */
+    @OperationLog("替换删除状态 - 课程")
+    @ApiOperation(value = "替换[课程]删除状态")
+    @PostMapping("/handle-is-del")
+    public ResponseEntity<Result> handleIsDel(@Valid @RequestBody SearchDto searchdto) {
+        courseService.handleIsDel(searchdto.getId());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+}

+ 105 - 0
430-platform-backend-master/src/main/java/com/app/controller/admin/basics/OpenCourseController.java

@@ -0,0 +1,105 @@
+package com.app.controller.admin.basics;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.constant.OpenCourseConstant;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.SearchDto;
+import com.app.dto.basics.operation.OpenCourseDto;
+import com.app.dto.basics.search.SearchOpenCourseDto;
+import com.app.dto.order.OpenCourseOrderExportDto;
+import com.app.entity.basics.OpenCourse;
+import com.app.service.basics.OpenCourseService;
+import com.app.service.order.OpenCourseOrderExportService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import java.util.List;
+
+/**
+ * 功能描述:开课
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(description = "开课")
+@Slf4j
+@Validated
+@RestController("AdminOpenCourseController")
+@RequestMapping("/admin/open-course")
+public class OpenCourseController {
+
+    @Autowired
+    private OpenCourseService openCourseService;
+
+    @Autowired
+    private OpenCourseOrderExportService openCourseOrderExportService;
+
+    /**
+     * 功能描述:查询[430开课]列表
+     *
+     * @param params
+     * @return
+     */
+    @ApiOperation(value = "查询[430开课]列表")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<OpenCourse>>> page(@Valid @RequestBody SearchOpenCourseDto params) {
+        return new ResponseEntity(new Result().ok(openCourseService.page(params.getOrganIds(),params.getSchoolYear(), params.getSemester(), params.getSchoolId(),
+                params.getName(), null, OpenCourseConstant.OpenCourseType.AFTER_CLASS_COURSE, params.getIsDel(),
+                params.getPage(), params.getSize())), HttpStatus.OK);
+    }
+
+    /**
+     * 功能描述:保存/更新[430开课]
+     *
+     * @param openCourseDto
+     * @return
+     */
+    @OperationLog("更新 - 430开课")
+    @ApiOperation(value = "保存/更新[430开课]")
+    @PostMapping("/save-or-update")
+    public ResponseEntity<Result> saveOrUpdate(@Valid @RequestBody OpenCourseDto openCourseDto) {
+        openCourseService.saveOrUpdate(openCourseDto);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    /**
+     * 功能描述:替换[430开课]删除状态
+     *
+     * @param searchdto
+     * @return
+     */
+    @OperationLog("替换删除状态 - 430开课")
+    @ApiOperation(value = "替换[430开课]删除状态")
+    @PostMapping("/handle-is-del")
+    public ResponseEntity<Result> handleIsDel(@Valid @RequestBody SearchDto searchdto) {
+        openCourseService.handleIsDel(searchdto.getId());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "根据开课id查询订单项")
+    @PostMapping("/{openCourseId}/order-item")
+    public ResponseEntity<Result<List<OpenCourseOrderExportDto>>> findByOpenCourseId(@NotBlank @PathVariable("openCourseId") String openCourseId) {
+        return new ResponseEntity(new Result().ok(openCourseOrderExportService.findByOpenCourseId(openCourseId)), HttpStatus.OK);
+    }
+
+    /**
+     * 功能描述:查询[430开课]列表
+     *
+     * @param params
+     * @return
+     */
+    @ApiOperation(value = "查询[430开课]列表")
+    @PostMapping("/timetable")
+    public ResponseEntity<Result<String>> timetable(@Valid @RequestBody SearchOpenCourseDto params) {
+        return new ResponseEntity(new Result().ok(openCourseService.findTimetable(params)), HttpStatus.OK);
+    }
+}

+ 92 - 0
430-platform-backend-master/src/main/java/com/app/controller/admin/basics/SchoolController.java

@@ -0,0 +1,92 @@
+package com.app.controller.admin.basics;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.SearchDto;
+import com.app.dto.basics.operation.SchoolDto;
+import com.app.dto.basics.search.SearchSchoolDto;
+import com.app.entity.basics.School;
+import com.app.service.basics.SchoolService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 功能描述:学校
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(description = "学校")
+@Slf4j
+@Validated
+@RestController("AdminSchoolController")
+@RequestMapping("/admin/school")
+public class SchoolController {
+
+    @Autowired
+    private SchoolService schoolService;
+
+    /**
+     * 功能描述:查询所有[学校]
+     *
+     * @param params 查询对象
+     * @return
+     */
+    @ApiOperation(value = "查询所有[学校]")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<School>>> page(@Valid @RequestBody SearchSchoolDto params) {
+        return new ResponseEntity(new Result().ok(schoolService.page(params)), HttpStatus.OK);
+    }
+
+    /**
+     * 功能描述:保存/更新[学校]
+     *
+     * @param school
+     * @return
+     */
+    @OperationLog("更新 - 学校")
+    @ApiOperation(value = "保存/更新[学校]")
+    @PostMapping("/save-or-update")
+    public ResponseEntity<Result> saveOrUpdate(@Valid @RequestBody SchoolDto school) {
+        schoolService.saveOrUpdate(school);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    /**
+     * 功能描述:替换[学校]删除状态
+     *
+     * @param searchdto
+     * @return
+     */
+    @OperationLog("替换删除状态 - 学校")
+    @ApiOperation(value = "替换[学校]删除状态")
+    @PostMapping("/handle-is-del")
+    public ResponseEntity<Result> handleIsDel(@Valid @RequestBody SearchDto searchdto) {
+        schoolService.handleIsDel(searchdto.getId());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    /**
+     * 功能描述:把[学校]各个年级升级,高年级做毕业处理
+     *
+     * @param schoolId
+     * @return
+     */
+    @OperationLog("更新 - 学校升年级")
+    @ApiOperation(value = "把[学校]各个年级升级,高年级做毕业处理")
+    @PostMapping("/{schoolId}/up-level")
+    public ResponseEntity<Result> upLevel(@PathVariable("schoolId") String schoolId) {
+        schoolService.upLevel(schoolId);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+}

+ 60 - 0
430-platform-backend-master/src/main/java/com/app/controller/admin/basics/TeacherController.java

@@ -0,0 +1,60 @@
+package com.app.controller.admin.basics;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.basics.SaveTeacherDto;
+import com.app.dto.basics.search.SaveTeacherTagDto;
+import com.app.dto.basics.search.SearchTeacherDto;
+import com.app.service.basics.TeacherService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+/**
+ * 功能描述:机构教师
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(tags = "机构教师")
+@Slf4j
+@Validated
+@RestController("AdminOrganTeacherController")
+@RequestMapping("/admin/teacher")
+public class TeacherController {
+
+    @Autowired
+    private TeacherService service;
+
+    /**
+     * 功能描述:查询所有[机构教师]
+     *
+     * @param params 查询对象
+     * @return
+     */
+    @ApiOperation(value = "查询所有[机构教师]")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<SaveTeacherTagDto>>> page(@Valid @RequestBody SearchTeacherDto params) {
+        return new ResponseEntity(new Result().ok(service.page(params)), HttpStatus.OK);
+    }
+
+    @OperationLog("更新 - 机构教师")
+    @ApiOperation(value = "保存/更新[机构教师]")
+    @PostMapping("/save-or-update")
+    public ResponseEntity<Result> saveOrUpdate(@Valid @RequestBody SaveTeacherDto saveTeacherDto) {
+        service.saveOrUpdate(saveTeacherDto);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+}

+ 66 - 0
430-platform-backend-master/src/main/java/com/app/controller/admin/basics/YearSemesterController.java

@@ -0,0 +1,66 @@
+package com.app.controller.admin.basics;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.constant.SystemConstant;
+import com.app.dto.Result;
+import com.app.dto.basics.SchoolYearSemesterDto;
+import com.app.entity.basics.YearSemester;
+import com.app.service.basics.YearSemesterService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+/**
+ * 功能描述:学年学期
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(tags = "学年学期")
+@Slf4j
+@Validated
+@RestController("AdminOrganYearSemesterController")
+@RequestMapping("/admin/year-semester")
+public class YearSemesterController {
+
+    @Autowired
+    private YearSemesterService service;
+
+    /**
+     * 功能描述:查询[学年学期]
+     *
+     * @return
+     */
+    @ApiOperation(value = "查询[学年学期]")
+    @PostMapping("/find")
+    public ResponseEntity<Result<YearSemester>> find() {
+        String organId = SystemConstant.organId;
+        return new ResponseEntity(new Result().ok(service.find(organId)), HttpStatus.OK);
+    }
+
+    /**
+     * 功能描述:保存/更新[学年学期]
+     *
+     * @param dto
+     * @return
+     */
+    @OperationLog("更新 - 学年学期")
+    @ApiOperation(value = "保存/更新[学年学期]")
+    @PostMapping("/save-or-update")
+    public ResponseEntity<Result> saveOrUpdate(@Valid @RequestBody SchoolYearSemesterDto dto) {
+        String organId = SystemConstant.organId;
+        service.saveOrUpdate(organId, dto.getSchoolYear(), dto.getSemester());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+}

+ 75 - 0
430-platform-backend-master/src/main/java/com/app/controller/admin/guardian/GuardianController.java

@@ -0,0 +1,75 @@
+package com.app.controller.admin.guardian;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.constant.SystemConstant;
+import com.app.controller.api.GuardianChildRequest;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.account.search.SearchAccountDto;
+import com.app.entity.guardian.Guardian;
+import com.app.entity.order.OpenCourseOrderItem;
+import com.app.service.guardian.GuardianChildService;
+import com.app.service.guardian.GuardianService;
+import com.app.service.order.OpenCourseOrderService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 功能描述:家长管理
+ * https://www.jianshu.com/p/cf9ad8c3621d
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api("家长管理")
+@Slf4j
+@RestController("AdminGuardianController")
+@RequestMapping("/admin/guardian")
+public class GuardianController {
+
+    @Autowired
+    private GuardianService guardianService;
+
+    @Autowired
+    private GuardianChildService guardianChildService;
+
+    @Autowired
+    private OpenCourseOrderService openCourseOrderService;
+
+    @ApiOperation(value = "查询所有[账号]")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<Guardian>>> page(@Valid @RequestBody SearchAccountDto params) {
+        return new ResponseEntity(new Result().ok(guardianService.page(params)), HttpStatus.OK);
+    }
+
+    @OperationLog("更新 - 关联小孩")
+    @ApiOperation(value = "关联小孩")
+    @PostMapping("/child/relation")
+    public ResponseEntity<Result> relation(@Valid @RequestBody GuardianChildRequest request) {
+        guardianChildService.relation(request, request.getGuardianId());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    @OperationLog("更新 - 删除关联小孩")
+    @ApiOperation(value = "删除关联小孩")
+    @DeleteMapping("/child/{accountChildId}")
+    public ResponseEntity<Result> deleteChild(@PathVariable("accountChildId") String accountChildId) {
+        guardianChildService.delete(SystemConstant.ADMIN_ID, accountChildId);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "查询所有[课程]")
+    @PostMapping("/class/{accountId}")
+    public ResponseEntity<Result<List<OpenCourseOrderItem>>> classByAccountId(@PathVariable("accountId") String accountId) {
+        return new ResponseEntity(new Result().ok(openCourseOrderService.classByAccountId(accountId)), HttpStatus.OK);
+    }
+
+}

+ 78 - 0
430-platform-backend-master/src/main/java/com/app/controller/admin/info/NewsController.java

@@ -0,0 +1,78 @@
+package com.app.controller.admin.info;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.SearchDto;
+import com.app.dto.basics.operation.NewsDto;
+import com.app.dto.basics.search.SearchNewsDto;
+import com.app.entity.info.News;
+import com.app.service.info.NewsService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+/**
+ * 功能描述:新闻资讯
+ *
+ * @author 禤润峰
+ * @date 2021年1月15日09点59分
+ */
+@Api(description = "新闻资讯")
+@Slf4j
+@Validated
+@RestController("AdminNewsController")
+@RequestMapping("/admin/info/news")
+public class NewsController {
+
+    @Resource
+    private NewsService newsService;
+
+    @ApiOperation(value = "查询[新闻详情]")
+    @PostMapping("/{newsId}")
+    public ResponseEntity<Result<News>> findNewsById(@PathVariable("newsId") String newsId) {
+        return new ResponseEntity(new Result().ok(newsService.findNewsById(newsId)), HttpStatus.OK);
+    }
+
+    /**
+     * 查询【新闻资讯】列表
+     *
+     * @param params 搜索dto
+     * @return 响应结果
+     */
+    @ApiOperation(value = "查询[新闻资讯]列表")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<News>>> page(@Valid @RequestBody SearchNewsDto params) {
+        return new ResponseEntity(new Result<>().ok(newsService.page(params)), HttpStatus.OK);
+    }
+
+    /**
+     * 保存/更新[新闻资讯]
+     *
+     * @param dto 查询dto
+     * @return 成功响应
+     */
+    @OperationLog("更新 - 新闻资讯")
+    @ApiOperation(value = "保存/更新[新闻资讯]")
+    @PostMapping("/save-or-update")
+    public ResponseEntity<Result> saveOrUpdate(@Valid @RequestBody NewsDto dto) {
+        newsService.saveOrUpdate(dto);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    @OperationLog("替换删除状态 - 新闻资讯")
+    @ApiOperation(value = "替换[新闻资讯]删除状态")
+    @PostMapping("/handle-is-del")
+    public ResponseEntity<Result> handleIsDel(@Valid @RequestBody SearchDto searchdto) {
+        newsService.handleIsDel(searchdto.getId());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+}

+ 80 - 0
430-platform-backend-master/src/main/java/com/app/controller/admin/organ/OrganController.java

@@ -0,0 +1,80 @@
+package com.app.controller.admin.organ;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.Result;
+import com.app.dto.organ.OrganBranchSchoolResponseDto;
+import com.app.entity.organ.Organ;
+import com.app.service.organ.OrganSchoolService;
+import com.app.service.organ.OrganService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 功能描述:学校
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api("机构")
+@Slf4j
+@Validated
+@RestController("AdminOrganController")
+@RequestMapping("/admin/organ")
+public class OrganController {
+
+    @Autowired
+    private OrganService service;
+
+    @Autowired
+    private OrganSchoolService organSchoolService;
+
+    /**
+     * 功能描述:保存/更新[机构]
+     *
+     * @param organBranchSchoolResponseDto
+     * @return
+     */
+    @OperationLog("更新 - 机构")
+    @ApiOperation(value = "保存/更新[机构]")
+    @PostMapping("/save-or-update")
+    public ResponseEntity<Result> saveOrUpdate(@Valid @RequestBody OrganBranchSchoolResponseDto organBranchSchoolResponseDto) {
+        service.saveOrUpdate(organBranchSchoolResponseDto);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "查询[机构]")
+    @PostMapping("/find-organ/{id}")
+    public  ResponseEntity<Result<OrganBranchSchoolResponseDto>> findOrgan(@PathVariable String id) {
+        return new ResponseEntity(new Result().ok(service.findOrgan(id)), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "查询所有[机构]")
+    @PostMapping("/find-organ/selectOrgan")
+    public  ResponseEntity<Result<List<Organ>>> findAllOrgan() {
+        return new ResponseEntity(new Result().ok(service.findAllOrgan()), HttpStatus.OK);
+    }
+
+    /**
+     * 功能描述:删除机构分校
+     *
+     * @param id 机构分校标识
+     * @return
+     */
+    @OperationLog("删除 - 机构分校")
+    @ApiOperation(value = "删除机构分校")
+    @DeleteMapping("/school/{id}")
+    public ResponseEntity<Result<?>> delete(@PathVariable String id) {
+        organSchoolService.delete(id);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+}

+ 71 - 0
430-platform-backend-master/src/main/java/com/app/controller/api/GuardianChildRequest.java

@@ -0,0 +1,71 @@
+package com.app.controller.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
+/**
+ * 功能描述:
+ *
+ * @Author 梁展鹏
+ * @Date 2021/1/19 10:32
+ */
+@ApiModel("家长小孩新增Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class GuardianChildRequest {
+
+    @ApiModelProperty("标识")
+    private String id;
+
+    @ApiModelProperty("家长标识")
+    private String guardianId;
+
+    @ApiModelProperty("家长手机号码")
+    @NotEmpty
+    private String phoneNumber;
+
+    @ApiModelProperty("小孩姓名")
+    @NotEmpty
+    private String childName;
+
+    @ApiModelProperty("学校标识")
+    @NotEmpty
+    private String schoolId;
+
+    @ApiModelProperty("学校名称")
+    @NotEmpty
+    private String schoolName;
+
+    /**
+     * @see com.app.constant.SchoolConstant#PRIMARY_SCHOOL
+     * @see com.app.constant.SchoolConstant#MIDDLE_SCHOOL
+     * @see com.app.constant.SchoolConstant#HIGH_SCHOOL
+     */
+    @ApiModelProperty("年级名称")
+    @NotEmpty
+    private Integer gradeName;
+
+    /**
+     * @see com.app.constant.SchoolConstant#CLASS_NAME_LIST
+     */
+    @ApiModelProperty("班级名称")
+    @NotEmpty
+    private Integer className;
+
+    /**
+     * @see com.app.constant.AccountConstant.GoHome
+     */
+    @ApiModelProperty("课后回家方式")
+    @NotNull
+    private String goHome;
+
+}

+ 84 - 0
430-platform-backend-master/src/main/java/com/app/controller/api/GuardianController.java

@@ -0,0 +1,84 @@
+package com.app.controller.api;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.Result;
+import com.app.dto.account.operation.WXMPLoginDto;
+import com.app.service.guardian.GuardianChildService;
+import com.app.service.guardian.GuardianLoginService;
+import com.app.service.guardian.GuardianService;
+import com.app.service.guardian.dto.GuardianDto;
+import com.app.service.guardian.dto.WxmpLoginDto;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+
+/**
+ * 功能描述:账号
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api("家长管理")
+@Slf4j
+@Validated
+@RestController("ApiGuardianController")
+@RequestMapping("/api/guardian")
+public class GuardianController {
+
+    @Autowired
+    private GuardianService guardianService;
+
+    @Autowired
+    private GuardianLoginService guardianLoginService;
+
+    @Autowired
+    private GuardianChildService guardianChildService;
+
+    @ApiOperation(value = "微信小程序登录")
+    @PostMapping("/wxmp-login")
+    public ResponseEntity<Result<WxmpLoginDto>> wxmpLogin(@RequestBody WXMPLoginDto WXMPLoginDto, HttpServletRequest request) {
+        WxmpLoginDto dto;
+        try {
+            return new ResponseEntity(new Result().ok(guardianLoginService.wxMpLogin(request, WXMPLoginDto)), HttpStatus.OK);
+        } catch (Exception e) {
+            dto = new WxmpLoginDto();
+            dto.setState(WxmpLoginDto.StateEnum.FAIL);
+            dto.setMessage(WxmpLoginDto.StateEnum.FAIL.getName());
+            return new ResponseEntity(new Result().serverError(dto), HttpStatus.OK);
+        }
+    }
+
+    @ApiOperation(value = "账号信息")
+    @PostMapping("/find")
+    public ResponseEntity<Result<GuardianDto>> find() {
+        String accountId = "";
+        return new ResponseEntity(new Result().ok(guardianService.find2Dto(accountId)), HttpStatus.OK);
+    }
+
+    @OperationLog("更新 - 关联小孩")
+    @ApiOperation(value = "关联小孩")
+    @PostMapping("/child/relation")
+    public ResponseEntity<Result> relation(@Valid @RequestBody GuardianChildRequest request) {
+        String accountId = "";
+        guardianChildService.relation(request, accountId);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    @OperationLog("删除 - 关联小孩")
+    @ApiOperation(value = "删除关联小孩")
+    @DeleteMapping("/child/{accountChildId}")
+    public ResponseEntity<Result> deleteChild(@PathVariable("accountChildId") String accountChildId) {
+        String accountId = "";
+        guardianChildService.delete(accountId, accountChildId);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+}

+ 101 - 0
430-platform-backend-master/src/main/java/com/app/controller/api/OpenCourseController.java

@@ -0,0 +1,101 @@
+package com.app.controller.api;
+
+import com.app.constant.OpenCourseConstant;
+import com.app.constant.SystemConstant;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.SearchPageDto;
+import com.app.entity.basics.OpenCourse;
+import com.app.entity.basics.YearSemester;
+import com.app.entity.guardian.GuardianChild;
+import com.app.entity.order.OpenCourseOrderItem;
+import com.app.service.basics.OpenCourseService;
+import com.app.service.basics.YearSemesterService;
+import com.app.service.guardian.GuardianChildService;
+import com.app.service.order.OpenCourseOrderItemService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import java.util.Optional;
+
+/**
+ * 功能描述:开课
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(description = "开课")
+@Slf4j
+@Validated
+@RestController("ApiOpenCourseController")
+@RequestMapping("/api/open-course")
+public class OpenCourseController {
+
+    @Autowired
+    private GuardianChildService guardianChildService;
+
+    @Autowired
+    private OpenCourseService openCourseService;
+
+    @Autowired
+    private OpenCourseOrderItemService openCourseOrderItemService;
+
+    @Autowired
+    private YearSemesterService schoolYearSemesterService;
+
+    @ApiOperation(value = "查询[开课]")
+    @PostMapping("/child/{accountChildId}/page")
+    public ResponseEntity<Result<PageResult<OpenCourse>>> page(@Valid @RequestBody SearchPageDto params, @PathVariable("accountChildId") String accountChildId) {
+        String organId = SystemConstant.organId;
+        Optional<GuardianChild> optional = guardianChildService.findById(accountChildId);
+        if (optional.isPresent()) {
+            GuardianChild _guardianChild = optional.get();
+
+            YearSemester schoolYearSemester = schoolYearSemesterService.find(organId);
+            Integer schoolYear = schoolYearSemester.getSchoolYear();
+            Integer semester = schoolYearSemester.getSemester();
+
+            return new ResponseEntity(new Result().ok(openCourseService.page(null,schoolYear, semester, _guardianChild.getSchoolId(),
+                    null, _guardianChild.getGradeName(), OpenCourseConstant.OpenCourseType.AFTER_CLASS_COURSE, Boolean.FALSE,
+                    params.getPage(), params.getSize())), HttpStatus.OK);
+        }
+
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "查询[开课]详情")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "标识", dataType = "String", paramType = "path", required = true, defaultValue = "")
+    })
+    @GetMapping("/{id}")
+    public ResponseEntity<Result<OpenCourse>> findById(@NotBlank @PathVariable("id") String id) {
+        return new ResponseEntity(new Result().ok(openCourseService.findById(id)), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "查询[我的课程]")
+    @PostMapping("/my")
+    public ResponseEntity<Result<PageResult<OpenCourseOrderItem>>> myOpenCourse(@Valid @RequestBody SearchPageDto params) {
+        String accountId = "";
+        return new ResponseEntity(new Result().ok(openCourseOrderItemService.myOpenCourse(accountId, params.getPage(), params.getSize())), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "查询[我的选课单]")
+    @PostMapping("/my/shopping-car/child/{accountChildId}")
+    public ResponseEntity<Result<OpenCourse>> myShoppingCar(@PathVariable("accountChildId") String accountChildId) {
+        String accountId = "";
+        return new ResponseEntity(new Result().ok(openCourseService.myShoppingCar(accountId, accountChildId)), HttpStatus.OK);
+    }
+
+    // todo 课程推荐...
+
+}

+ 140 - 0
430-platform-backend-master/src/main/java/com/app/controller/api/OpenCourseOrderController.java

@@ -0,0 +1,140 @@
+package com.app.controller.api;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.SearchDto;
+import com.app.dto.SearchPageDto;
+import com.app.dto.order.OpenCourseOrderDto;
+import com.app.dto.order.operation.GenerateOrderDto;
+import com.app.dto.wx.PrePayDto;
+import com.app.entity.basics.OpenCourse;
+import com.app.entity.order.OpenCourseShoppingCar;
+import com.app.service.basics.OpenCourseService;
+import com.app.service.order.OpenCourseOrderService;
+import com.app.service.order.OpenCourseShoppingCarService;
+import com.app.util.DateUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.util.StringUtils;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import javax.validation.constraints.NotBlank;
+import java.util.Date;
+import java.util.Optional;
+
+@Api(description = "开课 - 订单")
+@Slf4j
+@Validated
+@RestController("ApiOpenCourseOrderController")
+@RequestMapping("/api/open-course-order")
+public class OpenCourseOrderController {
+
+    @Autowired
+    private OpenCourseService openCourseService;
+
+    @Autowired
+    private OpenCourseShoppingCarService openCourseShoppingCarService;
+
+    @Autowired
+    private OpenCourseOrderService openCourseOrderService;
+
+    @OperationLog("更新 - 生产选课单订单")
+    @ApiOperation(value = "[选课单] - 生成订单")
+    @PostMapping("/generate")
+    public ResponseEntity<Result<OpenCourseOrderDto>> generate(@Valid @RequestBody GenerateOrderDto generateOrderDto) {
+        String accountId = "";
+        if (generateOrderDto.getOpenCourseIdList().size() == 0) {
+            throw new RuntimeException("没有选中课程");
+        }
+
+        /* 判断[开课]是否满足条件 */
+        for (String openCourseId : generateOrderDto.getOpenCourseIdList()) {
+            Optional<OpenCourse> optional = openCourseService.findById(openCourseId);
+            if (optional.isPresent()) {
+                OpenCourse _openCourse = optional.get();
+                if (!DateUtil.between(_openCourse.getSignUpStartTime(), _openCourse.getSignUpEndTime(), new Date()) || _openCourse.getFreeCourseNumber() <= 0) {
+                    return new ResponseEntity(new Result().serverError("课程已过报名时间或名额已满"), HttpStatus.OK);
+                }
+
+                /* 校验当前[课程]是否在选课单上,[在]就不加入[选课单]、[不在]就加入[选课单] */
+                if (generateOrderDto.getIsFast()) {
+                    OpenCourseShoppingCar _car = openCourseShoppingCarService.find(openCourseId, accountId, generateOrderDto.getAccountChildId());
+                    if(!Optional.ofNullable(_car).isPresent()) {
+                        openCourseShoppingCarService.save(openCourseId, accountId, generateOrderDto.getAccountChildId());
+                    }
+                }
+            }
+        }
+
+        return new ResponseEntity(new Result().ok(openCourseOrderService.generate(generateOrderDto, accountId)), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "订单-预支付[微信支付]")
+    @PostMapping("/pre-pay")
+    public ResponseEntity<Result<PrePayDto>> wxPrePay(HttpServletRequest request, @RequestBody SearchDto param) {
+        String accountId = "";
+        String openId = "";
+
+        PrePayDto prePayDto = openCourseOrderService.payToStart(accountId, openId, param.getId());
+        if (StringUtils.isEmpty(prePayDto.getPaySign())) {
+            return new ResponseEntity(new Result().serverError(), HttpStatus.OK);
+        } else {
+            return new ResponseEntity(new Result().ok(prePayDto), HttpStatus.OK);
+        }
+    }
+
+    @ApiOperation(value = "订单-免费支付[零元订单]")
+    @PostMapping("/free-pre-pay")
+    public ResponseEntity<Result<PrePayDto>> freePrePay(HttpServletRequest request, @RequestBody SearchDto param) {
+        String accountId = "";
+        String openId = "";
+
+        PrePayDto prePayDto = openCourseOrderService.payToStart(accountId, openId, param.getId());
+        if (StringUtils.isEmpty(prePayDto.getPaySign())) {
+            return new ResponseEntity(new Result().serverError(), HttpStatus.OK);
+        } else {
+            return new ResponseEntity(new Result().ok(prePayDto), HttpStatus.OK);
+        }
+    }
+
+    @ApiOperation(value = "查询[我的订单]")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<OpenCourseOrderDto>>> page(@Valid @RequestBody SearchPageDto params) {
+        String accountId = "";
+        return new ResponseEntity(new Result().ok(openCourseOrderService.page(accountId, params.getPage(), params.getSize())), HttpStatus.OK);
+    }
+
+    @ApiOperation(value = "查询[我的订单]详情")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "订单标识", dataType = "String", paramType = "path", required = true, defaultValue = "")
+    })
+    @GetMapping("/{id}")
+    public ResponseEntity<Result<OpenCourseOrderDto>> find(@NotBlank @PathVariable("id") String orderId) {
+        String accountId = "";
+        return new ResponseEntity(new Result().ok(openCourseOrderService.find(orderId, accountId)), HttpStatus.OK);
+    }
+
+    @OperationLog("删除 - 我的订单")
+    @ApiOperation(value = "删除[我的订单]")
+    @ApiImplicitParams(
+            @ApiImplicitParam(name = "id", value = "开课标识", dataType = "String", paramType = "path", required = true, defaultValue = "")
+    )
+    @DeleteMapping("/{id}")
+    public ResponseEntity<Result> delete(@PathVariable("id") String id) {
+        String accountId = "";
+        // add by 梁展鹏 20200921 不知道为什么会有家长支付费用后,还会删除订单的操作!?!?!?
+        // openCourseOrderService.delete(id, userDetails.getAccountId());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+}

+ 42 - 0
430-platform-backend-master/src/main/java/com/app/controller/api/OpenCourseRefundController.java

@@ -0,0 +1,42 @@
+package com.app.controller.api;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.constant.SystemConstant;
+import com.app.dto.Result;
+import com.app.dto.order.operation.RefundDto;
+import com.app.entity.order.OpenCourseRefund;
+import com.app.service.order.OpenCourseRefundService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.Valid;
+
+@Api(description = "开课 - 退课")
+@Slf4j
+@Validated
+@RestController("ApiOpenCourseRefundController")
+@RequestMapping("/api/open-course-order/refund")
+public class OpenCourseRefundController {
+
+    @Autowired
+    private OpenCourseRefundService openCourseRefundService;
+
+    @OperationLog("更新 - 申请退课")
+    @ApiOperation(value = "申请退课")
+    @PostMapping("/apply")
+    public ResponseEntity<Result<OpenCourseRefund>> apply(@Valid @RequestBody RefundDto dto) {
+        String organId = SystemConstant.organId;
+        String accountId = "";
+        return new ResponseEntity(new Result().ok(openCourseRefundService.apply(organId, dto.getOpenCourseOrderItemId(), dto.getRemarks(), accountId, dto.getWxmpFormId())), HttpStatus.OK);
+    }
+
+}

+ 80 - 0
430-platform-backend-master/src/main/java/com/app/controller/api/OpenCourseShoppingCarController.java

@@ -0,0 +1,80 @@
+package com.app.controller.api;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.Result;
+import com.app.dto.SearchDto;
+import com.app.entity.basics.OpenCourse;
+import com.app.entity.order.OpenCourseShoppingCar;
+import com.app.service.basics.OpenCourseService;
+import com.app.service.order.OpenCourseShoppingCarService;
+import com.app.util.DateUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Date;
+import java.util.Optional;
+
+@Api(description = "开课 - 选课单")
+@Slf4j
+@Validated
+@RestController("ApiOpenCourseShoppingCarController")
+@RequestMapping("/api/open-course-shopping-car")
+public class OpenCourseShoppingCarController {
+
+    @Autowired
+    private OpenCourseService openCourseService;
+
+    @Autowired
+    private OpenCourseShoppingCarService openCourseShoppingCarService;
+
+    @OperationLog("更新 - 保存选课单")
+    @ApiOperation(value = "保存[选课单]")
+    @ApiImplicitParams(
+            @ApiImplicitParam(name = "accountChildId", value = "小孩标识", dataType = "String", paramType = "path", required = true, defaultValue = "")
+    )
+    @PostMapping("/child/{accountChildId}")
+    public ResponseEntity<Result> save(@PathVariable("accountChildId") String accountChildId, @Valid @RequestBody SearchDto params) {
+        String accountId = "";
+
+        /* 判断[开课]是否满足条件 */
+        Optional<OpenCourse> optional = openCourseService.findById(params.getId());
+        if (optional.isPresent()) {
+            OpenCourse _openCourse = optional.get();
+            if (!DateUtil.between(_openCourse.getSignUpStartTime(), _openCourse.getSignUpEndTime(), new Date()) || _openCourse.getFreeCourseNumber() <= 0) {
+                return new ResponseEntity(new Result().serverError(String.format("[%s]课程已过报名时间或名额已满", _openCourse.getName())), HttpStatus.OK);
+            }
+            OpenCourseShoppingCar _car = openCourseShoppingCarService.find(params.getId(), accountId, accountChildId);
+            if (Optional.ofNullable(_car).isPresent()) {
+                return new ResponseEntity(new Result().serverError("选课单已存在该课程"), HttpStatus.OK);
+            }
+
+            openCourseShoppingCarService.save(params.getId(), accountId, accountChildId);
+            return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+        }
+
+        return new ResponseEntity(new Result().serverError(), HttpStatus.INTERNAL_SERVER_ERROR);
+    }
+
+    @OperationLog("删除 - 删除选课单")
+    @ApiOperation(value = "删除[选课单]")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "accountChildId", value = "小孩标识", dataType = "String", paramType = "path", required = true, defaultValue = ""),
+            @ApiImplicitParam(name = "id", value = "开课标识", dataType = "String", paramType = "path", required = true, defaultValue = "")
+    })
+    @DeleteMapping("/child/{accountChildId}/{id}")
+    public ResponseEntity<Result> delete(@PathVariable("accountChildId") String accountChildId, @PathVariable("id") String id) {
+        String accountId = "";
+        openCourseShoppingCarService.delete(id, accountId, accountChildId);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+}

+ 106 - 0
430-platform-backend-master/src/main/java/com/app/controller/api/PayController.java

@@ -0,0 +1,106 @@
+package com.app.controller.api;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.entity.guardian.Guardian;
+import com.app.service.guardian.GuardianService;
+import com.app.service.order.OpenCourseOrderService;
+import com.app.util.DateUtil;
+import com.github.wxpay.sdk.WXPayUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.BufferedReader;
+import java.io.InputStreamReader;
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
+/**
+ * 微信支付接口签名校验工具
+ * https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1
+ */
+@Api(description = "支付")
+@Slf4j
+@Validated
+@RestController("ApiPayController")
+@RequestMapping("/api/pay")
+public class PayController {
+
+    @Autowired
+    private GuardianService guardianService;
+
+    @Autowired
+    private OpenCourseOrderService openCourseOrderService;
+
+    /**
+     * 功能描述:微信支付 - 回调通知
+     * 官方文档:
+     * 支付结果通知:
+     * https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_7&index=8
+     * <p>
+     * 回调通知注意事项:
+     * https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=23_8&index=5
+     *
+     * @param request
+     * @param response
+     * @return
+     * @throws Exception
+     */
+    @OperationLog("更新 - 微信支付回调")
+    @ApiOperation(value = "微信支付[回调]")
+    @PostMapping("/wx/notify")
+    public void wxNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
+        request.setCharacterEncoding("UTF-8");
+
+        /* 获取响应XML数据 */
+        BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream(), "UTF-8"));
+        String line = null;
+        StringBuilder sb = new StringBuilder();
+        while ((line = br.readLine()) != null) {
+            sb.append(line);
+        }
+        br.close();
+        String notityXml = sb.toString();
+        log.info("微信支付[回调] 参数:[{}]", notityXml);
+
+        Map<String, String> notityParamMap = WXPayUtil.xmlToMap(notityXml);
+        if (!"SUCCESS".equalsIgnoreCase(notityParamMap.get("return_code"))) {
+            log.error("微信支付[回调] 错误:[{}]", notityParamMap.get("return_msg"));
+        }
+
+        String orderId = notityParamMap.get("out_trade_no"); // 获取商户订单号
+        Optional<Guardian> optional = guardianService.findByOpenId(notityParamMap.get("openid"));
+        if (optional.isPresent()) {
+            Guardian _guardian = optional.get();
+
+            String transactionId = notityParamMap.get("transaction_id"); // 微信支付订单号
+            Double paidPrice = BigDecimal.valueOf(Integer.parseInt(notityParamMap.get("total_fee"))).divide(new BigDecimal(100)).doubleValue(); // 订单金额(分转元)
+            Date timeEnd = DateUtil.format(notityParamMap.get("time_end"), DateUtil.yyyyMMddHHmmss); // 支付完成时间
+            openCourseOrderService.payToEnd(orderId, _guardian.getId(), transactionId, paidPrice, timeEnd);
+
+            /* 构造 微信支付[回调] 正确响应内容 */
+            response.setCharacterEncoding("UTF-8");
+            response.setContentType("text/xml;charset=utf-8;");
+            response.setHeader("Access-Control-Allow-Origin", "*");
+            response.setStatus(HttpStatus.OK.value());
+            response.getWriter().write(WXPayUtil.mapToXml(new HashMap<String, String>(){{
+                put("return_code", "SUCCESS");
+                put("return_msg", "OK");
+            }}));
+        }
+    }
+
+    // todo 还缺一个退款通知的金额统计... https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_16&index=10
+
+}

+ 70 - 0
430-platform-backend-master/src/main/java/com/app/controller/api/SchoolController.java

@@ -0,0 +1,70 @@
+package com.app.controller.api;
+
+import com.app.dto.Result;
+import com.app.dto.basics.GradeClassDto;
+import com.app.entity.basics.School;
+import com.app.service.basics.SchoolService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.constraints.NotBlank;
+import java.util.List;
+
+/**
+ * 功能描述:学校
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(description = "学校")
+@Slf4j
+@Validated
+@RestController("ApiSchoolController")
+@RequestMapping("/api/school")
+public class SchoolController {
+
+    @Autowired
+    private SchoolService schoolService;
+
+    /**
+     * 功能描述:查询[城市名称]下的所有学校
+     *
+     * @param city 城市名称
+     * @return
+     */
+    @ApiOperation(value = "查询[城市名称]下的所有学校")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "city", value = "城市名称", dataType = "String", paramType = "path", required = true, defaultValue = "广州市")
+    })
+    @GetMapping("/{city}/list")
+    public ResponseEntity<Result<List<School>>> list(@NotBlank @PathVariable("city") String city) {
+        return new ResponseEntity(new Result().ok(schoolService.findByCity(city)), HttpStatus.OK);
+    }
+
+    /**
+     * 功能描述:获取[学校]的年级班级
+     *
+     * @param schoolId 学校标识
+     * @return
+     */
+    @ApiOperation(value = "获取[学校]的年级班级")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "schoolId", value = "学校标识", dataType = "String", paramType = "path", required = true, defaultValue = "")
+    })
+    @GetMapping("/{schoolId}/grade-class")
+    public ResponseEntity<Result<List<GradeClassDto>>> gradeClass(@NotBlank @PathVariable("schoolId") String schoolId) {
+        return new ResponseEntity(new Result().ok(schoolService.findByGradeClass(schoolId)), HttpStatus.OK);
+    }
+
+}

+ 73 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/AccountController.java

@@ -0,0 +1,73 @@
+package com.app.controller.platform;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.SearchDto;
+import com.app.dto.platform.AccountDto;
+import com.app.dto.platform.ResponseAccountDto;
+import com.app.dto.platform.SearchAccountDto;
+import com.app.service.platform.auth.AccountService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+/**
+ * 功能描述:
+ * https://www.jianshu.com/p/cf9ad8c3621d
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(tags = "账号管理")
+@Slf4j
+@RestController("PlatformAccountController")
+@RequestMapping("/platform/account")
+public class AccountController {
+
+    @Resource
+    private AccountService accountService;
+
+    /**
+     * 查询【账号】列表
+     *
+     */
+    @ApiOperation(value = "查询[账号]列表")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<ResponseAccountDto>>> page(@Valid @RequestBody SearchAccountDto params) {
+        return new ResponseEntity(new Result<>().ok(accountService.page(params)), HttpStatus.OK);
+    }
+
+    /**
+     * 保存/更新[账号]
+     *
+     */
+    @OperationLog("更新 - 账号")
+    @ApiOperation(value = "保存/更新[账号]")
+    @PostMapping("/save-or-update")
+    public ResponseEntity<Result> saveOrUpdate(@Valid @RequestBody AccountDto dto) {
+        accountService.saveOrUpdate(dto);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    /**
+     * 删除【账号】
+     */
+    @OperationLog("替换删除状态 - 账号")
+    @ApiOperation(value = "替换[账号]删除状态")
+    @PostMapping("/handle-is-del")
+    public ResponseEntity<Result> handleIsDel(@Valid @RequestBody SearchDto searchdto) {
+        accountService.handleIsDel(searchdto.getId());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+}

+ 45 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/AddressController.java

@@ -0,0 +1,45 @@
+package com.app.controller.platform;
+
+import com.app.dto.Result;
+import com.app.entity.platform.system.Address;
+import com.app.service.platform.AddressService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 功能描述:
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(tags = "地址管理")
+@Slf4j
+@RestController("PlatformAddressController")
+@RequestMapping("/platform/address")
+public class AddressController {
+
+    @Autowired
+    private AddressService addressService;
+
+    @ApiOperation(value = "查询[地址名称]底下的地址信息")
+    @ApiImplicitParams(
+            @ApiImplicitParam(name = "name", value = "地址名称", dataType = "String", paramType = "path", required = true, defaultValue = "广州市")
+    )
+    @GetMapping("/{name}/child")
+    public ResponseEntity<Result<Address>> addressFindNextLevel(@NotBlank @PathVariable("name") String name) {
+        return new ResponseEntity(new Result().ok(addressService.findNextLevel(name)), HttpStatus.OK);
+    }
+
+}

+ 89 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/DeptController.java

@@ -0,0 +1,89 @@
+package com.app.controller.platform;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.SearchDto;
+import com.app.dto.platform.ResponseNodeDto;
+import com.app.dto.platform.SearchDeptDto;
+import com.app.entity.platform.system.Dept;
+import com.app.service.platform.DeptService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 部门管理
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(tags = "部门管理")
+@Slf4j
+@RestController("PlatformDeptController")
+@RequestMapping("/platform/dept")
+public class DeptController {
+
+    @Resource
+    private DeptService deptService;
+
+    /**
+     * 查询【顶级部门】列表
+     *
+     */
+    @ApiOperation(value = "查询[顶级部门]列表")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<Dept>>> page(@Valid @RequestBody SearchDeptDto params) {
+        return new ResponseEntity(new Result<>().ok(deptService.page(params)), HttpStatus.OK);
+    }
+
+    /**
+     * 查询【非顶级部门】列表
+     *
+     */
+    @ApiOperation(value = "查询[非顶级部门]列表")
+    @PostMapping("/list")
+    public ResponseEntity<Result<List<Dept>>> list(@Valid @RequestBody SearchDeptDto params) {
+        return new ResponseEntity(new Result<>().ok(deptService.list(params)), HttpStatus.OK);
+    }
+
+    /**
+     * 查询【部门】节点树
+     *
+     */
+    @ApiOperation(value = "查询【部门】节点树")
+    @PostMapping("/nodes")
+    public ResponseEntity<Result<List<ResponseNodeDto>>> nodes() {
+        return new ResponseEntity(new Result<>().ok(deptService.getAllNodes()), HttpStatus.OK);
+    }
+
+    /**
+     * 保存/更新[部门]
+     *
+     */
+    @OperationLog("更新 - 部门")
+    @ApiOperation(value = "保存/更新[部门]")
+    @PostMapping("/save-or-update")
+    public ResponseEntity<Result> saveOrUpdate(@Valid @RequestBody Dept dto) {
+        deptService.saveOrUpdate(dto);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    @OperationLog("替换删除状态 - 部门")
+    @ApiOperation(value = "替换[部门]删除状态")
+    @PostMapping("/handle-is-del")
+    public ResponseEntity<Result> handleIsDel(@Valid @RequestBody SearchDto searchdto) {
+        deptService.handleIsDel(searchdto.getId());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+}

+ 116 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/DictController.java

@@ -0,0 +1,116 @@
+package com.app.controller.platform;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.SearchDto;
+import com.app.dto.platform.SearchDictDto;
+import com.app.dto.platform.SearchDictEntryDto;
+import com.app.entity.platform.system.Dict;
+import com.app.entity.platform.system.DictEntry;
+import com.app.service.platform.DictService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 字典管理
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(tags = "字典管理")
+@Slf4j
+@RestController("PlatformDictController")
+@RequestMapping("/platform/dict")
+public class DictController {
+
+    @Resource
+    private DictService dictService;
+
+    /**
+     * 查询【字典】列表
+     *
+     * @param params 搜索dto
+     * @return 响应结果
+     */
+    @ApiOperation(value = "查询[字典]列表")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<Dict>>> page(@Valid @RequestBody SearchDictDto params) {
+        return new ResponseEntity(new Result<>().ok(dictService.page(params)), HttpStatus.OK);
+    }
+
+    /**
+     * 保存/更新[字典]
+     *
+     */
+    @OperationLog("更新 - 字典")
+    @ApiOperation(value = "保存/更新[字典]")
+    @PostMapping("/save-or-update")
+    public ResponseEntity<Result> saveOrUpdate(@Valid @RequestBody Dict dict) {
+        if(dictService.saveOrUpdate(dict)!=null){
+            return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+        }
+        return new ResponseEntity(new Result().serverError("字典名称或已存在"), HttpStatus.OK);
+    }
+
+    /**
+     * 删除【字典】
+     */
+    @OperationLog("替换删除状态 - 字典")
+    @ApiOperation(value = "替换[字典]删除状态")
+    @PostMapping("/handle-is-del")
+    public ResponseEntity<Result> handleIsDel(@Valid @RequestBody SearchDto searchdto) {
+        dictService.handleIsDel(searchdto.getId());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+
+    /**
+     * 查询【部门实体】列表
+     *
+     * @param params 搜索dto
+     * @return 响应结果
+     */
+    @ApiOperation(value = "查询[部门实体]列表")
+    @PostMapping("/entry/list")
+    public ResponseEntity<Result<List<DictEntry>>> entryList(@Valid @RequestBody SearchDictEntryDto params) {
+        return new ResponseEntity(new Result<>().ok(dictService.entryList(params)), HttpStatus.OK);
+    }
+
+    /**
+     * 保存/更新[部门实体]
+     *
+     */
+    @OperationLog("更新 - 部门实体")
+    @ApiOperation(value = "保存/更新[部门实体]")
+    @PostMapping("/entry/save-or-update")
+    public ResponseEntity<Result> entrySaveOrUpdate(@Valid @RequestBody DictEntry entry) {
+        if(dictService.entrySaveOrUpdate(entry)!=null){
+            return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+        }
+        return new ResponseEntity(new Result().serverError("字典名称或已存在"), HttpStatus.OK);
+    }
+
+    /**
+     * 删除【部门实体】
+     */
+    @OperationLog("替换删除状态 - 部门实体")
+    @ApiOperation(value = "替换[部门实体]删除状态")
+    @PostMapping("/entry/handle-is-del")
+    public ResponseEntity<Result> entryHandleIsDel(@Valid @RequestBody SearchDto searchdto) {
+        dictService.entryHandleIsDel(searchdto.getId());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+}

+ 54 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/GitCommitController.java

@@ -0,0 +1,54 @@
+package com.app.controller.platform;
+
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+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 java.util.*;
+
+
+/**
+ * 功能描述:读取Git的信息
+ * 需要在pom.xml增加依赖
+ * pl.project13.maven
+ * git-commit-id-plugin
+ *
+ * @Author 梁展鹏
+ */
+@Api(value = "git info from git-commit-id-plugin")
+@Slf4j
+@RestController
+@RequestMapping("/platform/git-commit")
+public class GitCommitController {
+
+    @ApiOperation(value = "get commit info")
+    @GetMapping("/info")
+    public String showGitCommitInfo() {
+        // git.properties
+        ResourceBundle resourceBundle = ResourceBundle.getBundle("git", ObjectUtil.defaultIfNull(null, Locale.getDefault()));
+        Enumeration<String> keysEnumeration = resourceBundle.getKeys();
+
+        Map<String, String> map = new TreeMap<>();
+        while (keysEnumeration.hasMoreElements()) {
+            String key = keysEnumeration.nextElement();
+            map.put(key, resourceBundle.getString(key));
+        }
+
+        return JSON.toJSONString(map, SerializerFeature.PrettyFormat);
+    }
+
+    @ApiOperation(value = "get commit id")
+    @GetMapping("/id")
+    public String showGitCommitId() {
+        // git.properties
+        ResourceBundle resourceBundle = ResourceBundle.getBundle("git", ObjectUtil.defaultIfNull(null, Locale.getDefault()));
+        return resourceBundle.getString("git.commit.id");
+    }
+
+}

+ 87 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/JobController.java

@@ -0,0 +1,87 @@
+package com.app.controller.platform;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.SearchDto;
+import com.app.dto.platform.ResponseNodeDto;
+import com.app.dto.platform.SearchJobDto;
+import com.app.entity.platform.system.Job;
+import com.app.service.platform.JobService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 功能描述:岗位管理
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(tags = "岗位管理")
+@Slf4j
+@RestController("PlatformJobController")
+@RequestMapping("/platform/job")
+public class JobController {
+
+    @Resource
+    private JobService jobService;
+
+    /**
+     * 查询【岗位】列表
+     *
+     * @param params 搜索dto
+     * @return 响应结果
+     */
+    @ApiOperation(value = "查询[岗位管理]列表")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<Job>>> page(@Valid @RequestBody SearchJobDto params) {
+        return new ResponseEntity(new Result<>().ok(jobService.page(params)), HttpStatus.OK);
+    }
+
+    /**
+     * 保存/更新[岗位]
+     *
+     */
+    @OperationLog("更新 - 岗位")
+    @ApiOperation(value = "保存/更新[岗位管理]")
+    @PostMapping("/save-or-update")
+    public ResponseEntity<Result> saveOrUpdate(@Valid @RequestBody Job job) {
+        if(jobService.saveOrUpdate(job)!=null){
+            return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+        }
+        return new ResponseEntity(new Result().serverError("岗位或已存在"), HttpStatus.OK);
+    }
+
+    /**
+     * 删除【岗位】
+     */
+    @OperationLog("替换删除状态 - 岗位")
+    @ApiOperation(value = "替换[岗位管理]删除状态")
+    @PostMapping("/handle-is-del")
+    public ResponseEntity<Result> handleIsDel(@Valid @RequestBody SearchDto searchdto) {
+        jobService.handleIsDel(searchdto.getId());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    /**
+     * 查询【岗位】节点树
+     *
+     */
+    @ApiOperation(value = "查询【岗位】节点树")
+    @PostMapping("/nodes")
+    public ResponseEntity<Result<List<ResponseNodeDto>>> nodes() {
+        return new ResponseEntity(new Result<>().ok(jobService.getAllNodes()), HttpStatus.OK);
+    }
+
+}

+ 62 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/LogController.java

@@ -0,0 +1,62 @@
+package com.app.controller.platform;
+
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.platform.FrontErrorDto;
+import com.app.dto.platform.OperationLogDto;
+import com.app.dto.platform.SearchLogDto;
+import com.app.service.platform.monitor.OperationLogService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+
+/**
+ * 日志(包括操作、登录、异常日志)
+
+ */
+@Api(tags = "日志")
+@Slf4j
+@RestController("LogController")
+@RequestMapping("/platform/log")
+public class LogController {
+
+    @Resource
+    private OperationLogService operationLogService;
+
+    /**
+     * 查询【日志】列表
+     *
+     */
+    @ApiOperation(value = "查询[日志]列表")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<OperationLogDto>>> page(@Valid @RequestBody SearchLogDto dto) {
+        return new ResponseEntity(new Result<>().ok(operationLogService.page(dto)), HttpStatus.OK);
+    }
+
+    /**
+     * 删除所有日志
+     */
+    @ApiOperation(value = "删除所有日志")
+    @DeleteMapping("/delAll/{type}")
+    public ResponseEntity<Result> delAllLogs(@PathVariable("type") String type) {
+        operationLogService.delAllLogs(type);
+        return new ResponseEntity(new Result<>().ok(), HttpStatus.OK);
+    }
+
+    /**
+     * 接收前端错误日志
+     */
+    @ApiOperation(value = "接收前端错误日志")
+    @PostMapping("/reportForntError")
+    public ResponseEntity<Result> delAllLogs(@Valid @RequestBody FrontErrorDto dto, HttpServletRequest request) {
+        operationLogService.insertFrontErrorLog(request,dto);
+        return new ResponseEntity(new Result<>().ok(), HttpStatus.OK);
+    }
+}

+ 55 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/OnlineAccountController.java

@@ -0,0 +1,55 @@
+package com.app.controller.platform;
+
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.SearchDto;
+import com.app.dto.platform.SearchOnlineDto;
+import com.app.service.platform.auth.OnlineAccountService;
+import com.app.service.platform.dto.AccountDto;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+/**
+ * 在线用户
+
+ */
+@Api(tags = "在线用户")
+@Slf4j
+@RestController("OnlineAccountController")
+@RequestMapping("/platform/online")
+public class OnlineAccountController {
+
+    @Resource
+    private OnlineAccountService onlineAccountService;
+
+    /**
+     * 查询【在线用户】列表
+     *
+     */
+    @ApiOperation(value = "查询[在线用户]列表")
+    @PostMapping("/page")
+    public ResponseEntity<PageResult<AccountDto>> page(@Valid @RequestBody SearchOnlineDto dto) {
+        return new ResponseEntity(new Result<>().ok(onlineAccountService.page(dto)), HttpStatus.OK);
+    }
+
+    /**
+     * 踢【在线用户】下线
+     *
+     */
+    @ApiOperation(value = "踢【在线用户】下线")
+    @PostMapping("/kickOffline")
+    public ResponseEntity<Result> kickOffLine(@Valid @RequestBody SearchDto dto) {
+        onlineAccountService.kickOffLine(dto.getId());
+        return new ResponseEntity(new Result<>().ok(), HttpStatus.OK);
+    }
+}

+ 90 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/ResourceController.java

@@ -0,0 +1,90 @@
+package com.app.controller.platform;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.SearchDto;
+import com.app.dto.platform.ResponseMenuDto;
+import com.app.dto.platform.ResponseNodeDto;
+import com.app.dto.platform.SearchMenuDto;
+import com.app.service.platform.ResourceService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 功能描述:
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(tags = "资源管理")
+@Slf4j
+@RestController("PlatformResourceController")
+@RequestMapping("/platform/resource")
+public class ResourceController {
+
+    @Resource
+    private ResourceService menuService;
+
+    /**
+     * 查询【顶级菜单】列表
+     *
+     */
+    @ApiOperation(value = "查询[顶级菜单]列表")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<ResponseMenuDto>>> page(@Valid @RequestBody SearchMenuDto params) {
+        return new ResponseEntity(new Result<>().ok(menuService.page(params)), HttpStatus.OK);
+    }
+
+    /**
+     * 查询【非顶级菜单】列表
+     *
+     */
+    @ApiOperation(value = "查询[非顶级菜单]列表")
+    @PostMapping("/list")
+    public ResponseEntity<Result<List<ResponseMenuDto>>> list(@Valid @RequestBody SearchMenuDto params) {
+        return new ResponseEntity(new Result<>().ok(menuService.list(params)), HttpStatus.OK);
+    }
+
+    /**
+     * 查询【菜单】节点树
+     *
+     */
+    @ApiOperation(value = "查询【菜单】节点树")
+    @PostMapping("/nodes")
+    public ResponseEntity<Result<List<ResponseNodeDto>>> nodes() {
+        return new ResponseEntity(new Result<>().ok(menuService.getAllNodes()), HttpStatus.OK);
+    }
+
+    /**
+     * 保存/更新[菜单]
+     *
+     */
+    @OperationLog("更新 - 菜单")
+    @ApiOperation(value = "保存/更新[菜单]")
+    @PostMapping("/save-or-update")
+    public ResponseEntity<Result> saveOrUpdate(@Valid @RequestBody com.app.entity.platform.system.Resource dto) {
+        menuService.saveOrUpdate(dto);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    @OperationLog("替换删除状态 - 菜单")
+    @ApiOperation(value = "替换[菜单]删除状态")
+    @PostMapping("/handle-is-del")
+    public ResponseEntity<Result> handleIsDel(@Valid @RequestBody SearchDto searchdto) {
+        menuService.handleIsDel(searchdto.getId());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+}

+ 95 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/RoleController.java

@@ -0,0 +1,95 @@
+package com.app.controller.platform;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.dto.PageResult;
+import com.app.dto.Result;
+import com.app.dto.SearchDto;
+import com.app.dto.platform.*;
+import com.app.service.platform.RoleService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 功能描述:
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(tags = "角色管理")
+@Slf4j
+@RestController("PlatformRoleController")
+@RequestMapping("/platform/role")
+public class RoleController {
+
+    @Resource
+    private RoleService roleService;
+
+    /**
+     * 查询【角色】列表
+     */
+    @ApiOperation(value = "查询[角色]列表")
+    @PostMapping("/page")
+    public ResponseEntity<Result<PageResult<ResponseRoleDto>>> page(@Valid @RequestBody SearchRoleDto params) {
+        return new ResponseEntity(new Result<>().ok(roleService.page(params)), HttpStatus.OK);
+    }
+
+    /**
+     * 查询[菜单]节点
+     */
+    @ApiOperation(value = "查询[菜单]节点")
+    @PostMapping("/menu-nodes")
+    public ResponseEntity<List<ResponseNodeDto>> getMenuNodes() {
+        return new ResponseEntity(new Result<>().ok(roleService.getMenuNodes()), HttpStatus.OK);
+    }
+
+    /**
+     * 保存/更新[角色]
+     */
+    @OperationLog("更新 - 角色")
+    @ApiOperation(value = "保存/更新[角色]")
+    @PostMapping("/save-or-update")
+    public ResponseEntity<Result> saveOrUpdate(@Valid @RequestBody RoleDto dto) {
+        roleService.saveOrUpdate(dto);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    /**
+     * 保存/更新[菜单]权限
+     */
+    @OperationLog("更新 - 菜单权限")
+    @ApiOperation(value = "保存/更新[菜单]权限")
+    @PostMapping("/save-menu")
+    public ResponseEntity<Result> saveMenu(@Valid @RequestBody RoleMenuDto dto) {
+        roleService.saveMenu(dto);
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    @OperationLog("替换删除状态 - 角色")
+    @ApiOperation(value = "替换[角色]删除状态")
+    @PostMapping("/handle-is-del")
+    public ResponseEntity<Result> handleIsDel(@Valid @RequestBody SearchDto searchdto) {
+        roleService.handleIsDel(searchdto.getId());
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+    /**
+     * 查询【角色】节点树
+     *
+     */
+    @ApiOperation(value = "查询【角色】节点树")
+    @PostMapping("/nodes")
+    public ResponseEntity<Result<List<ResponseNodeDto>>> nodes() {
+        return new ResponseEntity(new Result<>().ok(roleService.getAllNodes()), HttpStatus.OK);
+    }
+}

+ 20 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/TenantController.java

@@ -0,0 +1,20 @@
+package com.app.controller.platform;
+
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 功能描述:
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/24 11:38
+ */
+@Api(tags = "租户管理")
+@Slf4j
+@RestController("PlatformTenantController")
+@RequestMapping("/platform/tenant")
+public class TenantController {
+
+}

+ 85 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/auth/AuthenticationController.java

@@ -0,0 +1,85 @@
+package com.app.controller.platform.auth;
+
+import com.app.annotation.platform.OperationLog;
+import com.app.controller.platform.request.WebAdminAccountLoginDto;
+import com.app.controller.platform.response.AccountInfoResponse;
+import com.app.controller.platform.response.LoginResponse;
+import com.app.dto.Result;
+import com.app.service.platform.auth.AuthenticationWebAdminService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+
+/**
+ * 功能描述:
+ *
+ * @Author 梁展鹏
+ */
+@Api(tags = "管理后台认证")
+@Slf4j
+@Validated
+@RestController("PlatformAuthenticationController")
+@RequestMapping("/platform/auth")
+public class AuthenticationController {
+
+    @Autowired
+    private AuthenticationWebAdminService service;
+
+    @ApiOperation(value = "获取图片验证码")
+    @GetMapping("/img-code")
+    public ResponseEntity<Result<?>> imgCode() {
+        return ResponseEntity.ok(service.imgCode());
+    }
+
+    @ApiOperation(value = "管理后台登录")
+    @PostMapping("/web-login")
+    public ResponseEntity<Result<LoginResponse>> login(@Valid @RequestBody WebAdminAccountLoginDto dto, HttpServletRequest request) {
+        return ResponseEntity.ok(service.login(dto, request));
+    }
+
+    @ApiOperation(value = "获取当前登录人信息")
+    @GetMapping("/info")
+    public ResponseEntity<Result<AccountInfoResponse>> info() {
+        return ResponseEntity.ok(service.info());
+    }
+
+    /**
+     * 功能描述:刷新token
+     *
+     * @param refreshToken
+     * @return
+     */
+    @ApiOperation(value = "刷新token")
+    @GetMapping("/refresh")
+    public ResponseEntity<Result> refresh(@RequestParam String refreshToken) {
+//        String username = (String) redisTemplate.opsForHash().get(refreshToken, "username");
+//        if (StringUtils.isEmpty(username)) {
+//            return new ResponseEntity<>(new Result(HttpStatus.UNAUTHORIZED, "refreshToken error", null), HttpStatus.UNAUTHORIZED);
+//        }
+
+        /* 生成新的token */
+//        UserDetails userDetails = null;
+//        Authentication authentication = new UsernamePasswordAuthenticationToken(userDetails, "", null);
+//        String newToken = jwtUtils.generateToken(authentication); // JWT签名
+//        redisTemplate.opsForHash().put(refreshToken, "token", newToken);
+
+//        newToken, refreshToken
+        return ResponseEntity.ok(null);
+    }
+
+    @ApiOperation(value = "退出登录")
+    @GetMapping("/logout")
+    public ResponseEntity<?> logout(HttpServletRequest request) {
+        service.logout();
+        return new ResponseEntity(new Result().ok(), HttpStatus.OK);
+    }
+
+}

+ 40 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/request/WebAdminAccountLoginDto.java

@@ -0,0 +1,40 @@
+package com.app.controller.platform.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * 功能描述:
+ *
+ * @Author 梁展鹏
+ */
+@ApiModel("管理后台-账号登录")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class WebAdminAccountLoginDto {
+
+    @ApiModelProperty("账号")
+    @NotBlank(message = "账号不能为空")
+    private String username;
+
+    @ApiModelProperty("密码")
+    @NotBlank(message = "密码不能为空")
+    private String password;
+
+    @ApiModelProperty("验证码")
+    @NotBlank(message = "验证码不能为空")
+    private String code;
+
+    @ApiModelProperty("验证唯一码")
+    @NotBlank(message = "验证唯一码不能为空")
+    private String uuid;
+
+}

+ 35 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/response/AccountInfoResponse.java

@@ -0,0 +1,35 @@
+package com.app.controller.platform.response;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * 功能描述:
+ *
+ * @Author 梁展鹏
+ * @Date 2021/1/16 09:49
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class AccountInfoResponse {
+
+    @ApiModelProperty("昵称")
+    private String nickname;
+
+    @ApiModelProperty("头像")
+    private String avatar;
+
+    @ApiModelProperty("简介")
+    private String introduction;
+
+    @ApiModelProperty("角色编码")
+    private List<String> roles;
+
+}

+ 28 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/response/ImgCodeDto.java

@@ -0,0 +1,28 @@
+package com.app.controller.platform.response;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 功能描述:
+ *
+ * @Author 梁展鹏
+ */
+@ApiModel("管理后台-图片验证码")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class ImgCodeDto {
+
+    @ApiModelProperty("图片验证码Base64格式")
+    private String base64Img;
+
+    @ApiModelProperty("唯一标识")
+    private String uuid;
+
+}

+ 27 - 0
430-platform-backend-master/src/main/java/com/app/controller/platform/response/LoginResponse.java

@@ -0,0 +1,27 @@
+package com.app.controller.platform.response;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 功能描述:
+ *
+ * @Author 梁展鹏
+ * @Date 2021/1/16 09:24
+ */
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class LoginResponse {
+
+    @ApiModelProperty("token")
+    private String token;
+
+    @ApiModelProperty("refreshToken")
+    private String refreshToken;
+
+}

+ 26 - 0
430-platform-backend-master/src/main/java/com/app/dto/CommonImgDto.java

@@ -0,0 +1,26 @@
+package com.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@ApiModel("客户端图片返回Dto")
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@Accessors(chain = true)
+public class CommonImgDto {
+
+    @ApiModelProperty("[欢迎页]logo")
+    private String welcomeLogo;
+
+    @ApiModelProperty("[支付协议]")
+    private String payAgreement;
+
+    @ApiModelProperty("[关于我们]logo")
+    private String aboutLogo;
+
+}

+ 29 - 0
430-platform-backend-master/src/main/java/com/app/dto/FileDto.java

@@ -0,0 +1,29 @@
+package com.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 功能描述:上传文件返回对象
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/19 09:49
+ */
+@ApiModel("上传文件返回Dto")
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@Accessors(chain = true)
+public class FileDto {
+
+    @ApiModelProperty("文件名")
+    private String fileName;
+
+    @ApiModelProperty("请求路径")
+    private String path;
+
+}

+ 38 - 0
430-platform-backend-master/src/main/java/com/app/dto/PageResult.java

@@ -0,0 +1,38 @@
+package com.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 功能描述:
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/19 09:49
+ */
+@ApiModel("统一返回分页Dto")
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@Accessors(chain = true)
+public class PageResult<T> implements Serializable {
+
+    @ApiModelProperty("页码")
+    private Integer page;
+
+    @ApiModelProperty("页大小")
+    private Integer size;
+
+    @ApiModelProperty("总数")
+    private Long total;
+
+    @ApiModelProperty("数据")
+    private List<T> data;
+
+}

+ 70 - 0
430-platform-backend-master/src/main/java/com/app/dto/Result.java

@@ -0,0 +1,70 @@
+package com.app.dto;
+
+import com.app.constant.EnumSerializer;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import org.springframework.http.HttpStatus;
+
+import java.io.Serializable;
+
+/**
+ * 功能描述:
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/19 09:49
+ */
+@ApiModel("统一返回Dto")
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@Accessors(chain = true)
+public class Result<T> implements Serializable {
+
+    @ApiModelProperty("响应码")
+    @JsonSerialize(using = EnumSerializer.class)
+    private HttpStatus code;
+
+    @ApiModelProperty("描述")
+    private String message;
+
+    @ApiModelProperty("数据")
+    private T data;
+
+    public Result ok() {
+        return new Result(HttpStatus.OK, "操作成功", null);
+    }
+
+    public Result ok(String message) {
+        return new Result(HttpStatus.OK, message, null);
+    }
+
+    public Result ok(T data) {
+        return new Result(HttpStatus.OK, "", data);
+    }
+
+    public Result ok(String message, T data) {
+        return new Result(HttpStatus.OK, message, data);
+    }
+
+    public Result serverError() {
+        return new Result(HttpStatus.INTERNAL_SERVER_ERROR, "服务器异常", null);
+    }
+
+    public Result serverError(String message) {
+        return new Result(HttpStatus.INTERNAL_SERVER_ERROR, message, null);
+    }
+
+    public Result serverError(T data) {
+        return new Result(HttpStatus.INTERNAL_SERVER_ERROR, "", data);
+    }
+
+    public Result serverError(String message, T data) {
+        return new Result(HttpStatus.INTERNAL_SERVER_ERROR, message, data);
+    }
+
+}

+ 22 - 0
430-platform-backend-master/src/main/java/com/app/dto/SearchDto.java

@@ -0,0 +1,22 @@
+package com.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@ApiModel("统一查询Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class SearchDto implements Serializable {
+
+    @ApiModelProperty("对象标识")
+    private String id;
+
+}

+ 31 - 0
430-platform-backend-master/src/main/java/com/app/dto/SearchPageDto.java

@@ -0,0 +1,31 @@
+package com.app.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.Min;
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+
+@ApiModel("统一查询分页Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class SearchPageDto implements Serializable {
+
+    @ApiModelProperty("页码")
+    @Min(1)
+    @NotNull
+    private Integer page;
+
+    @ApiModelProperty("页大小")
+    @Min(1)
+    @NotNull
+    private Integer size;
+
+}

+ 36 - 0
430-platform-backend-master/src/main/java/com/app/dto/account/operation/WXMPLoginDto.java

@@ -0,0 +1,36 @@
+package com.app.dto.account.operation;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotEmpty;
+
+/**
+ * 功能描述:
+ * 官方文档
+ * https://developers.weixin.qq.com/miniprogram/dev/api/open-api/user-info/wx.getUserInfo.html
+ */
+@ApiModel("[微信用户账号]认证Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class WXMPLoginDto {
+
+    @ApiModelProperty("code[wx.login]")
+    @NotEmpty
+    private String code;
+
+    @ApiModelProperty("encryptedData[wx.getUserInfo]")
+    @NotEmpty
+    private String encryptedData;
+
+    @ApiModelProperty("iv[wx.getUserInfo]")
+    @NotEmpty
+    private String iv;
+
+}

+ 27 - 0
430-platform-backend-master/src/main/java/com/app/dto/account/operation/WebLoginDto.java

@@ -0,0 +1,27 @@
+package com.app.dto.account.operation;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotEmpty;
+
+@ApiModel("Web登录Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class WebLoginDto {
+
+    @ApiModelProperty("账号")
+    @NotEmpty
+    private String username;
+
+    @ApiModelProperty("密码")
+    @NotEmpty
+    private String password;
+
+}

+ 48 - 0
430-platform-backend-master/src/main/java/com/app/dto/account/search/SearchAccountDto.java

@@ -0,0 +1,48 @@
+package com.app.dto.account.search;
+
+import com.app.dto.SearchPageDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@ApiModel("查询[账号]入参Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class SearchAccountDto extends SearchPageDto {
+
+    @ApiModelProperty("标识")
+    private String id;
+
+    @ApiModelProperty("微信昵称")
+    private String nickname;
+
+
+    @ApiModelProperty("小孩姓名")
+    private String childName;
+
+    @ApiModelProperty("手机号码")
+    private String phoneNumber;
+
+    @ApiModelProperty("学校标识")
+    private String schoolId;
+
+    /**
+     * @see com.app.constant.SchoolConstant#PRIMARY_SCHOOL
+     * @see com.app.constant.SchoolConstant#MIDDLE_SCHOOL
+     * @see com.app.constant.SchoolConstant#HIGH_SCHOOL
+     */
+    @ApiModelProperty("年级名称")
+    private String gradeName;
+
+    /**
+     * @see com.app.constant.SchoolConstant#CLASS_NAME_LIST
+     */
+    @ApiModelProperty("班级名称")
+    private String className;
+
+}

+ 29 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/GradeClassDto.java

@@ -0,0 +1,29 @@
+package com.app.dto.basics;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 功能描述:年级班级
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/17 14:03
+ */
+@ApiModel("年级班级Dto")
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@Accessors(chain = true)
+public class GradeClassDto {
+
+    @ApiModelProperty("年级名称")
+    private String gradeName;
+
+    @ApiModelProperty("班级名称")
+    private String className;
+
+}

+ 43 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/ResponseCourseDto.java

@@ -0,0 +1,43 @@
+package com.app.dto.basics;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@ApiModel("课程响应dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ResponseCourseDto {
+    @ApiModelProperty("标识")
+    private String id;
+
+    @ApiModelProperty("机构id")
+    private String organId;
+
+    @ApiModelProperty("课程名称")
+    private String name;
+
+    @ApiModelProperty("缩略图")
+    private String thumbnail;
+
+    @ApiModelProperty("横幅")
+    private String banner;
+
+    @ApiModelProperty("类型")
+    private String type;
+
+    @ApiModelProperty("课程介绍")
+    private String introduceUrl;
+
+    @ApiModelProperty("课程价格")
+    private Double price;
+
+    @ApiModelProperty("备注")
+    private String remarks;
+
+    @ApiModelProperty("机构名称")
+    private String organName;
+}

+ 50 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/ResponseSchoolDto.java

@@ -0,0 +1,50 @@
+package com.app.dto.basics;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+@ApiModel("学校响应dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ResponseSchoolDto {
+
+    @ApiModelProperty("标识")
+    private String id;
+
+    @ApiModelProperty("机构id")
+    private String organId;
+
+    @ApiModelProperty("学校名称")
+    private String name;
+
+    @ApiModelProperty("年级")
+    private String gradeYear;
+
+    @ApiModelProperty("省级名称")
+    private String province;
+
+    @ApiModelProperty("城市名称")
+    private String city;
+
+    @ApiModelProperty("行政区名称")
+    private String area;
+
+    @ApiModelProperty("备注")
+    private String remarks;
+
+    @ApiModelProperty("更新时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime updateAt;
+
+    @ApiModelProperty("机构名称")
+    private String organName;
+}

+ 39 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/ResponseTeacherDto.java

@@ -0,0 +1,39 @@
+package com.app.dto.basics;
+
+import com.app.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@ApiModel("查询[学校]入参Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class ResponseTeacherDto  extends BaseEntity {
+
+    @ApiModelProperty("名称")
+    private String name;
+
+    @ApiModelProperty("性别")
+    private String gender;
+
+    @ApiModelProperty("教师简介")
+    private String context;
+
+    @ApiModelProperty("教师头像")
+    private String avatarUrl;
+
+    @ApiModelProperty("标签")
+    private String tag;
+
+    @ApiModelProperty("机构id")
+    private String organId;
+
+    @ApiModelProperty("机构名称")
+    private String organName;
+
+}

+ 43 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/SaveTeacherDto.java

@@ -0,0 +1,43 @@
+package com.app.dto.basics;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@ApiModel("操作[机构教师]入参Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class SaveTeacherDto {
+
+    @ApiModelProperty("id")
+    private String id;
+
+    @ApiModelProperty("名称")
+    private String name;
+
+    @ApiModelProperty("性别")
+    private String gender;
+
+    @ApiModelProperty("教师简介")
+    private String context;
+
+    @ApiModelProperty("教师头像")
+    private String avatarUrl;
+
+    @ApiModelProperty("标签")
+    private List<String> tag;
+
+    @ApiModelProperty("机构id")
+    private String organId;
+
+    @ApiModelProperty("机构名称")
+    private String organName;
+
+}

+ 29 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/SchoolYearSemesterDto.java

@@ -0,0 +1,29 @@
+package com.app.dto.basics;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+/**
+ * 功能描述:课程
+ *
+ * @Auther: 梁展鹏
+ * @Date: 2018/7/17 14:03
+ */
+@ApiModel("学年学期Dto")
+@NoArgsConstructor
+@AllArgsConstructor
+@Data
+@Accessors(chain = true)
+public class SchoolYearSemesterDto {
+
+    @ApiModelProperty("学年")
+    private Integer schoolYear;
+
+    @ApiModelProperty("学期")
+    private Integer semester;
+
+}

+ 45 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/operation/CourseDto.java

@@ -0,0 +1,45 @@
+package com.app.dto.basics.operation;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@ApiModel("保存/更新[课程]入参Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class CourseDto {
+
+    @ApiModelProperty("标识")
+    private String id;
+
+    @ApiModelProperty("课程名称")
+    private String name;
+
+    @ApiModelProperty("缩略图")
+    private String thumbnail;
+
+    @ApiModelProperty("横幅")
+    private String banner;
+
+    @ApiModelProperty("横幅")
+    private String type;
+
+    @ApiModelProperty("课程价格")
+    private Double price;
+
+    @ApiModelProperty("课程介绍")
+    private String introduceUrl;
+
+    @ApiModelProperty("备注")
+    private String remarks;
+
+    @ApiModelProperty("机构id")
+    private String organId;
+
+
+}

+ 36 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/operation/NewsDto.java

@@ -0,0 +1,36 @@
+package com.app.dto.basics.operation;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@ApiModel("保存or更新[新闻资讯]入参Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class NewsDto {
+
+    @ApiModelProperty("标识")
+    private String id;
+
+    @ApiModelProperty("标题")
+    private String title;
+
+    @ApiModelProperty("图片")
+    private String images;
+
+    @ApiModelProperty("发布机构/人")
+    private String author;
+
+    @ApiModelProperty("内容")
+    private String content;
+
+    @ApiModelProperty("机构id")
+    private String organId;
+
+
+}

+ 98 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/operation/OpenCourseDto.java

@@ -0,0 +1,98 @@
+package com.app.dto.basics.operation;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.Date;
+
+@ApiModel("保存/更新[开课]入参Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class OpenCourseDto {
+
+    @ApiModelProperty("标识")
+    private String id;
+
+    @ApiModelProperty("课程标识")
+    private String courseId;
+
+    @ApiModelProperty("机构id")
+    private String organId;
+
+    @ApiModelProperty("学年")
+    private Integer schoolYear;
+
+    @ApiModelProperty("学期")
+    private Integer semester;
+
+    @ApiModelProperty("学校标识")
+    private String schoolId;
+
+    @ApiModelProperty("学校名称")
+    private String schoolName;
+
+    /**
+     * 年级名称
+     *
+     * @see com.app.constant.SchoolConstant#PRIMARY_SCHOOL
+     * @see com.app.constant.SchoolConstant#MIDDLE_SCHOOL
+     * @see com.app.constant.SchoolConstant#HIGH_SCHOOL
+     */
+    @ApiModelProperty("年级名称")
+    private String gradeName;
+
+    @ApiModelProperty("课程名称")
+    private String name;
+
+    @ApiModelProperty("缩略图")
+    private String thumbnail;
+
+    @ApiModelProperty("横幅")
+    private String banner;
+
+    /**
+     * @see com.app.constant.OpenCourseConstant.OpenCourseType
+     */
+    @ApiModelProperty("课程类型")
+    private String type;
+
+    @ApiModelProperty("课程价格")
+    private Double price;
+
+    @ApiModelProperty("课程介绍")
+    private String introduceUrl;
+
+    @ApiModelProperty("星期X")
+    private String cycle;
+
+    @ApiModelProperty("时间段")
+    private String hours;
+
+    @ApiModelProperty("开班人数")
+    private Integer openCourseNumber;
+
+    @ApiModelProperty("空闲人数")
+    private Integer freeCourseNumber;
+
+    @ApiModelProperty("报名开始时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date signUpStartTime;
+
+    @ApiModelProperty("报名结束时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date signUpEndTime;
+
+    @ApiModelProperty("微信群二维码")
+    private String wxGroupQRUrl;
+
+    @ApiModelProperty("备注")
+    private String remarks;
+
+}

+ 45 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/operation/ResponseCommentDto.java

@@ -0,0 +1,45 @@
+package com.app.dto.basics.operation;
+
+import com.app.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@ApiModel("保存/更新[评论]出参Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class ResponseCommentDto extends BaseEntity {
+
+    @ApiModelProperty("账户id")
+    private String accountId;
+
+    @ApiModelProperty("账户名称")
+    private String accountName;
+
+    @ApiModelProperty("是否可见")
+    private Integer visable;
+
+    @ApiModelProperty("正文")
+    private String context;
+
+    @ApiModelProperty("父级id")
+    private String parentId;
+
+    @ApiModelProperty("开课id")
+    private String openCourseId;
+
+    @ApiModelProperty("开课名称")
+    private String openCourseName;
+
+    @ApiModelProperty("课程id")
+    private String courseId;
+
+    @ApiModelProperty("课程名称")
+    private String courseName;
+
+}

+ 47 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/operation/SchoolDto.java

@@ -0,0 +1,47 @@
+package com.app.dto.basics.operation;
+
+
+import com.app.dto.SearchDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import javax.validation.constraints.NotEmpty;
+
+@ApiModel("保存/更新[学校]入参Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class SchoolDto extends SearchDto {
+
+    @ApiModelProperty("学校名称")
+    @NotEmpty
+    private String name;
+
+    @ApiModelProperty("年级")
+    @NotEmpty
+    private String gradeYear;
+
+    @ApiModelProperty("省级名称")
+    @NotEmpty
+    private String province;
+
+    @ApiModelProperty("城市名称")
+    @NotEmpty
+    private String city;
+
+    @ApiModelProperty("行政区名称")
+    @NotEmpty
+    private String area;
+
+    @ApiModelProperty("备注")
+    private String remarks;
+
+    @ApiModelProperty("机构id")
+    private String organId;
+
+}

+ 23 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/operation/TimetablesDto.java

@@ -0,0 +1,23 @@
+package com.app.dto.basics.operation;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@ApiModel("保存/更新[开课]入参Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class TimetablesDto {
+
+    @ApiModelProperty("标题")
+    private String title;
+
+    @ApiModelProperty("时间")
+    private String start;
+
+}

+ 41 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/search/SaveTeacherTagDto.java

@@ -0,0 +1,41 @@
+package com.app.dto.basics.search;
+
+import com.app.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@ApiModel("查询[学校]入参Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class SaveTeacherTagDto extends BaseEntity {
+
+    @ApiModelProperty("名称")
+    private String name;
+
+    @ApiModelProperty("性别")
+    private String gender;
+
+    @ApiModelProperty("教师简介")
+    private String context;
+
+    @ApiModelProperty("教师头像")
+    private String avatarUrl;
+
+    @ApiModelProperty("标签")
+    private List<String> tag;
+
+    @ApiModelProperty("机构id")
+    private String organId;
+
+    @ApiModelProperty("机构名称")
+    private String organName;
+
+}

+ 46 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/search/SearchCommentDto.java

@@ -0,0 +1,46 @@
+package com.app.dto.basics.search;
+
+import com.app.dto.SearchPageDto;
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@ApiModel("查询[课程]入参Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class SearchCommentDto extends SearchPageDto {
+
+    @ApiModelProperty("是否删除")
+    private Boolean isDel;
+
+    @ApiModelProperty("账户id")
+    @TableField(value = "account_id")
+    private String accountId;
+
+    @ApiModelProperty("是否可见")
+    @TableField(value = "visable")
+    private Integer visable;
+
+    @ApiModelProperty("正文")
+    @TableField(value = "context")
+    private String context;
+
+    @ApiModelProperty("父级id")
+    @TableField(value = "parent_id")
+    private String parentId;
+
+    @ApiModelProperty("标签")
+    @TableField(value = "open_course_id")
+    private String openCourseId;
+
+    @ApiModelProperty("课程id")
+    @TableField(value = "course_id")
+    private String courseId;
+
+}

+ 29 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/search/SearchCourseDto.java

@@ -0,0 +1,29 @@
+package com.app.dto.basics.search;
+
+import com.app.dto.SearchPageDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@ApiModel("查询[课程]入参Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class SearchCourseDto extends SearchPageDto {
+
+    @ApiModelProperty("是否删除")
+    private Boolean isDel;
+
+    @ApiModelProperty("课程名称")
+    private String name;
+
+    @ApiModelProperty("机构ids")
+    private List<String> organIds;
+
+}

+ 29 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/search/SearchNewsDto.java

@@ -0,0 +1,29 @@
+package com.app.dto.basics.search;
+
+import com.app.dto.SearchPageDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@ApiModel("查询[新闻资讯]入参Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class SearchNewsDto extends SearchPageDto {
+
+    @ApiModelProperty("是否删除")
+    private Boolean isDel;
+
+    @ApiModelProperty("新闻标题")
+    private String title;
+
+    @ApiModelProperty("机构ids")
+    private List<String> organIds;
+
+}

+ 44 - 0
430-platform-backend-master/src/main/java/com/app/dto/basics/search/SearchOpenCourseDto.java

@@ -0,0 +1,44 @@
+package com.app.dto.basics.search;
+
+import com.app.dto.SearchPageDto;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+@ApiModel("查询[开课]入参Dto")
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class SearchOpenCourseDto extends SearchPageDto {
+
+    @ApiModelProperty("是否删除")
+    private Boolean isDel;
+
+    @ApiModelProperty("学年")
+    private Integer schoolYear;
+
+    @ApiModelProperty("学期")
+    private Integer semester;
+
+    @ApiModelProperty("学校标识")
+    private String schoolId;
+
+    @ApiModelProperty("课程名称")
+    private String name;
+
+    /**
+     * @see com.app.constant.OpenCourseConstant.OpenCourseType
+     */
+    @ApiModelProperty("课程类型")
+    private String type;
+
+    @ApiModelProperty("机构ids")
+    private List<String> organIds;
+
+}

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików