Bladeren bron

Merge branch 'master' of http://10.1.235.20:3000/asiainfo/ebc

wangchao 4 jaren geleden
bovenliggende
commit
90ffbb6105
19 gewijzigde bestanden met toevoegingen van 205 en 166 verwijderingen
  1. 5 6
      monitor-manage-service/src/main/java/com/ai/bss/monitorManage/service/impl/FileManageServiceImpl.java
  2. 25 19
      monitor-manage-service/src/main/java/com/ai/bss/monitorManage/service/impl/KafkaProcessImpl.java
  3. 29 12
      monitor-manage-service/src/main/java/com/ai/bss/monitorManage/service/impl/ListeningFileDirectoryServiceImpl.java
  4. 8 6
      monitor-manage-service/src/main/java/com/ai/bss/monitorManage/service/impl/MonitorManageServiceImpl.java
  5. 2 2
      monitor-manage-service/src/main/java/com/ai/bss/monitorManage/service/interfaces/FileManageService.java
  6. 2 0
      monitor-manage-service/src/main/java/com/ai/bss/monitorManage/utils/AiIdenUtils.java
  7. 13 13
      security-protection-platform/.aid/aid.js
  8. 2 2
      security-protection-platform/src/conf/axios.config.js
  9. 7 9
      security-protection-platform/src/modules/access/component/instrumentRecord/index.vue
  10. 13 9
      security-protection-platform/src/modules/access/component/io-record/index.vue
  11. 6 8
      security-protection-platform/src/modules/aialarm/index.vue
  12. 5 7
      security-protection-platform/src/modules/attendance/abnormal/index.vue
  13. 7 13
      security-protection-platform/src/modules/attendance/report/index.vue
  14. 40 31
      security-protection-platform/src/modules/dashboard/index.vue
  15. 3 5
      security-protection-platform/src/modules/system/assignment/index.vue
  16. 3 5
      security-protection-platform/src/modules/system/devicemana/index.vue
  17. 3 5
      security-protection-platform/src/modules/usermana/index.vue
  18. 6 8
      security-protection-platform/src/modules/workorder/index.vue
  19. 26 6
      security-protection-platform/src/styles/index.scss

+ 5 - 6
monitor-manage-service/src/main/java/com/ai/bss/monitorManage/service/impl/FileManageServiceImpl.java

