浏览代码

版本更新

malk 1 周之前
父节点
当前提交
0c024d7101
共有 60 个文件被更改,包括 9844 次插入0 次删除
  1. 62 0
      mjava-guyuan/target/classes/application-dev.yml
  2. 36 0
      mjava-guyuan/target/classes/application-prod.yml
  3. 53 0
      mjava-hangshi/target/classes/application-dev.yml
  4. 39 0
      mjava-hangshi/target/classes/application-prod.yml
  5. 35 0
      mjava-hangshi/target/test-classes/server.sh
  6. 51 0
      mjava-jisuanji/target/classes/application-dev.yml
  7. 33 0
      mjava-jisuanji/target/classes/application-prod.yml
  8. 51 0
      mjava-lichen/target/classes/application-dev.yml
  9. 33 0
      mjava-lichen/target/classes/application-prod.yml
  10. 35 0
      mjava-lichen/target/test-classes/server.sh
  11. 55 0
      mjava-lichen/target/test-classes/winsw.xml
  12. 67 0
      mjava-minjiaoyuan/target/classes/application-dev.yml
  13. 47 0
      mjava-minjiaoyuan/target/classes/application-prod.yml
  14. 35 0
      mjava-minjiaoyuan/target/test-classes/server.sh
  15. 58 0
      mjava-rongzhi/target/classes/application-dev.yml
  16. 39 0
      mjava-rongzhi/target/classes/application-prod.yml
  17. 35 0
      mjava-rongzhi/target/test-classes/server.sh
  18. 45 0
      mjava-shanghaishiwei/target/classes/application-dev.yml
  19. 38 0
      mjava-shanghaishiwei/target/classes/application-prod.yml
  20. 112 0
      mjava-shanghaishiwei/target/test-classes/sample/上海市委-列表.cs
  21. 178 0
      mjava-shanghaishiwei/target/test-classes/sample/上海市委.cs
  22. 76 0
      mjava-shanghaishiwei/target/test-classes/sample/上海市委.js
  23. 35 0
      mjava-shanghaishiwei/target/test-classes/server.sh
  24. 58 0
      mjava-shijianguan/target/classes/application-dev.yml
  25. 39 0
      mjava-shijianguan/target/classes/application-prod.yml
  26. 58 0
      mjava-xiding/target/classes/application-dev.yml
  27. 51 0
      mjava-xiding/target/classes/application-prod.yml
  28. 35 0
      mjava-xiding/target/test-classes/server.sh
  29. 55 0
      mjava-xiding/target/test-classes/winsw.xml
  30. 79 0
      mjava-xintianlong/target/classes/application-dev.yml
  31. 75 0
      mjava-xintianlong/target/classes/application-prod.yml
  32. 35 0
      mjava-xintianlong/target/test-classes/server.sh
  33. 55 0
      mjava-xintianlong/target/test-classes/winsw.xml
  34. 259 0
      mjava/target/classes/META-INF/spring-configuration-metadata.json
  35. 113 0
      mjava/target/classes/application-dev.yml
  36. 80 0
      mjava/target/classes/application-prod.yml
  37. 86 0
      mjava/target/classes/application-test.yml
  38. 92 0
      mjava/target/classes/application.yml
  39. 二进制
      mjava/target/classes/assets/logo/logo-text.png
  40. 7 0
      mjava/target/classes/banner.txt
  41. 170 0
      mjava/target/classes/logback-spring.xml
  42. 6026 0
      mjava/target/classes/static/mjs/mjs.js
  43. 1 0
      mjava/target/classes/static/mjs/mjs.min.js
  44. 61 0
      mjava/target/test-classes/driver.yml
  45. 4 0
      mjava/target/test-classes/frp/frpc.sh
  46. 19 0
      mjava/target/test-classes/frp/hpe/frpc.ini
  47. 34 0
      mjava/target/test-classes/frp/macos/frpc.ini
  48. 63 0
      mjava/target/test-classes/frp/remark.md
  49. 30 0
      mjava/target/test-classes/frp/server/frps.ini
  50. 27 0
      mjava/target/test-classes/nginx/certs/mc.100ali.com.key
  51. 61 0
      mjava/target/test-classes/nginx/certs/mc.100ali.com.pem
  52. 529 0
      mjava/target/test-classes/nginx/index.html
  53. 63 0
      mjava/target/test-classes/nginx/location
  54. 63 0
      mjava/target/test-classes/nginx/nginx.conf
  55. 37 0
      mjava/target/test-classes/nginx/proxy.conf
  56. 37 0
      mjava/target/test-classes/nginx/remak.md
  57. 95 0
      mjava/target/test-classes/readme.md
  58. 6 0
      mjava/target/test-classes/search.sh
  59. 37 0
      mjava/target/test-classes/server.sh
  60. 56 0
      mjava/target/test-classes/winsw.xml

+ 62 - 0
mjava-guyuan/target/classes/application-dev.yml

@@ -0,0 +1,62 @@
+# 环境配置
+server:
+  port: 9001
+  servlet:
+    context-path: /api/guyuan
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: mu123
+    url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# swagger3
+swagger:
+  enable: true
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp/file
+    image: /Users/malk/server/_Tool/var/mjava/tmp/image
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# dingtalk
+dingtalk:
+  agentId: 2356105659
+  appKey: dinghov5fyfjlhzk1ej1
+  appSecret: QR_1_7D0UUYtfdtMlDlmnjNSkvU2Uo3gOyabo2h09rmvj5_x0uk0Lw7N9pCy7sf-
+  corpId: dinge281bf50c488ebfd35c2f4657eb6378f
+  aesKey:
+  token:
+  operator: ""   # OA管理员账号
+
+# aliwork
+aliwork:
+  appType: APP_FKRK7Y94DPI1S9DV1605
+  systemToken: FN7666A1ZD0STZZ75W4CKD1GD07X3PUW2FBRKT
+
+# tencent [腾讯云]
+tencent:
+  APPID: 1309939821
+  SecretId: AKID2uqoryukbO2XuBThuxzdEpnmnmoocuCH
+  SecretKey: wnmgYHo8wrmjlldKoHnIkDZlqvrVDpOz
+  Region: ap-shanghai

+ 36 - 0
mjava-guyuan/target/classes/application-prod.yml

@@ -0,0 +1,36 @@
+# 环境配置
+server:
+  port: 9004
+  servlet:
+    context-path: /api/guyuan
+
+# condition
+spel:
+  scheduling: true        # 定时任务是否执行
+  multiSource: false      # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: cp-root@2022++
+    url: jdbc:mysql://47.110.74.198:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# dingtalk
+dingtalk:
+  agentId: 2356105659
+  appKey: dinghov5fyfjlhzk1ej1
+  appSecret: QR_1_7D0UUYtfdtMlDlmnjNSkvU2Uo3gOyabo2h09rmvj5_x0uk0Lw7N9pCy7sf-
+  corpId: dinge281bf50c488ebfd35c2f4657eb6378f
+  aesKey:
+  token:
+  operator: ""   # OA管理员账号
+
+# aliwork
+aliwork:
+  appType: APP_FKRK7Y94DPI1S9DV1605
+  systemToken: FN7666A1ZD0STZZ75W4CKD1GD07X3PUW2FBRKT

+ 53 - 0
mjava-hangshi/target/classes/application-dev.yml

@@ -0,0 +1,53 @@
+# 环境配置
+server:
+  port: 9001
+  servlet:
+    context-path: /api
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: mu123
+    url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp//file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp//image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# dingtalk
+dingtalk:
+  agentId: 2554541552
+  appKey: dingibsmij0bzwbtyfrr
+  appSecret: JEtzUtRjXBN3yiF6v9bw0uF_jWAVmVvIWfoCqIyaRTK-TEWVQLGU-xsYu7Ni_GKB
+  corpId: ding6bd8f2716554297135c2f4657eb6378f
+  aesKey:
+  token:
+  operator: "81007710"   # 孙云嵩 [开头需要转一下字符串], OA管理员账号
+
+# aliwork
+aliwork:
+  appType: APP_YH7W0E5637YUBU5UJ837
+  systemToken: IC766WA11EW8BMOPBEZZMBA4MPUQ214JDL7FLC9
+
+

+ 39 - 0
mjava-hangshi/target/classes/application-prod.yml

@@ -0,0 +1,39 @@
+# 环境配置
+server:
+  port: 9009
+
+# condition
+spel:
+  scheduling: true        # 定时任务是否执行
+  multiSource: false      # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: cp-root@2022++
+    url: jdbc:mysql://47.110.74.198:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# ekuaibao
+ekuaibao:
+  corpId: -yQbjbywbc640011                # 易快报的 corpId
+  platformApi: https://app.ekuaibao.com   # 易快报不同平台获取前缀的方式不同
+
+# dingtalk
+dingtalk:
+  agentId: 2554541552
+  appKey: dingibsmij0bzwbtyfrr
+  appSecret: JEtzUtRjXBN3yiF6v9bw0uF_jWAVmVvIWfoCqIyaRTK-TEWVQLGU-xsYu7Ni_GKB
+  corpId: ding6bd8f2716554297135c2f4657eb6378f
+  aesKey:
+  token:
+  operator: "81007710"   # 孙云嵩 [开头需要转一下字符串], OA管理员账号
+
+# aliwork
+aliwork:
+  appType: APP_YH7W0E5637YUBU5UJ837
+  systemToken: IC766WA11EW8BMOPBEZZMBA4MPUQ214JDL7FLC9

+ 35 - 0
mjava-hangshi/target/test-classes/server.sh

@@ -0,0 +1,35 @@
+#!/bin/bash
+appname='mjava-hangshi'
+if [ "$1" == "dev" ]; then
+  java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=dev
+else
+  if [ "$1" == "start" ]; then
+    nohup java -Xms256m -Xmx256m -jar $appname.jar &
+    echo "server prod is starting"
+  else
+    if [ "$1" == "test" ]; then
+      nohup java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=test &
+      echo "server test is starting"
+    else
+      if [ "$1" == "stop" ]; then
+        PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+        if [ -z "$PID" ]; then
+          echo "server is already stopped"
+        else
+          echo kill $PID
+          kill $PID
+        fi
+      else
+        if [ "$1" == "status" ]; then
+          PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+          if [ -z "$PID" ]; then
+            echo "server is stopped"
+          else
+            echo "server is running"
+            echo $PID
+          fi
+        fi
+      fi
+    fi
+  fi
+fi

+ 51 - 0
mjava-jisuanji/target/classes/application-dev.yml

@@ -0,0 +1,51 @@
+# 环境配置
+server:
+  port: 9001
+  servlet:
+    context-path: /api
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: mu123
+    url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQLDialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp//file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp//image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# dingtalk
+dingtalk:
+  agentId: 2533464721
+  appKey: dingromjxexd1esgvwwg
+  appSecret: AcStrL5bdw69gqeUfTQiFoBsgqisL2g-egzaKyID9Q7d85f_z9EkuTSS9Vse6zDb
+  corpId: ding5e83ad92d917b47535c2f4657eb6378f
+  aesKey:
+  token:
+
+# aliwork
+aliwork:
+  appType: APP_IW1FN8PPGGYQBWVMXS69
+  systemToken: UT866MB1WGX8VU029U93IA9DIKEG2GE9UU7FLI5
+

+ 33 - 0
mjava-jisuanji/target/classes/application-prod.yml

@@ -0,0 +1,33 @@
+# 环境配置
+server:
+  port: 9005
+
+# condition
+spel:
+  scheduling: true        # 定时任务是否执行
+  multiSource: false      # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: cp-root@2022++
+    url: jdbc:mysql://47.110.74.198:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# dingtalk
+dingtalk:
+  agentId: 2533464721
+  appKey: dingromjxexd1esgvwwg
+  appSecret: AcStrL5bdw69gqeUfTQiFoBsgqisL2g-egzaKyID9Q7d85f_z9EkuTSS9Vse6zDb
+  corpId: ding5e83ad92d917b47535c2f4657eb6378f
+  aesKey:
+  token:
+
+# aliwork
+aliwork:
+  appType: APP_IW1FN8PPGGYQBWVMXS69
+  systemToken: UT866MB1WGX8VU029U93IA9DIKEG2GE9UU7FLI5

+ 51 - 0
mjava-lichen/target/classes/application-dev.yml

@@ -0,0 +1,51 @@
+# 环境配置
+server:
+  port: 9001
+  servlet:
+    context-path: /api
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: mu123
+    url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQLDialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp//file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp//image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# dingtalk
+dingtalk:
+  agentId: 2552123596
+  appKey: dingv4y2whqqanodtqbq
+  appSecret: vE8nJKHODp6zyQmCwZvWNwJS2nwehHdrqXz3FelddniIcgL7W7Yjaz7u8MPVG3wU
+  corpId: ding50c7c06e7f1d9394
+  aesKey:
+  token:
+
+# aliwork
+aliwork:
+  appType: APP_BV3K6QNMINKYEDHQNI4N
+  systemToken: CH766981WHM8OEVBEAKCY7MYB9SV3ORPLIQELS5
+

+ 33 - 0
mjava-lichen/target/classes/application-prod.yml

@@ -0,0 +1,33 @@
+# 环境配置
+server:
+  port: 9001
+
+# condition
+spel:
+  scheduling: true        # 定时任务是否执行
+  multiSource: false      # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: cp-root@2022++
+    url: jdbc:mysql://47.110.74.198:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# dingtalk
+dingtalk:
+  agentId: 2552123596
+  appKey: dingv4y2whqqanodtqbq
+  appSecret: vE8nJKHODp6zyQmCwZvWNwJS2nwehHdrqXz3FelddniIcgL7W7Yjaz7u8MPVG3wU
+  corpId: ding50c7c06e7f1d9394
+  aesKey:
+  token:
+
+# aliwork
+aliwork:
+  appType: APP_BV3K6QNMINKYEDHQNI4N
+  systemToken: CH766981WHM8OEVBEAKCY7MYB9SV3ORPLIQELS5

+ 35 - 0
mjava-lichen/target/test-classes/server.sh

@@ -0,0 +1,35 @@
+#!/bin/bash
+appname='mjava-lichen'
+if [ "$1" == "dev" ]; then
+  java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=dev
+else
+  if [ "$1" == "start" ]; then
+    nohup java -Xms256m -Xmx256m -jar $appname.jar &
+    echo "server prod is starting"
+  else
+    if [ "$1" == "test" ]; then
+      nohup java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=test &
+      echo "server test is starting"
+    else
+      if [ "$1" == "stop" ]; then
+        PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+        if [ -z "$PID" ]; then
+          echo "server is already stopped"
+        else
+          echo kill $PID
+          kill $PID
+        fi
+      else
+        if [ "$1" == "status" ]; then
+          PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+          if [ -z "$PID" ]; then
+            echo "server is stopped"
+          else
+            echo "server is running"
+            echo $PID
+          fi
+        fi
+      fi
+    fi
+  fi
+fi

+ 55 - 0
mjava-lichen/target/test-classes/winsw.xml

