瀏覽代碼

阿里云短信服务对接、个人项目列表查询、退出登录等

bihuisong 1 年之前
父節點
當前提交
d3ba6ac18f
共有 25 個文件被更改,包括 805 次插入3924 次删除
  1. 1 1
      ssp-admin-vue3/.env.development
  2. 12 2826
      ssp-admin-vue3/package-lock.json
  3. 1 1
      ssp-client-vue3/.env.development
  4. 2 843
      ssp-client-vue3/package-lock.json
  5. 14 1
      ssp-server/pom.xml
  6. 18 1
      ssp-server/src/main/java/com/pj/home/HomeController.java
  7. 6 1
      ssp-server/src/main/java/com/pj/project/sys_client_visit/SysClientVisit.java
  8. 10 0
      ssp-server/src/main/java/com/pj/project/sys_client_visit/SysClientVisitController.java
  9. 6 0
      ssp-server/src/main/java/com/pj/project/sys_client_visit/SysClientVisitMapper.java
  10. 13 2
      ssp-server/src/main/java/com/pj/project/sys_client_visit/SysClientVisitMapper.xml
  11. 91 0
      ssp-server/src/main/java/com/pj/utils/SmsUtil.java
  12. 37 0
      ssp-server/src/main/java/com/pj/utils/ValidateCodeUtils.java
  13. 100 95
      ssp-server/src/main/java/com/pj/utils/VcUtil.java
  14. 二進制
      ssp-server/src/main/resources/static/logo.png
  15. 二進制
      ssp-server/src/main/resources/static/sa-res/images/home-bg.jpg
  16. 二進制
      ssp-server/src/main/resources/static/sa-res/images/home-btn.png
  17. 二進制
      ssp-server/src/main/resources/static/sa-res/images/login-bg.jpg
  18. 二進制
      ssp-server/src/main/resources/static/sa-res/images/login-box-bg.png
  19. 二進制
      ssp-server/src/main/resources/static/sa-res/images/login-header.png
  20. 二進制
      ssp-server/src/main/resources/static/sa-res/images/logo-sj.png
  21. 二進制
      ssp-server/src/main/resources/static/sa-res/images/user-info.png
  22. 310 39
      ssp-server/src/main/resources/static/sa-res/login.css
  23. 135 109
      ssp-server/src/main/resources/static/sa-res/login.js
  24. 43 4
      ssp-server/src/main/resources/templates/home.html
  25. 6 1
      ssp-server/src/main/resources/templates/login.html

+ 1 - 1
ssp-admin-vue3/.env.development

@@ -4,4 +4,4 @@
 VITE_PUBLIC_PATH=/
 
 # 后台接口地址 
-VITE_SERVER_URL=http://192.168.10.12:3000
+VITE_SERVER_URL=http://localhost:3000

文件差異過大導致無法顯示
+ 12 - 2826
ssp-admin-vue3/package-lock.json


+ 1 - 1
ssp-client-vue3/.env.development

@@ -1,4 +1,4 @@
 # 环境变量(开发环境)
 
 # 后台接口地址 
-VITE_SERVER_URL=http://sa-sso-client1.com:9001
+VITE_SERVER_URL=http://localhost:9001

+ 2 - 843
ssp-client-vue3/package-lock.json

