Commit e6d194447fcaa12b85ec8a54d36d613d526d7e3f

Authored by xp.Huang
2 parents f2a9d875 d43a6e0b

Merge branch 'main_dev' into 'v1.4.0_dev'

Main dev

See merge request yunteng/thingskit-front!1339
@@ -34,6 +34,9 @@ VITE_GLOB_LARGE_DESIGNER = /large-designer @@ -34,6 +34,9 @@ VITE_GLOB_LARGE_DESIGNER = /large-designer
34 # Content Security Policy 34 # Content Security Policy
35 VITE_GLOB_CONTENT_SECURITY_POLICY = false 35 VITE_GLOB_CONTENT_SECURITY_POLICY = false
36 36
  37 +# Streaming media content security protocol
  38 +VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL = true
  39 +
37 # Alarm Notify Polling Interval Time 40 # Alarm Notify Polling Interval Time
38 VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME = 500000 41 VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME = 500000
39 42
@@ -46,6 +46,9 @@ VITE_GLOB_LARGE_DESIGNER = /large-designer @@ -46,6 +46,9 @@ VITE_GLOB_LARGE_DESIGNER = /large-designer
46 # Content Security Policy 46 # Content Security Policy
47 VITE_GLOB_CONTENT_SECURITY_POLICY = false 47 VITE_GLOB_CONTENT_SECURITY_POLICY = false
48 48
  49 +# Streaming media content security protocol
  50 +VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL = false
  51 +
49 # Alarm Notify Polling Interval Time 52 # Alarm Notify Polling Interval Time
50 VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME = 60000 53 VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME = 60000
51 54
@@ -10,6 +10,30 @@ import { getConfigFileName } from '../getConfigFileName'; @@ -10,6 +10,30 @@ import { getConfigFileName } from '../getConfigFileName';
10 10
11 import pkg from '../../package.json'; 11 import pkg from '../../package.json';
12 12
  13 +const stringToJSONParse = (string: string) => {
  14 + try {
  15 + return JSON.parse(string);
  16 + } catch (error) {
  17 + return string;
  18 + }
  19 +};
  20 +
  21 +export function parseEnv(env: Record<string, string>) {
  22 + const res: Record<string, string> = {};
  23 +
  24 + Object.keys(env).forEach((key) => {
  25 + try {
  26 + const value = env[key];
  27 + res[key] = stringToJSONParse(value);
  28 + } catch (err) {
  29 + // eslint-disable-next-line no-console
  30 + console.log(`env variable ${key} can't serialization!`);
  31 + }
  32 + });
  33 +
  34 + return res;
  35 +}
  36 +
