Browse Source

feat: update

Hu Cheng 1 year ago
parent
commit
39002deac3

+ 4 - 3
src/api/modules/GenerateReport.js

@@ -1,4 +1,5 @@
 import service from '@/utils/axios';
+import { baseURL2 } from '../../constant';
 
 /**
  * 验证报告生成 方案
@@ -10,7 +11,7 @@ export const generateScheme = (data) => {
     method: 'POST',
     url: '/GenerateReport/Generate_scheme',
     data,
-    baseURL: '/api2',
+    baseURL: baseURL2,
   });
 };
 
@@ -24,7 +25,7 @@ export const generateReport = (data) => {
     method: 'POST',
     url: '/GenerateReport/Generate_report',
     data,
-    baseURL: '/api2',
+    baseURL: baseURL2,
   });
 };
 
@@ -38,6 +39,6 @@ export const generateKey = (data) => {
     method: 'POST',
     url: '/GenerateReport/Generate_key',
     data,
-    baseURL: '/api2',
+    baseURL: baseURL2,
   });
 };

+ 12 - 55
src/layout/index.vue

@@ -1,62 +1,19 @@
 <template>
-  <n-layout position="absolute" style="top: 0; right: 0; bottom: 0; left: 0">
-    <n-layout-header class="h-16 px-6" bordered>
-      <n-space justify="space-between" align="center" class="h-full">
-        <h2 class="text-center leading-[64px]">冷链验证报告生成系统</h2>
-        <n-dropdown trigger="hover" :options="options" @select="handleSelect">
-          <n-avatar round class="cursor-pointer"> {{ username }} </n-avatar>
-        </n-dropdown>
-      </n-space>
-    </n-layout-header>
-    <n-layout-content
-      content-style="padding: 24px; background-color: #f0f2f5"
-      :native-scrollbar="false"
+  <n-layout
+    content-style="padding: 24px; background-color: #f0f2f5"
+    position="absolute"
+    style="top: 0; right: 0; bottom: 0; left: 0"
+  >
+    <n-card
+      class="h-full"
+      :bordered="false"
+      :content-style="{ position: 'relative' }"
     >
-      <n-card
-        :bordered="false"
-        style="height: calc(100vh - 112px); min-height: 600px"
-        :content-style="{ position: 'relative' }"
-      >
-        <RouterView />
-      </n-card>
-    </n-layout-content>
+      <RouterView />
+    </n-card>
   </n-layout>
 </template>
 
-<script setup>
-import { NIcon } from 'naive-ui';
-import { removeToken } from '@/utils/storage/sessionToken';
-import { LogoutOutlined as LogoutIcon } from '@vicons/antd';
-
-const router = useRouter();
-
-const message = useMessage();
-
-const username = window.sessionStorage.getItem('username');
-
-const renderIcon = (icon) => {
-  return () => {
-    return h(NIcon, null, {
-      default: () => h(icon),
-    });
-  };
-};
-
-// 下拉菜单传入的 options
-const options = [
-  {
-    label: '退出登录',
-    key: '/logout',
-    icon: renderIcon(LogoutIcon),
-  },
-];
-
-// select 选中时触发的回调函数
-const handleSelect = () => {
-  removeToken();
-  message.success('退出登录成功');
-  router.replace('/login');
-};
-</script>
+<script setup></script>
 
 <style scoped></style>

+ 10 - 2
src/utils/axios.js

@@ -2,11 +2,18 @@ import axios from 'axios';
 import { getToken } from '@/utils/storage/sessionToken';
 import { TOKEN } from '@/constant';
 import { loadingBar, message } from '@/plugin/naive-ui';
+import { useRouter } from 'vue-router';
+
+const router = useRouter();
 
 // 显示消息
-const showMessage = (res) => {
+const showError = (res) => {
   if (res.Code !== 200) {
     message.error(res.Msg);
+  } else if (res.Code === 201) {
+    message.error('登录过期,请重新登录');
+    window.sessionStorage.clear();
+    router.replace('/login');
   }
 };
 
@@ -49,13 +56,14 @@ service.interceptors.response.use(
     // 2xx 范围内的状态码都会触发该函数。
     // 对响应数据做点什么
     const { data: res } = response;
-    showMessage(res);
+    showError(res);
     loadingBar.finish();
     return response;
   },
   function (error) {
     // 超出 2xx 范围的状态码都会触发该函数。
     // 对响应错误做点什么
+    loadingBar.finish();
     return Promise.reject(error);
   }
 );

+ 2 - 2
src/utils/storage/sessionToken.js

@@ -1,8 +1,8 @@
-import { TOKEN } from "@/constant";
+import { TOKEN } from '@/constant';
 
 export const getToken = () => {
   const token = window.sessionStorage.getItem(TOKEN);
-  return !token ? "" : token;
+  return !token ? '' : token;
 };
 
 export const setToken = (value) => {

+ 8 - 2
src/views/data/edit/EditTaskClass.vue

@@ -1,5 +1,11 @@
 <template>
-  <n-button :loading="loading" type="primary" size="small" @click="showEditModal">编辑</n-button>
+  <n-button
+    :loading="loading"
+    type="primary"
+    size="small"
+    @click="showEditModal"
+    >编辑</n-button
+  >
   <n-modal
     v-model:show="showModal"
     preset="dialog"
@@ -20,7 +26,7 @@
 </template>
 
 <script setup>
-import { editTaskDataClass } from "@/api";
+import { editTaskDataClass } from '@/api';
 
 //
 const loading = ref(false);

+ 38 - 20
src/views/data/edit/ImportPlatform.vue

@@ -17,22 +17,17 @@
           label-width="auto"
           show-require-mark
         >
-          <n-form-item label="开始时间" path="Time_start">
+          <n-form-item label="起止时间">
             <n-date-picker
-              v-model:formatted-value="formValue.Time_start"
               value-format="yyyy.MM.dd HH:mm:ss"
-              type="datetime"
+              type="datetimerange"
               clearable
-              class="w-full"
-            />
-          </n-form-item>
-          <n-form-item label="结束时间" path="Time_end">
-            <n-date-picker
-              v-model:formatted-value="formValue.Time_end"
-              value-format="yyyy.MM.dd HH:mm:ss"
-              type="datetime"
-              clearable
-              class="w-full"
+              @update:formatted-value="
+                (value) => {
+                  formValue.Time_start = value[0];
+                  formValue.Time_end = value[1];
+                }
+              "
             />
           </n-form-item>
           <n-form-item label="SN" path="T_sn">
@@ -78,8 +73,13 @@
 </template>
 
 <script setup>
-import { getV3DataList, addTaskData } from "@/api";
-import { message } from "@/plugin/naive-ui";
+import { getV3DataList, addTaskData } from '@/api';
+import { NStatistic, useMessage } from 'naive-ui';
+import { h } from 'vue';
+
+const message = useMessage();
+
+const notification = useNotification();
 
 const props = defineProps({
   task: {
@@ -118,10 +118,30 @@ const showImportModal = () => {
 
 //
 const handleImport = () => {
+  console.log(data.value.Data);
   if (data.value.Data) {
-    data.value.Data.forEach((item) => {
-      addTask(item);
+    data.value.Data.forEach((item, index) => {
+      const code = addTask(item);
+      notification.create({
+        title: '导入数据',
+        content: () =>
+          h(
+            NStatistic,
+            {
+              label: '进度',
+              value: index,
+            },
+            {
+              suffix: () => data.value.Num,
+            }
+          ),
+      });
+      if (code !== 200) {
+        return false;
+      }
     });
+  } else {
+    message.info('无数据');
   }
 };
 
@@ -134,9 +154,7 @@ const addTask = async (item) => {
     T_rh: item.T_rh,
     T_time: item.T_time,
   });
-  if (res.Code === 200) {
-    message.success(res.Msg);
-  }
+  return res.Code;
 };
 
 //

+ 17 - 17
src/views/data/edit/TemplateForm.vue

@@ -10,7 +10,7 @@
           label-placement="left"
           :show-feedback="false"
           :label="item.T_text"
-          v-if="item.T_label === 101"
+          v-if="item.T_label === 7"
         >
           <n-date-picker
             v-model:formatted-value="item.T_value"
@@ -24,7 +24,7 @@
           label-placement="left"
           :show-feedback="false"
           :label="item.T_text"
-          v-else-if="item.T_label === 102"
+          v-else-if="item.T_label === 9"
         >
           <n-date-picker
             v-model:formatted-value="item.T_value"
@@ -38,7 +38,7 @@
           label-placement="left"
           :show-feedback="false"
           :label="item.T_text"
-          v-else-if="item.T_label === 103"
+          v-else-if="item.T_label === 3"
         >
           <n-select
             label-field="T_sn"
@@ -53,7 +53,7 @@
           label-placement="left"
           :show-feedback="false"
           :label="item.T_text"
-          v-else-if="item.T_label === 104"
+          v-else-if="item.T_label === 4"
         >
           <n-select
             v-model:value="item.T_value"
@@ -83,8 +83,8 @@
 </template>
 
 <script setup>
-import { getVerifyTemplateMapDataList, putVerifyTemplateMapData } from "@/api";
-import { getToken } from "@/utils/storage/sessionToken";
+import { getVerifyTemplateMapDataList, putVerifyTemplateMapData } from '@/api';
+import { getToken } from '@/utils/storage/sessionToken';
 
 const message = useMessage();
 
@@ -136,10 +136,10 @@ const handleSelectReverse = (i) => {
 //
 const showCreateDialog = async () => {
   dialog.info({
-    title: "提示",
-    content: "确认生成报告?",
-    positiveText: "确定",
-    negativeText: "取消",
+    title: '提示',
+    content: '确认生成报告?',
+    positiveText: '确定',
+    negativeText: '取消',
     onPositiveClick: () => {
       putTemplateData();
     },
@@ -153,7 +153,7 @@ const putTemplateData = async () => {
       if (item.T_label === 102 || item.T_label === 104) {
         return {
           T_VerifyTemplateMap_id: item.T_VerifyTemplateMap_id,
-          T_value: item.T_value.join("|"),
+          T_value: item.T_value.join('|'),
           T_source: item.T_source,
           T_flow_sort: item.T_flow_sort,
           T_max_time: item.T_max_time,
@@ -162,7 +162,7 @@ const putTemplateData = async () => {
       } else {
         return {
           T_VerifyTemplateMap_id: item.T_VerifyTemplateMap_id,
-          T_value: item.T_value + "",
+          T_value: item.T_value + '',
           T_source: item.T_source,
           T_flow_sort: item.T_flow_sort,
           T_max_time: item.T_max_time,
@@ -191,12 +191,12 @@ const getTemplateList = async () => {
     const { data: res } = await getVerifyTemplateMapDataList(queryData);
     templateList.value = res.Data || [];
     templateList.value.forEach((item) => {
-      if (item.T_label === 102) {
-        item.T_value = item.T_value ? item.T_value.split("|") : null;
-      } else if (item.T_label === 101) {
+      if (item.T_label === 4) {
+        item.T_value = item.T_value ? item.T_value.split('|') : [];
+      } else if (item.T_label === 7) {
         item.T_value = item.T_value ? item.T_value : null;
-      } else if (item.T_label === 104) {
-        item.T_value = item.T_value ? item.T_value.split("|") : [];
+      } else if (item.T_label === 9) {
+        item.T_value = item.T_value ? item.T_value.split('|') : null;
       }
     });
   } catch (e) {

+ 76 - 61
src/views/data/edit/index.vue

@@ -10,7 +10,7 @@
             <n-checkbox label="全选" @update:checked="handleCheckAll" />
           </template>
           <n-scrollbar
-            :style="{ maxHeight: `${height - 350}px` }"
+            :style="{ maxHeight: `${height - 260}px` }"
             trigger="none"
             @scroll="onScroll"
           >
@@ -79,29 +79,29 @@
           <div>
             <TemplateForm :task="task" :class-list="classList" />
           </div>
-          <div class="flex justify-end">
-            <n-button type="primary" @click="isShowChart2 = !isShowChart2"
-              >显示湿度曲线图</n-button
-            >
-          </div>
-          <n-scrollbar
-            :style="{ maxHeight: `${height - 380}px` }"
-            trigger="none"
+          <n-tabs
+            type="segment"
+            animated
+            v-model:value="tabChart"
+            @update:value="handleTabChange"
           >
-            <Chart
-              calss="h-full"
-              ref="chart1"
-              constructor-type="stockChart"
-              :options="chartOptions1"
-            ></Chart>
-            <Chart
-              calss="h-full"
-              v-if="isShowChart2"
-              ref="chart2"
-              constructor-type="stockChart"
-              :options="chartOptions2"
-            ></Chart>
-          </n-scrollbar>
+            <n-tab-pane name="温度" tab="温度">
+              <Chart
+                :style="{ minHeight: `${height - 320}px` }"
+                ref="chart1"
+                constructor-type="stockChart"
+                :options="chartOptions1"
+              ></Chart>
+            </n-tab-pane>
+            <n-tab-pane name="湿度" tab="湿度">
+              <Chart
+                :style="{ minHeight: `${height - 320}px` }"
+                ref="chart2"
+                constructor-type="stockChart"
+                :options="chartOptions2"
+              ></Chart>
+            </n-tab-pane>
+          </n-tabs>
         </div>
       </n-card>
     </div>
@@ -165,11 +165,12 @@ const task = window.sessionStorage.getItem('task')
   ? JSON.parse(window.sessionStorage.getItem('task'))
   : {};
 
-const isShowChart2 = ref(false);
-
 const chart1 = ref(null);
 const chart2 = ref(null);
 
+const chartData1 = ref([]);
+const chartData2 = ref([]);
+
 // Modal 数据源
 const modal = reactive({
   showModal: false,
@@ -205,6 +206,15 @@ const dataInfo = ref({});
 // 选项组受控模式下的值
 const checkValues = ref([]);
 
+// tab
+const tabChart = ref('温度');
+
+const handleTabChange = (value) => {
+  if (value === '温度') {
+  } else {
+  }
+};
+
 //
 const onScroll = (e) => {
   const clientHeight = e.target.clientHeight;
@@ -313,8 +323,7 @@ const handleCheckAll = (checked) => {
 
 // 选项组的值改变时的回调
 const onUpdateValues = async (values, meta) => {
-  checkValues.value = values;
-  const classInfo = classList.value.find((item) => item.T_id === meta.value);
+  const classInfo = values.find((item) => item.T_id === meta.value);
   queryData.T_id = classInfo.T_id;
   queryData.T_sn = classInfo.T_sn;
   await getDataList();
@@ -325,43 +334,49 @@ const onUpdateValues = async (values, meta) => {
     .map((item) => [new Date(item.T_time).getTime(), item.T_rh])
     .sort((a, b) => a[0] - b[0]);
   if (meta.actionType === 'check') {
-    chart1.value.chart.addSeries({
-      id: meta.value,
-      name: meta.value,
-      data: data1,
-      lineWidth: 1,
-      cursor: 'pointer',
-      events: {
-        click(e) {
-          modal.title = '温度';
-          modal.showModal = true;
-          formValue.T_t = e.point.y;
-          queryData.T_id = e.point.series.name;
-          getDataList();
-          dataInfo.value = dataList.value[e.point.index];
+    if (tabChart.value === '温度') {
+      chart1.value.chart.addSeries({
+        id: meta.value,
+        name: meta.value,
+        data: data1,
+        lineWidth: 1,
+        cursor: 'pointer',
+        events: {
+          click(e) {
+            modal.title = '温度';
+            modal.showModal = true;
+            formValue.T_t = e.point.y;
+            queryData.T_id = e.point.series.name;
+            getDataList();
+            dataInfo.value = dataList.value[e.point.index];
+          },
         },
-      },
-    });
-    chart2.value.chart.addSeries({
-      id: meta.value,
-      name: meta.value,
-      data: data2,
-      lineWidth: 1,
-      cursor: 'pointer',
-      events: {
-        click(e) {
-          modal.title = '湿度';
-          modal.showModal = true;
-          formValue.T_rh = e.point.y;
-          queryData.T_id = e.point.series.name;
-          getDataList();
-          dataInfo.value = dataList.value[e.point.index];
+      });
+    } else {
+      chart2.value.chart.addSeries({
+        id: meta.value,
+        name: meta.value,
+        data: data2,
+        lineWidth: 1,
+        cursor: 'pointer',
+        events: {
+          click(e) {
+            modal.title = '湿度';
+            modal.showModal = true;
+            formValue.T_rh = e.point.y;
+            queryData.T_id = e.point.series.name;
+            getDataList();
+            dataInfo.value = dataList.value[e.point.index];
+          },
         },
-      },
-    });
+      });
+    }
   } else {
-    chart1.value.chart.get(meta.value).remove();
-    chart2.value.chart.get(meta.value).remove();
+    if (tabChart.value === '温度') {
+      chart1.value.chart.get(meta.value).remove();
+    } else {
+      chart2.value.chart.get(meta.value).remove();
+    }
   }
 };
 

+ 8 - 21
src/views/data/source/index.vue

@@ -46,22 +46,17 @@
       :model="queryData"
       show-require-mark
     >
-      <n-form-item label="开始时间" path="Time_start">
+      <n-form-item label="自定义时间">
         <n-date-picker
-          v-model:formatted-value="queryData.Time_start"
           value-format="yyyy-MM-dd HH:mm:ss"
-          type="datetime"
+          @update:formatted-value="
+            (value) => {
+              queryData.Time_start = value[0];
+              queryData.Time_end = value[1];
+            }
+          "
+          type="datetimerange"
           clearable
-          class="w-full"
-        />
-      </n-form-item>
-      <n-form-item label="结束时间" path="Time_end">
-        <n-date-picker
-          v-model:formatted-value="queryData.Time_end"
-          value-format="yyyy-MM-dd HH:mm:ss"
-          type="datetime"
-          clearable
-          class="w-full"
         />
       </n-form-item>
       <n-button type="primary" block @click="handleSearch">搜索</n-button>
@@ -197,14 +192,6 @@ const getDataList = async () => {
   }
 };
 
-let timer = setInterval(() => {
-  getDataList();
-}, 10000);
-
-onBeforeUnmount(() => {
-  clearInterval(timer);
-});
-
 getDataList();
 </script>
 

+ 24 - 22
src/views/report/create/index.vue

@@ -47,7 +47,7 @@
             <n-select
               v-model:value="item.T_value"
               multiple
-              label-field="T_sn"
+              label-field="T_id"
               value-field="T_sn"
               max-tag-count="responsive"
               :options="classList"
@@ -80,7 +80,7 @@
           </n-form-item>
           <n-form-item :label="item.T_name" v-else-if="item.T_label === 4">
             <n-select
-              label-field="T_sn"
+              label-field="T_id"
               value-field="T_sn"
               v-model:value="item.T_value"
               :options="classList"
@@ -132,7 +132,7 @@
           <n-form-item :label="item.T_name" v-else-if="item.T_label === 10">
             <n-image class="mr-5" width="100" :src="item.T_value" />
             <n-upload
-              @change="(options) => handleChangeByIndex(options, i)"
+              @change="(options) => handleChangeByIndex(options, index)"
               :default-upload="false"
               :max="1"
             >
@@ -148,7 +148,7 @@
             </n-popover>
           </n-form-item>
           <n-form-item :label="item.T_name" v-else-if="item.T_label === 11">
-            <n-image class="mr-5" width="100" :src="item.T_value" />
+            <n-image class="mr-5" width="100" v-model:src="item.T_value" />
             <n-button @click="handleEdit(item, index)">编辑</n-button>
             <n-popover trigger="hover">
               <template #trigger>
@@ -206,24 +206,6 @@ const task = window.sessionStorage.getItem('task')
   ? JSON.parse(window.sessionStorage.getItem('task'))
   : {};
 
-document.addEventListener('visibilitychange', () => {
-  if (document.visibilityState === 'hidden') {
-    // 离开当前tab标签
-    console.log('离开当前tab标签');
-  } else {
-    // 回到当前tab标签
-    console.log('回到当前tab标签');
-    templateList.value[
-      cadIndex.value
-    ].T_value = `http://coldverifylocal.coldbaozhida.com/CAD/download?type=upload&filename=${
-      queryData.T_task_id
-    }_${queryData.T_VerifyTemplate_id}_${
-      templateList.value[cadIndex.value].T_id
-    }.png`;
-    console.log(templateList.value[cadIndex.value].T_value);
-  }
-});
-
 // 获取表项中收集到的值的对象
 const pdf2 = ref('');
 
@@ -503,6 +485,26 @@ const getTemplateList = async () => {
 
 getClassList();
 getTemplateList();
+
+onMounted(() => {
+  window.document.addEventListener('visibilitychange', () => {
+    if (document.visibilityState === 'hidden') {
+      // 离开当前tab标签
+      console.log('离开当前tab标签');
+    } else {
+      // 回到当前tab标签
+      console.log('回到当前tab标签');
+      templateList.value[
+        cadIndex.value
+      ].T_value = `http://coldverifylocal.coldbaozhida.com/CAD/download?type=upload&filename=${
+        queryData.T_task_id
+      }_${queryData.T_VerifyTemplate_id}_${
+        templateList.value[cadIndex.value].T_id
+      }.png`;
+      console.log(templateList.value[cadIndex.value].T_value);
+    }
+  });
+});
 </script>
 
 <style scoped></style>

+ 22 - 22
src/views/scheme/index.vue

@@ -47,7 +47,7 @@
             <n-select
               v-model:value="item.T_value"
               multiple
-              label-field="T_sn"
+              label-field="T_id"
               value-field="T_sn"
               max-tag-count="responsive"
               :options="classList"
@@ -80,7 +80,7 @@
           </n-form-item>
           <n-form-item :label="item.T_name" v-else-if="item.T_label === 4">
             <n-select
-              label-field="T_sn"
+              label-field="T_id"
               value-field="T_sn"
               v-model:value="item.T_value"
               :options="classList"
@@ -132,7 +132,7 @@
           <n-form-item :label="item.T_name" v-else-if="item.T_label === 10">
             <n-image class="mr-5" width="100" :src="item.T_value" />
             <n-upload
-              @change="(options) => handleChangeByIndex(options, i)"
+              @change="(options) => handleChangeByIndex(options, index)"
               :default-upload="false"
               :max="1"
             >
@@ -206,24 +206,6 @@ const task = window.sessionStorage.getItem('task')
   ? JSON.parse(window.sessionStorage.getItem('task'))
   : {};
 
-document.addEventListener('visibilitychange', () => {
-  if (document.visibilityState === 'hidden') {
-    // 离开当前tab标签
-    console.log('离开当前tab标签');
-  } else {
-    // 回到当前tab标签
-    console.log('回到当前tab标签');
-    templateList.value[
-      cadIndex.value
-    ].T_value = `http://coldverifylocal.coldbaozhida.com/CAD/download?type=upload&filename=${
-      queryData.T_task_id
-    }_${queryData.T_VerifyTemplate_id}_${
-      templateList.value[cadIndex.value].T_id
-    }.png`;
-    console.log(templateList.value[cadIndex.value].T_value);
-  }
-});
-
 // 获取表项中收集到的值的对象
 const pdf1 = ref('');
 
@@ -403,7 +385,6 @@ const generateKeyInfo = async () => {
     notification.warning({
       title: res.Msg,
       description: `进度:${res.Schedule}%`,
-      content: res.Msg,
       duration: 3000,
       keepAliveOnHover: true,
     });
@@ -529,6 +510,25 @@ onBeforeUnmount(() => {
 
 getClassList();
 getTemplateList();
+
+onMounted(() => {
+  window.document.addEventListener('visibilitychange', () => {
+    if (document.visibilityState === 'hidden') {
+      // 离开当前tab标签
+      console.log('离开当前tab标签');
+    } else {
+      // 回到当前tab标签
+      console.log('回到当前tab标签');
+      templateList.value[
+        cadIndex.value
+      ].T_value = `http://coldverifylocal.coldbaozhida.com/CAD/download?type=upload&filename=${
+        queryData.T_task_id
+      }_${queryData.T_VerifyTemplate_id}_${
+        templateList.value[cadIndex.value].T_id
+      }.png`;
+    }
+  });
+});
 </script>
 
 <style scoped></style>

+ 10 - 10
vite.config.js

@@ -8,16 +8,16 @@ import WindiCSS from 'vite-plugin-windicss';
 
 // https://vitejs.dev/config/
 export default defineConfig({
-  server: {
-    cors: true,
-    proxy: {
-      '/api2': {
-        target: 'http://coldverifylocal.coldbaozhida.com',
-        changeOrigin: true,
-        rewrite: (path) => path.replace(/^\/api2/, ''),
-      },
-    },
-  },
+  // server: {
+  //   cors: true,
+  //   proxy: {
+  //     '/api': {
+  //       target: 'http://coldverifylocal.coldbaozhida.com',
+  //       changeOrigin: true,
+  //       rewrite: (path) => path.replace(/^\/api/, ''),
+  //     },
+  //   },
+  // },
   base: './',
   resolve: {
     alias: {