@@ -1,848 +1,8 @@
 {
   "name": "ssp-client-vue3",
   "version": "0.0.0",
-  "lockfileVersion": 2,
+  "lockfileVersion": 1,
   "requires": true,
-  "packages": {
-    "": {
-      "name": "ssp-client-vue3",
-      "version": "0.0.0",
-      "dependencies": {
-        "axios": "^1.1.3",
-        "vue": "^3.2.41",
-        "vue-router": "^4.1.6"
-      },
-      "devDependencies": {
-        "@vitejs/plugin-vue": "^3.2.0",
-        "vite": "^3.2.0"
-      }
-    },
-    "node_modules/@babel/parser": {
-      "version": "7.19.6",
-      "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.19.6.tgz",
-      "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==",
-      "bin": {
-        "parser": "bin/babel-parser.js"
-      },
-      "engines": {
-        "node": ">=6.0.0"
-      }
-    },
-    "node_modules/@esbuild/android-arm": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.15.12.tgz",
-      "integrity": "sha512-IC7TqIqiyE0MmvAhWkl/8AEzpOtbhRNDo7aph47We1NbE5w2bt/Q+giAhe0YYeVpYnIhGMcuZY92qDK6dQauvA==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@esbuild/linux-loong64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.15.12.tgz",
-      "integrity": "sha512-tZEowDjvU7O7I04GYvWQOS4yyP9E/7YlsB0jjw1Ycukgr2ycEzKyIk5tms5WnLBymaewc6VmRKnn5IJWgK4eFw==",
-      "cpu": [
-        "loong64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/@vitejs/plugin-vue": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz",
-      "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==",
-      "dev": true,
-      "engines": {
-        "node": "^14.18.0 || >=16.0.0"
-      },
-      "peerDependencies": {
-        "vite": "^3.0.0",
-        "vue": "^3.2.25"
-      }
-    },
-    "node_modules/@vue/compiler-core": {
-      "version": "3.2.41",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.41.tgz",
-      "integrity": "sha512-oA4mH6SA78DT+96/nsi4p9DX97PHcNROxs51lYk7gb9Z4BPKQ3Mh+BLn6CQZBw857Iuhu28BfMSRHAlPvD4vlw==",
-      "dependencies": {
-        "@babel/parser": "^7.16.4",
-        "@vue/shared": "3.2.41",
-        "estree-walker": "^2.0.2",
-        "source-map": "^0.6.1"
-      }
-    },
-    "node_modules/@vue/compiler-dom": {
-      "version": "3.2.41",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.41.tgz",
-      "integrity": "sha512-xe5TbbIsonjENxJsYRbDJvthzqxLNk+tb3d/c47zgREDa/PCp6/Y4gC/skM4H6PIuX5DAxm7fFJdbjjUH2QTMw==",
-      "dependencies": {
-        "@vue/compiler-core": "3.2.41",
-        "@vue/shared": "3.2.41"
-      }
-    },
-    "node_modules/@vue/compiler-sfc": {
-      "version": "3.2.41",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.41.tgz",
-      "integrity": "sha512-+1P2m5kxOeaxVmJNXnBskAn3BenbTmbxBxWOtBq3mQTCokIreuMULFantBUclP0+KnzNCMOvcnKinqQZmiOF8w==",
-      "dependencies": {
-        "@babel/parser": "^7.16.4",
-        "@vue/compiler-core": "3.2.41",
-        "@vue/compiler-dom": "3.2.41",
-        "@vue/compiler-ssr": "3.2.41",
-        "@vue/reactivity-transform": "3.2.41",
-        "@vue/shared": "3.2.41",
-        "estree-walker": "^2.0.2",
-        "magic-string": "^0.25.7",
-        "postcss": "^8.1.10",
-        "source-map": "^0.6.1"
-      }
-    },
-    "node_modules/@vue/compiler-ssr": {
-      "version": "3.2.41",
-      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.41.tgz",
-      "integrity": "sha512-Y5wPiNIiaMz/sps8+DmhaKfDm1xgj6GrH99z4gq2LQenfVQcYXmHIOBcs5qPwl7jaW3SUQWjkAPKMfQemEQZwQ==",
-      "dependencies": {
-        "@vue/compiler-dom": "3.2.41",
-        "@vue/shared": "3.2.41"
-      }
-    },
-    "node_modules/@vue/devtools-api": {
-      "version": "6.4.5",
-      "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.4.5.tgz",
-      "integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ=="
-    },
-    "node_modules/@vue/reactivity": {
-      "version": "3.2.41",
-      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.41.tgz",
-      "integrity": "sha512-9JvCnlj8uc5xRiQGZ28MKGjuCoPhhTwcoAdv3o31+cfGgonwdPNuvqAXLhlzu4zwqavFEG5tvaoINQEfxz+l6g==",
-      "dependencies": {
-        "@vue/shared": "3.2.41"
-      }
-    },
-    "node_modules/@vue/reactivity-transform": {
-      "version": "3.2.41",
-      "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.41.tgz",
-      "integrity": "sha512-mK5+BNMsL4hHi+IR3Ft/ho6Za+L3FA5j8WvreJ7XzHrqkPq8jtF/SMo7tuc9gHjLDwKZX1nP1JQOKo9IEAn54A==",
-      "dependencies": {
-        "@babel/parser": "^7.16.4",
-        "@vue/compiler-core": "3.2.41",
-        "@vue/shared": "3.2.41",
-        "estree-walker": "^2.0.2",
-        "magic-string": "^0.25.7"
-      }
-    },
-    "node_modules/@vue/runtime-core": {
-      "version": "3.2.41",
-      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.41.tgz",
-      "integrity": "sha512-0LBBRwqnI0p4FgIkO9q2aJBBTKDSjzhnxrxHYengkAF6dMOjeAIZFDADAlcf2h3GDALWnblbeprYYpItiulSVQ==",
-      "dependencies": {
-        "@vue/reactivity": "3.2.41",
-        "@vue/shared": "3.2.41"
-      }
-    },
-    "node_modules/@vue/runtime-dom": {
-      "version": "3.2.41",
-      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.41.tgz",
-      "integrity": "sha512-U7zYuR1NVIP8BL6jmOqmapRAHovEFp7CSw4pR2FacqewXNGqZaRfHoNLQsqQvVQ8yuZNZtxSZy0FFyC70YXPpA==",
-      "dependencies": {
-        "@vue/runtime-core": "3.2.41",
-        "@vue/shared": "3.2.41",
-        "csstype": "^2.6.8"
-      }
-    },
-    "node_modules/@vue/server-renderer": {
-      "version": "3.2.41",
-      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.41.tgz",
-      "integrity": "sha512-7YHLkfJdTlsZTV0ae5sPwl9Gn/EGr2hrlbcS/8naXm2CDpnKUwC68i1wGlrYAfIgYWL7vUZwk2GkYLQH5CvFig==",
-      "dependencies": {
-        "@vue/compiler-ssr": "3.2.41",
-        "@vue/shared": "3.2.41"
-      },
-      "peerDependencies": {
-        "vue": "3.2.41"
-      }
-    },
-    "node_modules/@vue/shared": {
-      "version": "3.2.41",
-      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.41.tgz",
-      "integrity": "sha512-W9mfWLHmJhkfAmV+7gDjcHeAWALQtgGT3JErxULl0oz6R6+3ug91I7IErs93eCFhPCZPHBs4QJS7YWEV7A3sxw=="
-    },
-    "node_modules/asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
-    },
-    "node_modules/axios": {
-      "version": "1.1.3",
-      "resolved": "https://registry.npmmirror.com/axios/-/axios-1.1.3.tgz",
-      "integrity": "sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==",
-      "dependencies": {
-        "follow-redirects": "^1.15.0",
-        "form-data": "^4.0.0",
-        "proxy-from-env": "^1.1.0"
-      }
-    },
-    "node_modules/combined-stream": {
-      "version": "1.0.8",
-      "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz",
-      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dependencies": {
-        "delayed-stream": "~1.0.0"
-      },
-      "engines": {
-        "node": ">= 0.8"
-      }
-    },
-    "node_modules/csstype": {
-      "version": "2.6.21",
-      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-2.6.21.tgz",
-      "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w=="
-    },
-    "node_modules/delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
-      "engines": {
-        "node": ">=0.4.0"
-      }
-    },
-    "node_modules/esbuild": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.15.12.tgz",
-      "integrity": "sha512-PcT+/wyDqJQsRVhaE9uX/Oq4XLrFh0ce/bs2TJh4CSaw9xuvI+xFrH2nAYOADbhQjUgAhNWC5LKoUsakm4dxng==",
-      "dev": true,
-      "hasInstallScript": true,
-      "bin": {
-        "esbuild": "bin/esbuild"
-      },
-      "engines": {
-        "node": ">=12"
-      },
-      "optionalDependencies": {
-        "@esbuild/android-arm": "0.15.12",
-        "@esbuild/linux-loong64": "0.15.12",
-        "esbuild-android-64": "0.15.12",
-        "esbuild-android-arm64": "0.15.12",
-        "esbuild-darwin-64": "0.15.12",
-        "esbuild-darwin-arm64": "0.15.12",
-        "esbuild-freebsd-64": "0.15.12",
-        "esbuild-freebsd-arm64": "0.15.12",
-        "esbuild-linux-32": "0.15.12",
-        "esbuild-linux-64": "0.15.12",
-        "esbuild-linux-arm": "0.15.12",
-        "esbuild-linux-arm64": "0.15.12",
-        "esbuild-linux-mips64le": "0.15.12",
-        "esbuild-linux-ppc64le": "0.15.12",
-        "esbuild-linux-riscv64": "0.15.12",
-        "esbuild-linux-s390x": "0.15.12",
-        "esbuild-netbsd-64": "0.15.12",
-        "esbuild-openbsd-64": "0.15.12",
-        "esbuild-sunos-64": "0.15.12",
-        "esbuild-windows-32": "0.15.12",
-        "esbuild-windows-64": "0.15.12",
-        "esbuild-windows-arm64": "0.15.12"
-      }
-    },
-    "node_modules/esbuild-android-64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.15.12.tgz",
-      "integrity": "sha512-MJKXwvPY9g0rGps0+U65HlTsM1wUs9lbjt5CU19RESqycGFDRijMDQsh68MtbzkqWSRdEtiKS1mtPzKneaAI0Q==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-android-arm64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.15.12.tgz",
-      "integrity": "sha512-Hc9SEcZbIMhhLcvhr1DH+lrrec9SFTiRzfJ7EGSBZiiw994gfkVV6vG0sLWqQQ6DD7V4+OggB+Hn0IRUdDUqvA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "android"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-darwin-64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.15.12.tgz",
-      "integrity": "sha512-qkmqrTVYPFiePt5qFjP8w/S+GIUMbt6k8qmiPraECUWfPptaPJUGkCKrWEfYFRWB7bY23FV95rhvPyh/KARP8Q==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-darwin-arm64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.12.tgz",
-      "integrity": "sha512-z4zPX02tQ41kcXMyN3c/GfZpIjKoI/BzHrdKUwhC/Ki5BAhWv59A9M8H+iqaRbwpzYrYidTybBwiZAIWCLJAkw==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-freebsd-64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.12.tgz",
-      "integrity": "sha512-XFL7gKMCKXLDiAiBjhLG0XECliXaRLTZh6hsyzqUqPUf/PY4C6EJDTKIeqqPKXaVJ8+fzNek88285krSz1QECw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-freebsd-arm64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.12.tgz",
-      "integrity": "sha512-jwEIu5UCUk6TjiG1X+KQnCGISI+ILnXzIzt9yDVrhjug2fkYzlLbl0K43q96Q3KB66v6N1UFF0r5Ks4Xo7i72g==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "freebsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-32": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.15.12.tgz",
-      "integrity": "sha512-uSQuSEyF1kVzGzuIr4XM+v7TPKxHjBnLcwv2yPyCz8riV8VUCnO/C4BF3w5dHiVpCd5Z1cebBtZJNlC4anWpwA==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.15.12.tgz",
-      "integrity": "sha512-QcgCKb7zfJxqT9o5z9ZUeGH1k8N6iX1Y7VNsEi5F9+HzN1OIx7ESxtQXDN9jbeUSPiRH1n9cw6gFT3H4qbdvcA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-arm": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.15.12.tgz",
-      "integrity": "sha512-Wf7T0aNylGcLu7hBnzMvsTfEXdEdJY/hY3u36Vla21aY66xR0MS5I1Hw8nVquXjTN0A6fk/vnr32tkC/C2lb0A==",
-      "cpu": [
-        "arm"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-arm64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.12.tgz",
-      "integrity": "sha512-HtNq5xm8fUpZKwWKS2/YGwSfTF+339L4aIA8yphNKYJckd5hVdhfdl6GM2P3HwLSCORS++++7++//ApEwXEuAQ==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-mips64le": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.12.tgz",
-      "integrity": "sha512-Qol3+AvivngUZkTVFgLpb0H6DT+N5/zM3V1YgTkryPYFeUvuT5JFNDR3ZiS6LxhyF8EE+fiNtzwlPqMDqVcc6A==",
-      "cpu": [
-        "mips64el"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-ppc64le": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.12.tgz",
-      "integrity": "sha512-4D8qUCo+CFKaR0cGXtGyVsOI7w7k93Qxb3KFXWr75An0DHamYzq8lt7TNZKoOq/Gh8c40/aKaxvcZnTgQ0TJNg==",
-      "cpu": [
-        "ppc64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-riscv64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.12.tgz",
-      "integrity": "sha512-G9w6NcuuCI6TUUxe6ka0enjZHDnSVK8bO+1qDhMOCtl7Tr78CcZilJj8SGLN00zO5iIlwNRZKHjdMpfFgNn1VA==",
-      "cpu": [
-        "riscv64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-linux-s390x": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.12.tgz",
-      "integrity": "sha512-Lt6BDnuXbXeqSlVuuUM5z18GkJAZf3ERskGZbAWjrQoi9xbEIsj/hEzVnSAFLtkfLuy2DE4RwTcX02tZFunXww==",
-      "cpu": [
-        "s390x"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "linux"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-netbsd-64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.12.tgz",
-      "integrity": "sha512-jlUxCiHO1dsqoURZDQts+HK100o0hXfi4t54MNRMCAqKGAV33JCVvMplLAa2FwviSojT/5ZG5HUfG3gstwAG8w==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "netbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-openbsd-64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.12.tgz",
-      "integrity": "sha512-1o1uAfRTMIWNOmpf8v7iudND0L6zRBYSH45sofCZywrcf7NcZA+c7aFsS1YryU+yN7aRppTqdUK1PgbZVaB1Dw==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "openbsd"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-sunos-64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.15.12.tgz",
-      "integrity": "sha512-nkl251DpoWoBO9Eq9aFdoIt2yYmp4I3kvQjba3jFKlMXuqQ9A4q+JaqdkCouG3DHgAGnzshzaGu6xofGcXyPXg==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "sunos"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-windows-32": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.15.12.tgz",
-      "integrity": "sha512-WlGeBZHgPC00O08luIp5B2SP4cNCp/PcS+3Pcg31kdcJPopHxLkdCXtadLU9J82LCfw4TVls21A6lilQ9mzHrw==",
-      "cpu": [
-        "ia32"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-windows-64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.15.12.tgz",
-      "integrity": "sha512-VActO3WnWZSN//xjSfbiGOSyC+wkZtI8I4KlgrTo5oHJM6z3MZZBCuFaZHd8hzf/W9KPhF0lY8OqlmWC9HO5AA==",
-      "cpu": [
-        "x64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/esbuild-windows-arm64": {
-      "version": "0.15.12",
-      "resolved": "https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.12.tgz",
-      "integrity": "sha512-Of3MIacva1OK/m4zCNIvBfz8VVROBmQT+gRX6pFTLPngFYcj6TFH/12VveAqq1k9VB2l28EoVMNMUCcmsfwyuA==",
-      "cpu": [
-        "arm64"
-      ],
-      "dev": true,
-      "optional": true,
-      "os": [
-        "win32"
-      ],
-      "engines": {
-        "node": ">=12"
-      }
-    },
-    "node_modules/estree-walker": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
-      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
-    },
-    "node_modules/follow-redirects": {
-      "version": "1.15.2",
-      "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.2.tgz",
-      "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==",
-      "engines": {
-        "node": ">=4.0"
-      },
-      "peerDependenciesMeta": {
-        "debug": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/form-data": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz",
-      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
-      "dependencies": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "^1.0.8",
-        "mime-types": "^2.1.12"
-      },
-      "engines": {
-        "node": ">= 6"
-      }
-    },
-    "node_modules/fsevents": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz",
-      "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
-      "dev": true,
-      "hasInstallScript": true,
-      "optional": true,
-      "os": [
-        "darwin"
-      ],
-      "engines": {
-        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
-      }
-    },
-    "node_modules/function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
-      "dev": true
-    },
-    "node_modules/has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "dev": true,
-      "dependencies": {
-        "function-bind": "^1.1.1"
-      },
-      "engines": {
-        "node": ">= 0.4.0"
-      }
-    },
-    "node_modules/is-core-module": {
-      "version": "2.11.0",
-      "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.11.0.tgz",
-      "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==",
-      "dev": true,
-      "dependencies": {
-        "has": "^1.0.3"
-      }
-    },
-    "node_modules/magic-string": {
-      "version": "0.25.9",
-      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz",
-      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
-      "dependencies": {
-        "sourcemap-codec": "^1.4.8"
-      }
-    },
-    "node_modules/mime-db": {
-      "version": "1.52.0",
-      "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz",
-      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/mime-types": {
-      "version": "2.1.35",
-      "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz",
-      "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "dependencies": {
-        "mime-db": "1.52.0"
-      },
-      "engines": {
-        "node": ">= 0.6"
-      }
-    },
-    "node_modules/nanoid": {
-      "version": "3.3.4",
-      "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.4.tgz",
-      "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
-      "bin": {
-        "nanoid": "bin/nanoid.cjs"
-      },
-      "engines": {
-        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
-      }
-    },
-    "node_modules/path-parse": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz",
-      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
-      "dev": true
-    },
-    "node_modules/picocolors": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz",
-      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
-    },
-    "node_modules/postcss": {
-      "version": "8.4.18",
-      "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.18.tgz",
-      "integrity": "sha512-Wi8mWhncLJm11GATDaQKobXSNEYGUHeQLiQqDFG1qQ5UTDPTEvKw0Xt5NsTpktGTwLps3ByrWsBrG0rB8YQ9oA==",
-      "dependencies": {
-        "nanoid": "^3.3.4",
-        "picocolors": "^1.0.0",
-        "source-map-js": "^1.0.2"
-      },
-      "engines": {
-        "node": "^10 || ^12 || >=14"
-      }
-    },
-    "node_modules/proxy-from-env": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
-      "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
-    },
-    "node_modules/resolve": {
-      "version": "1.22.1",
-      "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.1.tgz",
-      "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==",
-      "dev": true,
-      "dependencies": {
-        "is-core-module": "^2.9.0",
-        "path-parse": "^1.0.7",
-        "supports-preserve-symlinks-flag": "^1.0.0"
-      },
-      "bin": {
-        "resolve": "bin/resolve"
-      }
-    },
-    "node_modules/rollup": {
-      "version": "2.79.1",
-      "resolved": "https://registry.npmmirror.com/rollup/-/rollup-2.79.1.tgz",
-      "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
-      "dev": true,
-      "bin": {
-        "rollup": "dist/bin/rollup"
-      },
-      "engines": {
-        "node": ">=10.0.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      }
-    },
-    "node_modules/source-map": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz",
-      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/source-map-js": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz",
-      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
-      "engines": {
-        "node": ">=0.10.0"
-      }
-    },
-    "node_modules/sourcemap-codec": {
-      "version": "1.4.8",
-      "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
-      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA=="
-    },
-    "node_modules/supports-preserve-symlinks-flag": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
-      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
-      "dev": true,
-      "engines": {
-        "node": ">= 0.4"
-      }
-    },
-    "node_modules/vite": {
-      "version": "3.2.0",
-      "resolved": "https://registry.npmmirror.com/vite/-/vite-3.2.0.tgz",
-      "integrity": "sha512-Ovj7+cqIdM1I0LPCk2CWxzgADXMix3NLXpUT6g7P7zg/a9grk/TaC3qn9YMg7w7M0POIVCBOp1aBANJW+RH7oA==",
-      "dev": true,
-      "dependencies": {
-        "esbuild": "^0.15.9",
-        "postcss": "^8.4.18",
-        "resolve": "^1.22.1",
-        "rollup": "^2.79.1"
-      },
-      "bin": {
-        "vite": "bin/vite.js"
-      },
-      "engines": {
-        "node": "^14.18.0 || >=16.0.0"
-      },
-      "optionalDependencies": {
-        "fsevents": "~2.3.2"
-      },
-      "peerDependencies": {
-        "less": "*",
-        "sass": "*",
-        "stylus": "*",
-        "sugarss": "*",
-        "terser": "^5.4.0"
-      },
-      "peerDependenciesMeta": {
-        "less": {
-          "optional": true
-        },
-        "sass": {
-          "optional": true
-        },
-        "stylus": {
-          "optional": true
-        },
-        "sugarss": {
-          "optional": true
-        },
-        "terser": {
-          "optional": true
-        }
-      }
-    },
-    "node_modules/vue": {
-      "version": "3.2.41",
-      "resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.41.tgz",
-      "integrity": "sha512-uuuvnrDXEeZ9VUPljgHkqB5IaVO8SxhPpqF2eWOukVrBnRBx2THPSGQBnVRt0GrIG1gvCmFXMGbd7FqcT1ixNQ==",
-      "dependencies": {
-        "@vue/compiler-dom": "3.2.41",
-        "@vue/compiler-sfc": "3.2.41",
-        "@vue/runtime-dom": "3.2.41",
-        "@vue/server-renderer": "3.2.41",
-        "@vue/shared": "3.2.41"
-      }
-    },
-    "node_modules/vue-router": {
-      "version": "4.1.6",
-      "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.6.tgz",
-      "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==",
-      "dependencies": {
-        "@vue/devtools-api": "^6.4.5"
-      },
-      "peerDependencies": {
-        "vue": "^3.2.0"
-      }
-    }
-  },
   "dependencies": {
     "@babel/parser": {
       "version": "7.19.6",
@@ -867,8 +27,7 @@
       "version": "3.2.0",
       "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz",
       "integrity": "sha512-E0tnaL4fr+qkdCNxJ+Xd0yM31UwMkQje76fsDVBBUCoGOUPexu2VDUYHL8P4CwV+zMvWw6nlRw19OnRKmYAJpw==",
-      "dev": true,
-      "requires": {}
+      "dev": true
     },
     "@vue/compiler-core": {
       "version": "3.2.41",

+ 14 - 1
ssp-server/pom.xml

@@ -17,6 +17,7 @@
 		<java.version>1.8</java.version>
 		<maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
 		<sa-token.version>1.34.0</sa-token.version>
+		<alibaba.version>1.2.47</alibaba.version>
 		<!-- 主类地址,一定要配置,否则打包时运行会出错 -->
 		<java.run.main.class>com.pj.SspServerApplication</java.run.main.class>
 	</properties>
@@ -146,7 +147,19 @@
         	<artifactId>spring-boot-configuration-processor</artifactId>
         	<optional>true</optional>
         </dependency>
-        
+		<!-- 阿里云短信服务 -->
+		<dependency>
+			<groupId>com.aliyun</groupId>
+			<artifactId>dysmsapi20170525</artifactId>
+			<version>2.0.10</version>
+		</dependency>
+		<!-- 阿里JSON解析器 -->
+		<dependency>
+			<groupId>com.alibaba</groupId>
+			<artifactId>fastjson</artifactId>
+			<version>${alibaba.version}</version>
+		</dependency>
+
 	</dependencies>
 
 

+ 18 - 1
ssp-server/src/main/java/com/pj/home/HomeController.java

@@ -3,15 +3,25 @@ package com.pj.home;
 import cn.dev33.satoken.context.SaHolder;
 import cn.dev33.satoken.stp.StpUtil;
 import com.pj.current.satoken.StpUserUtil;
+import com.pj.project.sys_client_visit.SysClientVisit;
+import com.pj.project.sys_client_visit.SysClientVisitMapper;
+import com.pj.project.sys_user.SysUserMapper;
+import com.pj.project.sys_user_acc.SysUserAccUtil;
+import com.pj.utils.so.SoMap;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 import org.springframework.web.servlet.ModelAndView;
 
+import java.util.List;
+
 /**
  * SSO 平台中心模式示例,跳连接进入子系统
  */
 @RestController
 public class HomeController {
+    @Autowired
+    SysClientVisitMapper sysClientVisitMapper;
     // 平台化首页
     @RequestMapping("/home")
     public Object index() {
@@ -19,6 +29,13 @@ public class HomeController {
         if(!StpUserUtil.isLogin()) {
             return SaHolder.getResponse().redirect("/sso/auth");
         }
-        return new ModelAndView("home.html");
+        ModelAndView modelAndView = new ModelAndView("home.html");
+        SoMap so = SoMap.getRequestSoMap();
+        so.set("userId",StpUserUtil.getLoginId());
+        so.set("pageSize",1000);
+        List<SysClientVisit> list = sysClientVisitMapper.getByUserId(so.startPage());
+        modelAndView.addObject("userInfo",SysUserAccUtil.getUserById(Long.valueOf(StpUserUtil.getLoginId().toString())));
+        modelAndView.addObject("dataSource",list);
+        return modelAndView;
     }
 }

+ 6 - 1
ssp-server/src/main/java/com/pj/project/sys_client_visit/SysClientVisit.java

@@ -75,7 +75,12 @@ public class SysClientVisit implements Serializable {
 	/**
 	 * 用户头像 
 	 */
-	private String sysUserAvatar;	
+	private String sysUserAvatar;
+
+	/**
+	 * 应用介绍
+	 */
+	private String intro;
 
 
 

+ 10 - 0
ssp-server/src/main/java/com/pj/project/sys_client_visit/SysClientVisitController.java

@@ -2,8 +2,10 @@ package com.pj.project.sys_client_visit;
 
 import java.util.List;
 
+import com.pj.current.satoken.StpUserUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
+import org.springframework.ui.Model;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
@@ -93,5 +95,13 @@ public class SysClientVisitController {
 		List<SysClientVisit> list = sysClientVisitMapper.getList(so.startPage());
 		return AjaxJson.getPageData(so.getDataCount(), list);
 	}
+
+	/** 查集合 - 根据用户id  */
+	@RequestMapping("getByUserId")
+	public AjaxJson getByUserId() {
+		SoMap so = SoMap.getRequestSoMap();
+		List<SysClientVisit> list = sysClientVisitMapper.getByUserId(so.startPage());
+		return AjaxJson.getPageData(so.getDataCount(), list);
+	}
 	
 }

+ 6 - 0
ssp-server/src/main/java/com/pj/project/sys_client_visit/SysClientVisitMapper.java

@@ -71,4 +71,10 @@ public interface SysClientVisitMapper {
 	 */
 	List<SysClientVisit> getList(SoMap so);
 
+	/**
+	 * 查 - 根据用户id
+	 * @return 实体对象
+	 */
+	List<SysClientVisit> getByUserId(SoMap so);
+
 }

+ 13 - 2
ssp-server/src/main/java/com/pj/project/sys_client_visit/SysClientVisitMapper.xml

@@ -54,7 +54,8 @@
 			sys_client.name as sys_client_name, 
 			sys_client.logo as sys_client_logo, 
 			sys_user.username as sys_user_username, 
-			sys_user.avatar as sys_user_avatar 
+			sys_user.avatar as sys_user_avatar,
+			sys_client.intro as intro
 		from sys_client_visit cv
 			left join sys_client on client_id = sys_client.id 
 			left join sys_user on user_id = sys_user.id 
@@ -95,5 +96,15 @@
 		</where>
 		order by id desc
 	</select>
-	
+
+	<!-- 查 - 根据用户id  -->
+	<select id="getByUserId" resultMap="model">
+		<include refid="select_sql"></include>
+		<where>
+			<if test=' this.has("userId") '> and cv.user_id = #{userId} </if>
+			and cv.visit = 1
+			and sys_client.is_public = 1
+		</where>
+		order by id desc
+	</select>
 </mapper>

+ 91 - 0
ssp-server/src/main/java/com/pj/utils/SmsUtil.java

@@ -0,0 +1,91 @@
+package com.pj.utils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.dysmsapi20170525.Client;
+import com.aliyun.dysmsapi20170525.models.SendSmsRequest;
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
+import com.aliyun.teaopenapi.models.Config;
+import com.aliyun.teautil.models.RuntimeOptions;
+import lombok.extern.slf4j.Slf4j;
+
+
+@Slf4j
+public class SmsUtil {
+
+    private static String accessKeyId = "LTAI5tHbXfyx584B99kqkRrZ";
+
+    private static String accessKeySecret = "puoQbirs9PQFwijyWL0y8ByJMvXBIW";
+
+    private static String sigName = "毕会松个人播客";
+
+    private static String templateCode = "SMS_464500362";
+
+    public static String getAccessKeyId() {
+        return accessKeyId;
+    }
+
+    public static void setAccessKeyId(String accessKeyId) {
+        SmsUtil.accessKeyId = accessKeyId;
+    }
+
+    public static String getAccessKeySecret() {
+        return accessKeySecret;
+    }
+
+    public static void setAccessKeySecret(String accessKeySecret) {
+        SmsUtil.accessKeySecret = accessKeySecret;
+    }
+
+    public static String getSigName() {
+        return sigName;
+    }
+
+    public static void setSigName(String sigName) {
+        SmsUtil.sigName = sigName;
+    }
+
+    public static String getTemplateCode() {
+        return templateCode;
+    }
+
+    public static void setTemplateCode(String templateCode) {
+        SmsUtil.templateCode = templateCode;
+    }
+
+    /**
+     * 使用AK&SK初始化账号Client
+     *
+     * @return Client
+     * @throws Exception
+     */
+    public static Client createClient() throws Exception {
+        Config config = new Config()
+                .setAccessKeyId(accessKeyId)
+                .setAccessKeySecret(accessKeySecret);
+        return new Client(config);
+    }
+
+    /**
+     * 发送 验证码
+     */
+    public static SendSmsResponse send(String phone, String verifyCode) {
+        JSONObject json = new JSONObject();
+        json.put("code", verifyCode);
+        String templateParam = JSONObject.toJSONString(json);
+        SendSmsRequest sendSmsRequest = new SendSmsRequest()
+                .setSignName(sigName)
+                .setTemplateCode(templateCode)
+                .setPhoneNumbers(phone)
+                .setTemplateParam(templateParam);
+        RuntimeOptions runtime = new RuntimeOptions();
+        SendSmsResponse sr = null;
+        try {
+            Client client = createClient();
+            sr = client.sendSmsWithOptions(sendSmsRequest, runtime);
+        } catch (Exception e) {
+            log.error("阿里云短信服务发送失败:{}",new RuntimeException(e));
+            throw new RuntimeException(e);
+        }
+        return sr;
+    }
+}

+ 37 - 0
ssp-server/src/main/java/com/pj/utils/ValidateCodeUtils.java

@@ -0,0 +1,37 @@
+package com.pj.utils;
+
+import java.util.Random;
+
+public class ValidateCodeUtils {
+    /**
+     * 随机生成验证码
+     *
+     * @param length 长度为6位
+     * @return
+     */
+    public static Integer generateValidateCode(int length) {
+        Integer code = null;
+        if (length == 6) {
+            code = new Random().nextInt(999999);//生成随机数,最大为999999
+            if (code < 100000) {
+                code = code + 100000;//保证随机数为6位数字
+            }
+        } else {
+            throw new RuntimeException("只能生成6位数字验证码");
+        }
+        return code;
+    }
+
+    /**
+     * 随机生成指定长度字符串验证码
+     *
+     * @param length 长度
+     * @return
+     */
+    public static String generateValidateCode4String(int length) {
+        Random rdm = new Random();
+        String hash1 = Integer.toHexString(rdm.nextInt());
+        String capstr = hash1.substring(0, length);
+        return capstr;
+    }
+}

+ 100 - 95
ssp-server/src/main/java/com/pj/utils/VcUtil.java

@@ -1,5 +1,6 @@
 package com.pj.utils;
 
+import com.aliyun.dysmsapi20170525.models.SendSmsResponse;
 import com.pj.utils.cache.RedisUtil;
 import com.pj.utils.sg.AjaxError;
 import com.pj.utils.sg.IpCheckUtil;
@@ -8,104 +9,108 @@ import com.pj.utils.sg.NbUtil;
 
 /**
  * 封装一下手机验证码的相关逻辑 ,包括:验证,防重发,防ip频繁等等
- * @author kong
  *
+ * @author kong
  */
 public class VcUtil {
 
-	// --------------------- 对接短信登录,只需更改以下两个方法的代码即可 start --------------------- 
-	
-	/**
-	 * 对接第三方平台发送验证码,发送成功返回true,失败返回false 
-	 * @param phone 手机号
-	 * @param vc 验证码 
-	 * @return 是否成功发送 
-	 */
-	private static boolean sendVc(String phone, String vc) {
-		// ... 发送验证码 
-		return true;
-	}
-	
-	/**
-	 * 随机生成一个验证码 
-	 * @return 验证码 
-	 */
-	private static String randomVc() {
-		return "123456"; 
-//		return NbUtil.getcolde();
-	}
-	
-	// --------------------- end --------------------- 
-	
-
-	/**
-	 * 验证码存活时长,单位分钟
-	 */
-	final static int ckc_time = 30;
-
-	// 用不同 type 隔离不同业务
-	public final static String USER_LOGIN = "VC_USER_LOGIN:";		// 用户登录 
-	public final static String USER_UPDATE_PWD = "VC_USER_UPDATE_PWD:";		// 用户更改密码 
-	
-	
-	/**
-	 * 发送一个验证码 (号码有效性、防重复发送、防ip频繁)
-	 * @param type 业务type 
-	 * @param phone 手机号 
-	 */
-	public static void send(String type, String phone) {
-		// 先验证
-		if(NbUtil.isPhone(phone) == false){
-			throw new AjaxError("无效手机号码");
-		}
-		// 防重发
-		if(RedisUtil.get(type + phone) != null){
-			throw new AjaxError("该手机号验证码已发送,请注意查收");
-		}
-		// 校验ip是否频繁访问 
-		IpCheckUtil.checkRes("user-login-send-vc", 30); 
-
-		// 开始发送
-		String number = randomVc();
-		boolean bool = sendVc(phone, number);
-		if(bool){
-			// 存入redis 
-			RedisUtil.setByMINUTES(type + phone, number, ckc_time);
-			// 记录IP
-			IpCheckUtil.setNow("user-login-send-vc");	
-			return;
-		}
-		throw new AjaxError("验证码发送失败");
-	}
-
-	/**
-	 * 校验一个手机号的验证码是否正确 
-	 * @param type 业务类型 
-	 * @param phone 手机号
-	 * @param number 验证码 
-	 */
-	public static void check(String type, String phone, String number) {
-		// 验证手机号
-		if(NbUtil.isPhone(phone) == false) {
-			throw new AjaxError("请输入一个正确的手机号码");
-		}
-		// 校验短信码
-		String vc = RedisUtil.get(type + phone);
-		if(vc == null){
-			throw new AjaxError("验证码错误.");
-		}
-		if(vc.equals(number) == false) {
-			throw new AjaxError("验证码错误");
-		}
-	}
-	
-	/**
-	 * 删除指定手机号的验证码 
-	 * @param type 业务类型 
-	 * @param phone 手机号
-	 */
-	public static void delete(String type, String phone) {
-		RedisUtil.del(type + phone);
-	}
+    // --------------------- 对接短信登录,只需更改以下两个方法的代码即可 start ---------------------
+
+    /**
+     * 对接第三方平台发送验证码,发送成功返回true,失败返回false
+     *
+     * @param phone 手机号
+     * @param vc    验证码
+     * @return 是否成功发送
+     */
+    private static boolean sendVc(String phone, String vc) {
+        SendSmsResponse send = SmsUtil.send(phone, vc);
+        return !send.body.code.equals("OK");
+    }
+
+    /**
+     * 随机生成一个验证码
+     *
+     * @return 验证码
+     */
+    private static String randomVc(String phone) {
+        return ValidateCodeUtils.generateValidateCode(6).toString();
+    }
+
+    // --------------------- end ---------------------
+
+
+    /**
+     * 验证码存活时长,单位分钟
+     */
+    final static int ckc_time = 1;
+
+    // 用不同 type 隔离不同业务
+    public final static String USER_LOGIN = "VC_USER_LOGIN:";        // 用户登录
+    public final static String USER_UPDATE_PWD = "VC_USER_UPDATE_PWD:";        // 用户更改密码
+
+
+    /**
+     * 发送一个验证码 (号码有效性、防重复发送、防ip频繁)
+     *
+     * @param type  业务type
+     * @param phone 手机号
+     */
+    public static void send(String type, String phone) {
+        // 先验证
+        if (!NbUtil.isPhone(phone)) {
+            throw new AjaxError("无效手机号码");
+        }
+        // 防重发
+        if (RedisUtil.get(type + phone) != null) {
+            throw new AjaxError("该手机号验证码已发送,请注意查收");
+        }
+        // 校验ip是否频繁访问
+        IpCheckUtil.checkRes("user-login-send-vc", 30);
+
+        // 开始发送
+        String number = randomVc(phone);
+        boolean bool = sendVc(phone, number);
+        if (bool) {
+            // 存入redis
+            RedisUtil.setByMINUTES(type + phone, number, ckc_time);
+            // 记录IP
+            IpCheckUtil.setNow("user-login-send-vc");
+            return;
+        }
+        throw new AjaxError("验证码发送失败");
+    }
+
+    /**
+     * 校验一个手机号的验证码是否正确
+     *
+     * @param type   业务类型
+     * @param phone  手机号
+     * @param number 验证码
+     */
+    public static void check(String type, String phone, String number) {
+        // 验证手机号
+        if (!NbUtil.isPhone(phone)) {
+            throw new AjaxError("请输入一个正确的手机号码");
+        }
+        // 校验短信码
+        String vc = RedisUtil.get(type + phone);
+        if (vc == null) {
+            throw new AjaxError("验证码已过期,请重新获取验证码");
+        }
+        if (!vc.equals(number)) {
+            throw new AjaxError("验证码错误");
+        }
+    }
+
+    /**
+     * 删除指定手机号的验证码
+     *
+     * @param type  业务类型
+     * @param phone 手机号
+     */
+    public static void delete(String type, String phone) {
+        RedisUtil.del(type + phone);
+    }
 
 }

二進制
ssp-server/src/main/resources/static/logo.png


二進制
ssp-server/src/main/resources/static/sa-res/images/home-bg.jpg


二進制
ssp-server/src/main/resources/static/sa-res/images/home-btn.png


二進制
ssp-server/src/main/resources/static/sa-res/images/login-bg.jpg


二進制
ssp-server/src/main/resources/static/sa-res/images/login-box-bg.png


二進制
ssp-server/src/main/resources/static/sa-res/images/login-header.png


二進制
ssp-server/src/main/resources/static/sa-res/images/logo-sj.png


二進制
ssp-server/src/main/resources/static/sa-res/images/user-info.png


+ 310 - 39
ssp-server/src/main/resources/static/sa-res/login.css

@@ -1,57 +1,328 @@
-*{margin: 0; padding: 0;}
-body{font-family: Helvetica Neue,Helvetica,PingFang SC,Tahoma,Arial,sans-serif;}
-::-webkit-input-placeholder{color: #ccc;}
+* {
+  margin: 0;
+  padding: 0;
+}
+body {
+  font-family: Helvetica Neue, Helvetica, PingFang SC, Tahoma, Arial, sans-serif;
+}
+::-webkit-input-placeholder {
+  color: #ccc;
+}
 
 /* 视图盒子 */
-.view-box{position: relative; width: 100vw; height: 100vh; overflow: hidden; background-size: 100% 100%;}
-/* .view-box{background: radial-gradient(220% 105% at top center, #091F67 0%, #2E3E9C 40%, #2E3E9C 80%, #000035);} */
-.view-box{background: radial-gradient(220% 105% at top center, #AFB6C0 0%, #F0F5F1 40%, #F0F5F1 80%, #F0F5F1);}
-
-
+.view-box {
+  position: relative;
+  width: 100vw;
+  height: 100vh;
+  overflow: hidden;
+  background: url(images/login-bg.jpg) no-repeat;
+  background-size: 100% 100%;
+}
 
+/* 头部 */
+.login-header {
+  position: absolute;
+  top: 0;
+  width: 100%;
+  height: 84px;
+  background: url(images/login-header.png) no-repeat;
+  background-size: 100% 100%;
+  text-align: center;
+  font-size: 34px;
+  color: #fff;
+  font-weight: bolder;
+  display: flex;
+  padding-top: 10px;
+  justify-content: center;
+  z-index: 1000;
+}
+.login-h-text {
+    background-image: linear-gradient(180deg, #ffffff, #0c8eff);
+    background-clip:text;
+    color: transparent;
+}
+.login-header-img {
+  margin-top: 6px;
+  margin-right: 10px;
+  width: 40px;
+  height: 40px;
+}
 
 /* 登录盒子 */
 /* .login-box{width: 400px; height: 400px; position: absolute; left: calc(50% - 200px); top: calc(50% - 200px); max-width: 90%; } */
-.login-box{width: 400px; margin: auto; max-width: 90%; height: 100%;text-align: center;}
+.login-box {
+  width: 663px;
+  margin: auto;
+  max-width: 90%;
+  height: 100%;
+  text-align: center;
+}
 
 /* logo */
-.logo-box{padding-top: 10vh; height: 150px; line-height: 150px;} 
-.logo-box img{height: 100px; margin-right: 20px;} 
-
+.logo-box {
+  height: 150px;
+  line-height: 150px;
+}
+.logo-box img {
+  height: 100px;
+  margin-right: 20px;
+}
+.login-tit {
+  width: 50%;
+  height: 64px;
+  line-height: 64px;
+  text-align: left;
+  margin-top: 26px;
+  margin-left: 20px;
+  font-size: 24px;
+  font-weight: bolder;
+  color: #90c8ff;
+  float: left;
+}
 /* 表单 */
-.from-box{ padding: 20px 0px; background-color: #FFF; border-radius: 0px; transition: all 0.2s; /* box-shadow: 1px 1px 20px #666; */}
-.from-box>*{padding: 0px 50px;}
-.from-title{margin-top: 20px; margin-bottom: 30px; text-align: left;}
+.from-box {
+  height: 597px;
+  background: url(images/login-box-bg.png) no-repeat;
+  border-radius: 0px;
+  transition: all 0.2s;
+  background-size: cover;
+}
+.from-box > * {
+  padding: 0px 80px;
+}
+.from-title {
+  margin-top: 40px;
+  margin-bottom: 40px;
+  text-align: left;
+  float: left;
+}
+.tab-box {
+}
+.tab-box > span {
+  cursor: pointer;
+  display: inline-block;
+  margin-right: 10px;
+  font-size: 17px; /* letter-spacing: 1px; */
+  color: #90c8ff;
+}
+.tab-box > span.nat-tab {
+  font-weight: bold;
+}
+.title-border {
+  width: 68px;
+  height: 3px;
+  margin-top: 5px;
+  background-color: #0084ff;
+  border-radius: 5px;
+  transform: translate3d(0px, 0px, 0px);
+  transition: all 0.2s;
+}
+.title-border-2 {
+  transform: translate3d(83px, 0px, 0px);
+}
 
-.tab-box>span{cursor: pointer; display: inline-block; margin-right: 10px; font-size: 17px;/* letter-spacing: 1px; */}
-.tab-box>span.nat-tab{font-weight: bold;}
-.title-border{width: 68px; height: 3px; margin-top: 5px; background-color: #0084FF; border-radius: 5px; transform: translate3d(0px, 0px, 0px); transition: all 0.2s;}
-.title-border-2{transform: translate3d(83px, 0px, 0px);}
-
-.login-dev,.reg-dev{display: none;}
-.native{display: block;}
+.login-dev,
+.reg-dev {
+  display: none;
+}
+.native {
+  display: block;
+}
 
 /* 输入框 */
-.from-item{border: 0px #000 solid; margin-bottom: 15px;}
-.s-input{width: 100%; line-height: 40px; height: 40px; text-indent: 1em; outline: 0; border: 1px #ccc solid; border-radius: 0px; transition: all 0.2s;}
-.s-input{font-size: 12px;}
-.s-input:focus{border-color: #409eff}
-[name=vc]{width: 200px;}
-.send-vc{font-size: 14px; color: #666; float: right; line-height: 40px;}
-.send-vc a{cursor: pointer; color: #409EFF;}
-.send-vc a:hover{text-decoration: underline;}
+.from-item {
+  border: 0px #000 solid;
+  margin-bottom: 40px;
+}
+.s-input {
+  width: 100%;
+  line-height: 50px;
+  color: #90c8ff;
+  height: 50px;
+  text-indent: 1em;
+  outline: 0;
+  border: 1px #4982c8 solid;
+  border-radius: 0px;
+  transition: all 0.2s;
+  background: rgba(26, 61, 102, 0.8);
+}
+.s-input {
+  font-size: 18px;
+}
+.s-input:focus {
+  border-color: #409eff;
+}
+[name="vc"] {
+  width: 200px;
+}
+.send-vc {
+  font-size: 14px;
+  color: #666;
+  float: right;
+  line-height: 40px;
+}
+.send-vc a {
+  cursor: pointer;
+  color: #409eff;
+}
+.send-vc a:hover {
+  text-decoration: underline;
+}
 
 /* 登录按钮 */
-.s-btn{ text-indent: 0;font-size: 14px; cursor: pointer; background-color: #409EFF; border-color: #409EFF; color: #FFF;}
-.s-btn:hover{background-color: #50aEFF;}
-.reg-tips{text-align: left; color: #999; font-size: 14px;}
+.s-btn {
+  text-indent: 0;
+  font-size: 14px;
+  cursor: pointer;
+  background-color: #409eff;
+  border-color: #409eff;
+  color: #fff;
+  
+}
+.s-btn:hover {
+  background-color: #50aeff;
+}
+.reg-tips {
+  text-align: left;
+  color: #50aeff;
+  font-size: 14px;
+}
+.login-btn{
+    background:linear-gradient(0deg,#23d6ee,#52a9ff );
+    font-size: 23px;
+    font-weight: bolder;
+}
+.login-btn:hover{
+    background: linear-gradient(0deg,#63e7f8,#6fb6fd );
+}
+.reg-btn:hover{
+    background: linear-gradient(0deg,#63e7f8,#3179df );
+}
+.reg-btn{
+    background: linear-gradient(0deg,#63e7f8,#17478b );
+    font-size: 23px;
+    font-weight: bolder;
+}
 
 /* 重置按钮 */
-.reset-box{text-align: left; font-size: 14px;}
-.reset-box a{text-decoration: none;}
-.reset-box a:hover{text-decoration: underline;}
+.reset-box {
+  text-align: left;
+  font-size: 14px;
+ 
+
+}
+.reset-box a {
+  text-decoration: none;
+  color: #50aeff;
+}
+.reset-box a:hover {
+  text-decoration: underline;
+}
 
 /* loading框样式 */
-.ajax-layer-load.layui-layer-dialog{min-width: 0px !important; background-color: rgba(0,0,0,0.85);}
-.ajax-layer-load.layui-layer-dialog .layui-layer-content{padding: 10px 20px 10px 40px; color: #FFF;}
-.ajax-layer-load.layui-layer-dialog .layui-layer-content .layui-layer-ico{width: 20px; height: 20px; background-size: 20px 20px; top: 12px; }
+.ajax-layer-load.layui-layer-dialog {
+  min-width: 0px !important;
+  background-color: rgba(0, 0, 0, 0.85);
+}
+.ajax-layer-load.layui-layer-dialog .layui-layer-content {
+  padding: 10px 20px 10px 40px;
+  color: #fff;
+}
+.ajax-layer-load.layui-layer-dialog .layui-layer-content .layui-layer-ico {
+  width: 20px;
+  height: 20px;
+  background-size: 20px 20px;
+  top: 12px;
+}
+
+
+
+/* 首页盒子 */
+.home-box {
+    position: relative;
+    width: 100vw;
+    height: 100vh;
+    overflow: hidden;
+    background: url(images/home-bg.jpg) no-repeat;
+    background-size: 100% 100%;
+  }
+/* .view-box{background: radial-gradient(220% 105% at top center, #AFB6C0 0%, #F0F5F1 40%, #F0F5F1 80%, #F0F5F1);} */
+
+.home-container{ 
+    width:95%;
+    position: relative;
+    left:50%;
+    transform: translateX(-50%);
+    float: left;
+    margin-top: 90px;
+    padding: 5vh 0;
+    display: flex;
+    flex-wrap: wrap;
+    align-items: flex-start;
+}
+.home-btn-content{
+    margin-bottom:5vh ;
+    width: 12.3%;
+    display: flex;
+    flex-direction: column;
+    color: #63e7f8; 
+    align-items: center
+
+}
+.home-btn-content img{
+    width: 50%;
+    margin-bottom: 10px;
+}
+.home-btn-content:hover{
+    filter: brightness(1.5);
+    cursor: pointer;
+}
+.h-span{
+    width: 65%;
+    text-align: center;
+}
+.user-info{
+    position: absolute;
+    right: 10px;
+    display: flex;
+    flex-direction: column;
+    align-items: flex-end
+}
+.user-info-content{
+   width: fit-content;
+   padding: 10px;
+   background: #17478b;
+   border:  1px solid #3179df;
+   border-radius: 10px;
+   display: flex;
+   flex-direction: column;
+   align-items: center
+}
+.user-info-content-text{
+ padding: 0;
+ margin-bottom: 10px;
+ font-size: 12px;
+}
+.show-user{
+    display: none;
+}
+.sj-u-btn{
+    font-size: 12px;
+    border-radius: 5px;
+    background: #0b3673;
+    border:  1px solid #3179df;
+    padding: 5px 10px;
+    cursor: pointer;
+    color: white;
+}
+.sj-u-btn:hover{
+    background: #2062bf;
+    border:  1px solid #498dec;
+    
+}
+.m-b-5{
+    margin-bottom: 5px;
+}
+#myLink {
+    display: none;
+}

+ 135 - 109
ssp-server/src/main/resources/static/sa-res/login.js

@@ -2,147 +2,163 @@
 var sa = {};
 
 // 打开loading
-sa.loading = function(msg) {
-	layer.closeAll();	// 开始前先把所有弹窗关了
-	return layer.msg(msg, {icon: 16, shade: 0.3, time: 1000 * 20, skin: 'ajax-layer-load' });
+sa.loading = function (msg) {
+    layer.closeAll();	// 开始前先把所有弹窗关了
+    return layer.msg(msg, {icon: 16, shade: 0.3, time: 1000 * 20, skin: 'ajax-layer-load'});
 };
 
 // 隐藏loading
-sa.hideLoading = function() {
-	layer.closeAll();
+sa.hideLoading = function () {
+    layer.closeAll();
 };
 
 // 封装一下Ajax
-sa.ajax = function(url, data, successFn) {
-	sa.loading("正在努力加载...");
-	setTimeout(function() {
-		$.ajax({
-			url: url,
-			type: "post", 
-			data: data,
-			dataType: 'json',
-			success: function(res){
-				console.log('返回数据:', res);
-				sa.hideLoading();
-				if(res.code == 200) {
-					successFn(res);
-				} else {
-					layer.alert(res.msg, {icon: 2 }); 
-				}
-			},
-			error: function(xhr, type, errorThrown){
-				sa.hideLoading();
-				if(xhr.status == 0){
-					return layer.alert('无法连接到服务器,请检查网络');
-				}
-				return layer.alert("异常:" + JSON.stringify(xhr));
-			}
-		});
-	}, 400);
+sa.ajax = function (url, data, successFn) {
+    sa.loading("正在努力加载...");
+    setTimeout(function () {
+        $.ajax({
+            url: url,
+            type: "post",
+            data: data,
+            dataType: 'json',
+            success: function (res) {
+                console.log('返回数据:', res);
+                sa.hideLoading();
+                if (res.code == 200) {
+                    successFn(res);
+                } else {
+                    layer.alert(res.msg, {icon: 2});
+                }
+            },
+            error: function (xhr, type, errorThrown) {
+                sa.hideLoading();
+                if (xhr.status == 0) {
+                    return layer.alert('无法连接到服务器,请检查网络');
+                }
+                return layer.alert("异常:" + JSON.stringify(xhr));
+            }
+        });
+    }, 400);
 }
 
 // ----------------------------------- 绑定事件 -----------------------------------
-
-// 登录事件 
-$('.login-btn').click(function(){
-	var data = {
-		name: $('[name=name]').val(),
-		pwd: $('[name=pwd]').val()
-	}
-	sa.ajax("/SysUserAcc/doLogin", data, function(res) {
-		layer.msg('登录成功', {anim: 0, icon: 6 });
-		setTimeout(function() {
-			location.reload();
-		}, 800)
-	})
+// 登录事件
+$('.login-btn').click(function () {
+    var data = {
+        name: $('[name=name]').val(),
+        pwd: $('[name=pwd]').val()
+    }
+    sa.ajax("/SysUserAcc/doLogin", data, function (res) {
+        layer.msg('登录成功', {anim: 0, icon: 6});
+        setTimeout(function () {
+            location.reload();
+        }, 800)
+    })
+});
+// 退出登录事件
+$('.logout-btn').click(function () {
+    var data = {}
+    sa.ajax("/SysUserAcc/doExit", data, function (res) {
+        layer.msg('退出登录成功', {anim: 0, icon: 6});
+        setTimeout(function () {
+            location.reload();
+        }, 800)
+    })
 });
-
 // 注册事件 
-$('.reg-btn').click(function(){
-	var data = {
-		phone: $('[name=phone]').val(),
-		vc: $('[name=vc]').val()
-	}
-	sa.ajax("/SysUserAcc/loginByPhone_ok", data, function(res) {
-		layer.msg('登录成功', {anim: 0, icon: 6 });
-		setTimeout(function() {
-			location.reload();
-		}, 800)
-	})
+$('.reg-btn').click(function () {
+    var data = {
+        phone: $('[name=phone]').val(),
+        vc: $('[name=vc]').val()
+    }
+    sa.ajax("/SysUserAcc/loginByPhone_ok", data, function (res) {
+        layer.msg('登录成功', {anim: 0, icon: 6});
+        setTimeout(function () {
+            location.reload();
+        }, 800)
+    })
 });
 
 // 发送验证码
-$('.send-vc').on('click', 'a', function() {
-	// 校验是否点击频繁 
-	var vcCount = parseInt(localStorage.vcCount) || 0;
-	if(vcCount > 0) {
-		return layer.msg('请求频繁,请稍后再试');
-	}
-	// 开始请求 
-	var data = {phone: $('[name=phone]').val()};
-	sa.ajax("/SysUserAcc/loginByPhone_sendVc", data, function(res) {
-		// 提示 
-		// layer.msg('发送成功,请注意接收');
-		layer.alert('发送成功,请注意接收<br/>友情提示:当前演示环境下为方便测试,验证码为:123456');
-		// 刷新 
-		localStorage.lastClick = new Date().getTime();
-		refVc();
-	})
+$('.send-vc').on('click', 'a', function () {
+    // 校验是否点击频繁
+    var vcCount = parseInt(localStorage.vcCount) || 0;
+    if (vcCount > 0) {
+        return layer.msg('请求频繁,请稍后再试');
+    }
+    // 开始请求
+    var data = {phone: $('[name=phone]').val()};
+    sa.ajax("/SysUserAcc/loginByPhone_sendVc", data, function (res) {
+        // 提示
+        // layer.msg('发送成功,请注意接收');
+        layer.alert('发送成功,请注意接收');
+        // 刷新
+        localStorage.lastClick = new Date().getTime();
+        refVc();
+    })
 })
 
 // 验证码循环计数
-var refVc = function() {
-	var lastClick = parseInt(localStorage.lastClick) || 0;
-	var effS = parseInt(60 - (new Date().getTime() - lastClick) / 1000);
-	if(effS > 0) {
-		$('.send-vc').html('重新获取 ' + effS + 's');
-	} else {
-		$('.send-vc').html('<a>获取验证码</a>');
-	}
+var refVc = function () {
+    var lastClick = parseInt(localStorage.lastClick) || 0;
+    var effS = parseInt(60 - (new Date().getTime() - lastClick) / 1000);
+    if (effS > 0) {
+        $('.send-vc').html('重新获取 ' + effS + 's');
+    } else {
+        $('.send-vc').html('<a>获取验证码</a>');
+    }
 }
 refVc();
 setInterval(refVc, 1000);
 
 // 忘记密码
 function forget() {
-	layer.alert('如您已忘记账号密码,您可以使用短信登录后修改密码', function(index) {
-		layer.close(index);
-		$('.tab2').click();
-	});
+    layer.alert('如您已忘记账号密码,您可以使用短信登录后修改密码', function (index) {
+        layer.close(index);
+        $('.tab2').click();
+    });
 }
-// 注册账号 
+
+// 注册账号
 function regAcc() {
-	layer.alert('使用短信登录后将自动注册账号', function(index) {
-		layer.close(index);
-		$('.tab2').click();
-	});
+    layer.alert('使用短信登录后将自动注册账号', function (index) {
+        layer.close(index);
+        $('.tab2').click();
+    });
 }
 
 // 绑定tab选项卡点击事件
-$('.tab1').click(function() {
-	// 切换tab
-	$('.nat-tab').removeClass('nat-tab');
-	$(this).addClass('nat-tab');
-	$('.title-border').removeClass('title-border-2');
-	// 切换表单 
-	$('.native').removeClass('native');
-	$('.login-dev').addClass('native');
+$('.tab1').click(function () {
+    // 切换tab
+    $('.nat-tab').removeClass('nat-tab');
+    $(this).addClass('nat-tab');
+    $('.title-border').removeClass('title-border-2');
+    // 切换表单
+    $('.native').removeClass('native');
+    $('.login-dev').addClass('native');
 })
-$('.tab2').click(function() {
-	// 切换tab
-	$('.nat-tab').removeClass('nat-tab');
-	$(this).addClass('nat-tab');
-	$('.title-border').addClass('title-border-2');
-	// 切换表单 
-	$('.native').removeClass('native');
-	$('.reg-dev').addClass('native');
+$('.tab2').click(function () {
+    // 切换tab
+    $('.nat-tab').removeClass('nat-tab');
+    $(this).addClass('nat-tab');
+    $('.title-border').addClass('title-border-2');
+    // 切换表单
+    $('.native').removeClass('native');
+    $('.reg-dev').addClass('native');
 })
 
 // 绑定回车事件
-$('[name=name],[name=pwd]').bind('keypress', function(event){
-	if(event.keyCode == "13") {
-		$('.login-btn').click();
-	}
+$('[name=name],[name=pwd]').bind('keypress', function (event) {
+    if (event.keyCode == "13") {
+        $('.login-btn').click();
+    }
+});
+
+// 绑定回车事件
+$('').bind('keypress', function (event) {
+    if (event.keyCode == "13") {
+        $('.logout-btn').click();
+    }
 });
 
 // 输入框获取焦点
@@ -152,3 +168,13 @@ $("[name=name]").focus();
 var sspId = "xxx";	// 授权码id 
 var sspInfo = "This page is provided by Sa-Sso-Pro (https://sa-token.cc/), Authorization Id: " + sspId;
 console.log(sspInfo);
+
+
+//右上角用户信息显隐
+function showUserInfo() {
+    $('.user-info-content').removeClass('show-user');
+}
+
+function userInfoHide() {
+    $('.user-info-content').addClass('show-user');
+}

+ 43 - 4
ssp-server/src/main/resources/templates/home.html

@@ -1,11 +1,50 @@
 <!DOCTYPE html>
 <html lang="zh">
 <head>
+    <title>Sooka-SSO-Server 认证中心-登录</title>
+    <meta charset="utf-8"/>
+    <base th:href="@{/}"/>
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+    <link rel="stylesheet" href="./sa-res/login.css"/>
 </head>
 <body>
-<h2>SSO 平台首页</h2>
-<p><a href='/sso/auth?redirect=http://sa-sso-client1.com/sso-login?back=http://sa-sso-client1.com/index'> 进入一体化系统 </a></p>
-<p><a href='/sso/auth?redirect=http://sa-sso-client1.com:81/sso-login?back=http://sa-sso-client1.com:81/index'> 进入222体化系统 </a></p>
-<p><a href='/sso/auth?client=ssp-client3-nosdk&redirect=http://sa-sso-client2.com:18080/ssp-client-h5/sso-login.html?back=http://sa-sso-client2.com:18080/ssp-client-h5/index.html' target='_blank'> 进入Client2系统 </a></p>
+<div class="home-box">
+    <div class="login-header">
+        <img class="login-header-img" src="sa-res/images/logo-sj.png"/>
+        <span class="login-h-text">首佳科技SSO平台</span>
+        <div class="user-info" onmouseover="showUserInfo()" onmouseout="userInfoHide()">
+            <img th:src="${userInfo.avatar}" style="width:38px; height:38px; overflow: hidden; object-fit: cover;"/>
+            <div class="user-info-content show-user" onmouseover="showUserInfo()" onmouseout="userInfoHide()">
+                <span class="user-info-content-text">
+                    姓名:<span th:text="${userInfo.username}"></span><br>
+                    电话:<span th:text="${userInfo.phone}"></span><br>
+                    登录次数:<span th:text="${userInfo.loginCount}"></span><br>
+                    &nbsp;&nbsp;欢迎您登录本系统!
+                </span>
+                <button class="sj-u-btn s-btn logout-btn">退出登录</button>
+            </div>
+        </div>
+    </div>
+    <div id="userId" th:text="${userInfo.id}" style="display: none;"></div>
+    <div class="home-container" id="container">
+        <div class="home-btn-content" th:each="item : ${dataSource}" th:data="${item.intro}"
+             th:onclick="jumpClick([[${item.intro}]])">
+            <img th:src="${item.sysClientLogo}" style="width: 100px; height: 100px; overflow: hidden; object-fit: cover;"/>
+            <span class="h-span" th:text="${item.sysClientName}"></span>
+        </div>
+    </div>
+</div>
+<!-- scripts -->
+<script src="./sa-res/jquery.min.js"></script>
+<script src="./sa-res/layer/layer.js"></script>
+<script src="./sa-res/login.js"></script>
+<script>
+
+    // 添加点击事件监听器
+    function jumpClick(e) {
+        window.location.href = e;
+    }
+</script>
 </body>
 </html>

+ 6 - 1
ssp-server/src/main/resources/templates/login.html

@@ -9,12 +9,17 @@
 	</head>
 	<body>
 		<div class="view-box">
+			<div class="login-header">
+				<img class="login-header-img" src="sa-res/images/logo-sj.png">
+				<span class="login-h-text">首佳科技SSO平台</span>
+			</div>
 			<div class="login-box">
 				<div class="zz-box">
 					<div class="logo-box">
 <!--						<img src="logo.png" >-->
 					</div>
 					<div class="from-box">
+						<div class="login-tit">请登录</div>
 						<!-- tab选项卡 -->
 						<div class="from-title">
 							<div class="tab-box">
@@ -61,7 +66,7 @@
 				</div>
 			</div>
 			<!-- 底部 版权 -->
-			<div style="position: absolute; bottom: 40px; width: 100%; text-align: center; color: #666;">
+			<div style="position: absolute; bottom: 40px; width: 100%; text-align: center; color: #ffffff;">
 				 Copyright ©2023  长春首佳科技有限公司 | this page is provided by Sooka-SSO
 			</div>
 		</div>