Browse Source

feat: call dahua login api

hi-cactus! 3 years ago
parent
commit
4de9235983
8 changed files with 145 additions and 3 deletions
  1. 2 0
      package.json
  2. 27 0
      src/api/dahua.ts
  3. 12 1
      src/constants/constants.ts
  4. 8 2
      src/layout/BaseLayout/index.tsx
  5. 1 0
      src/store/index.ts
  6. 77 0
      src/store/useDaHuaStore.ts
  7. 8 0
      src/utils/index.ts
  8. 10 0
      yarn.lock

+ 2 - 0
package.json

@@ -12,6 +12,7 @@
     "axios": "^0.24.0",
     "clsx": "^1.1.1",
     "core-js": "^3.6.5",
+    "crypto-js": "^4.1.1",
     "echarts": "^5.2.2",
     "element-plus": "^1.1.0-beta.24",
     "nprogress": "^0.2.0",
@@ -24,6 +25,7 @@
   },
   "devDependencies": {
     "@rollup/plugin-image": "^2.1.1",
+    "@types/crypto-js": "^4.0.2",
     "@types/lodash": "^4.14.176",
     "@types/node": "^16.11.6",
     "@types/nprogress": "^0.2.0",

+ 27 - 0
src/api/dahua.ts

@@ -0,0 +1,27 @@
+import request from '@/utils/request';
+import { BaseResponse } from './type';
+import { DA_HUA_URL_PREFIX } from '@/constants/constants';
+
+export interface DAHUALoginParams {
+  userName: string;
+  signature: string;
+  randomKey: string;
+  encryptType: 'MD5';
+  clientType: 'winpc';
+  pid: 2548;
+}
+
+export interface LoginResponse extends BaseResponse {
+  token?: string;
+  userId?: string | number;
+}
+
+export const DAHUALogin = (params: DAHUALoginParams) =>
+  request<LoginResponse>('POST', {
+    url: `${DA_HUA_URL_PREFIX}/videoService/accounts/authorize`,
+    data: params,
+    headers: {
+      'Content-Type': 'application/json',
+      'X-Subject-Token': '',
+    },
+  });

+ 12 - 1
src/constants/constants.ts

@@ -1,3 +1,14 @@
 export const BaseMediaUrl = 'http://sqfile.xt.wenhq.top:8083';
-export const BaseLoginUrl = 'http://61.147.254.211:9999/home/#/login'
+export const BaseLoginUrl = 'http://61.147.254.211:9999/home/#/login';
 export const BaseReg = /^\+\+\+\+[\.]+|[\d|\w|\s|\u4e00-\u9fa5]+\+\+\+\+$/;
+
+export const DA_HUA = {
+  username: 'huashe1',
+  password: 'huashe123',
+  ip: '10.55.134.3 ',
+  host: 'http',
+  port: '8314',
+};
+
+export const DA_HUA_URL_PREFIX =
+  DA_HUA.host + '://' + DA_HUA.ip + ':' + DA_HUA.port;

+ 8 - 2
src/layout/BaseLayout/index.tsx

@@ -1,8 +1,8 @@
-import { defineComponent } from 'vue';
+import { defineComponent, onMounted } from 'vue';
 import { RouterView, useRoute, useRouter } from 'vue-router';
 import MarkerMap from '@/components/MarkerMap';
 import './index.scss';
-import { useIncidentStore } from '@/store';
+import { useIncidentStore, useDaHuaStore } from '@/store';
 
 export default defineComponent({
   setup() {
@@ -10,6 +10,12 @@ export default defineComponent({
     const router = useRouter();
 
     const store = useIncidentStore();
+    const daHuaStore = useDaHuaStore();
+
+    // login da hua
+    onMounted(() => {
+      daHuaStore.DAHUALogin();
+    });
 
     return () => (
       <section class="base-layout-container">

+ 1 - 0
src/store/index.ts

@@ -2,3 +2,4 @@ export { default as useMainStore } from './useMainStore';
 export { default as useCommonStore } from './useCommonStore';
 export { default as useIncidentStore } from './useIncidentStore';
 export { default as useMarkerStore } from './useMarkerStore';
+export { default as useDaHuaStore } from './useDaHuaStore.ts';

+ 77 - 0
src/store/useDaHuaStore.ts

@@ -0,0 +1,77 @@
+import { defineStore } from 'pinia';
+
+import { DAHUALogin, DAHUALoginParams, LoginResponse } from '@/api/dahua';
+import isString from 'lodash/isString';
+import { parseStr } from '@/utils';
+import md5 from 'crypto-js/md5';
+import { DA_HUA, DA_HUA_URL_PREFIX } from '@/constants/constants';
+import hex from 'crypto-js/format-hex';
+import { ElMessage } from 'element-plus';
+
+export interface DaHuaStateType {}
+
+export interface DaHuaActionsType {
+  DAHUALogin(): void;
+}
+
+export default defineStore<'daHua', DaHuaStateType, {}, DaHuaActionsType>(
+  'daHua',
+  {
+    state: () => ({}),
+    actions: {
+      async DAHUALogin() {
+        try {
+          const { password, username } = DA_HUA;
+          const firstLoginRes = await fetch(
+            `${DA_HUA_URL_PREFIX}/videoService/accounts/authorize`,
+            {
+              method: 'POST',
+              headers: {
+                'Content-Type': 'application/json',
+                'X-Subject-Token': '',
+              },
+              body: JSON.stringify({
+                userName: username,
+                clientType: 'winpc',
+                ipAddress: '', //可不传
+                pid: 2548, //可不传
+              }),
+            },
+          );
+
+          const firstLogin = (await firstLoginRes.json()) as unknown as {
+            realm?: string;
+            randomKey: string;
+          };
+
+          const md1 = md5(password); //第1次加密
+          const md2 = md5(username + md1); //第2次加密
+          const md3 = md5(md2); //第3次加密
+          const md4 = md5(username + ':' + firstLogin.realm + ':' + md3); //第4次加密
+          const signature = md5(md4 + ':' + firstLogin.randomKey); //第5次加密
+          const data = await DAHUALogin({
+            userName: username,
+            signature: signature.toString(),
+            randomKey: firstLogin.randomKey,
+            encryptType: 'MD5',
+            clientType: 'winpc',
+            pid: 2548,
+          });
+          const next = isString(data)
+            ? parseStr<LoginResponse>(data)
+            : data ?? {};
+          localStorage.setItem('DAHUA_token', JSON.stringify(next.token || ''));
+          localStorage.setItem(
+            'DAHUA_userId',
+            JSON.stringify(next.userId || ''),
+          );
+        } catch (err) {
+          console.log(err);
+          ElMessage.error({
+            message: '大华应急指挥调度实战平台鉴权失败, 请尝试刷新页面重试',
+          });
+        }
+      },
+    },
+  },
+);

+ 8 - 0
src/utils/index.ts

@@ -16,3 +16,11 @@ export const getSession = <T extends any>(item: string) => {
     }
   } catch (error) {}
 };
+
+export const parseStr = <T = {}>(str: string): T => {
+  try {
+    return JSON.parse(str) as T;
+  } catch (e) {
+    return {} as T;
+  }
+};

+ 10 - 0
yarn.lock

@@ -357,6 +357,11 @@
   resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
   integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
 
+"@types/crypto-js@^4.0.2":
+  version "4.0.2"
+  resolved "http://182.42.130.126:4873/@types%2fcrypto-js/-/crypto-js-4.0.2.tgz#4524325a175bf819fec6e42560c389ce1fb92c97"
+  integrity sha512-sCVniU+h3GcGqxOmng11BRvf9TfN9yIs8KKjB8C8d75W69cpTfZG80gau9yTx5SxF3gvHGbJhdESzzvnjtf3Og==
+
 "@types/estree@0.0.39":
   version "0.0.39"
   resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.39.tgz#e177e699ee1b8c22d23174caaa7422644389509f"
@@ -902,6 +907,11 @@ cross-spawn@^6.0.5:
     shebang-command "^1.2.0"
     which "^1.2.9"
 
+crypto-js@^4.1.1:
+  version "4.1.1"
+  resolved "http://182.42.130.126:4873/crypto-js/-/crypto-js-4.1.1.tgz#9e485bcf03521041bd85844786b83fb7619736cf"
+  integrity sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==
+
 css-select@^4.1.3:
   version "4.1.3"
   resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.1.3.tgz#a70440f70317f2669118ad74ff105e65849c7067"