@@ -0,0 +1,55 @@
+<!--
+  MIT License
+
+  Copyright (c) 2008-2020 Kohsuke Kawaguchi, Sun Microsystems, Inc., CloudBees,
+  Inc., Oleg Nenashev and other contributors
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+-->
+
+<!--
+ This is an example of a minimal Windows Service Wrapper configuration, which includes only mandatory options.
+ 
+ This configuration file should be placed near the WinSW executable, the name should be the same.
+ E.g. for myapp.exe the configuration file name should be myapp.xml
+ 
+ You can find more information about the configuration options here: https://github.com/kohsuke/winsw/blob/master/doc/xmlConfigFile.md
+ Full example: https://github.com/kohsuke/winsw/blob/master/examples/sample-allOptions.xml
+-->
+
+<service>
+    <!-- 注册服务ID -->
+    <id>mjava</id>
+    <!-- 启动服务名称 -->
+    <name>mjava</name>
+    <!-- 对服务的描述 -->
+    <description>标准化后端接口, 自用脚手架封装</description>
+    <!-- 「jdk需要安装」启动的可执行文件:若未配置环境变量executable需要执行绝对路径 -->
+    <!-- <executable>java</executable> -->
+    <executable>C:\Program Files\DingTalkServer\jdk1.8.0_221\bin\java</executable>
+    <!-- Xmx256m 代表堆内存最大值为256MB -jar后面的是项目名 -->
+    <arguments>-Xms256m -Xmx256m -jar mjava-lichen.jar</arguments>
+    <!-- 服务的启动模式:默认Automatic -->
+    <startmode>Automatic</startmode>
+    <!-- 日志地址 -->
+    <logpath>%BASE%\ws</logpath>
+    <!-- 日志模式 -->
+    <logmode>rotate</logmode>
+</service>
+

+ 67 - 0
mjava-minjiaoyuan/target/classes/application-dev.yml

@@ -0,0 +1,67 @@
+# 环境配置
+server:
+  port: 9001
+  servlet:
+    context-path: /api
+  tomcat:
+    additional-tld-skip-patterns: osdt_core.jar,osdt_cert.jar   # oracle6 忽略依赖包警告
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    # ojdbc6 [更高版本不兼容] 打印 oracle.jdbc.driver.T4CConnection.getNetworkTimeout()I, 因为没实现这个jdbc标准的函数
+    driver-class-name: oracle.jdbc.OracleDriver
+    username: front_jszyxx_2023
+    password: FrontU#JSZYxx#2023
+    url: jdbc:oracle:thin:@10.107.58.35:1521:jszyfzda
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: oracle
+
+# filepath
+file:
+  path:
+    file: /Users/malk/service/_Tool/var/mjava/tmp//file/
+    image: /Users/malk/service/_Tool/var/mjava/tmp//image/
+    tmp: /Users/malk/service/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/service/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/service/_Tool/var/mjava/log
+
+## dingtalk
+#dingtalk:
+#  agentId: 2550726809
+#  appKey: dingtift81fcga4rmrmk
+#  appSecret: Oa_S7CYYAfa3CurDbaTk1CBlSvfpcFs6ROjt8OTS8fDsjnS45X1CmxGgWbpJ8lI0
+#  corpId: dingcc1b1ffad0d5ca1d
+#  aesKey:
+#  token:
+#
+## aliwork
+#aliwork:
+#  appType: APP_GHMWTMHNZFEX24QOUC63
+#  systemToken: 4A9667B1NXM9XUSBDNR208ZMA2UQ20A99XEGLIC
+
+
+# dingtalk
+dingtalk:
+  agentId: 2559056539
+  appKey: dingpd6ukkzzcbsczp0n
+  appSecret: 7tTurS8akT9OYegOIe9sBpqdLXOxNCtlNgIwqdolH3VkTxupXzN_fQwASzBQHE6A
+  corpId: ding0f12f2ed788f674ef5bf40eda33b7ba0
+  aesKey:
+  token:
+
+# aliwork
+aliwork:
+  appType: APP_AD5T4ITVLW40MKR7V3LM
+  systemToken: 7N5664D1GX5A9VWICV06RCOARNMW273ZSRTGL7N7

+ 47 - 0
mjava-minjiaoyuan/target/classes/application-prod.yml

@@ -0,0 +1,47 @@
+# 环境配置
+server:
+  port: 9007
+
+# condition
+spel:
+  scheduling: true        # 定时任务是否执行
+  multiSource: false      # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: cp-root@2022++
+    url: jdbc:mysql://47.110.74.198:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+## dingtalk
+#dingtalk:
+#  agentId: 2550726809
+#  appKey: dingtift81fcga4rmrmk
+#  appSecret: Oa_S7CYYAfa3CurDbaTk1CBlSvfpcFs6ROjt8OTS8fDsjnS45X1CmxGgWbpJ8lI0
+#  corpId: dingcc1b1ffad0d5ca1d
+#  aesKey:
+#  token:
+#
+## aliwork
+#aliwork:
+#  appType: APP_GHMWTMHNZFEX24QOUC63
+#  systemToken: 4A9667B1NXM9XUSBDNR208ZMA2UQ20A99XEGLIC
+
+# dingtalk
+dingtalk:
+  agentId: 2559056539
+  appKey: dingpd6ukkzzcbsczp0n
+  appSecret: 7tTurS8akT9OYegOIe9sBpqdLXOxNCtlNgIwqdolH3VkTxupXzN_fQwASzBQHE6A
+  corpId: ding0f12f2ed788f674ef5bf40eda33b7ba0
+  aesKey:
+  token:
+
+# aliwork
+aliwork:
+  appType: APP_AD5T4ITVLW40MKR7V3LM
+  systemToken: 7N5664D1GX5A9VWICV06RCOARNMW273ZSRTGL7N7

+ 35 - 0
mjava-minjiaoyuan/target/test-classes/server.sh

@@ -0,0 +1,35 @@
+#!/bin/bash
+appname='mjava-minjiaoyuan'
+if [ "$1" == "dev" ]; then
+  java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=dev
+else
+  if [ "$1" == "start" ]; then
+    nohup java -Xms256m -Xmx256m -jar $appname.jar &
+    echo "server prod is starting"
+  else
+    if [ "$1" == "test" ]; then
+      nohup java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=test &
+      echo "server test is starting"
+    else
+      if [ "$1" == "stop" ]; then
+        PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+        if [ -z "$PID" ]; then
+          echo "server is already stopped"
+        else
+          echo kill $PID
+          kill $PID
+        fi
+      else
+        if [ "$1" == "status" ]; then
+          PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+          if [ -z "$PID" ]; then
+            echo "server is stopped"
+          else
+            echo "server is running"
+            echo $PID
+          fi
+        fi
+      fi
+    fi
+  fi
+fi

+ 58 - 0
mjava-rongzhi/target/classes/application-dev.yml

@@ -0,0 +1,58 @@
+# 环境配置
+server:
+  port: 9001
+  servlet:
+    context-path: /api
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: cp-root@2022++
+    url: jdbc:mysql://47.110.74.198:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp//file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp//image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# ekuaibao - 榕智
+ekuaibao:
+  corpId: ID01jaBqslI9LV                  # 易快报的 corpId
+  platformApi: https://dd2.ekuaibao.com   # 易快报不同平台获取前缀的方式不同
+
+# dingtalk - 市建管
+dingtalk:
+  agentId: 2561043249
+  appKey: dingged8ayplgf8g9cjg
+  appSecret: GbNMRf9i970oiKY8cNE39KqpF-fxIwUNuCFvqs_KpbRTfW3GnjRqfYjtBqi5exHF
+  corpId: dingea1dc77298d50115ee0f45d8e4f7c288
+  aesKey:
+  token:
+  operator:
+
+# aliwork
+aliwork:
+  appType: APP_SZMBX0R7WC68M19JCJKG
+  systemToken: 2G766HA16IE97NYK6KTEL94YDW422EZNENRFLD3
+
+

+ 39 - 0
mjava-rongzhi/target/classes/application-prod.yml

@@ -0,0 +1,39 @@
+# 环境配置
+server:
+  port: 9006
+
+# condition
+spel:
+  scheduling: true        # 定时任务是否执行
+  multiSource: false      # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: cp-root@2022++
+    url: jdbc:mysql://47.110.74.198:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# ekuaibao - 榕智
+ekuaibao:
+  corpId: ID01jaBqslI9LV                  # 易快报的 corpId
+  platformApi: https://dd2.ekuaibao.com   # 易快报不同平台获取前缀的方式不同
+
+# dingtalk - 榕智
+dingtalk:
+  agentId: 2561043249
+  appKey: dingged8ayplgf8g9cjg
+  appSecret: GbNMRf9i970oiKY8cNE39KqpF-fxIwUNuCFvqs_KpbRTfW3GnjRqfYjtBqi5exHF
+  corpId: dingea1dc77298d50115ee0f45d8e4f7c288
+  aesKey:
+  token:
+  operator:
+
+# aliwork
+aliwork:
+  appType: APP_SZMBX0R7WC68M19JCJKG
+  systemToken: 2G766HA16IE97NYK6KTEL94YDW422EZNENRFLD3

+ 35 - 0
mjava-rongzhi/target/test-classes/server.sh

@@ -0,0 +1,35 @@
+#!/bin/bash
+appname='mjava-rongzhi'
+if [ "$1" == "dev" ]; then
+  java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=dev
+else
+  if [ "$1" == "start" ]; then
+    nohup java -Xms256m -Xmx256m -jar $appname.jar &
+    echo "server prod is starting"
+  else
+    if [ "$1" == "test" ]; then
+      nohup java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=test &
+      echo "server test is starting"
+    else
+      if [ "$1" == "stop" ]; then
+        PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+        if [ -z "$PID" ]; then
+          echo "server is already stopped"
+        else
+          echo kill $PID
+          kill $PID
+        fi
+      else
+        if [ "$1" == "status" ]; then
+          PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+          if [ -z "$PID" ]; then
+            echo "server is stopped"
+          else
+            echo "server is running"
+            echo $PID
+          fi
+        fi
+      fi
+    fi
+  fi
+fi

+ 45 - 0
mjava-shanghaishiwei/target/classes/application-dev.yml

@@ -0,0 +1,45 @@
+# 环境配置
+server:
+  port: 9001
+  servlet:
+    context-path: /api
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: mu123
+    url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp//file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp//image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# dingtalk
+dingtalk:
+  agentId: 2610297348
+  appKey: dingwbo8kupwkbg9ahaf
+  appSecret: _uLjrlVW0HUK2PMGvsTcr-Ffs6rDSw2SCMaSgUmr6EpJvag9AxJwJzr9NOGr_Ral
+  corpId: ding7c84ac0578e7257235c2f4657eb6378f
+  aesKey:
+  token:

+ 38 - 0
mjava-shanghaishiwei/target/classes/application-prod.yml

@@ -0,0 +1,38 @@
+# 环境配置
+server:
+  port: 9008
+
+# condition
+spel:
+  scheduling: true        # 定时任务是否执行
+  multiSource: false      # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: cp-root@2022++
+    url: jdbc:mysql://47.110.74.198:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    database: MYSQL
+    database-platformw: org.hibernate.dialect.MySQL57Dialect
+  # 数据库版本
+  flyway:
+    enabled: false                      #  需要配置 jpa.hibernate.ddl-auto 为 none. 否则 flyway.enabled 配置会无效, 在没有数库连接情况下程序无法启动
+    encoding: UTF-8
+    locations: classpath:db/migration   # 迁移sql脚本文件存放路径,默认db/migration
+    sql-migration-prefix: V             # 迁移sql脚本文件名称的前缀,默认V
+    sql-migration-separator: __         # 迁移sql脚本文件名称的分隔符,默认2个下划线__
+    sql-migration-suffixes: .sql        # 迁移sql脚本文件名称的后缀
+    validate-on-migrate: true           # 迁移时是否进行校验,默认true
+    baseline-on-migrate: true           # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
+
+# dingtalk
+dingtalk:
+  agentId: 2610297348
+  appKey: dingwbo8kupwkbg9ahaf
+  appSecret: _uLjrlVW0HUK2PMGvsTcr-Ffs6rDSw2SCMaSgUmr6EpJvag9AxJwJzr9NOGr_Ral
+  corpId: ding7c84ac0578e7257235c2f4657eb6378f
+  aesKey:
+  token:

+ 112 - 0
mjava-shanghaishiwei/target/test-classes/sample/上海市委-列表.cs

@@ -0,0 +1,112 @@
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using H3;
+
+public class D2796247609923b101140e689622d8b39651b39_ListViewController: H3.SmartForm.ListViewController
+{
+    public D2796247609923b101140e689622d8b39651b39_ListViewController(H3.SmartForm.ListViewRequest request): base(request)
+    {
+    }
+
+    protected override void OnLoad(H3.SmartForm.LoadListViewResponse response)
+    {
+        base.OnLoad(response);
+    }
+
+    protected override void OnSubmit(string actionName, H3.SmartForm.ListViewPostValue postValue, H3.SmartForm.SubmitListViewResponse response)
+    {
+        if(actionName == "Remove")
+        {
+            // 删除数据ID:氚云列表页面,批量删除只能监听后端事件【最终执行】且若执行代码报错,删除会自动回滚。前端只能监听到点击删除,但监听不到确认、取消的回调。
+            Dictionary < string, object > data = postValue.Data;
+            object selectIds = null; // 获取勾选ID集合
+            if(data.TryGetValue("ObjectIds", out selectIds))
+            {
+                Dictionary < string, object > bodys = new Dictionary<string, object>();
+                bodys.Add("actionName", actionName); // 动作名称
+                // 处理氚云sql格式,in查询实例必须添加单引号,否则不能匹配
+                string[] objectIds = (string[]) selectIds;
+                List < string > fIds = new List<string>();
+                foreach(string objectId in objectIds)
+                {
+                    fIds.Add(string.Format("'{0}'", objectId));
+                }
+                System.Data.DataTable records = this.Engine.Query.QueryTable(string.Format("select origionContractCode, SeqNo, fileNames, Status from i_D2796247609923b101140e689622d8b39651b39 where ObjectId in ({0})", string.Join(",", fIds)), null);
+                bodys.Add("bizObjects", this.Serialize(records));  // 合同记录【生效数据过滤,代码处理】
+                // 氚云默认字段冲突: sOrigionContractCode as origionContractCode [select * 后,两个字段都会同时存在,若字段相同则会被 * 覆盖, 如 DATE_FORMAT,需要另开一个字段]
+                System.Data.DataTable terms = this.Engine.Query.QueryTable(string.Format("select DATE_FORMAT(cDateTime,'%Y-%m-%d') dateTime, agreementType from i_D279624F24d78c5510764cba928395c32b9406d6 where ParentObjectId in ({0})", string.Join(",", fIds)), null);
+                bodys.Add("termsObject", this.Serialize(terms));  // 合同条款
+                List < H3.BizBus.ItemSchema > structures = new List<H3.BizBus.ItemSchema>(); // 响应类型
+                this.invokeVendorService("delete", bodys, structures); // 请求处理
+            }
+        }
+        base.OnSubmit(actionName, postValue, response);
+    }
+
+    /**
+     * 氚云HTTP
+     * 1. code 公用请求,code区分业务逻辑
+     * 2. bodys 请求参数,默认POST,application/json
+     * 3. structures 返回数据格式定义, 统一使用对象响应
+     */
+    private H3.BizBus.BizStructure invokeVendorService(string code, Dictionary < string, object > bodys, List < H3.BizBus.ItemSchema > structures) {
+
+        H3.IEngine engine = this.Engine;
+
+        // 请求信息
+        Dictionary < string, string > headers = new Dictionary<string, string>();
+        Dictionary < string, string > querys = new Dictionary<string, string>();
+        querys.Add("code", code);
+
+        // 定义响应数据整体结构体
+        H3.BizBus.BizStructureSchema structureSchema = new H3.BizBus.BizStructureSchema();
+        structureSchema.Add(new H3.BizBus.ItemSchema("code", "结果状态码", H3.Data.BizDataType.Int, null));
+        structureSchema.Add(new H3.BizBus.ItemSchema("success", "请求状态位", H3.Data.BizDataType.Bool, null));
+        structureSchema.Add(new H3.BizBus.ItemSchema("message", "描述信息", H3.Data.BizDataType.String, null));
+        // 定义响应数据的 data 属性 的结构体
+        H3.BizBus.BizStructureSchema dataSchema = new H3.BizBus.BizStructureSchema();
+        foreach(H3.BizBus.ItemSchema itemSchame in structures)
+        {
+            dataSchema.Add(itemSchame);
+        }
+        //将 data 属性的结构体添加进整体的响应数据结构体 [H3.Data.BizDataType.BizStructureArray 集合,H3.Data.BizDataType.BizStructure 对象]
+        structureSchema.Add(new H3.BizBus.ItemSchema("data", "响应数据", H3.Data.BizDataType.BizStructure, dataSchema));
+
+        //调用Invoke接口,系统底层访问第三方接口的Invoke方法
+        H3.BizBus.InvokeResult response = engine.BizBus.InvokeApi(
+            H3.Organization.User.SystemUserId, //固定值,无需改变
+            H3.BizBus.AccessPointType.ThirdConnection, //固定值,无需改变
+            "h3yun-http", //连接编码,对应 插件中心 中配置的连接的编码
+            "POST", //请求方式,取值:GET / POST
+            "application/json", //请求数据类型: json - "application/json";xml - "text/html;charset=utf-8"
+            headers, querys, bodys, structureSchema);
+        if(response != null)
+        {
+            // 氚云调用是否成功
+            if(response.Code == 0)
+            {
+                // 获取返回数据,此实例对应完整的响应JSON
+                H3.BizBus.BizStructure rspData = response.Data;
+                if(((bool) rspData["success"]) == true)
+                {
+                    // 对象响应【氚云自定义字段,需要通过[]直接取值才有效,序列化后返回前端,仅会保留结构】
+                    // H3.BizBus.BizStructure[] datas = rspData["data"] as H3.BizBus.BizStructure[]; // 集合解析
+                    // H3.BizBus.BizStructure data = rspData["data"] as H3.BizBus.BizStructure; // 对象解析
+                    return rspData["data"] as H3.BizBus.BizStructure;
+                } else
+                {
+                    throw new Exception("接口异常," + rspData["message"]);
+                }
+            }
+            else
+            {
+                throw new Exception("氚云异常," + response.Message);
+            }
+        } else
+        {
+            throw new Exception("系统异常,接口无响应");
+        }
+    }
+}

