feat: implement searching logs with date (#428)

diff --git a/src/store/modules/global/index.ts b/src/store/modules/global/index.ts
index 06ade00..68f91a3 100644
--- a/src/store/modules/global/index.ts
+++ b/src/store/modules/global/index.ts
@@ -19,46 +19,11 @@
 import { Duration, DurationTime } from '@/types/global';
 import getDurationRow from '@/utils/datetime';
 import getLocalTime from '@/utils/localtime';
+import dateFormatStep from '@/utils/dateFormatStep';
 import { ActionTree, Commit, MutationTree } from 'vuex';
 
 let timer: any = null;
 
-const dateFormat = (date: Date, step: string): string => {
-  const year = date.getFullYear();
-  const monthTemp = date.getMonth() + 1;
-  let month: string = `${monthTemp}`;
-  if (monthTemp < 10) {
-    month = `0${monthTemp}`;
-  }
-  if (step === 'MONTH') {
-    return `${year}-${month}`;
-  }
-  const dayTemp = date.getDate();
-  let day: string = `${dayTemp}`;
-  if (dayTemp < 10) {
-    day = `0${dayTemp}`;
-  }
-  if (step === 'DAY') {
-    return `${year}-${month}-${day}`;
-  }
-  const hourTemp = date.getHours();
-  let hour: string = `${hourTemp}`;
-  if (hourTemp < 10) {
-    hour = `0${hourTemp}`;
-  }
-  if (step === 'HOUR') {
-    return `${year}-${month}-${day} ${hour}`;
-  }
-  const minuteTemp = date.getMinutes();
-  let minute: string = `${minuteTemp}`;
-  if (minuteTemp < 10) {
-    minute = `0${minuteTemp}`;
-  }
-  if (step === 'MINUTE') {
-    return `${year}-${month}-${day} ${hour}${minute}`;
-  }
-  return '';
-};
 const dateFormatTime = (date: Date, step: string): string => {
   const year = date.getFullYear();
   const monthTemp = date.getMonth() + 1;
@@ -156,8 +121,8 @@
   },
   durationTime(_: State, getter: any): DurationTime {
     return {
-      start: dateFormat(getter.duration.start, getter.duration.step),
-      end: dateFormat(getter.duration.end, getter.duration.step),
+      start: dateFormatStep(getter.duration.start, getter.duration.step, true),
+      end: dateFormatStep(getter.duration.end, getter.duration.step, true),
       step: getter.duration.step,
     };
   },
diff --git a/src/utils/dateFormatStep.ts b/src/utils/dateFormatStep.ts
new file mode 100644
index 0000000..90967d9
--- /dev/null
+++ b/src/utils/dateFormatStep.ts
@@ -0,0 +1,53 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export default function dateFormatStep(date: Date, step: string, monthDayDiff?: boolean): string {
+  const year = date.getFullYear();
+  const monthTemp = date.getMonth() + 1;
+  let month: string = `${monthTemp}`;
+  if (monthTemp < 10) {
+    month = `0${monthTemp}`;
+  }
+  if (step === 'MONTH' && monthDayDiff) {
+    return `${year}-${month}`;
+  }
+  const dayTemp = date.getDate();
+  let day: string = `${dayTemp}`;
+  if (dayTemp < 10) {
+    day = `0${dayTemp}`;
+  }
+  if (step === 'DAY' || step === 'MONTH') {
+    return `${year}-${month}-${day}`;
+  }
+  const hourTemp = date.getHours();
+  let hour: string = `${hourTemp}`;
+  if (hourTemp < 10) {
+    hour = `0${hourTemp}`;
+  }
+  if (step === 'HOUR') {
+    return `${year}-${month}-${day} ${hour}`;
+  }
+  const minuteTemp = date.getMinutes();
+  let minute: string = `${minuteTemp}`;
+  if (minuteTemp < 10) {
+    minute = `0${minuteTemp}`;
+  }
+  if (step === 'MINUTE') {
+    return `${year}-${month}-${day} ${hour}${minute}`;
+  }
+  return '';
+}
diff --git a/src/views/components/log/log-bar.vue b/src/views/components/log/log-bar.vue
index 88ac3a6..31834d1 100644
--- a/src/views/components/log/log-bar.vue
+++ b/src/views/components/log/log-bar.vue
@@ -53,11 +53,7 @@
         />
       </div>
       <span class="flex-h rk-right">
-        <a
-          class="rk-log-search-btn bg-blue mr-10"
-          v-if="logState.type.key !== cateGoryBrowser"
-          @click="openConditionsBox"
-        >
+        <a class="rk-log-search-btn bg-blue mr-10" @click="openConditionsBox">
           <rk-icon icon="settings" class="mr-5" />
           <span class="vm">{{ $t('setConditions') }}</span>
         </a>
@@ -73,7 +69,7 @@
         <RkPage :currentSize="10" :currentPage="pageNum" @changePage="handleRefresh" :total="logState.total" />
       </span>
     </div>
-    <div class="flex-h" v-show="showConditionsBox && logState.type.key !== cateGoryBrowser">
+    <div class="flex-h" v-show="showConditionsBox">
       <LogConditions />
     </div>
   </div>
@@ -87,13 +83,15 @@
   import ToolBarSelect from '../dashboard/tool-bar-select.vue';
   import ToolBarEndpointSelect from '../dashboard/tool-bar-endpoint-select.vue';
   import LogConditions from './log-conditions.vue';
+  import { State as logState } from '@/store/modules/log/index';
+  import { State as optionState } from '@/store/modules/global/selectors';
 
   @Component({
     components: { TraceSelect, ToolBarSelect, ToolBarEndpointSelect, LogConditions },
   })
   export default class Bar extends Vue {
-    @State('rocketLog') private logState: any;
-    @State('rocketOption') private rocketOption: any;
+    @State('rocketLog') private logState!: logState;
+    @State('rocketOption') private rocketOption!: optionState;
     @Mutation('SELECT_LOG_TYPE') private SELECT_LOG_TYPE: any;
     @Mutation('SELECT_ERROR_CATALOG') private SELECT_ERROR_CATALOG: any;
     @Mutation('SET_EVENTS') private SET_EVENTS: any;
@@ -123,15 +121,6 @@
         .then(() => {
           this.queryLogs();
         });
-      this.SET_EVENTS([
-        () => {
-          this.queryLogs();
-        },
-      ]);
-    }
-
-    private beforeDestroy() {
-      this.SET_EVENTS([]);
     }
 
     private handleRefresh(pageNum: number) {
@@ -182,7 +171,7 @@
                 pagePathId: currentEndpoint.key,
                 category: category.key,
                 paging: { pageNum: this.pageNum, pageSize: 35, needTotal: true },
-                queryDuration: this.durationTime,
+                queryDuration: conditions.date,
               }
             : {
                 serviceId: currentService.key || undefined,
@@ -197,7 +186,7 @@
                 relatedTrace: conditions.traceId ? { traceId: conditions.traceId } : undefined,
                 tags: conditions.tags,
                 paging: { pageNum: this.pageNum, pageSize: 35, needTotal: true },
-                queryDuration: conditions.traceId ? undefined : this.durationTime,
+                queryDuration: conditions.traceId ? undefined : conditions.date,
               },
       });
     }
