Pārlūkot izejas kodu

20230807初始化

15143018065 1 gadu atpakaļ
revīzija
fd861f3865
100 mainītis faili ar 63559 papildinājumiem un 0 dzēšanām
  1. 28 0
      .gitignore
  2. 53 0
      .workflow/BranchPipeline.yml
  3. 51 0
      .workflow/MasterPipeline.yml
  4. 40 0
      .workflow/PRPipeline.yml
  5. 254 0
      GitHelp.md
  6. 201 0
      LICENSE
  7. 161 0
      README.md
  8. 1 0
      _config.yml
  9. 4313 0
      _sql/ccbpm.sql
  10. 3909 0
      _sql/platform.sql
  11. 46217 0
      _sql/sys_region.sql
  12. 2 0
      platform-admin/.gitignore
  13. 9 0
      platform-admin/.settings/.gitignore
  14. 108 0
      platform-admin/pom.xml
  15. 135 0
      platform-admin/src/main/java/com/platform/aop/DataFilterAspect.java
  16. 73 0
      platform-admin/src/main/java/com/platform/aop/RedisCacheAspect.java
  17. 93 0
      platform-admin/src/main/java/com/platform/aop/SysLogAspect.java
  18. 114 0
      platform-admin/src/main/java/com/platform/controller/SysConfigController.java
  19. 160 0
      platform-admin/src/main/java/com/platform/controller/SysDeptController.java
  20. 44 0
      platform-admin/src/main/java/com/platform/controller/SysLogController.java
  21. 150 0
      platform-admin/src/main/java/com/platform/controller/SysMacroController.java
  22. 152 0
      platform-admin/src/main/java/com/platform/controller/SysOssController.java
  23. 30 0
      platform-admin/src/main/java/com/platform/controller/SysPageController.java
  24. 195 0
      platform-admin/src/main/java/com/platform/controller/SysRegionController.java
  25. 124 0
      platform-admin/src/main/java/com/platform/controller/SysSmsLogController.java
  26. 28 0
      platform-admin/src/main/java/com/platform/dao/SysOssDao.java
  27. 37 0
      platform-admin/src/main/java/com/platform/entity/SysOssEntity.java
  28. 26 0
      platform-admin/src/main/java/com/platform/service/SysOssService.java
  29. 30 0
      platform-admin/src/main/java/com/platform/service/impl/SysOssServiceImpl.java
  30. 45 0
      platform-admin/src/main/java/com/platform/task/TestTask.java
  31. 7 0
      platform-admin/src/main/resources/caffeine.properties
  32. 14 0
      platform-admin/src/main/resources/com/platform/dao/SysOssDao.xml
  33. 66 0
      platform-admin/src/main/resources/dev/log4j.properties
  34. 58 0
      platform-admin/src/main/resources/dev/platform.properties
  35. 67 0
      platform-admin/src/main/resources/ehcache.xml
  36. 95 0
      platform-admin/src/main/resources/j2cache.properties
  37. 14 0
      platform-admin/src/main/resources/mybatis.xml
  38. 43 0
      platform-admin/src/main/resources/network.xml
  39. 59 0
      platform-admin/src/main/resources/prod/log4j.properties
  40. 58 0
      platform-admin/src/main/resources/prod/platform.properties
  41. 157 0
      platform-admin/src/main/resources/spring-jdbc.xml
  42. 123 0
      platform-admin/src/main/resources/spring-mvc.xml
  43. 9 0
      platform-admin/src/main/webapp/WEB-INF/dispatcher-servlet.xml
  44. 48 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/config.html
  45. 64 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/dept.html
  46. 27 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/generator.html
  47. 64 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/header.html
  48. 4154 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/icon.html
  49. 26 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/log.html
  50. 82 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/macro.html
  51. 54 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/main.html
  52. 97 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/menu.html
  53. 144 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/oss.html
  54. 80 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/region.html
  55. 72 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/role.html
  56. 101 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/schedule.html
  57. 26 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/schedule_log.html
  58. 57 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/smslog.html
  59. 80 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/user.html
  60. 206 0
      platform-admin/src/main/webapp/WEB-INF/page/test/iviewDemo.html
  61. 15 0
      platform-admin/src/main/webapp/WEB-INF/velocity-toolbox.xml
  62. 111 0
      platform-admin/src/main/webapp/WEB-INF/web.xml
  63. 66 0
      platform-admin/src/main/webapp/WF/CC.htm
  64. 66 0
      platform-admin/src/main/webapp/WF/Complete.htm
  65. 162 0
      platform-admin/src/main/webapp/WF/Dev2Interface.js
  66. 102 0
      platform-admin/src/main/webapp/WF/Draft.htm
  67. 102 0
      platform-admin/src/main/webapp/WF/Focus.htm
  68. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Add.gif
  69. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Add.png
  70. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/AddLeader.png
  71. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Adjunct.gif
  72. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Advanced.png
  73. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Allot.png
  74. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/AllotTask.gif
  75. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Apply.gif
  76. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Authorize.gif
  77. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Back.gif
  78. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Back.png
  79. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Balance.GIF
  80. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Balance.JPG
  81. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Batch.png
  82. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Book.gif
  83. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/CC.gif
  84. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/CC.png
  85. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/CH.gif
  86. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/CH.png
  87. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Cancel.gif
  88. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Card.gif
  89. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Chart.gif
  90. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Check.png
  91. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/ChoseChart.gif
  92. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/ChoseCol.gif
  93. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/ChoseCols.gif
  94. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/ChoseD.gif
  95. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/ChoseField.gif
  96. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/ChoseNum.gif
  97. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Clear.GIF
  98. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Close.gif
  99. BIN
      platform-admin/src/main/webapp/WF/Img/Btn/Close.png
  100. 0 0
      platform-admin/src/main/webapp/WF/Img/Btn/ComeBackFlow.gif

+ 28 - 0
.gitignore

@@ -0,0 +1,28 @@
+# Compiled class file
+*.class
+*.idea
+*.iml
+*/target/
+
+# 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*
+/.project
+yarn.lock

+ 53 - 0
.workflow/BranchPipeline.yml

@@ -0,0 +1,53 @@
+version: '1.0'
+name: branch-pipeline
+displayName: BranchPipeline
+stages:
+  - stage: 
+    name: compile
+    displayName: 编译
+    steps:
+      - step: build@maven
+        name: build_maven
+        displayName: Maven 构建
+        # 支持6、7、8、9、10、11六个版本
+        jdkVersion: 8
+        # 支持2.2.1、3.2.5、3.3.9、3.5.2、3.5.3、3.5.4、3.6.1、3.6.3八个版本
+        mavenVersion: 3.3.9
+        # 构建命令
+        commands:
+          - mvn -B clean package -Dmaven.test.skip=true
+        # 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,7天后自动清除
+        artifacts:
+            # 构建产物名字,作为产物的唯一标识可向下传递,支持自定义,默认为BUILD_ARTIFACT。在下游可以通过${BUILD_ARTIFACT}方式引用来获取构建物地址
+          - name: BUILD_ARTIFACT
+            # 构建产物获取路径,是指代码编译完毕之后构建物的所在路径,如通常jar包在target目录下。当前目录为代码库根目录
+            path:
+              - ./target
+      - step: publish@general_artifacts
+        name: publish_general_artifacts
+        displayName: 上传制品
+        # 上游构建任务定义的产物名,默认BUILD_ARTIFACT
+        dependArtifact: BUILD_ARTIFACT
+        # 上传到制品库时的制品命名,默认output
+        artifactName: output
+        dependsOn: build_maven
+  - stage: 
+    name: release
+    displayName: 发布
+    steps:
+      - step: publish@release_artifacts
+        name: publish_release_artifacts
+        displayName: '发布'
+        # 上游上传制品任务的产出
+        dependArtifact: output
+        # 发布制品版本号
+        version: '1.0.0.0'
+        # 是否开启版本号自增,默认开启
+        autoIncrement: true
+triggers:
+  push:
+    branches:
+      exclude:
+        - master
+      include:
+        - .*

+ 51 - 0
.workflow/MasterPipeline.yml

@@ -0,0 +1,51 @@
+version: '1.0'
+name: master-pipeline
+displayName: MasterPipeline
+stages:
+  - stage: 
+    name: compile
+    displayName: 编译
+    steps:
+      - step: build@maven
+        name: build_maven
+        displayName: Maven 构建
+        # 支持6、7、8、9、10、11六个版本
+        jdkVersion: 8
+        # 支持2.2.1、3.2.5、3.3.9、3.5.2、3.5.3、3.5.4、3.6.1、3.6.3八个版本
+        mavenVersion: 3.3.9
+        # 构建命令
+        commands:
+          - mvn -B clean package -Dmaven.test.skip=true
+        # 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,7天后自动清除
+        artifacts:
+            # 构建产物名字,作为产物的唯一标识可向下传递,支持自定义,默认为BUILD_ARTIFACT。在下游可以通过${BUILD_ARTIFACT}方式引用来获取构建物地址
+          - name: BUILD_ARTIFACT
+            # 构建产物获取路径,是指代码编译完毕之后构建物的所在路径,如通常jar包在target目录下。当前目录为代码库根目录
+            path:
+              - ./target
+      - step: publish@general_artifacts
+        name: publish_general_artifacts
+        displayName: 上传制品
+        # 上游构建任务定义的产物名,默认BUILD_ARTIFACT
+        dependArtifact: BUILD_ARTIFACT
+        # 上传到制品库时的制品命名,默认output
+        artifactName: output
+        dependsOn: build_maven
+  - stage: 
+    name: release
+    displayName: 发布
+    steps:
+      - step: publish@release_artifacts
+        name: publish_release_artifacts
+        displayName: '发布'
+        # 上游上传制品任务的产出
+        dependArtifact: output
+        # 发布制品版本号
+        version: '1.0.0.0'
+        # 是否开启版本号自增,默认开启
+        autoIncrement: true
+triggers:
+  push:
+    branches:
+      include:
+        - master

+ 40 - 0
.workflow/PRPipeline.yml

@@ -0,0 +1,40 @@
+version: '1.0'
+name: pr-pipeline
+displayName: PRPipeline
+stages:
+  - stage: 
+    name: compile
+    displayName: 编译
+    steps:
+      - step: build@maven
+        name: build_maven
+        displayName: Maven 构建
+        # 支持6、7、8、9、10、11六个版本
+        jdkVersion: 8
+        # 支持2.2.1、3.2.5、3.3.9、3.5.2、3.5.3、3.5.4、3.6.1、3.6.3八个版本
+        mavenVersion: 3.3.9
+        # 构建命令
+        commands:
+          - mvn -B clean package -Dmaven.test.skip=true
+        # 非必填字段,开启后表示将构建产物暂存,但不会上传到制品库中,7天后自动清除
+        artifacts:
+            # 构建产物名字,作为产物的唯一标识可向下传递,支持自定义,默认为BUILD_ARTIFACT。在下游可以通过${BUILD_ARTIFACT}方式引用来获取构建物地址
+          - name: BUILD_ARTIFACT
+            # 构建产物获取路径,是指代码编译完毕之后构建物的所在路径,如通常jar包在target目录下。当前目录为代码库根目录
+            path:
+              - ./target
+      - step: publish@general_artifacts
+        name: publish_general_artifacts
+        displayName: 上传制品
+        # 上游构建任务定义的产物名,默认BUILD_ARTIFACT
+        dependArtifact: BUILD_ARTIFACT
+        # 构建产物制品库,默认default,系统默认创建
+        artifactRepository: default
+        # 上传到制品库时的制品命名,默认output
+        artifactName: output
+        dependsOn: build_maven
+triggers:
+  pr:
+    branches:
+      include:
+        - master

+ 254 - 0
GitHelp.md

@@ -0,0 +1,254 @@
+## Git 常用命令
+
+#### 仓库
+    # 在当前目录新建一个Git代码库
+    $ git init
+    
+    # 新建一个目录,将其初始化为Git代码库
+    $ git init [project-name]
+    
+    # 下载一个项目和它的整个代码历史
+    $ git clone [url]
+    
+#### 配置
+    # 显示当前的Git配置
+    $ git config --list
+    
+    # 编辑Git配置文件
+    $ git config -e [--global]
+    
+    # 设置提交代码时的用户信息
+    $ git config [--global] user.name "[name]"
+    $ git config [--global] user.email "[email address]"
+    
+#### 增加/删除文件
+    # 添加指定文件到暂存区
+    $ git add [file1] [file2] ...
+    
+    # 添加指定目录到暂存区,包括子目录
+    $ git add [dir]
+    
+    # 添加当前目录的所有文件到暂存区
+    $ git add .
+    
+    # 添加每个变化前,都会要求确认
+    # 对于同一个文件的多处变化,可以实现分次提交
+    $ git add -p
+    
+    # 删除工作区文件,并且将这次删除放入暂存区
+    $ git rm [file1] [file2] ...
+    
+    # 停止追踪指定文件,但该文件会保留在工作区
+    $ git rm --cached [file]
+    
+    # 改名文件,并且将这个改名放入暂存区
+    $ git mv [file-original] [file-renamed]
+    
+#### 代码提交
+    # 提交暂存区到仓库区
+    $ git commit -m [message]
+    
+    # 提交暂存区的指定文件到仓库区
+    $ git commit [file1] [file2] ... -m [message]
+    
+    # 提交工作区自上次commit之后的变化,直接到仓库区
+    $ git commit -a
+    
+    # 提交时显示所有diff信息
+    $ git commit -v
+    
+    # 使用一次新的commit,替代上一次提交
+    # 如果代码没有任何新变化,则用来改写上一次commit的提交信息
+    $ git commit --amend -m [message]
+    
+    # 重做上一次commit,并包括指定文件的新变化
+    $ git commit --amend [file1] [file2] ...
+    
+#### 分支
+    # 列出所有本地分支
+    $ git branch
+    
+    # 列出所有远程分支
+    $ git branch -r
+    
+    # 列出所有本地分支和远程分支
+    $ git branch -a
+    
+    # 新建一个分支,但依然停留在当前分支
+    $ git branch [branch-name]
+    
+    # 新建一个分支,并切换到该分支
+    $ git checkout -b [branch]
+    
+    # 新建一个分支,指向指定commit
+    $ git branch [branch] [commit]
+    
+    # 新建一个分支,与指定的远程分支建立追踪关系
+    $ git branch --track [branch] [remote-branch]
+    
+    # 切换到指定分支,并更新工作区
+    $ git checkout [branch-name]
+    
+    # 切换到上一个分支
+    $ git checkout -
+    
+    # 建立追踪关系,在现有分支与指定的远程分支之间
+    $ git branch --set-upstream [branch] [remote-branch]
+    
+    # 合并指定分支到当前分支
+    $ git merge [branch]
+    
+    # 选择一个commit,合并进当前分支
+    $ git cherry-pick [commit]
+    
+    # 删除分支
+    $ git branch -d [branch-name]
+    
+    # 删除远程分支
+    $ git push origin --delete [branch-name]
+    $ git branch -dr [remote/branch]
+    
+#### 标签
+    # 列出所有tag
+    $ git tag
+    
+    # 新建一个tag在当前commit
+    $ git tag [tag]
+    
+    # 新建一个tag在指定commit
+    $ git tag [tag] [commit]
+    
+    # 删除本地tag
+    $ git tag -d [tag]
+    
+    # 删除远程tag
+    $ git push origin :refs/tags/[tagName]
+    
+    # 查看tag信息
+    $ git show [tag]
+    
+    # 提交指定tag
+    $ git push [remote] [tag]
+    
+    # 提交所有tag
+    $ git push [remote] --tags
+    
+    # 新建一个分支,指向某个tag
+    $ git checkout -b [branch] [tag]
+#### 查看信息
+    # 显示有变更的文件
+    $ git status
+    
+    # 显示当前分支的版本历史
+    $ git log
+    
+    # 显示commit历史,以及每次commit发生变更的文件
+    $ git log --stat
+    
+    # 搜索提交历史,根据关键词
+    $ git log -S [keyword]
+    
+    # 显示某个commit之后的所有变动,每个commit占据一行
+    $ git log [tag] HEAD --pretty=format:%s
+    
+    # 显示某个commit之后的所有变动,其"提交说明"必须符合搜索条件
+    $ git log [tag] HEAD --grep feature
+    
+    # 显示某个文件的版本历史,包括文件改名
+    $ git log --follow [file]
+    $ git whatchanged [file]
+    
+    # 显示指定文件相关的每一次diff
+    $ git log -p [file]
+    
+    # 显示过去5次提交
+    $ git log -5 --pretty --oneline
+    
+    # 显示所有提交过的用户,按提交次数排序
+    $ git shortlog -sn
+    
+    # 显示指定文件是什么人在什么时间修改过
+    $ git blame [file]
+    
+    # 显示暂存区和工作区的差异
+    $ git diff
+    
+    # 显示暂存区和上一个commit的差异
+    $ git diff --cached [file]
+    
+    # 显示工作区与当前分支最新commit之间的差异
+    $ git diff HEAD
+    
+    # 显示两次提交之间的差异
+    $ git diff [first-branch]...[second-branch]
+    
+    # 显示今天你写了多少行代码
+    $ git diff --shortstat "@{0 day ago}"
+    
+    # 显示某次提交的元数据和内容变化
+    $ git show [commit]
+    
+    # 显示某次提交发生变化的文件
+    $ git show --name-only [commit]
+    
+    # 显示某次提交时,某个文件的内容
+    $ git show [commit]:[filename]
+    
+    # 显示当前分支的最近几次提交
+    $ git reflog
+#### 远程同步
+    # 下载远程仓库的所有变动
+    $ git fetch [remote]
+    
+    # 显示所有远程仓库
+    $ git remote -v
+    
+    # 显示某个远程仓库的信息
+    $ git remote show [remote]
+    
+    # 增加一个新的远程仓库,并命名
+    $ git remote add [shortname] [url]
+    
+    # 取回远程仓库的变化,并与本地分支合并
+    $ git pull [remote] [branch]
+    
+    # 上传本地指定分支到远程仓库
+    $ git push [remote] [branch]
+    
+    # 强行推送当前分支到远程仓库,即使有冲突
+    $ git push [remote] --force
+    
+    # 推送所有分支到远程仓库
+    $ git push [remote] --all
+#### 撤销
+    # 恢复暂存区的指定文件到工作区
+    $ git checkout [file]
+    
+    # 恢复某个commit的指定文件到暂存区和工作区
+    $ git checkout [commit] [file]
+    
+    # 恢复暂存区的所有文件到工作区
+    $ git checkout .
+    
+    # 重置暂存区的指定文件,与上一次commit保持一致,但工作区不变
+    $ git reset [file]
+    
+    # 重置暂存区与工作区,与上一次commit保持一致
+    $ git reset --hard
+    
+    # 重置当前分支的指针为指定commit,同时重置暂存区,但工作区不变
+    $ git reset [commit]
+    
+    # 重置当前分支的HEAD为指定commit,同时重置暂存区和工作区,与指定commit一致
+    $ git reset --hard [commit]
+    
+    # 重置当前HEAD为指定commit,但保持暂存区和工作区不变
+    $ git reset --keep [commit]
+    
+    # 新建一个commit,用来撤销指定commit
+    # 后者的所有变化都将被前者抵消,并且应用到当前分支
+    $ git revert [commit]
+    
+    暂时将未提交的变化移除,稍后再移入
+    $ git stash
+    $ git stash pop

+ 201 - 0
LICENSE

@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

+ 161 - 0
README.md

