MrShi
2026-01-29 8676f4cb37ef31fa9fcfe2a7faf5f4c4ea77cc1a
Merge branch 'master' of http://139.186.142.91:10010/r/productDev/zbom_dianjiang
已添加21个文件
已复制2个文件
已删除22个文件
已修改47个文件
已重命名1个文件
4901 ■■■■■ 文件已修改
.idea/compiler.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/jarRepositories.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/.env.development 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/admin/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
admin/admin/index.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package-lock.json 169 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/package.json 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/public/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
admin/public/index.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/public/template/casees.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
admin/public/template/member.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/category.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/importRecord.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/interfaceLog.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/member.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCategoryWindow.vue 75 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaInterfaceLogWindow.vue 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaMemberImportWindow.vue 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/Menu.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/UploadAvatarImage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/UploadImage.vue 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/category.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/categoryBusType.vue 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/categoryCar.vue 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/categoryFee.vue 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/categoryField.vue 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/categoryLevel.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/categoryOld.vue 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/identityInfo.vue 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/interfaceLog.vue 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/member.vue 232 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/memberRevenue.vue 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/index.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/login.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/CategoryController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/ImportRecordController.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/MemberController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/lib/zos-sdk.jar 补丁 | 查看 | 原始文档 | blame | 历史
server/services/pom.xml 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/api/common/PublicCloudController.java 249 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/api/common/PublicController.java 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/annotation/LoginRequired.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/annotation/excel/ExcelPictureUtil.java 309 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/constants/Constants.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/QywxConstant.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/QywxUtil.java 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxBaseRequest.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxSendMsgRequest.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxTextCardMsgRequest.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseResponse.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseSingleResponse.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxDepartInfoResponse.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxSendMsgResponse.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUploadMediaResponse.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrInfoResponse.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrValResponse.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserExtAttrResponse.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserInfoResponse.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserListResponse.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/utils/tyyun/TyyZosUtil.java 185 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/InterfaceLogMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/dto/CasesImport.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/dto/LoginRequestNewParam.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/dto/MemberImport.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/dto/RoleRequestParam.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Category.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/ImportRecord.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/InterfaceLog.java 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Member.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/model/Multifile.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/vo/WebLoginUserVO.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/ImportRecordService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/InterfaceLogService.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/MemberService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/ImportRecordServiceImpl.java 135 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 218 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-dev.yml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-pro.yml 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/resources/application-test.yml 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/DJWebApplication.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/ApiController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/LoginController.java 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/resources/application.yml 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/compiler.xml
@@ -2,6 +2,7 @@
<project version="4">
  <component name="CompilerConfiguration">
    <annotationProcessing>
      <profile default="true" name="Default" enabled="true" />
      <profile name="Maven default annotation processors profile" enabled="true">
        <sourceOutputDir name="target/generated-sources/annotations" />
        <sourceTestOutputDir name="target/generated-test-sources/test-annotations" />
.idea/jarRepositories.xml
@@ -7,6 +7,11 @@
      <option name="url" value="https://repo.maven.apache.org/maven2" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="nexus" />
      <option name="name" value="Nexus" />
      <option name="url" value="http://47.97.118.181:8089/nexus/content/groups/public/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="central" />
      <option name="name" value="Maven Central repository" />
      <option name="url" value="https://repo1.maven.org/maven2" />
@@ -16,5 +21,10 @@
      <option name="name" value="JBoss Community repository" />
      <option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
    </remote-repository>
    <remote-repository>
      <option name="id" value="central" />
      <option name="name" value="Central Repository" />
      <option name="url" value="http://47.97.118.181:8089/nexus/content/groups/public/" />
    </remote-repository>
  </component>
</project>
admin/.env.development
@@ -1,4 +1,3 @@
# å¼€å‘环境配置
NODE_ENV = 'development'
#VUE_APP_API_URL  = 'http://192.168.1.54:10010'
VUE_APP_API_URL = 'https://jinkuai.832smartfarm.com/jinkuai_admin'
VUE_APP_API_URL = 'http://localhost:10010'
admin/admin/favicon.ico

admin/admin/index.html
@@ -1 +1 @@
<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>近快后台管理系统</title><link href="static/css/app.daf6fc74.css" rel="preload" as="style"><link href="static/css/chunk-vendors.d9e68312.css" rel="preload" as="style"><link href="static/js/app.83e26f0e.js" rel="preload" as="script"><link href="static/js/chunk-vendors.2417847b.js" rel="preload" as="script"><link href="static/css/chunk-vendors.d9e68312.css" rel="stylesheet"><link href="static/css/app.daf6fc74.css" rel="stylesheet"></head><body><div id="app"></div><script src="static/js/chunk-vendors.2417847b.js"></script><script src="static/js/app.83e26f0e.js"></script></body></html>
<!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="favicon.ico"><title>志邦点将后台管理系统</title><link href="static/css/app.daf6fc74.css" rel="preload" as="style"><link href="static/css/chunk-vendors.d9e68312.css" rel="preload" as="style"><link href="static/js/app.83e26f0e.js" rel="preload" as="script"><link href="static/js/chunk-vendors.2417847b.js" rel="preload" as="script"><link href="static/css/chunk-vendors.d9e68312.css" rel="stylesheet"><link href="static/css/app.daf6fc74.css" rel="stylesheet"></head><body><div id="app"></div><script src="static/js/chunk-vendors.2417847b.js"></script><script src="static/js/app.83e26f0e.js"></script></body></html>
admin/package-lock.json
@@ -1871,63 +1871,6 @@
          "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
          "dev": true
        },
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "ssri": {
          "version": "8.0.1",
          "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1617826515595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@@ -1935,28 +1878,6 @@
          "dev": true,
          "requires": {
            "minipass": "^3.1.1"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        },
        "vue-loader-v16": {
          "version": "npm:vue-loader@16.8.3",
          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
          "dev": true,
          "optional": true,
          "requires": {
            "chalk": "^4.1.0",
            "hash-sum": "^2.0.0",
            "loader-utils": "^2.0.0"
          }
        }
      }
@@ -13675,6 +13596,15 @@
      "integrity": "sha1-UylVzB6yCKPZkLOp+acFdGV+CPI=",
      "dev": true
    },
    "vue-json-viewer": {
      "version": "2.2.22",
      "resolved": "https://registry.npmmirror.com/vue-json-viewer/-/vue-json-viewer-2.2.22.tgz",
      "integrity": "sha512-3oPH5BxoUWva/qp7wNJj+15FBXyi9Yu5VDW4mCWivjHR1pUpMv34fjqqxML7jh2uOqm1S/3Xks5nQ5JjC5+OWw==",
      "dev": true,
      "requires": {
        "clipboard": "^2.0.4"
      }
    },
    "vue-loader": {
      "version": "15.9.7",
      "resolved": "https://registry.nlark.com/vue-loader/download/vue-loader-15.9.7.tgz",
@@ -13696,6 +13626,87 @@
        }
      }
    },
    "vue-loader-v16": {
      "version": "npm:vue-loader@16.8.3",
      "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
      "dev": true,
      "optional": true,
      "requires": {
        "chalk": "^4.1.0",
        "hash-sum": "^2.0.0",
        "loader-utils": "^2.0.0"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        }
      }
    },
    "vue-router": {
      "version": "3.5.1",
      "resolved": "https://registry.nlark.com/vue-router/download/vue-router-3.5.1.tgz?cache=0&sync_timestamp=1620899536020&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz",
admin/package.json
@@ -37,19 +37,20 @@
    "@vue/cli-service": "~4.5.0",
    "@vue/eslint-config-standard": "^5.1.2",
    "babel-eslint": "^10.1.0",
    "crypto-js": "^4.2.0",
    "eslint": "^6.7.2",
    "eslint-plugin-import": "^2.20.2",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-promise": "^4.2.1",
    "eslint-plugin-standard": "^4.0.0",
    "eslint-plugin-vue": "^6.2.2",
    "jsencrypt": "^3.3.2",
    "lint-staged": "^9.5.0",
    "node-sass": "^4.12.0",
    "sass-loader": "^8.0.2",
    "vue-cli-plugin-element-ui": "~1.1.4",
    "vue-template-compiler": "^2.6.11",
    "crypto-js": "^4.2.0",
    "jsencrypt": "^3.3.2"
    "vue-json-viewer": "^2.2.22",
    "vue-template-compiler": "^2.6.11"
  },
  "eslintConfig": {
    "root": true,
admin/public/favicon.ico

admin/public/index.html
@@ -5,7 +5,7 @@
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width,initial-scale=1.0">
    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
    <title>近快后台管理系统</title>
    <title>志邦点将后台管理系统</title>
  </head>
  <body>
    <div id="app"></div>
admin/public/template/casees.xlsx
Binary files differ
admin/public/template/member.xlsx
Binary files differ
admin/src/api/business/category.js
@@ -6,6 +6,11 @@
    trim: true
  })
}
export function findAll (data) {
  return request.post('/business/category/list', data, {
    trim: true
  })
}
// åˆ›å»º
export function create (data) {
admin/src/api/business/importRecord.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/business/importRecord/page', data, {
    trim: true
  })
}
// åˆ›å»º
export function create (data) {
  return request.post('/business/importRecord/create', data)
}
export function updateStatus (data) {
  return request.post('/business/importRecord/updateStatus', data)
}
// å¯¼å‡ºExcel
export function exportExcel (data) {
  return request.post('/business/importRecord/exportExcel', data, {
    download: true
  })
}
export function importExcel (data) {
  return request.post('/business/importRecord/importExcel', data)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/business/importRecord/updateById', data)
}
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/business/importRecord/delete/${id}`)
}
export function getById (id) {
  return request.get(`/business/importRecord/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
  return request.get('/business/importRecord/delete/batch', {
    params: {
      ids
    }
  })
}
admin/src/api/business/interfaceLog.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/business/interfaceLog/page', data, {
    trim: true
  })
}
// åˆ›å»º
export function create (data) {
  return request.post('/business/interfaceLog/create', data)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/business/interfaceLog/updateById', data)
}
admin/src/api/business/member.js
@@ -21,6 +21,9 @@
    download: true
  })
}
export function importExcel (data) {
  return request.post('/business/member/importExcel', data)
}
// ä¿®æ”¹
export function updateById (data) {
admin/src/assets/logo.png

admin/src/components/business/OperaCategoryWindow.vue
@@ -7,45 +7,34 @@
  >
    <el-form :model="form" ref="form" :rules="rules">
      <el-form-item label="名称" prop="name">
        <el-input v-if="form.type !=3"  v-model="form.name" placeholder="请输入名称" v-trim/>
        <el-select v-else  v-model="form.name" placeholder="请选择订单类型" v-trim>
          <el-option :value="'0'" label="用工单"></el-option>
          <el-option :value="'1'" label="货运单"></el-option>
          <el-option :value="'2'" label="订餐单"></el-option>
        </el-select>
        <el-input   v-model="form.name" placeholder="请输入名称" v-trim/>
      </el-form-item>
      <el-form-item v-if="form.type ==3 " label="手续费(%)" prop="detail">
        <el-input  type="number"   v-model="form.detail" placeholder="请输入名称" v-trim/>
      <el-form-item label="战区编码" prop="detail"  v-if="form.type ==0" >
        <el-input v-model="form.detail" placeholder="请输入战区编码" v-trim/>
      </el-form-item>
      <el-form-item v-if="form.type == 1 || form.type == 2" :label=" form.type == 1?'车辆规格':'餐标配置(元)'" prop="detailList">
        <div style="display: flex;flex-direction: column">
          <div style="position: relative;display: block;width: 100%;" v-for="(item,index) in form.detailList"   >
            <el-input  :type="form.type == 1?'text':'number'" style="display:inline-block;width: 60%;margin:5px ;float: left" v-model="form.detailList[index]"   placeholder="请输入内容" v-trim/>
            <el-button  style="display:inline-block;margin : 5px " @click="del(index)" v-if="form.detailList.length>0">x</el-button>
          </div>
          <div style="position: relative;display: block;width: 100%;">
            <el-button style="width: 100px;margin: 5px;" type="primary" @click="add()">添加规格</el-button>
          </div>
        </div>
      </el-form-item>
      <el-form-item v-if="form.type == 1" label="图标" prop="icon">
      <el-form-item v-if="form.type == 3" label="图标" prop="icon">
        <UploadAvatarImage
            :file="{ imgurlfull: form.iconFull, imgurl: form.icon }"
            :uploadData="uploadData"
            @uploadSuccess="uploadAvatarSuccess"
        />
      </el-form-item>
      <el-form-item  v-if="form.id ==null && form.type == 1"  label="是否固定车辆" prop="isFixed">
        <el-radio-group v-model="form.isFixed">
          <el-radio :label="0">非固定</el-radio>
          <el-radio :label="1">固定车型</el-radio>
        </el-radio-group>
      <el-form-item v-if="form.type == 1" label="排行榜图集" prop="icon">
        <UploadImage
            :fileList="tempfileList"
            :uploadData="uploadData"
            @beginUpload="isUploading=true"
            @endUpload="isUploading=false"/>
        <p class="tip-warn">
          å»ºè®®å°ºå¯¸ï¼š750px X 750px,上限6å¼ 
          æ”¯æŒpng、jpg、jpeg格式,大小不超过2M,上传图片不允许涉及政治敏感与色情,
        </p>
      </el-form-item>
      <el-form-item label="排序码" prop="sortnum">
        <el-input v-model="form.sortnum" placeholder="请输入排序码" v-trim/>
        <el-input v-model="form.sortnum" type="" placeholder="请输入排序码" v-trim/>
      </el-form-item>
      <el-form-item label="描述" prop="remark">
        <el-input v-model="form.remark" placeholder="请输入描述" v-trim/>
        <el-input type="textarea" v-model="form.remark" placeholder="请输入描述" v-trim/>
      </el-form-item>
    </el-form>
  </GlobalWindow>
@@ -54,16 +43,17 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadImage from '@/components/common/UploadImage'
import UploadAvatarImage from '@/components/common/UploadAvatarImage'
export default {
  name: 'OperaCategoryWindow',
  extends: BaseOpera,
  components: { GlobalWindow ,UploadAvatarImage},
  components: { GlobalWindow, UploadAvatarImage,UploadImage },
  data () {
    return {
      isUploading: false,
      uploadData: {
        folder: 'category'
        folder: 'dianjiang/category'
      },
      // è¡¨å•数据
      form: {
@@ -74,14 +64,15 @@
        type: null,
        detail: null,
        remark: null,
        detailList: [''],
        fileList: [],
        icon: '',
        iconFull: '',
        isFixed: 0
      },
      tempfileList: [],
      // éªŒè¯è§„则
      rules: {
        name: [{ required: true, message: '请输入配置名称' }]
        name: [{ required: true, message: '请输入名称' }]
      }
    }
  },
@@ -105,9 +96,18 @@
      this.$set(this.form, 'icon', file.imgurl)
      this.$set(this.form, 'iconFull', file.imgurlfull)
    },
    confirm () {
      this.form.fileList = this.tempfileList
      if (this.form[this.configData['field.id']] == null || this.form[this.configData['field.id']] === '') {
        this.__confirmCreate()
        return
      }
      this.__confirmEdit()
    },
    open(title, target, type) {
      this.title = title
      this.visible = true
      this.tempfileList = []
      this.form = {
        id: null,
        status: 0,
@@ -116,7 +116,7 @@
        detail: null,
        type: type,
        remark: null,
        detailList: [''],
        fileList: [],
        icon: '',
        iconFull: '',
        isFixed: 0
@@ -135,9 +135,14 @@
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        if(this.form.detailList==null){
          this.form.detailList = ['']
        }
        this.form.fileList = this.form.fileList||[]
        this.form.fileList.forEach(item=>{
          this.tempfileList.push({
            fileurl: item.fileurl,
            name: item.name,
            url: item.url
          })
        })
      })
    }
  }
admin/src/components/business/OperaInterfaceLogWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,102 @@
<template>
    <el-dialog
        :title="title"
        width="60%"
        :withFooter="false"
        :visible.sync="visible"
        :confirm-working="isWorking"
        append-to-body
        @confirm="confirm"
    >
      <div class="codeEditBox">
        <json-viewer
            :value="form.formatContent"
            :expand-depth="5"
            copyable
            boxed
            :expanded="false"
            @copied="copyText"
            sort
            :show-array-index="false"
            class="w-100%">
          <template slot="copy">
            <i class="el-icon-document-copy" title="复制">复制代码</i>
          </template>
        </json-viewer>
      </div>
    </el-dialog>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import JsonViewer from 'vue-json-viewer'
export default {
  name: 'OperaInterfaceLogWindow',
  extends: BaseOpera,
  components: { JsonViewer },
  data () {
    return {
      // è¡¨å•数据
      form: {
        content: '',
        formatContent: {}
      },
      // éªŒè¯è§„则
      rules: {
      },
      copyable: { copyText: 'copy', copiedText: 'copied' }
    }
  },
  created () {
    this.config({
      api: '/business/interfaceLog',
      'field.id': 'id'
    })
  },
  methods: {
    copyText (val) {
      this.$message.success('内容已成功复制到剪切板!')
    },
    open (title, target) {
      this.title = title
      this.visible = true
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form[this.configData['field.id']] = null
        })
        return
      }
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        try {
          this.form.formatContent = JSON.parse(this.form.content)
        } catch (e) {
          this.form.formatContent = this.form.content
        }
      })
    }
  }
}
</script>
<style lang="scss" scoped>
    .codeEditBox {
      width: 100%;
      height: 90%;
      overflow:auto;
      display: block;
      border: 1px solid #dcdee2;
      overflow-y: auto;
    }
    ::v-deep .el-dialog__body{height:70vh;overflow-y: auto}
    ::v-deep .el-dialog{height:78vh;overflow: hidden}
    .jv-container {
      //height: 60vh;
    }
</style>
admin/src/components/business/OperaMemberImportWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
<template>
  <el-dialog
      class="center-title"
      :title="title"
      width="500px"
      top="30vh"
      :visible.sync="visible"
      :confirm-working="isWorking"
      @confirm="confirm"
  >
    <p class="tip-warn"><i class="el-icon-warning"></i>导入说明:<br>
      1.请先下载文件模板,并按照模板要去填写表格内容;<br>
    </p>
    <el-form class="demo-form-inline" >
      <el-form-item label="老师名单" required>
        <div style="width: 100%;display: flex;align-items: center;">
          <el-button type="primary" :loading="importing"   @click="clickRef">点击上传</el-button>
          <el-button type="text" @click="exportTemplate">点击下载模版.EXCEL</el-button>
        </div>
        <div style="font-size: 14px; color: black;" v-if="fileName">{{fileName}}</div>
      </el-form-item>
    </el-form>
    <input type="file" style="position: fixed; left: 0; top: -50px;" accept=".xlsx" ref="fileExcel" @change="result" />
    <template   v-slot:footer>
      <el-button @click="visible=false">返回</el-button>
    </template>
  </el-dialog>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { importExcel } from '@/api/business/importRecord'