13 function createConfig( 37 function createConfig(
14 { 38 {
15 configName, 39 configName,
@@ -20,7 +44,7 @@ function createConfig( @@ -20,7 +44,7 @@ function createConfig(
20 try { 44 try {
21 const windowConf = `window.${configName}`; 45 const windowConf = `window.${configName}`;
22 // Ensure that the variable will not be modified 46 // Ensure that the variable will not be modified
23 - const configStr = `${windowConf}=${JSON.stringify(config)}; 47 + const configStr = `${windowConf}=${JSON.stringify(parseEnv(config))};
24 Object.freeze(${windowConf}); 48 Object.freeze(${windowConf});
25 Object.defineProperty(window, "${configName}", { 49 Object.defineProperty(window, "${configName}", {
26 configurable: false, 50 configurable: false,
@@ -30,9 +54,12 @@ function createConfig( @@ -30,9 +54,12 @@ function createConfig(
30 fs.mkdirp(getRootPath(OUTPUT_DIR)); 54 fs.mkdirp(getRootPath(OUTPUT_DIR));
31 writeFileSync(getRootPath(`${OUTPUT_DIR}/${configFileName}`), configStr); 55 writeFileSync(getRootPath(`${OUTPUT_DIR}/${configFileName}`), configStr);
32 56
  57 + // eslint-disable-next-line no-console
33 console.log(chalk.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`); 58 console.log(chalk.cyan(`✨ [${pkg.name}]`) + ` - configuration file is build successfully:`);
  59 + // eslint-disable-next-line no-console
34 console.log(chalk.gray(OUTPUT_DIR + '/' + chalk.green(configFileName)) + '\n'); 60 console.log(chalk.gray(OUTPUT_DIR + '/' + chalk.green(configFileName)) + '\n');
35 } catch (error) { 61 } catch (error) {
  62 + // eslint-disable-next-line no-console
36 console.log(chalk.red('configuration file configuration file failed to package:\n' + error)); 63 console.log(chalk.red('configuration file configuration file failed to package:\n' + error));
37 } 64 }
38 } 65 }
@@ -18,6 +18,7 @@ export const useGlobSetting = (): Readonly<GlobConfig> => { @@ -18,6 +18,7 @@ export const useGlobSetting = (): Readonly<GlobConfig> => {
18 VITE_GLOB_LARGE_DESIGNER, 18 VITE_GLOB_LARGE_DESIGNER,
19 VITE_GLOB_DISABLED_TASK_CENTER_EXECUTE_INTERVAL_UNIT_SECOND, 19 VITE_GLOB_DISABLED_TASK_CENTER_EXECUTE_INTERVAL_UNIT_SECOND,
20 VITE_GLOB_SOFTWARE_VERSION_NUMBER, 20 VITE_GLOB_SOFTWARE_VERSION_NUMBER,
  21 + VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL,
21 } = getAppEnvConfig(); 22 } = getAppEnvConfig();
22 23
23 if (!/[a-zA-Z\_]*/.test(VITE_GLOB_APP_SHORT_NAME)) { 24 if (!/[a-zA-Z\_]*/.test(VITE_GLOB_APP_SHORT_NAME)) {
@@ -36,12 +37,14 @@ export const useGlobSetting = (): Readonly<GlobConfig> => { @@ -36,12 +37,14 @@ export const useGlobSetting = (): Readonly<GlobConfig> => {
36 configurationPrefix: VITE_GLOB_CONFIGURATION, 37 configurationPrefix: VITE_GLOB_CONFIGURATION,
37 largeDesignerPrefix: VITE_GLOB_LARGE_DESIGNER, 38 largeDesignerPrefix: VITE_GLOB_LARGE_DESIGNER,
38 socketUrl: VITE_GLOB_WEB_SOCKET, 39 socketUrl: VITE_GLOB_WEB_SOCKET,
39 - securityPolicy: VITE_GLOB_CONTENT_SECURITY_POLICY,  
40 - alarmNotifyDuration: VITE_GLOB_ALARM_NOTIFY_DURATION,  
41 - alarmPollingInterval: VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME, 40 + securityPolicy: VITE_GLOB_CONTENT_SECURITY_POLICY as unknown as boolean,
  41 + alarmNotifyDuration: VITE_GLOB_ALARM_NOTIFY_DURATION as unknown as number,
  42 + alarmPollingInterval: VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME as unknown as number,
42 disabledTaskCenterExecuteIntervalUnitSecond: 43 disabledTaskCenterExecuteIntervalUnitSecond:
43 - VITE_GLOB_DISABLED_TASK_CENTER_EXECUTE_INTERVAL_UNIT_SECOND, 44 + VITE_GLOB_DISABLED_TASK_CENTER_EXECUTE_INTERVAL_UNIT_SECOND as unknown as boolean,
44 softwareVersionNumber: VITE_GLOB_SOFTWARE_VERSION_NUMBER, 45 softwareVersionNumber: VITE_GLOB_SOFTWARE_VERSION_NUMBER,
  46 + streamMediaContentSecurityProtocol:
  47 + VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL as unknown as boolean,
45 }; 48 };
46 return glob as Readonly<GlobConfig>; 49 return glob as Readonly<GlobConfig>;
47 }; 50 };
@@ -4,7 +4,7 @@ let initialFlag = false; @@ -4,7 +4,7 @@ let initialFlag = false;
4 export function useWebSecurityPolicy() { 4 export function useWebSecurityPolicy() {
5 if (window && window.document && window.document.documentElement) { 5 if (window && window.document && window.document.documentElement) {
6 const { securityPolicy } = useGlobSetting(); 6 const { securityPolicy } = useGlobSetting();
7 - if (securityPolicy === 'true' && !initialFlag) { 7 + if (securityPolicy && !initialFlag) {
8 const meta = document.createElement('meta'); 8 const meta = document.createElement('meta');
9 meta.setAttribute('http-equiv', 'Content-Security-Policy'); 9 meta.setAttribute('http-equiv', 'Content-Security-Policy');
10 meta.setAttribute('content', 'upgrade-insecure-requests'); 10 meta.setAttribute('content', 'upgrade-insecure-requests');
@@ -14,13 +14,38 @@ export function getStorageShortName() { @@ -14,13 +14,38 @@ export function getStorageShortName() {
14 return `${getCommonStoragePrefix()}${`__${pkg.version}`}__`.toUpperCase(); 14 return `${getCommonStoragePrefix()}${`__${pkg.version}`}__`.toUpperCase();
15 } 15 }
16 16
  17 +const stringToJSONParse = (string: string) => {
  18 + try {
  19 + return JSON.parse(string);
  20 + } catch (error) {
  21 + return string;
  22 + }
  23 +};
  24 +
  25 +export function parseEnv(env: Record<string, string>) {
  26 + const res: Record<string, string> = {};
  27 +
  28 + Object.keys(env).forEach((key) => {
  29 + try {
  30 + const value = env[key];
  31 + res[key] = stringToJSONParse(value);
  32 + } catch (err) {
  33 + // eslint-disable-next-line no-console
  34 + console.log(`env variable ${key} can't serialization!`);
  35 + }
  36 + });
  37 +
  38 + return res;
  39 +}
  40 +
17 export function getAppEnvConfig() { 41 export function getAppEnvConfig() {
18 const ENV_NAME = getConfigFileName(import.meta.env); 42 const ENV_NAME = getConfigFileName(import.meta.env);
19 43
20 const ENV = (import.meta.env.DEV 44 const ENV = (import.meta.env.DEV
21 ? // Get the global configuration (the configuration will be extracted independently when packaging) 45 ? // Get the global configuration (the configuration will be extracted independently when packaging)
22 - (import.meta.env as unknown as GlobEnvConfig) 46 + (parseEnv(import.meta.env as Record<string, string>) as unknown as GlobEnvConfig)
23 : window[ENV_NAME as any]) as unknown as GlobEnvConfig; 47 : window[ENV_NAME as any]) as unknown as GlobEnvConfig;
  48 +
24 const { 49 const {
25 VITE_GLOB_APP_TITLE, 50 VITE_GLOB_APP_TITLE,
26 VITE_GLOB_API_URL, 51 VITE_GLOB_API_URL,
@@ -35,6 +60,7 @@ export function getAppEnvConfig() { @@ -35,6 +60,7 @@ export function getAppEnvConfig() {
35 VITE_GLOB_LARGE_DESIGNER, 60 VITE_GLOB_LARGE_DESIGNER,
36 VITE_GLOB_DISABLED_TASK_CENTER_EXECUTE_INTERVAL_UNIT_SECOND, 61 VITE_GLOB_DISABLED_TASK_CENTER_EXECUTE_INTERVAL_UNIT_SECOND,
37 VITE_GLOB_SOFTWARE_VERSION_NUMBER, 62 VITE_GLOB_SOFTWARE_VERSION_NUMBER,
  63 + VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL,
38 } = ENV; 64 } = ENV;
39 65
40 if (!/^[a-zA-Z\_]*$/.test(VITE_GLOB_APP_SHORT_NAME)) { 66 if (!/^[a-zA-Z\_]*$/.test(VITE_GLOB_APP_SHORT_NAME)) {
@@ -57,6 +83,7 @@ export function getAppEnvConfig() { @@ -57,6 +83,7 @@ export function getAppEnvConfig() {
57 VITE_GLOB_LARGE_DESIGNER, 83 VITE_GLOB_LARGE_DESIGNER,
58 VITE_GLOB_DISABLED_TASK_CENTER_EXECUTE_INTERVAL_UNIT_SECOND, 84 VITE_GLOB_DISABLED_TASK_CENTER_EXECUTE_INTERVAL_UNIT_SECOND,
59 VITE_GLOB_SOFTWARE_VERSION_NUMBER, 85 VITE_GLOB_SOFTWARE_VERSION_NUMBER,
  86 + VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL,
60 }; 87 };
61 } 88 }
62 89
@@ -25,8 +25,6 @@ import { useFingerprint } from '/@/utils/useFingerprint'; @@ -25,8 +25,6 @@ import { useFingerprint } from '/@/utils/useFingerprint';
25 import { getVideoControlStart } from '/@/api/device/videoChannel'; 25 import { getVideoControlStart } from '/@/api/device/videoChannel';
26 import { StreamType as PlayerStreamType } from '/@/components/Video/src/types'; 26 import { StreamType as PlayerStreamType } from '/@/components/Video/src/types';
27 import { useGlobSetting } from '/@/hooks/setting'; 27 import { useGlobSetting } from '/@/hooks/setting';
28 -import { BooleanStringEnum } from '/@/enums/toolEnum';  
29 -import { isBoolean } from '/@/utils/is';  
30 28
31 interface FileItem { 29 interface FileItem {
32 uid: string; 30 uid: string;
@@ -645,11 +643,9 @@ export async function getPlayUrl( @@ -645,11 +643,9 @@ export async function getPlayUrl(
645 } else if (accessMode === AccessMode.GBT28181) { 643 } else if (accessMode === AccessMode.GBT28181) {
646 const { deviceId, channelNo } = params?.params || {}; 644 const { deviceId, channelNo } = params?.params || {};
647 const result = await getVideoControlStart({ channelId: channelNo!, deviceId: deviceId! }); 645 const result = await getVideoControlStart({ channelId: channelNo!, deviceId: deviceId! });
648 - const { securityPolicy } = useGlobSetting(); 646 + const { streamMediaContentSecurityProtocol } = useGlobSetting();
649 return { 647 return {
650 - url: (isBoolean(securityPolicy) ? securityPolicy : securityPolicy === BooleanStringEnum.TRUE)  
651 - ? result.data.https_flv  
652 - : result.data.flv, 648 + url: !!streamMediaContentSecurityProtocol ? result.data.https_flv : result.data.flv,
653 type: 'flv', 649 type: 'flv',
654 }; 650 };
655 } else { 651 } else {
@@ -59,8 +59,6 @@ @@ -59,8 +59,6 @@
59 import { Authority } from '/@/components/Authority'; 59 import { Authority } from '/@/components/Authority';
60 import { VideoChannelItemType } from '/@/api/device/model/videoChannelModel'; 60 import { VideoChannelItemType } from '/@/api/device/model/videoChannelModel';
61 import { useGlobSetting } from '/@/hooks/setting'; 61 import { useGlobSetting } from '/@/hooks/setting';
62 - import { BooleanStringEnum } from '/@/enums/toolEnum';  
63 - import { isBoolean } from '/@/utils/is';  
64 62
65 const props = defineProps<{ deviceDetail: DeviceRecord }>(); 63 const props = defineProps<{ deviceDetail: DeviceRecord }>();
66 64
@@ -112,14 +110,10 @@ @@ -112,14 +110,10 @@
112 getPlayUrl: async () => { 110 getPlayUrl: async () => {
113 const { deviceId, channelId } = record; 111 const { deviceId, channelId } = record;
114 const result = await getVideoControlStart({ deviceId, channelId }); 112 const result = await getVideoControlStart({ deviceId, channelId });
115 - const { securityPolicy } = useGlobSetting(); 113 + const { streamMediaContentSecurityProtocol } = useGlobSetting();
116 return { 114 return {
117 type: 'flv', 115 type: 'flv',
118 - url: (  
119 - isBoolean(securityPolicy) ? securityPolicy : securityPolicy === BooleanStringEnum.TRUE  
120 - )  
121 - ? result.data.https_flv  
122 - : result.data.flv, 116 + url: !!streamMediaContentSecurityProtocol ? result.data.https_flv : result.data.flv,
123 }; 117 };
124 }, 118 },
125 } as VideoCancelModalParamsType, 119 } as VideoCancelModalParamsType,
@@ -38,15 +38,16 @@ @@ -38,15 +38,16 @@
38 const handleValidateHasSameIdentifier = (formValue?: StructJSON) => { 38 const handleValidateHasSameIdentifier = (formValue?: StructJSON) => {
39 const { identifier } = formValue || {}; 39 const { identifier } = formValue || {};
40 const message = '存在一致的标识符'; 40 const message = '存在一致的标识符';
41 -  
42 if (unref(currentMode) === DataActionModeEnum.CREATE) { 41 if (unref(currentMode) === DataActionModeEnum.CREATE) {
43 if (props.value.filter((item) => item.identifier === identifier).length >= 1) { 42 if (props.value.filter((item) => item.identifier === identifier).length >= 1) {
44 createMessage.warn(message); 43 createMessage.warn(message);
45 return Promise.reject(message); 44 return Promise.reject(message);
46 } 45 }
47 } else { 46 } else {
48 - const index = props.value.findIndex((item) => item.identifier === formValue?.identifier);  
49 - if (index !== unref(currentEditIndex)) { 47 + const list = [...props.value];
  48 + list.splice(unref(currentEditIndex), 1, formValue!);
  49 + const existLength = list.filter((item) => item?.identifier === formValue?.identifier).length;
  50 + if (existLength > 1) {
50 createMessage.warn(message); 51 createMessage.warn(message);
51 return Promise.reject(message); 52 return Promise.reject(message);
52 } 53 }
@@ -153,13 +153,15 @@ export interface GlobConfig { @@ -153,13 +153,15 @@ export interface GlobConfig {
153 // socket url 153 // socket url
154 socketUrl: string; 154 socketUrl: string;
155 // alarm notify alarm duration 155 // alarm notify alarm duration
156 - alarmNotifyDuration: string; 156 + alarmNotifyDuration: number;
157 // alarm notify polling interval 157 // alarm notify polling interval
158 - alarmPollingInterval: string; 158 + alarmPollingInterval: number;
159 // upgrade your http policy to https 159 // upgrade your http policy to https
160 - securityPolicy: string; 160 + securityPolicy: boolean;
  161 + // Streaming media content security protocol
  162 + streamMediaContentSecurityProtocol: boolean;
161 // Should Disabled Task Center Execute Interval Unit (Second) 163 // Should Disabled Task Center Execute Interval Unit (Second)
162 - disabledTaskCenterExecuteIntervalUnitSecond: string; 164 + disabledTaskCenterExecuteIntervalUnitSecond: boolean;
163 // Software version number 165 // Software version number
164 softwareVersionNumber: string; 166 softwareVersionNumber: string;
165 } 167 }
@@ -182,6 +184,8 @@ export interface GlobEnvConfig { @@ -182,6 +184,8 @@ export interface GlobEnvConfig {
182 VITE_GLOB_WEB_SOCKET: string; 184 VITE_GLOB_WEB_SOCKET: string;
183 // force transform http to https 185 // force transform http to https
184 VITE_GLOB_CONTENT_SECURITY_POLICY: string; 186 VITE_GLOB_CONTENT_SECURITY_POLICY: string;
  187 + // Streaming media content security protocol
  188 + VITE_GLOB_STREAM_MEDIA_CONTENT_SECURITY_PROTOCOL: string;
185 // notify polling interval time 189 // notify polling interval time
186 VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME: string; 190 VITE_GLOB_ALARM_NOTIFY_POLLING_INTERVAL_TIME: string;
187 // notify duration 191 // notify duration