+ 178 - 0
mjava-shanghaishiwei/target/test-classes/sample/上海市委.cs

@@ -0,0 +1,178 @@
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using H3;
+
+public class D2796247609923b101140e689622d8b39651b39: H3.SmartForm.SmartFormController
+{
+    public D2796247609923b101140e689622d8b39651b39(H3.SmartForm.SmartFormRequest request): base(request)
+    {
+    }
+
+    protected override void OnLoad(H3.SmartForm.LoadSmartFormResponse response)
+    {
+        // 获取、工号、姓名;委托人姓名[默认登录人]
+        if(this.Request.IsCreateMode)
+        {
+            this.Request.BizObject["inputPersonName"] = this.Request.UserContext.User.Name;
+            this.Request.BizObject["inputPersonCode"] = this.Request.UserContext.User.EmployeeNumber;
+            this.Request.BizObject["agentPerson"] = this.Request.UserContext.User.Name;
+        }
+        base.OnLoad(response);
+    }
+
+    protected override void OnSubmit(string actionName, H3.SmartForm.SmartFormPostValue postValue, H3.SmartForm.SubmitSmartFormResponse response)
+    {
+        // 默认值处理
+        if((actionName == "Submit" || actionName == "Save") && this.Request.IsCreateMode)
+        {
+            if(postValue.Data["inputPersonCode"] + string.Empty == "")
+            {
+                response.Infos.Add("未维护工号信息,请联系管理员!");
+            }
+            // 赋值兼容,避免数据丢失
+            string[] compIds = { "inputPersonName", "inputPersonCode", "agentPerson" };
+            foreach(string compId in compIds)
+            {
+                this.Request.BizObject[compId] = postValue.Data[compId] + string.Empty;
+            }
+        }
+        // 审批通过
+        if(this.Request.ActivityCode == "Activity23" && actionName == "Submit")
+        {
+            this.syncContract(actionName, this.Request.ActivityCode, true);
+        }
+        // 类型列表
+        if(actionName == "types")
+        {
+            Dictionary < string, object > bodys = new Dictionary<string, object>();
+            List < H3.BizBus.ItemSchema > structures = new List<H3.BizBus.ItemSchema>(); // 响应类型
+            structures.Add(new H3.BizBus.ItemSchema("types", "合同类型", H3.Data.BizDataType.String, null));
+            H3.BizBus.BizStructure data = this.invokeVendorService("types", bodys, structures); // 请求处理
+            response.ReturnData = new Dictionary<string, object>();
+            response.ReturnData.Add("types", data["types"]);
+        }
+        // 所属部门【返所属部门列表】
+        if(actionName == "purchaseDepart")
+        {
+            //根据人员Id查询其所有的部门Id
+            H3.Organization.User user = (H3.Organization.User) this.Engine.Organization.GetUnit(this.Request.UserContext.UserId);
+            string[] pIds = user.ParentIds;
+            List < string > fIds = new List<string>();
+            foreach(string pId in pIds)
+            {
+                fIds.Add(string.Format("'{0}'", pId));
+            }
+            System.Data.DataTable depts = this.Engine.Query.QueryTable(string.Format("select Name from H_Organizationunit where ObjectId in ({0})", string.Join(",", fIds)), null);
+            response.ReturnData = new Dictionary<string, object>();
+            response.ReturnData.Add("purchaseDepart", this.Serialize(depts));
+        }
+        // 代理人
+        if(actionName == "agentPerson")
+        {
+            System.Data.DataTable user = this.Engine.Query.QueryTable(string.Format("select * from h_user where ObjectId = '{0}'", this.Request["agentId"]), null);
+            response.ReturnData = new Dictionary<string, object>();
+            response.ReturnData.Add("agentPerson", this.Serialize(user));
+        }
+        base.OnSubmit(actionName, postValue, response);
+    }
+
+    // 盖章附件【后补】流程事件:只有审批人变更才会触发,发起、自动通过不会
+    protected override void OnWorkflowInstanceStateChanged(H3.Workflow.Instance.WorkflowInstanceState   oldState, H3.Workflow.Instance.WorkflowInstanceState newState)
+    {
+        // 流程审批结束事件(先执行业务规则,在执行该方法)
+        if(oldState == H3.Workflow.Instance.WorkflowInstanceState.Running && newState == H3.Workflow.Instance.WorkflowInstanceState.Finished)
+        {		/** 执行业务代码逻辑 **/
+            this.syncContract("OnWorkflowInstanceStateChanged", "Finished", false);
+        }
+        //流程审批结束后,重新激活事件(先执行业务规则,在执行该方法)
+        if(oldState == H3.Workflow.Instance.WorkflowInstanceState.Finished && newState == H3.Workflow.Instance.WorkflowInstanceState.Running) {		/** 执行业务代码逻辑 **/	}
+        base.OnWorkflowInstanceStateChanged(oldState, newState);
+    }
+
+    // 同步合同【公共】
+    private void syncContract(string actionName, string activityCode, bool isApprove) {
+        Dictionary < string, object > bodys = new Dictionary<string, object>();
+        bodys.Add("actionName", actionName); // 动作名称
+        bodys.Add("activityCode", activityCode); // 流程节点
+        // 氚云默认字段冲突: cSummary as summary, cTelephone as telephone [select * 后,两个字段都会同时存在, 若字段相同则会被 * 覆盖, 如 DATE_FORMAT,需要另开一个字段]
+        System.Data.DataTable records = this.Engine.Query.QueryTable(string.Format("select *, cSummary as cummary, cTelephone as telephone, DATE_FORMAT(cOrderTime,'%Y-%m-%d') orderTime, DATE_FORMAT(cCompletionDate,'%Y-%m-%d') completionDate from i_D2796247609923b101140e689622d8b39651b39 where ObjectId = '{0}'", this.Request.BizObjectId), null);
+        bodys.Add("bizObject", this.Serialize(records));  // 合同记录
+        System.Data.DataTable terms = this.Engine.Query.QueryTable(string.Format("select *, DATE_FORMAT(cDateTime,'%Y-%m-%d') dateTime from i_D279624F24d78c5510764cba928395c32b9406d6 where ParentObjectId = '{0}'", this.Request.BizObjectId), null);
+        bodys.Add("termsObject", this.Serialize(terms));  // 合同条款
+        H3.DataModel.BizObjectFileHeader[] files = (H3.DataModel.BizObjectFileHeader[]) this.Request.BizObject[isApprove ? "attachment" : "F0000002"]; // 附件控件 [注意:新增的时候获取不了ID,新增包含审批节点]
+        bodys.Add("attachments", this.Serialize(files));  // 合同附件
+        bodys.Add("fileNames", this.Request.BizObject["fileNames"]);  // 盖章附件
+        List < H3.BizBus.ItemSchema > structures = new List<H3.BizBus.ItemSchema>(); // 响应类型
+        structures.Add(new H3.BizBus.ItemSchema("fileNames", "文件名称", H3.Data.BizDataType.String, null));
+        H3.BizBus.BizStructure data = this.invokeVendorService(isApprove ? "approve" : "file", bodys, structures); // 请求处理
+        // 拼接与氚云记录, 服务删除逻辑
+        this.Engine.Query.QueryTable(string.Format("update i_D2796247609923b101140e689622d8b39651b39 set fileNames = '{0}' where ObjectId = '{1}'", data["fileNames"], this.Request.BizObjectId), null);
+    }
+
+    /**
+     * 氚云HTTP
+     * 1. code 公用请求,code区分业务逻辑
+     * 2. bodys 请求参数,默认POST,application/json
+     * 3. structures 返回数据格式定义, 统一使用对象响应
+     */
+    private H3.BizBus.BizStructure invokeVendorService(string code, Dictionary < string, object > bodys, List < H3.BizBus.ItemSchema > structures) {
+
+        H3.IEngine engine = this.Engine;
+
+        // 请求信息
+        Dictionary < string, string > headers = new Dictionary<string, string>();
+        Dictionary < string, string > querys = new Dictionary<string, string>();
+        querys.Add("code", code);
+
+        // 定义响应数据整体结构体
+        H3.BizBus.BizStructureSchema structureSchema = new H3.BizBus.BizStructureSchema();
+        structureSchema.Add(new H3.BizBus.ItemSchema("code", "结果状态码", H3.Data.BizDataType.Int, null));
+        structureSchema.Add(new H3.BizBus.ItemSchema("success", "请求状态位", H3.Data.BizDataType.Bool, null));
+        structureSchema.Add(new H3.BizBus.ItemSchema("message", "描述信息", H3.Data.BizDataType.String, null));
+        // 定义响应数据的 data 属性 的结构体
+        H3.BizBus.BizStructureSchema dataSchema = new H3.BizBus.BizStructureSchema();
+        foreach(H3.BizBus.ItemSchema itemSchame in structures)
+        {
+            dataSchema.Add(itemSchame);
+        }
+        //将 data 属性的结构体添加进整体的响应数据结构体 [H3.Data.BizDataType.BizStructureArray 集合,H3.Data.BizDataType.BizStructure 对象]
+        structureSchema.Add(new H3.BizBus.ItemSchema("data", "响应数据", H3.Data.BizDataType.BizStructure, dataSchema));
+
+        //调用Invoke接口,系统底层访问第三方接口的Invoke方法
+        H3.BizBus.InvokeResult response = engine.BizBus.InvokeApi(
+            H3.Organization.User.SystemUserId, //固定值,无需改变
+            H3.BizBus.AccessPointType.ThirdConnection, //固定值,无需改变
+            "h3yun-http", //连接编码,对应 插件中心 中配置的连接的编码
+            "POST", //请求方式,取值:GET / POST
+            "application/json", //请求数据类型: json - "application/json";xml - "text/html;charset=utf-8"
+            headers, querys, bodys, structureSchema);
+        if(response != null)
+        {
+            // 氚云调用是否成功
+            if(response.Code == 0)
+            {
+                // 获取返回数据,此实例对应完整的响应JSON
+                H3.BizBus.BizStructure rspData = response.Data;
+                if(((bool) rspData["success"]) == true)
+                {
+                    // 对象响应【氚云自定义字段,需要通过[]直接取值才有效,序列化后返回前端,仅会保留结构】
+                    // H3.BizBus.BizStructure[] datas = rspData["data"] as H3.BizBus.BizStructure[]; // 集合解析
+                    // H3.BizBus.BizStructure data = rspData["data"] as H3.BizBus.BizStructure; // 对象解析
+                    return rspData["data"] as H3.BizBus.BizStructure;
+                } else
+                {
+                    throw new Exception("响应异常," + rspData["message"]);
+                }
+            }
+            else
+            {
+                throw new Exception("氚云异常," + response.Message);
+            }
+        } else
+        {
+            throw new Exception("系统异常,接口无响应");
+        }
+    }
+}

+ 76 - 0
mjava-shanghaishiwei/target/test-classes/sample/上海市委.js

@@ -0,0 +1,76 @@
+/* 控件接口说明:
+ * 1. 读取控件: this.***,*号输入控件编码;
+ * 2. 读取控件的值: this.***.GetValue();
+ * 3. 设置控件的值: this.***.SetValue(???);
+ * 4. 绑定控件值变化事件: this.***.BindChange(key,function(){}),key是定义唯一的方法名;
+ * 5. 解除控件值变化事件: this.***.UnbindChange(key);
+ * 6. CheckboxList、DropDownList、RadioButtonList: $.***.AddItem(value,text),$.***.ClearItems();
+ */
+/* 公共接口:
+ * 1. ajax:$.SmartForm.PostForm(actionName,data,callBack,errorBack,async),
+ *          actionName:提交的ActionName;data:提交后台的数据;callback:回调函数;errorBack:错误回调函数;async:是否异步;
+ * 2. 打开表单:$.IShowForm(schemaCode, objectId, checkIsChange),
+ *          schemaCode:表单编码;objectId;表单数据Id;checkIsChange:关闭时,是否感知变化;
+ * 3. 定位接口:$.ILocation();
+ */
+
+// 表单插件代码
+$.extend($.JForm, {
+    // 加载事件
+    OnLoad: function () {
+
+        // 页面状态:0为审批/办理 1为办理完结 2为创建 4为查阅
+        if ($.SmartForm.ResponseContext.FormMode == 2) {
+            // 合同类型
+            this.typeName.ClearItems()
+            $.SmartForm.PostForm("types", {}, rsp => {
+                JSON.parse(rsp.ReturnData.types).forEach(item => {
+                    if (!item.typeName.includes("测试")) {
+                        this.typeName.AddItem(item.typeName)
+                    }
+                })
+            });
+
+            // 所属部门【仅一个部门,直接赋值;多个部门,下拉框手动选择】
+            this.purchaseDepart.ClearItems()
+            $.SmartForm.PostForm("purchaseDepart", {}, rsp => {
+                const depts = JSON.parse(rsp.ReturnData.purchaseDepart);
+                console.log(depts)
+                depts.forEach(item => {
+                    this.purchaseDepart.AddItem(item.Name)
+                })
+                if (depts.length == 1) {
+                    this.purchaseDepart.SetValue(depts[0].Name)
+                }
+            });
+
+            // 代理人姓名
+            this.cAgentPerson.BindChange("cAgentPerson", () => {
+                const agentPerson = this.cAgentPerson.GetValue()
+                if (agentPerson.length) {
+                    $.SmartForm.PostForm("agentPerson", {agentId: agentPerson[0]}, rsp => {
+                        console.log(JSON.parse(rsp.ReturnData.agentPerson))
+                        this.agentPerson.SetValue(JSON.parse(rsp.ReturnData.agentPerson)[0].Name)
+                    });
+                }
+            })
+        }
+    },
+
+    // 按钮事件
+    OnLoadActions: function (actions) {
+    },
+
+    // 提交校验
+    OnValidate: function (actionControl) {
+        return true;
+    },
+
+    // 提交前事件
+    BeforeSubmit: function (action, postValue) {
+    },
+
+    // 提交后事件
+    AfterSubmit: function (action, responseValue) {
+    }
+});