export default {
  name: 'OperaMemberImportWindow',
  extends: BaseOpera,
  // eslint-disable-next-line vue/no-unused-components
  components: { GlobalWindow },
  data () {
    return {
      importing: false,
      fileName: '',
      type: 0
    }
  },
  methods: {
    open (title) {
      this.title = title
      this.fileName = ''
      this.visible = true
      this.type = 0
    },
    // å¯¼å‡ºæ¨¡æ¿
    exportTemplate () {
      // æŠ•保申请
      window.open('/template/member.xlsx')
    },
    clickRef () {
      this.$refs.fileExcel.click()
    },
    result (e) {
      this.importing=true
      const data = new FormData()
      data.append('file', e.target.files[0])
      data.append('type', this.type)
      importExcel(data)
        .then(res => {
          this.$message.success('名单已上传成功,可前往【导入记录】菜单查看任务执行进度。')
          this.$emit('success')
          this.visible = false
        })
        .catch(err => {
          this.fileName = ''
        })
        .finally(() => {
          this.$refs.fileExcel.value = null
          this.importing=false
        })
    }
  }
}
</script>
<style lang="scss" scoped>
</style>
admin/src/components/common/Menu.vue
@@ -2,7 +2,7 @@
  <div class="menu" :class="{collapse: menuData.collapse}">
    <div class="logo">
      <div><img src="@/assets/logo.png"></div>
      <h1 :class="{hidden: menuData.collapse}">近快后台管理系统</h1>
      <h1 :class="{hidden: menuData.collapse}">志邦点将后台管理系统</h1>
    </div>
    <scrollbar>
      <el-menu
admin/src/components/common/UploadAvatarImage.vue
@@ -31,7 +31,7 @@
  data() {
    return {
      loading: null,
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/web/public/upload'
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/upload'
    }
  },
admin/src/components/common/UploadImage.vue
@@ -8,30 +8,11 @@
      accept=".jpg,.png"
      :before-upload="beforeUpload"
      :on-success="uploadSuccess"
      :on-preview="handlePreview"
      :on-remove="handleRemove"
      :on-error="fail"
    >
      <i class="el-icon-plus icon"></i>
      <div slot="file" slot-scope="{file}">
        <img
          class="el-upload-list__item-thumbnail"
          :src="file.url" alt=""
          style="width: 100px;height: 100px;"
        >
        <span class="el-upload-list__item-actions">
          <span
            class="el-upload-list__item-preview"
            @click="handlePictureCardPreview(file)"
          >
            <i class="el-icon-zoom-in"></i>
          </span>
          <span
            class="el-upload-list__item-delete"
            @click="handleRemove(file)"
          >
            <i class="el-icon-delete"></i>
          </span>
        </span>
      </div>
    </el-upload>
    <el-image-viewer
      v-if="showViewer"
