Browse Source

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

wangchao 4 years ago
parent
commit
90ffbb6105
19 changed files with 205 additions and 166 deletions
  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,16 +1,15 @@
1 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 6
import org.apache.commons.lang.StringUtils;
8 7
import org.springframework.beans.factory.annotation.Autowired;
9 8
import org.springframework.stereotype.Service;
10 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 14
@Service
16 15
public class FileManageServiceImpl implements FileManageService {

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

@ -1,6 +1,23 @@
1 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 21
import com.ai.bss.components.common.util.ImageBase64Converter;
5 22
import com.ai.bss.components.ebcai.service.EbcAiService;
6 23
import com.ai.bss.monitorManage.constant.MonitorManageConsts;
@ -11,28 +28,17 @@ import com.ai.bss.monitorManage.service.aiIden.ProxyFactory;
11 28
import com.ai.bss.monitorManage.service.interfaces.AiIdenInterfaces;
12 29
import com.ai.bss.monitorManage.service.interfaces.FileManageService;
13 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 37
import com.alibaba.fastjson.JSON;
16 38
import com.alibaba.fastjson.JSONArray;
17 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 43
@Slf4j
38 44
@Service

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

@ -16,6 +16,7 @@ import java.util.HashMap;
16 16
import java.util.Iterator;
17 17
import java.util.List;
18 18
import java.util.Map;
19
import java.util.Map.Entry;
19 20
import java.util.Timer;
20 21
import java.util.TimerTask;
21 22
@ -31,7 +32,6 @@ import com.ai.bss.monitorManage.constant.MonitorManageConsts;
31 32
import com.ai.bss.monitorManage.service.interfaces.KafkaProcess;
32 33
import com.ai.bss.monitorManage.service.interfaces.ListeningFileDirectoryService;
33 34
import com.ai.bss.monitorManage.utils.FileUtils;
34
import com.alibaba.fastjson.JSONObject;
35 35
import com.mzlion.core.lang.StringUtils;
36 36
37 37
import lombok.extern.slf4j.Slf4j;
@ -49,9 +49,10 @@ public class ListeningFileDirectoryServiceImpl  implements ListeningFileDirector
49 49
    @Autowired
50 50
    private KafkaProcess kafkaProcess;
51 51
    
52
    private static Map<String,Timer> timerMap=new HashMap<String,Timer>();
53
    
52
    //防止重启后重复监控文件
54 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 57
    @Override
57 58
    public void getFile(String filePath,int index)  {
@ -66,7 +67,7 @@ public class ListeningFileDirectoryServiceImpl  implements ListeningFileDirector
66 67
    	timerMap.get(timerMapKey).schedule(new TimerTask() {
67 68
            @Override
68 69
            public void run() {
69
                WatchKey key;
70
                WatchKey watchKey;
70 71
                //System.out.println("filePath:   " + filePath);
71 72
                log.info("filePath:   " + filePath);
72 73
                String mapKey = "";
@ -79,10 +80,12 @@ public class ListeningFileDirectoryServiceImpl  implements ListeningFileDirector
79 80
                            File file = new File(filePath);//path为监听文件夹
80 81
                            //System.out.println("等待图片加载!");
81 82
                            log.info("等待图片加载!");
82
                            key = watchService.take();//没有文件增加时,阻塞在这里
83
                            watchKey = watchService.take();//没有文件增加时,阻塞在这里
84
                            keyMap.put(timerMapKey, watchKey);
85
                            
83 86
                            int i = 0;
84 87
                            String[] fileContent = new String[3600];
85
                            for (WatchEvent<?> event : key.pollEvents()) {
88
                            for (WatchEvent<?> event : watchKey.pollEvents()) {
86 89
                                String fileName = filePath+MonitorManageConsts.getSystemSeparator()+event.context();
87 90
                                //System.out.println("增加文件的文件夹路径== :"+fileName);
88 91
                                //System.out.println("增加文件的名称== :"+event.context());
@ -125,7 +128,7 @@ public class ListeningFileDirectoryServiceImpl  implements ListeningFileDirector
125 128
//                                Map<String, String> fileMap = fileManageService.uploadFile(mfile,null);
126 129
//                                System.out.println("pictureUrl=== " + fileMap.get("pictureUrl"));
127 130
128
                            }if (!key.reset()) {
131
                            }if (!watchKey.reset()) {
129 132
                                break; //中断循环
130 133
                            }
131 134
                        }
@ -172,12 +175,26 @@ public class ListeningFileDirectoryServiceImpl  implements ListeningFileDirector
172 175
		}
173 176
    	
174 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 198
        }catch(Exception e){
182 199
           log.error("removeTimer is error :"+e.getMessage());  
183 200
           return "关闭失败";

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

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

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

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

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

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

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

@ -56,17 +56,17 @@ module.exports = {
56 56
  //imagePrefix: url => `${subappURL}/asset/image/${url}`, // 作为子应用必须启用
57 57
  //fontPrefix: url => `${subappURL}/asset/font/${url}`, // 作为子应用必须启用
58 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,9 +39,9 @@ const conf = {
39 39
  },
40 40
  root: {
41 41
    default: {
42
      baseURL: 'http://10.19.90.34:8018'
42
      // baseURL: 'http://10.19.90.34:8018'
43 43
        // baseURL: 'http://localhost:8018'
44
        // baseURL: '/sp'
44
        baseURL: '/sp'
45 45
    },
46 46
    picurl: {
47 47
      baseURL: 'http://10.19.90.34:19000/tool-image/'

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

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

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

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

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

@ -21,7 +21,7 @@
21 21
        <t-button color="primary" @click="btnsearch">查询</t-button>
22 22
        <t-button @click="reset">重置</t-button>
23 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 26
    </div> -->
27 27
    <div class="track-container">
@ -39,9 +39,9 @@
39 39
            </div>
40 40
          </div>
41 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 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 45
              <div slot="popper">
46 46
                <div style="border-radius: 5px;padding: 20px 20px 20px 20px;background-color: white;">
47 47
                  <t-checkbox-group v-model="social" vertical @change="checkAllGroupChange">
@ -57,7 +57,6 @@
57 57
                </div>
58 58
              </div>
59 59
            </t-dropdown>
60
            <t-button color="secondary" icon="loading" class="reset-btn" @click="reset"></t-button>
61 60
          </div>
62 61
        </div>
63 62
        <div class="animate-demo-wrapper">
@ -71,6 +70,7 @@
71 70
                <span>结束时间:</span>
72 71
                <t-date-picker :confirm="false" v-model="searchdata.endTime" placeholder="请选择结束时间" style="width:320px;height:32px"></t-date-picker>
73 72
              </div>
73
              <a style="float:right;color:#0089d4;" @click="reset" href="javascript:;">重置</a>
74 74
            </div>
75 75
          </transition>
76 76
        </div>
@ -585,14 +585,12 @@ export default {
585 585
      justify-content: space-between;
586 586
      border: 1px solid rgba(0, 0, 0, 0.09);
587 587
      background-color: #f8f9fa;
588
      flex-wrap: wrap;
588
      flex-wrap: nowrap;
589
      align-items: center;
589 590
      padding: 20px;
590 591
      margin: 5px auto;
591 592
      .input-rule {
592 593
        flex: 1;
593
        width: 50%;
594
        min-width: 50%;
595
        max-width: 50%;
596 594
        padding: 10px 0 10px 20px;
597 595
      }
598 596
    }

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

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

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

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

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

@ -1,9 +1,10 @@
1 1
<template>
2 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 4
      <img src="@/assets/images/AsiainfoLogo.png" class="top-logo">
5 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 8
    </div>
8 9
    <div>
9 10
      <div class="time"><span style="color: #00d8f3;font-size: 21px;">{{ nowDate | dateFormat }}</span></div>
@ -20,7 +21,7 @@
20 21
          <div id="doughnut" style="height: 100%;width: 100%"></div>
21 22
        </div>
22 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 25
            <span class="title-span">告警分析</span>
25 26
          </div>
26 27
          <div id="bar" style="height: 100%;width: 100%"></div>
@ -46,7 +47,7 @@
46 47
        </div>
47 48
        <!--        <video-player ref="videoPlayer" :options="videoOptions" :playsinline="true" class="vjs-custom-skin videoPlayer"></video-player>-->
48 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 52
          </video-player>
52 53
        </div>
@ -101,7 +102,7 @@ import 'video.js/dist/video-js.css'
101 102
import 'vue-video-player/src/custom-theme.css'
102 103
import 'videojs-flash'
103 104
import videojs from 'video.js'
104
import EventBus from "../../bus";
105
import EventBus from '../../bus'
105 106
window.videojs = videojs
106 107
107 108
require('video.js/dist/lang/zh-CN.js')
@ -179,6 +180,8 @@ export default {
179 180
    setInterval(() => { // 识别记录
180 181
      this.initRecognition()
181 182
    }, 5000)
183
    // console.log(textDom.nextSibling)
184
    // textDom.nextSibling.nodeValue = ''
182 185
    // EventBus.$on('sendAiData', (msg) => { // 获取镜屏推送消息
183 186
    //   console.log('已接收镜屏消息...')
184 187
    //   var oDiv = document.getElementById("div111");
@ -196,45 +199,44 @@ export default {
196 199
    // })
197 200
  },
198 201
  methods: {
199
    testHKK(box, alarmMemo) {
202
    testHKK (box, alarmMemo) {
200 203
      var width = box[2] - box[0]
201 204
      var height = box[3] - box[1]
202
      var oDiv = document.getElementById("div111");
205
      var oDiv = document.getElementById('div111')
203 206
      // var aBox = this.getByClass(oDiv,"vjs-tech");
204 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 210
      // div.className = "form-group";
208 211
      var del = document.createElement('p')
209 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 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 241
    async createMyButton () {
240 242
      this.$nextTick(() => {
@ -243,6 +245,13 @@ export default {
243 245
        let start = document.getElementsByClassName('vjs-play-control vjs-control vjs-button')
244 246
        let volume = document.getElementsByClassName('vjs-volume-panel vjs-control vjs-volume-panel-horizontal')
245 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 255
        bars.forEach((item, index) => {
247 256
          time.forEach(item => {
248 257
            item.remove()
@ -385,7 +394,7 @@ export default {
385 394
          data = data.slice(0, 4)
386 395
        }
387 396
        data.forEach(e => {
388
          if (e.employeeName == null || e.employeeName == ''){
397
          if (e.employeeName == null || e.employeeName == '') {
389 398
            e.employeeCode = '未识别成功'
390 399
          }
391 400
          e.simi = e.simi.split('.')[0] + '%'
@ -856,7 +865,7 @@ export default {
856 865
.vjs-tech {
857 866
  pointer-events: none;
858 867
}
859
.checkedIndex{
868
.checkedIndex {
860 869
  border: 1px solid #009bf3;
861 870
}
862 871
</style>

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

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

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

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

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

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

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

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

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

@ -1,12 +1,13 @@
1
@import './variables.scss';
2
@import './sidebar.scss';
1
@import "./variables.scss";
2
@import "./sidebar.scss";
3 3
4 4
body {
5 5
  // height: 100%;
6 6
  -moz-osx-font-smoothing: grayscale;
7 7
  -webkit-font-smoothing: antialiased;
8 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 13
label {
@ -101,7 +102,8 @@ aside {
101 102
  display: block;
102 103
  line-height: 32px;
103 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 107
  color: #2c3e50;
106 108
  -webkit-font-smoothing: antialiased;
107 109
  -moz-osx-font-smoothing: grayscale;
@ -131,7 +133,7 @@ aside {
131 133
}
132 134
133 135
.text-center {
134
  text-align: center
136
  text-align: center;
135 137
}
136 138
137 139
.sub-navbar {
@ -142,7 +144,13 @@ aside {
142 144
  text-align: right;
143 145
  padding-right: 20px;
144 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 155
  .subtitle {
148 156
    font-size: 20px;
@ -186,3 +194,15 @@ aside {
186 194
.multiselect--active {
187 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
}