1
package com.ai.bss.monitorManage.service.impl;
1
package com.ai.bss.monitorManage.service.impl;
2
2
3
import cn.hutool.core.lang.UUID;
4
import com.ai.bss.components.minio.service.MinioService;
5
import com.ai.bss.monitorManage.service.interfaces.FileManageService;
6
import com.ai.bss.monitorManage.utils.SecurityProtectionMinioConfig;
3
import java.util.HashMap;
4
import java.util.Map;
5
7
import org.apache.commons.lang.StringUtils;
6
import org.apache.commons.lang.StringUtils;
8
import org.springframework.beans.factory.annotation.Autowired;
7
import org.springframework.beans.factory.annotation.Autowired;
9
import org.springframework.stereotype.Service;
8
import org.springframework.stereotype.Service;
10
import org.springframework.web.multipart.MultipartFile;
9
import org.springframework.web.multipart.MultipartFile;
11
10
12
import java.util.HashMap;
13
import java.util.Map;
11
import com.ai.bss.components.minio.service.MinioService;
12
import com.ai.bss.monitorManage.service.interfaces.FileManageService;
14
13
15
@Service
14
@Service
16
public class FileManageServiceImpl implements FileManageService {
15
public class FileManageServiceImpl implements FileManageService {

+ 25 - 19
monitor-manage-service/src/main/java/com/ai/bss/monitorManage/service/impl/KafkaProcessImpl.java

1
package com.ai.bss.monitorManage.service.impl;
1
package com.ai.bss.monitorManage.service.impl;
2
2
3
import com.ai.abc.core.context.SpringApplicationContext;
3
import java.io.File;
4
import java.util.ArrayList;
5
import java.util.HashMap;
6
import java.util.List;
7
import java.util.Map;
8
9
import org.apache.commons.lang.StringUtils;
10
import org.slf4j.Logger;
11
import org.slf4j.LoggerFactory;
12
import org.springframework.beans.factory.annotation.Autowired;
13
import org.springframework.beans.factory.annotation.Value;
14
import org.springframework.kafka.core.KafkaTemplate;
15
import org.springframework.scheduling.annotation.Async;
16
import org.springframework.stereotype.Service;
17
import org.springframework.util.CollectionUtils;
18
import org.springframework.web.multipart.MultipartFile;
19
import org.springframework.web.multipart.commons.CommonsMultipartFile;
20
4
import com.ai.bss.components.common.util.ImageBase64Converter;
21
import com.ai.bss.components.common.util.ImageBase64Converter;
5
import com.ai.bss.components.ebcai.service.EbcAiService;
22
import com.ai.bss.components.ebcai.service.EbcAiService;
6
import com.ai.bss.monitorManage.constant.MonitorManageConsts;
23
import com.ai.bss.monitorManage.constant.MonitorManageConsts;
11
import com.ai.bss.monitorManage.service.interfaces.AiIdenInterfaces;
28
import com.ai.bss.monitorManage.service.interfaces.AiIdenInterfaces;
12
import com.ai.bss.monitorManage.service.interfaces.FileManageService;
29
import com.ai.bss.monitorManage.service.interfaces.FileManageService;
13
import com.ai.bss.monitorManage.service.interfaces.KafkaProcess;
30
import com.ai.bss.monitorManage.service.interfaces.KafkaProcess;
14
import com.ai.bss.monitorManage.utils.*;
31
import com.ai.bss.monitorManage.utils.AiIdenUtils;
32
import com.ai.bss.monitorManage.utils.DateUtils;
33
import com.ai.bss.monitorManage.utils.FileUtils;
34
import com.ai.bss.monitorManage.utils.HttpServiceUtil;
35
import com.ai.bss.monitorManage.utils.KafkaProducerConfig;
36
import com.ai.bss.monitorManage.utils.SecurityProtectionMinioConfig;
15
import com.alibaba.fastjson.JSON;
37
import com.alibaba.fastjson.JSON;
16
import com.alibaba.fastjson.JSONArray;
38
import com.alibaba.fastjson.JSONArray;
17
import com.alibaba.fastjson.JSONObject;
39
import com.alibaba.fastjson.JSONObject;
18
import lombok.extern.slf4j.Slf4j;
19
import org.apache.commons.lang.StringUtils;
20
import org.slf4j.Logger;
21
import org.slf4j.LoggerFactory;
22
import org.springframework.beans.factory.annotation.Autowired;
23
import org.springframework.beans.factory.annotation.Value;
24
import org.springframework.kafka.core.KafkaTemplate;
25
import org.springframework.scheduling.annotation.Async;
26
import org.springframework.stereotype.Service;
27
import org.springframework.util.CollectionUtils;
28
import org.springframework.web.multipart.MultipartFile;
29
import org.springframework.web.multipart.commons.CommonsMultipartFile;
30
40
31
import java.io.File;
32
import java.util.ArrayList;
33
import java.util.HashMap;
34
import java.util.List;
35
import java.util.Map;
41
import lombok.extern.slf4j.Slf4j;
36
42
37
@Slf4j
43
@Slf4j
38
@Service
44
@Service

+ 29 - 12
monitor-manage-service/src/main/java/com/ai/bss/monitorManage/service/impl/ListeningFileDirectoryServiceImpl.java

16
import java.util.Iterator;
16
import java.util.Iterator;
17
import java.util.List;
17
import java.util.List;
18
import java.util.Map;
18
import java.util.Map;
19
import java.util.Map.Entry;
19
import java.util.Timer;
20
import java.util.Timer;
20
import java.util.TimerTask;
21
import java.util.TimerTask;
21
22
31
import com.ai.bss.monitorManage.service.interfaces.KafkaProcess;
32
import com.ai.bss.monitorManage.service.interfaces.KafkaProcess;
32
import com.ai.bss.monitorManage.service.interfaces.ListeningFileDirectoryService;
33
import com.ai.bss.monitorManage.service.interfaces.ListeningFileDirectoryService;
33
import com.ai.bss.monitorManage.utils.FileUtils;
34
import com.ai.bss.monitorManage.utils.FileUtils;
34
import com.alibaba.fastjson.JSONObject;
35
import com.mzlion.core.lang.StringUtils;
35
import com.mzlion.core.lang.StringUtils;
36
36
37
import lombok.extern.slf4j.Slf4j;
37
import lombok.extern.slf4j.Slf4j;
49
    @Autowired
49
    @Autowired
50
    private KafkaProcess kafkaProcess;
50
    private KafkaProcess kafkaProcess;
51
    
51
    
52
    private static Map<String,Timer> timerMap=new HashMap<String,Timer>();
53
    
52
    //防止重启后重复监控文件
54
    private String taskName="pictureTask";
53
    private String taskName="pictureTask";
54
    private static Map<String,Timer> timerMap=new HashMap<String,Timer>();
55
    private static Map<String,WatchKey> keyMap=new HashMap<String,WatchKey>();
55
56
56
    @Override
57
    @Override
57
    public void getFile(String filePath,int index)  {
58
    public void getFile(String filePath,int index)  {
66
    	timerMap.get(timerMapKey).schedule(new TimerTask() {
67
    	timerMap.get(timerMapKey).schedule(new TimerTask() {
67
            @Override
68
            @Override
68
            public void run() {
69
            public void run() {
69
                WatchKey key;
70
                WatchKey watchKey;
70
                //System.out.println("filePath:   " + filePath);
71
                //System.out.println("filePath:   " + filePath);
71
                log.info("filePath:   " + filePath);
72
                log.info("filePath:   " + filePath);
72
                String mapKey = "";
73
                String mapKey = "";
79
                            File file = new File(filePath);//path为监听文件夹
80
                            File file = new File(filePath);//path为监听文件夹
80
                            //System.out.println("等待图片加载!");
81
                            //System.out.println("等待图片加载!");
81
                            log.info("等待图片加载!");
82
                            log.info("等待图片加载!");
82
                            key = watchService.take();//没有文件增加时,阻塞在这里
83
                            watchKey = watchService.take();//没有文件增加时,阻塞在这里
84
                            keyMap.put(timerMapKey, watchKey);
85
                            
83
                            int i = 0;
86
                            int i = 0;
84
                            String[] fileContent = new String[3600];
87
                            String[] fileContent = new String[3600];
85
                            for (WatchEvent<?> event : key.pollEvents()) {
88
                            for (WatchEvent<?> event : watchKey.pollEvents()) {
86
                                String fileName = filePath+MonitorManageConsts.getSystemSeparator()+event.context();
89
                                String fileName = filePath+MonitorManageConsts.getSystemSeparator()+event.context();
87
                                //System.out.println("增加文件的文件夹路径== :"+fileName);
90
                                //System.out.println("增加文件的文件夹路径== :"+fileName);
88
                                //System.out.println("增加文件的名称== :"+event.context());
91
                                //System.out.println("增加文件的名称== :"+event.context());
125
//                                Map<String, String> fileMap = fileManageService.uploadFile(mfile,null);
128
//                                Map<String, String> fileMap = fileManageService.uploadFile(mfile,null);
126
//                                System.out.println("pictureUrl=== " + fileMap.get("pictureUrl"));
129
//                                System.out.println("pictureUrl=== " + fileMap.get("pictureUrl"));
127
130
128
                            }if (!key.reset()) {
131
                            }if (!watchKey.reset()) {
129
                                break; //中断循环
132
                                break; //中断循环
130
                            }
133
                            }
131
                        }
134
                        }
172
		}
175
		}
173
    	
176
    	
174
        try{
177
        try{
175
        	Iterator<Map.Entry<String, Timer>> it = timerMap.entrySet().iterator();
176
    	    while(it.hasNext()){
177
    	        Map.Entry<String, Timer> entry = it.next();
178
    	        entry.getValue().cancel();
179
        		it.remove(); 
178
        	Iterator<Map.Entry<String, Timer>> timerIt = timerMap.entrySet().iterator();
179
    	    while(timerIt.hasNext()){
180
    	        Map.Entry<String, Timer> entry = timerIt.next();
181
    	        Timer timer=entry.getValue();
182
    	        timer.cancel();
183
    	        timer=null;
184
        		timerIt.remove(); 
185
			}
186
    	    
187
			if (!CollectionUtils.isEmpty(keyMap)) {
188
				Iterator<Entry<String, WatchKey>> keyIt = keyMap.entrySet().iterator();
189
			    while(keyIt.hasNext()){
190
			        Map.Entry<String, WatchKey> entry = keyIt.next();
191
			        WatchKey watchKey=entry.getValue();
192
			        watchKey.cancel();
193
			        watchKey=null;
194
					keyIt.remove();
195
				}
180
			}
196
			}
197
			
181
        }catch(Exception e){
198
        }catch(Exception e){
182
           log.error("removeTimer is error :"+e.getMessage());  
199
           log.error("removeTimer is error :"+e.getMessage());  
183
           return "关闭失败";
200
           return "关闭失败";

+ 8 - 6
monitor-manage-service/src/main/java/com/ai/bss/monitorManage/service/impl/MonitorManageServiceImpl.java

42
	//@Autowired
42
	//@Autowired
43
	//private SecurityProtectionMinioConfig minioConfig;
43
	//private SecurityProtectionMinioConfig minioConfig;
44
44
45
	private static boolean isBeginFlag=false;
46
45
	//监听状态
46
	private boolean isListenFlag=false;
47
	
47
	@Override
48
	@Override
48
	public String loadPictureFromDirectory() throws InterruptedException {
49
	public String loadPictureFromDirectory() throws InterruptedException {
49
		if (!isBeginFlag) {
50
		if (!isListenFlag) {
50
			//监听文件目录,加载文件
51
			//监听文件目录,加载文件
51
			loadFileList();
52
			loadFileList();
52
			isBeginFlag=true;
53
			isListenFlag=true;
53
			log.info("图片监听开启成功");
54
			log.info("图片监听开启成功");
54
			return "开启成功";
55
			return "开启成功";
55
		}
56
		}
62
		File file = new File(baseFilePath);//path为监听文件夹
63
		File file = new File(baseFilePath);//path为监听文件夹
63
64
64
		File[] files = file.listFiles();
65
		File[] files = file.listFiles();
65
		int n=1;
66
		int n=0;
66
		//摄像头列表
67
		//摄像头列表
67
		for(File file1:files){
68
		for(File file1:files){
68
			file1.getName();
69
			file1.getName();
84
				n++;
85
				n++;
85
			}
86
			}
86
		}
87
		}
88
		log.info("此次开启监听"+n+"个文件夹");
87
	}
89
	}
88
	
90
	
89
	/**
91
	/**
93
		log.debug("关闭图片监听");
95
		log.debug("关闭图片监听");
94
		String result=listeningFileDirectoryService.removeTimer();
96
		String result=listeningFileDirectoryService.removeTimer();
95
		
97
		
96
		isBeginFlag=false;
98
		isListenFlag=false;
97
		log.info("关闭图片监听:"+result);
99
		log.info("关闭图片监听:"+result);
98
		return result;
100
		return result;
99
	}
101
	}

+ 2 - 2
monitor-manage-service/src/main/java/com/ai/bss/monitorManage/service/interfaces/FileManageService.java

1
package com.ai.bss.monitorManage.service.interfaces;
1
package com.ai.bss.monitorManage.service.interfaces;
2
2
3
import org.springframework.web.multipart.MultipartFile;
4
5
import java.util.Map;
3
import java.util.Map;
6
4
5
import org.springframework.web.multipart.MultipartFile;
6
7
/**
7
/**
8
 * 设备管理
8
 * 设备管理
9
 * @author konghl@asiainfo.com
9
 * @author konghl@asiainfo.com

+ 2 - 0
monitor-manage-service/src/main/java/com/ai/bss/monitorManage/utils/AiIdenUtils.java

98
		} finally {
98
		} finally {
99
			try {
99
			try {
100
				is.close();
100
				is.close();
101
			} catch (NullPointerException e) {
102
				log.error("getBufferedImage is NullPointerException1: " + e.getMessage() + ", filePath=" + filePath);
101
			} catch (IOException e) {
103
			} catch (IOException e) {
102
				log.error("getBufferedImage is IOException1: " + e.getMessage() + ", filePath=" + filePath);
104
				log.error("getBufferedImage is IOException1: " + e.getMessage() + ", filePath=" + filePath);
103
			}
105
			}

+ 13 - 13
security-protection-platform/.aid/aid.js

56
  //imagePrefix: url => `${subappURL}/asset/image/${url}`, // 作为子应用必须启用
56
  //imagePrefix: url => `${subappURL}/asset/image/${url}`, // 作为子应用必须启用
57
  //fontPrefix: url => `${subappURL}/asset/font/${url}`, // 作为子应用必须启用
57
  //fontPrefix: url => `${subappURL}/asset/font/${url}`, // 作为子应用必须启用
58
  outputPrefix: '/'// 构建后index.html中资源路径的前缀
58
  outputPrefix: '/'// 构建后index.html中资源路径的前缀
59
  // ,
60
  // proxy: [
61
  //   {
62
  //     url: '/sp',
63
  //     options: {
64
  //       target: 'http://10.19.90.34:8018',
65
  //       changeOrigin: true,
66
  //       pathRewrite: {
67
  //         '^/sp': '/'
68
  //       }
69
  //     }
70
  //   },
71
  // ]
59
  ,
60
  proxy: [
61
    {
62
      url: '/sp',
63
      options: {
64
        target: 'http://10.19.90.34:8018',
65
        changeOrigin: true,
66
        pathRewrite: {
67
          '^/sp': '/'
68
        }
69
      }
70
    },
71
  ]
72
}
72
}

+ 2 - 2
security-protection-platform/src/conf/axios.config.js

39
  },
39
  },
40
  root: {
40
  root: {
41
    default: {
41
    default: {
42
      baseURL: 'http://10.19.90.34:8018'
42
      // baseURL: 'http://10.19.90.34:8018'
43
        // baseURL: 'http://localhost:8018'
43
        // baseURL: 'http://localhost:8018'
44
        // baseURL: '/sp'
44
        baseURL: '/sp'
45
    },
45
    },
46
    picurl: {
46
    picurl: {
47
      baseURL: 'http://10.19.90.34:19000/tool-image/'
47
      baseURL: 'http://10.19.90.34:19000/tool-image/'

+ 7 - 9
security-protection-platform/src/modules/access/component/instrumentRecord/index.vue

19
        <t-button color="primary" @click="btnsearch">查询</t-button>
19
        <t-button color="primary" @click="btnsearch">查询</t-button>
20
        <t-button @click="reset">重置</t-button>
20
        <t-button @click="reset">重置</t-button>
21
      </div>
21
      </div>
22
      <t-button color="primary" icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
22
       <t-button  icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
23
23
24
    </div> -->
24
    </div> -->
25
    <div class="track-container">
25
    <div class="track-container">
36
            </div>
36
            </div>
37
          </div>
37
          </div>
38
          <div class="btns">
38
          <div class="btns">
39
            <t-button color="primary" icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
39
            <t-button icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
40
            <t-dropdown :visibled="customVisibled" trigger-mode="custom">
40
            <t-dropdown :visibled="customVisibled" trigger-mode="custom">
41
              <t-button slot="trigger" color="secondary" icon="tile-four-outline" @click="onTriggerClick"></t-button>
41
              <t-button slot="trigger" color="secondary" icon="tile-four-outline" class="trigger-button" @click="onTriggerClick"></t-button>
42
              <div slot="popper">
42
              <div slot="popper">
43
                <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
43
                <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
44
                  <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
44
                  <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
54
                </div>
54
                </div>
55
              </div>
55
              </div>
56
            </t-dropdown>
56
            </t-dropdown>
57
            <t-button color="secondary" icon="loading" class="reset-btn" @click="reset"></t-button>
58
          </div>
57
          </div>
59
        </div>
58
        </div>
60
        <div class="animate-demo-wrapper">
59
        <div class="animate-demo-wrapper">
62
            <div v-show="slideVisible" class="transition-box allCondition">
61
            <div v-show="slideVisible" class="transition-box allCondition">
63
              <div class="input-rule">
62
              <div class="input-rule">
64
                <span>开始时间:</span>
63
                <span>开始时间:</span>
65
                <t-date-picker :confirm="false" v-model="searchdata.beginDay" placeholder="请选择开始时间" style="width:200px;height:32px"></t-date-picker>
64
                <t-date-picker :confirm="false" v-model="searchdata.beginDay" placeholder="请选择开始时间" style="width:320px;height:32px"></t-date-picker>
66
              </div>
65
              </div>
67
              <div class="input-rule">
66
              <div class="input-rule">
68
                <span>结束时间:</span>
67
                <span>结束时间:</span>
69
                <t-date-picker :confirm="false" v-model="searchdata.endDay" placeholder="请选择结束时间" style="width:320px;height:32px"></t-date-picker>
68
                <t-date-picker :confirm="false" v-model="searchdata.endDay" placeholder="请选择结束时间" style="width:320px;height:32px"></t-date-picker>
70
              </div>
69
              </div>
70
              <a style="float:right;color:#0089d4;" @click="reset" href="javascript:;">重置</a>
71
            </div>
71
            </div>
72
          </transition>
72
          </transition>
73
        </div>
73
        </div>
590
      justify-content: space-between;
590
      justify-content: space-between;
591
      border: 1px solid rgba(0, 0, 0, 0.09);
591
      border: 1px solid rgba(0, 0, 0, 0.09);
592
      background-color: #f8f9fa;
592
      background-color: #f8f9fa;
593
      flex-wrap: wrap;
593
      flex-wrap: nowrap;
594
      padding: 20px;
594
      padding: 20px;
595
      margin: 5px auto;
595
      margin: 5px auto;
596
      align-items: center;
596
      .input-rule {
597
      .input-rule {
597
        flex: 1;
598
        flex: 1;
598
        width: 50%;
599
        min-width: 50%;
600
        max-width: 50%;
601
        padding: 10px 0 10px 20px;
599
        padding: 10px 0 10px 20px;
602
      }
600
      }
603
    }
601
    }

+ 13 - 9
security-protection-platform/src/modules/access/component/io-record/index.vue

20
        <t-button @click="reset">重置</t-button>
20
        <t-button @click="reset">重置</t-button>
21
      </div>
21
      </div>
22
22
23
      <t-button color="primary" icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
23
       <t-button  icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
24
24
25
    </div> -->
25
    </div> -->
26
    <div class="track-container">
26
    <div class="track-container">
37
            </div>
37
            </div>
38
          </div>
38
          </div>
39
          <div class="btns">
39
          <div class="btns">
40
            <t-button color="primary" icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
40
            <t-button icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
41
            <t-dropdown :visibled="customVisibled" trigger-mode="custom">
41
            <t-dropdown :visibled="customVisibled" trigger-mode="custom">
42
              <t-button slot="trigger" color="secondary" icon="tile-four-outline" @click="onTriggerClick"></t-button>
42
              <t-button slot="trigger" color="secondary" icon="tile-four-outline" class="trigger-button" @click="onTriggerClick"></t-button>
43
              <div slot="popper">
43
              <div slot="popper">
44
                <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
44
                <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
45
                  <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
45
                  <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
55
                </div>
55
                </div>
56
              </div>
56
              </div>
57
            </t-dropdown>
57
            </t-dropdown>
58
            <t-button color="secondary" icon="loading" class="reset-btn" @click="reset"></t-button>
59
          </div>
58
          </div>
60
        </div>
59
        </div>
61
        <div class="animate-demo-wrapper">
60
        <div class="animate-demo-wrapper">
63
            <div v-show="slideVisible" class="transition-box allCondition">
62
            <div v-show="slideVisible" class="transition-box allCondition">
64
              <div class="input-rule">
63
              <div class="input-rule">
65
                <span>开始时间:</span>
64
                <span>开始时间:</span>
66
                <t-date-picker :confirm="false" v-model="searchdata.beginDay" placeholder="请选择开始时间" style="width:200px;height:32px"></t-date-picker>
65
                <t-date-picker :confirm="false" v-model="searchdata.beginDay" placeholder="请选择开始时间" style="width:320px;height:32px"></t-date-picker>
67
              </div>
66
              </div>
68
              <div class="input-rule">
67
              <div class="input-rule">
69
                <span>结束时间:</span>
68
                <span>结束时间:</span>
70
                <t-date-picker :confirm="false" v-model="searchdata.endDay" placeholder="请选择结束时间" style="width:320px;height:32px"></t-date-picker>
69
                <t-date-picker :confirm="false" v-model="searchdata.endDay" placeholder="请选择结束时间" style="width:320px;height:32px"></t-date-picker>
71
              </div>
70
              </div>
71
              <a style="float:right;color:#0089d4;" @click="reset" href="javascript:;">重置</a>
72
            </div>
72
            </div>
73
          </transition>
73
          </transition>
74
        </div>
74
        </div>
87
      <t-table-column v-if="columns[4].show" :formatter="date_formatter" label="职务" prop="employeePositionZh" width="80px">
87
      <t-table-column v-if="columns[4].show" :formatter="date_formatter" label="职务" prop="employeePositionZh" width="80px">
88
      </t-table-column>
88
      </t-table-column>
89
      <t-table-column v-if="columns[5].show" :formatter="date_formatter" prop="simi" label="相似度" width="75px">
89
      <t-table-column v-if="columns[5].show" :formatter="date_formatter" prop="simi" label="相似度" width="75px">
90
        <template v-slot="{row}">
91
          {{ getSimi(row) }}
92
        </template>
90
      </t-table-column>
93
      </t-table-column>
91
      <t-table-column v-if="columns[6].show" :formatter="date_formatter" label="进出时间" prop="taskExecuteTime" width="160px">
94
      <t-table-column v-if="columns[6].show" :formatter="date_formatter" label="进出时间" prop="taskExecuteTime" width="160px">
92
      </t-table-column>
95
      </t-table-column>
568
      } else {
571
      } else {
569
        return cellValue
572
        return cellValue
570
      }
573
      }
574
    },
575
    getSimi (row) {
576
      return (row.simi.split('%')[0] - 0).toFixed(2) + '%'
571
    }
577
    }
572
    // //将分数转换为小数
578
    // //将分数转换为小数
573
    // toPoint (percent) {
579
    // toPoint (percent) {
629
      justify-content: space-between;
635
      justify-content: space-between;
630
      border: 1px solid rgba(0, 0, 0, 0.09);
636
      border: 1px solid rgba(0, 0, 0, 0.09);
631
      background-color: #f8f9fa;
637
      background-color: #f8f9fa;
632
      flex-wrap: wrap;
638
      flex-wrap: nowrap;
639
      align-items: center;
633
      padding: 20px;
640
      padding: 20px;
634
      margin: 5px auto;
641
      margin: 5px auto;
635
      .input-rule {
642
      .input-rule {
636
        flex: 1;
643
        flex: 1;
637
        width: 50%;
638
        min-width: 50%;
639
        max-width: 50%;
640
        padding: 10px 0 10px 20px;
644
        padding: 10px 0 10px 20px;
641
      }
645
      }
642
    }
646
    }

+ 6 - 8
security-protection-platform/src/modules/aialarm/index.vue

21
        <t-button color="primary" @click="btnsearch">查询</t-button>
21
        <t-button color="primary" @click="btnsearch">查询</t-button>
22
        <t-button @click="reset">重置</t-button>
22
        <t-button @click="reset">重置</t-button>
23
      </div>
23
      </div>
24
      <t-button color="primary" icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
24
       <t-button  icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
25

25

26
    </div> -->
26
    </div> -->
27
    <div class="track-container">
27
    <div class="track-container">
39
            </div>
39
            </div>
40
          </div>
40
          </div>
41
          <div class="btns">
41
          <div class="btns">
42
            <t-button color="primary" icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
42
            <t-button icon="upload" style="width:128px;height:32px" class="upload">导出至Excel</t-button>
43
            <t-dropdown :visibled="customVisibled" trigger-mode="custom">
43
            <t-dropdown :visibled="customVisibled" trigger-mode="custom">
44
              <t-button slot="trigger" color="secondary" icon="tile-four-outline" @click="onTriggerClick"></t-button>
44
              <t-button slot="trigger" color="secondary" icon="tile-four-outline" class="trigger-button" @click="onTriggerClick"></t-button>
45
              <div slot="popper">
45
              <div slot="popper">
46
                <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
46
                <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
47
                  <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
47
                  <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
57
                </div>
57
                </div>
58
              </div>
58
              </div>
59
            </t-dropdown>
59
            </t-dropdown>
60
            <t-button color="secondary" icon="loading" class="reset-btn" @click="reset"></t-button>
61
          </div>
60
          </div>
62
        </div>
61
        </div>
63
        <div class="animate-demo-wrapper">
62
        <div class="animate-demo-wrapper">
71
                <span>结束时间:</span>
70
                <span>结束时间:</span>
72
                <t-date-picker :confirm="false" v-model="searchdata.endTime" placeholder="请选择结束时间" style="width:320px;height:32px"></t-date-picker>
71
                <t-date-picker :confirm="false" v-model="searchdata.endTime" placeholder="请选择结束时间" style="width:320px;height:32px"></t-date-picker>
73
              </div>
72
              </div>
73
              <a style="float:right;color:#0089d4;" @click="reset" href="javascript:;">重置</a>
74
            </div>
74
            </div>
75
          </transition>
75
          </transition>
76
        </div>
76
        </div>
585
      justify-content: space-between;
585
      justify-content: space-between;
586
      border: 1px solid rgba(0, 0, 0, 0.09);
586
      border: 1px solid rgba(0, 0, 0, 0.09);
587
      background-color: #f8f9fa;
587
      background-color: #f8f9fa;
588
      flex-wrap: wrap;
588
      flex-wrap: nowrap;
589
      align-items: center;
589
      padding: 20px;
590
      padding: 20px;
590
      margin: 5px auto;
591
      margin: 5px auto;
591
      .input-rule {
592
      .input-rule {
592
        flex: 1;
593
        flex: 1;
593
        width: 50%;
594
        min-width: 50%;
595
        max-width: 50%;
596
        padding: 10px 0 10px 20px;
594
        padding: 10px 0 10px 20px;
597
      }
595
      }
598
    }
596
    }

+ 5 - 7
security-protection-platform/src/modules/attendance/abnormal/index.vue

14
              </div>
14
              </div>
15
            </div>
15
            </div>
16
            <div class="btns">
16
            <div class="btns">
17
              <t-button color="primary">
17
              <t-button>
18
                <t-icon size="14" icon="upload-outline"></t-icon> 导出至Excel
18
                <t-icon size="14" icon="upload-outline"></t-icon> 导出至Excel
19
              </t-button>
19
              </t-button>
20
              <t-dropdown :visibled="customVisibled" trigger-mode="custom">
20
              <t-dropdown :visibled="customVisibled" trigger-mode="custom">
21
                <t-button slot="trigger" color="secondary" icon="tile-four-outline" @click="onTriggerClick"></t-button>
21
                <t-button slot="trigger" color="secondary" icon="tile-four-outline" class="trigger-button" @click="onTriggerClick"></t-button>
22
                <div slot="popper">
22
                <div slot="popper">
23
                  <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
23
                  <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
24
                    <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
24
                    <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
34
                  </div>
34
                  </div>
35
                </div>
35
                </div>
36
              </t-dropdown>
36
              </t-dropdown>
37
              <t-button color="secondary" icon="loading" class="reset-btn" @click="resetData"></t-button>
38
            </div>
37
            </div>
39
          </div>
38
          </div>
40
          <div class="animate-demo-wrapper">
39
          <div class="animate-demo-wrapper">
44
                  <span>部门/员工:</span>
43
                  <span>部门/员工:</span>
45
                  <dept-staff-cascader v-model="form" @inited="handleInited" @getOrgId="getDailyOrgId" @getDepId="getDailyDepId" @getStaffId="getDailyStaffId" />
44
                  <dept-staff-cascader v-model="form" @inited="handleInited" @getOrgId="getDailyOrgId" @getDepId="getDailyDepId" @getStaffId="getDailyStaffId" />
46
                </div>
45
                </div>
46
                <a style="float:right;color:#0089d4;" @click="resetData" href="javascript:;">重置</a>
47
              </div>
47
              </div>
48
            </transition>
48
            </transition>
49
          </div>
49
          </div>
317
      justify-content: space-between;
317
      justify-content: space-between;
318
      border: 1px solid rgba(0, 0, 0, 0.09);
318
      border: 1px solid rgba(0, 0, 0, 0.09);
319
      background-color: #f8f9fa;
319
      background-color: #f8f9fa;
320
      flex-wrap: wrap;
320
      flex-wrap: nowrap;
321
      align-items: center;
321
      padding: 20px;
322
      padding: 20px;
322
      margin: 5px auto;
323
      margin: 5px auto;
323
      .input-rule {
324
      .input-rule {
324
        display: flex;
325
        display: flex;
325
        flex: 1;
326
        flex: 1;
326
        width: 80%;
327
        min-width: 80%;
328
        max-width: 80%;
329
        padding: 10px 0 10px 20px;
327
        padding: 10px 0 10px 20px;
330
        > span {
328
        > span {
331
          line-height: 32px;
329
          line-height: 32px;

+ 7 - 13
security-protection-platform/src/modules/attendance/report/index.vue

17
                  </div>
17
                  </div>
18
                </div>
18
                </div>
19
                <div class="btns">
19
                <div class="btns">
20
                  <t-button color="primary">
20
                  <t-button>
21
                    <t-icon size="14" icon="upload-outline"></t-icon> 导出至Excel
21
                    <t-icon size="14" icon="upload-outline"></t-icon> 导出至Excel
22
                  </t-button>
22
                  </t-button>
23
                  <t-dropdown :visibled="customVisibled0" trigger-mode="custom">
23
                  <t-dropdown :visibled="customVisibled0" trigger-mode="custom">
24
                    <t-button slot="trigger" color="secondary" icon="tile-four-outline" @click="onTriggerClick"></t-button>
24
                    <t-button slot="trigger" color="secondary" icon="tile-four-outline" class="trigger-button" @click="onTriggerClick"></t-button>
25
                    <div slot="popper">
25
                    <div slot="popper">
26
                      <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
26
                      <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
27
                        <t-checkbox-group v-model="social0" vertical @change="checkAllGroupChange">
27
                        <t-checkbox-group v-model="social0" vertical @change="checkAllGroupChange">
37
                      </div>
37
                      </div>
38
                    </div>
38
                    </div>
39
                  </t-dropdown>
39
                  </t-dropdown>
40
                  <t-button color="secondary" icon="loading" class="reset-btn" @click="resetDailyData"></t-button>
41
                </div>
40
                </div>
42
              </div>
41
              </div>
43
              <div class="animate-demo-wrapper">
42
              <div class="animate-demo-wrapper">
47
                      <span>部门/员工:</span>
46
                      <span>部门/员工:</span>
48
                      <dept-staff-cascader v-model="dailyForm" @inited="handleDailyInited" @getOrgId="getDailyOrgId" @getDepId="getDailyDepId" @getStaffId="getDailyStaffId" />
47
                      <dept-staff-cascader v-model="dailyForm" @inited="handleDailyInited" @getOrgId="getDailyOrgId" @getDepId="getDailyDepId" @getStaffId="getDailyStaffId" />
49
                    </div>
48
                    </div>
50
49
                    <a style="float:right;color:#0089d4;" @click="resetDailyData" href="javascript:;">重置</a>
51
                  </div>
50
                  </div>
52
                </transition>
51
                </transition>
53
              </div>
52
              </div>
82
                  </div>
81
                  </div>
83
                </div>
82
                </div>
84
                <div class="btns">
83
                <div class="btns">
85
                  <t-button color="primary">
84
                  <t-button>
86
                    <t-icon size="14" icon="upload-outline"></t-icon> 导出至Excel
85
                    <t-icon size="14" icon="upload-outline"></t-icon> 导出至Excel
87
                  </t-button>
86
                  </t-button>
88
                  <t-dropdown :visibled="customVisibled1" trigger-mode="custom">
87
                  <t-dropdown :visibled="customVisibled1" trigger-mode="custom">
89
                    <t-button slot="trigger" color="secondary" icon="tile-four-outline" @click="onTriggerClick"></t-button>
88
                    <t-button slot="trigger" color="secondary" icon="tile-four-outline" class="trigger-button" @click="onTriggerClick"></t-button>
90
                    <div slot="popper">
89
                    <div slot="popper">
91
                      <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
90
                      <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
92
                        <t-checkbox-group v-model="social1" vertical @change="checkAllGroupChange">
91
                        <t-checkbox-group v-model="social1" vertical @change="checkAllGroupChange">
102
                      </div>
101
                      </div>
103
                    </div>
102
                    </div>
104
                  </t-dropdown>
103
                  </t-dropdown>
105
                  <t-button color="secondary" icon="loading" class="reset-btn" @click="resetMonthData"></t-button>
106
                </div>
104
                </div>
107
              </div>
105
              </div>
108
              <div class="animate-demo-wrapper">
106
              <div class="animate-demo-wrapper">
111
                    <div class="input-rule">
109
                    <div class="input-rule">
112
                      <span>部门/员工:</span>
110
                      <span>部门/员工:</span>
113
                      <dept-staff-cascader v-model="monthlyForm" @getOrgId="getMonthOrgId" @getDepId="getMonthDepId" @getStaffId="getMonthStaffId" />
111
                      <dept-staff-cascader v-model="monthlyForm" @getOrgId="getMonthOrgId" @getDepId="getMonthDepId" @getStaffId="getMonthStaffId" />
114
                      <div class="search-btn">
115
                      </div>
116
117
                    </div>
112
                    </div>
113
                    <a style="float:right;color:#0089d4;" @click="resetMonthData" href="javascript:;">重置</a>
118
                  </div>
114
                  </div>
119
                </transition>
115
                </transition>
120
              </div>
116
              </div>
601
      border: 1px solid rgba(0, 0, 0, 0.09);
597
      border: 1px solid rgba(0, 0, 0, 0.09);
602
      background-color: #f8f9fa;
598
      background-color: #f8f9fa;
603
      flex-wrap: wrap;
599
      flex-wrap: wrap;
600
      align-items: center;
604
      padding: 20px;
601
      padding: 20px;
605
      margin: 5px auto;
602
      margin: 5px auto;
606
      .input-rule {
603
      .input-rule {
607
        display: flex;
604
        display: flex;
608
        flex: 1;
605
        flex: 1;
609
        width: 80%;
610
        min-width: 80%;
611
        max-width: 80%;
612
        padding: 10px 0 10px 20px;
606
        padding: 10px 0 10px 20px;
613
        > span {
607
        > span {
614
          line-height: 32px;
608
          line-height: 32px;

+ 40 - 31
security-protection-platform/src/modules/dashboard/index.vue

1
<template>
1
<template>
2
  <div class="index" style="overflow:hidden;">
2
  <div class="index" style="overflow:hidden;">
3
    <div :style="`background-image: url(${imgBg})`" class="top" >
3
    <div :style="`background-image: url(${imgBg})`" class="top">
4
      <img src="@/assets/images/AsiainfoLogo.png" class="top-logo">
4
      <img src="@/assets/images/AsiainfoLogo.png" class="top-logo">
5
      <div style="position: absolute;top:50%;left:54%;transform: translate(-50%,-50%);vertical-align: middle; color: white; font-size: 14px">
5
      <div style="position: absolute;top:50%;left:54%;transform: translate(-50%,-50%);vertical-align: middle; color: white; font-size: 14px">
6
        <b> | AISI安防一体化平台</b></div>
6
        <b> | AISI安防一体化平台</b>
7
      </div>
7
    </div>
8
    </div>
8
    <div>
9
    <div>
9
      <div class="time"><span style="color: #00d8f3;font-size: 21px;">{{ nowDate | dateFormat }}</span></div>
10
      <div class="time"><span style="color: #00d8f3;font-size: 21px;">{{ nowDate | dateFormat }}</span></div>
20
          <div id="doughnut" style="height: 100%;width: 100%"></div>
21
          <div id="doughnut" style="height: 100%;width: 100%"></div>
21
        </div>
22
        </div>
22
        <div :style="`height:34%;margin-top: 3%;`" class="body-left-item">
23
        <div :style="`height:34%;margin-top: 3%;`" class="body-left-item">
23
          <div :style="`background-image: url(${titleImgBg})`" class="title" id="div1">
24
          <div id="div1" :style="`background-image: url(${titleImgBg})`" class="title">
24
            <span class="title-span">告警分析</span>
25
            <span class="title-span">告警分析</span>
25
          </div>
26
          </div>
26
          <div id="bar" style="height: 100%;width: 100%"></div>
27
          <div id="bar" style="height: 100%;width: 100%"></div>
46
        </div>
47
        </div>
47
        <!--        <video-player ref="videoPlayer" :options="videoOptions" :playsinline="true" class="vjs-custom-skin videoPlayer"></video-player>-->
48
        <!--        <video-player ref="videoPlayer" :options="videoOptions" :playsinline="true" class="vjs-custom-skin videoPlayer"></video-player>-->
48
        <div id="div11">
49
        <div id="div11">
49
          <video-player v-if="videoOptions !== {}" ref="videoPlayer" :options="videoOptions" :playsinline="true"  id="div111" class="vjs-custom-skin videoPlayer">
50
          <video-player v-if="videoOptions !== {}" id="div111" ref="videoPlayer" :options="videoOptions" :playsinline="true" class="vjs-custom-skin videoPlayer">
50
51
51
          </video-player>
52
          </video-player>
52
        </div>
53
        </div>
101
import 'vue-video-player/src/custom-theme.css'
102
import 'vue-video-player/src/custom-theme.css'
102
import 'videojs-flash'
103
import 'videojs-flash'
103
import videojs from 'video.js'
104
import videojs from 'video.js'
104
import EventBus from "../../bus";
105
import EventBus from '../../bus'
105
window.videojs = videojs
106
window.videojs = videojs
106
107
107
require('video.js/dist/lang/zh-CN.js')
108
require('video.js/dist/lang/zh-CN.js')
179
    setInterval(() => { // 识别记录
180
    setInterval(() => { // 识别记录
180
      this.initRecognition()
181
      this.initRecognition()
181
    }, 5000)
182
    }, 5000)
183
    // console.log(textDom.nextSibling)
184
    // textDom.nextSibling.nodeValue = ''
182
    // EventBus.$on('sendAiData', (msg) => { // 获取镜屏推送消息
185
    // EventBus.$on('sendAiData', (msg) => { // 获取镜屏推送消息
183
    //   console.log('已接收镜屏消息...')
186
    //   console.log('已接收镜屏消息...')
184
    //   var oDiv = document.getElementById("div111");
187
    //   var oDiv = document.getElementById("div111");
196
    // })
199
    // })
197
  },
200
  },
198
  methods: {
201
  methods: {
199
    testHKK(box, alarmMemo) {
202
    testHKK (box, alarmMemo) {
200
      var width = box[2] - box[0]
203
      var width = box[2] - box[0]
201
      var height = box[3] - box[1]
204
      var height = box[3] - box[1]
202
      var oDiv = document.getElementById("div111");
205
      var oDiv = document.getElementById('div111')
203
      // var aBox = this.getByClass(oDiv,"vjs-tech");
206
      // var aBox = this.getByClass(oDiv,"vjs-tech");
204
      // alert(aBox.length);
207
      // alert(aBox.length);
205
      var e = oDiv;
206
      var div = document.createElement("div");
208
      var e = oDiv
209
      var div = document.createElement('div')
207
      // div.className = "form-group";
210
      // div.className = "form-group";
208
      var del = document.createElement('p')
211
      var del = document.createElement('p')
209
      var x = 10 + this.hkk
212
      var x = 10 + this.hkk
210
      this.hkk ++
211
      del.innerHTML = '<div class="hkk" style="color: white;border: 2px solid #00d8f3;position: absolute;top: ' + box[1] + 'px;left: ' + box[0] + 'px;width: ' + width + 'px;height: ' + height + 'px;"> ' + alarmMemo + ' </div>';
212
      div.appendChild(del);
213
      e.appendChild(div);
214
      setTimeout(function() {
215
        del.remove();
213
      this.hkk++
214
      del.innerHTML = '<div class="hkk" style="color: white;border: 2px solid #00d8f3;position: absolute;top: ' + box[1] + 'px;left: ' + box[0] + 'px;width: ' + width + 'px;height: ' + height + 'px;"> ' + alarmMemo + ' </div>'
215
      div.appendChild(del)
216
      e.appendChild(div)
217
      setTimeout(function () {
218
        del.remove()
216
      }, 3000)
219
      }, 3000)
217
    },
220
    },
218
221
219
220
    findInArr(arr,n){
221
      for(var i=0;i<arr.length;i++){
222
        if(arr[i] == n){
223
          return true;
222
    findInArr (arr, n) {
223
      for (var i = 0; i < arr.length; i++) {
224
        if (arr[i] == n) {
225
          return true
224
        }
226
        }
225
      }
227
      }
226
      return false;
228
      return false
227
    },
229
    },
228
    getByClass(oParent,sClass){
229
      var ret = [];
230
      var aEle = oParent.getElementsByTagName("*");
231
      for(var i = 0; i < aEle.length; i++){
232
        var _aTmp = aEle[i].className.split(" ");
233
        if(this.findInArr(_aTmp,sClass)){
234
          ret.push(aEle[i]);
230
    getByClass (oParent, sClass) {
231
      var ret = []
232
      var aEle = oParent.getElementsByTagName('*')
233
      for (var i = 0; i < aEle.length; i++) {
234
        var _aTmp = aEle[i].className.split(' ')
235
        if (this.findInArr(_aTmp, sClass)) {
236
          ret.push(aEle[i])
235
        }
237
        }
236
      }
238
      }
237
      return ret;
239
      return ret
238
    },
240
    },
239
    async createMyButton () {
241
    async createMyButton () {
240
      this.$nextTick(() => {
242
      this.$nextTick(() => {
243
        let start = document.getElementsByClassName('vjs-play-control vjs-control vjs-button')
245
        let start = document.getElementsByClassName('vjs-play-control vjs-control vjs-button')
244
        let volume = document.getElementsByClassName('vjs-volume-panel vjs-control vjs-volume-panel-horizontal')
246
        let volume = document.getElementsByClassName('vjs-volume-panel vjs-control vjs-volume-panel-horizontal')
245
        let text = document.getElementsByClassName('vjs-live-control vjs-control')
247
        let text = document.getElementsByClassName('vjs-live-control vjs-control')
248
        // 删除直播文本节点
249
        let textDoms = document.querySelectorAll('.vjs-live-control .vjs-live-display .vjs-control-text')
250
        textDoms.forEach(item => {
251
          // 这样设置没用 不知道为啥 明明在nextTick中 真正的“直播”文本节点还是没选到
252
          item.nextSibling.nodeValue = ''
253
          // item.nextSibling.data = ''
254
        })
246
        bars.forEach((item, index) => {
255
        bars.forEach((item, index) => {
247
          time.forEach(item => {
256
          time.forEach(item => {
248
            item.remove()
257
            item.remove()
385
          data = data.slice(0, 4)
394
          data = data.slice(0, 4)
386
        }
395
        }
387
        data.forEach(e => {
396
        data.forEach(e => {
388
          if (e.employeeName == null || e.employeeName == ''){
397
          if (e.employeeName == null || e.employeeName == '') {
389
            e.employeeCode = '未识别成功'
398
            e.employeeCode = '未识别成功'
390
          }
399
          }
391
          e.simi = e.simi.split('.')[0] + '%'
400
          e.simi = e.simi.split('.')[0] + '%'
856
.vjs-tech {
865
.vjs-tech {
857
  pointer-events: none;
866
  pointer-events: none;
858
}
867
}
859
.checkedIndex{
868
.checkedIndex {
860
  border: 1px solid #009bf3;
869
  border: 1px solid #009bf3;
861
}
870
}
862
</style>
871
</style>

+ 3 - 5
security-protection-platform/src/modules/system/assignment/index.vue

23
                <t-icon icon="trash" size="16"></t-icon>删除
23
                <t-icon icon="trash" size="16"></t-icon>删除
24
              </t-button>
24
              </t-button>
25
              <t-dropdown :visibled="customVisibled" trigger-mode="custom">
25
              <t-dropdown :visibled="customVisibled" trigger-mode="custom">
26
                <t-button slot="trigger" color="secondary" icon="tile-four-outline" @click="onTriggerClick"></t-button>
26
                <t-button slot="trigger" color="secondary" icon="tile-four-outline" class="trigger-button" @click="onTriggerClick"></t-button>
27
                <div slot="popper">
27
                <div slot="popper">
28
                  <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
28
                  <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
29
                    <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
29
                    <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
39
                  </div>
39
                  </div>
40
                </div>
40
                </div>
41
              </t-dropdown>
41
              </t-dropdown>
42
              <t-button color="secondary" icon="loading" class="reset-btn" @click="resetData"></t-button>
43
            </div>
42
            </div>
44
          </div>
43
          </div>
45
          <div class="animate-demo-wrapper">
44
          <div class="animate-demo-wrapper">
59
                    <t-option v-for="item in taskStatusList" :key="item.id" :value="item.id">{{ item.description }}</t-option>
58
                    <t-option v-for="item in taskStatusList" :key="item.id" :value="item.id">{{ item.description }}</t-option>
60
                  </t-select>
59
                  </t-select>
61
                </div>
60
                </div>
61
                <a style="float:right;color:#0089d4;" @click="resetData" href="javascript:;">重置</a>
62
              </div>
62
              </div>
63
            </transition>
63
            </transition>
64
          </div>
64
          </div>
683
      border: 1px solid rgba(0, 0, 0, 0.09);
683
      border: 1px solid rgba(0, 0, 0, 0.09);
684
      background-color: #f8f9fa;
684
      background-color: #f8f9fa;
685
      flex-wrap: wrap;
685
      flex-wrap: wrap;
686
      align-items: center;
686
      padding: 20px;
687
      padding: 20px;
687
      margin: 5px auto;
688
      margin: 5px auto;
688
      .input-rule {
689
      .input-rule {
689
        flex: 1;
690
        flex: 1;
690
        width: 50%;
691
        min-width: 50%;
692
        max-width: 50%;
693
        padding: 10px 0 10px 20px;
691
        padding: 10px 0 10px 20px;
694
      }
692
      }
695
    }
693
    }

+ 3 - 5
security-protection-platform/src/modules/system/devicemana/index.vue

22
                <t-icon icon="trash" size="16"></t-icon>删除
22
                <t-icon icon="trash" size="16"></t-icon>删除
23
              </t-button>
23
              </t-button>
24
              <t-dropdown :visibled="customVisibled" trigger-mode="custom">
24
              <t-dropdown :visibled="customVisibled" trigger-mode="custom">
25
                <t-button slot="trigger" color="secondary" icon="tile-four-outline" @click="onTriggerClick"></t-button>
25
                <t-button slot="trigger" color="secondary" icon="tile-four-outline" class="trigger-button" @click="onTriggerClick"></t-button>
26
                <div slot="popper">
26
                <div slot="popper">
27
                  <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
27
                  <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
28
                    <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
28
                    <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
38
                  </div>
38
                  </div>
39
                </div>
39
                </div>
40
              </t-dropdown>
40
              </t-dropdown>
41
              <t-button color="secondary" icon="loading" class="reset-btn" @click="resetData"></t-button>
42
            </div>
41
            </div>
43
          </div>
42
          </div>
44
          <div class="animate-demo-wrapper">
43
          <div class="animate-demo-wrapper">
54
                  <span>设备编号:</span>
53
                  <span>设备编号:</span>
55
                  <t-input v-model="deviceId" style="width:320px" placeholder="请输入设备编号"></t-input>
54
                  <t-input v-model="deviceId" style="width:320px" placeholder="请输入设备编号"></t-input>
56
                </div>
55
                </div>
56
                <a style="float:right;color:#0089d4;" @click="resetData" href="javascript:;">重置</a>
57
              </div>
57
              </div>
58
            </transition>
58
            </transition>
59
          </div>
59
          </div>
343
      border: 1px solid rgba(0, 0, 0, 0.09);
343
      border: 1px solid rgba(0, 0, 0, 0.09);
344
      background-color: #f8f9fa;
344
      background-color: #f8f9fa;
345
      flex-wrap: wrap;
345
      flex-wrap: wrap;
346
      align-items: center;
346
      padding: 20px;
347
      padding: 20px;
347
      margin: 5px auto;
348
      margin: 5px auto;
348
      .input-rule {
349
      .input-rule {
349
        flex: 1;
350
        flex: 1;
350
        width: 50%;
351
        min-width: 50%;
352
        max-width: 50%;
353
        padding: 10px 0 10px 20px;
351
        padding: 10px 0 10px 20px;
354
      }
352
      }
355
    }
353
    }

+ 3 - 5
security-protection-platform/src/modules/usermana/index.vue

23
                <t-icon icon="trash" size="16"></t-icon>删除
23
                <t-icon icon="trash" size="16"></t-icon>删除
24
              </t-button>
24
              </t-button>
25
              <t-dropdown :visibled="customVisibled" trigger-mode="custom">
25
              <t-dropdown :visibled="customVisibled" trigger-mode="custom">
26
                <t-button slot="trigger" color="secondary" icon="tile-four-outline" @click="onTriggerClick"></t-button>
26
                <t-button slot="trigger" color="secondary" icon="tile-four-outline" class="trigger-button" @click="onTriggerClick"></t-button>
27
                <div slot="popper">
27
                <div slot="popper">
28
                  <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
28
                  <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
29
                    <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
29
                    <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
39
                  </div>
39
                  </div>
40
                </div>
40
                </div>
41
              </t-dropdown>
41
              </t-dropdown>
42
              <t-button color="secondary" icon="loading" class="reset-btn" @click="resetData"></t-button>
43
            </div>
42
            </div>
44
          </div>
43
          </div>
45
          <div class="animate-demo-wrapper">
44
          <div class="animate-demo-wrapper">
57
                    <t-select-tree v-model="departmentTypeId" :node-data="departmentTypesList" width="320px" node-key="id"></t-select-tree>
56
                    <t-select-tree v-model="departmentTypeId" :node-data="departmentTypesList" width="320px" node-key="id"></t-select-tree>
58
                  </template>
57
                  </template>
59
                </div>
58
                </div>
59
                <a style="float:right;color:#0089d4;" @click="resetData" href="javascript:;">重置</a>
60
              </div>
60
              </div>
61
            </transition>
61
            </transition>
62
          </div>
62
          </div>
476
      border: 1px solid rgba(0, 0, 0, 0.09);
476
      border: 1px solid rgba(0, 0, 0, 0.09);
477
      background-color: #f8f9fa;
477
      background-color: #f8f9fa;
478
      flex-wrap: wrap;
478
      flex-wrap: wrap;
479
      align-items: center;
479
      padding: 20px;
480
      padding: 20px;
480
      margin: 5px auto;
481
      margin: 5px auto;
481
      .input-rule {
482
      .input-rule {
482
        flex: 1;
483
        flex: 1;
483
        width: 50%;
484
        min-width: 50%;
485
        max-width: 50%;
486
        padding: 10px 0 10px 20px;
484
        padding: 10px 0 10px 20px;
487
      }
485
      }
488
    }
486
    }

+ 6 - 8
security-protection-platform/src/modules/workorder/index.vue

81
              <t-button color="primary" @click="cardReplacementModal=true">
81
              <t-button color="primary" @click="cardReplacementModal=true">
82
                <t-icon icon="plus-circle-outline" size="16"></t-icon> 补卡
82
                <t-icon icon="plus-circle-outline" size="16"></t-icon> 补卡
83
              </t-button>
83
              </t-button>
84
              <t-button color="primary">
84
              <t-button>
85
                <t-icon icon="upload" size="16"></t-icon> 导出至Excel
85
                <t-icon icon="upload" size="16"></t-icon> 导出至Excel
86
              </t-button>
86
              </t-button>
87
              <t-button color="primary" @click="importWorkOrderModal=true">
87
              <t-button @click="importWorkOrderModal=true">
88
                <t-icon icon="download" size="16"></t-icon> 导入
88
                <t-icon icon="download" size="16"></t-icon> 导入
89
              </t-button>
89
              </t-button>
90
              <a href="javascript:;"> 模板下载 <t-icon icon="cloud-download-outline" size="16" style="lineHeight:24px"></t-icon></a>
90
              <a href="javascript:;"> 模板下载 <t-icon icon="cloud-download-outline" size="16" style="lineHeight:24px"></t-icon></a>
91
              <t-dropdown :visibled="customVisibled" trigger-mode="custom">
91
              <t-dropdown :visibled="customVisibled" trigger-mode="custom">
92
                <t-button slot="trigger" color="secondary" icon="tile-four-outline" @click="onTriggerClick"></t-button>
92
                <t-button slot="trigger" color="secondary" icon="tile-four-outline" class="trigger-button" @click="onTriggerClick"></t-button>
93
                <div slot="popper">
93
                <div slot="popper">
94
                  <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
94
                  <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
95
                    <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
95
                    <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
105
                  </div>
105
                  </div>
106
                </div>
106
                </div>
107
              </t-dropdown>
107
              </t-dropdown>
108
              <t-button color="secondary" icon="loading" class="reset-btn" @click="resetData"></t-button>
109
            </div>
108
            </div>
110
          </div>
109
          </div>
111
          <div class="animate-demo-wrapper">
110
          <div class="animate-demo-wrapper">
119
                  <span>结束时间:</span>
118
                  <span>结束时间:</span>
120
                  <t-date-picker v-model="endDate" style="width:320px" placeholder="请选择结束时间" @date-change="endPickerDateChange"></t-date-picker>
119
                  <t-date-picker v-model="endDate" style="width:320px" placeholder="请选择结束时间" @date-change="endPickerDateChange"></t-date-picker>
121
                </div>
120
                </div>
121
                <a style="float:right;color:#0089d4;" @click="resetData" href="javascript:;">重置</a>
122
              </div>
122
              </div>
123
            </transition>
123
            </transition>
124
          </div>
124
          </div>
477
      justify-content: space-between;
477
      justify-content: space-between;
478
      border: 1px solid rgba(0, 0, 0, 0.09);
478
      border: 1px solid rgba(0, 0, 0, 0.09);
479
      background-color: #f8f9fa;
479
      background-color: #f8f9fa;
480
      flex-wrap: wrap;
480
      flex-wrap: nowrap;
481
      align-items: center;
481
      padding: 20px;
482
      padding: 20px;
482
      margin: 5px auto;
483
      margin: 5px auto;
483
      .input-rule {
484
      .input-rule {
484
        flex: 1;
485
        flex: 1;
485
        width: 50%;
486
        min-width: 50%;
487
        max-width: 50%;
488
        padding: 10px 0 10px 20px;
486
        padding: 10px 0 10px 20px;
489
      }
487
      }
490
    }
488
    }

+ 26 - 6
security-protection-platform/src/styles/index.scss

1
@import './variables.scss';
2
@import './sidebar.scss';
1
@import "./variables.scss";
2
@import "./sidebar.scss";
3
3
4
body {
4
body {
5
  // height: 100%;
5
  // height: 100%;
6
  -moz-osx-font-smoothing: grayscale;
6
  -moz-osx-font-smoothing: grayscale;
7
  -webkit-font-smoothing: antialiased;
7
  -webkit-font-smoothing: antialiased;
8
  text-rendering: optimizeLegibility;
8
  text-rendering: optimizeLegibility;
9
  font-family: PingFangSC-Regular, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
9
  font-family: PingFangSC-Regular, Hiragino Sans GB, Microsoft YaHei, Arial,
10
    sans-serif;
10
}
11
}
11
12
12
label {
13
label {
101
  display: block;
102
  display: block;
102
  line-height: 32px;
103
  line-height: 32px;
103
  font-size: 16px;
104
  font-size: 16px;
104
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
105
  font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen,
106
    Ubuntu, Cantarell, "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
105
  color: #2c3e50;
107
  color: #2c3e50;
106
  -webkit-font-smoothing: antialiased;
108
  -webkit-font-smoothing: antialiased;
107
  -moz-osx-font-smoothing: grayscale;
109
  -moz-osx-font-smoothing: grayscale;
131
}
133
}
132
134
133
.text-center {
135
.text-center {
134
  text-align: center
136
  text-align: center;
135
}
137
}
136
138
137
.sub-navbar {
139
.sub-navbar {
142
  text-align: right;
144
  text-align: right;
143
  padding-right: 20px;
145
  padding-right: 20px;
144
  transition: 600ms ease position;
146
  transition: 600ms ease position;
145
  background: linear-gradient(90deg, rgba(32, 182, 249, 1) 0%, rgba(32, 182, 249, 1) 0%, rgba(33, 120, 241, 1) 100%, rgba(33, 120, 241, 1) 100%);
147
  background: linear-gradient(
148
    90deg,
149
    rgba(32, 182, 249, 1) 0%,
150
    rgba(32, 182, 249, 1) 0%,
151
    rgba(33, 120, 241, 1) 100%,
152
    rgba(33, 120, 241, 1) 100%
153
  );
146
154
147
  .subtitle {
155
  .subtitle {
148
    font-size: 20px;
156
    font-size: 20px;
186
.multiselect--active {
194
.multiselect--active {
187
  z-index: 1000 !important;
195
  z-index: 1000 !important;
188
}
196
}
197
198
// 解决筛选按钮的错位问题
199
.trigger-button {
200
  // transform: translateY(1.5px);
201
  height: 100%;
202
}
203
.track-container .search-container .search-ctn .btns{
204
  display: flex !important;
205
}
206
.dropdown{
207
  height: 32px;
208
}