@@ -55,79 +36,77 @@
      type: Array,
      default: () => []
    },
    uploadData: Object,
    maxNum: {
      type: Number,
      default: () => null
    },
    uploadData: Object
  },
  data() {
    return {
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/web/public/uploadLocal',
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/upload',
      realList: [],
      srcList: [],
      // srcList: [],
      tempIndex: 0,
      showViewer: false,
      showViewer: false
    }
  },
  computed:{
    srcList(){
      return this.fileList.map(item => { return item.url })
    }
  },
  watch: {
    fileList: {
      handler(val) {
        console.log(val);
        if (val.length==0) {
          this.realList = []
          this.srcList = []
        }
      }
    }
  },
  methods: {
    handlePreview(file) {
      // console.log('预览文件:', file,this.fileList);
      this.tempIndex = this.srcList.findIndex(item => item == file.url)
      this.showViewer = true
    },
    beforeUpload(file) {
      this.$emit('beginUpload')
      const isJPGOrPNG = file.type === 'image/jpeg' || file.type === 'image/png'
      const isLt2M = file.size / 1024 / 1024 < 1; // 500kb
      if (!isJPGOrPNG) {
        this.$message.error('上传头像图片只能是 JPG/PNG æ ¼å¼!');
        return false
      }
      if (!isLt2M) {
        this.$message.error('上传头像图片大小不能超过 500KB!');
        return false
      }
      return true
    },
     // ä¸Šä¼ å›¾ç‰‡æˆåŠŸ
     uploadSuccess (res, file, fileList) {
      // console.log('this.fileList', this.fileList);
      // console.log('fileList', fileList);
      this.$emit('uploadEnd')
      this.realList = fileList
      this.srcList.push(res.data.url)
      // console.log('file', file);
      this.$emit('endUpload')
      console.log('上传成功1:',fileList);
      if (res.code === 200) {
        this.fileList.push(
          {
        this.fileList.push({
            fileurl: res.data.imgaddr,
            name: res.data.originname,
            url: res.data.url
          }
        )
        })
        console.log('上传成功2:', this.fileList);
      } else {
        this.$message.error(res.msg || '上传失败')
      }
    },
    fail (err, file, fileList) {
      this.$emit('uploadEnd')
      this.$emit('endUpload')
      this.$message.error('上传失败')
    },
    handlePictureCardPreview(file) {
      // this.tempIndex = this.srcList.findIndex(item => item == file.response.data.url )
      // console.log(file);
      this.tempIndex = this.fileList.findIndex(item => item.url == file.url )
      // console.log( this.tempIndex);
      this.srcList = this.fileList.map(item => item.url)
      this.showViewer = true
    },
    closeViewer() {
      this.showViewer = false
    },
    handleRemove(file) {
      console.log(this.fileList);
      let tempIndex = this.realList.findIndex(item => item.url === file.url)
      // debugger
      this.realList.splice(tempIndex, 1)
      const tempIndex = this.fileList.findIndex(item => item.url === file.url)
      if(tempIndex >= 0){
      this.fileList.splice(tempIndex, 1)
      this.srcList.splice(tempIndex, 1)
    }
  },
    }
  }
}
</script>
@@ -150,4 +129,3 @@
  height: 90px !important;
}
</style>
admin/src/views/business/category.vue
@@ -13,8 +13,9 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('新建品种配置',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">删除</el-button></li>
        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('新建战区',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">新建</el-button></li>
        <li><el-button type="primary" icon="el-icon-refresh" v-permissions="['business:category:create']">同步</el-button></li>
        <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">删除</el-button></li>
      </ul>
      <el-table
          :height="tableHeightNew"
@@ -24,7 +25,8 @@
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="name" label="单位名称" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="战区名称" min-width="100px"></el-table-column>
        <el-table-column prop="detail" label="战区编码" min-width="100px"></el-table-column>
        <el-table-column label="状态">
          <template slot-scope="{row}">
            <el-switch @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
@@ -42,8 +44,8 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaCategoryWindow.open('编辑新建品种配置', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">删除</el-button>
            <el-button type="text" @click="$refs.operaCategoryWindow.open('编辑战区', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">编辑</el-button>
            <el-button type="text" style="color: red" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
admin/src/views/business/categoryBusType.vue
copy from admin/src/views/business/categoryCb.vue copy to admin/src/views/business/categoryBusType.vue
Îļþ´Ó admin/src/views/business/categoryCb.vue ¸´ÖÆ
@@ -13,7 +13,7 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('新建餐标配置',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">新建</el-button></li>
        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('新建商业化类型',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">删除</el-button></li>
      </ul>
      <el-table
@@ -24,17 +24,19 @@
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" :selectable="isChangeSelected" width="55"></el-table-column>
        <el-table-column prop="name" label="用餐时间" min-width="100px"></el-table-column>
        <el-table-column  prop="detail" label="餐标" min-width="200px">
        <el-table-column prop="name" label="名称" min-width="100px"></el-table-column>
        <el-table-column  prop="icon" label="排行榜图集" min-width="220px">
          <template slot-scope="{row}">
              <div v-if="row.detailList && row.detailList.length">
                <span v-for="(item,index) in row.detailList">
                  {{item || 0}}元
                  <span v-if="index < row.detailList.length-1" style="margin: 5px">|</span>
                </span>
            <div style="display: flex; flex-wrap: wrap;width: 200px;"  v-if="row.fileList && row.fileList.length">
              <div v-for="item in row.fileList" :key="row.id+'_img'+item.id" style=" box-sizing: border-box;  margin-right: 10px; " >
                <el-image  style="width: 50px; height: 50px;" :src="item.url"
                          :preview-src-list="[item.url]">
                </el-image>
              </div>
              </div>
          </template>
        </el-table-column>
        <el-table-column label="状态">
          <template slot-scope="{row}">
            <el-switch :disabled="row.isFixed ==1" @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
@@ -42,6 +44,7 @@
            </el-switch>
          </template>
        </el-table-column>
        <el-table-column prop="remark" label="描述" min-width="100px"></el-table-column>
        <el-table-column prop="sortnum" label="排序码" min-width="100px"></el-table-column>
        <el-table-column prop="updateUserName" label="操作人" min-width="100px"></el-table-column>
        <el-table-column prop="updateTime" label="最近操作时间" min-width="150px"></el-table-column>
@@ -52,7 +55,7 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text"   @click="$refs.operaCategoryWindow.open('编辑餐标配置', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">编辑</el-button>
            <el-button type="text"   @click="$refs.operaCategoryWindow.open('编辑商业化类型', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">编辑</el-button>
            <el-button type="text"   @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">删除</el-button>
          </template>
        </el-table-column>
@@ -83,7 +86,7 @@
      // æœç´¢
      searchForm: {
        name: '',
        type: 2
        type: 1
      }
    }
  },
admin/src/views/business/categoryCar.vue
ÎļþÒÑɾ³ý
admin/src/views/business/categoryFee.vue
ÎļþÒÑɾ³ý
admin/src/views/business/categoryField.vue
copy from admin/src/views/business/categoryCb.vue copy to admin/src/views/business/categoryField.vue
Îļþ´Ó admin/src/views/business/categoryCb.vue ¸´ÖÆ
@@ -13,7 +13,7 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('新建餐标配置',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">新建</el-button></li>
        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('新建擅长领域',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">删除</el-button></li>
      </ul>
      <el-table
@@ -24,17 +24,7 @@
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" :selectable="isChangeSelected" width="55"></el-table-column>
        <el-table-column prop="name" label="用餐时间" min-width="100px"></el-table-column>
        <el-table-column  prop="detail" label="餐标" min-width="200px">
          <template slot-scope="{row}">
              <div v-if="row.detailList && row.detailList.length">
                <span v-for="(item,index) in row.detailList">
                  {{item || 0}}元
                  <span v-if="index < row.detailList.length-1" style="margin: 5px">|</span>
                </span>
              </div>
          </template>
        </el-table-column>
        <el-table-column prop="name" label="名称" min-width="100px"></el-table-column>
        <el-table-column label="状态">
          <template slot-scope="{row}">
            <el-switch :disabled="row.isFixed ==1" @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
@@ -42,6 +32,7 @@
            </el-switch>
          </template>
        </el-table-column>
        <el-table-column prop="remark" label="描述" min-width="100px"></el-table-column>
        <el-table-column prop="sortnum" label="排序码" min-width="100px"></el-table-column>
        <el-table-column prop="updateUserName" label="操作人" min-width="100px"></el-table-column>
        <el-table-column prop="updateTime" label="最近操作时间" min-width="150px"></el-table-column>
@@ -52,7 +43,7 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text"   @click="$refs.operaCategoryWindow.open('编辑餐标配置', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">编辑</el-button>
            <el-button type="text"   @click="$refs.operaCategoryWindow.open('编辑擅长领域', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">编辑</el-button>
            <el-button type="text"   @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">删除</el-button>
          </template>
        </el-table-column>
admin/src/views/business/categoryLevel.vue
ÎļþÃû´Ó admin/src/views/business/categoryCb.vue ÐÞ¸Ä
@@ -13,7 +13,7 @@
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:category:create', 'business:category:delete']">
        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('新建餐标配置',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">新建</el-button></li>
        <li><el-button type="primary" @click="$refs.operaCategoryWindow.open('新建老师等级',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:category:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:category:delete']">删除</el-button></li>
      </ul>
      <el-table
@@ -24,17 +24,15 @@
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" :selectable="isChangeSelected" width="55"></el-table-column>
        <el-table-column prop="name" label="用餐时间" min-width="100px"></el-table-column>
        <el-table-column  prop="detail" label="餐标" min-width="200px">
        <el-table-column prop="name" label="名称" min-width="100px"></el-table-column>
        <el-table-column  prop="icon" label="图标" min-width="100px">
          <template slot-scope="{row}">
              <div v-if="row.detailList && row.detailList.length">
                <span v-for="(item,index) in row.detailList">
                  {{item || 0}}元
                  <span v-if="index < row.detailList.length-1" style="margin: 5px">|</span>
                </span>
              </div>
            <el-image v-if="row.iconFull" style="width: 50px; height: 50px; margin-right: 10px" :src="row.iconFull"
                      :preview-src-list="[row.iconFull]">
            </el-image>
          </template>
        </el-table-column>
        <el-table-column label="状态">
          <template slot-scope="{row}">
            <el-switch :disabled="row.isFixed ==1" @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
@@ -42,6 +40,7 @@
            </el-switch>
          </template>
        </el-table-column>
        <el-table-column prop="remark" label="描述" min-width="100px"></el-table-column>
        <el-table-column prop="sortnum" label="排序码" min-width="100px"></el-table-column>
        <el-table-column prop="updateUserName" label="操作人" min-width="100px"></el-table-column>
        <el-table-column prop="updateTime" label="最近操作时间" min-width="150px"></el-table-column>
@@ -52,7 +51,7 @@
          fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text"   @click="$refs.operaCategoryWindow.open('编辑餐标配置', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">编辑</el-button>
            <el-button type="text"   @click="$refs.operaCategoryWindow.open('编辑老师等级', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:category:update']">编辑</el-button>
            <el-button type="text"   @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:category:delete']">删除</el-button>
          </template>
        </el-table-column>
@@ -83,7 +82,7 @@
      // æœç´¢
      searchForm: {
        name: '',
        type: 2
        type: 3
      }
    }
  },
admin/src/views/business/categoryOld.vue
ÎļþÒÑɾ³ý
admin/src/views/business/identityInfo.vue
ÎļþÒÑɾ³ý
admin/src/views/business/interfaceLog.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,148 @@
<template>
  <TableLayout :permissions="['business:interfacelog:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="接口名称" prop="name">
        <el-input v-model="searchForm.name" placeholder="请输入接口名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="类型" prop="type">
        <el-select v-model="searchForm.type" @change="search" placeholder="请选择">
          <el-option label="调用" value="0"></el-option>
          <el-option label="推送接受" value="1"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="起止时间" prop="startDate">
        <!-- <el-date-picker
                    @change="seleTime"
                    v-model="time"
                    type="datetimerange"
                    format="yyyy-MM-dd HH:mm:ss"
                    value-format="yyyy-MM-dd HH:mm:ss"
                    range-separator="至"
                    start-placeholder="开始时间"
                    end-placeholder="结束时间">
                </el-date-picker> -->
        <el-date-picker type="datetime" v-model="searchForm.startDate" value-format="yyyy-MM-dd HH:mm:ss"
          placeholder="请选择开始时间" @change="changeRadio" />
        <el-date-picker type="datetime" v-model="searchForm.endDate" value-format="yyyy-MM-dd HH:mm:ss"
          placeholder="请选择结束时间" @change="changeRadio" />
      </el-form-item>
      <el-radio-group v-model="searchForm.radio" size="small" @input="changeRadio">
        <el-radio-button label="0">当天</el-radio-button>
        <el-radio-button label="1">近7天</el-radio-button>
        <el-radio-button label="2">近30天</el-radio-button>
      </el-radio-group>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <el-table :height="tableHeightNew" v-loading="isWorking.search" :data="tableData.list" stripe>
        <el-table-column prop="name" label="接口名称" min-width="180px"></el-table-column>
        <el-table-column prop="url" label="地址信息" min-width="180px"></el-table-column>
        <el-table-column label="类型" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.type == 0">调用</span>
            <span v-if="row.type == 1">推送接收</span>
          </template>
        </el-table-column>
        <el-table-column label="平台" min-width="100px">
          <template slot-scope="{row}">
            <span v-if="row.plat == 0">海康安防平台</span>
            <span v-if="row.plat == 1">ERP系统</span>
          </template>
        </el-table-column>
        <el-table-column prop="request" label="请求参数" min-width="100px">
          <template slot-scope="{row}">
            <el-button type="text"
              @click="$refs.operaInterfaceLogWindow.open('请求参数', { content: row.request })">查看</el-button>
          </template>
        </el-table-column>
        <el-table-column prop="repose" label="响应参数" min-width="100px">
          <template slot-scope="{row}">
            <el-button type="text"
              @click="$refs.operaInterfaceLogWindow.open('响应参数', { content: row.repose })">查看</el-button>
          </template>
        </el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
      </el-table>
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
      </pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaInterfaceLogWindow ref="operaInterfaceLogWindow" @success="handlePageChange" />
  </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaInterfaceLogWindow from '@/components/business/OperaInterfaceLogWindow'
import { timeForMat } from '@/utils/util'
export default {
  name: 'InterfaceLog',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaInterfaceLogWindow },
  data() {
    return {
      // æœç´¢
      searchForm: {
        name: '',
        type: '',
        endDate: '',
        startDate: '',
        radio: '0'
      },
      time: []
    }
  },
  created() {
    this.config({
      module: '三方平台接口交互记录',
      api: '/business/interfaceLog',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.changeRadio('0')
  },
  methods: {
    changeRadio(e) {
      if (e === '0') {
        this.searchForm.startDate = timeForMat(0)[0]
        this.searchForm.endDate = timeForMat(0)[1]
      } else if (e === '1') {
        this.searchForm.startDate = timeForMat(6)[0]
        this.searchForm.endDate = timeForMat(6)[1]
      } else if (e === '2') {
        this.searchForm.startDate = timeForMat(29)[0]
        this.searchForm.endDate = timeForMat(29)[1]
      } else {
        this.searchForm.radio = ''
      }
      if (this.searchForm.startDate && this.searchForm.endDate && new Date(this.searchForm.startDate).getTime() > new Date(this.searchForm.endDate).getTime()) {
        this.$message.error('开始时间不能大于结束时间')
        this.searchForm.startDate = ''
        return
      }
      this.search()
    },
    seleTime(e) {
      this.searchForm.startDate = e[0]
      this.searchForm.endDate = e[1]
      this.searchForm.radio = null
      this.search()
    },
    reset() {
      this.$refs.searchForm.resetFields()
      this.searchForm.startDate = ''
      this.searchForm.endDate = ''
      this.searchForm.radio = ''
      this.time = []
      this.search()
    }
  }
}
</script>
admin/src/views/business/member.vue
@@ -2,42 +2,104 @@
  <TableLayout :permissions="['business:member:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="手机号" prop="telephone">
        <el-input v-model="searchForm.telephone" clearable placeholder="请输入手机号" @keypress.enter.native="search"></el-input>
      <el-form-item label="名称" prop="name">
        <el-input v-model="searchForm.name"  style="width: 150px" placeholder="请输入名称" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="真实姓名" prop="name">
        <el-input v-model="searchForm.name" clearable placeholder="请输入真实姓名" @keypress.enter.native="search"></el-input>
      <el-form-item label="工号" prop="code">
        <el-input v-model="searchForm.code" style="width: 150px" placeholder="请输入工号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="类型" prop="type">
        <el-select v-model="searchForm.type" clearable placeholder="请选择类型" @change="search">
            <el-option :value="0" label="全部"></el-option>
            <el-option :value="1" label="接单方"></el-option>
      <el-form-item label="战区" prop="fieldIdList">
        <el-select
            v-model="searchForm.fieldIdList"
            style="width: 150px"
            placeholder="战区"
            clearable
            multiple
            @change="search"
        >
          <el-option
              v-for="item in cateList"
              :key="item.id"
              :value="item.id"
              :label="item.name"
          ></el-option>
        </el-select>
      </el-form-item>
<!--      <el-form-item label="状态" prop="status">
        <el-select v-model="searchForm.status"  @keypress.enter.native="search" clearable placeholder="状态">
          <el-option label="启用" value="0"></el-option>
          <el-option label="禁用" value="1"></el-option>
      <el-form-item label="商业化类型" prop="busTypeIdList">
        <el-select
            v-model="searchForm.busTypeIdList"
            style="width: 150px"
            placeholder="商业化类型"
            clearable
            multiple
            @change="search"
        >
          <el-option
              v-for="item in cateList1"
              :key="item.id"
              :value="item.id"
              :label="item.name"
          ></el-option>
        </el-select>
      </el-form-item>-->
      <el-form-item label="注册时间" prop="eventType">
        <el-date-picker type="datetime" style="width: 120px" v-model="searchForm.startTime" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="开始时间" />-
        <el-date-picker type="datetime"  style="width: 120px"  v-model="searchForm.endTime" clearable value-format="yyyy-MM-dd HH:mm:ss"
                        placeholder="结束时间" />
      </el-form-item>
      <el-form-item label="擅长领域" prop="levelIdList">
        <el-select
            v-model="searchForm.levelIdList"
            style="width: 150px"
            placeholder="擅长领域"
            clearable
            multiple
            @change="search"
        >
          <el-option
              v-for="item in cateList2"
              :key="item.id"
              :value="item.id"
              :label="item.name"
          ></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="老师等级" prop="levelIdList">
        <el-select
            v-model="searchForm.levelIdList"
            style="width: 150px"
            placeholder="老师等级"
            clearable
            multiple
            @change="search"
        >
          <el-option
              v-for="item in cateList3"
              :key="item.id"
              :value="item.id"
              :label="item.name"
          ></el-option>
        </el-select>
        <el-form-item label="状态" prop="status">
          <el-select
              v-model="searchForm.status"
              placeholder="状态"
              clearable
              style="width: 150px"
              @change="search"
          >
            <el-option :key="0" :value="0" label="启用"></el-option>
            <el-option :key="1" :value="1" label="禁用"></el-option>
          </el-select>
        </el-form-item>
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
        <el-button @click="reset">重置</el-button>
        <el-button type="primary" :loading="isWorking.export" @click="exportExcel">导出</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
<!--      <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
        <li><el-button type="primary" @click="$refs.operaMemberWindow.open('新建会员信息表')" icon="el-icon-plus" v-permissions="['business:member:create']">新建</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">删除</el-button></li>
      </ul>-->
      <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
        <li><el-button type="primary" @click="$refs.operaMemberWindow.open('新建老师',null)" icon="el-icon-plus" v-permissions="['business:member:create']">新建</el-button></li>
        <li><el-button type="primary" icon="el-icon-refresh" v-permissions="['business:member:create']" @click="$refs.OperaMemberImportWindow.open('老师导入', searchForm.companyType)">批量导入</el-button></li>
        <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">删除</el-button></li>
      </ul>
      <el-table
          :height="tableHeightNew"
        v-loading="isWorking.search"
@@ -46,44 +108,46 @@
        @selection-change="handleSelectionChange"
      >
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="openid" label="openid" min-width="100px">
        <el-table-column  prop="imgurl" label="图片" min-width="100px">
          <template slot-scope="{row}">
           <span style="cursor: pointer;color: #2E68EC" @click="openDetail(row)">{{row.openid}}</span>
            <el-image v-if="row.imgurlfull" style="width: 50px; height: 50px; margin-right: 10px" :src="row.imgurlfull"
                      :preview-src-list="[row.imgurlfull]">
            </el-image>
          </template>
        </el-table-column>
        <el-table-column prop="nickName" label="昵称" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="真实姓名" min-width="100px"></el-table-column>
        <el-table-column prop="telephone" label="手机号" min-width="100px"></el-table-column>
        <el-table-column prop="workerIdentity" label="身份" min-width="100px">
        <el-table-column prop="code" label="工号" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="姓名" min-width="100px"></el-table-column>
        <el-table-column prop="sex" label="性别" min-width="100px">
          <template slot-scope="{row}">
            å‘单方<span v-if="row.workerIdentity == 2 || row.driverIdentity == 2 || row.chefIdentity == 2">{{'  |  æŽ¥å•æ–¹'}}</span>
            <span v-if="row.sex ==0">男</span>
            <span v-if="row.sex ==1">女</span>
          </template>
        </el-table-column>
        <el-table-column prop="workerIdentity" label="接单认证身份"  width="120px">
        <el-table-column prop="position" label="岗位" min-width="120px"></el-table-column>
        <el-table-column prop="levelName" label="等级" min-width="100px"></el-table-column>
        <el-table-column prop="jobYear" label="从业年份" min-width="100px"></el-table-column>
        <el-table-column prop="serveNum" label="服务商场" min-width="100px">
          <template slot-scope="{row}">
            <div v-if="row.workerIdentity == 2" class="renzhen">工人</div>
            <div v-if=" row.driverIdentity == 2"  class="renzhen">司机</div>
            <div v-if="row.chefIdentity == 2"    class="renzhen">供餐</div>
            <span v-if="row.serveNum">{{row.serveNum}}个</span>
          </template>
        </el-table-column>
        <el-table-column prop="amount" label="当前余额(元)" min-width="100px">
        <el-table-column prop="caseNum" label="标杆案例" min-width="100px">
          <template slot-scope="{row}">
            <span class="yellowstate">{{((row.amount || 0)/100).toFixed(2)}}</span>
            <span v-if="row.caseNum">{{row.caseNum}}个</span>
          </template>
        </el-table-column>
        <el-table-column prop="createTime" label="注册时间" min-width="100px"></el-table-column>
        <el-table-column prop="autoReciveStatus" label="接受自动派单" min-width="100px">
            <template slot-scope="{row}">
              {{row.autoReceiveStatus ==1?"是":"否"}}
            </template>
        </el-table-column>
<!--        <el-table-column label="状态">
        <el-table-column prop="busTypeNames" label="商业化类型" min-width="200px"></el-table-column>
        <el-table-column prop="areaNames" label="服务战区" min-width="200px"></el-table-column>
        <el-table-column prop="fieldNames" label="擅长领域" min-width="200px"></el-table-column>
        <el-table-column label="状态">
          <template slot-scope="{row}">
            <el-switch @change="changeStatus($event, row)" v-model="row.status" active-color="#13ce66"
                       inactive-color="#ff4949" :active-value="0" :inactive-value="1">
            </el-switch>
          </template>
        </el-table-column>
        <el-table-column prop="updateUserName" label="操作人" min-width="100px"></el-table-column>
        <el-table-column prop="updateTime" label="最近操作时间" min-width="150px"></el-table-column>
      <el-table-column
              v-if="containPermissions(['business:member:update', 'business:member:delete'])"
              label="操作"
@@ -91,10 +155,10 @@
              fixed="right"
            >
          <template slot-scope="{row}">
            <el-button type="text" @click="$refs.operaMemberWindow.open('编辑会员信息表', row)" icon="el-icon-edit" v-permissions="['business:member:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:member:delete']">删除</el-button>
            <el-button type="text" @click="$refs.operaMemberWindow.open('编辑老师', row,searchForm.type)" icon="el-icon-edit" v-permissions="['business:member:update']">编辑</el-button>
            <el-button type="text" style="color: red" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:member:delete']">删除</el-button>
          </template>
        </el-table-column>-->
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
@@ -104,8 +168,8 @@
      </pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaMemberDetailWindow ref="OperaMemberDetailWindow" />
    <OperaMemberWindow ref="operaMemberWindow" @success="handlePageChange"/>
    <OperaMemberImportWindow ref="OperaMemberImportWindow" @success="handlePageChange" />
  </TableLayout>
</template>
@@ -114,51 +178,63 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaMemberWindow from '@/components/business/OperaMemberWindow'
import OperaMemberDetailWindow from '@/components/business/OperaMemberDetailWindow'
import OperaMemberImportWindow from '@/components/business/OperaMemberImportWindow'
import { findAll as cateList } from '@/api/business/category'
export default {
  name: 'Member',
  name: 'Category',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaMemberDetailWindow, OperaMemberWindow },
  components: { TableLayout, Pagination, OperaMemberWindow ,OperaMemberImportWindow},
  data () {
    return {
      // æœç´¢
      searchForm: {
        type: 0,
        startTime: '',
        endTime: '',
        telephone: '',
        name: '',
        status: ''
      }
        code: '',
        status: null,
        levelIdList:[],
        fieldIdList: [],
        busTypeIdList:[],
        type: 0
      },
      cateList:[],
      cateList1:[],
      cateList2:[],
      cateList3:[],
    }
  },
  created () {
    this.config({
      module: '会员信息表',
      module: '讲师信息表',
      api: '/business/member',
      'field.id': 'id',
      'field.main': 'id'
    })
    this.search()
    cateList({
      type: 0 , //战区
    }).then(res => {
      this.cateList = res
    })
    cateList({
      type: 1 , //商业化
    }).then(res => {
      this.cateList1 = res
    })
    cateList({
      type: 2 , //擅长领用
    }).then(res => {
      this.cateList2 = res
    })
    cateList({
      type: 3 , //等级
    }).then(res => {
      this.cateList3 = res
    })
  },
  methods: {
    reset () {
      this.searchForm = {
        type: 0,
        startTime: '',
        endTime: '',
        telephone: '',
        name: '',
        status: ''
      }
      this.search()
    },
    openDetail (row) {
      this.$refs.OperaMemberDetailWindow.open('用户详情', row.id)
    },
    changeStatus (e, row) {
      this.working = true
      this.api.updateStatus({ id: row.id, workStatus: e })
      this.api.updateStatus({ id: row.id, status: e })
        .then(res => {
          this.$tip.apiSuccess(res || '操作成功')
          this.search()
@@ -169,19 +245,7 @@
        .finally(() => {
          this.working = false
        })
        .catch(() => { })
    }
  }
}
</script>
<style  scoped lang="scss">
.renzhen{
  margin: 5px;
  line-height: 30px;
  color:#67c23a;
  height: 30px;
  text-align:center;
  border-color: #e1f3d8;
  background-color: #f0f9eb;
}
</style>
admin/src/views/business/memberRevenue.vue
ÎļþÒÑɾ³ý
admin/src/views/index.vue
@@ -3,7 +3,7 @@
    <div class="home_header">
      <div class="mb10 fs17">下午好,{{ userInfo.realname }}</div>
      <div class="fs13">
        ä»Šå¤©æ˜¯ {{ nowDate }} {{ nowWeek }},欢迎访问近快后台管理系统
        ä»Šå¤©æ˜¯ {{ nowDate }} {{ nowWeek }},欢迎访问志邦点将后台管理系统
      </div>
    </div>
  </div>
admin/src/views/login.vue
@@ -1,7 +1,7 @@
<template>
  <div class="wrap">
    <div class="introduce">
      <h2>近快后台管理系统</h2>
      <h2>志邦点将后台管理系统</h2>
      <h3></h3>
    </div>
    <div class="login">
server/admin/src/main/java/com/doumee/api/business/CategoryController.java
@@ -85,6 +85,12 @@
    public ApiResponse<PageData<Category>> findPage (@RequestBody PageWrap<Category> pageWrap) {
        return ApiResponse.success(categoryService.findPage(pageWrap));
    }
    @ApiOperation("列表查询")
    @PostMapping("/list")
    @RequiresPermissions("business:category:query")
    public ApiResponse<List<Category>> findList (@RequestBody  Category pageWrap) {
        return ApiResponse.success(categoryService.findList(pageWrap));
    }
    @ApiOperation("导出Excel")
    @PostMapping("/exportExcel")
server/admin/src/main/java/com/doumee/api/business/ImportRecordController.java
@@ -9,20 +9,23 @@
import com.doumee.dao.business.model.ImportRecord;
import com.doumee.core.utils.Utils;
import com.doumee.service.business.ImportRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.*;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import  com.doumee.api.BaseController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
/**
 * åˆ†ç±»ä¿¡æ¯è¡¨Controller定义
 * @author doumee
 * @date 2026-01-27 16:02:37
 */
@Api(tags = "tableName接口")
@Api(tags = "分类信息表接口")
@RestController
@RequestMapping("/business/importRecord")
public class ImportRecordController extends BaseController {
@@ -82,4 +85,16 @@
    public ApiResponse findById(@PathVariable Integer id) {
        return ApiResponse.success(importRecordService.findById(id));
    }
    @ApiOperation(value = "信息导入" ,notes = "保单申请")
    @PostMapping("/importExcel")
    @ApiImplicitParams({
            @ApiImplicitParam(name = "file", value = "file", required = true, paramType = "query", dataType = "file", dataTypeClass = File.class),
            @ApiImplicitParam(name = "导入类型 0人员 1案例", value = "type", required = true, paramType = "query", dataType = "Integer",example = "0",dataTypeClass = Integer.class),
    })
    public ApiResponse<String> importExcel (@ApiParam(value = "file") MultipartFile file, @ApiParam(value = "type") Integer type) {
        ImportRecord importRecord = importRecordService.importBatch(file,type);
        importRecordService.dealImporTask(importRecord);
        return ApiResponse.success("文件上传成功");
    }
}
server/admin/src/main/java/com/doumee/api/business/MemberController.java
@@ -9,20 +9,23 @@
import com.doumee.dao.business.model.Member;
import com.doumee.core.utils.Utils;
import com.doumee.service.business.MemberService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.*;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import  com.doumee.api.BaseController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
/**
 * ä¼šå‘˜ä¿¡æ¯è¡¨Controller定义
 * @author doumee
 * @date 2026-01-27 16:02:37
 */
@Api(tags = "tableName接口")
@Api(tags = "会员信息表接口")
@RestController
@RequestMapping("/business/member")
public class MemberController extends BaseController {
@@ -76,6 +79,7 @@
        ExcelExporter.build(Member.class).export(memberService.findPage(pageWrap).getRecords(), "会员信息表", response);
    }
    @ApiOperation("根据ID查询")
    @GetMapping("/{id}")
    @RequiresPermissions("business:member:query")
server/pom.xml
@@ -46,6 +46,11 @@
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>5.8.40</version>
    </dependency>
    <!-- Shiro -->
    <dependency>
      <groupId>org.apache.shiro</groupId>
server/services/lib/zos-sdk.jar
Binary files differ
server/services/pom.xml
@@ -10,6 +10,21 @@
    <version>1.0.0-SNAPSHOT</version>
  </parent>
  <dependencies>
    <dependency>
      <groupId>com.tianyiyun</groupId>
      <artifactId>zob</artifactId>
      <version>1.0</version>
      <scope>system</scope>
      <!--本地的jacob.jar的路径-->
      <systemPath>${project.basedir}/lib/zos-sdk.jar</systemPath>
    </dependency>
    <dependency>
      <groupId>cn.hutool</groupId>
      <artifactId>hutool-all</artifactId>
      <version>5.8.40</version>
    </dependency>
  </dependencies>
  <properties>
    <maven.compiler.source>8</maven.compiler.source>
    <maven.compiler.target>8</maven.compiler.target>
server/services/src/main/java/com/doumee/api/common/PublicCloudController.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/api/common/PublicController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,168 @@
package com.doumee.api.common;
import com.alibaba.fastjson.JSONObject;
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.constants.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.FtpUtil;
import com.doumee.core.utils.tyyun.TyyZosUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.UUID;
/**
 * @author Eva.Caesar Liu
 * @date 2023/02/14 11:14
 */
@Api(tags = "公共接口")
@Trace(exclude = true)
@RestController
@RequestMapping("/public")
@Slf4j
public class PublicController extends BaseController {
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    public static FtpUtil ftp  = null;
    @ApiOperation(value = "上传", notes = "上传", httpMethod = "POST", position = 6)
    @ApiImplicitParams({
            @ApiImplicitParam(name = "folder", value = "文件夹", required = true, paramType = "query", dataType = "String", dataTypeClass = String.class),
    })
    @PostMapping(value = "/upload", headers = "content-type=multipart/form-data")
    public void uploadMobile(String folder, HttpServletRequest request, HttpServletResponse response) throws Exception {
        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        upload(multipartRequest, response, folder + "/",
                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.BUCKETNAME).getCode(),
                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.ACCESS_ID).getCode(),
                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.ACCESS_KEY).getCode(),
                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.RESOURCE_PATH).getCode(),
                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.ENDPOINT).getCode());
    }
    public void upload(HttpServletRequest request, HttpServletResponse response, String folder, String bucketName,
                       String access_id, String access_key, String resourcePath, String endpoint) throws Exception {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        Map<String, Object> context = new HashMap<>();
        CommonsMultipartResolver multipartResovler = new CommonsMultipartResolver();
        if (multipartResovler.isMultipart(request)) {
            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
            Iterator<String> it = multipartRequest.getFileNames();
            while (it.hasNext()) {
                MultipartFile file = multipartRequest.getFile((String) it.next());// file
                // multipartRequest.getFile((String)
                // it.next());
                if (file != null) {
                    // 1、上传到服务器临时文件夹
                    String uploadFileName = file.getOriginalFilename();
                    String originname = uploadFileName;
                    if (originname.lastIndexOf("/") >= 0) {
                        originname = originname.substring(originname.lastIndexOf("/") + 1);
                    }
                    String nfix = "";// åŽç¼€å
                    if (StringUtils.isNotBlank(uploadFileName)) {
                        nfix = uploadFileName.substring(uploadFileName.lastIndexOf("."));
                    }
                    if (StringUtils.equalsIgnoreCase(nfix, ".exe")) {
                        context.put("code", 4000);
                        context.put("message", "对不起,文件格式\".exe\"上传有误!");
                        return;
                    }
                    if (StringUtils.equalsIgnoreCase(nfix, ".dll")) {
                        context.put("code", 4000);
                        context.put("message", "对不起,文件格式\".dll\"上传有误!");
                        return;
                    }
                    if (StringUtils.equalsIgnoreCase(nfix, ".so")) {
                        context.put("code", 4000);
                        context.put("message", "对不起,文件格式\".so\"上传有误!");
                        return;
                    }
                    String nowDate = DateUtil.getNowShortDate();// å½“前时间(年月日)
                    String fileName = UUID.randomUUID().toString() + nfix;
                    String tempFileName = nowDate + "/" + fileName;
                    String key = folder + tempFileName;// æ–‡ä»¶å
                    TyyZosUtil obs = new TyyZosUtil(endpoint,access_id, access_key);
                    if (obs.uploadInputstreamObject(file.getInputStream(),bucketName, key)) {
                        // ç§»åŠ¨æˆåŠŸ,返回文件名
                        // sendSuccessMessage(response, resourcePath+key);
                        context.put("success", true);
                        context.put("code", 200);
                        context.put("errno",0);
                        JSONObject fileJSON = new JSONObject();
                        fileJSON.put("url", resourcePath + key);
                        fileJSON.put("imgaddr", tempFileName);
                        fileJSON.put("imgname", fileName);
                        fileJSON.put("originname", originname);
                        context.put("data",fileJSON);
                        context.put("message","请求成功");
                        writerJson(response, context);
                        return;
                    } else {
                        // ç§»åŠ¨å¤±è´¥
                        context.put("code", 0);
                        context.put("message", "上传失败");
                        writerJson(response, context);
                        return;
                    }
                }
            }
        }
        context.put("code", 0);
        context.put("message", "上传失败");
        context.put("errno",0);
        writerJson(response, context);
        return;
    }
    public static void writerJson(HttpServletResponse response, Object object) {
        response.setContentType("application/json");
        writer(response, JSONObject.toJSONString(object));
    }
    private static void writer(HttpServletResponse response, String str) {
        try {
            StringBuffer result = new StringBuffer();
            //设置页面不缓存
            response.setHeader("Pragma", "No-cache");
            response.setHeader("Cache-Control", "no-cache");
            response.setCharacterEncoding("UTF-8");
            PrintWriter out = null;
            out = response.getWriter();
            out.print(str);
            out.flush();
            out.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
server/services/src/main/java/com/doumee/biz/system/SystemDictDataBiz.java
@@ -34,7 +34,6 @@
     */
    void sort(UpdateSortDTO dto);
    String updateQywxToken();
    void updateByIdNew(SystemDictData systemDictData);
    SystemDictData queryByCode(String dicCode, String label);
server/services/src/main/java/com/doumee/biz/system/impl/SystemDictDataBizImpl.java
@@ -5,7 +5,6 @@
import com.doumee.core.exception.BusinessException;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.utils.qiyeweixin.QywxUtil;
import com.doumee.dao.common.dto.UpdateSortDTO;
import com.doumee.dao.system.model.SystemDict;
import com.doumee.dao.system.model.SystemDictData;
@@ -50,27 +49,6 @@
    @Override
    public void updateById(SystemDictData systemDictData) {
        systemDictDataService.updateById(systemDictData);
    }
    @Override
    public     String updateQywxToken(){
        String corpid = queryByCode(Constants.QYWX,Constants.QYWX_CORPID).getCode();
        String secret = queryByCode(Constants.QYWX,Constants.QYWX_SECRET).getCode();
        String token = QywxUtil.getAccessToken(corpid,secret);
       SystemDictData dictData = queryByCode(Constants.QYWX,Constants.QYWX_TOKEN);
        if (dictData != null  ) {
            dictData.setCode(token);
            dictData.setUpdateTime(new Date());
            systemDictDataService.updateById(dictData);
            String ticket = QywxUtil.getJsApiTicket(token);
            SystemDictData ticketDictData = queryByCode(Constants.QYWX,Constants.QYWX_JS_API_TICKET);
            if (dictData != null  ) {
                ticketDictData.setCode(ticket);
                ticketDictData.setUpdateTime(new Date());
                systemDictDataService.updateById(ticketDictData);
            }
        }
        return  token;
    }
    @Override
server/services/src/main/java/com/doumee/config/jwt/JwtTokenUtil.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONObject;
import com.doumee.core.constants.Constants;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.vo.WebLoginUserVO;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import lombok.extern.slf4j.Slf4j;
@@ -34,23 +35,21 @@
    /**
     * ç”Ÿæˆtoken令牌
     *
     * @param member ä»¤ç‰Œä¸­æºå¸¦çš„附加信息
     * @param webLoginUser ä»¤ç‰Œä¸­æºå¸¦çš„附加信息
     * @return ä»¤token牌
     */
    public String generateToken(Member member) {
        if(member == null){
    public String generateToken(WebLoginUserVO webLoginUser) {
        if(webLoginUser == null){
            return  null;
        }
        Map<String,Object> map = new HashMap<>();
        map.put("id",member.getId());
        return generateTokenDo(member);
        return generateTokenDo(webLoginUser);
    }
    public Member getUserInfoByToken(String token) {
    public WebLoginUserVO getUserInfoByToken(String token) {
        try {
            Member member = getClaimsFromToken(token);
            return member;
            WebLoginUserVO userVO = getClaimsFromToken(token);
            return userVO;
        } catch (Exception e) {
           e.printStackTrace();
        }
@@ -97,17 +96,15 @@
     *
     * @return ä»¤ç‰Œ
     */
    private String generateTokenDo(Member member) {
    private String generateTokenDo(WebLoginUserVO webLoginUser) {
        Map<String, Object> claims = new HashMap<>();
        claims.put("id",member.getId());
        claims.put("id",webLoginUser.getId());
        Date expirationDate = new Date(System.currentTimeMillis() + jwtProperties.getExpiration());
        String token = Jwts.builder().setClaims(claims)
                .setExpiration(expirationDate)
                .signWith(SignatureAlgorithm.HS512, jwtProperties.getSecret())
                .compact();
        redisTemplate.opsForValue().set(Constants.REDIS_TOKEN_KEY+token,JSONObject.toJSONString(member)
//                , jwtProperties.getExpiration(), TimeUnit.MILLISECONDS
        );
        redisTemplate.opsForValue().set(Constants.REDIS_TOKEN_KEY+token,JSONObject.toJSONString(webLoginUser));
        return token;
    }
@@ -118,11 +115,11 @@
     * @param token ä»¤ç‰Œ
     * @return æ•°æ®å£°æ˜Ž
     */
    private Member getClaimsFromToken(String token) {
        Member claims;
    private WebLoginUserVO getClaimsFromToken(String token) {
        WebLoginUserVO claims;
        try {
            String userInfo = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY+token);
            claims = JSONObject.toJavaObject(JSONObject.parseObject(userInfo),Member.class);
            claims = JSONObject.toJavaObject(JSONObject.parseObject(userInfo),WebLoginUserVO.class);
        } catch (Exception e) {
            claims = null;
        }
server/services/src/main/java/com/doumee/config/jwt/WebMvcConfig.java
@@ -1,11 +1,10 @@
package com.doumee.config.jwt;
import com.alibaba.fastjson.JSONObject;
import com.doumee.core.annotation.LoginRequired;
import com.doumee.core.constants.Constants;
import com.doumee.config.annotation.LoginRequired;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.vo.WebLoginUserVO;
import io.jsonwebtoken.JwtException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -79,23 +78,14 @@
    public Boolean checkLogin(HttpServletRequest request, HttpServletResponse response){
        String token = request.getHeader(JwtTokenUtil.HEADER_KEY);
        try {
            Member member  = jwtTokenUtil.getUserInfoByToken(token);
            if(Objects.isNull(member)){
            WebLoginUserVO webLoginUserVO = jwtTokenUtil.getUserInfoByToken(token);
            if(Objects.isNull(webLoginUserVO)){
                throw new BusinessException(ResponseStatus.TOKEN_EXCEED_TIME.getCode(),"长时间未操作,请重新登录");
            }
            Integer isDeleted = dao.queryForObject(" select COALESCE(DELETED,1)  from member where id  = ?", Integer.class, member.getId());
            if(isDeleted.equals(Constants.ONE)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户已删除,请联系管理员");
            }
            Integer count = dao.queryForObject("select count(1) from member where id  = ?", Integer.class, member.getId());
            if (count != null && count > 0) {
//                jwtTokenUtil.refreshToken(token,member);
                request.setAttribute(JwtTokenUtil.MEMBER_INFO, JSONObject.toJSONString(member));
                request.setAttribute(JwtTokenUtil.MEMBER_ID, member.getId());
            request.setAttribute(JwtTokenUtil.MEMBER_INFO, JSONObject.toJSONString(webLoginUserVO));
            request.setAttribute(JwtTokenUtil.MEMBER_ID, webLoginUserVO.getId());
                return true;
            }else{
                throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"用户信息出错");
            }
        } catch (IllegalArgumentException | JwtException e) {
            throw new BusinessException(ResponseStatus.BE_OVERDUE.getCode(),"未登录");
        }
server/services/src/main/java/com/doumee/core/annotation/LoginRequired.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/annotation/excel/ExcelImporter.java
@@ -4,6 +4,7 @@
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFPictureData;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -42,7 +43,7 @@
     * æ ‡é¢˜è¡Œå·
     */
    private CellType changeType;
    private Map<String, XSSFPictureData> pictureList;
    /**
     * æž„造函数
     * @param--path å¯¼å…¥æ–‡ä»¶ï¼Œè¯»å–第一个工作表
@@ -161,6 +162,7 @@
        this.sheet = this.wb.getSheetAt(sheetIndex);
        this.headerNum = headerNum;
        this.changeType = cellType;
        this.pictureList = ExcelPictureUtil.getExcelPictures(in);
        log.debug("Initialize success.");
    }
@@ -228,6 +230,9 @@
        }
        return val;
    }
    public Map<String,XSSFPictureData> getExcelPictures(){
        return this.pictureList;
    }
    /**
     * èŽ·å–å¯¼å…¥æ•°æ®åˆ—è¡¨
server/services/src/main/java/com/doumee/core/annotation/excel/ExcelPictureUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,309 @@
package com.doumee.core.annotation.excel;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.XML;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.map.HashedMap;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.openxml4j.opc.PackagePartName;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.*;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/**
 * @author bianhl
 * @version 1.0
 * @description èŽ·å–å›¾ç‰‡èµ„æº
 * @date 2024å¹´4月28日08:44:42
 */
@Slf4j
public class ExcelPictureUtil {
    public static Map<String, XSSFPictureData> getExcelPictures(InputStream is) {
        try {
            byte[] fileData =  getFileStream(is);
            Map<String, XSSFPictureData> pictures = getPictures(fileData);
            pictures.forEach((id, xssfPictureData) -> {
                System.out.println("id:" + id);
                String fileName = xssfPictureData.getPackagePart().getPartName().getName();
                System.out.println("fileName:" + fileName);
            });
            return pictures;
        }catch (Exception e){
            return  null;
        }
    }
    /**
     * èŽ·å–æµ®åŠ¨å›¾ç‰‡ï¼Œä»¥ map å½¢å¼è¿”回,键为行列格式 x-y。
     *
     * @param xssfSheet WPS å·¥ä½œè¡¨
     * @return æµ®åŠ¨å›¾ç‰‡çš„ map
     */
    public static Map<String, XSSFPictureData> getFloatingPictures(XSSFSheet xssfSheet) {
        Map<String, XSSFPictureData> mapFloatingPictures = new HashMap<>();
        XSSFDrawing drawingPatriarch = xssfSheet.getDrawingPatriarch();
        if (drawingPatriarch != null) {
            List<XSSFShape> shapes = drawingPatriarch.getShapes();
            for (XSSFShape shape : shapes) {
                if (shape instanceof XSSFPicture ) {
                    XSSFPicture picture = (XSSFPicture)shape;
                    XSSFClientAnchor anchor = (XSSFClientAnchor) picture.getAnchor();
                    XSSFPictureData pictureData = picture.getPictureData();
                    String key = anchor.getRow1() + "-" + anchor.getCol1();
                    mapFloatingPictures.put(key, pictureData);
                }
            }
        }
        return mapFloatingPictures;
    }
    /**
     * å¤„理 WPS æ–‡ä»¶ä¸­çš„图片数据,返回图片信息 map。
     *
     * @param stream    è¾“入流
     * @param mapConfig é…ç½®æ˜ å°„
     * @return å›¾ç‰‡ä¿¡æ¯çš„ map
     * @throws IOException
     */
    private static Map<String, XSSFPictureData> processPictures(ByteArrayInputStream stream, Map<String, String> mapConfig) throws IOException {
        Map<String, XSSFPictureData> mapPictures = new HashedMap<>();
        Workbook workbook = WorkbookFactory.create(stream);
        List<XSSFPictureData> allPictures = (List<XSSFPictureData>) workbook.getAllPictures();
        for (XSSFPictureData pictureData : allPictures) {
            PackagePartName partName = pictureData.getPackagePart().getPartName();
            String uri = partName.getURI().toString();
            if (mapConfig.containsKey(uri)) {
                String strId = mapConfig.get(uri);
                mapPictures.put(strId, pictureData);
            }
        }
        return mapPictures;
    }
    /**
     * èŽ·å– WPS æ–‡æ¡£ä¸­çš„图片,包括嵌入式图片和浮动式图片。
     *
     * @param data äºŒè¿›åˆ¶æ•°æ®
     * @return å›¾ç‰‡ä¿¡æ¯çš„ map
     * @throws IOException
     */
    public static Map<String, XSSFPictureData> getPictures(byte[] data) {
        try {
            Map<String, String> mapConfig = processZipEntries(new ByteArrayInputStream(data));
            Map<String, XSSFPictureData> mapPictures = processPictures(new ByteArrayInputStream(data), mapConfig);
            Iterator<Sheet> sheetIterator = WorkbookFactory.create(new ByteArrayInputStream(data)).sheetIterator();
            while (sheetIterator.hasNext()) {
                mapPictures.putAll(getFloatingPictures((XSSFSheet) sheetIterator.next()));
            }
            return mapPictures;
        } catch (IOException e) {
            return new HashedMap<>();
        }
    }
    /**
     * å¤„理 Zip æ–‡ä»¶ä¸­çš„æ¡ç›®ï¼Œæ›´æ–°å›¾ç‰‡é…ç½®ä¿¡æ¯ã€‚
     *
     * @param stream Zip è¾“入流
     * @return é…ç½®ä¿¡æ¯çš„ map
     * @throws IOException
     */
    private static Map<String, String> processZipEntries(ByteArrayInputStream stream) throws IOException {
        Map<String, String> mapConfig = new HashedMap<>();
        ZipInputStream zipInputStream = new ZipInputStream(stream);
        ZipEntry zipEntry;
        while ((zipEntry = zipInputStream.getNextEntry()) != null) {
            try {
                final String fileName = zipEntry.getName();
                if ("xl/cellimages.xml".equals(fileName)) {
                    processCellImages(zipInputStream, mapConfig);
                } else if ("xl/_rels/cellimages.xml.rels".equals(fileName)) {
                    return processCellImagesRels(zipInputStream, mapConfig);
                }
            } finally {
                zipInputStream.closeEntry();
            }
        }
        return new HashedMap<>();
    }
    /**
     * å¤„理 Zip æ–‡ä»¶ä¸­çš„ cellimages.xml æ–‡ä»¶ï¼Œæ›´æ–°å›¾ç‰‡é…ç½®ä¿¡æ¯ã€‚
     *
     * @param zipInputStream Zip è¾“入流
     * @param mapConfig      é…ç½®ä¿¡æ¯çš„ map
     * @throws IOException
     */
    private static void processCellImages(ZipInputStream zipInputStream, Map<String, String> mapConfig) throws IOException {
        String content = IOUtils.toString(zipInputStream);
        JSONObject jsonObject = XML.toJSONObject(content);
        if (jsonObject != null) {
            JSONObject cellImages = jsonObject.getJSONObject("etc:cellImages");
            if (cellImages != null) {
                JSONArray cellImageArray = null;
                Object cellImage = cellImages.get("etc:cellImage");
                if (cellImage != null && cellImage instanceof JSONArray) {
                    cellImageArray = (JSONArray) cellImage;
                } else if (cellImage != null && cellImage instanceof JSONObject) {
                    JSONObject cellImageObj = (JSONObject) cellImage;
                    if (cellImageObj != null) {
                        cellImageArray = new JSONArray();
                        cellImageArray.add(cellImageObj);
                    }
                }
                if (cellImageArray != null) {
                    processImageItems(cellImageArray, mapConfig);
                }
            }
        }
    }
    /**
     * å¤„理 cellImageArray ä¸­çš„图片项,更新图片配置信息。
     *
     * @param cellImageArray å›¾ç‰‡é¡¹çš„ JSONArray
     * @param mapConfig      é…ç½®ä¿¡æ¯çš„ map
     */
    private static  void processImageItems(JSONArray cellImageArray, Map<String, String> mapConfig) {
        for (int i = 0; i < cellImageArray.size(); i++) {
            JSONObject imageItem = cellImageArray.getJSONObject(i);
            if (imageItem != null) {
                JSONObject pic = imageItem.getJSONObject("xdr:pic");
                if (pic != null) {
                    processPic(pic, mapConfig);
                }
            }
        }
    }
    /**
     * å¤„理 pic ä¸­çš„图片信息,更新图片配置信息。
     *
     * @param pic       å›¾ç‰‡çš„ JSONObject
     * @param mapConfig é…ç½®ä¿¡æ¯çš„ map
     */
    private static  void processPic(JSONObject pic, Map<String, String> mapConfig) {
        JSONObject nvPicPr = pic.getJSONObject("xdr:nvPicPr");
        if (nvPicPr != null) {
            JSONObject cNvPr = nvPicPr.getJSONObject("xdr:cNvPr");
            if (cNvPr != null) {
                String name = cNvPr.getStr("name");
                if (StringUtils.isNotEmpty(name)) {
                    String strImageEmbed = updateImageEmbed(pic);
                    if (strImageEmbed != null) {
                        mapConfig.put(strImageEmbed, name);
                    }
                }
            }
        }
    }
    /**
     * èŽ·å–åµŒå…¥å¼å›¾ç‰‡çš„ embed ä¿¡æ¯ã€‚
     *
     * @param pic å›¾ç‰‡çš„ JSONObject
     * @return embed ä¿¡æ¯
     */
    private  static String updateImageEmbed(JSONObject pic) {
        JSONObject blipFill = pic.getJSONObject("xdr:blipFill");
        if (blipFill != null) {
            JSONObject blip = blipFill.getJSONObject("a:blip");
            if (blip != null) {
                return blip.getStr("r:embed");
            }
        }
        return null;
    }
    /**
     * å¤„理 Zip æ–‡ä»¶ä¸­çš„ relationship æ¡ç›®ï¼Œæ›´æ–°é…ç½®ä¿¡æ¯ã€‚
     *
     * @param zipInputStream Zip è¾“入流
     * @param mapConfig      é…ç½®ä¿¡æ¯çš„ map
     * @return é…ç½®ä¿¡æ¯çš„ map
     * @throws IOException
     */
    private static Map<String, String> processCellImagesRels(ZipInputStream zipInputStream, Map<String, String> mapConfig) throws IOException {
        String content = IOUtils.toString(zipInputStream );
        JSONObject jsonObject = XML.toJSONObject(content);
        JSONObject relationships = jsonObject.getJSONObject("Relationships");
        if (relationships != null) {
            JSONArray relationshipArray = null;
            Object relationship = relationships.get("Relationship");
            if (relationship != null && relationship instanceof JSONArray) {
                relationshipArray = (JSONArray) relationship;
            } else if (relationship != null && relationship instanceof JSONObject  ) {
                JSONObject relationshipObj = (JSONObject) relationship;
                if (relationshipObj != null) {
                    relationshipArray = new JSONArray();
                    relationshipArray.add(relationshipObj);
                }
            }
            if (relationshipArray != null) {
                return processRelationships(relationshipArray, mapConfig);
            }
        }
        return null;
    }
    /**
     * å¤„理 relationshipArray ä¸­çš„关系项,更新配置信息。
     *
     * @param relationshipArray å…³ç³»é¡¹çš„ JSONArray
     * @param mapConfig         é…ç½®ä¿¡æ¯çš„ map
     * @return é…ç½®ä¿¡æ¯çš„ map
     */
    private static Map<String, String> processRelationships(JSONArray relationshipArray, Map<String, String> mapConfig) {
        Map<String, String> mapRelationships = new HashedMap<>();
        for (int i = 0; i < relationshipArray.size(); i++) {
            JSONObject relaItem = relationshipArray.getJSONObject(i);
            if (relaItem != null) {
                String id = relaItem.getStr("Id");
                String value = "/xl/" + relaItem.getStr("Target");
                if (mapConfig.containsKey(id)) {
                    String strImageId = mapConfig.get(id);
                    mapRelationships.put(value, strImageId);
                }
            }
        }
        return mapRelationships;
    }
    /**
     * @return {@link byte[]}
     * @description
     * @author bianhl
     * @date 2024/4/26 13:52
     */
    private static byte[] getFileStream(InputStream inputStream) {
            // åˆ›å»º ByteArrayOutputStream æ¥æš‚存流数据
        try {
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int length;
            while ((length = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, length);
            }
            // å°† byteArrayOutputStream çš„内容获取为字节数组
            return byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            return null;
        }
    }
}
server/services/src/main/java/com/doumee/core/constants/Constants.java
@@ -19,6 +19,8 @@
    public static final String HWY_OBS_ENDPOINT ="HWY_OBS_ENDPOINT" ;
    public static final String HWY_OBS_BUCKET ="HWY_OBS_BUCKET" ;
    public static final String RESOURCE_PATH ="RESOURCE_PATH" ;
    public static final String ROLE_CONFIG ="ROLE_CONFIG" ;
    public static final String QYWX_CORPID = "QYWX_CORPID";
    public static final String QYWX_SECRET = "QYWX_SECRET";
    public static final String QYWX_TOKEN = "QYWX_TOKEN";
@@ -58,6 +60,14 @@
    public static final String AUTO_CONFIRM ="AUTO_CONFIRM" ;
    public static final String AUTO_CANCEL_WAIT_PAY ="AUTO_CANCEL_WAIT_PAY" ;
    public static final String ACCESS_ID="ACCESS_ID";
    public static final String BUCKETNAME = "BUCKETNAME";
    public static final String ACCESS_KEY = "ACCESS_KEY";
    public static final String ENDPOINT = "ENDPOINT";
    public static final String UTF = "UTF-8";
    public static final String QYWX = "QYWX";
    public static final  Integer ONE = 1;
    public static final Integer TWO = 2;
@@ -70,6 +80,11 @@
    public static final String MEMBER_FILES = "MEMBER_FILES";
    public static final String CATEGORY_FILES = "CATEGORY_FILES";
    public static final String ORDERS_FILES = "ORDERS_FILES";
    public static final String ZBOM_PARAM ="ZBOM_PARAM" ;
    public static final String ZBOM_UK_ERROR_URL ="ZBOM_UK_ERROR_URL" ;
    public static final String ZBOM_TICKET_LOGIN_URL ="ZBOM_TICKET_LOGIN_URL" ;
    public static final String OBJCET_STORAGE = "OBJCET_STORAGE";
    public static final Object OBJECT_TYPE_CASES = "OBJECT_TYPE_CASES";
    public static boolean WORKORDER_SHE_EMAIL_SENDING = false;
    public static  boolean DEALING_COMPANY_SYNC = false ;
    public static  boolean DEALING_MEMBER_SYNC = false ;
@@ -77,10 +92,16 @@
    public static final String WORKORDER_LOG_FILE_PATH ="WORKORDER_LOG_FILE_PATH" ;
    public static final String REDIS_TOKEN_KEY = "token_";
    public static final String CASES_FILES = "CASES_FILES";
    public static final String SUCCESS = "SUCCESS";
    public static final String FAIL = "FAIL";
    public static final String CANCELLED = "CANCELLED";
    public interface  ZbomConst{
       String TICKET_LOGIN = "https://sso.zbom.com/esc-idm/api/v1/getUserInfo";
       String  TICKET_LOGIN_TEST = "http://testsso.zhibang.com:8080/esc-idm/api/v1/getUserInfo";
    }
    public interface   uploadType{
@@ -94,7 +115,8 @@
    interface CacheKey {
    }
    public interface RedisKeys {
        public static final String ORDER_CODE = "ORDER_CODE";
       String IMPORTING_RECORD = "IMPORTING_RECORD";
       String ORDER_CODE = "ORDER_CODE";
    }
    /**
     * æ“ä½œç±»åž‹ï¼Œç”¨äºŽåšæŽ¥å£éªŒè¯åˆ†ç»„
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/QywxConstant.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/QywxUtil.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxBaseRequest.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxSendMsgRequest.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/request/QywxTextCardMsgRequest.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxBaseSingleResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxDepartInfoResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxSendMsgResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUploadMediaResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrInfoResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserAttrValResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserExtAttrResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserInfoResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/qiyeweixin/model/response/QywxUserListResponse.java
ÎļþÒÑɾ³ý
server/services/src/main/java/com/doumee/core/utils/tyyun/TyyZosUtil.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,185 @@
package com.doumee.core.utils.tyyun;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.Protocol;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.*;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.net.URL;
@Slf4j
public class TyyZosUtil {
    private AmazonS3 client;
    // public static final String ENDPOINT = "oss-cn-shanghai.aliyuncs.com";
    public TyyZosUtil(String END_POINT, String ACCESS_KEY, String SECRET_KEY) {
        try {
            AWSCredentials credentials = new BasicAWSCredentials(ACCESS_KEY,SECRET_KEY);
            ClientConfiguration awsClientConfig = new ClientConfiguration();
            awsClientConfig.setSignerOverride("AWSS3V4SignerType");
            awsClientConfig.setProtocol(Protocol.HTTP);
            client = AmazonS3ClientBuilder.standard()
                    .withCredentials(new
                            AWSStaticCredentialsProvider(credentials))
                    .withClientConfiguration(awsClientConfig)
                    .withEndpointConfiguration(new
                            AwsClientBuilder.EndpointConfiguration(END_POINT, ""))
                    .disableChunkedEncoding()
                    .enablePathStyleAccess()
                    .build();
        }catch (Exception e){
                log.error("对象存储====================连接天翼云ZOS失败"+e.getMessage());
        }
    }
    /**
     * ä¸Šä¼ æ–‡ä»¶
     *
     * @param bucketName äº‘端存放bucket名称
     * @param key        é‡æ–°å‘½åçš„æ–‡ä»¶å
     * @param filepath   å°†è¦ä¸Šä¼ çš„æ–‡ä»¶åç§°
     * @throws FileNotFoundException
     */
    public void uploadObject(String bucketName, String key, String filepath,
                             String mime){
        try {
            File file= new File(filepath);
            PutObjectRequest request = new PutObjectRequest(bucketName, key, file);
            PutObjectResult result = client.putObject(request);
        }catch (Exception e){
            log.error("对象存储===================="+filepath+"文件上传失败"+e.getMessage());
        }finally {
            shutDown();
        }
    }
    /**
     * è®²key文件存储在本地filename目标文件中
     * @param bucketName
     * @param key
     * @param filename
     */
    public void getObject(String bucketName, String key, String filename ){
        try {
            GetObjectRequest request = new GetObjectRequest(bucketName, key);
            S3Object result = client.getObject(request);
            System.out.print("=====request success=====\n");
            try {
                InputStream in = result.getObjectContent();
                File outputFile = new File(filename);
                FileOutputStream outputStream = new
                        FileOutputStream(outputFile);
                byte[] read_buf = new byte[1024 * 1024];
                int read_len = 0;
                while ((read_len = in.read(read_buf)) > 0) {
                    outputStream.write(read_buf, 0, read_len);
                }
                in.close();
                outputStream.close();
            } catch (IOException e){
                e.printStackTrace();
            }
        }catch (Exception e){
            log.error("对象存储===================="+filename+"文件读取失败"+e.getMessage());
        }finally {
            shutDown();
        }
    }
    public void deleteObject(String bucketName, String key  ){
        try {
            DeleteObjectRequest request = new DeleteObjectRequest(bucketName, key);
            client.deleteObject(request);
            System.out.print("=====request deleteObject success=====");
        }catch (Exception e){
            log.error("对象存储===================="+key+"文件删除失败"+e.getMessage());
        }finally {
            shutDown();
        }
    }
    /**
     * å…³é—­
     *
     * @throws FileNotFoundException
     */
    public void shutDown() {
        if (client != null) {
            // å…³é—­client
            client.shutdown();
        }
    }
    public static void main(String[] args) {
        TyyZosUtil aLiYunUtil = new TyyZosUtil("", "uc4nnpsqep1i9fijqr37nokh",
                "/rp41xCx/XdGEVCptdH6v7xpc9w=");
        // aLiYunUtil.uploadObject("pongto", "work/li2.txt", "D://哈.txt",
        // ".html,.html text/html");D://装机软件/办公学习
        // aLiYunUtil.partUploadObject("pongto", "work/ps.exe",
        // "D://装机软件/办公学习/Adobe_Illustrator_CS6_XiaZaiBa.exe",
        // ".html,.html text/html");
        // aLiYunUtil.deleteBucket("pongto");
    }
    /**
     * ä¸Šä¼ ç½‘络文件
     *
     * @param bucketName äº‘端存放bucket名称
     * @param key        é‡æ–°å‘½åçš„æ–‡ä»¶å
     *                   å°†è¦ä¸Šä¼ çš„æ–‡ä»¶åç§°
     * @throws IOException
     */
    public boolean uploadOnlineObject(String url, String bucketName, String key )     {
        try {
            InputStream inputStream = new URL(url).openStream();
            if (inputStream != null) {
                ObjectMetadata metadata = new ObjectMetadata();
                PutObjectRequest request = new PutObjectRequest(bucketName, key, inputStream,metadata);
                PutObjectResult result = client.putObject(request);
            }else {
                log.error("对象存储===================="+url+"网络文件上传失败,网络文件读取失败");
            }
        }catch (Exception e){
            log.error("对象存储===================="+url+"网络文件上传失败"+e.getMessage());
        }finally {
            shutDown();
        }
        return false;
    }
    public boolean uploadInputstreamObject(InputStream inputStream, String bucketName, String key )     {
        try {
            if (inputStream != null) {
                ObjectMetadata metadata = new ObjectMetadata();
                metadata.setContentLength(inputStream.available());
                PutObjectRequest request = new PutObjectRequest(bucketName, key, inputStream,metadata);
                request.setCannedAcl(CannedAccessControlList.PublicRead);
                PutObjectResult result = client.putObject(request);
                return true;
            }
        }catch (Exception e){
            log.error("对象存储==================== æ–‡ä»¶ä¸Šä¼ å¤±è´¥"+e.getMessage());
        }finally {
            shutDown();
        }
        return false;
    }
}
server/services/src/main/java/com/doumee/dao/business/InterfaceLogMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.doumee.dao.business;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.InterfaceLog;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
public interface InterfaceLogMapper extends BaseMapper<InterfaceLog> {
}
server/services/src/main/java/com/doumee/dao/business/dto/CasesImport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.doumee.dao.business.dto;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
 * å‘˜å·¥ä¿¡æ¯å¯¼å…¥è¡¨
 * @author æ±Ÿè¹„蹄
 * @date 2024/01/16 10:03
 */
@Data
@ApiModel("员工信息导入")
public class CasesImport {
//    @ExcelColumn(name="序号",value = "sn")
    private Integer sn;
    @ExcelColumn(name="姓名",value = "name",index = 1)
    private String name;
    @ExcelColumn(name="手机号",value = "phone",index = 2)
    private String phone;
    @ExcelColumn(name="身份证号",value = "idcardNo",index = 3)
    private String idcardNo;
    @ExcelColumn(name="组织名称" , value = "companyName" ,index = 4)
    private String companyName;
    @ExcelColumn(name="工号" , value = "code")
    private String code;
    @ExcelColumn(name="岗位" , value = "code")
    private String positionName;
}
server/services/src/main/java/com/doumee/dao/business/dto/LoginRequestNewParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.doumee.dao.business.dto;
import lombok.Data;
import java.util.List;
@Data
public class LoginRequestNewParam {
    private String appid;// 1 O æ‰‹æœºå·ç 
    private String user_name;// 1 M ç”¨æˆ·åId
    private String rediUrl;// 1 M ç™»å½•账户;
    private String account_no    ;//String    è´¦å·
    private String scode;//String    ç”¨æˆ·å¯¹åº”加盟商Scode
    private List<RoleRequestParam> roles;// 1 M ç™»å½•密码
}
server/services/src/main/java/com/doumee/dao/business/dto/MemberImport.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,42 @@
package com.doumee.dao.business.dto;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import lombok.Data;
/**
 * å‘˜å·¥ä¿¡æ¯å¯¼å…¥è¡¨
 * @author æ±Ÿè¹„蹄
 * @date 2024/01/16 10:03
 */
@Data
@ApiModel("员工信息导入")
public class MemberImport {
    @ExcelColumn(name="工号",value = "code",index = 1)
    private String code;
    @ExcelColumn(name="姓名",value = "name",index = 2)
    private String name;
    @ExcelColumn(name="职业照",value = "imgurl",index = 3)
    private String imgurl;
    @ExcelColumn(name="等级",value = "levelName",index = 4)
    private String levelName;
    @ExcelColumn(name="性别" , value = "sex" ,index = 5)
    private String sex;
    @ExcelColumn(name="岗位" , value = "position",index = 6)
    private String position;
    @ExcelColumn(name="从业年份(å¹´)" , value = "jobYear",index = 7)
    private String jobYear;
    @ExcelColumn(name="服务战区", value = "zqNames",index = 8)
    private String zqNames;
    @ExcelColumn(name="商业化类型", value = "typeNames",index = 9)
    private String typeNames;
    @ExcelColumn(name="擅长领域", value = "fieldNames",index = 10)
    private String fieldNames;
    @ExcelColumn(name="服务商场数(个)", value = "serveNum",index = 11)
    private String serveNum;
    @ExcelColumn(name="费用标准(元/周)", value = "fee",index = 12)
    private String fee;
    @ExcelColumn(name="老师简介", value = "fee",index = 13)
    private String info;
}
server/services/src/main/java/com/doumee/dao/business/dto/RoleRequestParam.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.doumee.dao.business.dto;
import lombok.Data;
@Data
public class RoleRequestParam {
    private String code;//角色编码
    private String name;// è§’色名称
    private String id;//编码;
}
server/services/src/main/java/com/doumee/dao/business/model/Category.java
@@ -1,16 +1,15 @@
package com.doumee.dao.business.model;
import com.alibaba.fastjson.JSONArray;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.core.model.LoginUserInfo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
@@ -63,8 +62,8 @@
    @ExcelColumn(name="单位名称")
    private String name;
    @ApiModelProperty(value = "类型:0=品种配置;1=车辆类型配置;2=餐标配置;3=手续费配置;", example = "1")
    @ExcelColumn(name="类型:0=品种配置;1=车辆类型配置;2=餐标配置;3=手续费配置;")
    @ApiModelProperty(value = "类型:0=战区;1=商业化;2=擅长领域;3=讲师等级;", example = "1")
    @ExcelColumn(name="类型:0=战区;1=商业化;2=擅长领域;3=讲师等级;")
    private Integer type;
    @ApiModelProperty(value = "内容(车辆规格、餐标、手续费比例)")
@@ -78,15 +77,15 @@
    @ExcelColumn(name="排序码(升序)")
    private Integer sortnum;
    @ApiModelProperty(value = "是否固定车辆(车辆类型使用):0=否;1=是;", example = "1")
    @ExcelColumn(name="是否固定车辆(车辆类型使用):0=否;1=是;")
    @ApiModelProperty(value = "是否固定):0=否;1=是;", example = "1")
    @ExcelColumn(name="是否固定 :0=否;1=是;")
    private Integer isFixed;
    @ApiModelProperty(value = "是否固定车辆(车辆类型使用):0=否;1=是;", example = "1")
    @ApiModelProperty(value = "最后操作人员;", example = "1")
    @TableField(exist = false)
    private String updateUserName;
    @ApiModelProperty(value = "餐标等配置项集合", example = "1")
    @ApiModelProperty(value = "商业化图集附件集合", example = "1")
    @TableField(exist = false)
    private JSONArray detailList;
    private List<Multifile> fileList;
    @ApiModelProperty(value = "图标全路径")
    @TableField(exist = false)
    private String iconFull;
server/services/src/main/java/com/doumee/dao/business/model/ImportRecord.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.dao.business.dto.CasesImport;
import com.doumee.dao.business.dto.MemberImport;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
@@ -9,8 +11,12 @@
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.apache.poi.ss.usermodel.PictureData;
import java.util.Date;
import java.math.BigDecimal;
import java.util.List;
/**
 * åˆ†ç±»ä¿¡æ¯è¡¨Model定义
 * @author doumee
@@ -76,4 +82,12 @@
    @ApiModelProperty("导入失败记录数")
    @ExcelColumn(name="导入失败记录数",index=18 ,width=10)
    private Integer errorNum;
    @TableField(exist = false)
    private List<CasesImport> caseList;
    @TableField(exist = false)
    private List<MemberImport> memberList;
    @TableField(exist = false)
    private  List<PictureData> pictureDataList;
}
server/services/src/main/java/com/doumee/dao/business/model/InterfaceLog.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,98 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
/**
 * ä¸‰æ–¹å¹³å°æŽ¥å£äº¤äº’记录
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Data
@ApiModel("三方平台接口交互记录")
@TableName("`interface_log`")
public class InterfaceLog{
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    @ExcelColumn(name="创建人编码")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="创建时间")
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    @ExcelColumn(name="更新人编码")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    @ExcelColumn(name="更新时间")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    private String remark;
    @ApiModelProperty(value = "类型 0调用 1推送接受", example = "1")
    @ExcelColumn(name="类型 0调用 1推送接受")
    private Integer type;
    @ApiModelProperty(value = "接口名称")
    @ExcelColumn(name="接口名称")
    private String name;
    @ApiModelProperty(value = "地址信息")
    @ExcelColumn(name="地址信息")
    private String url;
    @ApiModelProperty(value = "请求参数")
    @ExcelColumn(name="请求参数")
    private String request;
    @ApiModelProperty(value = "响应参数")
    @ExcelColumn(name="响应参数")
    private String repose;
    @ApiModelProperty(value = "调用结果 0成功 1失败", example = "1")
    @ExcelColumn(name="调用结果 0成功 1失败")
    private Integer success;
    @ApiModelProperty(value = "平台 0海康安防平台 1ERP系统", example = "1")
    @ExcelColumn(name="平台 0海康安防平台 1ERP系统")
    private Integer plat;
    @ApiModelProperty(value = "关联对象类型  0组织 1人员 2门禁事件 3设备", example = "1")
    @ExcelColumn(name="关联对象类型  0组织 1人员 2门禁事件 3设备")
    private Integer objType;
    @ApiModelProperty(value = "关联对象编码(多个用英文逗号隔开)")
    @ExcelColumn(name="关联对象编码(多个用英文逗号隔开)")
    private String objId;
    @ApiModelProperty(value = "开始时间")
    @TableField(exist = false)
    private Date startDate;
    @ApiModelProperty(value = "结束时间")
    @TableField(exist = false)
    private Date endDate;
}
server/services/src/main/java/com/doumee/dao/business/model/Member.java
@@ -11,6 +11,8 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.math.BigDecimal;
import java.util.List;
/**
 * ä¼šå‘˜ä¿¡æ¯è¡¨Model定义
 * @author doumee
@@ -70,6 +72,10 @@
    @ApiModelProperty("商业化类型编码集合([1],[2],...])")
    @ExcelColumn(name="商业化类型编码集合([1],[2],...])",index=16 ,width=10)
    private String bustypeIds;
    @ApiModelProperty("擅长领域集合([1],[2],...])")
    private String fieldIds;
    @ApiModelProperty("工号")
    private String code;
    @ApiModelProperty("讲师等级编码(关联category)")
    @ExcelColumn(name="讲师等级编码(关联category)",index=17 ,width=10)
    private Integer levelId;
@@ -106,4 +112,46 @@
    @ApiModelProperty("导入记录编码(关联import_record)")
    @ExcelColumn(name="导入记录编码(关联import_record)",index=28 ,width=10)
    private Integer importId;
    @ApiModelProperty("工作年数")
    @TableField(exist = false)
    private Integer workYears;
    @ApiModelProperty("擅长领域名称")
    @TableField(exist = false)
    private String fieldNames;
    @ApiModelProperty("工作岗位名称")
    @TableField(exist = false)
    private String promotionName;
    @ApiModelProperty("级别名称")
    @TableField(exist = false)
    private String levelName;
    @ApiModelProperty("战区编码 - æŸ¥è¯¢")
    @TableField(exist = false)
    private String queryZQCode;
    @ApiModelProperty("排序信息:0=收费从高到低;1=收费从低到高;2=等级从高到低;3=等级从低到高;4=服务数从高到低")
    @TableField(exist = false)
    private Integer orderByType;
    @ApiModelProperty("证件照全路径")
    @TableField(exist = false)
    private String fullImgurl;
    @ApiModelProperty("查询用户类型")
    @TableField(exist = false)
    private String queryUserRole;
    @ApiModelProperty("擅长领域")
    @TableField(exist = false)
    private List<Category> fieldList;
    @ApiModelProperty("案例信息")
    @TableField(exist = false)
    private List<Cases> casesList;
}
server/services/src/main/java/com/doumee/dao/business/model/Multifile.java
@@ -53,9 +53,7 @@
    @ApiModelProperty(value = "类型0图片 1视频 2其他", example = "1")
    private Integer type;
//    @ApiModelProperty(value = "关联对象类型 0SHE上报 1跌绊滑上报 2跌绊滑处理 3跌绊滑分配物业主管 4跌绊滑分配处理人 5DCA风险上报 6DCA风险处理 7DCA工单图片", example = "1")
//    @ExcelExportColumn(name="关联对象类型 0SHE上报 1跌绊滑上报 2跌绊滑处理 3跌绊滑分配物业主管 4跌绊滑分配处理人 5DCA风险上报 6DCA风险处理 7DCA工单图片")
    @ApiModelProperty(value = "关联对象类型 0身份申请资料 1订单附件", example = "1")
    @ApiModelProperty(value = "关联对象类型 0商业化类型多图 1案例", example = "1")
    private Integer objType;
    @ApiModelProperty(value = "文件地址")
@@ -66,7 +64,7 @@
  
    @ApiModelProperty(value = "文件地址")
    @TableField(exist = false)
    private String fileurlFull;
    private String url;
    @ApiModelProperty(value = "内网文件地址")
server/services/src/main/java/com/doumee/dao/vo/WebLoginUserVO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.dao.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2026/1/28 10:43
 */
@Data
@ApiModel("H5用户请求返回对象类")
public class WebLoginUserVO {
    @ApiModelProperty(value = "用户主键")
    private String id;
    @ApiModelProperty(value = "用户角色:")
    private String roleType;
    @ApiModelProperty(value = "战区编码")
    private String zhanqu;
}
server/services/src/main/java/com/doumee/service/business/ImportRecordService.java
@@ -3,6 +3,8 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.ImportRecord;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
@@ -94,4 +96,7 @@
     * @return long
     */
    long count(ImportRecord model);
    ImportRecord importBatch(MultipartFile file, int type );
    void dealImporTask(ImportRecord importRecord);
}
server/services/src/main/java/com/doumee/service/business/InterfaceLogService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,100 @@
package com.doumee.service.business;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.InterfaceLog;
import java.util.List;
/**
 * ä¸‰æ–¹å¹³å°æŽ¥å£äº¤äº’记录Service定义
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
public interface InterfaceLogService {
    /**
     * åˆ›å»º
     *
     * @param interfaceLog å®žä½“对象
     * @return Integer
     */
    Integer create(InterfaceLog interfaceLog);
    /**
     * ä¸»é”®åˆ é™¤
     *
     * @param id ä¸»é”®
     */
    void deleteById(Integer id);
    /**
     * åˆ é™¤
     *
     * @param interfaceLog å®žä½“对象
     */
    void delete(InterfaceLog interfaceLog);
    /**
     * æ‰¹é‡ä¸»é”®åˆ é™¤
     *
     * @param ids ä¸»é”®é›†
     */
    void deleteByIdInBatch(List<Integer> ids);
    /**
     * ä¸»é”®æ›´æ–°
     *
     * @param interfaceLog å®žä½“对象
     */
    void updateById(InterfaceLog interfaceLog);
    /**
     * æ‰¹é‡ä¸»é”®æ›´æ–°
     *
     * @param interfaceLogs å®žä½“集
     */
    void updateByIdInBatch(List<InterfaceLog> interfaceLogs);
    /**
     * ä¸»é”®æŸ¥è¯¢
     *
     * @param id ä¸»é”®
     * @return InterfaceLog
     */
    InterfaceLog findById(Integer id);
    /**
     * æ¡ä»¶æŸ¥è¯¢å•条记录
     *
     * @param interfaceLog å®žä½“对象
     * @return InterfaceLog
     */
    InterfaceLog findOne(InterfaceLog interfaceLog);
    void  saveInterfaceLog(String url,String name,String  param,Integer success,String respone,int type);
    /**
     * æ¡ä»¶æŸ¥è¯¢
     *
     * @param interfaceLog å®žä½“对象
     * @return List<InterfaceLog>
     */
    List<InterfaceLog> findList(InterfaceLog interfaceLog);
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param pageWrap åˆ†é¡µå¯¹è±¡
     * @return PageData<InterfaceLog>
     */
    PageData<InterfaceLog> findPage(PageWrap<InterfaceLog> pageWrap);
    /**
     * æ¡ä»¶ç»Ÿè®¡
     *
     * @param interfaceLog å®žä½“对象
     * @return long
     */
    long count(InterfaceLog interfaceLog);
    void clearThreeMonthLog();
}
server/services/src/main/java/com/doumee/service/business/MemberService.java
@@ -3,6 +3,8 @@
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Member;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
@@ -94,4 +96,7 @@
     * @return long
     */
    long count(Member model);
    Member findDetailById(Integer id,String queryUserRole);
}
server/services/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -11,7 +11,9 @@
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.CategoryMapper;
import com.doumee.dao.business.MultifileMapper;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.business.model.Multifile;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.CategoryService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
@@ -28,6 +30,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@@ -42,6 +45,8 @@
    @Autowired
    private CategoryMapper categoryMapper;
    @Autowired
    private MultifileMapper multifileMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
@@ -49,12 +54,11 @@
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public Integer create(Category category) {
//        ç±»åž‹:0=战区;1=商业化;2=擅长领域;3=讲师等级;
        if(Objects.isNull(category)
        || Objects.isNull(category.getType())
        || Objects.isNull(category.getName())
        || (!Constants.equalsInteger(category.getType(),Constants.ZERO)&& CollectionUtils.isEmpty(category.getDetailList()))
        || (Constants.equalsInteger(category.getType(),Constants.ONE) && (Objects.isNull(category.getIcon())||Objects.isNull(category.getIsFixed())) )
        ){
        || (Constants.equalsInteger(category.getType(),Constants.ZERO)&& StringUtils.isBlank(category.getDetail()))   ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
@@ -63,22 +67,40 @@
        category.setCreateUser(loginUserInfo.getId());
        category.setUpdateTime(new Date());
        category.setUpdateUser(loginUserInfo.getId());
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(category.getDetailList())
                && !Constants.equalsInteger(category.getType(),Constants.THREE)){
            category.setDetail(category.getDetailList().toJSONString());
        }
        if(!Constants.equalsInteger(category.getType(),Constants.ONE)){
            category.setIsFixed(Constants.ZERO);
        }
        categoryMapper.insert(category);
        dealBatchMultiFiles(category, category.getFileList(), loginUserInfo,false);
        return category.getId();
    }
    public void dealBatchMultiFiles(Category category, List<Multifile> fileList, LoginUserInfo user,boolean update) {
        Date today = new Date();
        //清空原有的
        if(update){
            multifileMapper.delete(new UpdateWrapper<Multifile>().lambda()
                    .eq(Multifile::getIsdeleted,Constants.ZERO)
                    .eq(Multifile::getObjType,Constants.ZERO)
                    .eq(Multifile::getObjId,category.getId()));
        }
        if(fileList!=null && fileList.size()>0){
            List<Multifile> multifileList = new ArrayList<>();
            fileList.stream().forEach(s -> {
                if(StringUtils.isNotBlank(s.getFileurl())){
                    s.setIsdeleted(Constants.ZERO);
                    s.setCreator(user.getId());
                    s.setCreateDate(today);
                    s.setObjId(category.getId());
                    s.setType(Constants.ZERO);
                    s.setObjType(Constants.ZERO);
                    multifileList.add(s);
                }
            });
            if(multifileList.size()>0){
                multifileMapper.insert(multifileList);
            }
        }
    }
    @Override
    public void deleteById(Integer id) {
        categoryMapper.update(new UpdateWrapper<Category>().lambda().set(Category::getDeleted,Constants.ONE).eq(Category::getId,id));
//        categoryMapper.deleteById(id);
    }
    @Override
@@ -102,8 +124,6 @@
                || Objects.isNull(category.getId())
                || Objects.isNull(category.getType())
                || Objects.isNull(category.getName())
                || (!Constants.equalsInteger(category.getType(),Constants.ZERO)&& CollectionUtils.isEmpty(category.getDetailList()))
                || (Constants.equalsInteger(category.getType(),Constants.ONE) && (Objects.isNull(category.getIcon())||Objects.isNull(category.getIsFixed())) )
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
@@ -111,25 +131,18 @@
        category.setUpdateTime(new Date());
        category.setIsFixed(null);
        category.setUpdateUser(loginUserInfo.getId());
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(category.getDetailList())
                && !Constants.equalsInteger(category.getType(),Constants.THREE)){
            category.setDetail(category.getDetailList().toJSONString());
        }
        categoryMapper.updateById(category);
        dealBatchMultiFiles(category, category.getFileList(), loginUserInfo,true);
    }
    @Override
    public void updateStatus(Category category) {
        if(Objects.isNull(category)
                || Objects.isNull(category.getId())){
        if(Objects.isNull(category) || Objects.isNull(category.getId())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        category.setUpdateTime(new Date());
        category.setIsFixed(null);
        category.setUpdateUser(loginUserInfo.getId());
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(category.getDetailList())){
            category.setDetail(category.getDetailList().toJSONString());
        }
        categoryMapper.updateById(category);
    }
@@ -149,12 +162,9 @@
        if(Objects.isNull(category)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        if(StringUtils.isNotBlank(category.getDetail())){
            category.setDetailList(JSONArray.parseArray(category.getDetail()));
        }
        if(StringUtils.isNotBlank(category.getIcon())){
            String path  = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode();
            String path  = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.CATEGORY_FILES).getCode();
            category.setIconFull(path + category.getIcon());
        }
        return category;
@@ -168,6 +178,7 @@
    @Override
    public List<Category> findList(Category category) {
        category.setDeleted(Constants.ZERO);
        QueryWrapper<Category> wrapper = new QueryWrapper<>(category);
        return categoryMapper.selectList(wrapper);
    }
@@ -225,22 +236,38 @@
        queryWrapper.orderByAsc(Category::getSortnum);
        PageData<Category> result =PageData.from(categoryMapper.selectJoinPage(page, Category.class,queryWrapper));
        if(result!=null && result.getRecords()!=null){
            String path  = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode();
            String path  = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE,Constants.CATEGORY_FILES).getCode();
            for(Category cate : result.getRecords()){
                try {
                    if(StringUtils.isNotBlank(cate.getDetail())){
                        cate.setDetailList(JSONArray.parseArray(cate.getDetail()));
                if(Constants.equalsInteger(cate.getType(),Constants.ONE) ){
                    initMultifileList(cate);
                    }
                    if(StringUtils.isNotBlank(cate.getIcon())){
                        cate.setIconFull(path + cate.getIcon());
                    }
                }catch (Exception e){
                }
            }
        }
        return result;
    }
    private void initMultifileList(Category cate) {
        String path = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.RESOURCE_PATH).getCode()
                + systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.CATEGORY_FILES).getCode();
        Multifile find = new Multifile();
        find.setObjId(cate.getId());
        find.setObjType(Constants.ZERO);
        find.setIsdeleted(Constants.ZERO);
        List<Multifile> fileList=  multifileMapper.selectList(new QueryWrapper<>(find));
        if(fileList!=null){
            for(Multifile f : fileList){
                if(StringUtils.isNotBlank(f.getFileurl())){
                        f.setUrl(path+f.getFileurl());
                }
            }
        }
        cate.setFileList(fileList);
    }
    @Override
@@ -259,12 +286,12 @@
            String path  = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.CATEGORY_FILES).getCode();
            for (Category category:categoryList) {
                if(StringUtils.isNotBlank(category.getDetail())){
                    category.setDetailList(JSONArray.parseArray(category.getDetail()));
                }
                if(StringUtils.isNotBlank(category.getIcon())){
                    category.setIconFull(path + category.getIcon());
                }
                if(Constants.equalsInteger(category.getType(),Constants.ONE) ){
                    initMultifileList(category);
                }
            }
        }
        return categoryList;
server/services/src/main/java/com/doumee/service/business/impl/ImportRecordServiceImpl.java
@@ -1,20 +1,41 @@
package com.doumee.service.business.impl;
import com.doumee.core.annotation.excel.ExcelImporter;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.dto.CasesImport;
import com.doumee.dao.business.dto.MemberImport;
import com.doumee.dao.business.model.ImportRecord;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.ImportRecordMapper;
import com.doumee.dao.business.model.Member;
import com.doumee.service.business.ImportRecordService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
 * åˆ†ç±»ä¿¡æ¯è¡¨Service实现
@@ -26,9 +47,21 @@
    @Autowired
    private ImportRecordMapper importRecordMapper;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;
    @Override
    public Integer create(ImportRecord importRecord) {
        if(StringUtils.isBlank(importRecord.getImgurl())){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        importRecord.setDeleted(Constants.ZERO);
        importRecord.setStatus(Constants.ZERO);
        importRecord.setCreateTime(new Date());
        importRecord.setCreateUser(loginUserInfo.getId());
        importRecord.setUpdateTime(new Date());
        importRecord.setUpdateUser(loginUserInfo.getId());
        importRecordMapper.insert(importRecord);
        return importRecord.getId();
    }
@@ -134,4 +167,106 @@
        QueryWrapper<ImportRecord> wrapper = new QueryWrapper<>(importRecord);
        return importRecordMapper.selectCount(wrapper);
    }
    @Override
    public ImportRecord importBatch(MultipartFile file,int type ){
        Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_RECORD);
        if(importing!=null && importing){
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,已存在导入任务正在执行中,请稍后再试!");
        }
        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_RECORD,true,30, TimeUnit.MINUTES);
        try {
            ImportRecord model = new ImportRecord();
            LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
            model.setDeleted(Constants.ZERO);
            model.setStatus(Constants.ONE);//异步处理中
            model.setCreateTime(new Date());
            model.setCreateUser(loginUserInfo.getId());
            model.setUpdateTime(model.getCreateTime());
            model.setUpdateUser(loginUserInfo.getId());
            model.setType(type);
            model.setTitle((type==1?"案例信息批量导入":"老师信息批量导入")+ DateUtil.getPlusTime2(model.getCreateTime()));
            model.setTotalNum(0);
            ExcelImporter ie= new ExcelImporter(file,0,0, CellType.STRING); // ç¡®ä¿å•元格类型为字符串);
            if(type == 1) {
              model.setCaseList(ie.getDataList(CasesImport.class,null));
              if(model.getCaseList() ==null || model.getCaseList().size()==0){
                  throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"导入文件案例信息内容为空!");
              }
              model.setTotalNum(model.getCaseList().size());
            }else{
              model.setMemberList(ie.getDataList(MemberImport.class,null));
              if(model.getMemberList() ==null || model.getMemberList().size()==0){
                  throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"导入文件老师信息内容为空!");
              }
              model.setTotalNum(model.getMemberList().size());
            }
//            model.setPictureDataList(ie);
            importRecordMapper.insert(model);
            return model;
        }catch (Exception e){
            throw  new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"文件信息读取失败,请检查文件内容后重试!");
        }finally {
            redisTemplate.delete(Constants.RedisKeys.IMPORTING_RECORD);
        }
    }
    /**
     * å¼‚步执行文件任务
     * @param importRecord
     */
    @Override
    @Async
    public void dealImporTask(ImportRecord importRecord){
        int success = 0;
        if(Constants.equalsInteger(importRecord.getType(),0)){
           dealUserImportBiz(importRecord);
        }else{
            dealCaseImportBiz(importRecord);
        }
        importRecord.setStatus(Constants.TWO);
        importRecord.setUpdateTime(new Date());
        importRecordMapper.updateById(importRecord);
    }
    /**
     * å¤„理案例导入任务
     * @param importRecord
     */
    private int dealCaseImportBiz(ImportRecord importRecord) {
        int success=0;
        String msg ="";
        try {
            for(CasesImport param:importRecord.getCaseList()){
            }
        }catch (Exception e){
        }
        importRecord.setDoneNum(success);
        importRecord.setErrorNum(importRecord.getTotalNum() - success);
        return success;
    }
    /**
     * å¤„理人员导入记录
     * @param importRecord
     */
    private int dealUserImportBiz(ImportRecord importRecord) {
        int success=0;
        String msg = "";
        try {
            for(MemberImport param:importRecord.getMemberList()){
            }
        }catch (Exception e){
        }
        importRecord.setDoneNum(success);
        importRecord.setErrorNum(importRecord.getTotalNum() - success);
        importRecord.setDetail(msg);
        return success;
    }
}
server/services/src/main/java/com/doumee/service/business/impl/InterfaceLogServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,191 @@
package com.doumee.service.business.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.InterfaceLogMapper;
import com.doumee.dao.business.model.InterfaceLog;
import com.doumee.service.business.InterfaceLogService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.List;
/**
 * ä¸‰æ–¹å¹³å°æŽ¥å£äº¤äº’记录Service实现
 * @author æ±Ÿè¹„蹄
 * @date 2023/11/30 15:33
 */