+ 35 - 0
mjava-shanghaishiwei/target/test-classes/server.sh

@@ -0,0 +1,35 @@
+#!/bin/bash
+appname='mjava-shanghaishiwei'
+if [ "$1" == "dev" ]; then
+  java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=dev
+else
+  if [ "$1" == "start" ]; then
+    nohup java -Xms256m -Xmx256m -jar $appname.jar &
+    echo "server prod is starting"
+  else
+    if [ "$1" == "test" ]; then
+      nohup java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=test &
+      echo "server test is starting"
+    else
+      if [ "$1" == "stop" ]; then
+        PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+        if [ -z "$PID" ]; then
+          echo "server is already stopped"
+        else
+          echo kill $PID
+          kill $PID
+        fi
+      else
+        if [ "$1" == "status" ]; then
+          PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+          if [ -z "$PID" ]; then
+            echo "server is stopped"
+          else
+            echo "server is running"
+            echo $PID
+          fi
+        fi
+      fi
+    fi
+  fi
+fi

+ 58 - 0
mjava-shijianguan/target/classes/application-dev.yml

@@ -0,0 +1,58 @@
+# 环境配置
+server:
+  port: 9001
+  servlet:
+    context-path: /api
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: mu123
+    url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp//file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp//image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# ekuaibao - 榕智
+ekuaibao:
+  corpId: ID01jaBqslI9LV                  # 易快报的 corpId
+  platformApi: https://dd2.ekuaibao.com   # 易快报不同平台获取前缀的方式不同
+
+# dingtalk - 市建管
+dingtalk:
+  agentId: 2561043249
+  appKey: dingged8ayplgf8g9cjg
+  appSecret: GbNMRf9i970oiKY8cNE39KqpF-fxIwUNuCFvqs_KpbRTfW3GnjRqfYjtBqi5exHF
+  corpId: dingea1dc77298d50115ee0f45d8e4f7c288
+  aesKey:
+  token:
+  operator:
+
+# aliwork
+aliwork:
+  appType: APP_SZMBX0R7WC68M19JCJKG
+  systemToken: 2G766HA16IE97NYK6KTEL94YDW422EZNENRFLD3
+
+

+ 39 - 0
mjava-shijianguan/target/classes/application-prod.yml

@@ -0,0 +1,39 @@
+# 环境配置
+server:
+  port: 9006
+
+# condition
+spel:
+  scheduling: false       # 定时任务是否执行
+  multiSource: false      # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: cp-root@2022++
+    url: jdbc:mysql://47.110.74.198:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# ekuaibao - 榕智
+ekuaibao:
+  corpId: ID01jaBqslI9LV                  # 易快报的 corpId
+  platformApi: https://dd2.ekuaibao.com   # 易快报不同平台获取前缀的方式不同
+
+# dingtalk - 市建管
+dingtalk:
+  agentId: 2561043249
+  appKey: dingged8ayplgf8g9cjg
+  appSecret: GbNMRf9i970oiKY8cNE39KqpF-fxIwUNuCFvqs_KpbRTfW3GnjRqfYjtBqi5exHF
+  corpId: dingea1dc77298d50115ee0f45d8e4f7c288
+  aesKey:
+  token:
+  operator:
+
+# aliwork
+aliwork:
+  appType: APP_SZMBX0R7WC68M19JCJKG
+  systemToken: 2G766HA16IE97NYK6KTEL94YDW422EZNENRFLD3

+ 58 - 0
mjava-xiding/target/classes/application-dev.yml

@@ -0,0 +1,58 @@
+# 环境配置
+server:
+  port: 9001
+  servlet:
+    context-path: /api
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: false       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: cp-root@2022++
+    url: jdbc:mysql://47.110.74.198:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQLDialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp//file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp//image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# dingtalk
+dingtalk:
+  agentId: 2572507894
+  appKey: dinginnofpmdigrx68en
+  appSecret: _yR-hKMT56kYsPvSFoIPxCxJj42W7eDVIUFVzidcvqF69xTZ7inJmHNdKWVi8kZJ
+  corpId: ding2daa2d5e80b14b5b35c2f4657eb6378f
+  aesKey:
+  token:
+  operator: "050640000420258143"   # 侯丽萍, OA管理员账号
+
+# fxiaoke
+fxiaoke:
+  appId: FSAID_131becb
+  appSecret: 1f516179d4e84ecba24752b0c4af5d02
+  permanentCode: 317DA531616A1569F906D1F9A1C74D15
+  corpId: FSCID_2DA12EC0A1DC7EF6FD68E5AA33F25D8A  # 纷享销客 corpId
+
+# aliwork
+aliwork:
+  appType: APP_ATQMDF7W332Z2OUFGBIJ
+  systemToken: T99666B1S3NDZU5Y66SQC8CSEOMC2C2AXLOLLK

+ 51 - 0
mjava-xiding/target/classes/application-prod.yml

@@ -0,0 +1,51 @@
+# 环境配置
+server:
+  port: 9025
+
+# condition
+spel:
+  scheduling: true        # 定时任务是否执行
+  multiSource: false      # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: cp-root@2022++
+    url: jdbc:mysql://47.110.74.198:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  jpa:
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+  # 数据库版本
+  flyway:
+    enabled: false                      #  需要配置 jpa.hibernate.ddl-auto 为 none. 否则 flyway.enabled 配置会无效, 在没有数库连接情况下程序无法启动
+    encoding: UTF-8
+    locations: classpath:db/migration   # 迁移sql脚本文件存放路径,默认db/migration
+    sql-migration-prefix: V             # 迁移sql脚本文件名称的前缀,默认V
+    sql-migration-separator: __         # 迁移sql脚本文件名称的分隔符,默认2个下划线__
+    sql-migration-suffixes: .sql        # 迁移sql脚本文件名称的后缀
+    validate-on-migrate: true           # 迁移时是否进行校验,默认true
+    baseline-on-migrate: true           # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
+
+# dingtalk
+dingtalk:
+  agentId: 2572507894
+  appKey: dinginnofpmdigrx68en
+  appSecret: _yR-hKMT56kYsPvSFoIPxCxJj42W7eDVIUFVzidcvqF69xTZ7inJmHNdKWVi8kZJ
+  corpId: ding2daa2d5e80b14b5b35c2f4657eb6378f
+  aesKey:
+  token:
+  operator: "050640000420258143"   # 侯丽萍, OA管理员账号
+
+# fxiaoke
+fxiaoke:
+  appId: FSAID_131becb
+  appSecret: 1f516179d4e84ecba24752b0c4af5d02
+  permanentCode: 317DA531616A1569F906D1F9A1C74D15
+  corpId: FSCID_2DA12EC0A1DC7EF6FD68E5AA33F25D8A  # 纷享销客 corpId
+
+# aliwork
+aliwork:
+  appType: APP_ATQMDF7W332Z2OUFGBIJ
+  systemToken: T99666B1S3NDZU5Y66SQC8CSEOMC2C2AXLOLLK

+ 35 - 0
mjava-xiding/target/test-classes/server.sh

@@ -0,0 +1,35 @@
+#!/bin/bash
+appname='mjava-xiding'
+if [ "$1" == "dev" ]; then
+  java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=dev
+else
+  if [ "$1" == "start" ]; then
+    nohup java -Xms256m -Xmx256m -jar $appname.jar &
+    echo "server prod is starting"
+  else
+    if [ "$1" == "test" ]; then
+      nohup java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=test &
+      echo "server test is starting"
+    else
+      if [ "$1" == "stop" ]; then
+        PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+        if [ -z "$PID" ]; then
+          echo "server is already stopped"
+        else
+          echo kill $PID
+          kill $PID
+        fi
+      else
+        if [ "$1" == "status" ]; then
+          PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+          if [ -z "$PID" ]; then
+            echo "server is stopped"
+          else
+            echo "server is running"
+            echo $PID
+          fi
+        fi
+      fi
+    fi
+  fi
+fi

+ 55 - 0
mjava-xiding/target/test-classes/winsw.xml

@@ -0,0 +1,55 @@
+<!--
+  MIT License
+
+  Copyright (c) 2008-2020 Kohsuke Kawaguchi, Sun Microsystems, Inc., CloudBees,
+  Inc., Oleg Nenashev and other contributors
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+-->
+
+<!--
+ This is an example of a minimal Windows Service Wrapper configuration, which includes only mandatory options.
+ 
+ This configuration file should be placed near the WinSW executable, the name should be the same.
+ E.g. for myapp.exe the configuration file name should be myapp.xml
+ 
+ You can find more information about the configuration options here: https://github.com/kohsuke/winsw/blob/master/doc/xmlConfigFile.md
+ Full example: https://github.com/kohsuke/winsw/blob/master/examples/sample-allOptions.xml
+-->
+
+<service>
+    <!-- 注册服务ID -->
+    <id>mjava</id>
+    <!-- 启动服务名称 -->
+    <name>mjava</name>
+    <!-- 对服务的描述 -->
+    <description>标准化后端接口, 自用脚手架封装</description>
+    <!-- 「jdk需要安装」启动的可执行文件:若未配置环境变量executable需要执行绝对路径 -->
+    <!-- <executable>java</executable> -->
+    <executable>C:\Program Files\DingTalkServer\jdk1.8.0_221\bin\java</executable>
+    <!-- Xmx256m 代表堆内存最大值为256MB -jar后面的是项目名 -->
+    <arguments>-Xms256m -Xmx256m -jar mjava-xiding.jar</arguments>
+    <!-- 服务的启动模式:默认Automatic -->
+    <startmode>Automatic</startmode>
+    <!-- 日志地址 -->
+    <logpath>%BASE%\ws</logpath>
+    <!-- 日志模式 -->
+    <logmode>rotate</logmode>
+</service>
+

+ 79 - 0
mjava-xintianlong/target/classes/application-dev.yml

@@ -0,0 +1,79 @@
+# 环境配置
+server:
+  port: 9001
+  servlet:
+    context-path: /api/xintianlong
+
+# condition
+spel:
+  scheduling: false        # 定时任务是否执行
+  multiSource: true        # 是否多数据源配置 -- 订单查询
+
+spring:
+#  # database
+#  datasource:
+#    driver-class-name: com.mysql.cj.jdbc.Driver
+#    username: root
+#    password: cp-root@2022++
+#    url: jdbc:mysql://47.110.74.198:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+#  jpa:
+#    hibernate:
+#      ddl-auto: none      # JPA对表没有任何操作
+#    show-sql: true
+#    database: MYSQL
+#    database-platform: org.hibernate.dialect.MySQLDialect
+  # sql_server
+  datasource:
+    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+    url: jdbc:sqlserver://122.224.41.74:4335;SelectMethod=cursor;DatabaseName=HSDyeingERP
+    username: HYKJ
+    password: XTL527204628#123
+    # 灏宇
+    primary:
+      username: HYKJ
+      password: XTL527204628#123
+      jdbc-url: jdbc:sqlserver://122.224.41.74:4335;SelectMethod=cursor;DatabaseName=HSDyeingERP
+    # 金塔
+    slave:
+      username: JTKS
+      password: XTL527204628@
+      jdbc-url: jdbc:sqlserver://122.224.41.74:4336;SelectMethod=cursor;DatabaseName=HSDyeingERP
+  # JPA
+  jpa:
+    database: sql_server
+    properties:
+      hibernate:
+        default_schema: dbo
+    hibernate:
+      ddl-auto: none
+      naming:
+        # 取消小驼峰到下划线映射
+        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
+        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp//file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp//image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# dingtalk
+dingtalk:
+  agentId: 2533464721
+  appKey: dingromjxexd1esgvwwg
+  appSecret: AcStrL5bdw69gqeUfTQiFoBsgqisL2g-egzaKyID9Q7d85f_z9EkuTSS9Vse6zDb
+  corpId: ding5e83ad92d917b47535c2f4657eb6378f
+  aesKey: NgBOhTTp38RmPYs3gz7xBRHGNhwLHAv3tZntZ6He54F
+  token: yLQuiiYIBvrzN3tmOduDn
+
+# aliwork
+aliwork:
+  appType: APP_IW1FN8PPGGYQBWVMXS69
+  systemToken: UT866MB1WGX8VU029U93IA9DIKEG2GE9UU7FLI5
+

+ 75 - 0
mjava-xintianlong/target/classes/application-prod.yml

@@ -0,0 +1,75 @@
+# 环境配置
+server:
+  port: 9001 # -- 订单查询
+#  port: 9005 # -- 审批推送
+  servlet:
+    context-path: /api/xintianlong
+
+# condition
+spel:
+  scheduling: false       # 定时任务是否执行
+  multiSource: true      # 是否多数据源配置 -- 订单查询
+
+spring:
+#  # database
+#  datasource:
+#    driver-class-name: com.mysql.cj.jdbc.Driver
+#    username: root
+#    password: cp-root@2022++
+#    url: jdbc:mysql://47.110.74.198:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+#  jpa:
+#    database: MYSQL
+#    database-platform: org.hibernate.dialect.MySQL57Dialect
+#  # 数据库版本
+#  flyway:
+#    enabled: false                      #  需要配置 jpa.hibernate.ddl-auto 为 none. 否则 flyway.enabled 配置会无效, 在没有数库连接情况下程序无法启动
+#    encoding: UTF-8
+#    locations: classpath:db/migration   # 迁移sql脚本文件存放路径,默认db/migration
+#    sql-migration-prefix: V             # 迁移sql脚本文件名称的前缀,默认V
+#    sql-migration-separator: __         # 迁移sql脚本文件名称的分隔符,默认2个下划线__
+#    sql-migration-suffixes: .sql        # 迁移sql脚本文件名称的后缀
+#    validate-on-migrate: true           # 迁移时是否进行校验,默认true
+#    baseline-on-migrate: true           # 当迁移发现数据库非空且存在没有元数据的表时,自动执行基准迁移,新建schema_version表
+
+  # sql_server
+  datasource:
+    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+    url: jdbc:sqlserver://122.224.41.74:4335;SelectMethod=cursor;DatabaseName=HSDyeingERP
+    username: HYKJ
+    password: XTL527204628#123
+    # 灏宇
+    primary:
+      username: HYKJ
+      password: XTL527204628#123
+      jdbc-url: jdbc:sqlserver://122.224.41.74:4335;SelectMethod=cursor;DatabaseName=HSDyeingERP
+    # 金塔
+    slave:
+      username: JTKS
+      password: XTL527204628@
+      jdbc-url: jdbc:sqlserver://122.224.41.74:4336;SelectMethod=cursor;DatabaseName=HSDyeingERP
+  # JPA
+  jpa:
+    database: sql_server
+    properties:
+      hibernate:
+        default_schema: dbo
+    hibernate:
+      ddl-auto: none
+      naming:
+        # 取消小驼峰到下划线映射
+        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
+        physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
+
+# dingtalk
+dingtalk:
+  agentId: 2533464721
+  appKey: dingromjxexd1esgvwwg
+  appSecret: AcStrL5bdw69gqeUfTQiFoBsgqisL2g-egzaKyID9Q7d85f_z9EkuTSS9Vse6zDb
+  corpId: ding5e83ad92d917b47535c2f4657eb6378f
+  aesKey: NgBOhTTp38RmPYs3gz7xBRHGNhwLHAv3tZntZ6He54F
+  token: yLQuiiYIBvrzN3tmOduDn
+
+# aliwork
+aliwork:
+  appType: APP_IW1FN8PPGGYQBWVMXS69
+  systemToken: UT866MB1WGX8VU029U93IA9DIKEG2GE9UU7FLI5