diff --git a/src/views/components/log/log-conditions.vue b/src/views/components/log/log-conditions.vue
index 8c51bea..31af058 100644
--- a/src/views/components/log/log-conditions.vue
+++ b/src/views/components/log/log-conditions.vue
@@ -14,7 +14,7 @@
 <template>
   <div class="rk-search-conditions flex-v">
     <div class="flex-h">
-      <div class="mr-15">
+      <div class="mr-15" v-show="rocketLog.type.key === cateGoryService">
         <span class="sm b grey mr-10">{{ this.$t('traceID') }}:</span>
         <input
           type="text"
@@ -22,7 +22,11 @@
           @change="changeConditions($event, LogConditionsOpt.TraceID)"
         />
       </div>
-      <div class="mr-15">
+      <div class="search-time">
+        <span class="sm b grey mr-5">{{ this.$t('timeRange') }}:</span>
+        <RkDate class="sm" v-model="searchTime" position="bottom" format="YYYY-MM-DD HH:mm:ss" />
+      </div>
+      <div class="mr-15" v-show="rocketLog.type.key === cateGoryService">
         <span class="sm b grey mr-10">{{ this.$t('keywordsOfContent') }}:</span>
         <span class="rk-trace-tags" v-show="rocketLog.supportQueryLogsByKeywords">
           <span
@@ -49,7 +53,7 @@
           <rk-icon icon="help" class="mr-5" />
         </span>
       </div>