@Service
public class InterfaceLogServiceImpl implements InterfaceLogService {
    @Autowired
    private InterfaceLogMapper interfaceLogMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public Integer create(InterfaceLog interfaceLog) {
        interfaceLogMapper.insert(interfaceLog);
        return interfaceLog.getId();
    }
    @Override
    public void deleteById(Integer id) {
        interfaceLogMapper.deleteById(id);
    }
    @Override
    public void delete(InterfaceLog interfaceLog) {
        UpdateWrapper<InterfaceLog> deleteWrapper = new UpdateWrapper<>(interfaceLog);
        interfaceLogMapper.delete(deleteWrapper);
    }
    @Override
    public void deleteByIdInBatch(List<Integer> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return;
        }
        interfaceLogMapper.deleteBatchIds(ids);
    }
    @Override
    public void updateById(InterfaceLog interfaceLog) {
        interfaceLogMapper.updateById(interfaceLog);
    }
    @Override
    public void updateByIdInBatch(List<InterfaceLog> interfaceLogs) {
        if (CollectionUtils.isEmpty(interfaceLogs)) {
            return;
        }
        for (InterfaceLog interfaceLog: interfaceLogs) {
            this.updateById(interfaceLog);
        }
    }
    @Override
    public InterfaceLog findById(Integer id) {
        return interfaceLogMapper.selectById(id);
    }
    @Override
    public InterfaceLog findOne(InterfaceLog interfaceLog) {
        QueryWrapper<InterfaceLog> wrapper = new QueryWrapper<>(interfaceLog);
        return interfaceLogMapper.selectOne(wrapper);
    }
    @Override
    public  void  saveInterfaceLog(String url,String name,String  param,Integer success,String respone,int type){
        if(interfaceLogMapper ==null){
            return;
        }
        InterfaceLog log = new InterfaceLog();
        log.setCreateDate(new Date());
        log.setUrl(url);
        log.setEditDate(log.getCreateDate());
        log.setPlat(Constants.ZERO);
        log.setName(name);
        log.setIsdeleted(Constants.ZERO);
        log.setRequest(param);
        log.setType(type);
        log.setSuccess(success);
        log.setRepose(respone);
        interfaceLogMapper.insert(log);
    }
    @Override
    public List<InterfaceLog> findList(InterfaceLog interfaceLog) {
        QueryWrapper<InterfaceLog> wrapper = new QueryWrapper<>(interfaceLog);
        return interfaceLogMapper.selectList(wrapper);
    }
    @Override
    public PageData<InterfaceLog> findPage(PageWrap<InterfaceLog> pageWrap) {
        IPage<InterfaceLog> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<InterfaceLog> queryWrapper = new QueryWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getId() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getId, pageWrap.getModel().getId());
        }
        if (pageWrap.getModel().getCreator() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getCreator, pageWrap.getModel().getCreator());
        }
        if (pageWrap.getModel().getCreateDate() != null) {
            queryWrapper.lambda().ge(InterfaceLog::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
            queryWrapper.lambda().le(InterfaceLog::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
        }
        if (pageWrap.getModel().getEditor() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getEditor, pageWrap.getModel().getEditor());
        }
        if (pageWrap.getModel().getEditDate() != null) {
            queryWrapper.lambda().ge(InterfaceLog::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
            queryWrapper.lambda().le(InterfaceLog::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
        }
        if (pageWrap.getModel().getStartDate() != null) {
            queryWrapper.lambda().ge(InterfaceLog::getCreateDate, pageWrap.getModel().getStartDate());
        }
        if (pageWrap.getModel().getEndDate() != null) {
            queryWrapper.lambda().le(InterfaceLog::getCreateDate, pageWrap.getModel().getEndDate());
        }
        if (pageWrap.getModel().getIsdeleted() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getIsdeleted, pageWrap.getModel().getIsdeleted());
        }
        if (pageWrap.getModel().getRemark() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getRemark, pageWrap.getModel().getRemark());
        }
        if (pageWrap.getModel().getType() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getType, pageWrap.getModel().getType());
        }
        if (pageWrap.getModel().getName() != null) {
            queryWrapper.lambda().like(InterfaceLog::getName, pageWrap.getModel().getName());
        }
        if (pageWrap.getModel().getUrl() != null) {
            queryWrapper.lambda().like(InterfaceLog::getUrl, pageWrap.getModel().getUrl());
        }
        if (pageWrap.getModel().getRequest() != null) {
            queryWrapper.lambda().like(InterfaceLog::getRequest, pageWrap.getModel().getRequest());
        }
        if (pageWrap.getModel().getRepose() != null) {
            queryWrapper.lambda().like(InterfaceLog::getRepose, pageWrap.getModel().getRepose());
        }
        if (pageWrap.getModel().getSuccess() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getSuccess, pageWrap.getModel().getSuccess());
        }
        if (pageWrap.getModel().getPlat() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getPlat, pageWrap.getModel().getPlat());
        }
        if (pageWrap.getModel().getObjType() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getObjType, pageWrap.getModel().getObjType());
        }
        if (pageWrap.getModel().getObjId() != null) {
            queryWrapper.lambda().eq(InterfaceLog::getObjId, pageWrap.getModel().getObjId());
        }
        queryWrapper.lambda().orderByDesc(InterfaceLog::getCreateDate);
        return PageData.from(interfaceLogMapper.selectPage(page, queryWrapper));
    }
    @Override
    public long count(InterfaceLog interfaceLog) {
        QueryWrapper<InterfaceLog> wrapper = new QueryWrapper<>(interfaceLog);
        return interfaceLogMapper.selectCount(wrapper);
    }
    @Override
    public void clearThreeMonthLog() {
         int days =15;
         try {
//             days = Integer.parseInt(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.HK_LOG_DEL_DAYS_LIMIT).getCode());
         }catch (Exception e){}
          interfaceLogMapper.delete(new UpdateWrapper<InterfaceLog>().lambda()
                  .apply("to_days(create_date)+"+days+" < to_days(now())") );
    }
}
server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -1,20 +1,35 @@
package com.doumee.service.business.impl;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Member;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.MemberMapper;
import com.doumee.service.business.MemberService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.CasesMapper;
import com.doumee.dao.business.CategoryMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.MultifileMapper;
import com.doumee.dao.business.model.Cases;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Multifile;
import com.doumee.service.business.MemberService;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.Date;
import java.util.List;
import java.util.Objects;
/**
 * ä¼šå‘˜ä¿¡æ¯è¡¨Service实现
@@ -26,6 +41,18 @@
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private CategoryMapper categoryMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private CasesMapper casesMapper;
    @Autowired
    private MultifileMapper multifileMapper;
    @Override
    public Integer create(Member member) {
@@ -87,58 +114,147 @@
    @Override
    public PageData<Member> findPage(PageWrap<Member> pageWrap) {
        IPage<Member> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        QueryWrapper<Member> queryWrapper = new QueryWrapper<>();
        MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
               queryWrapper.lambda().eq(pageWrap.getModel().getId() != null,Member::getId, pageWrap.getModel().getId());
               queryWrapper.lambda().eq(pageWrap.getModel().getDeleted() != null,Member::getDeleted, pageWrap.getModel().getDeleted());
               queryWrapper.lambda().eq(pageWrap.getModel().getCreateUser() != null,Member::getCreateUser, pageWrap.getModel().getCreateUser());
             if (pageWrap.getModel().getId() != null) {
                  queryWrapper.lambda().ge(Member::getCreateTime, Utils.Date.getStart(pageWrap.getModel().getCreateTime()));
                  queryWrapper.lambda().le(Member::getCreateTime, Utils.Date.getEnd(pageWrap.getModel().getCreateTime()));
             }
               queryWrapper.lambda().eq(pageWrap.getModel().getUpdateUser() != null,Member::getUpdateUser, pageWrap.getModel().getUpdateUser());
             if (pageWrap.getModel().getId() != null) {
                  queryWrapper.lambda().ge(Member::getUpdateTime, Utils.Date.getStart(pageWrap.getModel().getUpdateTime()));
                  queryWrapper.lambda().le(Member::getUpdateTime, Utils.Date.getEnd(pageWrap.getModel().getUpdateTime()));
             }
               queryWrapper.lambda().eq(pageWrap.getModel().getRemark() != null,Member::getRemark, pageWrap.getModel().getRemark());
               queryWrapper.lambda().eq(pageWrap.getModel().getImgurl() != null,Member::getImgurl, pageWrap.getModel().getImgurl());
               queryWrapper.lambda().eq(pageWrap.getModel().getDingdingId() != null,Member::getDingdingId, pageWrap.getModel().getDingdingId());
               queryWrapper.lambda().eq(pageWrap.getModel().getPhone() != null,Member::getPhone, pageWrap.getModel().getPhone());
               queryWrapper.lambda().eq(pageWrap.getModel().getName() != null,Member::getName, pageWrap.getModel().getName());
               queryWrapper.lambda().eq(pageWrap.getModel().getSex() != null,Member::getSex, pageWrap.getModel().getSex());
               queryWrapper.lambda().eq(pageWrap.getModel().getJobYear() != null,Member::getJobYear, pageWrap.getModel().getJobYear());
               queryWrapper.lambda().eq(pageWrap.getModel().getPositon() != null,Member::getPositon, pageWrap.getModel().getPositon());
               queryWrapper.lambda().eq(pageWrap.getModel().getZhanquIds() != null,Member::getZhanquIds, pageWrap.getModel().getZhanquIds());
               queryWrapper.lambda().eq(pageWrap.getModel().getBustypeIds() != null,Member::getBustypeIds, pageWrap.getModel().getBustypeIds());
               queryWrapper.lambda().eq(pageWrap.getModel().getLevelId() != null,Member::getLevelId, pageWrap.getModel().getLevelId());
               queryWrapper.lambda().eq(pageWrap.getModel().getStatus() != null,Member::getStatus, pageWrap.getModel().getStatus());
               queryWrapper.lambda().eq(pageWrap.getModel().getFee() != null,Member::getFee, pageWrap.getModel().getFee());
               queryWrapper.lambda().eq(pageWrap.getModel().getServeNum() != null,Member::getServeNum, pageWrap.getModel().getServeNum());
               queryWrapper.lambda().eq(pageWrap.getModel().getType() != null,Member::getType, pageWrap.getModel().getType());
               queryWrapper.lambda().eq(pageWrap.getModel().getContent() != null,Member::getContent, pageWrap.getModel().getContent());
             if (pageWrap.getModel().getId() != null) {
                  queryWrapper.lambda().ge(Member::getLoginDate, Utils.Date.getStart(pageWrap.getModel().getLoginDate()));
                  queryWrapper.lambda().le(Member::getLoginDate, Utils.Date.getEnd(pageWrap.getModel().getLoginDate()));
             }
               queryWrapper.lambda().eq(pageWrap.getModel().getLoginCount() != null,Member::getLoginCount, pageWrap.getModel().getLoginCount());
               queryWrapper.lambda().eq(pageWrap.getModel().getSortnum() != null,Member::getSortnum, pageWrap.getModel().getSortnum());
               queryWrapper.lambda().eq(pageWrap.getModel().getUsername() != null,Member::getUsername, pageWrap.getModel().getUsername());
               queryWrapper.lambda().eq(pageWrap.getModel().getAddType() != null,Member::getAddType, pageWrap.getModel().getAddType());
               queryWrapper.lambda().eq(pageWrap.getModel().getImportId() != null,Member::getImportId, pageWrap.getModel().getImportId());
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
                queryWrapper.orderByDesc(sortData.getProperty());
            } else {
                queryWrapper.orderByAsc(sortData.getProperty());
        Member model = pageWrap.getModel();
        queryWrapper.selectAll(Member.class)
                .select(" c1.NAME ", Member::getPromotionName)
                .select(" c2.NAME ", Member::getLevelName)
                .leftJoin(" category c1 on t.POSITON = c1.id ")
                .leftJoin(" category c2 on t.LEVEL_ID = c2.id ")
                .apply(Objects.nonNull(model.getBustypeIds())," find_in_set( '["+model.getBustypeIds()+"]', t.BUSTYPE_IDS ) ")
                .like(StringUtils.isNotBlank(model.getName()),Member::getName, model.getName())
                .eq(Objects.nonNull(model.getStatus()),Member::getStatus, model.getStatus())
                .orderByAsc(Objects.isNull(model.getOrderByType()),"c2.DETAIL")
                .orderByDesc(Objects.nonNull(model.getOrderByType())&&Constants.equalsInteger(model.getOrderByType(), Constants.ZERO),Member::getFee)
                .orderByAsc(Objects.nonNull(model.getOrderByType())&&Constants.equalsInteger(model.getOrderByType(), Constants.ONE),Member::getFee)
                .orderByDesc(Objects.nonNull(model.getOrderByType())&&Constants.equalsInteger(model.getOrderByType(), Constants.TWO),"c2.DETAIL")
                .orderByAsc(Objects.nonNull(model.getOrderByType())&&Constants.equalsInteger(model.getOrderByType(), Constants.THREE),"c2.DETAIL")
                .orderByDesc(Objects.nonNull(model.getOrderByType())&&Constants.equalsInteger(model.getOrderByType(), Constants.FOUR),Member::getServeNum)
        ;
        if(StringUtils.isNotBlank(model.getFieldIds())){
            String [] fieldIds = model.getFieldIds().split(",");
            for (String s:fieldIds) {
                queryWrapper.apply("find_in_set( '["+s+"]' , t.FIELD_IDS )");
            }
        }
        return PageData.from(memberMapper.selectPage(page, queryWrapper));
        if (StringUtils.isNotBlank(model.getQueryZQCode())) {
            Category zhanqu = categoryMapper.selectOne(new QueryWrapper<Category>().lambda()
                    .eq(Category::getDeleted,Constants.ZERO)
                    .eq(Category::getStatus,Constants.ZERO)
                    .eq(Category::getDetail,model.getQueryZQCode())
                    .last(" limit 1")
            );
            if(Objects.nonNull(zhanqu)){
                queryWrapper.apply(" find_in_set( '["+zhanqu.getId()+"]', t.ZHANQU_IDS ) ");
    }
        }
        IPage<Member> memberIPage  = memberMapper.selectJoinPage(page, Member.class, new MPJLambdaWrapper<>());
        if(CollectionUtils.isNotEmpty(memberIPage.getRecords())){
            List<Category> categoryList = categoryMapper.selectList(new QueryWrapper<Category>().lambda()
                    .eq(Category::getDeleted, Constants.ZERO)
                    .eq(Category::getType,Constants.TWO)
                    .orderByAsc(Category::getSortnum)
            );
            String path = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.RESOURCE_PATH).getCode() +
                    systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.CATEGORY_FILES).getCode();
            String roleConfig = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.ROLE_CONFIG).getCode();
            for (Member member:memberIPage.getRecords()) {
                if(CollectionUtils.isNotEmpty(categoryList)){
                    dealMemberField(member,categoryList);
                }
                member.setFullImgurl(StringUtils.isNotBlank(member.getImgurl())?(path + member.getImgurl()):"");
                if(StringUtils.isBlank(roleConfig)||StringUtils.isBlank(model.getQueryUserRole())
                || !roleConfig.contains(model.getQueryUserRole())){
                    member.setFee(null);
                }
               if(member.getJobYear()!=null){
                    member.setWorkYears(DateUtil.getCurrentYear( ) - member.getJobYear()+1);
                }
            }
        }
        return PageData.from(memberIPage);
    }
    @Override
    public Member findDetailById(Integer id,String queryUserRole) {
        Member member = memberMapper.selectJoinOne(Member.class, new MPJLambdaWrapper<Member>()
                .selectAll(Member.class)
                .select(" c1.NAME ", Member::getPromotionName)
                .select(" c2.NAME ", Member::getLevelName)
                .select(" TIMESTAMPDIFF(YEAR, CONCAT(t.JOB_YEAR , '-01-01'), now()) ",Member::getWorkYears)
                .leftJoin(" category c1 on t.POSITON = c1.id ")
                .leftJoin(" category c2 on t.LEVEL_ID = c2.id ")
                .eq(Member::getId, id)
                .last(" limit 1 "));
       if(Objects.isNull(member)){
           throw new BusinessException(ResponseStatus.DATA_EMPTY);
       }
       if(StringUtils.isNotBlank(member.getFieldIds())){
           member.setFieldList(
                   categoryMapper.selectList(new QueryWrapper<Category>().lambda()
                           .eq(Category::getDeleted, Constants.ZERO)
                           .eq(Category::getType,Constants.TWO)
                           .apply(" find_in_set(CONCAT('[',id,']'),'"+member.getFieldIds()+"') ")
                           .orderByAsc(Category::getSortnum)
            )
           );
       }
        String resourcePath = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.RESOURCE_PATH).getCode();
        String path =  systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.CATEGORY_FILES).getCode();
        String roleConfig = systemDictDataBiz.queryByCode(Constants.SYSTEM, Constants.ROLE_CONFIG).getCode();
        member.setFullImgurl(StringUtils.isNotBlank(member.getImgurl())?(resourcePath  + path + member.getImgurl()):"");
        List<Cases> casesList = casesMapper.selectList(new QueryWrapper<Cases>().lambda()
                .eq(Cases::getMemberId,member.getId())
                .eq(Cases::getDeleted,Constants.ZERO)
                .orderByDesc(Cases::getId)
        );
        if(CollectionUtils.isNotEmpty(casesList)){
            String casePath =  systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.CASES_FILES).getCode();
            for (Cases cases:casesList) {
                List<Multifile> multifileList = multifileMapper.selectList(new QueryWrapper<Multifile>().lambda()
                        .eq(Multifile::getObjId,cases.getId())
                        .eq(Multifile::getObjType,Constants.ONE)
                        .eq(Multifile::getIsdeleted,Constants.ZERO)
                        .orderByDesc(Multifile::getId)
                );
                multifileList.forEach(multifile -> {
                    multifile.setUrl(StringUtils.isNotBlank(multifile.getFileurl())?(resourcePath  + casePath + multifile.getFileurl()):"");
                });
            }
            member.setCasesList(casesList);
        }
        if(StringUtils.isBlank(roleConfig)||StringUtils.isBlank(queryUserRole)
                || !roleConfig.contains(queryUserRole)){
            member.setFee(null);
        }
        return member;
    }
    public void dealMemberField(Member member,List<Category> categoryList){
        if(CollectionUtils.isNotEmpty(categoryList)){
            return;
        }
        String fieldNames = "";
        for (Category category:categoryList) {
            if(member.getFieldIds().contains("["+category.getId()+"]")){
                fieldNames = fieldNames + (StringUtils.isNotBlank(fieldNames)?",":"") + category.getName();
            }
        }
        member.setFieldNames(fieldNames);
    }
    @Override
    public long count(Member member) {
        QueryWrapper<Member> wrapper = new QueryWrapper<>(member);
        return memberMapper.selectCount(wrapper);
    }
}
server/services/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -10,6 +10,7 @@
import com.doumee.service.system.SystemLoginLogService;
import com.doumee.service.system.SystemLoginService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
@@ -27,6 +28,11 @@
    @Value("${project.version}")
    private String systemVersion;
    /**
     *   # çŽ¯å¢ƒï¼Œç”Ÿäº§çŽ¯å¢ƒproduction,开发环境development
     */
    @Value("${project.env}")
    private String projectEnv;
    @Autowired
    private CaptchaService captchaService;