+ 35 - 0
mjava-xintianlong/target/test-classes/server.sh

@@ -0,0 +1,35 @@
+#!/bin/bash
+appname='mjava-xintianlong'
+if [ "$1" == "dev" ]; then
+  java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=dev
+else
+  if [ "$1" == "start" ]; then
+    nohup java -Xms256m -Xmx256m -jar $appname.jar &
+    echo "server prod is starting"
+  else
+    if [ "$1" == "test" ]; then
+      nohup java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=test &
+      echo "server test is starting"
+    else
+      if [ "$1" == "stop" ]; then
+        PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+        if [ -z "$PID" ]; then
+          echo "server is already stopped"
+        else
+          echo kill $PID
+          kill $PID
+        fi
+      else
+        if [ "$1" == "status" ]; then
+          PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+          if [ -z "$PID" ]; then
+            echo "server is stopped"
+          else
+            echo "server is running"
+            echo $PID
+          fi
+        fi
+      fi
+    fi
+  fi
+fi

+ 55 - 0
mjava-xintianlong/target/test-classes/winsw.xml

@@ -0,0 +1,55 @@
+<!--
+  MIT License
+
+  Copyright (c) 2008-2020 Kohsuke Kawaguchi, Sun Microsystems, Inc., CloudBees,
+  Inc., Oleg Nenashev and other contributors
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+-->
+
+<!--
+ This is an example of a minimal Windows Service Wrapper configuration, which includes only mandatory options.
+ 
+ This configuration file should be placed near the WinSW executable, the name should be the same.
+ E.g. for myapp.exe the configuration file name should be myapp.xml
+ 
+ You can find more information about the configuration options here: https://github.com/kohsuke/winsw/blob/master/doc/xmlConfigFile.md
+ Full example: https://github.com/kohsuke/winsw/blob/master/examples/sample-allOptions.xml
+-->
+
+<service>
+    <!-- 注册服务ID -->
+    <id>mjava</id>
+    <!-- 启动服务名称 -->
+    <name>mjava</name>
+    <!-- 对服务的描述 -->
+    <description>标准化后端接口, 自用脚手架封装</description>
+    <!-- 「jdk需要安装」启动的可执行文件:若未配置环境变量executable需要执行绝对路径 -->
+    <!-- <executable>java</executable> -->
+    <executable>C:\Program Files\DingTalkServer\jdk1.8.0_221\bin\java</executable>
+    <!-- Xmx256m 代表堆内存最大值为256MB -jar后面的是项目名 [-Dfile.encoding=UTF-8 Windows会乱码, 但Mac上VSCode正常] -->
+    <arguments>-Xms256m -Xmx256m -Dfile.encoding=UTF-8 -jar mjava-xintianlong.jar</arguments>
+    <!-- 服务的启动模式:默认Automatic -->
+    <startmode>Automatic</startmode>
+    <!-- 日志地址 -->
+    <logpath>%BASE%\ws</logpath>
+    <!-- 日志模式 -->
+    <logmode>rotate</logmode>
+</service>
+

+ 259 - 0
mjava/target/classes/META-INF/spring-configuration-metadata.json

@@ -0,0 +1,259 @@
+{
+  "groups": [
+    {
+      "name": "aliwork",
+      "type": "com.malk.server.aliwork.YDConf",
+      "sourceType": "com.malk.server.aliwork.YDConf"
+    },
+    {
+      "name": "corp",
+      "type": "com.malk.server.common.McConf",
+      "sourceType": "com.malk.server.common.McConf"
+    },
+    {
+      "name": "dingtalk",
+      "type": "com.malk.server.dingtalk.DDConf",
+      "sourceType": "com.malk.server.dingtalk.DDConf"
+    },
+    {
+      "name": "ekuaibao",
+      "type": "com.malk.server.ekuaibao.EKBConf",
+      "sourceType": "com.malk.server.ekuaibao.EKBConf"
+    },
+    {
+      "name": "file",
+      "type": "com.malk.server.common.FilePath",
+      "sourceType": "com.malk.server.common.FilePath"
+    },
+    {
+      "name": "file.path",
+      "type": "com.malk.server.common.FilePath$Path",
+      "sourceType": "com.malk.server.common.FilePath"
+    },
+    {
+      "name": "file.path",
+      "type": "com.malk.server.common.FilePath$Path",
+      "sourceType": "com.malk.server.common.FilePath$Path"
+    },
+    {
+      "name": "file.path",
+      "type": "com.malk.server.common.FilePath$Path",
+      "sourceType": "com.malk.server.common.FilePath$Path"
+    },
+    {
+      "name": "file.source",
+      "type": "com.malk.server.common.FilePath$Source",
+      "sourceType": "com.malk.server.common.FilePath"
+    },
+    {
+      "name": "file.source",
+      "type": "com.malk.server.common.FilePath$Source",
+      "sourceType": "com.malk.server.common.FilePath$Source"
+    },
+    {
+      "name": "file.source",
+      "type": "com.malk.server.common.FilePath$Source",
+      "sourceType": "com.malk.server.common.FilePath$Source"
+    },
+    {
+      "name": "fxiaoke",
+      "type": "com.malk.server.fxiaoke.FXKConf",
+      "sourceType": "com.malk.server.fxiaoke.FXKConf"
+    },
+    {
+      "name": "spring.datasource.primary",
+      "type": "javax.sql.DataSource",
+      "sourceType": "com.malk.config.mutilSource.DataSourceConfig",
+      "sourceMethod": "primaryDataSource()"
+    },
+    {
+      "name": "spring.datasource.slave",
+      "type": "javax.sql.DataSource",
+      "sourceType": "com.malk.config.mutilSource.DataSourceConfig",
+      "sourceMethod": "slaveDataSource()"
+    },
+    {
+      "name": "tencent",
+      "type": "com.malk.server.tencent.TXYConf",
+      "sourceType": "com.malk.server.tencent.TXYConf"
+    }
+  ],
+  "properties": [
+    {
+      "name": "aliwork.app-type",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.aliwork.YDConf"
+    },
+    {
+      "name": "aliwork.system-token",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.aliwork.YDConf"
+    },
+    {
+      "name": "corp.engineers",
+      "type": "java.util.List<java.lang.String>",
+      "sourceType": "com.malk.server.common.McConf"
+    },
+    {
+      "name": "corp.page-size",
+      "type": "java.lang.Integer",
+      "description": "最大分页",
+      "sourceType": "com.malk.server.common.McConf",
+      "defaultValue": 100
+    },
+    {
+      "name": "corp.time-await",
+      "type": "java.lang.Integer",
+      "sourceType": "com.malk.server.common.McConf",
+      "defaultValue": 0
+    },
+    {
+      "name": "corp.time-out",
+      "type": "java.lang.Integer",
+      "sourceType": "com.malk.server.common.McConf",
+      "defaultValue": 0
+    },
+    {
+      "name": "dingtalk.aes-key",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.dingtalk.DDConf"
+    },
+    {
+      "name": "dingtalk.agent-id",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.dingtalk.DDConf"
+    },
+    {
+      "name": "dingtalk.app-key",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.dingtalk.DDConf"
+    },
+    {
+      "name": "dingtalk.app-secret",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.dingtalk.DDConf"
+    },
+    {
+      "name": "dingtalk.corp-id",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.dingtalk.DDConf"
+    },
+    {
+      "name": "dingtalk.operator",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.dingtalk.DDConf"
+    },
+    {
+      "name": "dingtalk.token",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.dingtalk.DDConf"
+    },
+    {
+      "name": "ekuaibao.app-key",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.ekuaibao.EKBConf"
+    },
+    {
+      "name": "ekuaibao.app-security",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.ekuaibao.EKBConf"
+    },
+    {
+      "name": "ekuaibao.corp-id",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.ekuaibao.EKBConf"
+    },
+    {
+      "name": "ekuaibao.platform-api",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.ekuaibao.EKBConf"
+    },
+    {
+      "name": "ekuaibao.platform-url",
+      "type": "java.lang.String",
+      "description": "获取地址前缀",
+      "sourceType": "com.malk.server.ekuaibao.EKBConf"
+    },
+    {
+      "name": "file.path.file",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.common.FilePath$Path"
+    },
+    {
+      "name": "file.path.file",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.common.FilePath$Path"
+    },
+    {
+      "name": "file.path.image",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.common.FilePath$Path"
+    },
+    {
+      "name": "file.path.image",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.common.FilePath$Path"
+    },
+    {
+      "name": "file.path.tmp",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.common.FilePath$Path"
+    },
+    {
+      "name": "file.path.tmp",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.common.FilePath$Path"
+    },
+    {
+      "name": "file.source.fonts",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.common.FilePath$Source"
+    },
+    {
+      "name": "file.source.fonts",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.common.FilePath$Source"
+    },
+    {
+      "name": "fxiaoke.app-id",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.fxiaoke.FXKConf"
+    },
+    {
+      "name": "fxiaoke.app-secret",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.fxiaoke.FXKConf"
+    },
+    {
+      "name": "fxiaoke.corp-id",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.fxiaoke.FXKConf"
+    },
+    {
+      "name": "fxiaoke.permanent-code",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.fxiaoke.FXKConf"
+    },
+    {
+      "name": "tencent.a-p-p-i-d",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.tencent.TXYConf"
+    },
+    {
+      "name": "tencent.region",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.tencent.TXYConf"
+    },
+    {
+      "name": "tencent.secret-id",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.tencent.TXYConf"
+    },
+    {
+      "name": "tencent.secret-key",
+      "type": "java.lang.String",
+      "sourceType": "com.malk.server.tencent.TXYConf"
+    }
+  ],
+  "hints": []
+}

+ 113 - 0
mjava/target/classes/application-dev.yml

@@ -0,0 +1,113 @@
+# service
+server:
+  port: 9100
+  servlet:
+    context-path: /dev  # 全局接口前缀
+
+# condition
+spel:
+  scheduling: false       # 定时任务是否执行
+  multiSource: true       # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: mu123
+    url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+    # 主库
+    primary:
+      username: root
+      password: mu123
+      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+    # 从库
+    slave:
+      username: root
+      password: mu123
+      jdbc-url: jdbc:mysql://127.0.0.1:3306/mjava_slave?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  # MongoDB配置
+  data:
+    mongodb:
+      uri: mongodb://tbread:Teambition999@192.168.31.201:27017/teambition   # 固定格式 [连接成功后, 需要为 teambition 库添加 admin 权限才可查询]
+  # JPA
+  jpa:
+    hibernate:
+      ddl-auto: none    # JPA对表没有任何操作
+    show-sql: true
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# filepath
+file:
+  path:
+    file: /Users/malk/server/_Tool/var/mjava/tmp//file/
+    image: /Users/malk/server/_Tool/var/mjava/tmp//image/
+    tmp: /Users/malk/server/_Tool/var/mjava/tmp/
+  source:
+    fonts: /Users/malk/server/_Tool/fonts/simsun.ttc
+logging:
+  file:
+    path: /Users/malk/server/_Tool/var/mjava/log
+
+# diwork
+diwork:
+  appKey: 09242de7dc2c44c0b2dbca1b389aa566
+  appSecret: cf2b924ccb2b47f39bc9841a39ef4784
+
+# u8open
+u8open:
+  appKey: opa75c6cbdd6375068f
+  appSecret: f2e79a74aa284b5e83be6f1cac84e4b6
+  toAccount: sangnuo8
+  fromAccount: zhixian666
+
+# feishu
+feishu:
+  appKey: cli_a2b72fadcafe100e
+  appSecret: SUy4raAtpO3dgOasOfO43GU6YfaMnQ3Q
+  encryptKey: DVeCYMQgcg5T8BpKnOIUkdsU8Rex1Ndx
+  verToken: agS2kgO39Y59JSQUduNOahd64woiKvxf
+
+# dingtalk
+dingtalk:
+  agentId: 1963716187
+  appKey: dinggv1wq87khdiley47
+  appSecret: LK5j7BXJSf0niT16SM3qUX9x0KrfB37BlE07nWJchM35GnrpFkafi_nCRDAnbjLW
+  corpId: ding321c72787fffc78b35c2f4657eb6378f
+  aesKey:
+  token:
+  operator: "095358016629044412"   # 牧语[开头需要转一下字符串], OA管理员账号
+
+# teambition
+teambition:
+  AppID: 63589b8bb6803e162f9a57d8
+  AppSecret: 5mB3b73OFhSwo38xEVqahCLwQVhG1MW3
+  TenantId: 5ca44db8ca4fd40001b10559
+  OperatorId: 5e698cca21f5ad70dfba7d2b      # 公共账号, 需要有操作权限 [牧语]
+
+# aliwork
+aliwork:
+  appType: APP_GTK6SIE4MNVEEVPJLM7Z
+  systemToken: IA766O61FNR42YWEEEKTB5QAEEP827UYE3M9LK11
+
+# ekuaibao
+ekuaibao:
+  corpId: -yQbjbywbc640011                # 易快报 corpId
+  platformApi: https://app.ekuaibao.com   # 易快报不同平台获取前缀的方式不同
+  appKey:
+  appSecurity:
+
+# fxiaoke
+fxiaoke:
+  appId: FSAID_131becb
+  appSecret: 1f516179d4e84ecba24752b0c4af5d02
+  permanentCode: 317DA531616A1569F906D1F9A1C74D15
+  corpId: FSCID_2DA12EC0A1DC7EF6FD68E5AA33F25D8A  # 纷享销客 corpId
+
+# tencent [腾讯云]
+tencent:
+  APPID: 1309939821
+  SecretId: AKID2uqoryukbO2XuBThuxzdEpnmnmoocuCH
+  SecretKey: wnmgYHo8wrmjlldKoHnIkDZlqvrVDpOz
+  Region: ap-shanghai

+ 80 - 0
mjava/target/classes/application-prod.yml

@@ -0,0 +1,80 @@
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: mjava
+    password: mjava@mc
+    url: jdbc:mysql://47.100.206.177:33306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+    # 主库
+    primary:
+      username: mjava
+      password: mjava@mc
+      jdbc-url: jdbc:mysql://47.100.206.177:33306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+    # 从库
+    slave:
+      username: mjava
+      password: mjava@mc
+      jdbc-url: jdbc:mysql://47.100.206.177:33306/mjava_slave?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  # JPA
+  jpa:
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# diwork
+diwork:
+  appKey: 09242de7dc2c44c0b2dbca1b389aa566
+  appSecret: cf2b924ccb2b47f39bc9841a39ef4784
+
+# u8open
+u8open:
+  appKey: opa75c6cbdd6375068f
+  appSecret: f2e79a74aa284b5e83be6f1cac84e4b6
+  toAccount: sangnuo8
+  fromAccount: zhixian666
+
+# feishu
+feishu:
+  appKey: cli_a2b72fadcafe100e
+  appSecret: SUy4raAtpO3dgOasOfO43GU6YfaMnQ3Q
+  encryptKey: DVeCYMQgcg5T8BpKnOIUkdsU8Rex1Ndx
+  verToken: agS2kgO39Y59JSQUduNOahd64woiKvxf
+
+# dingtalk
+dingtalk:
+  agentId: 1999093926
+  appKey: dingylcuowclmme76je1
+  appSecret: u5_oBF5Kj491u3iefiaTnl8AO9vrSyE84x_jQxjCGyqV9JKnzaYBElkh_cBo177I
+  corpId: dingcc1b1ffad0d5ca1d
+  aesKey:
+  token:
+
+# teambition
+teambition:
+  AppID: 63589b8bb6803e162f9a57d8
+  AppSecret: 5mB3b73OFhSwo38xEVqahCLwQVhG1MW3
+  TenantId: 5ca44db8ca4fd40001b10559
+  OperatorId: 5e698cca21f5ad70dfba7d2b    # 公共账号, 需要有操作权限 [牧语]
+
+# aliwork
+aliwork:
+  appType: APP_GTK6SIE4MNVEEVPJLM7Z
+  systemToken: IA766O61FNR42YWEEEKTB5QAEEP827UYE3M9LK11
+
+# ekuaibao
+ekuaibao:
+  corpId: -yQbjbywbc640011                # 易快报的 corpId
+  platformApi: https://app.ekuaibao.com   # 易快报不同平台获取前缀的方式不同
+
+# fxiaoke
+fxiaoke:
+  appId: FSAID_131becb
+  appSecret: 1f516179d4e84ecba24752b0c4af5d02
+  permanentCode: 317DA531616A1569F906D1F9A1C74D15
+  corpId: FSCID_2DA12EC0A1DC7EF6FD68E5AA33F25D8A  # 纷享销客 corpId
+
+# 企业配置
+corp:
+  # 异常通知 list: [1, 2, 3] or - 1, - 2, - 3
+  engineers:
+    - "09535801661638954621"
+    - "01251957155326205105"