@@ -0,0 +1,161 @@
+# 微信小程序商城(Java + uniapp)
+
+## 注意
+Entity里提示报错不是缺少get、set方法,Eclipse、IDEA请先安装`lombok`插件,如果不了解`lombok`的话,请先学习下相关知识,比如可以阅读[此文章](https://mp.weixin.qq.com/s/cUc-bUcprycADfNepnSwZQ);
+
+## 新手必看启动教程
+- [https://www.bilibili.com/video/av66149752](https://www.bilibili.com/video/av66149752)
+## 使用Hbuilder启动微同商城小程序端教程
+- [https://www.bilibili.com/video/BV1ni4y1M7CC](https://www.bilibili.com/video/BV1ni4y1M7CC)
+
+### 微同商城开源版体验:
+![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/gh_a7a467438863_344.jpg "微同商城开源版")
+
+* git:[https://gitee.com/fuyang_lipengjun/platform](https://gitee.com/fuyang_lipengjun/platform)
+* 代码生成工具IDEA插件
+  * git:[https://gitee.com/fuyang_lipengjun/platform-gen](https://gitee.com/fuyang_lipengjun/platform-gen)
+
+## 官网
+[https://fly2you.cn](https://fly2you.cn)
+## 文档
+[http://doc.fly2you.cn](http://doc.fly2you.cn)
+
+<p align="center">
+  <b>特别赞助</b>
+</p>
+<br/>
+<table align="center" cellspacing="0" cellpadding="0">
+  <tbody>
+    <tr>
+      <td align="center" valign="middle" colspan="3">
+	      <a href="http://www.ccflow.org/?from=fuyang_lipengjun" target="_blank">
+					<img src="https://platform-wxmall-1251990035.cos.ap-shanghai.myqcloud.com/ccflow.png">
+				</a>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+## 获得荣誉
+### GVP
+![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/GVP.jpg "GVP")
+
+## 重要信息
+1. 项目合作洽谈,请联系客服微信(使用微信扫码添加好友,请注明来意)。
+2. 如需购买 [商业版源码](https://fly2you.cn/ma.html) 请联系客服。<br>
+![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/wx.png "微信")
+3. 微信扫码并关注公众号回复“文档”,获取《微同开源商城启动部署手册.docx》<br>
+  ![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/upload/20180708/qr.jpg "微信公众号")
+
+## 使用须知
+### ✅允许
+- 个人学习使用
+- 允许用于学习、毕设等
+- 允许进行商业使用,请自觉遵守使用协议,如需要商业使用推荐购买[商业版源码](https://fly2you.cn/ma.html)
+- 请遵守 Apache License2.0 协议,再次开源请注明出处
+- 推荐Watch、Star项目,获取项目第一时间更新,同时也是对项目最好的支持
+- 希望大家多多支持原创作品
+
+**如何交流、反馈、参与贡献?** 
+- gitee仓库:https://gitee.com/fuyang_lipengjun/platform
+- github仓库:https://github.com/lipengjun92/platform-wxshop
+* 官方QQ群:
+    * <a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=HNLRmaIdvnj2e_TGkMspORvIn-AHNZCb&jump_from=webapi"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="微同科技 ①群" title="微同科技 ①群"></a>:66502035
+    * <a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=4i3Z9xgp7SlPnk_X1v0TWToSOoT_gJMz&jump_from=webapi"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="微同科技 ②群" title="微同科技 ②群"></a>:870579539
+    * <a target="_blank" href="https://qm.qq.com/cgi-bin/qm/qr?k=hQLMx7vYLfP_C-d2-yP_udx1yciJXfHC&jump_from=webapi"><img border="0" src="//pub.idqqimg.com/wpa/images/group.png" alt="微同科技 ③群" title="微同科技 ③群"></a>:151602347
+
+## 开发计划
+* 1 使用uniapp重构小程序端所有页面【100%】
+* 2 修复所以已知bug,使用遇到bug请给我们提交[issues](https://gitee.com/fuyang_lipengjun/platform/issues)
+* 3 后台使用SpringBoot重构
+* 4 适配H5、IOS、Android端
+* 5 接入支付宝支付
+* 6 出配套视频教程
+
+## 项目结构
+~~~
+platform
+|--platform-admin 后台管理
+|--platform-api 微信小程序商城api接口
+|--platform-common 公共模块
+|--platform-framework 打包发布此项目
+|--platform-gen 代码生成
+|--platform-mp 微信公众号模块
+|--platform-schedule 定时任务
+|--platform-shop 商城后台管理
+|--uni-mall uniapp版商城
+|--wx-mall 微信小程序原生商城
+~~~
+
+## 安装教程
+
+* 配置环境(推荐jdk1.8、maven3.3、tomcat8、mysql5.7、redis4.0.1)
+* 创建数据库
+* 依次初始化sql脚本 
+    * /_sql/platform.sql
+    * /_sql/sys_region.sql
+
+* 导入项目到IDE中
+* 导入支付证书至/platform-shop/src/main/resources/cert/目录下(申请商户号、开通微信支付、下载支付证书)
+* 修改配置文件 /platform-admin/src/main/resources/dev/platform.properties
+    * jdbc.url
+    * jdbc.username
+    * jdbc.password
+    * wx.appId
+    * wx.secret
+    * wx.mchId
+    * wx.paySignKey
+    * wx.notifyUrl
+    * sms.validIp
+    * mp.appId
+    * mp.secret
+    * mp.token
+    * mp.aesKey
+* 修改配置文件 /platform-admin/src/main/resources/j2cache.properties
+    * redis.hosts
+    * redis.password
+* 启动redis服务
+* 启动后台项目(参照<a href="#doc">开发文档</a>)
+* 打开微信开发者工具
+* 导入 /wx-mall填写appId
+* 修改 /wx-mall/config/api.js里API_BASE_URL的值
+* 使用eclipse启动项目后默认访问路径
+    * [http://localhost:8080/platform-framework](http://localhost:8080/platform-framework)
+* 使用idea启动项目后默认访问路径
+    * [http://localhost:8080](http://localhost:8080)
+* 出现404问题的同学请检查设置的`Application context`
+
+## 驰骋工作流引擎的安装
+   1. 请参考: https://gitee.com/opencc/JFlow/wikis/pages/preview?sort_id=4199224&doc_id=31094
+
+
+## 页面展示
+### 登录页面
+![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/upload/20180708/login.png "登录")
+### 首页
+![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/upload/20180708/index.png "首页")
+### 发送短信
+![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/upload/20180727/3.png "发送短信")
+### 捐赠
+![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/upload/20180727/4.png "捐赠")
+### 小程序首页
+![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/upload/20180727/5.png "小程序首页")
+### 专题
+![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/upload/20180727/6.png "专题")
+### 分类
+![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/upload/20180727/7.png "分类")
+### 购物车
+![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/upload/20180727/8.png "购物车")
+### 登录授权
+![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/upload/20180727/9.png "登录授权")
+### 优惠券
+![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/upload/20180727/10.png "优惠券")
+### 小程序并联手机
+![](https://platform-wxmall.oss-cn-beijing.aliyuncs.com/upload/20180727/11.png "并联手机")
+
+## Stargazers over time
+[![Stargazers over time](https://whnb.wang/stars/fuyang_lipengjun/platform)](https://whnb.wang/fuyang_lipengjun/platform)
+
+## contributors
+[![contributors](https://whnb.wang/contributors/fuyang_lipengjun/platform)](https://whnb.wang/fuyang_lipengjun/platform)
+ 

+ 1 - 0
_config.yml

@@ -0,0 +1 @@
+theme: jekyll-theme-slate

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 4313 - 0
_sql/ccbpm.sql


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 3909 - 0
_sql/platform.sql


Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 46217 - 0
_sql/sys_region.sql


+ 2 - 0
platform-admin/.gitignore

@@ -0,0 +1,2 @@
+/.classpath
+/.project

+ 9 - 0
platform-admin/.settings/.gitignore

@@ -0,0 +1,9 @@
+/.jsdtscope
+/org.eclipse.core.resources.prefs
+/org.eclipse.jdt.core.prefs
+/org.eclipse.m2e.core.prefs
+/org.eclipse.wst.common.component
+/org.eclipse.wst.common.project.facet.core.xml
+/org.eclipse.wst.jsdt.ui.superType.container
+/org.eclipse.wst.jsdt.ui.superType.name
+/org.eclipse.wst.validation.prefs

+ 108 - 0
platform-admin/pom.xml

@@ -0,0 +1,108 @@
+<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>
+    <parent>
+        <groupId>com.platform</groupId>
+        <artifactId>platform</artifactId>
+        <version>1.0.0</version>
+    </parent>
+
+    <artifactId>platform-admin</artifactId>
+    <packaging>war</packaging>
+    <name>platform-admin</name>
+    <description>管理后台</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.platform</groupId>
+            <artifactId>platform-common</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <!--验证码生成工具-->
+        <dependency>
+            <groupId>com.github.penggle</groupId>
+            <artifactId>kaptcha</artifactId>
+            <version>${kaptcha.version}</version>
+        </dependency>
+    </dependencies>
+
+    <profiles>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <env>dev</env>
+            </properties>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <env>prod</env>
+            </properties>
+        </profile>
+    </profiles>
+
+    <build>
+        <scriptSourceDirectory>src/main/java</scriptSourceDirectory>
+        <resources>
+            <resource>
+                <directory>src/main/resources/${env}</directory>
+                <filtering>true</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <excludes>
+                    <exclude>dev/*</exclude>
+                    <exclude>prod/*</exclude>
+                </excludes>
+            </resource>
+            <resource>
+                <directory>src/main/java</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.xml</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <artifactId>maven-war-plugin</artifactId>
+                <configuration>
+                    <warSourceDirectory>src/main/webapp</warSourceDirectory>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <webResources>
+                        <resource>
+                            <directory>src/main/resources/${env}</directory>
+                            <targetPath>WEB-INF/classes</targetPath>
+                            <filtering>true</filtering>
+                        </resource>
+                        <resource>
+                            <directory>src/main/resources</directory>
+                            <filtering>true</filtering>
+                            <excludes>
+                                <exclude>dev/*</exclude>
+                                <exclude>prod/*</exclude>
+                            </excludes>
+                        </resource>
+                    </webResources>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                    <!-- 过滤后缀为pem、pfx的证书文件 -->
+                    <nonFilteredFileExtensions>
+                        <nonFilteredFileExtension>pem</nonFilteredFileExtension>
+                        <nonFilteredFileExtension>pfx</nonFilteredFileExtension>
+                        <nonFilteredFileExtension>p12</nonFilteredFileExtension>
+                    </nonFilteredFileExtensions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 135 - 0
platform-admin/src/main/java/com/platform/aop/DataFilterAspect.java

@@ -0,0 +1,135 @@
+package com.platform.aop;
+
+import com.platform.annotation.DataFilter;
+import com.platform.entity.SysUserEntity;
+import com.platform.service.SysRoleDeptService;
+import com.platform.utils.Constant;
+import com.platform.utils.RRException;
+import com.platform.utils.ShiroUtils;
+import org.apache.commons.lang.StringUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+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 java.util.List;
+import java.util.Map;
+
+/**
+ * 数据过滤,切面处理类
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017年10月23日 下午13:33:35
+ */
+@Aspect
+@Component
+public class DataFilterAspect {
+    @Autowired
+    private SysRoleDeptService sysRoleDeptService;
+
+    /**
+     * 切点
+     */
+    @Pointcut("@annotation(com.platform.annotation.DataFilter)")
+    public void dataFilterCut() {
+
+    }
+
+    /**
+     * 前置通知
+     *
+     * @param point 连接点
+     */
+    @Before("dataFilterCut()")
+    public void dataFilter(JoinPoint point) {
+        //获取参数
+        Object params = point.getArgs()[0];
+        if (params != null && params instanceof Map) {
+            SysUserEntity user = ShiroUtils.getUserEntity();
+
+            //如果不是超级管理员,则只能查询本部门及子部门数据
+            if (user.getUserId() != Constant.SUPER_ADMIN) {
+                Map map = (Map) params;
+                map.put("filterSql", getFilterSQL(user, point));
+            }
+
+            return;
+        }
+
+        throw new RRException("数据权限接口的参数必须为Map类型,且不能为NULL");
+    }
+
+    /**
+     * 获取数据过滤的SQL
+     *
+     * @param user  登录用户
+     * @param point 连接点
+     * @return sql
+     */
+    private String getFilterSQL(SysUserEntity user, JoinPoint point) {
+        MethodSignature signature = (MethodSignature) point.getSignature();
+        DataFilter dataFilter = signature.getMethod().getAnnotation(DataFilter.class);
+
+        String userAlias = dataFilter.userAlias();
+        String deptAlias = dataFilter.deptAlias();
+
+        StringBuilder filterSql = new StringBuilder();
+
+        if (StringUtils.isNotBlank(deptAlias)) {
+            //取出登录用户部门权限
+            String alias = getAliasByUser(user.getUserId());
+            if (StringUtils.isNotEmpty(alias)) {
+                filterSql.append(" and (");
+                filterSql.append(deptAlias);
+                filterSql.append(" in ");
+                filterSql.append(" ( ");
+                filterSql.append(alias);
+                filterSql.append(" ) ");
+                if (StringUtils.isNotBlank(userAlias)) {
+                    filterSql.append(" or ");
+                    filterSql.append(userAlias);
+                    filterSql.append("='");
+                    filterSql.append(user.getUserId());
+                    filterSql.append("' ");
+                }
+                filterSql.append(" ) ");
+            }
+        } else if (StringUtils.isNotBlank(userAlias)) {
+            filterSql.append(" and ");
+            filterSql.append(userAlias);
+            filterSql.append("='");
+            filterSql.append(user.getUserId());
+            filterSql.append("' ");
+        }
+
+        return filterSql.toString();
+    }
+
+    /**
+     * 取出用户权限
+     *
+     * @param userId 登录用户Id
+     * @return 权限
+     */
+    private String getAliasByUser(Long userId) {
+        @SuppressWarnings("unchecked")
+        List<Long> roleOrglist = sysRoleDeptService.queryDeptIdListByUserId(userId);
+        StringBuilder roleStr = new StringBuilder();
+        String alias = "";
+        if (roleOrglist != null && !roleOrglist.isEmpty()) {
+            for (Long roleId : roleOrglist) {
+                roleStr.append(",");
+                roleStr.append("'");
+                roleStr.append(roleId);
+                roleStr.append("'");
+            }
+            alias = roleStr.toString().substring(1, roleStr.length());
+        }
+        return alias;
+    }
+}

+ 73 - 0
platform-admin/src/main/java/com/platform/aop/RedisCacheAspect.java

@@ -0,0 +1,73 @@
+package com.platform.aop;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.platform.annotation.RedisCache;
+import com.platform.cache.J2CacheUtils;
+import com.platform.utils.StringUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.Signature;
+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.stereotype.Component;
+
+import java.lang.reflect.Method;
+
+/**
+ * @author 李鹏军
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2019年2月18日 下午15:54:23
+ */
+@Aspect
+@Component
+public class RedisCacheAspect {
+
+    @Pointcut("@annotation(com.platform.annotation.RedisCache)")
+    public void webAspect() {
+    }
+
+    @SuppressWarnings("unchecked")
+    @Around("webAspect()")
+    public Object redisCache(ProceedingJoinPoint pjp) throws Throwable {
+        //得到类名、方法名和参数
+        String redisResult;
+        String className = pjp.getTarget().getClass().getName();
+        String methodName = pjp.getSignature().getName();
+        Object[] args = pjp.getArgs();
+
+        //得到被代理的方法
+        Signature signature = pjp.getSignature();
+        if (!(signature instanceof MethodSignature)) {
+            throw new IllegalArgumentException();
+        }
+        MethodSignature methodSignature = (MethodSignature) signature;
+        Method method = pjp.getTarget().getClass().getMethod(methodSignature.getName(), methodSignature.getParameterTypes());
+        //得到被代理的方法上的注解
+        String cacheKey = method.getAnnotation(RedisCache.class).cacheKey();
+        boolean destine = method.getAnnotation(RedisCache.class).destine();
+
+        String key = cacheKey;
+        if (!destine) {
+            //根据类名,方法名和参数生成key
+            key = StringUtils.genKey(cacheKey, className, methodName);
+        }
+
+        Object result = null;
+        if (!J2CacheUtils.exists(key)) {
+            //缓存不存在,则调用原方法,并将结果放入缓存中
+            result = pjp.proceed(args);
+            redisResult = JSON.toJSONString(result);
+            J2CacheUtils.put(key, redisResult);
+        } else {
+            //缓存命中
+            redisResult = JSONObject.toJSON(J2CacheUtils.get(key)).toString();
+            //得到被代理方法的返回值类型
+            Class returnType = method.getReturnType();
+            result = JSON.parseObject(redisResult, returnType);
+        }
+        return result;
+    }
+}

+ 93 - 0
platform-admin/src/main/java/com/platform/aop/SysLogAspect.java

@@ -0,0 +1,93 @@
+package com.platform.aop;
+
+import com.alibaba.fastjson.JSON;
+import com.platform.annotation.SysLog;
+import com.platform.entity.SysLogEntity;
+import com.platform.entity.SysUserEntity;
+import com.platform.service.SysLogService;
+import com.platform.utils.HttpContextUtils;
+import com.platform.utils.IPUtils;
+import com.platform.utils.ShiroUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+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 javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+import java.util.Date;
+
+/**
+ * 系统日志,切面处理类
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017年3月8日 上午11:07:35
+ */
+@Aspect
+@Component
+public class SysLogAspect {
+    @Autowired
+    private SysLogService sysLogService;
+
+    /**
+     * 切点
+     */
+    @Pointcut("@annotation(com.platform.annotation.SysLog)")
+    public void logPointCut() {
+
+    }
+
+    /**
+     * 前置通知
+     *
+     * @param joinPoint 连接点
+     */
+    @Before("logPointCut()")
+    public void saveSysLog(JoinPoint joinPoint) {
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Method method = signature.getMethod();
+
+        SysLogEntity sysLog = new SysLogEntity();
+        SysLog syslog = method.getAnnotation(SysLog.class);
+        if (syslog != null) {
+            //注解上的描述
+            sysLog.setOperation(syslog.value());
+        }
+
+        //请求的方法名
+        String className = joinPoint.getTarget().getClass().getName();
+        String methodName = signature.getName();
+        sysLog.setMethod(className + "." + methodName + "()");
+
+        //请求的参数
+        Object[] args = joinPoint.getArgs();
+        String params = JSON.toJSONString(args[0]);
+        sysLog.setParams(params);
+
+        //获取request
+        HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
+        //设置IP地址
+        sysLog.setIp(IPUtils.getIpAddr(request));
+
+        //用户名
+        SysUserEntity sysUserEntity = ShiroUtils.getUserEntity();
+        String username = "";
+        if ("login".equals(methodName)) {
+            username = params;
+        }
+        if (null != sysUserEntity) {
+            username = ShiroUtils.getUserEntity().getUsername();
+        }
+        sysLog.setUsername(username);
+
+        sysLog.setCreateDate(new Date());
+        //保存系统日志
+        sysLogService.save(sysLog);
+    }
+
+}

+ 114 - 0
platform-admin/src/main/java/com/platform/controller/SysConfigController.java

@@ -0,0 +1,114 @@
+package com.platform.controller;
+
+import com.platform.annotation.SysLog;
+import com.platform.entity.SysConfigEntity;
+import com.platform.service.SysConfigService;
+import com.platform.utils.PageUtils;
+import com.platform.utils.Query;
+import com.platform.utils.R;
+import com.platform.validator.ValidatorUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 系统配置信息Controller
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2016年12月4日 下午6:55:53
+ */
+@RestController
+@RequestMapping("/sys/config")
+public class SysConfigController extends AbstractController {
+    @Autowired
+    private SysConfigService sysConfigService;
+
+    /**
+     * 所有配置列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:config:list")
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+        List<SysConfigEntity> configList = sysConfigService.queryList(query);
+        int total = sysConfigService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(configList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+
+    /**
+     * 根据主键获取配置信息
+     *
+     * @param id 主键
+     * @return R
+     */
+    @RequestMapping("/info/{id}")
+    @RequiresPermissions("sys:config:info")
+    public R info(@PathVariable("id") Long id) {
+        SysConfigEntity config = sysConfigService.queryObject(id);
+
+        return R.ok().put("config", config);
+    }
+
+    /**
+     * 新增配置
+     *
+     * @param config 配置
+     * @return R
+     */
+    @SysLog("新增配置")
+    @RequestMapping("/save")
+    @RequiresPermissions("sys:config:save")
+    public R save(@RequestBody SysConfigEntity config) {
+        ValidatorUtils.validateEntity(config);
+
+        sysConfigService.save(config);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改配置
+     *
+     * @param config 配置
+     * @return R
+     */
+    @SysLog("修改配置")
+    @RequestMapping("/update")
+    @RequiresPermissions("sys:config:update")
+    public R update(@RequestBody SysConfigEntity config) {
+        ValidatorUtils.validateEntity(config);
+
+        sysConfigService.update(config);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除配置
+     *
+     * @param ids 主键集
+     * @return R
+     */
+    @SysLog("删除配置")
+    @RequestMapping("/delete")
+    @RequiresPermissions("sys:config:delete")
+    public R delete(@RequestBody Long[] ids) {
+        sysConfigService.deleteBatch(ids);
+
+        return R.ok();
+    }
+
+}

+ 160 - 0
platform-admin/src/main/java/com/platform/controller/SysDeptController.java

@@ -0,0 +1,160 @@
+package com.platform.controller;
+
+import com.platform.annotation.SysLog;
+import com.platform.entity.SysDeptEntity;
+import com.platform.service.SysDeptService;
+import com.platform.utils.Constant;
+import com.platform.utils.R;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 部门管理Controller
+ *
+ * @author liepngjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-09-17 23:58:47
+ */
+@RestController
+@RequestMapping("/sys/dept")
+public class SysDeptController extends AbstractController {
+    @Autowired
+    private SysDeptService sysDeptService;
+
+    /**
+     * 部门列表
+     *
+     * @return R
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:dept:list")
+    public R list() {
+        Map<String, Object> map = new HashMap<>();
+        //如果不是超级管理员,则只能查询本部门及子部门数据
+        if (getUserId() != Constant.SUPER_ADMIN) {
+            map.put("deptFilter", sysDeptService.getSubDeptIdList(getDeptId()));
+        }
+        List<SysDeptEntity> deptList = sysDeptService.queryList(map);
+        return R.ok().put("list", deptList);
+    }
+
+    /**
+     * 选择部门(添加、修改菜单)
+     *
+     * @return R
+     */
+    @RequestMapping("/select")
+    @RequiresPermissions("sys:dept:select")
+    public R select() {
+        Map<String, Object> map = new HashMap<>();
+        //如果不是超级管理员,则只能查询本部门及子部门数据
+        if (getUserId() != Constant.SUPER_ADMIN) {
+            map.put("deptFilter", sysDeptService.getSubDeptIdList(getDeptId()));
+        }
+        List<SysDeptEntity> deptList = sysDeptService.queryList(map);
+
+        //添加一级部门
+        if (getUserId() == Constant.SUPER_ADMIN) {
+            SysDeptEntity root = new SysDeptEntity();
+            root.setDeptId(0L);
+            root.setName("一级部门");
+            root.setParentId(-1L);
+            root.setOpen(true);
+            deptList.add(root);
+        }
+
+        return R.ok().put("deptList", deptList);
+    }
+
+    /**
+     * 获取用户部门Id(管理员则为0)
+     *
+     * @return
+     */
+    @RequestMapping("/info")
+    @RequiresPermissions("sys:dept:list")
+    public R info() {
+        long deptId = 0;
+        if (getUserId() != Constant.SUPER_ADMIN) {
+            SysDeptEntity dept = sysDeptService.queryObject(getDeptId());
+            deptId = dept.getParentId();
+        }
+
+        return R.ok().put("deptId", deptId);
+    }
+
+    /**
+     * 根据主键获取部门信息
+     *
+     * @param deptId 主键
+     * @return R
+     */
+    @RequestMapping("/info/{deptId}")
+    @RequiresPermissions("sys:dept:info")
+    public R info(@PathVariable("deptId") Long deptId) {
+        SysDeptEntity dept = sysDeptService.queryObject(deptId);
+
+        return R.ok().put("dept", dept);
+    }
+
+    /**
+     * 新增部门
+     *
+     * @param dept 部门
+     * @return R
+     */
+    @SysLog("新增部门")
+    @RequestMapping("/save")
+    @RequiresPermissions("sys:dept:save")
+    public R save(@RequestBody SysDeptEntity dept) {
+        sysDeptService.save(dept);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改部门
+     *
+     * @param dept 部门
+     * @return R
+     */
+    @SysLog("修改部门")
+    @RequestMapping("/update")
+    @RequiresPermissions("sys:dept:update")
+    public R update(@RequestBody SysDeptEntity dept) {
+        sysDeptService.update(dept);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除部门
+     *
+     * @param deptId 主键
+     * @return R
+     */
+    @SysLog("删除部门")
+    @RequestMapping("/delete")
+    @RequiresPermissions("sys:dept:delete")
+    public R delete(long deptId) {
+        //判断是否有子部门
+        List<Long> deptList = sysDeptService.queryDetpIdList(deptId);
+        if (deptList.size() > 0) {
+            return R.error("请先删除子部门");
+        }
+
+        sysDeptService.delete(deptId);
+
+        return R.ok();
+    }
+
+}

+ 44 - 0
platform-admin/src/main/java/com/platform/controller/SysLogController.java

@@ -0,0 +1,44 @@
+package com.platform.controller;
+
+import com.platform.service.SysLogService;
+import com.platform.utils.PageUtilsPlus;
+import com.platform.utils.R;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.Map;
+
+/**
+ * 系统日志Controller
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-03-08 10:40:56
+ */
+@Controller
+@RequestMapping("/sys/log")
+public class SysLogController {
+    @Autowired
+    private SysLogService sysLogService;
+
+    /**
+     * 系统日志列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @ResponseBody
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:log:list")
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        PageUtilsPlus pageUtil = sysLogService.queryPage(params);
+        return R.ok().put("page", pageUtil);
+    }
+
+}

+ 150 - 0
platform-admin/src/main/java/com/platform/controller/SysMacroController.java

@@ -0,0 +1,150 @@
+package com.platform.controller;
+
+import com.platform.annotation.SysLog;
+import com.platform.entity.SysMacroEntity;
+import com.platform.service.SysMacroService;
+import com.platform.utils.PageUtils;
+import com.platform.utils.Query;
+import com.platform.utils.R;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 通用字典表Controller
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-08-22 11:48:16
+ */
+@RestController
+@RequestMapping("sys/macro")
+public class SysMacroController {
+    @Autowired
+    private SysMacroService sysMacroService;
+
+    /**
+     * 所有字典列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:macro:list")
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<SysMacroEntity> sysMacroList = sysMacroService.queryList(query);
+        int total = sysMacroService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(sysMacroList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 根据主键获取字典信息
+     *
+     * @param macroId 主键
+     * @return R
+     */
+    @RequestMapping("/info/{macroId}")
+    @RequiresPermissions("sys:macro:info")
+    public R info(@PathVariable("macroId") Long macroId) {
+        SysMacroEntity sysMacro = sysMacroService.queryObject(macroId);
+
+        return R.ok().put("macro", sysMacro);
+    }
+
+    /**
+     * 新增字典
+     *
+     * @param sysMacro 字典
+     * @return R
+     */
+    @SysLog("新增字典")
+    @RequestMapping("/save")
+    @RequiresPermissions("sys:macro:save")
+    public R save(@RequestBody SysMacroEntity sysMacro) {
+        sysMacroService.save(sysMacro);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改字典
+     *
+     * @param sysMacro 字典
+     * @return R
+     */
+    @SysLog("修改字典")
+    @RequestMapping("/update")
+    @RequiresPermissions("sys:macro:update")
+    public R update(@RequestBody SysMacroEntity sysMacro) {
+        sysMacroService.update(sysMacro);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除字典
+     *
+     * @param macroIds 主键集
+     * @return R
+     */
+    @SysLog("删除字典")
+    @RequestMapping("/delete")
+    @RequiresPermissions("sys:macro:delete")
+    public R delete(@RequestBody Long[] macroIds) {
+        sysMacroService.deleteBatch(macroIds);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看字典列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/queryAll")
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<SysMacroEntity> list = sysMacroService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 查看字典目录列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/queryAllParent")
+    public R queryAllParent(@RequestParam Map<String, Object> params) {
+
+        List<SysMacroEntity> list = sysMacroService.queryAllParent(params);
+
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 根据value查询数据字典
+     *
+     * @param value value
+     * @return R
+     */
+    @RequestMapping("/queryMacrosByValue")
+    public R queryMacrosByValue(@RequestParam String value) {
+
+        List<SysMacroEntity> list = sysMacroService.queryMacrosByValue(value);
+
+        return R.ok().put("list", list);
+    }
+}

+ 152 - 0
platform-admin/src/main/java/com/platform/controller/SysOssController.java

@@ -0,0 +1,152 @@
+package com.platform.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.platform.annotation.SysLog;
+import com.platform.entity.SysOssEntity;
+import com.platform.oss.CloudStorageConfig;
+import com.platform.oss.OSSFactory;
+import com.platform.service.SysConfigService;
+import com.platform.service.SysOssService;
+import com.platform.utils.Constant;
+import com.platform.utils.PageUtilsPlus;
+import com.platform.utils.R;
+import com.platform.utils.RRException;
+import com.platform.validator.ValidatorUtils;
+import com.platform.validator.group.*;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Map;
+
+/**
+ * 文件上传Controller
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-03-25 12:13:26
+ */
+@RestController
+@RequestMapping("sys/oss")
+public class SysOssController {
+    @Autowired
+    private SysOssService sysOssService;
+    @Autowired
+    private SysConfigService sysConfigService;
+
+    private final static String KEY = Constant.CLOUD_STORAGE_CONFIG_KEY;
+
+    /**
+     * 列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:oss:all")
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        PageUtilsPlus pageUtil = sysOssService.queryPage(params);
+        return R.ok().put("page", pageUtil);
+    }
+
+
+    /**
+     * 获取云存储配置信息
+     *
+     * @return R
+     */
+    @RequestMapping("/config")
+    @RequiresPermissions("sys:oss:all")
+    public R config() {
+        CloudStorageConfig config = sysConfigService.getConfigObject(KEY, CloudStorageConfig.class);
+
+        return R.ok().put("config", config);
+    }
+
+
+    /**
+     * 保存云存储配置信息
+     *
+     * @param config 配置信息
+     * @return R
+     */
+    @SysLog("保存云存储配置信息")
+    @RequestMapping("/saveConfig")
+    @RequiresPermissions("sys:oss:all")
+    public R saveConfig(@RequestBody CloudStorageConfig config) {
+        //校验类型
+        ValidatorUtils.validateEntity(config);
+
+        if (config.getType() == Constant.CloudService.QINIU.getValue()) {
+            //校验七牛数据
+            ValidatorUtils.validateEntity(config, QiniuGroup.class);
+        } else if (config.getType() == Constant.CloudService.ALIYUN.getValue()) {
+            //校验阿里云数据
+            ValidatorUtils.validateEntity(config, AliyunGroup.class);
+        } else if (config.getType() == Constant.CloudService.QCLOUD.getValue()) {
+            //校验腾讯云数据
+            ValidatorUtils.validateEntity(config, QcloudGroup.class);
+        } else if (config.getType() == Constant.CloudService.DISCK.getValue()) {
+            //校验腾讯云数据
+            ValidatorUtils.validateEntity(config, DiskGroup.class);
+        }else if (config.getType() == Constant.CloudService.MINIO.getValue()) {
+            //校验MINIO数据
+            ValidatorUtils.validateEntity(config, MinioGroup.class);
+        }
+
+        sysConfigService.updateValueByKey(KEY, JSON.toJSONString(config));
+
+        return R.ok();
+    }
+
+    /**
+     * 上传文件
+     *
+     * @param file 文件
+     * @return R
+     * @throws Exception 异常
+     */
+    @RequestMapping("/upload")
+    public R upload(@RequestParam("file") MultipartFile file) throws Exception {
+        if (file.isEmpty()) {
+            throw new RRException("上传文件不能为空");
+        }
+        //上传文件
+        String url = OSSFactory.build().upload(file);
+
+        //保存文件信息
+        SysOssEntity ossEntity = new SysOssEntity();
+        ossEntity.setUrl(url);
+        ossEntity.setCreateDate(new Date());
+        sysOssService.save(ossEntity);
+
+        R r = new R();
+        r.put("url", url);
+        r.put("link", url);
+        return r;
+    }
+
+
+    /**
+     * 删除图片
+     *
+     * @param ids 主键集
+     * @return R
+     */
+    @SysLog("删除图片")
+    @RequestMapping("/delete")
+    @RequiresPermissions("sys:oss:all")
+    public R delete(@RequestBody Long[] ids) {
+        sysOssService.removeByIds(Arrays.asList(ids));
+
+        return R.ok();
+    }
+}

+ 30 - 0
platform-admin/src/main/java/com/platform/controller/SysPageController.java

@@ -0,0 +1,30 @@
+package com.platform.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * 系统页面视图Controller
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2016年11月24日 下午11:05:27
+ */
+@Controller
+public class SysPageController {
+
+    /**
+     * 视图路径
+     *
+     * @param module 模块
+     * @param url    url
+     * @return 页面视图路径
+     */
+    @RequestMapping("{module}/{url}.html")
+    public String page(@PathVariable("module") String module, @PathVariable("url") String url) {
+        return module + "/" + url + ".html";
+    }
+
+}

+ 195 - 0
platform-admin/src/main/java/com/platform/controller/SysRegionController.java

@@ -0,0 +1,195 @@
+package com.platform.controller;
+
+import com.platform.annotation.SysLog;
+import com.platform.cache.RegionCacheUtil;
+import com.platform.entity.SysRegionEntity;
+import com.platform.service.SysRegionService;
+import com.platform.utils.PageUtils;
+import com.platform.utils.Query;
+import com.platform.utils.R;
+import com.platform.utils.TreeUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 地址管理Controller
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-11-04 11:19:31
+ */
+@RestController
+@RequestMapping("sys/region")
+public class SysRegionController {
+    @Autowired
+    private SysRegionService sysRegionService;
+
+    /**
+     * 查看列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:region:list")
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<SysRegionEntity> regionList = sysRegionService.queryList(query);
+        int total = sysRegionService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(regionList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 根据主键获取信息
+     *
+     * @param id 主键
+     * @return R
+     */
+    @RequestMapping("/info/{id}")
+    @RequiresPermissions("sys:region:info")
+    public R info(@PathVariable("id") Integer id) {
+        SysRegionEntity region = sysRegionService.queryObject(id);
+
+        return R.ok().put("region", region);
+    }
+
+    /**
+     * 新增地址
+     *
+     * @param region 地址
+     * @return R
+     */
+    @SysLog("新增地址")
+    @RequestMapping("/save")
+    @RequiresPermissions("sys:region:save")
+    public R save(@RequestBody SysRegionEntity region) {
+        sysRegionService.save(region);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改地址
+     *
+     * @param region 地址
+     * @return R
+     */
+    @SysLog("修改地址")
+    @RequestMapping("/update")
+    @RequiresPermissions("sys:region:update")
+    public R update(@RequestBody SysRegionEntity region) {
+        sysRegionService.update(region);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除地址
+     *
+     * @param ids 主键集
+     * @return R
+     */
+    @SysLog("删除地址")
+    @RequestMapping("/delete")
+    @RequiresPermissions("sys:region:delete")
+    public R delete(@RequestBody Integer[] ids) {
+        sysRegionService.deleteBatch(ids);
+
+        return R.ok();
+    }
+
+    /**
+     * 查询所有国家
+     *
+     * @return R
+     */
+    @RequestMapping("/getAllCountry")
+    public R getAllCountry() {
+        List<SysRegionEntity> list = RegionCacheUtil.getAllCountry();
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 查询所有省份
+     *
+     * @return R
+     */
+    @RequestMapping("/getAllProvice")
+    public R getAllProvice(@RequestParam(required = false) Integer areaId) {
+        List<SysRegionEntity> list = RegionCacheUtil.getAllProviceByParentId(areaId);
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 查询所有城市
+     *
+     * @return R
+     */
+    @RequestMapping("/getAllCity")
+    public R getAllCity(@RequestParam(required = false) Integer areaId) {
+        List<SysRegionEntity> list = RegionCacheUtil.getChildrenCity(areaId);
+        return R.ok().put("list", list);
+    }
+
+
+    /**
+     * 查询所有区县
+     *
+     * @return R
+     */
+    @RequestMapping("/getChildrenDistrict")
+    public R getChildrenDistrict(@RequestParam(required = false) Integer areaId) {
+        List<SysRegionEntity> list = RegionCacheUtil.getChildrenDistrict(areaId);
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 查看信息(全部加载页面渲染太慢!)
+     *
+     * @return R
+     */
+    @RequestMapping("/getAreaTree")
+    public R getAreaTree() {
+        List<SysRegionEntity> list = RegionCacheUtil.sysRegionEntityList;
+        for (SysRegionEntity sysRegionEntity : list) {
+            sysRegionEntity.setValue(sysRegionEntity.getId() + "");
+            sysRegionEntity.setLabel(sysRegionEntity.getName());
+        }
+        List<SysRegionEntity> node = TreeUtils.factorTree(list);
+
+        return R.ok().put("node", node);
+    }
+
+    /**
+     * 根据类型获取区域
+     *
+     * @param type 类型
+     * @return R
+     */
+    @RequestMapping("/getAreaByType")
+    public R getAreaByType(@RequestParam(required = false) Integer type) {
+
+        List<SysRegionEntity> list = new ArrayList<>();
+        if (type.equals(0)) {
+
+        } else if (type.equals(1)) {//省份
+            list = RegionCacheUtil.getAllCountry();
+        } else if (type.equals(2)) {
+            list = RegionCacheUtil.getAllProvice();
+        } else if (type.equals(3)) {
+            list = RegionCacheUtil.getAllCity();
+        }
+        return R.ok().put("list", list);
+    }
+}

+ 124 - 0
platform-admin/src/main/java/com/platform/controller/SysSmsLogController.java

@@ -0,0 +1,124 @@
+package com.platform.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.platform.annotation.SysLog;
+import com.platform.entity.SmsConfig;
+import com.platform.entity.SysSmsLogEntity;
+import com.platform.service.SysConfigService;
+import com.platform.service.SysSmsLogService;
+import com.platform.utils.Constant;
+import com.platform.utils.PageUtils;
+import com.platform.utils.Query;
+import com.platform.utils.R;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 发送短信日志Controller
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-12-16 23:38:05
+ */
+@RestController
+@RequestMapping("/sys/smslog")
+public class SysSmsLogController {
+    @Autowired
+    private SysSmsLogService smsLogService;
+    @Autowired
+    private SysConfigService sysConfigService;
+    /**
+     * 短信配置KEY
+     */
+    private final static String KEY = Constant.SMS_CONFIG_KEY;
+
+    /**
+     * 所有日志列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:smslog:list")
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<SysSmsLogEntity> smsLogList = smsLogService.queryList(query);
+        int total = smsLogService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(smsLogList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 根据主键获取日志信息
+     *
+     * @param id 主键
+     * @return R
+     */
+    @RequestMapping("/info/{id}")
+    @RequiresPermissions("sys:smslog:info")
+    public R info(@PathVariable("id") String id) {
+        SysSmsLogEntity smsLog = smsLogService.queryObject(id);
+
+        return R.ok().put("smsLog", smsLog);
+    }
+
+    /**
+     * 查看所有列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/queryAll")
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<SysSmsLogEntity> list = smsLogService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 获取短信配置信息
+     *
+     * @return R
+     */
+    @RequestMapping("/config")
+    public R config() {
+        SmsConfig config = sysConfigService.getConfigObject(KEY, SmsConfig.class);
+
+        return R.ok().put("config", config);
+    }
+
+    /**
+     * 保存短信配置信息
+     *
+     * @param config 短信配置信息
+     * @return R
+     */
+    @SysLog("保存短信配置信息")
+    @RequestMapping("/saveConfig")
+    public R saveConfig(@RequestBody SmsConfig config) {
+        sysConfigService.updateValueByKey(KEY, JSON.toJSONString(config));
+        return R.ok();
+    }
+
+    /**
+     * 发送短信
+     *
+     * @param smsLog 短信
+     * @return R
+     */
+    @RequestMapping("/sendSms")
+    public R sendSms(@RequestBody SysSmsLogEntity smsLog) {
+        SysSmsLogEntity sysSmsLogEntity = smsLogService.sendSms(smsLog);
+        return R.ok().put("result", sysSmsLogEntity);
+    }
+}

+ 28 - 0
platform-admin/src/main/java/com/platform/dao/SysOssDao.java

@@ -0,0 +1,28 @@
+package com.platform.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.platform.entity.SysOssEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 文件上传Dao
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-03-25 12:13:26
+ */
+public interface SysOssDao extends BaseMapper<SysOssEntity> {
+
+    /**
+     * 自定义分页查询
+     *
+     * @param page
+     * @param params
+     * @return
+     */
+    List<SysOssEntity> selectSysOssPage(IPage page, Map<String, Object> params);
+}

+ 37 - 0
platform-admin/src/main/java/com/platform/entity/SysOssEntity.java

@@ -0,0 +1,37 @@
+package com.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 文件上传
+ * 表名 sys_oss
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-03-25 12:13:26
+ */
+@Data
+@TableName("sys_oss")
+public class SysOssEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * URL地址
+     */
+    private String url;
+    /**
+     * 创建时间
+     */
+    private Date createDate;
+}

+ 26 - 0
platform-admin/src/main/java/com/platform/service/SysOssService.java

@@ -0,0 +1,26 @@
+package com.platform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.platform.entity.SysOssEntity;
+import com.platform.utils.PageUtilsPlus;
+
+import java.util.Map;
+
+/**
+ * 文件上传Service
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-03-25 12:13:26
+ */
+public interface SysOssService extends IService<SysOssEntity> {
+
+    /**
+     * queryPage
+     *
+     * @param params
+     * @return
+     */
+    PageUtilsPlus queryPage(Map<String, Object> params);
+}

+ 30 - 0
platform-admin/src/main/java/com/platform/service/impl/SysOssServiceImpl.java

@@ -0,0 +1,30 @@
+package com.platform.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.platform.dao.SysOssDao;
+import com.platform.entity.SysOssEntity;
+import com.platform.service.SysOssService;
+import com.platform.utils.PageUtilsPlus;
+import com.platform.utils.QueryPlus;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * @author 李鹏军
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ */
+@Service("sysOssService")
+public class SysOssServiceImpl extends ServiceImpl<SysOssDao, SysOssEntity> implements SysOssService {
+
+    @Override
+    public PageUtilsPlus queryPage(Map<String, Object> params) {
+        //排序
+        params.put("sidx", "t.create_date");
+        params.put("asc", false);
+        Page<SysOssEntity> page = new QueryPlus<SysOssEntity>(params).getPage();
+        return new PageUtilsPlus(page.setRecords(baseMapper.selectSysOssPage(page, params)));
+    }
+}

+ 45 - 0
platform-admin/src/main/java/com/platform/task/TestTask.java

@@ -0,0 +1,45 @@
+package com.platform.task;
+
+import com.platform.entity.SysUserEntity;
+import com.platform.service.SysUserService;
+import org.apache.commons.lang.builder.ToStringBuilder;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+/**
+ * 测试定时任务(演示Demo,可删除)
+ * <p>
+ * testTask为spring bean的名称
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2016年11月30日 下午1:34:24
+ */
+@Component("testTask")
+public class TestTask {
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    public void test(String params) {
+        logger.info("我是带参数的test方法,正在被执行,参数为:" + params);
+
+        try {
+            Thread.sleep(1000L);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+
+        SysUserEntity user = sysUserService.queryObject(1L);
+        System.out.println(ToStringBuilder.reflectionToString(user));
+
+    }
+
+    public void test2() {
+        logger.info("我是不带参数的test2方法,正在被执行");
+    }
+}

+ 7 - 0
platform-admin/src/main/resources/caffeine.properties

@@ -0,0 +1,7 @@
+#########################################
+# Caffeine configuration
+# [name] = size, xxxx[s|m|h|d]
+#########################################
+default=1000, 60m
+sysCache=1000, 60m
+shopCache= 1000, 60m

+ 14 - 0
platform-admin/src/main/resources/com/platform/dao/SysOssDao.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.platform.dao.SysOssDao">
+
+    <select id="selectSysOssPage" resultType="com.platform.entity.SysOssEntity">
+		select
+		t.id,
+		t.url,
+		t.create_date
+		from sys_oss t
+	</select>
+
+</mapper>

+ 66 - 0
platform-admin/src/main/resources/dev/log4j.properties

@@ -0,0 +1,66 @@
+log4j.rootLogger=INFO,stdout,info,warn,error,file
+#控制台输出
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.Threshold=INFO
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#INFO所有日志
+log4j.logger.file=info
+log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.file.File=../logs/info.log
+log4j.appender.file.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.file.append=true
+log4j.appender.file.Threshold=INFO
+log4j.appender.file.encoding=UTF-8
+log4j.appender.file.ImmediateFlush=true
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#INFO日志
+log4j.logger.info=info
+log4j.appender.info=com.platform.log4j.GradeLogDailyRollingFileAppender
+log4j.appender.info.File=../logs/info/info.log
+log4j.appender.info.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.info.append=true
+log4j.appender.info.Threshold=INFO
+log4j.appender.info.encoding=UTF-8
+log4j.appender.info.ImmediateFlush=true
+log4j.appender.info.layout=org.apache.log4j.PatternLayout
+log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#WARN日志
+log4j.appender.warn=com.platform.log4j.GradeLogDailyRollingFileAppender
+log4j.appender.warn.File=../logs/warn/warn.log
+log4j.appender.warn.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.warn.append=true
+log4j.appender.warn.Threshold=WARN
+log4j.appender.warn.encoding=UTF-8
+log4j.appender.warn.ImmediateFlush=true
+log4j.appender.warn.layout=org.apache.log4j.PatternLayout
+log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#ERROR日志
+log4j.appender.error=com.platform.log4j.GradeLogDailyRollingFileAppender
+log4j.appender.error.File=../logs/error/error.log
+log4j.appender.error.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.error.append=true
+log4j.appender.error.Threshold=ERROR
+log4j.appender.error.encoding=UTF-8
+log4j.appender.error.ImmediateFlush=true
+log4j.appender.error.layout=org.apache.log4j.PatternLayout
+log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#执行慢的SQL
+log4j.logger.com.alibaba.druid.filter.stat.StatFilter=ERROR,slowsql
+log4j.appender.slowsql=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.slowsql.File=../logs/slow_sql/slow_sql.log
+log4j.appender.slowsql.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.slowsql.append=true
+log4j.appender.slowsql.encoding=UTF-8
+log4j.appender.slowsql.ImmediateFlush=true
+log4j.appender.slowsql.layout=org.apache.log4j.PatternLayout
+log4j.appender.slowsql.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#控制台输出所有SQL
+#便于调试  生产环境注释
+log4j.logger.com.platform.dao=DEBUG,sql
+log4j.appender.sql=org.apache.log4j.ConsoleAppender
+log4j.appender.sql.Target=System.out
+log4j.appender.sql.layout=org.apache.log4j.PatternLayout
+log4j.appender.sql.layout.ConversionPattern=%m %n

+ 58 - 0
platform-admin/src/main/resources/dev/platform.properties

@@ -0,0 +1,58 @@
+jdbc.url=jdbc:mysql://localhost:3306/platform-shop?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
+jdbc.username=root
+jdbc.password=123456
+
+jdbc.initialSize=5
+jdbc.maxActive=30
+jdbc.minPoolSize=2
+jdbc.maxIdleTime=30000
+jdbc.idleConnectionTestPeriod=100
+
+#小程序ID
+wx.appId=
+#小程序密钥
+wx.secret=
+#商户号
+wx.mchId=
+#支付签名
+wx.paySignKey=
+#交易类型
+wx.tradeType=JSAPI
+#证书名称,对应不同的商户号
+wx.certName=/cert/apiclient_cert.p12
+#支付回调地址
+wx.notifyUrl=https://www.yourdomain.com/platform-framework/api/notify
+#获取code的请求地址
+wx.getCode=https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=STAT#wechat_redirect
+#获取Web_access_tokenhttps的请求地址
+wx.webAccessTokenhttps = https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
+#拉取用户信息的请求地址
+wx.userMessage=https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN
+#微信统一下单接口路径
+wx.uniformorder=https://api.mch.weixin.qq.com/pay/unifiedorder
+#退款地址
+wx.refundUrl=https://api.mch.weixin.qq.com/secapi/pay/refund
+#退款查询地址
+wx.refundqueryUrl=https://api.mch.weixin.qq.com/pay/refundquery
+#微信查询订单状态
+wx.orderquery=https://api.mch.weixin.qq.com/pay/orderquery
+
+ali.webAccessTokenhttps=https://openapi.alipay.com/gateway.do
+ali.appId=
+ali.privateKey=
+ali.pubKey=
+
+#安全起见,暴露的短信接口需要配置有效的请求IP
+sms.validIp=127.0.0.1
+
+#演示环境  1:是  0:否
+sys.demo=1
+
+#微信公众号appId
+mp.appId=
+#微信公众号secret
+mp.secret=
+#令牌(Token)
+mp.token=
+#消息加解密密钥
+mp.aesKey=

+ 67 - 0
platform-admin/src/main/resources/ehcache.xml

@@ -0,0 +1,67 @@
+<!-- for ehcache 2.x -->
+<ehcache updateCheck="false" dynamicConfig="false">
+
+    <diskStore path="java.io.tmpdir"/>
+
+    <cacheManagerEventListenerFactory class="" properties=""/>
+
+    <!--Default Cache configuration. These will applied to caches programmatically created through
+        the CacheManager.
+
+        The following attributes are required for defaultCache:
+
+        maxInMemory       - Sets the maximum number of objects that will be created in memory
+        eternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the element
+                            is never expired.
+        timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
+                            if the element is not eternal. Idle time is now - last accessed time
+        timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
+                            if the element is not eternal. TTL is now - creation time
+        overflowToDisk    - Sets whether elements can overflow to disk when the in-memory cache
+                            has reached the maxInMemory limit.
+
+        -->
+    <defaultCache
+            maxElementsInMemory="50000"
+            eternal="false"
+            timeToIdleSeconds="3600000"
+            timeToLiveSeconds="3600000"
+            overflowToDisk="true">
+    </defaultCache>
+
+    <!--Predefined caches.  Add your cache configuration settings here.
+        If you do not have a configuration for your cache a WARNING will be issued when the
+        CacheManager starts
+
+        The following attributes are required for defaultCache:
+
+        name              - Sets the name of the cache. This is used to identify the cache. It must be unique.
+        maxInMemory       - Sets the maximum number of objects that will be created in memory
+        eternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the element
+                            is never expired.
+        timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
+                            if the element is not eternal. Idle time is now - last accessed time
+        timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
+                            if the element is not eternal. TTL is now - creation time
+        overflowToDisk    - Sets whether elements can overflow to disk when the in-memory cache
+                            has reached the maxInMemory limit.
+
+        -->
+
+    <cache name="sysCache"
+           maxElementsInMemory="50000"
+           eternal="false"
+           timeToIdleSeconds="3600000"
+           timeToLiveSeconds="3600000"
+           overflowToDisk="false">
+    </cache>
+
+    <cache name="shopCache"
+           maxElementsInMemory="50000"
+           eternal="false"
+           timeToIdleSeconds="3600000"
+           timeToLiveSeconds="3600000"
+           overflowToDisk="false">
+    </cache>
+
+</ehcache>

+ 95 - 0
platform-admin/src/main/resources/j2cache.properties

@@ -0,0 +1,95 @@
+#J2Cache configuration
+#########################################
+# Cache Broadcast Method
+# values:
+# jgroups -> use jgroups's multicast
+# redis -> use redis publish/subscribe mechanism
+# none -> don't notify the other nodes in cluster
+# xx.xxxx.xxxx.Xxxxx your own cache broadcast policy classname that implement net.oschina.j2cache.ClusterPolicy
+#########################################
+j2cache.broadcast=redis
+#组播的通道名称
+jgroups.channel.name=j2cache
+jgroups.configXml=/network.xml
+#########################################
+# Level 1&2 provider
+# values:
+# none -> disable this level cache
+# ehcache -> use ehcache2 as level 1 cache
+# ehcache3 -> use ehcache3 as level 1 cache
+# caffeine -> use caffeine as level 1 cache(only in memory)
+# redis -> use redis(hashs) as level 2 cache
+# readonly-redis -> use redis as level 2 cache ,but never write data to it. if use this provider, you must uncomment `j2cache.L2.config_section` to make the redis configurations available.
+# [classname] -> use custom provider
+#########################################
+j2cache.L1.provider_class=caffeine
+j2cache.L2.provider_class=redis
+# When L2 provider isn't `redis`, using `L2.config_section = redis` to read redis configurations
+# j2cache.L2.config_section = redis
+# Enable/Disable ttl in redis cache data (if disabled, the object in redis will never expire)
+j2cache.sync_ttl_to_redis=true
+# Whether to cache null objects by default
+j2cache.default_cache_null_object=true
+#########################################
+# Cache Serialization Provider
+# values:
+# fst -> fast-serialization
+# kyro -> kyro
+# java -> java standard
+# [classname implements Serializer]
+#########################################
+j2cache.serialization=fst
+#########################################
+# Ehcache configuration
+#########################################
+ehcache.configXml=/ehcache.xml
+#########################################
+# Caffeine configuration
+# caffeine.region.[name] = size, xxxx[s|m|h|d]
+#
+#########################################
+caffeine.properties=/caffeine.properties
+#########################################
+# Redis connection configuration
+#########################################
+#########################################
+# Redis Cluster Mode
+#
+# single -> single redis server
+# sentinel -> master-slaves servers
+# cluster -> cluster servers (数据库配置无效,使用 database = 0)
+# sharded -> sharded servers  (密码、数据库必须在 hosts 中指定,且连接池配置无效 ; redis://user:password@127.0.0.1:6379/0)
+#
+#########################################
+redis.mode=single
+#redis storage mode (generic|hash)
+redis.storage=generic
+## redis pub/sub channel name
+redis.channel=j2cache
+## redis pub/sub server (using redis.hosts when empty)
+redis.channel.host=
+#cluster name just for sharded
+redis.cluster_name=j2cache
+## redis cache namespace optional, default[j2cache]
+redis.namespace=
+## connection 集群环境多个hosts以英文逗号隔开,如 127.0.0.1:6379,127.0.0.1:6378
+redis.hosts=localhost:6379
+redis.timeout=2000
+## 集群每个节点密码必须保持一致
+redis.password=
+redis.database=0
+## redis pool properties
+redis.maxTotal=100
+redis.maxIdle=10
+redis.maxWaitMillis=5000
+redis.minEvictableIdleTimeMillis=60000
+redis.minIdle=1
+redis.numTestsPerEvictionRun=10
+redis.lifo=false
+redis.softMinEvictableIdleTimeMillis=10
+redis.testOnBorrow=true
+redis.testOnReturn=false
+redis.testWhileIdle=true
+redis.timeBetweenEvictionRunsMillis=300000
+redis.blockWhenExhausted=false
+redis.jmxEnabled=false

+ 14 - 0
platform-admin/src/main/resources/mybatis.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-config.dtd">
+<configuration>
+    <settings>
+        <setting name="mapUnderscoreToCamelCase" value="true"/>
+    </settings>
+    <plugins>
+        <plugin interceptor="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor">
+            <property name="dialectClass" value="com.github.miemiedev.mybatis.paginator.dialect.MySQLDialect"/>
+        </plugin>
+    </plugins>
+</configuration><!-- 配置分页插件 -->
+

+ 43 - 0
platform-admin/src/main/resources/network.xml

@@ -0,0 +1,43 @@
+<config xmlns="urn:org:jgroups"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/jgroups.xsd">
+    <UDP
+            mcast_port="${jgroups.udp.mcast_port:45588}"
+            ip_ttl="4"
+            ucast_recv_buf_size="5M"
+            ucast_send_buf_size="5M"
+            mcast_recv_buf_size="5M"
+            mcast_send_buf_size="5M"
+            max_bundle_size="64K"
+            enable_diagnostics="false"
+
+            thread_pool.min_threads="2"
+            thread_pool.max_threads="8"
+            thread_pool.keep_alive_time="5000"/>
+
+    <PING/>
+    <MERGE3 max_interval="30000"
+            min_interval="10000"/>
+    <FD_SOCK/>
+    <FD_ALL/>
+    <VERIFY_SUSPECT timeout="1500"/>
+    <pbcast.NAKACK2 xmit_interval="500"
+                    xmit_table_num_rows="100"
+                    xmit_table_msgs_per_row="2000"
+                    xmit_table_max_compaction_time="30000"
+                    use_mcast_xmit="false"
+                    discard_delivered_msgs="true"/>
+    <UNICAST3 xmit_interval="500"
+              xmit_table_num_rows="100"
+              xmit_table_msgs_per_row="2000"
+              xmit_table_max_compaction_time="60000"
+              conn_expiry_timeout="0"/>
+    <pbcast.STABLE desired_avg_gossip="50000"
+                   max_bytes="4M"/>
+    <pbcast.GMS print_local_addr="true" join_timeout="2000"/>
+    <UFC max_credits="2M"
+         min_threshold="0.4"/>
+    <MFC max_credits="2M"
+         min_threshold="0.4"/>
+    <FRAG2 frag_size="60K"/>
+</config>

+ 59 - 0
platform-admin/src/main/resources/prod/log4j.properties

@@ -0,0 +1,59 @@
+log4j.rootLogger=INFO,stdout,info,warn,error,file
+#控制台输出
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.Threshold=INFO
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#INFO所有日志
+log4j.logger.file=info
+log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.file.File=/usr/local/platform/logs/info.log
+log4j.appender.file.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.file.append=true
+log4j.appender.file.Threshold=INFO
+log4j.appender.file.encoding=UTF-8
+log4j.appender.file.ImmediateFlush=true
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#INFO日志
+log4j.logger.info=info
+log4j.appender.info=com.platform.log4j.GradeLogDailyRollingFileAppender
+log4j.appender.info.File=/usr/local/platform/logs/info/info.log
+log4j.appender.info.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.info.append=true
+log4j.appender.info.Threshold=INFO
+log4j.appender.info.encoding=UTF-8
+log4j.appender.info.ImmediateFlush=true
+log4j.appender.info.layout=org.apache.log4j.PatternLayout
+log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#WARN日志
+log4j.appender.warn=com.platform.log4j.GradeLogDailyRollingFileAppender
+log4j.appender.warn.File=/usr/local/platform/logs/warn/warn.log
+log4j.appender.warn.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.warn.append=true
+log4j.appender.warn.Threshold=WARN
+log4j.appender.warn.encoding=UTF-8
+log4j.appender.warn.ImmediateFlush=true
+log4j.appender.warn.layout=org.apache.log4j.PatternLayout
+log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#ERROR日志
+log4j.appender.error=com.platform.log4j.GradeLogDailyRollingFileAppender
+log4j.appender.error.File=/usr/local/platform/logs/error/error.log
+log4j.appender.error.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.error.append=true
+log4j.appender.error.Threshold=ERROR
+log4j.appender.error.encoding=UTF-8
+log4j.appender.error.ImmediateFlush=true
+log4j.appender.error.layout=org.apache.log4j.PatternLayout
+log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#执行慢的SQL
+log4j.logger.com.alibaba.druid.filter.stat.StatFilter=ERROR,slowsql
+log4j.appender.slowsql=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.slowsql.File=/usr/local/platform/logs/slow_sql/slow_sql.log
+log4j.appender.slowsql.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.slowsql.append=true
+log4j.appender.slowsql.encoding=UTF-8
+log4j.appender.slowsql.ImmediateFlush=true
+log4j.appender.slowsql.layout=org.apache.log4j.PatternLayout
+log4j.appender.slowsql.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n

+ 58 - 0
platform-admin/src/main/resources/prod/platform.properties

@@ -0,0 +1,58 @@
+jdbc.url=jdbc:mysql://localhost:3306/platform-shop?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=Asia/Shanghai
+jdbc.username=root
+jdbc.password=123456
+
+jdbc.initialSize=5
+jdbc.maxActive=30
+jdbc.minPoolSize=2
+jdbc.maxIdleTime=30000
+jdbc.idleConnectionTestPeriod=100
+
+#小程序ID
+wx.appId=
+#小程序密钥
+wx.secret=
+#商户号
+wx.mchId=
+#支付签名
+wx.paySignKey=
+#交易类型
+wx.tradeType=JSAPI
+#证书名称,对应不同的商户号
+wx.certName=/cert/apiclient_cert.p12
+#支付回调地址
+wx.notifyUrl=https://www.yourdomain.com/platform-framework/api/notify
+#获取code的请求地址
+wx.getCode=https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=STAT#wechat_redirect
+#获取Web_access_tokenhttps的请求地址
+wx.webAccessTokenhttps = https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
+#拉取用户信息的请求地址
+wx.userMessage=https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN
+#微信统一下单接口路径
+wx.uniformorder=https://api.mch.weixin.qq.com/pay/unifiedorder
+#退款地址
+wx.refundUrl=https://api.mch.weixin.qq.com/secapi/pay/refund
+#退款查询地址
+wx.refundqueryUrl=https://api.mch.weixin.qq.com/pay/refundquery
+#微信查询订单状态
+wx.orderquery=https://api.mch.weixin.qq.com/pay/orderquery
+
+ali.webAccessTokenhttps=https://openapi.alipay.com/gateway.do
+ali.appId=
+ali.privateKey=
+ali.pubKey=
+
+#安全起见,暴露的短信接口需要配置有效的请求IP
+sms.validIp=127.0.0.1
+
+#演示环境  1:是  0:否
+sys.demo=0
+
+#微信公众号appId
+mp.appId=
+#微信公众号secret
+mp.secret=
+#令牌(Token)
+mp.token=
+#消息加解密密钥
+mp.aesKey=

+ 157 - 0
platform-admin/src/main/resources/spring-jdbc.xml

@@ -0,0 +1,157 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
+       xsi:schemaLocation="
+        http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
+        http://www.springframework.org/schema/context
+        http://www.springframework.org/schema/context/spring-context-4.2.xsd
+        http://www.springframework.org/schema/tx
+     	http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
+		http://www.springframework.org/schema/aop
+		http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
+
+    <tx:annotation-driven/>
+    <!-- Import Properties -->
+    <context:property-placeholder location="classpath*:platform.properties"/>
+
+    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
+          init-method="init" destroy-method="close">
+        <property name="url">
+            <value>${jdbc.url}</value>
+        </property>
+        <property name="username">
+            <value>${jdbc.username}</value>
+        </property>
+        <property name="password">
+            <value>${jdbc.password}</value>
+        </property>
+        <property name="initialSize">
+            <value>${jdbc.initialSize}</value>
+        </property>
+        <property name="maxActive">
+            <value>${jdbc.maxActive}</value>
+        </property>
+        <property name="proxyFilters">
+            <list>
+                <ref bean="stat-filter"/>
+                <!--过滤永真条件 防止注入-->
+                <ref bean="wall-filter"/>
+            </list>
+        </property>
+        <property name="connectionInitSqls" value="set names utf8mb4;"/>
+    </bean>
+
+    <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
+        <property name="slowSqlMillis" value="1000"/>
+        <property name="logSlowSql" value="true"/>
+        <property name="mergeSql" value="true"/>
+    </bean>
+
+    <bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter">
+        <property name="dbType" value="mysql"/>
+        <property name="config" ref="wall-filter-config"/>
+    </bean>
+
+    <bean id="wall-filter-config" class="com.alibaba.druid.wall.WallConfig">
+        <property name="multiStatementAllow" value="true"/>
+    </bean>
+
+    <bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor"></bean>
+    <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut" scope="prototype">
+        <property name="patterns">
+            <list>
+                <value>com.platform.controller.*</value>
+                <value>com.platform.service.*</value>
+            </list>
+        </property>
+    </bean>
+    <aop:config>
+        <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut"/>
+    </aop:config>
+
+    <!-- 配置事务管理器 -->
+    <bean id="transactionManager"
+          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
+        <property name="dataSource" ref="dataSource"></property>
+    </bean>
+
+    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
+        <property name="dataSource">
+            <ref bean="dataSource"/>
+        </property>
+    </bean>
+
+    <!-- JDBC配置 -->
+    <bean id="namedParameterJdbcTemplate"
+          class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
+        <constructor-arg ref="dataSource"/>
+    </bean>
+
+    <!-- SqlSessionFactory MyBatisPlus Config -->
+    <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
+        <property name="typeAliasesPackage" value="com.platform.entity"/>
+        <property name="dataSource" ref="dataSource"/>
+        <property name="globalConfig">
+            <bean class="com.baomidou.mybatisplus.core.config.GlobalConfig">
+                <property name="dbConfig">
+                    <bean class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig">
+                        <!-- 表关键词 key 生成器 -->
+                        <property name="keyGenerator">
+                            <bean class="com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator"/>
+                        </property>
+                        <!-- 主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID"; -->
+                        <property name="idType" value="AUTO"/>
+                        <!-- 字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" -->
+                        <property name="fieldStrategy" value="NOT_EMPTY"/>
+                        <!-- 逻辑删除配置 -->
+                        <property name="logicDeleteValue" value="0"/>
+                        <property name="logicNotDeleteValue" value="1"/>
+                        <!-- 数据库类型,默认值为未知的数据库类型 如果值为OTHER,启动时会根据数据库连接 url 获取数据库类型;如果不是OTHER则不会自动获取数据库类型 -->
+                        <property name="dbType" value="OTHER"/>
+                    </bean>
+                </property>
+                <property name="sqlInjector">
+                    <!-- 注入逻辑删除 -->
+                    <bean class="com.baomidou.mybatisplus.extension.injector.LogicSqlInjector"/>
+                </property>
+            </bean>
+        </property>
+        <property name="configuration">
+            <bean class="com.baomidou.mybatisplus.core.MybatisConfiguration">
+                <!-- 是否开启自动驼峰命名规则(camel case)映射,即从A_COLUMN(下划线命名) 到Java 属性名 aColumn(驼峰命名) 的类似映射。 -->
+                <property name="mapUnderscoreToCamelCase" value="true"/>
+                <!-- 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true。 -->
+                <property name="cacheEnabled" value="false"/>
+                <!--指定当结果集中值为 null 的时候是否调用映射对象的 Setter(Map 对象时为 put)方法,通常运用于有 Map.keySet() 依赖或 null 值初始化的情况。
+                    通俗的讲,即 MyBatis 在使用 resultMap 来映射查询结果中的列,如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段,这就
+                    导致在调用到该字段的时候由于没有映射,取不到而报空指针异常。-->
+                <property name="callSettersOnNulls" value="false"/>
+                <!-- 配置JdbcTypeForNull, oracle数据库必须配置 -->
+                <property name="jdbcTypeForNull" value="NULL"/>
+            </bean>
+        </property>
+        <property name="plugins">
+            <array>
+                <!-- 性能分析拦截器 -->
+                <bean class="com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor">
+                    <property name="format" value="true"></property>
+                    <property name="maxTime" value="100"></property>
+                    <!-- 是否写入日志文件(true 写入日志文件,不阻断程序执行!超过设定的最大执行时长异常提示) -->
+                    <property name="writeInLog" value="true"></property>
+                </bean>
+                <!-- 分页拦截器 -->
+                <bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"/>
+                <!-- 乐观锁 -->
+                <bean class="com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor"/>
+            </array>
+        </property>
+    </bean>
+
+    <!-- MyBatis Mapper Scan Config  -->
+    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
+        <property name="basePackage" value="com.platform.dao,com.platform.*.dao"/>
+    </bean>
+</beans>

+ 123 - 0
platform-admin/src/main/resources/spring-mvc.xml

@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:aop="http://www.springframework.org/schema/aop"
+       xmlns:mvc="http://www.springframework.org/schema/mvc"
+       xsi:schemaLocation="
+        http://www.springframework.org/schema/beans 
+        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd        
+        http://www.springframework.org/schema/context 
+        http://www.springframework.org/schema/context/spring-context-4.2.xsd
+     	http://www.springframework.org/schema/aop 
+     	http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
+		http://www.springframework.org/schema/mvc 
+     	http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
+
+    <context:component-scan base-package="com.platform"/>
+    <context:annotation-config/>
+    <mvc:default-servlet-handler/>
+    <aop:aspectj-autoproxy proxy-target-class="true"/>
+    <mvc:annotation-driven>
+        <mvc:message-converters register-defaults="true">
+            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
+                <property name="supportedMediaTypes">
+                    <list>
+                        <value>text/html;charset=UTF-8</value>
+                        <value>application/json;charset=UTF-8</value>
+                    </list>
+                </property>
+                <property name="features">
+                    <list>
+                        <value>WriteMapNullValue</value>
+                        <value>QuoteFieldNames</value>
+                        <value>WriteDateUseDateFormat</value>
+                        <!-- 禁用fastjson循环引用检测 -->
+                        <value>DisableCircularReferenceDetect</value>
+                    </list>
+                </property>
+            </bean>
+        </mvc:message-converters>
+    </mvc:annotation-driven>
+
+    <!-- 为了加载拦截器 需要 日志拦截器 (登录拦截和权限拦截已在shiro实现,看实现 情况处理) -->
+    <mvc:interceptors>
+        <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
+        <!--<bean class="com.platform.interceptor.LogInterceptor"/>-->
+        <mvc:interceptor>
+            <mvc:mapping path="/**"/>
+            <mvc:exclude-mapping path="/statics/**"/>
+            <mvc:exclude-mapping path="/**/**.html"/>
+            <mvc:exclude-mapping path="/**/**.js"/>
+            <bean class="com.platform.interceptor.LogInterceptor"/>
+        </mvc:interceptor>
+    </mvc:interceptors>
+
+    <!-- Velocity视图解析器    默认视图  -->
+    <bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
+        <property name="contentType" value="text/html;charset=UTF-8"/>
+        <property name="viewNames" value="*.html"/>
+        <property name="suffix" value=""/>
+        <property name="dateToolAttribute" value="date"/>
+        <property name="numberToolAttribute" value="number"/>
+        <property name="toolboxConfigLocation" value="/WEB-INF/velocity-toolbox.xml"/>
+        <!--是否使用spring对宏定义的支持-->
+        <property name="exposeRequestAttributes" value="true"/>
+        <property name="requestContextAttribute" value="rc"/>
+        <property name="order" value="0"/>
+    </bean>
+
+    <bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
+        <property name="resourceLoaderPath" value="/WEB-INF/page/"/>
+        <property name="velocityProperties">
+            <props>
+                <prop key="input.encoding">UTF-8</prop>
+                <prop key="output.encoding">UTF-8</prop>
+                <prop key="contentType">text/html;charset=UTF-8</prop>
+            </props>
+        </property>
+    </bean>
+
+    <!-- JSP视图解析器  -->
+    <bean id="viewResolverJsp" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+        <property name="prefix" value="/WEB-INF/page/"/>
+        <property name="suffix" value=".jsp"/>
+    </bean>
+
+    <!-- FreeMarker视图解析器 -->
+    <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
+        <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
+        <property name="contentType" value="text/html; charset=utf-8"/>
+        <property name="cache" value="false"/>
+        <property name="viewNames" value="*.ftl"/>
+        <property name="suffix" value=""/>
+        <property name="order" value="2"/>
+    </bean>
+
+    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
+        <property name="templateLoaderPath" value="/WEB-INF/page/"/>
+    </bean>
+
+    <bean id="multipartResolver"
+          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
+        <property name="maxUploadSize" value="1000000000"/>
+    </bean>
+
+    <!-- Kaptcha验证码生成器 -->
+    <bean name="producer" class="com.google.code.kaptcha.impl.DefaultKaptcha" scope="singleton">
+        <property name="config">
+            <bean class="com.google.code.kaptcha.util.Config">
+                <constructor-arg>
+                    <props>
+                        <prop key="kaptcha.border">no</prop>
+                        <prop key="kaptcha.textproducer.font.color">black</prop>
+                        <prop key="kaptcha.textproducer.char.space">4</prop>
+                        <prop key="kaptcha.textproducer.char.length">4</prop>
+                        <prop key="kaptcha.textproducer.char.string">123456789</prop>
+                    </props>
+                </constructor-arg>
+            </bean>
+        </property>
+    </bean>
+
+</beans>

+ 9 - 0
platform-admin/src/main/webapp/WEB-INF/dispatcher-servlet.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="
+        http://www.springframework.org/schema/beans 
+        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
+
+
+</beans>

+ 48 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/config.html

@@ -0,0 +1,48 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>参数管理</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <i-col span="4">
+                <i-input v-model="q.key" @on-enter="query" placeholder="参数名"/>
+            </i-col>
+            <i-button @click="query">查询</i-button>
+            <div class="buttons-group">
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="config" :rules="ruleValidate" :label-width="80">
+            <Form-item label="参数名" prop="key">
+                <i-input v-model="config.key" placeholder="参数名"/>
+            </Form-item>
+            <Form-item label="参数值" prop="value">
+                <i-input v-model="config.value" placeholder="参数值"/>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <i-input type="textarea" v-model="config.remark" placeholder="备注"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/config.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 64 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/dept.html

@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>部门管理</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-button type="ghost" @click="reload"><i class="fa fa-refresh"></i>&nbsp;刷新</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("sys:dept:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("sys:dept:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("sys:dept:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="deptTable" data-mobile-responsive="true" data-click-to-select="true">
+            <thead>
+            <tr>
+                <th data-field="selectItem" data-checkbox="true"></th>
+            </tr>
+            </thead>
+        </table>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="dept" :rules="ruleValidate" :label-width="80">
+            <Form-item label="部门名称" prop="name">
+                <i-input v-model="dept.name" placeholder="部门名称"/>
+            </Form-item>
+
+            <Form-item label="上级部门" prop="deptName">
+                <i-input type="text" v-model="dept.parentName" icon="eye" readonly="readonly"
+                         @on-click="deptTree" readonly="readonly" placeholder="一级部门"/>
+            </Form-item>
+            <Form-item label="排序号" prop="orderNum">
+                <Input-number :min="0" :step="1" v-model="dept.orderNum" placeholder="排序号" style="width: 188px;"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<!-- 选择部门 -->
+<div id="deptLayer" style="display: none;padding:10px;">
+    <ul id="deptTree" class="ztree"></ul>
+</div>
+
+<script src="${rc.contextPath}/js/sys/dept.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 27 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/generator.html

@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>代码生成器</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp">
+    <div class="grid-btn">
+        <div class="search-group">
+            <i-col span="4">
+                <i-input v-model="q.tableName" @on-enter="query" placeholder="表名"/>
+            </i-col>
+            <i-button @click="query">查询</i-button>
+            <i-button @click="reloadSearch">重置</i-button>
+        </div>
+        <div class="buttons-group">
+            <i-button type="primary" @click="generator"><i class="fa fa-file-code-o"></i>&nbsp;生成代码</i-button>
+        </div>
+    </div>
+    <table id="jqGrid"></table>
+    <div id="jqGridPager"></div>
+</div>
+
+<script src="${rc.contextPath}/js/sys/generator.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 64 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/header.html

@@ -0,0 +1,64 @@
+<meta charset="UTF-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
+<!--bootstrap-->
+<link rel="stylesheet" href="${rc.contextPath}/statics/css/bootstrap.min.css">
+<link rel="stylesheet" href="${rc.contextPath}/statics/css/font-awesome.min.css">
+<!--jqgrid-->
+<link rel="stylesheet" href="${rc.contextPath}/statics/plugins/jqgrid/ui.jqgrid-bootstrap.css">
+<link rel="stylesheet" href="${rc.contextPath}/statics/plugins/ztree/css/metroStyle/metroStyle.css">
+<!--main-->
+<link rel="stylesheet" href="${rc.contextPath}/statics/css/main.css">
+<link rel="stylesheet" href="${rc.contextPath}/statics/css/iview.css">
+<link rel="stylesheet" href="${rc.contextPath}/statics/css/style.css">
+<!--treegrid-->
+<link rel="stylesheet" href="${rc.contextPath}/statics/plugins/treegrid/jquery.treegrid.css">
+<!--富文本-->
+<link rel="stylesheet" href='${rc.contextPath}/statics/plugins/froala_editor/css/froala_editor.min.css'/>
+
+<!--jquery-->
+<script src="${rc.contextPath}/statics/libs/jquery.min.js"></script>
+<!--layer-->
+<script src="${rc.contextPath}/statics/plugins/layer/layer.js"></script>
+<!--bootstrap-->
+<script src="${rc.contextPath}/statics/libs/bootstrap.min.js"></script>
+<!--vue-->
+<script src="${rc.contextPath}/statics/libs/vue.min.js"></script>
+<script src="${rc.contextPath}/statics/libs/iview.min.js"></script>
+<!--jqgrid-->
+<script src="${rc.contextPath}/statics/plugins/jqgrid/grid.locale-cn.js"></script>
+<script src="${rc.contextPath}/statics/plugins/jqgrid/jquery.jqGrid.min.js"></script>
+<!--ztree-->
+<script src="${rc.contextPath}/statics/plugins/ztree/jquery.ztree.all.min.js"></script>
+<!--treegrid-->
+<script src="${rc.contextPath}/statics/plugins/treegrid/jquery.treegrid.extension.js"></script>
+<script src="${rc.contextPath}/statics/plugins/treegrid/jquery.treegrid.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/treegrid/jquery.treegrid.bootstrap3.js"></script>
+<script src="${rc.contextPath}/statics/plugins/treegrid/tree.table.js"></script>
+
+<!--simplemde富文本-->
+<script src='${rc.contextPath}/statics/plugins/froala_editor/js/froala_editor.min.js'></script>
+<!--[if lt IE 9]>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/froala_editor_ie8.min.js"></script>
+<![endif]-->
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/tables.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/lists.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/colors.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/media_manager.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/font_family.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/font_size.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/block_styles.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/video.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/langs/zh_cn.js"></script>
+
+<script src="${rc.contextPath}/statics/libs/jquery-extend.js"></script>
+<script src="${rc.contextPath}/js/common.js"></script>
+<script>
+    var _hmt = _hmt || [];
+    (function() {
+        var hm = document.createElement("script");
+        hm.src = "https://hm.baidu.com/hm.js?4656e49e8efa9f2ad6868ea26fb8984c";
+        var s = document.getElementsByTagName("script")[0];
+        s.parentNode.insertBefore(hm, s);
+    })();
+</script>

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 4154 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/icon.html


+ 26 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/log.html

@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>系统日志</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <Row :gutter="16">
+        <div class="search-group">
+            <i-col span="4">
+                <i-input v-model="q.key" @on-enter="query" placeholder="用户名、用户操作"/>
+            </i-col>
+            <Checkbox-group v-model="isLogin" @on-change="query" class="inline">
+                <Checkbox label="登录"><span>登录日志</span></Checkbox>
+            </Checkbox-group>
+            <i-button @click="query">查询</i-button>
+        </div>
+    </Row>
+    <table id="jqGrid"></table>
+    <div id="jqGridPager"></div>
+</div>
+
+<script src="${rc.contextPath}/js/sys/log.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 82 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/macro.html

@@ -0,0 +1,82 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>通用字典表</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-button type="ghost" @click="reload"><i class="fa fa-refresh"></i>&nbsp;刷新</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("sys:macro:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("sys:macro:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("sys:macro:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="macro" :rules="ruleValidate" :label-width="80">
+            <Form-item label="类型" prop="type">
+                <Radio-group v-model="macro.type">
+                    <Radio label="0">
+                        <span>目录</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>参数配置</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="状态">
+                <Radio-group v-model="macro.status">
+                    <Radio label="0">
+                        <span>隐藏</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>显示</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item v-if="macro.type==1" label="父级" prop="parentId" style="width: 268px;">
+                <i-select v-model="macro.parentId" filterable>
+                    <i-option v-for="macro in macros" :value="macro.id" :key="macro.id">{{macro.name}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="名称" prop="name">
+                <i-input v-model="macro.name" placeholder="名称"/>
+            </Form-item>
+            <Form-item label="值" prop="value">
+                <i-input v-model="macro.value" placeholder="值"/>
+            </Form-item>
+            <Form-item label="排序" prop="orderNum">
+                <Input-number :min="0" :step="1" v-model="macro.orderNum" placeholder="排序" style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <i-input type="textarea" v-model="macro.remark" placeholder="备注"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/macro.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 54 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/main.html

@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>欢迎页</title>
+    #parse("sys/header.html")
+	
+	<script src='https://gitee.com/fuyang_lipengjun/platform/widget_preview'></script>
+	<style>
+		.pro_name a{color: #4183c4;}
+		.osc_git_title{background-color: #fff;}
+		.osc_git_box{background-color: #fff;}
+		.osc_git_box{border-color: #E3E9ED;margin: 20px;}
+		.osc_git_info{color: #666;}
+		.osc_git_main a{color: #9B9B9B;}
+	</style>
+</head>
+<body>
+<div class="wrapper wrapper-content  animated fadeInRight">
+    <div class="ibox ">
+        <div class="ibox-title">
+            <h1>项目介绍</h1>
+        </div>
+        <div class="ibox-content">
+            <div class="signin-info">
+                <ul class="m-b">
+                    <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> 一个轻量级的Java快速开发平台,能快速开发项目</li>
+                    <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> 使用目前主流的JavaEE开发框架Spring+SpringMVC+Mybatis+Shiro+J2Cache,简单易学,学习成本低</li>
+                    <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> 友好的代码结构及注释,便于阅读及二次开发</li>
+                    <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> 完善的XSS防范及脚本过滤,彻底杜绝XSS攻击</li>
+                    <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> 日志分级输出,便于分析日志</li>
+                    <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> 前端使用Vue+iView,上手容易</li>
+                    <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> <a href="https://gitee.com/fuyang_lipengjun/platform" target="_blank">Git:https://gitee.com/fuyang_lipengjun/platform</a></li>
+                    <li><i class="fa fa-arrow-circle-o-right m-r-xs"></i> <a href="https://apidoc.gitee.com/fuyang_lipengjun/platform" target="_blank">JavaDoc:https://apidoc.gitee.com/fuyang_lipengjun/platform</a></li>
+                </ul>
+            </div>
+
+        </div>
+    </div>
+    <div class="ibox ">
+        <div class="ibox-title">
+            <h1>官方QQ群</h1>
+        </div>
+        <div class="ibox-content">
+            <div class="signin-info">
+                <ul>
+                    <li><i class="fa fa-qq m-r-xs"></i> 66502035(微同科技)</li>
+                </ul>
+            </div>
+
+        </div>
+    </div>
+</div>
+</body>
+</html>

+ 97 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/menu.html

@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>菜单管理</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-button type="ghost" @click="reload"><i class="fa fa-refresh"></i>&nbsp;刷新</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("sys:menu:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("sys:menu:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("sys:menu:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="menu" :rules="ruleValidate" :label-width="80">
+            <Form-item label="类型" prop="type">
+                <Radio-group v-model="menu.type">
+                    <Radio label="0">
+                        <span>目录</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>菜单</span>
+                    </Radio>
+                    <Radio label="2">
+                        <span>按钮</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="菜单名称" prop="name">
+                <i-input v-model="menu.name" placeholder="菜单名称或按钮名称"/>
+            </Form-item>
+
+            <Form-item label="上级菜单" v-if="menu.type == 2" prop="parentName">
+                <i-input v-model="menu.parentName" @on-click="menuTree" icon="eye" readonly="readonly"
+                         placeholder="一级菜单"/>
+            </Form-item>
+            <Form-item label="上级菜单" v-if="menu.type != 2">
+                <i-input v-model="menu.parentName" @on-click="menuTree" icon="eye" readonly="readonly"
+                         placeholder="一级菜单"/>
+            </Form-item>
+
+            <Form-item v-if="menu.type == 1" label="菜单URL" prop="url">
+                <i-input v-model="menu.url" placeholder="菜单URL"/>
+            </Form-item>
+            <Form-item v-if="menu.type == 1 || menu.type == 2" label="授权标识" prop="perms">
+                <i-input v-model="menu.perms" placeholder="多个用逗号分隔,如:user:list,user:create"/>
+            </Form-item>
+            <Form-item v-if="menu.type != 2" label="排序号" prop="orderNum">
+                <Input-number :min="0" :step="1" v-model="menu.orderNum" placeholder="排序号" style="width: 188px;"/>
+            </Form-item>
+            <Form-item v-if="menu.type != 2" label="图标" prop="icon">
+                <i-input v-model="menu.icon" placeholder="图标,点击右边按钮选取图标" @on-click="selectIcon" icon="eye"/>
+            </Form-item>
+            <Form-item label="状态" prop="status">
+                <Radio-group v-model="menu.status">
+                    <Radio label="0">
+                        <span>有效</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>无效</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<!-- 选择菜单 -->
+<div id="menuLayer" style="display: none;padding:10px;">
+    <ul id="menuTree" class="ztree"></ul>
+</div>
+
+<script src="${rc.contextPath}/js/sys/menu.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 144 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/oss.html

@@ -0,0 +1,144 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>文件上传</title>
+    #parse("sys/header.html")
+    <script src="${rc.contextPath}/statics/libs/ajaxupload.js"></script>
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-button type="success" @click="addConfig"><i class="fa fa-sun-o"></i>&nbsp;云存储配置</i-button>
+            </div>
+            <div class="buttons-group">
+                <i-button type="primary" id="upload"><i class="fa fa-plus"></i>&nbsp;上传文件</i-button>
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                <i-button type="success" @click="lookImg"><i class="fa fa-eye"></i>&nbsp;预览</i-button>
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form :label-width="130">
+            <Form-item label="存储类型" prop="type">
+                <Radio-group v-model="config.type">
+                    <Radio label="2">
+                        <span>阿里云</span>
+                    </Radio>
+                    <Radio label="3">
+                        <span>腾讯云</span>
+                    </Radio>
+                    <Radio label="4">
+                        <span>服务器</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>七牛</span>
+                    </Radio>
+                    <Radio label="5">
+                        <span>MINIO</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <i-form v-if="config.type == 1" ref="formValidate" :label-width="130">
+                <Form-item label="域名" prop="qiniuDomain">
+                    <i-input v-model="config.qiniuDomain" placeholder="七牛绑定的域名"/>
+                </Form-item>
+                <Form-item label="路径前缀" prop="qiniuPrefix">
+                    <i-input v-model="config.qiniuPrefix" placeholder="不设置默认为空"/>
+                </Form-item>
+                <Form-item label="AccessKey" prop="qiniuAccessKey">
+                    <i-input v-model="config.qiniuAccessKey" placeholder="七牛AccessKey"/>
+                </Form-item>
+                <Form-item label="SecretKey" prop="qiniuSecretKey">
+                    <i-input v-model="config.qiniuSecretKey" placeholder="七牛SecretKey"/>
+                </Form-item>
+                <Form-item label="空间名" prop="qiniuBucketName">
+                    <i-input v-model="config.qiniuBucketName" placeholder="七牛存储空间名"/>
+                </Form-item>
+            </i-form>
+            <i-form v-if="config.type == 2" ref="formValidate" :model="config" :rules="aliRuleValidate"
+                    :label-width="130">
+                <Form-item label="域名" prop="aliyunDomain">
+                    <i-input v-model="config.aliyunDomain" placeholder="阿里云绑定的域名"/>
+                </Form-item>
+                <Form-item label="路径前缀" prop="aliyunPrefix">
+                    <i-input v-model="config.aliyunPrefix" placeholder="不设置默认为空"/>
+                </Form-item>
+                <Form-item label="EndPoint" prop="aliyunEndPoint">
+                    <i-input v-model="config.aliyunEndPoint" placeholder="阿里云EndPoint"/>
+                </Form-item>
+                <Form-item label="AccessKeyId" prop="aliyunAccessKeyId">
+                    <i-input v-model="config.aliyunAccessKeyId" placeholder="阿里云AccessKeyId"/>
+                </Form-item>
+                <Form-item label="AccessKeySecret" prop="aliyunAccessKeySecret">
+                    <i-input v-model="config.aliyunAccessKeySecret" placeholder="阿里云AccessKeySecret"/>
+                </Form-item>
+                <Form-item label="BucketName" prop="aliyunBucketName">
+                    <i-input v-model="config.aliyunBucketName" placeholder="阿里云BucketName"/>
+                </Form-item>
+            </i-form>
+            <i-form ref="formValidate" :model="config" :rules="qcloudRuleValidate" v-if="config.type == 3"
+                    :label-width="130">
+                <Form-item label="域名" prop="qcloudDomain">
+                    <i-input v-model="config.qcloudDomain" placeholder="腾讯云绑定的域名"/>
+                </Form-item>
+                <Form-item label="路径前缀" prop="qcloudPrefix">
+                    <i-input v-model="config.qcloudPrefix" placeholder="不设置默认为空"/>
+                </Form-item>
+                <Form-item label="AppId" prop="qcloudAppId">
+                    <i-input v-model="config.qcloudAppId" placeholder="腾讯云AppId"/>
+                </Form-item>
+                <Form-item label="SecretId" prop="qcloudSecretId">
+                    <i-input v-model="config.qcloudSecretId" placeholder="腾讯云SecretId"/>
+                </Form-item>
+                <Form-item label="SecretKey" prop="qcloudSecretKey">
+                    <i-input v-model="config.qcloudSecretKey" placeholder="腾讯云SecretKey"/>
+                </Form-item>
+                <Form-item label="BucketName" prop="qcloudBucketName">
+                    <i-input v-model="config.qcloudBucketName" placeholder="腾讯云BucketName"/>
+                </Form-item>
+                <Form-item label="Bucket所属地区" prop="qcloudRegion">
+                    <i-input v-model="config.qcloudRegion" placeholder="如:sh(可选值 ,华南:gz 华北:tj 华东:sh)"/>
+                </Form-item>
+            </i-form>
+            <i-form ref="formValidate" :model="config" :rules="diskRuleValidate" v-if="config.type == 4"
+                    :label-width="130">
+                <Form-item label="存储路径" prop="diskPath">
+                    <i-input v-model="config.diskPath" placeholder="本地存储路径"/>
+                </Form-item>
+                <Form-item label="代理服务器" prop="proxyServer">
+                    <i-input v-model="config.proxyServer" placeholder="本地存储代理服务器,比如Nginx代理服务"/>
+                </Form-item>
+            </i-form>
+            <i-form ref="formValidate" :model="config" :rules="minioRuleValidate" v-if="config.type == 5"
+                    :label-width="130">
+                <Form-item label="minioUrl" prop="minioUrl">
+                    <i-input v-model="config.minioUrl" placeholder="minio绑定的域名"/>
+                </Form-item>
+                <Form-item label="存储桶" prop="minioBucketName">
+                    <i-input v-model="config.minioBucketName" placeholder="设置存储桶"/>
+                </Form-item>
+                <Form-item label="minioAccessKey" prop="minioAccessKey">
+                    <i-input v-model="config.minioAccessKey" placeholder="minioAccessKey"/>
+                </Form-item>
+                <Form-item label="minioSecretKey" prop="minioSecretKey">
+                    <i-input v-model="config.minioSecretKey" placeholder="minioSecretKey"/>
+                </Form-item>
+            </i-form>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/oss.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 80 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/region.html

@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <i-col span="4">
+                <i-input v-model="q.parentName" @on-enter="query" placeholder="上级区域"/>
+            </i-col>
+            <i-col span="4">
+                <i-input v-model="q.name" @on-enter="query" placeholder="区域"/>
+            </i-col>
+            <i-col span="4">
+                <i-select v-model="q.type">
+                    <i-option value="">请选择</i-option>
+                    <i-option value="0">国家</i-option>
+                    <i-option value="1">省份</i-option>
+                    <i-option value="2">地市</i-option>
+                    <i-option value="3">区县</i-option>
+                </i-select>
+            </i-col>
+            <i-button @click="query">查询</i-button>
+            #if($shiro.hasPermission("sys:region:save"))
+            <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+            #end
+            #if($shiro.hasPermission("sys:region:update"))
+            <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+            #end
+            #if($shiro.hasPermission("sys:region:delete"))
+            <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+            #end
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="region" :rules="ruleValidate" :label-width="80">
+            <Form-item label="类型" prop="type">
+                <Radio-group v-model="region.type" @on-change="changeType">
+                    <Radio label="0">
+                        <span>国家</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>省份</span>
+                    </Radio>
+                    <Radio label="2">
+                        <span>地市</span>
+                    </Radio>
+                    <Radio label="3">
+                        <span>区县</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="上级区域" prop="parentId">
+                <i-select v-model="region.parentId" filterable>
+                    <i-option v-for="region in regionList" :value="region.id" :key="region.id">{{region.name}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="区域名称" prop="name">
+                <i-input v-model="region.name" placeholder="区域名称"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/region.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 72 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/role.html

@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>角色管理</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.roleName" @on-enter="query" placeholder="角色名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("sys:role:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("sys:role:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("sys:role:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="role" :rules="ruleValidate" :label-width="80">
+            <Form-item label="角色名称" prop="roleName">
+                <i-input v-model="role.roleName" placeholder="角色名称"/>
+            </Form-item>
+            <Form-item label="所属部门" prop="deptName">
+                <i-input type="text" v-model="role.deptName" icon="eye" readonly="readonly"
+                         @on-click="deptTree" readonly="readonly" placeholder="所属部门"/>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <i-input type="textarea" v-model="role.remark" placeholder="备注"/>
+            </Form-item>
+            <Form-item label="功能权限">
+                <div style="overflow-y: auto;max-height: 250px">
+                    <ul id="menuTree" class="ztree"></ul>
+                </div>
+            </Form-item>
+            <Form-item label="数据权限">
+                <div style="overflow-y: auto;max-height: 250px">
+                    <ul id="dataTree" class="ztree"></ul>
+                </div>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<!-- 选择部门 -->
+<div id="deptLayer" style="display: none;padding:10px;">
+    <ul id="deptTree" class="ztree"></ul>
+</div>
+
+<script src="${rc.contextPath}/js/sys/role.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 101 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/schedule.html

@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>定时任务</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.beanName" @on-enter="query" placeholder="bean名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("sys:schedule:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("sys:schedule:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("sys:schedule:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+                #if($shiro.hasPermission("sys:schedule:pause"))
+                <i-button type="dashed" @click="pause"><i class="fa fa-pause"></i>&nbsp;暂停</i-button>
+                #end
+                #if($shiro.hasPermission("sys:schedule:resume"))
+                <i-button type="primary" @click="resume"><i class="fa fa-play"></i>&nbsp;恢复</i-button>
+                #end
+                #if($shiro.hasPermission("sys:schedule:run"))
+                <i-button type="warning" @click="runOnce"><i class="fa fa-arrow-circle-right"></i>&nbsp;立即执行</i-button>
+                #end
+                #if($shiro.hasPermission("sys:schedule:log"))
+                <a class="btn btn-primary" style="float:right;" href="schedule_log.html">日志列表</a>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+    <Row :gutter="16" v-show="!showList">
+        <i-col span="12">
+            <Card>
+                <p slot="title">{{title}}</p>
+                <i-form ref="formValidate" :model="schedule" :rules="ruleValidate" :label-width="80">
+                    <Form-item label="bean名称" prop="beanName">
+                        <i-input v-model="schedule.beanName" placeholder="spring bean名称,如:testTask"/>
+                    </Form-item>
+                    <Form-item label="方法名称" prop="methodName">
+                        <i-input v-model="schedule.methodName" placeholder="方法名称"/>
+                    </Form-item>
+                    <Form-item label="参数" prop="params">
+                        <i-input v-model="schedule.params" placeholder="参数"/>
+                    </Form-item>
+                    <Form-item label="cron表达式" prop="cronExpression">
+                        <i-input v-model="schedule.cronExpression" placeholder="如:0 0 12 * * ?"/>
+                    </Form-item>
+                    <Form-item label="备注" prop="remark">
+                        <i-input type="textarea" v-model="schedule.remark" placeholder="备注"/>
+                    </Form-item>
+                    <Form-item>
+                        <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                        <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+                        <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置
+                        </i-button>
+                    </Form-item>
+                </i-form>
+            </Card>
+        </i-col>
+        <i-col span="12">
+            <Card>
+                <p slot="title" style="text-align: center">常用Cron表达式</p>
+                <div class="panel-body">
+                    <div class="col-sm-4 control-label">0 15 10 * * ? *</div>
+                    <div class="col-sm-8 control-label">每天10点15分触发</div>
+                    <div class="col-sm-4 control-label">0 15 10 * * ? 2017</div>
+                    <div class="col-sm-8 control-label">2017年每天10点15分触发</div>
+                    <div class="col-sm-4 control-label">0 * 14 * * ?</div>
+                    <div class="col-sm-8 control-label">每天下午的 2点到2点59分每分触发</div>
+                    <div class="col-sm-4 control-label">0 0/5 14 * * ?</div>
+                    <div class="col-sm-8 control-label">每天下午的 2点到2点59分(整点开始,每隔5分触发)</div>
+                    <div class="col-sm-4 control-label">0 0/5 14,18 * * ?</div>
+                    <div class="col-sm-8 control-label">每天下午的 2点到2点59分、18点到18点59分(整点开始,每隔5分触发)</div>
+                    <div class="col-sm-4 control-label">0 0-5 14 * * ?</div>
+                    <div class="col-sm-8 control-label">每天下午的 2点到2点05分每分触发</div>
+                    <div class="col-sm-4 control-label">0 15 10 ? * 6L</div>
+                    <div class="col-sm-8 control-label">每月最后一周的星期五的10点15分触发</div>
+                    <div class="col-sm-4 control-label">0 15 10 ? * 6#3</div>
+                    <div class="col-sm-8 control-label">每月的第三周的星期五开始触发</div>
+                </div>
+            </Card>
+        </i-col>
+    </Row>
+</div>
+
+<script src="${rc.contextPath}/js/sys/schedule.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 26 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/schedule_log.html

@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>定时任务日志</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp">
+    <Row :gutter="16">
+        <div class="search-group">
+            <i-col span="4">
+                <i-input v-model="q.jobId" @on-enter="query" placeholder="任务ID"/>
+            </i-col>
+            <i-button @click="query">查询</i-button>
+        </div>
+        <div class="buttons-group">
+            <i-button type="warning" @click="back">返回</i-button>
+        </div>
+    </Row>
+    <table id="jqGrid"></table>
+    <div id="jqGridPager"></div>
+</div>
+
+<script src="${rc.contextPath}/js/sys/schedule_log.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 57 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/smslog.html

@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.sendId" @on-enter="query" placeholder="发送编号"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                <i-button type="success" @click="addConfig"><i class="fa fa-sun-o"></i>&nbsp;短信配置</i-button>
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="config" :rules="ruleValidate" :label-width="80">
+            <Form-item label="短信类型" prop="type">
+                <Radio-group v-model="config.type">
+                    <Radio label="1">
+                        <span>腾讯云SMS</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="appid" prop="appid">
+                <i-input v-model="config.appid" placeholder="appid"/>
+            </Form-item>
+            <Form-item label="appkey" prop="appkey">
+                <i-input v-model="config.appkey" placeholder="appkey"/>
+            </Form-item>
+            <Form-item label="签名" prop="sign">
+                <i-input v-model="config.sign" placeholder="【公司简称】"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/smslog.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 80 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/user.html

@@ -0,0 +1,80 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>管理员列表</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.username" @on-enter="query" placeholder="用户名"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("sys:user:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("sys:user:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("sys:user:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="user" :rules="ruleValidate" :label-width="80">
+            <Form-item label="用户名" prop="username">
+                <i-input v-model="user.username" placeholder="登录账号"/>
+            </Form-item>
+            <Form-item label="所属部门" prop="deptName">
+                <i-input type="text" v-model="user.deptName" icon="eye" readonly="readonly"
+                         @on-click="deptTree" readonly="readonly" placeholder="所属部门"/>
+            </Form-item>
+            <Form-item label="邮箱" prop="email">
+                <i-input v-model="user.email" placeholder="邮箱"/>
+            </Form-item>
+
+            <Form-item label="手机号" prop="mobile">
+                <i-input v-model="user.mobile" placeholder="手机号"/>
+            </Form-item>
+            <Form-item label="角色" prop="roleIdList">
+                <Checkbox-group v-model="user.roleIdList">
+                    <Checkbox :label="role.roleId" v-for="role in roleList">{{role.roleName}}</Checkbox>
+                </Checkbox-group>
+            </Form-item>
+
+            <Form-item label="状态" prop="status">
+                <Radio-group v-model="user.status">
+                    <Radio label="0">
+                        <span>禁用</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>正常</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+<!-- 选择部门 -->
+<div id="deptLayer" style="display: none;padding:10px;">
+    <ul id="deptTree" class="ztree"></ul>
+</div>
+<script src="${rc.contextPath}/js/sys/user.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 206 - 0
platform-admin/src/main/webapp/WEB-INF/page/test/iviewDemo.html

@@ -0,0 +1,206 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>iviewDemo</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div id="body">
+        <i-button type="info" @click="api">IVIEW_API</i-button>
+        <i-switch v-model="switch1" @on-change="change"></i-switch>
+        <Row>
+            <i-col span="12">
+                <Date-picker type="date" v-model="data1" placeholder="选择日期" style="width: 200px"></Date-picker>
+                {{data1}}
+            </i-col>
+            <i-col span="12">
+                <Date-picker type="daterange" placement="bottom-end" placeholder="选择日期区间"
+                             style="width: 200px"></Date-picker>
+            </i-col>
+        </Row>
+        <Tabs value="name1">
+            <Tab-pane label="buttons" name="name0">
+                <i-col span="24">
+                    <i-button>Default</i-button>
+                    <i-button type="primary">Primary</i-button>
+                    <i-button type="ghost">Ghost</i-button>
+                    <i-button type="dashed">Dashed</i-button>
+                    <i-button type="text">Text</i-button>
+                    <i-button type="info">信息按钮</i-button>
+                    <i-button type="success">成功按钮</i-button>
+                    <i-button type="warning">警告按钮</i-button>
+                    <i-button type="error">错误按钮</i-button>
+                </i-col>
+                <i-col span="24">
+                    <i-button type="primary" shape="circle" size="large">Large</i-button>
+                    <i-button type="primary" shape="circle">Default</i-button>
+                    <i-button type="primary" shape="circle" size="small">Small</i-button>
+                    <i-button type="ghost" icon="social-facebook"></i-button>
+                    <i-button type="ghost" icon="social-twitter"></i-button>
+                    <i-button type="success" @click="show">Click me!</i-button>
+                    <Modal v-model="visible" title="Welcome">欢迎使用 iView</Modal>
+                </i-col>
+                </i-col>
+                <i-col span="24">
+                    <i-button type="success" shape="circle" icon="ios-search"></i-button>
+                    <i-button type="success" icon="ios-search">搜索</i-button>
+                    <i-button type="success" shape="circle" icon="ios-search">搜索</i-button>
+                    <i-button type="success" shape="circle">圆角按钮</i-button>
+                    <i-button type="ghost" shape="circle" icon="ios-search"></i-button>
+                    <i-button type="ghost" icon="ios-search">搜索</i-button>
+                    <i-button type="ghost" shape="circle" icon="ios-search">搜索</i-button>
+                    <i-button type="ghost" shape="circle">圆角按钮</i-button>
+                    <i-button type="primary">Primary</i-button>
+                    <i-button type="primary" disabled>Primary(Disabled)</i-button>
+                </i-col>
+                <i-col span="24">
+                    <i-button type="primary" loading>Loading...</i-button>
+                    <i-button type="primary" :loading="loading" @click="toLoading">
+                        <span v-if="!loading">Click me!</span>
+                        <span v-else>Loading...</span>
+                    </i-button>
+                    <i-button type="primary" :loading="loading2" icon="checkmark-round" @click="toLoading2">
+                        <span v-if="!loading2">Click me!</span>
+                        <span v-else>Loading...</span>
+                    </i-button>
+                </i-col>
+                <i-col span="6">
+                    <i-button type="success" long>确认提交</i-button>
+                </i-col>
+                <i-col span="6">
+                    <i-button type="error" long>确认删除</i-button>
+                </i-col>
+            </Tab-pane>
+            <Tab-pane label="form表单" name="name1">
+                <i-form ref="formValidate" :model="formValidate" :rules="ruleValidate" :label-width="80">
+                    <Form-item label="姓名" prop="name">
+                        <i-input v-model="formValidate.name" placeholder="请输入姓名"/>
+                    </Form-item>
+                    <Form-item label="邮箱" prop="mail">
+                        <i-input v-model="formValidate.mail" placeholder="请输入邮箱"/>
+                    </Form-item>
+                    <Form-item label="城市" prop="city">
+                        <i-select v-model="formValidate.city" placeholder="请选择所在地">
+                            <i-option value="beijing">北京市</i-option>
+                            <i-option value="shanghai">上海市</i-option>
+                            <i-option value="shenzhen">深圳市</i-option>
+                        </i-select>
+                    </Form-item>
+                    <Form-item label="选择日期">
+                        <Row>
+                            <i-col span="5">
+                                <Form-item prop="date">
+                                    <Date-picker type="date" placeholder="选择日期"
+                                                 v-model="formValidate.date"></Date-picker>
+                                </Form-item>
+                            </i-col>
+                            <i-col span="1" style="text-align: center">-</i-col>
+                            <i-col span="5">
+                                <Form-item prop="time">
+                                    <Time-picker type="time" placeholder="选择时间"
+                                                 v-model="formValidate.time"></Time-picker>
+                                </Form-item>
+                            </i-col>
+                        </Row>
+                    </Form-item>
+                    <Form-item label="性别" prop="gender">
+                        <Radio-group v-model="formValidate.gender">
+                            <Radio label="male">男</Radio>
+                            <Radio label="female">女</Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Form-item label="爱好" prop="interest">
+                        <Checkbox-group v-model="formValidate.interest">
+                            <Checkbox label="吃饭"></Checkbox>
+                            <Checkbox label="睡觉"></Checkbox>
+                            <Checkbox label="跑步"></Checkbox>
+                            <Checkbox label="看电影"></Checkbox>
+                        </Checkbox-group>
+                    </Form-item>
+                    <Form-item label="介绍" prop="desc">
+                        <i-input v-model="formValidate.desc" type="textarea" :autosize="{minRows: 2,maxRows: 5}"
+                                 placeholder="请输入..."/>
+                    </Form-item>
+                    <Form-item>
+                        <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                        <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置
+                        </i-button>
+                    </Form-item>
+                </i-form>
+            </Tab-pane>
+            <Tab-pane label="时间轴" name="name2">
+                <Timeline>
+                    <Timeline-item>
+                        <p class="time">1976年</p>
+                        <p class="content">Apple I 问世</p>
+                    </Timeline-item>
+                    <Timeline-item>
+                        <p class="time">1984年</p>
+                        <p class="content">发布 Macintosh</p>
+                    </Timeline-item>
+                    <Timeline-item>
+                        <p class="time">2007年</p>
+                        <p class="content">发布 iPhone</p>
+                    </Timeline-item>
+                    <Timeline-item>
+                        <p class="time">2010年</p>
+                        <p class="content">发布 iPad</p>
+                    </Timeline-item>
+                    <Timeline-item>
+                        <p class="time">2011年10月5日</p>
+                        <p class="content">史蒂夫·乔布斯去世</p>
+                    </Timeline-item>
+                </Timeline>
+            </Tab-pane>
+            <Tab-pane label="slider" name="name3">
+                <Slider v-model="value1"></Slider>
+                <Slider v-model="value2" range></Slider>
+                <Slider v-model="value3" range disabled></Slider>
+                <Slider v-model="value4" :step="10"></Slider>
+                <Slider v-model="value5" :step="10" range></Slider>
+                <Slider v-model="value6" :step="10" show-stops></Slider>
+                <Slider v-model="value7" :step="10" show-stops range></Slider>
+                <Slider v-model="value8" show-input></Slider>
+                <Slider v-model="value9" :tip-format="format"></Slider>
+                <Slider v-model="value10" :tip-format="hideFormat"></Slider>
+            </Tab-pane>
+            <Tab-pane label="Circle 进度环" name="name4">
+                <i-circle
+                        :size="250"
+                        :trail-width="4"
+                        :stroke-width="5"
+                        :percent="75"
+                        stroke-linecap="square"
+                        stroke-color="#43a3fb">
+                    <div class="demo-i-circle-custom">
+                        <h1>42,001,776</h1>
+                        <p>消费人群规模</p>
+                        <span>
+                            总占人数
+                            <i>75%</i>
+                        </span>
+                    </div>
+                </i-circle>
+            </Tab-pane>
+            <Tab-pane label="级联选择" name="name5">
+                <Cascader :data="data" v-model="value11"></Cascader>
+            </Tab-pane>
+            <Tab-pane label="Select" name="name6">
+                <i-select v-model="model2" size="small" style="width:100px">
+                    <i-option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</i-option>
+                </i-select>
+                <i-select v-model="model3" style="width:100px">
+                    <i-option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</i-option>
+                </i-select>
+                <i-select v-model="model4" size="large" style="width:100px">
+                    <i-option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</i-option>
+                </i-select>
+            </Tab-pane>
+        </Tabs>
+    </div>
+</div>
+
+<script src="${rc.contextPath}/js/test/iviewDemo.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 15 - 0
platform-admin/src/main/webapp/WEB-INF/velocity-toolbox.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<toolbox>
+	<!-- velocity 自定义标签 -->
+	<tool>
+	    <key>shiro</key>
+	    <scope>application</scope>
+	    <class>com.platform.shiro.VelocityShiro</class>
+	</tool>
+	<!-- 当前登录用户信息 -->
+	<tool>
+		<key>user</key>
+		<scope>application</scope>
+		<class>com.platform.utils.ShiroUtils</class>
+	</tool>
+</toolbox>

+ 111 - 0
platform-admin/src/main/webapp/WEB-INF/web.xml

@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+  http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+         version="3.1" metadata-complete="false">
+    <context-param>
+        <param-name>contextConfigLocation</param-name>
+        <param-value>
+            classpath:spring-mvc.xml
+            classpath:spring-jdbc.xml
+            classpath*:platform-*.xml
+        </param-value>
+    </context-param>
+
+    <context-param>
+        <param-name>log4jRefreshInterval</param-name>
+        <param-value>600000</param-value>
+    </context-param>
+
+    <context-param>
+        <param-name>webAppRootKey</param-name>
+        <param-value>webPath</param-value>
+    </context-param>
+
+    <listener>
+        <listener-class>org.springframework.web.util.WebAppRootListener</listener-class>
+    </listener>
+
+    <listener>
+        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+    </listener>
+
+    <filter>
+        <filter-name>encodingFilter</filter-name>
+        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
+        <init-param>
+            <param-name>encoding</param-name>
+            <param-value>UTF-8</param-value>
+        </init-param>
+    </filter>
+
+    <filter-mapping>
+        <filter-name>encodingFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+
+    <!-- 配置Shiro过滤器,先让Shiro过滤系统接收到的请求 -->
+    <!-- 这里filter-name必须对应applicationContext.xml中定义的<bean id="shiroFilter"/> -->
+    <!-- 使用[/*]匹配所有请求,保证所有的可控请求都经过Shiro的过滤 -->
+    <!-- 通常会将此filter-mapping放置到最前面(即其他filter-mapping前面),以保证它是过滤器链中第一个起作用的 -->
+    <filter>
+        <filter-name>shiroFilter</filter-name>
+        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
+        <init-param>
+            <!-- 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由servlet container管理 -->
+            <param-name>targetFilterLifecycle</param-name>
+            <param-value>true</param-value>
+        </init-param>
+    </filter>
+
+    <filter-mapping>
+        <filter-name>shiroFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+
+    <filter>
+        <filter-name>xssFilter</filter-name>
+        <filter-class>com.platform.xss.XssFilter</filter-class>
+        <init-param>
+            <!--凡是提交包含html内容的请求都要写在这里,若有多个以逗号隔开-->
+            <param-name>excludedPages</param-name>
+            <param-value>/topic/update,/topic/save,/goods/save,/goods/update</param-value>
+        </init-param>
+    </filter>
+
+    <filter-mapping>
+        <filter-name>xssFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+
+    <servlet>
+        <servlet-name>dispatcher</servlet-name>
+        <servlet-class>
+            org.springframework.web.servlet.DispatcherServlet
+        </servlet-class>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+
+    <servlet-mapping>
+        <servlet-name>dispatcher</servlet-name>
+        <url-pattern>/</url-pattern>
+    </servlet-mapping>
+
+    <servlet>
+        <servlet-name>DruidStatView</servlet-name>
+        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
+    </servlet>
+
+    <servlet-mapping>
+        <servlet-name>DruidStatView</servlet-name>
+        <url-pattern>/druid/*</url-pattern>
+    </servlet-mapping>
+
+
+    <error-page>
+        <error-code>404</error-code>
+        <location>/404.html</location>
+    </error-page>
+
+</web-app>

+ 66 - 0
platform-admin/src/main/webapp/WF/CC.htm

@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <title>Demo:发起</title>
+
+    <!-- 引入常用的JS脚本. -->
+    <script src="../WF/Scripts/QueryString.js"></script>
+    <script src="../WF/Scripts/jquery/jquery.min.js" type="text/javascript"></script>
+    <script src="../WF/Scripts/jquery/jquery.cookie.js" type="text/javascript"></script>
+    <link href="../WF/Scripts/bootstrap/css/bootstrap.css" rel="stylesheet" />
+    <!-- 引入ccbpm 的sdk开发js.  -->
+    <script src="../WF/config.js" type="text/javascript"></script>
+    <script src="../WF/ListAPI.js" type="text/javascript"></script>
+    <script language="javascript" type="text/javascript">
+
+        //启动函数  
+        $(function () {
+
+            $("#docs").html("<img src=./Img/loading.gif />&nbsp;正在加载,请稍后......");
+
+            // ccbpmHostDevelopAPI 变量是定义在 /config.js 的服务地址. 访问必须两个参数DoWhat,SID.
+            // dowhat 就是一个请求的标记, sid 类似于token,登录的时候写入到 表Port_Emp的SID列的值.
+            //获得当前的SID.
+            var sid = $.cookie("MySID");
+            var userNo = $.cookie("MyUserNo");
+            $("#title").html("发起列表-Demo : <lable style='font-size:16px;color:green'>文件:ListAPI.js 方法:DB_Start</lable>");
+
+            //调用 /WF/ListAPI.js 的 DB_Start() 接口,获得当前人员可以发起的列表.
+            var ens = DB_Start();
+
+            var html = "<table class='table table-bordered table-striped table-hover '>";
+            html += "<tr>";
+            html += "<th>#</th>";
+            //html += "<th>类别编号</th>";
+            html += "<th>流程类别</th>";
+            html += "<th>流程编号</th>";
+            html += "<th>流程名称</th>";
+            html += "<th>操作</th>";
+            html += "</tr>";
+
+            for (var i = 0; i < ens.length; i++) {
+                var en = ens[i];
+                html += "<tr>";
+                html += "<td>" + (i + 1) + "</td>"; //序号
+                //html += "<td>" + en.FK_FlowSort + "</td>"; //流程类别编号.
+                html += "<td>" + en.FK_FlowSortText + "</td>"; //类别名称.
+                html += "<td>" + en.No + "</td>"; //流程编号.
+                html += "<td>" + en.Name + "</td>"; //流程名称.
+
+                //调用 /WF/ListAPI.js 里面的 OpenForm 方法打开表单.
+                html += "<td><a href=\"javascript:OpenForm('" + en.No + "');\" >发起流程</a></td>";
+                html += "</tr>";
+            }
+            html += "</table>";
+            $("#docs").html(html);
+        });
+    </script>
+</head>
+<body>
+
+    <div id="title" style="font-family:'Microsoft YaHei';font-size:24px;margin:3px;"></div>
+    <div id="docs"></div>
+
+</body>
+</html>

+ 66 - 0
platform-admin/src/main/webapp/WF/Complete.htm

@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <title>Demo:发起</title>
+
+    <!-- 引入常用的JS脚本. -->
+    <script src="../WF/Scripts/QueryString.js"></script>
+    <script src="../WF/Scripts/jquery/jquery.min.js" type="text/javascript"></script>
+    <script src="../WF/Scripts/jquery/jquery.cookie.js" type="text/javascript"></script>
+    <link href="../WF/Scripts/bootstrap/css/bootstrap.css" rel="stylesheet" />
+    <!-- 引入ccbpm 的sdk开发js.  -->
+    <script src="../WF/config.js" type="text/javascript"></script>
+    <script src="../WF/ListAPI.js" type="text/javascript"></script>
+    <script language="javascript" type="text/javascript">
+
+        //启动函数  
+        $(function () {
+
+            $("#docs").html("<img src=./Img/loading.gif />&nbsp;正在加载,请稍后......");
+
+            // ccbpmHostDevelopAPI 变量是定义在 /config.js 的服务地址. 访问必须两个参数DoWhat,SID.
+            // dowhat 就是一个请求的标记, sid 类似于token,登录的时候写入到 表Port_Emp的SID列的值.
+            //获得当前的SID.
+            var sid = $.cookie("MySID");
+            var userNo = $.cookie("MyUserNo");
+            $("#title").html("发起列表-Demo : <lable style='font-size:16px;color:green'>文件:ListAPI.js 方法:DB_Start</lable>");
+
+            //调用 /WF/ListAPI.js 的 DB_Start() 接口,获得当前人员可以发起的列表.
+            var ens = DB_Start();
+
+            var html = "<table class='table table-bordered table-striped table-hover '>";
+            html += "<tr>";
+            html += "<th>#</th>";
+            //html += "<th>类别编号</th>";
+            html += "<th>流程类别</th>";
+            html += "<th>流程编号</th>";
+            html += "<th>流程名称</th>";
+            html += "<th>操作</th>";
+            html += "</tr>";
+
+            for (var i = 0; i < ens.length; i++) {
+                var en = ens[i];
+                html += "<tr>";
+                html += "<td>" + (i + 1) + "</td>"; //序号
+                //html += "<td>" + en.FK_FlowSort + "</td>"; //流程类别编号.
+                html += "<td>" + en.FK_FlowSortText + "</td>"; //类别名称.
+                html += "<td>" + en.No + "</td>"; //流程编号.
+                html += "<td>" + en.Name + "</td>"; //流程名称.
+
+                //调用 /WF/ListAPI.js 里面的 OpenForm 方法打开表单.
+                html += "<td><a href=\"javascript:OpenForm('" + en.No + "');\" >发起流程</a></td>";
+                html += "</tr>";
+            }
+            html += "</table>";
+            $("#docs").html(html);
+        });
+    </script>
+</head>
+<body>
+
+    <div id="title" style="font-family:'Microsoft YaHei';font-size:24px;margin:3px;"></div>
+    <div id="docs"></div>
+
+</body>
+</html>

+ 162 - 0
platform-admin/src/main/webapp/WF/Dev2Interface.js

@@ -0,0 +1,162 @@
+/* 开发接口JS: 需要引入 /WF/config.js . 
+ * 1. 该文件里提供了一些高级开发接口,
+ * 2. 比如:创建WorkID,执行发送,催办. 批量删除.
+ * 3. 每个接口都有明确的注释.
+ */
+
+
+/**
+ * 创建空白的WorkID.
+ * @param {校验码(登录时候产生的)} sid
+ * @param {流程编号} flowNo
+ */
+function Node_CreateBlankWorkID( flowNo) {
+    var url = ccbpmHostDevelopAPI + "?DoType=Node_CreateBlankWorkID&Token=" + GetToken() + "&FK_Flow=" + flowNo;
+    return RunUrlReturnString(url);
+}
+
+/**
+ * 执行发送
+ * @param {校验码} sid
+ * @param {流程编号} flowNo
+ * @param {节点ID} nodeID
+ * @param {工作实例ID} workid
+ * @param {要达到的节点,为0不指定节点,由节点配置自动计算} toNodeID
+ * @param {要发送的人员,为null,不指定人员,由流程配置自动计算} toEmps
+ * @param {参数,格式为:@Key1=val1@Key2=val2 } paras
+ */
+function Node_SendWork( flowNo, nodeID, workid, toNodeID, toEmps, paras = "") {
+
+    paras = paras.replace('@', '&');
+
+    var url = ccbpmHostDevelopAPI + "?DoType=Node_SendWork&Token=" + GetToken() + "&FK_Flow=" + flowNo + "&FK_Node=" + nodeID;
+    url += "&WorkID=" + workid + "&ToNodeID=" + toNodeID;
+    url += "&ToEmps=" + toEmps + "&1=2" + paras;
+    return RunUrlReturnString(url);
+}
+
+/**
+ * 获得可以退回的节点
+ * @param {校验码} sid
+ * @param {流程编号} flowNo
+ * @param {工作实例ID} workid
+ * @param {FID} fid
+ */
+function DB_GenerWillReturnNodes( flowNo, workid, fid = 0) {
+
+    var url = ccbpmHostDevelopAPI + "?DoType=DB_GenerWillReturnNodes&Token=" + GetToken() + "&FK_Flow=" + flowNo;
+    url += "&WorkID=" + workid + "&FID=" + fid;
+    return RunUrlReturnString(url);
+}
+
+/**
+ * 退回
+ * @param {校验码} sid
+ * @param {工作实例ID} workid
+ * @param {退回到节点ID} returnToNodeID
+ * @param {退回给人员} returnToEmp
+ * @param {退回意见} msg
+ * @param {是否原路返回?} isBackToThisNode
+ */
+function Node_ReturnWork( workid, returnToNodeID, returnToEmp, msg, isBackToThisNode = false) {
+    var url = ccbpmHostDevelopAPI + "?DoType=Node_ReturnWork&Token=" + GetToken();
+    url += "&WorkID=" + workid;
+    url += "&ReturnToNodeID=" + returnToNodeID;
+    url += "&ReturnToEmp=" + returnToEmp;
+    url += "&Msg=" + msg;
+
+    if (isBackToThisNode == true)
+        url += "&IsBackToThisNode=1";
+    else
+        url += "&IsBackToThisNode=0";
+    return RunUrlReturnString(url);
+}
+
+/**
+ * 催办
+ * @param {要执行的实例,多个实例用逗号分开比如:1001,1002,1003} workidStrs
+ */
+function Flow_DoPress( workidStrs,msg) {
+    var url = ccbpmHostDevelopAPI + "?DoType=Flow_DoPress&Token=" + GetToken();
+    url += "&WorkIDs=" + workidStrs;
+    url += "&Msg=" + msg;
+    return RunUrlReturnString(url);
+}
+
+/**
+ * 撤销发送,如果产生失败就会返回 err@+失败信息.
+ * @param {要执行的实例,多个实例用逗号分开比如:1001,1002,1003} workidStrs
+ */
+function Flow_DoUnSend( workidStrs) {
+
+    var url = ccbpmHostDevelopAPI + "?DoType=Flow_DoUnSend&Token=" + GetToken();
+    url += "&WorkIDs=" + workidStrs;
+    return RunUrlReturnString(url);
+}
+
+/**
+ * 删除流程
+ * @param {要删除的实例,多个实例用逗号分开比如:1001,1002,1003} workidStrs
+ * @param {是否删除子流程} isDeleteSubFlows
+ */
+function Flow_BatchDeleteByReal( workidStrs, isDeleteSubFlows = true) {
+
+    var url = ccbpmHostDevelopAPI + "?DoType=Flow_BatchDeleteByReal&Token=" + GetToken();
+    url += "&WorkIDs=" + workidStrs;
+
+    if (isDeleteSubFlows == false)
+        url += "&IsDeleteSubFlows=0";
+    else
+        url += "&IsDeleteSubFlows=1";
+    return RunUrlReturnString(url);
+}
+/**
+ * 恢复删除
+ * @param {any} workidStrs
+ */
+function Flow_BatchDeleteByFlagAndUnDone( workidStrs) {
+
+    var url = ccbpmHostDevelopAPI + "?DoType=Flow_BatchDeleteByFlagAndUnDone&Token=" + GetToken();
+    url += "&WorkIDs=" + workidStrs;
+
+    return RunUrlReturnString(url);
+}
+
+
+
+/**
+ * 设置流程结束
+ * @param {要执行的实例,多个实例用逗号分开比如:1001,1002,1003} workidStrs
+ */
+function Flow_DoFlowOver(sid, workidStrs) {
+
+    var url = ccbpmHostDevelopAPI + "?DoType=Flow_DoFlowOver&Token=" + GetToken();
+    url += "&WorkIDs=" + workidStrs;
+    return RunUrlReturnString(url);
+}
+
+/**
+ * 批量设置抄送查看完毕
+ * @param {any} workidStrs
+ */
+
+function CC_BatchCheckOver( workidStrs) {
+
+    var url = ccbpmHostDevelopAPI + "?DoType=CC_BatchCheckOver&Token=" + GetToken();
+    url += "&WorkIDs=" + workidStrs;
+
+    return RunUrlReturnString(url);
+}
+
+
+/**
+ * 删除草稿
+ * @param {要执行的实例,多个实例用逗号分开比如:1001,1002,1003} workidStrs
+ */
+function Flow_DeleteDraft(sid, workidStrs) {
+
+    var url = ccbpmHostDevelopAPI + "?DoType=Flow_DeleteDraft&Token=" + GetToken();
+    url += "&WorkIDs=" + workidStrs;
+    return RunUrlReturnString(url);
+}
+

+ 102 - 0
platform-admin/src/main/webapp/WF/Draft.htm

@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <title>Demo:待办</title>
+
+    <!-- 引入常用的JS脚本. -->
+    <script src="../WF/Scripts/QueryString.js"></script>
+    <script src="../WF/Scripts/jquery/jquery.min.js" type="text/javascript"></script>
+    <script src="../WF/Scripts/jquery/jquery.cookie.js" type="text/javascript"></script>
+    <link href="../WF/Scripts/bootstrap/css/bootstrap.css" rel="stylesheet" />
+    <!-- 引入ccbpm 的sdk开发js.  -->
+    <script src="../WF/config.js" type="text/javascript"></script>
+    <script src="../WF/ListAPI.js" type="text/javascript"></script>
+    <script language="javascript" type="text/javascript">
+
+        //启动函数
+        $(function () {
+
+            $("#docs").html("<img src=./Img/loading.gif />&nbsp;正在加载,请稍后......");
+
+            // ccbpmHostDevelopAPI 变量是定义在 /config.js 的服务地址. 访问必须两个参数DoWhat,SID.
+            // dowhat 就是一个请求的标记, sid 类似于token,登录的时候写入到 表Port_Emp的SID列的值.
+            //获得当前的SID.
+            var sid = $.cookie("MySID");
+
+            $("#title").html("待办列表-Demo : <lable style='font-size:16px;color:green'>文件:ListAPI.js 方法:DB_Todolist</lable>");
+
+            //调用 /WF/ListAPI.js 的 DB_Todolist 接口,获得当前人员的待办列表.
+            var db = DB_Todolist();
+           // db = JSON.parse(db);
+            var html = "<table class='table table-bordered table-striped table-hover '>";
+            html += "<tr>";
+            html += "<th>#</th>";
+            //html += "<th>WorkID</th>";
+            html += "<th>标题</th>";
+            //  html += "<th>流程编号</th>";
+            html += "<th>流程名称</th>";
+            html += "<th>停留节点</th>";
+            html += "<th>状态</th>";
+
+            html += "<th>发起人</th>";
+            html += "<th>部门</th>";
+            html += "<th>发起日期</th>";
+            html += "<th>当前处理人</th>";
+            html += "<th>应完成日期</th>";
+            //html += "<th>参与人</th>";
+            // html += "<th>操作</th>";
+            html += "</tr>";
+
+            for (var i = 0; i < db.length; i++) {
+                var en = db[i];
+                html += "<tr>";
+                html += "<td>" + (i + 1) + "</td>"; //序号
+                //html += "<td>" + en.WorkID + "</td>"; // 工作ID.
+
+                html += "<td><a href=\"javascript:OpenForm('" + en.FK_Flow + "','" + en.FK_Node + "','" + en.WorkID + "','" + en.FID + "');\" >" + en.Title + "</a></td>";
+
+                //  html += "<td>" + en.FK_Flow + "</td>"; //流程编号.
+                html += "<td>" + en.FlowName + "</td>"; //流程名称.
+
+                html += "<td>" + en.NodeName + "</td>"; //停留节点.
+
+
+                //判断流程的状态.
+                var wfState = "待办";
+                if (en.WFState == 5)
+                    wfState = "<font color=red><b>退回</b></font>";
+
+                html += "<td>" + wfState + "</td>";
+
+                //html += "<td>" + en.NodeName + "</td>"; //节点名称.
+                //html += "<td>" + en.StarterName + "</td>"; //发起人.
+
+                html += "<td>" + en.StarterName + "</td>"; //发起人名称.
+                //html += "<td>" + en.FK_Dept + "</td>"; //发起人部门.
+                html += "<td>" + en.DeptName + "</td>"; //发起人部门.
+                html += "<td>" + en.RDT + "</td>"; //发起日期.
+
+                html += "<td>" + en.TodoEmps + "</td>"; //当前处理人.
+                //html += "<td>" + en.Emps + "</td>"; //参与人.
+
+                html += "<td>" + en.SDT + "</td>"; //发起日期.
+
+
+                //调用 /WF/ListAPI.js 里面的 OpenForm 方法打开表单.
+                //   html += "<td><a href=\"javascript:OpenForm('" + en.FK_Flow + "','" + en.FK_Node + "','" + en.WorkID + "','" + en.FID + "');\" >处理工作</a></td>";
+                html += "</tr>";
+            }
+            html += "</table>";
+            $("#docs").html(html);
+        });
+    </script>
+</head>
+<body>
+
+    <div id="title" style="font-family:'Microsoft YaHei';font-size:24px;margin:3px;"></div>
+
+    <div id="docs"></div>
+
+</body>
+</html>

+ 102 - 0
platform-admin/src/main/webapp/WF/Focus.htm

@@ -0,0 +1,102 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8" />
+    <title>Demo:待办</title>
+
+    <!-- 引入常用的JS脚本. -->
+    <script src="../WF/Scripts/QueryString.js"></script>
+    <script src="../WF/Scripts/jquery/jquery.min.js" type="text/javascript"></script>
+    <script src="../WF/Scripts/jquery/jquery.cookie.js" type="text/javascript"></script>
+    <link href="../WF/Scripts/bootstrap/css/bootstrap.css" rel="stylesheet" />
+    <!-- 引入ccbpm 的sdk开发js.  -->
+    <script src="../WF/config.js" type="text/javascript"></script>
+    <script src="../WF/ListAPI.js" type="text/javascript"></script>
+    <script language="javascript" type="text/javascript">
+
+        //启动函数
+        $(function () {
+
+            $("#docs").html("<img src=./Img/loading.gif />&nbsp;正在加载,请稍后......");
+
+            // ccbpmHostDevelopAPI 变量是定义在 /config.js 的服务地址. 访问必须两个参数DoWhat,SID.
+            // dowhat 就是一个请求的标记, sid 类似于token,登录的时候写入到 表Port_Emp的SID列的值.
+            //获得当前的SID.
+            var sid = $.cookie("MySID");
+
+            $("#title").html("待办列表-Demo : <lable style='font-size:16px;color:green'>文件:ListAPI.js 方法:DB_Todolist</lable>");
+
+            //调用 /WF/ListAPI.js 的 DB_Todolist 接口,获得当前人员的待办列表.
+            var db = DB_Todolist();
+           // db = JSON.parse(db);
+            var html = "<table class='table table-bordered table-striped table-hover '>";
+            html += "<tr>";
+            html += "<th>#</th>";
+            //html += "<th>WorkID</th>";
+            html += "<th>标题</th>";
+            //  html += "<th>流程编号</th>";
+            html += "<th>流程名称</th>";
+            html += "<th>停留节点</th>";
+            html += "<th>状态</th>";
+
+            html += "<th>发起人</th>";
+            html += "<th>部门</th>";
+            html += "<th>发起日期</th>";
+            html += "<th>当前处理人</th>";
+            html += "<th>应完成日期</th>";
+            //html += "<th>参与人</th>";
+            // html += "<th>操作</th>";
+            html += "</tr>";
+
+            for (var i = 0; i < db.length; i++) {
+                var en = db[i];
+                html += "<tr>";
+                html += "<td>" + (i + 1) + "</td>"; //序号
+                //html += "<td>" + en.WorkID + "</td>"; // 工作ID.
+
+                html += "<td><a href=\"javascript:OpenForm('" + en.FK_Flow + "','" + en.FK_Node + "','" + en.WorkID + "','" + en.FID + "');\" >" + en.Title + "</a></td>";
+
+                //  html += "<td>" + en.FK_Flow + "</td>"; //流程编号.
+                html += "<td>" + en.FlowName + "</td>"; //流程名称.
+
+                html += "<td>" + en.NodeName + "</td>"; //停留节点.
+
+
+                //判断流程的状态.
+                var wfState = "待办";
+                if (en.WFState == 5)
+                    wfState = "<font color=red><b>退回</b></font>";
+
+                html += "<td>" + wfState + "</td>";
+
+                //html += "<td>" + en.NodeName + "</td>"; //节点名称.
+                //html += "<td>" + en.StarterName + "</td>"; //发起人.
+
+                html += "<td>" + en.StarterName + "</td>"; //发起人名称.
+                //html += "<td>" + en.FK_Dept + "</td>"; //发起人部门.
+                html += "<td>" + en.DeptName + "</td>"; //发起人部门.
+                html += "<td>" + en.RDT + "</td>"; //发起日期.
+
+                html += "<td>" + en.TodoEmps + "</td>"; //当前处理人.
+                //html += "<td>" + en.Emps + "</td>"; //参与人.
+
+                html += "<td>" + en.SDT + "</td>"; //发起日期.
+
+
+                //调用 /WF/ListAPI.js 里面的 OpenForm 方法打开表单.
+                //   html += "<td><a href=\"javascript:OpenForm('" + en.FK_Flow + "','" + en.FK_Node + "','" + en.WorkID + "','" + en.FID + "');\" >处理工作</a></td>";
+                html += "</tr>";
+            }
+            html += "</table>";
+            $("#docs").html(html);
+        });
+    </script>
+</head>
+<body>
+
+    <div id="title" style="font-family:'Microsoft YaHei';font-size:24px;margin:3px;"></div>
+
+    <div id="docs"></div>
+
+</body>
+</html>

BIN
platform-admin/src/main/webapp/WF/Img/Btn/Add.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Add.png


BIN
platform-admin/src/main/webapp/WF/Img/Btn/AddLeader.png


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Adjunct.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Advanced.png


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Allot.png


BIN
platform-admin/src/main/webapp/WF/Img/Btn/AllotTask.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Apply.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Authorize.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Back.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Back.png


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Balance.GIF


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Balance.JPG


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Batch.png


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Book.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/CC.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/CC.png


BIN
platform-admin/src/main/webapp/WF/Img/Btn/CH.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/CH.png


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Cancel.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Card.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Chart.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Check.png


BIN
platform-admin/src/main/webapp/WF/Img/Btn/ChoseChart.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/ChoseCol.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/ChoseCols.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/ChoseD.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/ChoseField.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/ChoseNum.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Clear.GIF


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Close.gif


BIN
platform-admin/src/main/webapp/WF/Img/Btn/Close.png


+ 0 - 0
platform-admin/src/main/webapp/WF/Img/Btn/ComeBackFlow.gif


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