@@ -46,6 +52,7 @@
        loginLog.setClientInfo(Utils.User_Client.getBrowser(request));
        loginLog.setOsInfo(Utils.User_Client.getOS(request));
        loginLog.setServerIp(Utils.Server.getIP());
        if(StringUtils.equals(projectEnv,"development")){
        // æ ¡éªŒéªŒè¯ç 
        try {
            captchaService.check(dto.getUuid(), dto.getCode());
@@ -56,6 +63,7 @@
            systemLoginLogService.create(loginLog);
            throw e;
        }
        }
        // æ ¡éªŒç”¨æˆ·åå’Œå¯†ç 
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(dto.getUsername(), dto.getPassword());
server/services/src/main/resources/application-dev.yml
@@ -69,9 +69,6 @@
    username: admin
    password: 111111
qiwei:
  serviceurl: https://qyapi.weixin.qq.com
aes:
  encrypt:
    open: true # æ˜¯å¦å¼€å¯åР坆 true  or  false
@@ -83,5 +80,10 @@
upload:
  type: ftp
project:
  # çŽ¯å¢ƒï¼Œç”Ÿäº§çŽ¯å¢ƒproduction,开发环境development
  env: development
  # æ¨¡å¼ï¼Œtesting测试模式
  mode: testing
server/services/src/main/resources/application-pro.yml
@@ -1,9 +1,9 @@
spring:
  # æ•°æ®æºé…ç½®
  datasource:
    url: jdbc:mysql://b66cc1a382964a6a9d46a522f2dfe672in01.internal.cn-south-1.mysql.rds.myhuaweicloud.com:3306/jinkuai?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    url: jdbc:mysql://192.168.0.211:3306/zbom_dianjiang?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
    username: root
    password: Jinkuai!@#$%^
    password: Doumee@168
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
  redis:
@@ -49,46 +49,12 @@
    enable: true
    username: admin
    password: doumee@168
########################微信支付相关配置########################
wx:
  pay:
    #服务商---------start------- å‚数详解地址 https://pay.weixin.qq.com/doc/v3/partner/4013080340
    mchId: 1700071922    #服务商在微信支付侧的唯一身份标识
    appId: wx6cc1087ca79db7f6    #服务商在微信开放平台(移动应用)或公众平台(公众号/小程序)上申请的一个唯一标识
    apiV3Key: 0a056faa107c2b2944b9d6a9aa6d4142 #7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    serialNumer: 6696086F6EFB8D6A4F821BD47DDBAF75C3BC1209 #38495CE0137D90E4DC4F64F7ECDE035A35470BE3 #服务商证书序列号
    payPublicKeyId: PUB_KEY_ID_0117000719222024112700219100000508 #商户/平台支付公钥id
    #mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
    notifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wxPayNotify
    refundNotifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wxRefundNotify
    keyPath: /usr/local/jars/payFile/apiclient_cert.p12
    privateCertPath: /usr/local/jars/payFile/apiclient_cert.pem
    privateKeyPath: /usr/local/jars/payFile/apiclient_key.pem
    pubKeyPath: /usr/local/jars/payFile/pub_key.pem #商户支付公钥
    #服务商-------------end---
    #商户信息
    wechatSerialNumer: 12C0F0DD0F3D2B565B45586D3FEA225EBF723BEC
    wechatPayPublicKeyId: PUB_KEY_ID_0117233260692025072500181939000603 #商户/平台支付公钥id
    wechatPubKeyPath: /usr/local/jars/payFile/shanghu/pub_key.pem #商户支付公钥
    wechatPrivateKeyPath: /usr/local/jars/payFile/shanghu/apiclient_key.pem #商户私钥
    wechatNotifyUrl: https://jinkuai.832smartfarm.com/jinkuai_admin/web/wechat/transferNotify #商户转账回调地址
    wechatApiV3Key: 7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    existsSub: 1
    appSecret:
    #子商户------------start----
    subMchId: 1723326069    #子商户号
    subAppId: wx332441ae5b12be7d #小程序id
    subAppSecret: add86d6406f5c14501ac5bbb1a60e004 #小程序秘钥
    #子商户------------end----
    #      mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
    typeId: jinkuai