+ 86 - 0
mjava/target/classes/application-test.yml

@@ -0,0 +1,86 @@
+# service
+server:
+  port: 9200
+  servlet:
+    context-path: /test   # 全局接口前缀
+
+# condition
+spel:
+  scheduling: true       # 定时任务是否执行
+  multiSource: true      # 是否多数据源配置
+
+spring:
+  # database
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: mjava
+    password: mjava@mc
+    url: jdbc:mysql://47.100.206.177:33306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+    # 主库
+    primary:
+      username: mjava
+      password: mjava@mc
+      jdbc-url: jdbc:mysql://47.100.206.177:33306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+    # 从库
+    slave:
+      username: mjava
+      password: mjava@mc
+      jdbc-url: jdbc:mysql://47.100.206.177:33306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+  # JPA
+  jpa:
+    hibernate:
+      ddl-auto: none    # JPA对表没有任何操作
+    show-sql: true
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# diwork
+diwork:
+  appKey: 09242de7dc2c44c0b2dbca1b389aa566
+  appSecret: cf2b924ccb2b47f39bc9841a39ef4784
+
+# dingtalk
+dingtalk:
+  agentId: 1419545139
+  appKey: dingwzyfafywbucvf7mp
+  appSecret: bpwYH1a0aFL5lPVT6W9wUYuA9jE_EOzM9PdKHe5baIwAcAYwL6HLUy-9Lahd7z-8
+  corpId: ding0ddb25eeef0315d624f2f5cc6abecb85
+  aesKey: JtkDqwLDjiidhtb24U58h2WxJx6EWfSzoPiiXIQxJzJ
+  token: orDlKVufcdbz1sN8H9dFm61zpGFn7XRPishPk2CiZrpyN
+
+# u8open
+u8open:
+  appKey: opa75c6cbdd6375068f
+  appSecret: f2e79a74aa284b5e83be6f1cac84e4b6
+  toAccount: test_zhixian666
+  fromAccount: zhixian666
+
+# feishu
+feishu:
+  appKey: cli_a2b72fadcafe100e
+  appSecret: SUy4raAtpO3dgOasOfO43GU6YfaMnQ3Q
+  encryptKey: DVeCYMQgcg5T8BpKnOIUkdsU8Rex1Ndx
+  verToken: agS2kgO39Y59JSQUduNOahd64woiKvxf
+
+# teambition
+teambition:
+  AppID: 63589b8bb6803e162f9a57d8
+  AppSecret: 5mB3b73OFhSwo38xEVqahCLwQVhG1MW3
+  TenantId: 5ca44db8ca4fd40001b10559
+
+# aliwork
+aliwork:
+  appType: APP_GTK6SIE4MNVEEVPJLM7Z
+  systemToken: IA766O61FNR42YWEEEKTB5QAEEP827UYE3M9LK11
+
+# ekuaibao
+ekuaibao:
+  corpId: -yQbjbywbc640011                # 易快报的 corpId
+  platformApi: https://app.ekuaibao.com   # 易快报不同平台获取前缀的方式不同
+
+# fxiaoke
+fxiaoke:
+  appId: FSAID_131becb
+  appSecret: 1f516179d4e84ecba24752b0c4af5d02
+  permanentCode: 317DA531616A1569F906D1F9A1C74D15
+  corpId: FSCID_2DA12EC0A1DC7EF6FD68E5AA33F25D8A  # 纷享销客 corpId

+ 92 - 0
mjava/target/classes/application.yml

