浏览代码

飞参数据、模型管理

Rmengdi 6 月之前
父节点
当前提交
1361bda02b

+ 11 - 0
package-lock.json

@@ -17,6 +17,7 @@
         "core-js": "^3.8.3",
         "echarts": "^5.3.2",
         "element-ui": "^2.15.9",
+        "file-saver": "^2.0.5",
         "html2canvas": "^1.4.1",
         "lodash": "^4.17.21",
         "md5": "^2.3.0",
@@ -6483,6 +6484,11 @@
         "node": "^10.12.0 || >=12.0.0"
       }
     },
+    "node_modules/file-saver": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz",
+      "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
+    },
     "node_modules/fill-range": {
       "version": "7.0.1",
       "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",
@@ -17654,6 +17660,11 @@
         "flat-cache": "^3.0.4"
       }
     },
+    "file-saver": {
+      "version": "2.0.5",
+      "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz",
+      "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA=="
+    },
     "fill-range": {
       "version": "7.0.1",
       "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz",

+ 1 - 0
package.json

@@ -17,6 +17,7 @@
     "core-js": "^3.8.3",
     "echarts": "^5.3.2",
     "element-ui": "^2.15.9",
+    "file-saver": "^2.0.5",
     "html2canvas": "^1.4.1",
     "lodash": "^4.17.21",
     "md5": "^2.3.0",

+ 51 - 52
src/views/als/components/ImportExcel/index.vue

@@ -1,55 +1,54 @@
 <template>
-  <div>
-    <el-dialog v-model="dialogVisible" :width="width" :top="top" :title="`${title}`" :destroy-on-close="true" draggable>
-      <el-form class="drawer-multiColumn-form" label-width="100px">
-        <el-form-item label="文件上传">
-          <el-upload
-            ref="uploadRef"
-            action="#"
-            class="upload"
-            :drag="true"
-            :auto-upload="false"
-            :limit="limit"
-            :multiple="multiple"
-            :show-file-list="true"
-            :http-request="uploadExcel"
-            :before-upload="beforeExcelUpload"
-            :on-exceed="handleExceed"
-            :on-success="excelUploadSuccess"
-            :on-error="excelUploadError"
-            :accept="fileType.join(',')"
-          >
-            <slot name="empty">
-              <el-icon class="el-icon--upload">
-                <upload-filled />
-              </el-icon>
-              <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+  <el-dialog v-model="dialogVisible" :width="parameter.width" :top="parameter.top" :title="`${parameter.title}`" :destroy-on-close="true" draggable>
+    <el-form class="drawer-multiColumn-form" label-width="100px">
+      <el-form-item label="文件上传">
+        <el-upload
+          ref="uploadRef"
+          action="#"
+          class="upload"
+          :drag="true"
+          :auto-upload="false"
+          :limit="parameter.limit"
+          :multiple="parameter.multiple"
+          :show-file-list="true"
+          :http-request="uploadExcel"
+          :before-upload="beforeExcelUpload"
+          :on-exceed="handleExceed"
+          :on-success="excelUploadSuccess"
+          :on-error="excelUploadError"
+          :accept="fileType.join(',')"
+        >
+          <slot name="empty">
+            <el-icon class="el-icon--upload">
+              <upload-filled />
+            </el-icon>
+            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
+          </slot>
+          <template #tip>
+            <slot name="tip">
+              <div class="el-upload__tip text-center">
+                <el-checkbox v-model="isCover">是否更新已存在的数据</el-checkbox>
+              </div>
+              <div class="el-upload__tip text-center">
+                请上传 .xls , .xlsx 标准格式文件,文件最大为 {{ parameter.fileSize }}M。
+                <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="downloadTemp"> 模板下载 </el-link>
+              </div>
             </slot>
-            <template #tip>
-              <slot name="tip">
-                <div class="el-upload__tip text-center">
-                  <el-checkbox v-model="isCover">是否更新已存在的数据</el-checkbox>
-                </div>
-                <div class="el-upload__tip text-center">
-                  请上传 .xls , .xlsx 标准格式文件,文件最大为 {{ fileSize }}M。
-                  <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="downloadTemp"> 模板下载 </el-link>
-                </div>
-              </slot>
-            </template>
-          </el-upload>
-        </el-form-item>
-      </el-form>
-      <template #footer>
-        <span class="dialog-footer">
-          <el-button type="primary" @click="handleSubmit">确认</el-button>
-          <el-button @click="dialogVisible = false">取消</el-button>
-        </span>
-      </template>
-    </el-dialog>
-    <!-- <TaskDialog ref="taskDialogRef" /> -->
-  </div>
+          </template>
+        </el-upload>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button type="primary" @click="handleSubmit">确认</el-button>
+        <el-button @click="dialogVisible = false">取消</el-button>
+      </span>
+    </template>
+  </el-dialog>
 </template>
 <script>
+import { useDownload } from '@/hooks/useDownload'
+
 export default {
   name: 'ImportExcel',
   components: {},
@@ -112,14 +111,14 @@ export default {
       const isExcel = this.fileType?.includes(file.type)
       const fileSize = file.size / 1024 / 1024 < this.fileSize
       if (!isExcel)
-        ElNotification({
+        this.$notify({
           title: '温馨提示',
           message: '上传文件只能是 xls / xlsx 格式!',
           type: 'warning'
         })
       if (!fileSize)
         setTimeout(() => {
-          ElNotification({
+          this.$notify({
             title: '温馨提示',
             message: `上传文件大小不能超过 ${this.fileSize}MB!`,
             type: 'warning'
@@ -130,7 +129,7 @@ export default {
 
     // 文件数超出提示
     handleExceed() {
-      ElNotification({
+      this.$notify({
         title: '温馨提示',
         message: '最多只能上传一个文件!',
         type: 'warning'
@@ -139,7 +138,7 @@ export default {
 
     // 上传错误提示
     excelUploadError() {
-      ElNotification({
+      this.$notify({
         title: '温馨提示',
         message: `批量添加${this.title}失败,请您重新上传!`,
         type: 'error'

+ 155 - 52
src/views/als/flightData/index.vue

@@ -19,36 +19,76 @@
         <LTable ref="table" @selection-change="selection" :defaultFetch="false" :fetch="fetch" :columns="columns" :dataSource="tableData" :options="options" :pagination="tableRequset"></LTable>
       </div>
       <!-- 添加或修改飞参数据信息对话框 -->
-      <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="600px" :before-close="handleClose">
-        <el-form ref="form" :model="form" label-width="80px">
-          <!-- <el-form-item label="文件编号" prop="ossId">
-            <el-input v-model="form.ossId" placeholder="请输入文件编号" />
-          </el-form-item> -->
-          <el-form-item label="数据源" prop="source">
-            <el-select v-model="form.source" placeholder="请选择数据源" disabled>
-              <el-option label="飞参数据" value="1"></el-option>
-              <el-option label="MDC数据" value="2"></el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="机型" prop="aircaftModel">
-            <el-select v-model="form.aircaftModel" placeholder="请选择机型" disabled>
-              <el-option v-for="item in aircaftModelAll" :key="item.aircaftModelId" :label="item.aircaftModelName" :value="item.aircaftModelId"> </el-option>
-            </el-select>
-          </el-form-item>
-          <!-- 编目 = 机号 -->
-          <el-form-item label="编目" prop="aircraftId">
-            <el-select v-model="form.aircraftId" placeholder="请选择编目" disabled>
-              <el-option v-for="item in aircaftCatalogAll" :key="item.aircaftCatalogId" :label="item.aircaftCatalogCode" :value="item.aircaftCatalogId"> </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="架次号" prop="sortieNo">
-            <el-select v-model="form.sortieNo" placeholder="请选择架次号">
-              <el-option v-for="item in sortieNoList" :key="item.taskId" :label="item.taskName" :value="item.taskId"> </el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="数据导入" prop="ossId">
-            <FileUpload v-model="form.ossId" :limit="1" :fileSize="500" :fileType="['xls', 'xlsx']" />
-          </el-form-item>
+      <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="1000px" :before-close="handleClose">
+        <el-form ref="form" :inline="true" :rules="rules" :model="form" label-width="80px">
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="数据源" prop="source">
+                <el-select v-model="form.source" placeholder="请选择数据源" disabled>
+                  <el-option label="飞参数据" value="1"></el-option>
+                  <el-option label="MDC数据" value="2"></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="机型" prop="aircaftModel">
+                <el-select v-model="form.aircaftModel" placeholder="请选择机型" disabled>
+                  <el-option v-for="item in aircaftModelAll" :key="item.aircaftModelId" :label="item.aircaftModelName" :value="item.aircaftModelId"> </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="编目" prop="aircraftId">
+                <el-select v-model="form.aircraftId" placeholder="请选择编目" disabled>
+                  <el-option v-for="item in aircaftCatalogAll" :key="item.aircaftCatalogId" :label="item.aircaftCatalogCode" :value="item.aircaftCatalogId"> </el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="飞行时间" prop="flightDate">
+                <el-date-picker v-model="form.flightDate" type="datetime" placement="bottom-start" value-format="yyyy-MM-dd HH:mm:ss" placeholder="请选择飞行时间" @change="flightDateChange"></el-date-picker>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="架次号" prop="sortieNo">
+                <el-input disabled v-model="form.sortieNo" placeholder="选择飞行时间自动生成" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="上传飞参数据" label-width="100px" prop="ossId">
+                <FileUpload v-model="form.ossId" :limit="1" :fileSize="500" :fileType="['xls', 'xlsx']" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row>
+            <el-col :span="12">
+              <el-form-item label="警告列表导入" label-width="100px">
+                <el-upload
+                  ref="upload"
+                  :limit="1"
+                  accept=".xlsx, .xls"
+                  :headers="upload.headers"
+                  :action="upload.url + '?updateSupport=' + upload.updateSupport + '&sortieNo=' + form.sortieNo"
+                  :disabled="upload.isUploading"
+                  :on-progress="handleFileUploadProgress"
+                  :on-success="handleFileSuccess"
+                  :auto-upload="false"
+                  :file-list="warnFileList"
+                >
+                  <el-button size="small" type="primary">点击上传</el-button>
+                  <div class="el-upload__tip text-center" slot="tip">
+                    <div class="el-upload__tip" slot="tip"><el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的数据</div>
+                    <span>仅允许导入xls、xlsx格式文件。</span>
+                    <el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">下载模板</el-link>
+                  </div>
+                </el-upload>
+              </el-form-item>
+            </el-col>
+          </el-row>
         </el-form>
 
         <span slot="footer" class="dialog-footer">
@@ -67,7 +107,8 @@ import { getAircaftModelAll, getAircaftCatalogAll, getSortieNo } from '@/api/als
 import { getTaskExecondRegister } from '@/api/carrierStandard/carrierListExecutionRegistration'
 import { deepClone, debounce } from '@/utils/index'
 import FileUpload from '@/views/als/components/FileUpload'
-import { flattenTree } from '../utils/common'
+import { flattenTree, download } from '../utils/common'
+import { getItem } from '@/utils/index'
 
 export default {
   name: 'DataImport',
@@ -92,6 +133,14 @@ export default {
           label: 'label'
         }
       },
+      rules: {
+        source: [{ required: true, message: '数据源不能为空', trigger: 'change' }],
+        aircaftModel: [{ required: true, message: '机型不能为空', trigger: 'change' }],
+        aircraftId: [{ required: true, message: '编目不能为空', trigger: 'change' }],
+        flightDate: [{ required: true, message: '飞行时间不能为空', trigger: 'change' }],
+        sortieNo: [{ required: true, message: '飞架次号不能为空', trigger: 'blur' }],
+        ossId: [{ required: true, message: '飞参数据不能为空', trigger: 'change' }]
+      },
       typeTree: {
         children: 'children',
         label: 'label'
@@ -112,15 +161,7 @@ export default {
         },
         {
           prop: 'sortieNo',
-          label: '架次号',
-          render: (h, params) => {
-            const matchedItem = this.allTaskExecond.find((item) => params.row.sortieNo.trim() === item.taskId.trim())
-            if (matchedItem) {
-              return h('span', matchedItem.taskName)
-            } else {
-              return h('span', {}, '')
-            }
-          }
+          label: '架次号'
         },
         {
           prop: 'source',
@@ -201,7 +242,22 @@ export default {
       aircaftModelAll: [],
       aircaftCatalogAll: [],
       sortieNoList: [],
-      allTaskExecond: []
+      allTaskExecond: [],
+      upload: {
+        // 是否显示弹出层
+        open: false,
+        // 弹出层标题
+        title: '',
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: getItem('token') },
+        // 上传的地址
+        url: '/api/als/warning/importData'
+      },
+      warnFileList: []
     }
   },
   watch: {
@@ -308,8 +364,8 @@ export default {
             message: '操作成功!'
           })
           this.handleClose()
-          this.submitBtnLoading = false
           this.getDataImportAPI({ aircraftId: this.aircaftModelIdList })
+          this.submitBtnLoading = false
         }
       } catch (error) {}
     },
@@ -387,16 +443,21 @@ export default {
     },
 
     submit() {
-      switch (this.dialogTitle) {
-        case '编辑':
-          this.submitBtnLoading = true
-          this.updateDataImportAPI()
-          break
-        case '新增':
-          this.submitBtnLoading = true
-          this.addDataImportAPI()
-          break
-      }
+      this.$refs['form'].validate((valid) => {
+        if (valid) {
+          switch (this.dialogTitle) {
+            case '编辑':
+              this.submitBtnLoading = true
+              this.updateDataImportAPI()
+              break
+            case '新增':
+              this.submitBtnLoading = true
+              this.submitFileForm()
+              this.addDataImportAPI()
+              break
+          }
+        }
+      })
     },
 
     selection(val) {
@@ -413,6 +474,48 @@ export default {
           this.removeDataImportAPI(row.map((e) => e.id))
         })
         .catch(() => {})
+    },
+
+    flightDateChange() {
+      this.form.sortieNo = this.getTime('JC')
+      // this.form.sortieNo = this.getTime() + '-' + obj?.model
+    },
+    getTime(prefix) {
+      const now = new Date()
+      const year = now.getFullYear()
+      const month = ('0' + (now.getMonth() + 1)).slice(-2)
+      const day = ('0' + now.getDate()).slice(-2)
+      const hours = ('0' + now.getHours()).slice(-2)
+      const minutes = ('0' + now.getMinutes()).slice(-2)
+      const seconds = ('0' + now.getSeconds()).slice(-2)
+
+      const dateString = `${year}${month}${day}${hours}${minutes}${seconds}` // 返回格式化的单号
+
+      return `${prefix}-${dateString}`
+    },
+    /** 导入按钮操作 */
+    handleImport() {
+      this.upload.title = '警告列表导入'
+      this.upload.open = true
+    },
+    /** 下载模板操作 */
+    importTemplate() {
+      download('/warning/importTemplate', {}, `warning_template_${new Date().getTime()}.xlsx`)
+    },
+    // 文件上传中处理
+    handleFileUploadProgress(event, file, fileList) {
+      this.upload.isUploading = true
+    },
+    // 文件上传成功处理
+    handleFileSuccess(response, file, fileList) {
+      this.upload.open = false
+      this.upload.isUploading = false
+      this.$refs.upload.clearFiles()
+      // this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + '</div>', '导入结果', { dangerouslyUseHTMLString: true })
+    },
+    // 提交上传文件
+    submitFileForm() {
+      this.$refs.upload.submit()
     }
   }
 }

+ 60 - 18
src/views/als/model/index.vue

@@ -29,6 +29,12 @@
           <el-form-item label="模型链接" prop="url">
             <el-input v-model="form.url" placeholder="请输入模型链接" />
           </el-form-item>
+          <el-form-item v-show="['5', '6'].includes(form.type)" label="机型" prop="aircaftType">
+            <treeselect v-model="form.aircaftType" :normalizer="aircaftTypeNormalizer" :options="aircaftTypeTreeData" :show-count="true" placeholder="请选择机型" />
+          </el-form-item>
+          <el-form-item v-show="['5', '6'].includes(form.type)" label="部件" prop="partId">
+            <treeselect v-model="form.parentId" :normalizer="normalizer" :options="partsData" :show-count="true" placeholder="请选择部件" />
+          </el-form-item>
           <el-form-item label="参数" prop="param">
             <el-input type="textarea" :rows="2" v-model="form.param" placeholder="请输入参数" />
           </el-form-item>
@@ -55,10 +61,16 @@
 <script>
 import { getModel, addModel, updateModel, removeModel } from '@/api/als/model'
 import { deepClone, debounce } from '@/utils/index'
+import Treeselect from '@riophae/vue-treeselect'
+import '@riophae/vue-treeselect/dist/vue-treeselect.css'
+import { handleTree } from '../utils/common'
 import { agloModelList } from '@/views/als/utils/enum-data'
+import { getAirConfiguration } from '@/api/als/airConfiguration'
+import { getAircaftTypeAndModelTree } from '@/api/als/sideTree'
+
 export default {
   name: 'Model',
-  components: {},
+  components: { Treeselect },
   data() {
     // 这里存放数据
     return {
@@ -89,6 +101,10 @@ export default {
           prop: 'url',
           label: '模型链接'
         },
+        {
+          prop: 'partId',
+          label: '部件'
+        },
         {
           prop: 'param',
           label: '参数'
@@ -160,19 +176,16 @@ export default {
         name: '',
         type: '',
         url: '',
+        aircaftType: null,
+        partId: null,
         param: '',
         columnData: '',
         status: '',
-        remark: '',
-        tenantId: '',
-        version: '',
-        delFlag: '',
-        createBy: '',
-        createTime: '',
-        updateBy: '',
-        updateTime: ''
+        remark: ''
       },
-      debounceFn: debounce(this.fetch, 500)
+      debounceFn: debounce(this.fetch, 500),
+      partsData: [],
+      aircaftTypeTreeData: []
     }
   },
   watch: {
@@ -183,8 +196,42 @@ export default {
   },
   mounted() {
     this.getModelAPI()
+    this.getPartData()
   },
   methods: {
+    async getPartData() {
+      try {
+        const { data } = await getAirConfiguration()
+        const { data: aircaftTypeData } = await getAircaftTypeAndModelTree()
+        this.aircaftTypeTreeData = aircaftTypeData
+        console.log('this.aircaftTypeTreeData', this.aircaftTypeTreeData)
+        const treeData = handleTree(data, 'id')
+        this.partsData = treeData
+      } catch (error) {}
+    },
+
+    normalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children
+      }
+      return {
+        id: node.id,
+        label: node.name,
+        children: node.children
+      }
+    },
+
+    aircaftTypeNormalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children
+      }
+      return {
+        id: node.id,
+        label: node.label,
+        children: node.children
+      }
+    },
+
     async removeModelAPI(params) {
       try {
         const { code } = await removeModel(params)
@@ -259,17 +306,12 @@ export default {
         name: '',
         type: '',
         url: '',
+        aircaftType: null,
+        partId: null,
         param: '',
         columnData: '',
         status: '',
-        remark: '',
-        tenantId: '',
-        version: '',
-        delFlag: '',
-        createBy: '',
-        createTime: '',
-        updateBy: '',
-        updateTime: ''
+        remark: ''
       }
     },
 

+ 75 - 0
src/views/als/utils/common.js

@@ -1,3 +1,8 @@
+import { Message, Loading } from 'element-ui'
+import { saveAs } from 'file-saver'
+import errorCode from '@/views/als/utils/errorCode'
+import axios from 'axios'
+
 /**
  * 构造树型结构数据
  * @param {*} data 数据源
@@ -68,3 +73,73 @@ export function flattenTree(treeNodes) {
   treeNodes.forEach(traverse)
   return result
 }
+
+// 通用下载方法
+let downloadLoadingInstance
+const service = axios.create({
+  // axios中请求配置有baseURL选项,表示请求URL公共部分
+  baseURL: '/api/als',
+  // 超时
+  timeout: 10000
+})
+export async function download(url, params, filename, config) {
+  downloadLoadingInstance = Loading.service({ text: '正在下载数据,请稍候', spinner: 'el-icon-loading', background: 'rgba(0, 0, 0, 0.7)' })
+  try {
+    const data = await service.post(url, params, {
+      transformRequest: [
+        (params_1) => {
+          return tansParams(params_1)
+        }
+      ],
+      headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
+      responseType: 'blob',
+      ...config
+    })
+    const isBlob = blobValidate(data)
+    if (isBlob) {
+      const blob = new Blob([data])
+      saveAs(blob, filename)
+    } else {
+      const resText = await data.text()
+      const rspObj = JSON.parse(resText)
+      const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default']
+      Message.error(errMsg)
+    }
+    downloadLoadingInstance.close()
+  } catch (r) {
+    console.error(r)
+    Message.error('下载文件出现错误,请联系管理员!')
+    downloadLoadingInstance.close()
+  }
+}
+
+/**
+ * 参数处理
+ * @param {*} params  参数
+ */
+export function tansParams(params) {
+  let result = ''
+  for (const propName of Object.keys(params)) {
+    const value = params[propName]
+    var part = encodeURIComponent(propName) + '='
+    if (value !== null && value !== '' && typeof value !== 'undefined') {
+      if (typeof value === 'object') {
+        for (const key of Object.keys(value)) {
+          if (value[key] !== null && value[key] !== '' && typeof value[key] !== 'undefined') {
+            let params = propName + '[' + key + ']'
+            var subPart = encodeURIComponent(params) + '='
+            result += subPart + encodeURIComponent(value[key]) + '&'
+          }
+        }
+      } else {
+        result += part + encodeURIComponent(value) + '&'
+      }
+    }
+  }
+  return result
+}
+
+// 验证是否为blob格式
+export function blobValidate(data) {
+  return data.type !== 'application/json'
+}

+ 6 - 0
src/views/als/utils/errorCode.js

@@ -0,0 +1,6 @@
+export default {
+  401: '认证失败,无法访问系统资源',
+  403: '当前操作没有权限',
+  404: '访问资源不存在',
+  default: '系统未知错误,请反馈给管理员'
+}