upload:
  type: blob
qiwei:
  serviceurl: https://wecom-qyapi.unilever-china.com/
project:
  # çŽ¯å¢ƒï¼Œç”Ÿäº§çŽ¯å¢ƒproduction,开发环境development
  env: production
  # æ¨¡å¼ï¼Œtesting测试模式
  mode: production
server/services/src/main/resources/application-test.yml
@@ -69,48 +69,13 @@
    username: admin
    password: 111111
########################微信支付相关配置########################
########################微信支付相关配置########################
wx:
  pay:
    #服务商---------start------- å‚数详解地址 https://pay.weixin.qq.com/doc/v3/partner/4013080340
    mchId: 1700071922    #服务商在微信支付侧的唯一身份标识
    appId: wx6cc1087ca79db7f6    #服务商在微信开放平台(移动应用)或公众平台(公众号/小程序)上申请的一个唯一标识
    apiV3Key: 0a056faa107c2b2944b9d6a9aa6d4142 #7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    serialNumer: 6696086F6EFB8D6A4F821BD47DDBAF75C3BC1209 #38495CE0137D90E4DC4F64F7ECDE035A35470BE3 #服务商证书序列号
    payPublicKeyId: PUB_KEY_ID_0117000719222024112700219100000508 #商户/平台支付公钥id
    #mchKey: W97N53Q71326D6JZ2E9HY5M4VT4BAC8S
    notifyUrl: https://test.doumee.cn/zbom_dianjiang_admin/web/wxPayNotify
    refundNotifyUrl: https://test.doumee.cn/zbom_dianjiang_admin/web/wxRefundNotify
    keyPath: /usr/local/jars/payFile/apiclient_cert.p12
    privateCertPath: /usr/local/jars/payFile/apiclient_cert.pem
    privateKeyPath: /usr/local/jars/payFile/apiclient_key.pem
    pubKeyPath: /usr/local/jars/payFile/pub_key.pem #商户支付公钥
    #服务商-------------end---
    #商户信息
    wechatSerialNumer: 12C0F0DD0F3D2B565B45586D3FEA225EBF723BEC
    wechatPayPublicKeyId: PUB_KEY_ID_0117233260692025072500181939000603 #商户/平台支付公钥id
    wechatPubKeyPath: /usr/local/jars/payFile/shanghu/pub_key.pem #商户支付公钥
    wechatPrivateKeyPath: /usr/local/jars/payFile/shanghu/apiclient_key.pem #商户私钥
    wechatNotifyUrl: https://test.doumee.cn/jinkuai_admin/web/wechat/transferNotify #商户转账回调地址
    wechatApiV3Key: 7tG4Vk9Zp2L8dXw5Jq0N3hR6yE1sF3cB
    existsSub: 1
    appSecret:
    #子商户------------start----
    subMchId: 1723326069    #子商户号
    subAppId: wx332441ae5b12be7d #小程序id
    subAppSecret: add86d6406f5c14501ac5bbb1a60e004 #小程序秘钥
    #子商户------------end----
    #      mchKey: u4TSNtv0wFP7WRfnxBgijYOtRhS9FvlM
    typeId: jinkuai