@@ -0,0 +1,92 @@
+# 环境配置
+server:
+  port: 9001
+  servlet:
+    context-path: /api  # 全局接口前缀: 同一个域名提供转发不同路径到不同端口方案
+
+# 条件注入
+spel:
+  scheduling: true       # 定时任务是否执行
+  multiSource: true      # 是否多数据源配置
+
+# 资源配置
+spring:
+  profiles:
+    active: prod
+  # 热部署
+  devtools:
+    restart:
+      enabled: false
+      additional-paths: src/main/java   # 设置重启的目录
+      exclude: WEB-INF/**               # classpath目录下的WEB-INF文件夹内容修改不重启
+  # 文件上传
+  servlet:
+    multipart:
+      max-file-size: 10MB
+      max-request-size: 20MB
+  # 数据库
+  datasource:
+    type: com.zaxxer.hikari.HikariDataSource
+    hikari:
+      pool-name: DateHikariCP
+      minimum-idle: 0
+      maximum-pool-size: 10
+      idle-timeout: 30000
+      max-lifetime: 120000          # 小于数据库超时大于业务执行返回时间[hikari默认30m, mysql默认10m]
+      connection-timeout: 30000     # 数据库连接超时时间,默认30秒,即30000
+  # JPA
+  jpa:
+    hibernate:
+      ddl-auto: none                # 对表没有任何操作. 若不设置为 none, flyway.enabled 配置会无效, 在没有数据库连接情况下程序无法启动
+    show-sql: false
+    open-in-view: false             # 开启可用于多对一懒加载, 但可能存在并发缓存问题
+    properties:
+      hibernate:
+        format_sql: true
+        generate_statistics: false  # 生产环境有效
+        jdbc:
+          batch_size: 500            # 开启批量更新与删除
+          batch_versioned_data: true
+        order_inserts: true
+        order_updates: true
+        query:
+          plan_cache_max_size: 64    # hibernate会缓存sql语句以减少重复编译
+          plan_parameter_metadata_max_size: 32
+          plan_cache_max_soft_references: 1024
+          plan_cache_max_strong_references: 64
+  # jsp
+  mvc:
+    view:
+      prefix: /WEB-INF/jsp/
+      suffix: .jsp
+
+# 日志配置
+logging:
+  level:
+    com.malk: debug
+    org.springframework: warn
+  file:
+    path: ./log
+
+# 路径配置
+file:
+  path:
+    file: ./tmp/file/
+    image: ./tmp/image/
+    tmp: ./tmp/
+  source:
+    fonts: ./sys/fonts/simsun.ttc.ttc
+
+# 企业配置
+corp:
+  # 公共服务
+  servlet:
+    aliwork: false
+    dingtalk: false
+    diwork: true
+    feishu: true
+    teambition: true
+  # 通用设置
+  timeOut: 300
+  timeAwait: 600
+

二进制
mjava/target/classes/assets/logo/logo-text.png


+ 7 - 0
mjava/target/classes/banner.txt

@@ -0,0 +1,7 @@
+
+               ,
+---_--_------------__---------__-
+  / /  )     /   /   ) | /  /   )
+_/_/__/_____/___(___(__|/__(___(_
+           /                     
+       (_ /

+ 170 - 0
mjava/target/classes/logback-spring.xml

@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <!-- 日志存放路径 -->
+    <springProperty scope="context" name="log.path" source="logging.file.path"/>
+    <!-- 日志输出格式 -->
+    <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level - [%method,%line] - %msg%n"/>
+
+    <!-- 控制台输出 -->
+    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+    </appender>
+
+    <!-- 错误日志输出 -->
+    <appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/error-%i.log.gz</fileNamePattern>
+            <!--日志文件最大的大小 -->
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>20MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别: 如果定义了日志级别为warn ,却没有指定 warn的日志处理方式: warn日志信息就不会有 -->
+            <level>ERROR</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 警告日志输出 -->
+    <appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/warn.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/warn-%i.log.gz</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>20MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>WARN</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 记录日志输出 -->
+    <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/info.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/info-%i.log.gz</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>20MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>INFO</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 调试日志输出 -->
+    <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/debug.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/debug-%i.log.gz</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>20MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>30</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <level>DEBUG</level>
+            <onMatch>ACCEPT</onMatch>
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 指定日志输出 -->
+    <appender name="POINT_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        <file>${log.path}/point.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <fileNamePattern>${log.path}/%d{yyyy-MM-dd}/point-%i.log.gz</fileNamePattern>
+            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
+                <maxFileSize>20MB</maxFileSize>
+            </timeBasedFileNamingAndTriggeringPolicy>
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
+            <layout class="ch.qos.logback.classic.PatternLayout">
+                <pattern>${log.pattern}</pattern>
+            </layout>
+        </encoder>
+    </appender>
+
+    <!-- Spring日志级别控制  -->
+    <logger name="org.springframework" level="warn"/>
+
+    <!-- hikari 日志级别 -->
+    <Logger name="com.zaxxer.hikari" level="info"></Logger>
+
+    <!-- Hibernate 日志级别 -->
+    <logger name="org.hibernate.type.descriptor.sql.BasicBinder" level="DEBUG"/>
+    <logger name="org.hibernate.type.descriptor.sql.BasicExtractor" level="DEBUG"/>
+    <logger name="org.hibernate.SQL" level="DEBUG"/>
+    <logger name="org.hibernate.engine.QueryParameters" level="DEBUG"/>
+    <logger name="org.hibernate.engine.query.HQLQueryPlan" level="DEBUG"/>
+
+    <!-- 配置文件默认名字:logback-spring.xml,也可以用logback.xml -->
+
+    <!-- 1. 多环境配置,通过springProfile设置环境,root内容会自动追加到logger -->
+    <!-- 2. 过滤的级别: 如果定义了日志级别为warn ,却没有指定 warn的日志处理方式: warn日志信息就不会有 -->
+    <!-- 3. 指定类输出日志到指定文件夹: private static final Logger logger = LoggerFactory.getLogger("point"); -->
+    <!-- # 日志配置 logging.level.com.malk=debug logging.level.org.springframework: warn -->
+
+    <logger name="point" level="DEBUG">
+        <appender-ref ref="POINT_FILE"/>
+    </logger>
+
+    <!-- 开发环境: 打印控制台 -->
+    <springProfile name="dev">
+        <root level="warn">
+            <appender-ref ref="CONSOLE"/>
+            <appender-ref ref="INFO_FILE"/>
+        </root>
+    </springProfile>
+
+    <!-- 测试环境:输出文件 -->
+    <springProfile name="test">
+        <root level="info">
+            <appender-ref ref="DEBUG_FILE"/>
+            <appender-ref ref="INFO_FILE"/>
+            <appender-ref ref="WARN_FILE"/>
+            <appender-ref ref="ERROR_FILE"/>
+        </root>
+    </springProfile>
+
+    <!-- 生产环境: 输出文件 -->
+    <springProfile name="prod">
+        <root level="info">
+            <appender-ref ref="DEBUG_FILE"/>
+            <appender-ref ref="INFO_FILE"/>
+            <appender-ref ref="WARN_FILE"/>
+            <appender-ref ref="ERROR_FILE"/>
+        </root>
+    </springProfile>
+</configuration>

文件差异内容过多而无法显示
+ 6026 - 0
mjava/target/classes/static/mjs/mjs.js


文件差异内容过多而无法显示
+ 1 - 0
mjava/target/classes/static/mjs/mjs.min.js


+ 61 - 0
mjava/target/test-classes/driver.yml

@@ -0,0 +1,61 @@
+# 配置主键
+
+# 1. 设置 strategy 为 GenerationType.AUTO,  让jpa 选择合适方式匹配
+# 2. 在数据库内设置对应主键, 以及主键自增的规则
+
+# 各数据库
+
+# database
+spring-1:
+  # MYSQL
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    username: root
+    password: mu123
+    url: jdbc:mysql://127.0.0.1:3306/mjava?serverTimezone=Asia/Shanghai&useUnicode=yes&characterEncoding=UTF-8&useSSL=true
+    hikari:
+      # todo: 更新
+      connection-init-sql: SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci           # SqlServer, Oracle 无需设置类型
+  # JPA
+  jpa:
+    database: MYSQL
+    database-platform: org.hibernate.dialect.MySQL57Dialect
+
+# database
+spring-2:
+  # sql_server
+  spring:
+    datasource:
+      driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
+      url: jdbc:sqlserver://127.0.0.1:1433;SelectMethod=cursor;DatabaseName=DingTalkApprove
+      username: sa
+      password: Sa123456
+    # JPA
+    jpa:
+      database: sql_server
+      properties:
+        hibernate:
+          default_schema: dbo
+
+# database
+spring-3:
+  # Oracle
+  datasource:
+    driver-class-name: oracle.jdbc.OracleDriver
+    username: front_jszyxx_2023
+    password: FrontU#JSZYxx#2023
+    url: jdbc:oracle:thin:@10.107.58.35:1521:jszyfzda
+  jpa:
+    hibernate:
+      ddl-auto: none      # JPA对表没有任何操作
+    show-sql: true
+    database: oracle
+
+# 其他配置
+spring-0:
+  jpa:
+    hibernate:
+      # 取消小驼峰到下划线映射
+      naming:
+        implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
+        sphysical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

+ 4 - 0
mjava/target/test-classes/frp/frpc.sh

@@ -0,0 +1,4 @@
+#!/bin/bash
+
+cd /Users/malk/server/_Tool/proxy/frp
+./frpc -c ./frpc.ini

+ 19 - 0
mjava/target/test-classes/frp/hpe/frpc.ini

@@ -0,0 +1,19 @@
+# frpc.ini
+[common]
+server_addr = 47.110.74.198
+server_port = 1001
+token = NHDDSAISHDHDSDSIODHDASHDJASK=
+
+[ssh]
+# ssh连接
+type = tcp
+local_ip = 127.0.0.1
+local_port = 22
+remote_port = 2222
+
+[web]
+# 网页代理
+type = tcp
+local_ip = 127.0.0.1
+local_port = 80
+remote_port = 2001

+ 34 - 0
mjava/target/test-classes/frp/macos/frpc.ini

@@ -0,0 +1,34 @@
+# frpc.ini
+[common]
+server_addr = 47.110.74.198
+server_port = 1001
+token = NHDDSAISHDHDSDSIODHDASHDJASK=
+
+#[ssh]
+## ssh连接
+#type = tcp
+#local_ip = 127.0.0.1
+#local_port = 22
+#remote_port = 2222
+
+#[secret_ssh_visitor]
+#type = stcp
+## stcp 的访问者
+role = visitor
+# 要访问的 stcp 代理的名字
+#server_name = secret_ssh
+#sk = zxcvbnm
+## 绑定本地端口用于访问 ssh 服务
+#bind_addr = 127.0.0.1
+#bind_port = 2222
+
+#[web]
+#type = http
+#local_port = 80
+#custom_domains = www.yourdomain.com
+
+[rdp]
+type = tcp
+local_ip = 127.0.0.1
+local_port = 9001
+remote_port: 1003

+ 63 - 0
mjava/target/test-classes/frp/remark.md

@@ -0,0 +1,63 @@
+### frp
+
+1. `uname -a`    查看服务器版本,下载对应的 [客户端](https://github.com/fatedier/frp/releases)
+
+2. 开放服务器3个端口:1001 绑定映射关系,1002 作为 dashboard 访问看板, 1003 作为ip入口
+
+3. 1003:更建议配置nginx转发, 无需开端口,且方便实现https访问;**将原服务 `api` 改为 `frp`,即可实现转发**
+
+   ```
+   # proxy
+   location ~ ^/frp/ {
+       rewrite  ^/frp/(.*)$  /api/$1  break;
+       proxy_pass http://127.0.0.1:1003;
+       proxy_set_header Host $host:$server_port;
+       proxy_set_header X-Real-IP $remote_addr;
+       proxy_set_header Remote_Addr $remote_addr;
+       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+       proxy_set_header X-Forwarded-Proto $scheme;
+       proxy_set_header Referer $http_referer;
+       client_max_body_size 100m;
+       client_body_buffer_size 20480k;
+       proxy_send_timeout 300s;
+       proxy_read_timeout 300s;
+   }
+   ```
+
+4. 启动
+
+   进入对应的frp目录,服务器端执行:./frps -c ./frpc.ini ; 客户端执行:./frpc -c ./frpc.ini
+
+    - server 启动
+
+   ```
+   cd /home/mc/frp
+   # 临时启动
+   ./frps -c ./frps.ini
+   # 后台启动 [开启日志]
+   nohup ./frps -c ./frps.ini  &
+   ```
+
+    - local 启动:
+
+   ```
+   cd /Users/malk/server/_Tool/proxy/frp
+   ./frpc -c ./frpc.ini
+   ```
+
+    - hpe 启动
+
+   ```
+   cd /home/frp
+   ./frpc -c ./frpc.ini
+   ```
+
+5. 通过 **http** 访问 dashboard:`http://47.110.74.198:1002/static/#/proxies/tcp`
+
+
+6. 客户端可通过 sh 快速执行启动 【**frpc.sh**】
+
+```
+cd /Users/malk/server/_Tool/proxy/frp
+./frpc -c ./frpc.ini
+```

+ 30 - 0
mjava/target/test-classes/frp/server/frps.ini

@@ -0,0 +1,30 @@
+[common]
+# bind 端口
+bind_port = 1001
+# 授权码,在客户端会用到
+token = NHDDSAISHDHDSDSIODHDASHDJASK=
+
+# dashboard 端口
+dashboard_port = 1002
+# frp管理后台用户名和密码
+dashboard_user = admin
+dashboard_pwd = admin1234@
+enable_prometheus = true
+
+#[secret_ssh]
+#type = stcp
+## 只有 sk 一致的用户才能访问到此服务
+#sk = zxcvbnm
+#local_ip = 127.0.0.1
+#local_port = 22
+
+# frp日志配置
+log_file = ./log/frps.log
+log_level = info
+log_max_days = 7
+
+# 最大链接池, 每个代理预先与后端服务器建立起指定数量的最大链接数
+max_pool_count = 10
+
+# proxy 1003
+# 更建议配置nginx转发,方便实现https转发而无需更多配置;将原服务 `api` 改为 `frp`,即可实现

+ 27 - 0
mjava/target/test-classes/nginx/certs/mc.100ali.com.key

@@ -0,0 +1,27 @@
+-----BEGIN RSA PRIVATE KEY-----
+MIIEpQIBAAKCAQEA7EGpsM/lwgkZydUWORj6k798ci2I8mJe4DZs8C096pdjPhxo
+oxuyosRNPkefFTyp2VDtypB2XdlaTUW8dOTjwhx14xervwIvSxvzfzpW7yVkF/XY
++YZaU+sCsrPCjIs2AFK3u+ufqSKXfefoF3ykn+SmOKRO7XmRJ2hHu/1U6tMV3h+j
+WCypshBvSzZZ1M2xylYMNYz7Bgf8noToL5QlFi/mo2SANH4jvpjn/hPgrt/f5H/c
+qJjnut2m1WCR/sipDILCb7q7eo1wdYhL4m4cyreJuejjOLvSJvQ9H1LhqOq8YRiw
+xEm79L8nnSw21X3GcAYxdklG3jJz2Vqkzm4TwQIDAQABAoIBABN5nN2uCuLXfIsO
+XVpFkdpTYunH5nhnMtT0B5Tg1drHB0TxHeWxfHnoXp8EqRDHbboz7qDPucImDvM8
+YrrsEfjyqaZs/BkEZWuhQ+Lipz89a3vXez75G+xmUf7zIdVotayJz7WA8yoDvPiB
+q7h2ljIhV1u8nPj8bW0R2TVI6RLA59mqLZy9YILLtzD4weFRGtBXrHPhBaoF6AZ+
+G3bM8yIOqrDjAss8BChbLhOT3lM25BeMg+FhRs/QFICp7CkkrgMGiKgC9Ut8W79u
+j1CoKKh9XD2taSMY6/kbvta11LaWWyzsnERv8xxewb6ycIC8gh3Jb2wup+chqn5t
+e7VKR6UCgYEA/prGrfRhnG+uBUvYICe3DL161rZ2QEEUWeN2JENHQYXAdYofmdGj
+qR3qg3fF4dhpFh5S0Bo4lTxplh/KLyTJ99Ji1Oeco181nLwWFlevu+fPL9Pth3ok
+U3lW5bnoXHijB1pqG16p5XOoNrmKW1aOO2tAM9ZT0VrYfQ28hcvZZbMCgYEA7Y0k
+tZBCJ6VJOHoqdEZCcJpw7gbMWo5RsklKicCG3LFY3a7uYvRrVoxuVi2JJ55AvJx+
+fKGXlQVefUDacSzRqtgCBqcMQxz0chHjHNPKtznovjb3g1X9f/C+X2IJIscX99gc
+Wq6rP3uVTPjaVUmoDxZ8W3gWPyuce0DSilorDrsCgYEA6ST4XKEVpXgLJeRu8/sK
+P4tfajDJlktCBJIrREerf4+oTrn9+BAlyx6O+nZ6aTaP/GYmNVRdjiM1GPjhX0xT
++jDYudeh82SjJnSB0VHYpbw/WK+7qjyp+Rp6/YDBC7SYrYoY8hk8gNXpKru6u6tG
+MZkjwJQ6StLivZkPkoG6AMsCgYEAqJdzZihryxdTT/HkD4GNxbzWSRgqEFrRQGcj
+r4AkNpznJO3x4ej2BQbFiAPpQ2TdLP8kBe/pVKnq1ZohbhEQ/N8xEOednEQAeLSZ
+KuxlAoTm2ZjJMTzmHNcPRUKemUATkqKd/P3aK8PZwjcbPUx5Kbwbpg8kOtEIzbDD
+u80ioeECgYEA96Mp991V7dkxTrF7GfHChhWkiDQuqeDYNdf4OTfDiVsKxIYDpsct
+c6CHtHI8ZKqd8wQOQIGhJcRGad42ukzbcBv2JISWIIayI75mlnAiPRAa1tJW0Ara
+z4R8kdTwfqXocuWRTZIGD1xLB8h5QbiXDxXqYV5gorPXGe/AcUc2wO8=
+-----END RSA PRIVATE KEY-----

+ 61 - 0
mjava/target/test-classes/nginx/certs/mc.100ali.com.pem

@@ -0,0 +1,61 @@
+-----BEGIN CERTIFICATE-----
+MIIF7jCCBNagAwIBAgIQDQ2dQ1iMckae+XtKzQbWuDANBgkqhkiG9w0BAQsFADBu
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMS0wKwYDVQQDEyRFbmNyeXB0aW9uIEV2ZXJ5d2hlcmUg
+RFYgVExTIENBIC0gRzEwHhcNMjIwNTI5MDAwMDAwWhcNMjMwNTMwMjM1OTU5WjAY
+MRYwFAYDVQQDEw1tYy4xMDBhbGkuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEA7EGpsM/lwgkZydUWORj6k798ci2I8mJe4DZs8C096pdjPhxooxuy
+osRNPkefFTyp2VDtypB2XdlaTUW8dOTjwhx14xervwIvSxvzfzpW7yVkF/XY+YZa
+U+sCsrPCjIs2AFK3u+ufqSKXfefoF3ykn+SmOKRO7XmRJ2hHu/1U6tMV3h+jWCyp
+shBvSzZZ1M2xylYMNYz7Bgf8noToL5QlFi/mo2SANH4jvpjn/hPgrt/f5H/cqJjn
+ut2m1WCR/sipDILCb7q7eo1wdYhL4m4cyreJuejjOLvSJvQ9H1LhqOq8YRiwxEm7
+9L8nnSw21X3GcAYxdklG3jJz2Vqkzm4TwQIDAQABo4IC3DCCAtgwHwYDVR0jBBgw
+FoAUVXRPsnJP9WC6UNHX5lFcmgGHGtcwHQYDVR0OBBYEFIRL5k/Fq2S+zZHTBcTU
+ydmcl0UiMBgGA1UdEQQRMA+CDW1jLjEwMGFsaS5jb20wDgYDVR0PAQH/BAQDAgWg
+MB0GA1UdJQQWMBQGCCsGAQUFBwMBBggrBgEFBQcDAjA+BgNVHSAENzA1MDMGBmeB
+DAECATApMCcGCCsGAQUFBwIBFhtodHRwOi8vd3d3LmRpZ2ljZXJ0LmNvbS9DUFMw
+gYAGCCsGAQUFBwEBBHQwcjAkBggrBgEFBQcwAYYYaHR0cDovL29jc3AuZGlnaWNl
+cnQuY29tMEoGCCsGAQUFBzAChj5odHRwOi8vY2FjZXJ0cy5kaWdpY2VydC5jb20v
+RW5jcnlwdGlvbkV2ZXJ5d2hlcmVEVlRMU0NBLUcxLmNydDAJBgNVHRMEAjAAMIIB
+fQYKKwYBBAHWeQIEAgSCAW0EggFpAWcAdgCt9776fP8QyIudPZwePhhqtGcpXc+x
+DCTKhYY069yCigAAAYEN9dFPAAAEAwBHMEUCIEt34jU2//7f52yFFjvqPB9P2mVm
+rfrYBBe4qw3hEsFVAiEAyEEZXN+l8A4Xir0jZaB1XDI6UYAVGEGUCyeGv6hGW8cA
+dQA1zxkbv7FsV78PrUxtQsu7ticgJlHqP+Eq76gDwzvWTAAAAYEN9dD2AAAEAwBG
+MEQCIH57SuDo7RZ6EYxlMVWZ2p79ER/+J9c5fK6xIx0le20BAiBbCeL5A0prsw/X
+Cizl53Zf93ZXxcb5g1NoM7rtnPFXnAB2ALNzdwfhhFD4Y4bWBancEQlKeS2xZwwL
+h9zwAw55NqWaAAABgQ310RMAAAQDAEcwRQIgAiLb1TTXI3feIc+zsAckIiBbU0eN
+X54CYq6ngDiRuGMCIQDWEvc/bIBxBgvOexN4nB7CKvbIEaqBEAJUvPYfjfkh3TAN
+BgkqhkiG9w0BAQsFAAOCAQEAUk0TaQGKeEG1ChlMpCALEnU499e4o8hIdvonqQ4Z
+3Ly72cCMvvFn/Xd2oYShY8IDCzWwYxDQMV5epajHHa89BQY3TqwDocncSM5mIzsX
+THTVftkGL3AXVbn8mlxoE9cogOo/P8FQjrQ19a2JkYR6Xs+EqVMzvM3iiWvV7jNg
+aSWAepcm85kknlEzatEBpgdDW21taX5pZ5Jbkm9GRbA+Bhy//aPygp/VuyIJw9iH
+JjEGbAjX6XI/i5dntna4WOYcuak2Sb1j0up5gHK3fTxSkq1T5c0gzbqqbPmAtAXM
+aUN+f+fXYTL+Ve/rQBRc38cWuTA+U79aVZcMUUhtAR7ljQ==
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIEqjCCA5KgAwIBAgIQAnmsRYvBskWr+YBTzSybsTANBgkqhkiG9w0BAQsFADBh
+MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3
+d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD
+QTAeFw0xNzExMjcxMjQ2MTBaFw0yNzExMjcxMjQ2MTBaMG4xCzAJBgNVBAYTAlVT
+MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j
+b20xLTArBgNVBAMTJEVuY3J5cHRpb24gRXZlcnl3aGVyZSBEViBUTFMgQ0EgLSBH
+MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBALPeP6wkab41dyQh6mKc
+oHqt3jRIxW5MDvf9QyiOR7VfFwK656es0UFiIb74N9pRntzF1UgYzDGu3ppZVMdo
+lbxhm6dWS9OK/lFehKNT0OYI9aqk6F+U7cA6jxSC+iDBPXwdF4rs3KRyp3aQn6pj
+pp1yr7IB6Y4zv72Ee/PlZ/6rK6InC6WpK0nPVOYR7n9iDuPe1E4IxUMBH/T33+3h
+yuH3dvfgiWUOUkjdpMbyxX+XNle5uEIiyBsi4IvbcTCh8ruifCIi5mDXkZrnMT8n
+wfYCV6v6kDdXkbgGRLKsR4pucbJtbKqIkUGxuZI2t7pfewKRc5nWecvDBZf3+p1M
+pA8CAwEAAaOCAU8wggFLMB0GA1UdDgQWBBRVdE+yck/1YLpQ0dfmUVyaAYca1zAf
+BgNVHSMEGDAWgBQD3lA1VtFMu2bwo+IbG8OXsj3RVTAOBgNVHQ8BAf8EBAMCAYYw
+HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMBIGA1UdEwEB/wQIMAYBAf8C
+AQAwNAYIKwYBBQUHAQEEKDAmMCQGCCsGAQUFBzABhhhodHRwOi8vb2NzcC5kaWdp
+Y2VydC5jb20wQgYDVR0fBDswOTA3oDWgM4YxaHR0cDovL2NybDMuZGlnaWNlcnQu
+Y29tL0RpZ2lDZXJ0R2xvYmFsUm9vdENBLmNybDBMBgNVHSAERTBDMDcGCWCGSAGG
+/WwBAjAqMCgGCCsGAQUFBwIBFhxodHRwczovL3d3dy5kaWdpY2VydC5jb20vQ1BT
+MAgGBmeBDAECATANBgkqhkiG9w0BAQsFAAOCAQEAK3Gp6/aGq7aBZsxf/oQ+TD/B
+SwW3AU4ETK+GQf2kFzYZkby5SFrHdPomunx2HBzViUchGoofGgg7gHW0W3MlQAXW
+M0r5LUvStcr82QDWYNPaUy4taCQmyaJ+VB+6wxHstSigOlSNF2a6vg4rgexixeiV
+4YSB03Yqp2t3TeZHM9ESfkus74nQyW7pRGezj+TC44xCagCQQOzzNmzEAP2SnCrJ
+sNE2DpRVMnL8J6xBRdjmOsC3N6cQuKuRXbzByVBjCqAA8t1L0I+9wXJerLPyErjy
+rMKWaBFLmfK/AHNF4ZihwPGOc7w6UHczBZXH5RFzJNnww+WnKuTPI0HfnVH8lg==
+-----END CERTIFICATE-----

文件差异内容过多而无法显示
+ 529 - 0
mjava/target/test-classes/nginx/index.html


+ 63 - 0
mjava/target/test-classes/nginx/location

@@ -0,0 +1,63 @@
+# local-path: /usr/local/etc/nginx/servers/.
+
+# web
+location ~ ^/web/ {
+    root   /Users/malk/server/java-mcli/mjava/src/test/resources/nginx/html/;
+    index  index.html index.htm;
+}
+
+# gogs
+location / {
+    proxy_pass http://localhost:3000;
+}
+
+error_page   404 /404.html;
+error_page   500 502 503 504  /50x.html;
+
+# prod
+location ~ ^/api/ {
+    #rewrite  ^/mc/(.*)$  /$1  break;
+    proxy_pass http://127.0.0.1:9001;
+    proxy_set_header Host $host:$server_port;
+    proxy_set_header X-Real-IP $remote_addr;
+    proxy_set_header Remote_Addr $remote_addr;
+    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+    proxy_set_header X-Forwarded-Proto $scheme;
+    proxy_set_header Referer $http_referer;
+    client_max_body_size 100m;
+    client_body_buffer_size 20480k;
+    proxy_send_timeout 300s;
+    proxy_read_timeout 300s;
+}
+
+# test
+location ~ ^/test/ {
+    #rewrite  ^/mc/(.*)$  /$1  break;
+    proxy_pass http://127.0.0.1:9002;
+    proxy_set_header Host $host:$server_port;
+    proxy_set_header X-Real-IP $remote_addr;
+    proxy_set_header Remote_Addr $remote_addr;
+    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+    proxy_set_header X-Forwarded-Proto $scheme;
+    proxy_set_header Referer $http_referer;
+    client_max_body_size 100m;
+    client_body_buffer_size 20480k;
+    proxy_send_timeout 300s;
+    proxy_read_timeout 300s;
+}
+
+# dev
+location ~ ^/dev/ {
+    #rewrite  ^/mc/(.*)$  /$1  break;
+    proxy_pass http://127.0.0.1:9003;
+    proxy_set_header Host $host:$server_port;
+    proxy_set_header X-Real-IP $remote_addr;
+    proxy_set_header Remote_Addr $remote_addr;
+    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
+    proxy_set_header X-Forwarded-Proto $scheme;
+    proxy_set_header Referer $http_referer;
+    client_max_body_size 100m;
+    client_body_buffer_size 20480k;
+    proxy_send_timeout 300s;
+    proxy_read_timeout 300s;
+}

+ 63 - 0
mjava/target/test-classes/nginx/nginx.conf

@@ -0,0 +1,63 @@
+user nginx;
+worker_processes auto;
+pid /run/nginx.pid;
+
+events {
+	worker_connections 1024;
+	#multi_accept on;
+}
+
+http {
+
+    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
+                      '$status $body_bytes_sent "$http_referer" '
+                      '"$http_user_agent" "$http_x_forwarded_for"';
+	##
+	# Basic Settings
+	##
+
+	sendfile            on;
+	tcp_nopush          on;
+	types_hash_max_size 2048;
+	server_tokens       off;
+
+    #autoindex on;
+	#server_names_hash_bucket_size 64;
+	#server_name_in_redirect off;
+
+	include         mime.types;
+	default_type    application/octet-stream;
+
+	##
+	# SSL Settings
+	##
+
+	ssl_protocols               TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
+	ssl_prefer_server_ciphers   on;
+
+	##
+	# Logging Settings
+	##
+
+	access_log  /var/log/nginx/access.log main;
+	error_log   /var/log/nginx/error.log;
+
+	##
+	# Gzip Settings
+	##
+
+	gzip on;
+
+	#gzip_vary on;
+	#gzip_proxied any;
+	#gzip_comp_level 6;
+	#gzip_buffers 16 8k;
+	#gzip_http_version 1.1;
+	#gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
+
+	##
+	# Virtual Host Configs
+	##
+
+	include servers/*.conf;
+}

+ 37 - 0
mjava/target/test-classes/nginx/proxy.conf

@@ -0,0 +1,37 @@
+# ----------------------------------------------------------------------------------------------
+
+# mc.100ali.com
+server {
+    listen          80;
+    server_name     mc.100ali.com;
+
+    # 直接重写, http post请求会报405
+    #rewrite ^(.*)$  https://$host$1 permanent;
+
+    # 307临时重定向到https, 若返回了307重新请求
+    return 307 https://$host$request_uri;
+
+    # 公用location, http\https都可访问
+    #include servers/mc.100ali.com;
+}
+
+server {
+    listen       	            443 ssl;
+    server_name  	            mc.100ali.com;
+    #access_log 	 	        /var/log/nginx/mc.100ali.com.log;
+    # 阿里云免费证书
+    ssl_certificate  	        servers/certs/mc.100ali.com.pem;
+    ssl_certificate_key         servers/certs/mc.100ali.com.key;
+    # 腾讯云免费证书
+    #ssl_certificate             services/certs/mc.100ali.com_bundle.crt;
+    #ssl_certificate_key         services/certs/mc.100ali.com.key;
+    ssl_session_timeout  	    5m;
+    ssl_protocols               TLSv1 TLSv1.1 TLSv1.2;
+    ssl_ciphers 	  	        ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
+    ssl_prefer_server_ciphers   on;
+    charset                     utf-8;
+
+    include servers/location;
+}
+
+# ----------------------------------------------------------------------------------------------

+ 37 - 0
mjava/target/test-classes/nginx/remak.md

@@ -0,0 +1,37 @@
+## 内网穿透
+
+### nginx
+
+需要开443/80端口
+
+### ding
+
+稳定,但https不可用,可能是自定义域名的原因。公网可访问
+
+1. 下载cli `npm install dingtalk-design-cli@latest -g`
+2. 检查版本 `ding -v`
+3. 启动 `ding ngrok --subdomain mc --port 39991`
+4. 代理地址 `http://mc.vaiwan.cn`
+
+### ngrok
+
+不稳定,但https可用,随机域名到国外服务器。自定义域名太麻烦
+
+1. 进入目录 `cd server/_Tool/ngrok`
+2. 启动服务 `./ngrok http localhost:39991`
+
+直接启动 `server:/Users/malk/server/_Tool/ngrok/ngrok  http localhost:39991`
+
+### nginx
+
+被本地代理,配置https,修改host访问。只能本地访问有效
+
+以 `mc.100ali.com` 为例
+
+1. Mac配置Host域名映射
+
+    - 编辑:`sudo vim /etc/hosts`
+    - 添加:`127.0.0.1       mc.100ali.com`
+
+2. 配置本地nginx和ssl证书,配置文件详见 `java-mcli`:路径 `mjava/test/resources/nginx/*`
+

+ 95 - 0
mjava/target/test-classes/readme.md

@@ -0,0 +1,95 @@
+## 项目
+
+[mjava](https://mc.100ali.com/) 标准化后端接口, 自用脚手架封装, mc 之 java-mcli 系列 代号 mjava
+
+### 运行
+
+1. *若是首次拉取项目
+    - 先执行主项目 java-mcli install, 获取 mjava 包依赖, 且在关联 maven 内生成项目结构: 否则子项目可运行但打包报错
+    - maven 内可删除其他子项目, 保留 java-mcli 与 mjava 目录即可. 注意 mjava pom 需要配置为基础包, 否则关联子项目打包报错
+
+2. QueryDSL: 尽量不使用 package, 会生产 jar 文件
+    - 说明: 项目在 compile 会执行 apt-maven-plugin 插件, 将 @Entity 注解类, 添加 Q 前缀, 存放到 target 下 generated-source 目录
+    - 使用: 若项目使用了 DSL, 先执行 mjava compile, 获取 BaseDTO 转 QBaseDTO. 再执行当前项目 compile, 获取 Q... 类型安全的实体查询类
+    - *实体若不直接在 com.malk 下, 可声明继承id, 避免编辑器提示 [不加也不影响编译以及运行]. 若是执行 package, 会先执行 compile
+
+3. *启动文件 Boot
+    - JPA 已配置扫描基础路径, 涉及子项目也能注册到, 避免启动报错
+    - 子项目 Boot 配置 @SpringBootApplication(scanBasePackages = {"com.malk"}), 扫描公共模块
+
+4. 静态资源映射
+    - 静态资源读取是 target 内容, 无需使用 package, 使用 compile 即可, 不会生产 jar 文件
+    - mjava 已配置映射路径, 优先读取子项目对应路径内容, 若不存在则会读取 mjava.jar 路径内容, 未匹配则会 404
+
+5. *环境变量: [包含其它文件]
+    - 若子项目没有指定, mjava 内存在的文件, 则会加载 mjava 环境文件
+    - 若子项目存在同名文件, 则会全量覆盖, 以子项目为准. 仅需配置对应环境即可
+
+6. 代理配置
+    - 内网穿透详见, `remark.md`
+    - nginx 配置可参考 `nginx` 文件夹
+
+7. pom 特别说明
+    - 目前配置全部子项目均可独立运行, 需要两个注意事项
+    - 第一: mjava 发布作为基础包提供, 注释 pom 内 executions 再执行 install 到本地 maven. 若开启即可作为独立 jar 运行
+    - 第二: 若关联 mjava 需要有与之相同的依赖, 否则调试可运行, 打包报错. 为了避免重复添加, 将 mjava 依赖直接添加到主项目 pom 上
+    - 项目被依赖 mjava 是通过 jar, 修改后执行 install 后关联项目才能获取到更新 [保留 mjava 是为了开发效率, 请勿随意修改]
+
+8. 关于mjs
+    - 本地 js-mcli: http://127.0.0.1:7001/dist/mjs.js
+    - 本地 java-mcli: http://localhost:39991/dev/mjs/mjs.js
+    - 本地 nginx: https://mc.100ali.com/dev/mjs/mjs.min.js
+    - 服务 mjava: https://mc.zitoo.com.cn/api/mjs/mjs.min.js
+    - 特别说明: 先读取当前子项目的配置, 若依赖 mjava, 当前子项目没有该文件会继续读取 mjava 配置
+
+### 功能
+
+快速开发底座, 集成三方平台标准化接口和曹操作逻辑 目前对接的三方平台有: 钉钉, 宜搭, 用友u8\yonsuite, 飞书平台
+
+### 技术
+
+1. 并发和异步实现 `@Async`
+2. 函数式编程 `Lambda`
+3. 入参校验配置 `@Validated` 注解
+4. 统一错误拦截 `CatchException` 类, 通用返回和报错格式
+5. 数据库操作 `jpa`, `QueryDSL` 工具
+6. JSON数据操作 `fastjson` 阿里巴巴
+7. 工具集: `commons-lang3`, `hutool-all`
+8. 基于 `winsw`, 在 `windows` 服务器部署能力
+9. 通用网络请求 `UtilHttp`, 上传下载, post和get请求
+10. 标准导入导出, 导入基于 `EastExcel`, 做了 `Lambda` 封装. 导出可用基于 `EasyExcel` 或 `POI`
+11. 三方接口, 统一的Toke过期时间管理, 避免限流和无效token
+12. 通用日志, 环境变量配置, 实现主子项目解耦. 当前每一个子项目对应一个客户, 子项目 `mjava` 也可独立部署, 提供平台通用接口服务
+13.
+
+### 配置
+
+1. 通用路径
+    - 日志路径: /Users/malk/server/_Tool/var/项目名称/log
+    - 文件路径: Users/malk/server/_Tool/var/项目名称/tmp
+
+2. 超时
+    - nginx:如pass_proxy 配置超时5分钟
+    - web:设置超时5分钟
+    - server:设置超时5分钟 `timeOut`
+    - server: 异步线程批量等待超时为10分钟 `timeAwait`
+
+<br />
+
+> 20220529 malk
+
+<br />
+
+
+next maven 私服
+
+1. 暂未配置 deploy
+2. [todo: 本地jar, 需要单独引入, 待优化]
+
+3. 福氏nginx直接监听端口, 实现https
+4. 当前子项目都依赖Tomcat, 导致jar过大, 是不是考虑弄一个通用docker
+
+> 20221029
+
+1. 新增jsp
+2. 新增swagger

+ 6 - 0
mjava/target/test-classes/search.sh

@@ -0,0 +1,6 @@
+#!/bin/bash
+
+cd /home/mc/mjava/logs
+tail -n 20 error.log | grep --color -3 $1
+
+#./search.sh test

+ 37 - 0
mjava/target/test-classes/server.sh

@@ -0,0 +1,37 @@
+#!/bin/bash
+
+appname='mjava'
+
+if [ "$1" == "dev" ]; then
+  java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=dev
+else
+  if [ "$1" == "start" ]; then
+    nohup java -Xms256m -Xmx256m -jar $appname.jar &
+    echo "server prod is starting"
+  else
+    if [ "$1" == "test" ]; then
+      nohup java -Xms256m -Xmx256m -jar $appname.jar --spring.profiles.active=test &
+      echo "server test is starting"
+    else
+      if [ "$1" == "stop" ]; then
+        PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+        if [ -z "$PID" ]; then
+          echo "server is already stopped"
+        else
+          echo kill $PID
+          kill $PID
+        fi
+      else
+        if [ "$1" == "status" ]; then
+          PID=$(ps -ef | grep $appname.jar | grep -v grep | awk '{ print $2 }')
+          if [ -z "$PID" ]; then
+            echo "server is stopped"
+          else
+            echo "server is running"
+            echo $PID
+          fi
+        fi
+      fi
+    fi
+  fi
+fi

+ 56 - 0
mjava/target/test-classes/winsw.xml

@@ -0,0 +1,56 @@
+<!--
+  MIT License
+
+  Copyright (c) 2008-2020 Kohsuke Kawaguchi, Sun Microsystems, Inc., CloudBees,
+  Inc., Oleg Nenashev and other contributors
+
+  Permission is hereby granted, free of charge, to any person obtaining a copy
+  of this software and associated documentation files (the "Software"), to deal
+  in the Software without restriction, including without limitation the rights
+  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+  copies of the Software, and to permit persons to whom the Software is
+  furnished to do so, subject to the following conditions:
+
+  The above copyright notice and this permission notice shall be included in all
+  copies or substantial portions of the Software.
+
+  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+  SOFTWARE.
+-->
+
+<!--
+ This is an example of a minimal Windows Service Wrapper configuration, which includes only mandatory options.
+ 
+ This configuration file should be placed near the WinSW executable, the name should be the same.
+ E.g. for myapp.exe the configuration file name should be myapp.xml
+ 
+ You can find more information about the configuration options here: https://github.com/kohsuke/winsw/blob/master/doc/xmlConfigFile.md
+ Full example: https://github.com/kohsuke/winsw/blob/master/examples/sample-allOptions.xml
+-->
+
+<service>
+    <!-- 注册服务ID -->
+    <id>mjava</id>
+    <!-- 启动服务名称 -->
+    <name>mjava</name>
+    <!-- 对服务的描述 -->
+    <description>标准化后端接口, 自用脚手架封装</description>
+    <!-- 「jdk需要安装」启动的可执行文件:若未配置环境变量executable需要执行绝对路径 -->
+    <!-- <executable>java</executable> -->
+    <executable>C:\Program Files\DingTalkServer\jdk1.8.0_221\bin\java</executable>
+    <!-- Xmx256m 代表堆内存最大值为256MB -jar后面的是项目名 [-Dfile.encoding=UTF-8 Windows会乱码, 但Mac上VSCode正常] -->
+    <arguments>-Xms256m -Xmx256m -jar mjava.jar</arguments>
+    <!-- <arguments>-Xms256m -Xmx256m -Dfile.encoding=UTF-8 -jar mjava.jar</arguments> -->
+    <!-- 服务的启动模式:默认Automatic -->
+    <startmode>Automatic</startmode>
+    <!-- 日志地址 -->
+    <logpath>%BASE%\ws</logpath>
+    <!-- 日志模式 -->
+    <logmode>rotate</logmode>
+</service>
+