-      <div class="mr-15">
+      <div class="mr-15" v-show="rocketLog.type.key === cateGoryService">
         <span class="sm b grey mr-10">{{ this.$t('excludingKeywordsOfContent') }}:</span>
         <span class="rk-trace-tags" v-show="rocketLog.supportQueryLogsByKeywords">
           <span
@@ -77,7 +81,7 @@
         </span>
       </div>
     </div>
-    <div class="mr-10" style="padding-top: 10px">
+    <div class="mr-10" style="padding-top: 10px" v-show="rocketLog.type.key === cateGoryService">
       <span class="sm grey">{{ this.$t('tags') }}: </span>
       <span class="rk-trace-tags">
         <span class="selected" v-for="(item, index) in tagsList" :key="index">
@@ -109,12 +113,16 @@
   import { Duration, Option } from '@/types/global';
   import { Component, Vue, Prop, Watch } from 'vue-property-decorator';
   import { Mutation, State } from 'vuex-class';
+  import { State as globalState } from '@/store/modules/global/index';
+  import { State as logState } from '@/store/modules/log/index';
+  import dateFormatStep from '@/utils/dateFormatStep';
 
   @Component({
     components: {},
   })
   export default class LogConditions extends Vue {
-    @State('rocketLog') private rocketLog: any;
+    @State('rocketbot') private rocketbotGlobal!: globalState;
+    @State('rocketLog') private rocketLog!: logState;
     @Mutation('SET_LOG_CONDITIONS') private SET_LOG_CONDITIONS: any;
     @Mutation('SET_TAG_LIST') private SET_TAG_LIST: any;
     @Mutation('SET_KEYWORDS_CONTENT') private SET_KEYWORDS_CONTENT: any;
@@ -123,13 +131,17 @@
     private excludingKeywordsOfContent: string = '';
     private tagsList: string[] = [];
     private tags: string = '';
+    private searchTime: Date[] = [];
     private LogConditionsOpt = {
       TraceID: 'traceId',
       Tags: 'tags',
       KeywordsOfContent: 'keywordsOfContent',
       ExcludingKeywordsOfContent: 'excludingKeywordsOfContent',
+      Date: 'date',
     };
+    private cateGoryService = 'service';
     private created() {
+      this.searchTime = [this.rocketbotGlobal.durationRow.start, this.rocketbotGlobal.durationRow.end];
       (this.tagsList = localStorage.getItem('logTags') ? JSON.parse(localStorage.getItem('logTags') || '') : []),
         this.updateTags();
     }
@@ -229,12 +241,44 @@
 
       localStorage.setItem(storageContent, JSON.stringify(list));
     }
+    private globalTimeFormat(time: Date[]) {
+      let step = 'MINUTE';
+      const unix = Math.round(time[1].getTime()) - Math.round(time[0].getTime());
+      if (unix <= 60 * 60 * 1000) {
+        step = 'MINUTE';
+      } else if (unix <= 24 * 60 * 60 * 1000) {
+        step = 'HOUR';
+      } else {
+        step = 'DAY';
+      }
+      return {
+        start: dateFormatStep(time[0], step, true),
+        end: dateFormatStep(time[1], step, true),
+        step,
+      };
+    }
     @Watch('rocketLog.conditions.tags')
     private clearTags() {
       if (!this.rocketLog.conditions.tags) {
         this.tagsList = [];
       }
     }
+    @Watch('searchTime')
+    private updateDate() {
+      this.SET_LOG_CONDITIONS({
+        label: this.LogConditionsOpt.Date,
+        key: this.globalTimeFormat([
+          new Date(
+            this.searchTime[0].getTime() +
+              (parseInt(String(this.rocketbotGlobal.utc), 10) + new Date().getTimezoneOffset() / 60) * 3600000,
+          ),
+          new Date(
+            this.searchTime[1].getTime() +
+              (parseInt(String(this.rocketbotGlobal.utc), 10) + new Date().getTimezoneOffset() / 60) * 3600000,
+          ),
+        ]),
+      });
+    }
   }
 </script>
 
@@ -291,5 +335,8 @@
     .log-tips {
       color: #eee;
     }
+    .search-time {
+      color: #eee;
+    }
   }
 </style>
diff --git a/src/views/components/log/log-service-detail.vue b/src/views/components/log/log-service-detail.vue
index b323bf8..08c1515 100644
--- a/src/views/components/log/log-service-detail.vue
+++ b/src/views/components/log/log-service-detail.vue
@@ -69,8 +69,6 @@
       });
       if (this.currentLog.contentType === 'JSON') {
         this.logContent = formatJson(JSON.parse(this.currentLog.content));
-      } else if (this.currentLog.contentType === 'TEXT') {
-        this.logContent = this.currentLog.content;
       } else {
         this.logContent = this.currentLog.content;
       }