upload:
  type: blob
qiwei:
  serviceurl: https://qyapi.weixin.qq.com
project:
  # çŽ¯å¢ƒï¼Œç”Ÿäº§çŽ¯å¢ƒproduction,开发环境development
  env: production
  # æ¨¡å¼ï¼Œtesting测试模式
  mode: testing
server/web/src/main/java/com/doumee/DJWebApplication.java
@@ -22,9 +22,4 @@
        ApplicationContext context = SpringApplication.run(DJWebApplication.class);
        context.getEnvironment();
    }
//    @Override
//    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
//        return builder.sources(JKWebApplication.class) ;
//    }
}
server/web/src/main/java/com/doumee/api/web/ApiController.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONObject;
import com.doumee.config.jwt.JwtTokenUtil;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.vo.WebLoginUserVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
@@ -39,10 +40,10 @@
     * èŽ·å–ç™»å½•ç”¨æˆ·å¯¹è±¡ä¿¡æ¯
     * @return
     */
    protected Member getMemberResponse(){
    protected WebLoginUserVO getMemberResponse(){
        Object obj = this.getRequest().getAttribute(JwtTokenUtil.MEMBER_INFO);
        if(obj != null){
            return JSONObject.parseObject(obj.toString(),Member.class);
            return JSONObject.parseObject(obj.toString(), WebLoginUserVO.class);
        }
        return null;
    }
server/web/src/main/java/com/doumee/api/web/LoginController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,161 @@
package com.doumee.api.web;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.doumee.api.BaseController;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.config.annotation.LoginRequired;
import com.doumee.config.jwt.JwtTokenUtil;
import com.doumee.core.annotation.excel.ExcelExporter;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.constants.Constants;
import com.doumee.core.model.ApiResponse;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.HttpsUtil;
import com.doumee.dao.business.dto.LoginRequestNewParam;
import com.doumee.dao.business.model.Category;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.system.model.SystemJob;
import com.doumee.dao.vo.WebLoginUserVO;
import com.doumee.service.business.CategoryService;
import com.doumee.service.business.MemberService;
import com.sun.deploy.net.HttpUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2025/07/09 12:00
 */
@Api(tags = "web登录相关接口")
@Trace(exclude = true)
@RestController
@RequestMapping("/web/login")
@Slf4j
public class LoginController extends ApiController {
    @Autowired
    private CategoryService categoryService;
    @Autowired
    private JwtTokenUtil jwtTokenUtil;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private MemberService memberService;
    @ApiOperation("UK单点登录")
    @GetMapping("/ukLogin")
    public void ukLogin(String tick, Object obj, HttpServletRequest request, HttpServletResponse response) throws Exception  {
        LoginRequestNewParam requestParam = new LoginRequestNewParam();
        /*// UK_ERROR_URL = "http://u.zhibang.com/sso/web/token/error";
        String errorUrl =systemDictDataBiz.queryByCode(Constants.ZBOM_PARAM,Constants.ZBOM_UK_ERROR_URL).getCode();
        try {
            log.error("请求参数TICK最原始===========:" + tick);
            JSONObject urlParams = new JSONObject();
            log.info("请求参数:" + JSON.toJSONString(urlParams));
            //TICKET_LOGIN_TEST = "http://testsso.zhibang.com:8080/esc-idm/api/v1/getUserInfo";
            //TICKET_LOGIN = "https://sso.zbom.com/esc-idm/api/v1/getUserInfo";
            String url  = systemDictDataBiz.queryByCode(Constants.ZBOM_PARAM,Constants.ZBOM_TICKET_LOGIN_URL).getCode() + "?tick=" +  URLEncoder.encode(tick,Constants.UTF);
            String post =  HttpsUtil.get(url,true);
            log.info("返回参数:" + post);
            JSONObject json = JSONObject.parseObject(post);
            if (StringUtils.equals(json.getString("code"), "0")) {
                JSONObject userInfo = json.getJSONObject("data");
                requestParam = JSONObject.toJavaObject(userInfo, LoginRequestNewParam.class);
            } else {
                log.error("案例库系统单点登录失败 é”™è¯¯åŽŸå› èŽ·å–tick失败" + json.getString("message"));
                response.sendRedirect(errorUrl + "?title=" + enCode("登陆错误") + "&msg="+ enCode(json.getString("message")));
                return;
            }
        } catch (Exception e) {
            log.error("ticket接口请求错误:" + e.getMessage());
            response.sendRedirect(errorUrl + "?title=" + enCode("登陆错误") + "&msg=" + enCode("系统繁忙,请稍后重试~"));
            return;
        }*/
        requestParam.setRediUrl("http://localhost:10087/#/login");
        WebLoginUserVO loginUserVO = new WebLoginUserVO();
        loginUserVO.setId("123");
        loginUserVO.setRoleType("admin");
        loginUserVO.setZhanqu("1");
        String token = jwtTokenUtil.generateToken(loginUserVO);
        response.sendRedirect(requestParam.getRediUrl()+"?token="+token);
    }
    private String enCode(String string) {
        // TODO Auto-generated method stub
        String str = "";
        try {
            str = java.net.URLEncoder.encode(string, "utf-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return str;
    }
    @LoginRequired
    @ApiOperation("老师分页查询")
    @PostMapping("/memberPage")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<PageData<Member>> memberPage(@RequestBody PageWrap<Member> pageWrap) {
        WebLoginUserVO loginUserVO = this.getMemberResponse();
        pageWrap.getModel().setQueryUserRole(loginUserVO.getRoleType());
        pageWrap.getModel().setQueryZQCode(loginUserVO.getZhanqu());
        return ApiResponse.success(memberService.findPage(pageWrap));
    }
    @LoginRequired
    @ApiOperation("老师详情")
    @GetMapping("/memberDetail")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<Member> memberPage(@RequestParam Integer id) {
        WebLoginUserVO loginUserVO = this.getMemberResponse();
        return ApiResponse.success(memberService.findDetailById(id,loginUserVO.getRoleType()));
    }
    @LoginRequired
    @ApiOperation("分类信息查询")
    @GetMapping("/categoryList")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<List<Category>> categoryList(@RequestParam Integer type) {
        return ApiResponse.success(categoryService.getCategoryList(type));
    }
}
server/web/src/main/resources/application.yml
@@ -3,16 +3,12 @@
  port: 10011
# é¡¹ç›®ä¿¡æ¯é…ç½®
project:
  name: è¿‘å¿«
  name: å¿—邦点将
  version: 1.0.0
  # çŽ¯å¢ƒï¼Œç”Ÿäº§çŽ¯å¢ƒproduction,开发环境development
  env: development
  # æ¨¡å¼ï¼Œtesting测试模式
  mode: testing
spring:
  profiles:
    active: pro
    active: dev
  # JSON返回配置
  jackson:
    # é»˜è®¤æ—¶åŒº