diff --git a/src/views/components/profile/profile-header.vue b/src/views/components/profile/profile-header.vue
index d91b9be..dd9c46c 100644
--- a/src/views/components/profile/profile-header.vue
+++ b/src/views/components/profile/profile-header.vue
@@ -63,49 +63,6 @@
     private dialogVisible = false;
     private serviceOpt: any;
 
-    private dateFormat(date: Date, step: string) {
-      const year = date.getFullYear();
-      const monthTemp = date.getMonth() + 1;
-      let month: string = `${monthTemp}`;
-      if (monthTemp < 10) {
-        month = `0${monthTemp}`;
-      }
-      if (step === 'MONTH') {
-        return `${year}-${month}`;
-      }
-      const dayTemp = date.getDate();
-      let day: string = `${dayTemp}`;
-      if (dayTemp < 10) {
-        day = `0${dayTemp}`;
-      }
-      if (step === 'DAY') {
-        return `${year}-${month}-${day}`;
-      }
-      const hourTemp = date.getHours();
-      let hour: string = `${hourTemp}`;
-      if (hourTemp < 10) {
-        hour = `0${hourTemp}`;
-      }
-      if (step === 'HOUR') {
-        return `${year}-${month}-${day} ${hour}`;
-      }
-      const minuteTemp = date.getMinutes();
-      let minute: string = `${minuteTemp}`;
-      if (minuteTemp < 10) {
-        minute = `0${minuteTemp}`;
-      }
-      if (step === 'MINUTE') {
-        return `${year}-${month}-${day} ${hour}${minute}`;
-      }
-    }
-
-    private globalTimeFormat(time: Date[]) {
-      return {
-        start: time[0].getTime(),
-        end: time[1].getTime(),
-      };
-    }
-
     private chooseService(item: { key: string; label: string }) {
       this.SET_HEADER_SOURCE({ currentService: item });
     }
diff --git a/src/views/components/trace/trace-search.vue b/src/views/components/trace/trace-search.vue
index f0d0d12..2c624e8 100644
--- a/src/views/components/trace/trace-search.vue
+++ b/src/views/components/trace/trace-search.vue
@@ -116,6 +116,7 @@
   import TraceSelect from '../common/trace-select.vue';
   import { State as traceState } from '@/store/modules/trace/index';
   import { State as globalState } from '@/store/modules/global/index';
+  import dateFormatStep from '@/utils/dateFormatStep';
 
   @Component({ components: { TraceSelect } })
   export default class TraceSearch extends Vue {
@@ -161,40 +162,6 @@
       }
     }
 
-    private dateFormat(date: Date, step: string) {
-      const year = date.getFullYear();
-      const monthTemp = date.getMonth() + 1;
-      let month: string = `${monthTemp}`;
-      if (monthTemp < 10) {
-        month = `0${monthTemp}`;
-      }
-
-      const dayTemp = date.getDate();
-      let day: string = `${dayTemp}`;
-      if (dayTemp < 10) {
-        day = `0${dayTemp}`;
-      }
-      if (step === 'DAY' || step === 'MONTH') {
-        return `${year}-${month}-${day}`;
-      }
-      const hourTemp = date.getHours();
-      let hour: string = `${hourTemp}`;
-      if (hourTemp < 10) {
-        hour = `0${hourTemp}`;
-      }
-      if (step === 'HOUR') {
-        return `${year}-${month}-${day} ${hour}`;
-      }
-      const minuteTemp = date.getMinutes();
-      let minute: string = `${minuteTemp}`;
-      if (minuteTemp < 10) {
-        minute = `0${minuteTemp}`;
-      }
-      if (step === 'MINUTE') {
-        return `${year}-${month}-${day} ${hour}${minute}`;
-      }
-    }
-
     private globalTimeFormat(time: Date[]) {
       let step = 'MINUTE';
       const unix = Math.round(time[1].getTime()) - Math.round(time[0].getTime());
@@ -206,8 +173,8 @@
         step = 'DAY';
       }
       return {
-        start: this.dateFormat(time[0], step),
-        end: this.dateFormat(time[1], step),
+        start: dateFormatStep(time[0], step, false),
+        end: dateFormatStep(time[1], step, false),
         step,
       };
     }