浏览代码

增加多语言包,修复error是传错,修改新增设备时mac地址的限制

LAPTOP-LIQ71VDD\m 3 年之前
父节点
当前提交
8e2ba734ba

+ 61 - 0
languages/en.js

@@ -0,0 +1,61 @@
+module.exports = {
+  action: {
+    home: 'home',
+    edit: 'edit',
+    more: 'more',
+    delete: 'delete',
+    logout: 'logout',
+    keywords: 'Please enter a search keyword',
+    chooseLang: 'languages',
+    perpetualLicence: 'perpetual license',
+    licenseValidity: 'your license is valid until: ',
+    licenseRemainsValid: 'Your license remains valid: ',
+    getLicense: 'day, Please contact after sales for authorization'
+  },
+  home: {
+    todayTask: 'today task',
+    recentNote: 'recent note',
+    recentInteract: 'recent interact',
+    recentRemarks: 'recent remarks'
+  },
+  frameManage: {
+    frameManage: 'frame manage',
+    keywordsFilter: 'Enter keywords to filter',
+    quickCreate: 'quick create',
+    memberList: 'member list',
+    deviceList: 'device list',
+    clerkList: 'clerk list'
+  },
+  deviceManage: {
+    deviceManage: 'device manage',
+    deviceAdd: 'device add',
+    deviceType: 'device type',
+    deviceName: 'device name',
+    status: 'status',
+    statusTure: 'status ture',
+    statusFalse: 'status false',
+    connect: 'connect',
+    connectTrue: 'connect true',
+    connectFalse: 'connect false',
+    frameFullName: 'frame full name',
+    ethMac: 'eth mac',
+    ethIp: 'eth ip',
+    ethIpPort: 'eth ip port',
+    model: 'model',
+    code: 'code',
+    softVer: 'soft ver',
+    hardVer: 'hard ver',
+    wifiMac: 'wifi mac',
+    wifiIp: 'wifi ip',
+    sipId: 'sip id',
+    updateTime: 'update time'
+  },
+  tab: {
+    home: 'home',
+    frameManage: 'frame manage',
+    deviceManage: 'device manage',
+    clerkManage: 'clerk manage',
+    memberManage: 'member manage',
+    mobileDeviceManage: 'mobile device manage'
+  }
+}

+ 61 - 0
languages/zh-CN.js

@@ -0,0 +1,61 @@
+module.exports = {
+  action: {
+    home: '首页',
+    edit: '编辑',
+    more: '更多',
+    delete: '删除',
+    logout: '退出登录',
+    keywords: '请输入搜索关键字',
+    chooseLang: '选择语言',
+    perpetualLicence: '永久授权',
+    licenseValidity: '授权有效期至: ',
+    licenseRemainsValid: '授权剩余有效期:',
+    getLicense: '天,请联系售后获得授权'
+  },
+  home: {
+    todayTask: '今日任务',
+    recentNote: '最近便签',
+    recentInteract: '最近交互',
+    recentRemarks: '最近用户备注'
+  },
+  frameManage: {
+    frameManage: '空间位置',
+    keywordsFilter: '输入关键字进行过滤',
+    quickCreate: '快速创建',
+    memberList: '用户列表',
+    deviceList: '设备列表',
+    clerkList: '机构成员'
+  },
+  deviceManage: {
+    deviceManage: '设备管理',
+    deviceAdd: '新增设备',
+    deviceType: '设备类型',
+    deviceName: '设备别名',
+    status: '设备状态',
+    statusTure: '启用',
+    statusFalse: '未启用',
+    connect: '连接状态',
+    connectTrue: '在线',
+    connectFalse: '离线',
+    frameFullName: '部署位置',
+    ethMac: '以太网MAC地址',
+    ethIp: '以太网IP地址',
+    ethIpPort: '通讯端口',
+    model: '设备型号',
+    code: '出厂编号',
+    softVer: '软件版本',
+    hardVer: '硬件版本',
+    wifiMac: '无线MAC地址',
+    wifiIp: '无线IP地址',
+    sipId: 'SIP账号',
+    updateTime: '更新时间'
+  },
+  tab: {
+    home: '首页',
+    frameManage: '空间位置',
+    deviceManage: '所有设备',
+    clerkManage: '员工管理',
+    memberManage: '用户管理',
+    mobileDeviceManage: '移动设备'
+  }
+}

+ 1 - 0
package.json

@@ -47,6 +47,7 @@
     "vue-class-component": "^7.2.6",
     "vue-count-to": "1.0.13",
     "vue-draggable-resizable": "^2.3.0",
+    "vue-i18n": "^8.26.1",
     "vue-property-decorator": "^9.1.2",
     "vue-router": "3.0.2",
     "vue-seamless-scroll": "^1.1.23",

+ 1 - 1
src/components/Breadcrumb/index.vue

@@ -37,7 +37,7 @@ export default {
       const first = matched[0]
 
       if (!this.isDashboard(first)) {
-        matched = [{ path: '/dashboard', meta: { title: '首页' }}].concat(matched)
+        matched = [{ path: '/dashboard', meta: { title: this.$t('action.home') }}].concat(matched)
       }
 
       this.levelList = matched.filter(item => item.meta && item.meta.title && item.meta.breadcrumb !== false)

+ 47 - 6
src/layout/components/Navbar.vue

@@ -29,7 +29,7 @@
           <!--            <el-dropdown-item>Profile</el-dropdown-item>-->
           <!--          </router-link>-->
           <router-link to="/">
-            <el-dropdown-item>首页</el-dropdown-item>
+            <el-dropdown-item>{{ this.$t("action.home") }}</el-dropdown-item>
           </router-link>
           <!--          <a target="_blank" href="https://github.com/PanJiaChen/vue-element-admin/">-->
           <!--            <el-dropdown-item>Github</el-dropdown-item>-->
@@ -37,8 +37,20 @@
           <!--          <a target="_blank" href="https://panjiachen.github.io/vue-element-admin-site/#/">-->
           <!--            <el-dropdown-item>Docs</el-dropdown-item>-->
           <!--          </a>-->
+          <el-dropdown-item divided>
+            <el-dropdown placement="right-start" @command="switchLanguage">
+              <span class="el-dropdown-link">
+                {{ this.$t("action.chooseLang") }}<i class="el-icon-arrow-right el-icon--right" />
+              </span>
+              <el-dropdown-menu slot="dropdown">
+                <el-dropdown-item v-for="(value,index) in language" :key="index" :command="value.value">
+                  {{value.label}}
+                </el-dropdown-item>
+              </el-dropdown-menu>
+            </el-dropdown>
+          </el-dropdown-item>
           <el-dropdown-item divided @click.native="logout">
-            <span style="display:block;">退出登录</span>
+            <span style="display:block;">{{ this.$t("action.logout") }}</span>
           </el-dropdown-item>
         </el-dropdown-menu>
       </el-dropdown>
@@ -56,6 +68,7 @@ import SizeSelect from '@/components/SizeSelect'
 import Search from '@/components/HeaderSearch'
 import avator from '@/assets/avatar.jpeg'
 import * as API_Part from '@/api/calling-part'
+import Cookies from 'js-cookie'
 export default {
   components: {
     Breadcrumb,
@@ -68,7 +81,19 @@ export default {
   data() {
     return {
       avator: avator,
-      licence: ''
+      licence: '',
+      value: this.$i18n.locale,
+      language: [
+        {
+          value: 'en',
+          label: 'English'
+        },
+        {
+          value: 'zh',
+          label: '中文简体'
+        }
+      ]
+
     }
   },
   computed: {
@@ -85,13 +110,13 @@ export default {
     if (Number(this.$store.getters.partId) > 0) {
       API_Part.getExpire().then(res => {
         if (res.timeout === 'nolimit') {
-          this.licence = '永久授权'
+          this.licence = this.$t('action.perpetualLicence')
         } else {
           const days = Math.floor(((Number(res.timeout) * 1000) - new Date()) / (1000 * 60 * 60 * 24))
           if (days > 30) {
-            this.licence = '授权有效期至: ' + new Date((Number(res.timeout) * 1000)).toLocaleString()
+            this.licence = this.$t('action.licenseValidity') + new Date((Number(res.timeout) * 1000)).toLocaleString()
           } else {
-            this.licence = '授权剩余有效期:' + days + '天,请联系售后获得授权'
+            this.licence = this.$t('action.licenseRemainsValid') + days + this.$t('action.getLicense')
           }
         }
       }).catch(err => {
@@ -108,6 +133,22 @@ export default {
       this.$store.dispatch('permission/removeRoutes')
       console.log('hello')
       this.$router.push(`/login?redirect=${this.$route.fullPath}`)
+    },
+    switchLanguage(value) {
+      if (value === 'zh') {
+        this.$i18n.locale = 'zh'
+      } else if (value === 'en') {
+        this.$i18n.locale = 'en'
+      }
+      // 在选择了显示的语言后,将配置保存到Cookie中
+      Cookies.set('DefaultLanguage', value, //
+        { //
+          // expires: '30m' // 默认cookie有效时间为30分钟
+          expires: 1
+        }
+      )
+      // location.reload()
+      this.$router.go(0)
     }
   }
 }

+ 17 - 1
src/main.js

@@ -6,7 +6,10 @@ import 'normalize.css/normalize.css' // a modern alternative to CSS resets
 
 import Element from 'element-ui'
 import './styles/element-variables.scss'
-// import enLang from 'element-ui/lib/locale/lang/en'// 如果使用中文语言包请默认支持,无需额外引入,请删除该依赖
+import locale from 'element-ui/lib/locale'
+import enLang from 'element-ui/lib/locale/lang/en'// 如果使用中文语言包请默认支持,无需额外引入,请删除该依赖
+import zhLang from 'element-ui/lib/locale/lang/zh-CN'
+import VueI18n from 'vue-i18n'
 import 'ag-grid-community/dist/styles/ag-grid.css'
 import 'ag-grid-community/dist/styles/ag-theme-alpine.css'
 import '@/styles/index.scss' // global css
@@ -49,6 +52,8 @@ Vue.use(Element, {
   size: Cookies.get('size') || 'medium' // set element-ui default size
   // locale: enLang // 如果使用中文,无需设置,请删除
 })
+Vue.use(VueI18n)
+Vue.use(Element, { zhLang })
 
 // register global utility filters
 Object.keys(filters).forEach(key => {
@@ -57,8 +62,19 @@ Object.keys(filters).forEach(key => {
 
 Vue.config.productionTip = false
 
+const i18n = new VueI18n({
+  locale: Cookies.get('DefaultLanguage') == null ? 'zh' : Cookies.get('DefaultLanguage'), // 语言标识,默认汉语,先去cookie查找,如果存在并有效,cookie值即为默认语言类型;否则默认为中文简体
+  messages: {
+    'zh': Object.assign(require('../languages/zh-CN'), zhLang),
+    'en': Object.assign(require('../languages/en'), enLang)
+    // 'zh': require('./languages/zh-CN'),
+    // 'en': require('./languages/en')
+  }
+})
+locale.i18n((key, value) => i18n.t(key, value))
 new Vue({
   el: '#app',
+  i18n, // 将VueI18n挂载到vue实例上
   router,
   store,
   render: h => h(App)

+ 3 - 3
src/views/customer/components/customerManager.vue

@@ -789,7 +789,7 @@ export default {
           this.emptyBeds = [...res]
           resolve()
         }).catch(err => {
-          this.$message.error('获取空床位:' + err)
+          this.$message.error('获取空床位:' + err.message)
           reject()
         })
       })
@@ -823,7 +823,7 @@ export default {
           }
         })
       }).catch(err => {
-        this.$message.error(err)
+        this.$message.error(err.message)
       })
     },
     /**
@@ -1018,7 +1018,7 @@ export default {
               this.infoChanged()
               this.$emit('saved')
             }).catch(e => {
-              this.$message.error(e)
+              this.$message.error(e.message)
               this.isDisabled = false
             })
           } else {

+ 4 - 4
src/views/customer/components/patientManager.vue

@@ -781,7 +781,7 @@ export default {
           this.emptyBeds = [...res]
           resolve()
         }).catch(err => {
-          this.$message.error('获取空床位:' + err)
+          this.$message.error('获取空床位:' + err.message)
           reject()
         })
       })
@@ -815,7 +815,7 @@ export default {
           }
         })
       }).catch(err => {
-        this.$message.error(err)
+        this.$message.error(err.message)
       })
     },
     /**
@@ -1017,7 +1017,7 @@ export default {
               this.getList()
               this.infoChanged()
             }).catch(e => {
-              this.$message.error(e)
+              this.$message.error(e.message)
               this.isDisabled = false
             })
           } else {
@@ -1028,7 +1028,7 @@ export default {
               this.isDisabled = false
               this.$emit('saved')
             }).catch(err => {
-              this.$message.error(err)
+              this.$message.error(err.message)
               this.isDisabled = false
             })
           }

+ 42 - 42
src/views/dashboard/calling/index.vue

@@ -4,29 +4,29 @@
       <el-col :span="12">
         <el-card style="maring:10px">
           <div slot="header" class="clearfix">
-            <span style="float: left">今日任务</span>
-            <el-link type="primary" style="float: right" @click="goMove('taskList')">更多</el-link>
+            <span style="float: left">{{ this.$t("home.todayTask") }}</span>
+            <el-link type="primary" style="float: right" @click="goMove('taskList')">{{ this.$t("action.more") }}</el-link>
           </div>
           <div style="clear:both;font-size: 14px;height: 300px;">
-            <el-scrollbar wrapClass="scrollbar-wrapper" style="min-height: 250px">
+            <el-scrollbar wrap-class="scrollbar-wrapper" style="min-height: 250px">
               <vue-seamless-scroll :data="todayList" :class-option="defaultOption" class="seamless-warp">
                 <el-card v-for="(item, index) in todayList" :key="index">
                   <div>
-                    <span>计划执行时间:{{forDate(item.task_plan_time)}}</span>
+                    <span>计划执行时间:{{ forDate(item.task_plan_time) }}</span>
                   </div>
                   <div style="margin-top: 5px;" @click="showArticleContext(item.task_content)">
-                    <span style="margin-left: 20px; line-height:1.2"><a>{{item.task_content}}</a></span>
+                    <span style="margin-left: 20px; line-height:1.2"><a>{{ item.task_content }}</a></span>
                   </div>
                   <div style="margin: 5px">
                     <div style="float: left">
                       <span v-if="item.file_name">
-                        <el-link :href="item.file_path" icon="el-icon-folder" type="success" target="_blank" :download="item.file_name">{{item.file_name}}</el-link>
+                        <el-link :href="item.file_path" icon="el-icon-folder" type="success" target="_blank" :download="item.file_name">{{ item.file_name }}</el-link>
                       </span>
                     </div>
                     <div style="float: right">
                       <p>
-                        <span style="font-weight:bold">创建时间:</span>{{forDate(item.create_time)}}
-                        <span style="font-weight:bold;margin-left: 10px;">创建人:</span>{{item.create_name}}
+                        <span style="font-weight:bold">创建时间:</span>{{ forDate(item.create_time) }}
+                        <span style="font-weight:bold;margin-left: 10px;">创建人:</span>{{ item.create_name }}
                       </p>
                     </div>
                   </div>
@@ -40,26 +40,26 @@
       <el-col :span="12">
         <el-card>
           <div slot="header" class="clearfix">
-            <span style="float: left">最近便签</span>
-            <el-link type="primary" style="float: right" @click="goMove('remarkList')">更多</el-link>
+            <span style="float: left">{{ this.$t("home.recentNote") }}</span>
+            <el-link type="primary" style="float: right" @click="goMove('remarkList')">{{ this.$t("action.more") }}</el-link>
           </div>
           <div style="clear:both;font-size: 14px;height: 300px;">
-            <el-scrollbar wrapClass="scrollbar-wrapper" style="min-height: 250px">
+            <el-scrollbar wrap-class="scrollbar-wrapper" style="min-height: 250px">
               <vue-seamless-scroll :data="noteList" :class-option="defaultOption" class="seamless-warp">
                 <el-card v-for="(item, index) in noteList" :key="index">
                   <div style="margin-top: 5px;" @click="showArticleContext(item.content)">
-                    <span style="margin-left: 20px; line-height:1.2"><a>{{item.content}}</a></span>
+                    <span style="margin-left: 20px; line-height:1.2"><a>{{ item.content }}</a></span>
                   </div>
                   <div style="margin: 5px">
                     <div style="float: left">
                       <span v-if="item.file_name">
-                        <el-link :href="item.file_path" icon="el-icon-folder" type="success" target="_blank" :download="item.file_name">{{item.file_name}}</el-link>
+                        <el-link :href="item.file_path" icon="el-icon-folder" type="success" target="_blank" :download="item.file_name">{{ item.file_name }}</el-link>
                       </span>
                     </div>
                     <div style="float: right">
                       <p>
-                        <span style="font-weight:bold">创建时间:</span>{{forDate(item.create_time)}}
-                        <span style="font-weight:bold;margin-left: 10px;">创建人:</span>{{item.create_name}}
+                        <span style="font-weight:bold">创建时间:</span>{{ forDate(item.create_time) }}
+                        <span style="font-weight:bold;margin-left: 10px;">创建人:</span>{{ item.create_name }}
                       </p>
                     </div>
                   </div>
@@ -75,16 +75,16 @@
       <el-col :span="16">
         <el-card style="maring:10px">
           <div slot="header" class="clearfix">
-            <span style="float: left">最近交互</span>
-            <el-link type="primary" style="float: right" @click="goMove('CallingList')">更多</el-link>
+            <span style="float: left">{{ this.$t("home.recentInteract") }}</span>
+            <el-link type="primary" style="float: right" @click="goMove('CallingList')">{{ this.$t("action.more") }}</el-link>
           </div>
           <div style="height: 300px">
             <el-table :data="callingHistoryList" height="300px">
-                <el-table-column prop="fromMemberName" label="发起方" min-width="140" align="center" :formatter="formatterFromName" />
-                <el-table-column prop="toMemberName" label="接收方" min-width="140" align="center" :formatter="formatterToName" />
-                <el-table-column prop="action_type" label="交互类型" width="100" align="center" :formatter="formatterType" />
-                <el-table-column prop="action_end" label="交互结果" width="100" align="center" :formatter="formatterResult" />
-                <el-table-column prop="create_date" label="交互时间" width="170" align="center" :formatter="formatterCreateTime" />
+              <el-table-column prop="fromMemberName" label="发起方" min-width="140" align="center" :formatter="formatterFromName" />
+              <el-table-column prop="toMemberName" label="接收方" min-width="140" align="center" :formatter="formatterToName" />
+              <el-table-column prop="action_type" label="交互类型" width="100" align="center" :formatter="formatterType" />
+              <el-table-column prop="action_end" label="交互结果" width="100" align="center" :formatter="formatterResult" />
+              <el-table-column prop="create_date" label="交互时间" width="170" align="center" :formatter="formatterCreateTime" />
             </el-table>
           </div>
         </el-card>
@@ -93,26 +93,26 @@
       <el-col :span="8">
         <el-card>
           <div slot="header" class="clearfix">
-            <span style="float: left">最近用户备注</span>
-            <el-link type="primary" style="float: right" @click="goMove('customerList')">更多</el-link>
+            <span style="float: left">{{ this.$t("home.recentRemarks") }}</span>
+            <el-link type="primary" style="float: right" @click="goMove('customerList')">{{ this.$t("action.more") }}</el-link>
           </div>
           <div style="clear:both;font-size: 14px;height: 300px;">
-            <el-scrollbar wrapClass="scrollbar-wrapper" style="min-height: 250px">
+            <el-scrollbar wrap-class="scrollbar-wrapper" style="min-height: 250px">
               <vue-seamless-scroll :data="remarkList" :class-option="defaultOption" class="seamless-warp">
                 <el-card v-for="(item, index) in remarkList" :key="index">
                   <div style="margin-top: 5px;" @click="showArticleContext(item.content)">
-                    <span style="margin-left: 20px; line-height:1.2"><a>{{item.content}}</a></span>
+                    <span style="margin-left: 20px; line-height:1.2"><a>{{ item.content }}</a></span>
                   </div>
                   <div style="margin: 5px">
                     <div style="float: left">
                       <span v-if="item.file_name">
-                        <el-link :href="item.file_path" icon="el-icon-folder" type="success" target="_blank" :download="item.file_name">{{item.file_name}}</el-link>
+                        <el-link :href="item.file_path" icon="el-icon-folder" type="success" target="_blank" :download="item.file_name">{{ item.file_name }}</el-link>
                       </span>
                     </div>
                     <div style="float: right">
                       <p>
-                        <span style="font-weight:bold">创建时间:</span>{{forDate(item.create_time)}}
-                        <span style="font-weight:bold;margin-left: 10px;">创建人:</span>{{item.create_name}}
+                        <span style="font-weight:bold">创建时间:</span>{{ forDate(item.create_time) }}
+                        <span style="font-weight:bold;margin-left: 10px;">创建人:</span>{{ item.create_name }}
                       </p>
                     </div>
                   </div>
@@ -124,16 +124,16 @@
       </el-col>
     </el-row>
     <el-dialog title="详情" :visible.sync="isShowArticle" width="50%" align="center">
-      <p style="text-align: left;" v-html="currentContent.replace(/\n/g, '<br>')" class="current-content"></p>
+      <p style="text-align: left;" class="current-content" v-html="currentContent.replace(/\n/g, '<br>')" />
     </el-dialog>
   </div>
 </template>
 
 <script>
-  import * as API_task from '@/api/ncs_task'
-  import * as API_Remark from '@/api/ncs_remark'
-  import {unixToDate} from '@/utils/Foundation'
-  import * as API_CallingList from '@/api/ncs_interaction'
+import * as API_task from '@/api/ncs_task'
+import * as API_Remark from '@/api/ncs_remark'
+import { unixToDate } from '@/utils/Foundation'
+import * as API_CallingList from '@/api/ncs_interaction'
 
 export default {
   name: 'Index',
@@ -144,7 +144,7 @@ export default {
         page_no: 1,
         page_size: 100,
         sort: 'create_time',
-        dir: 'desc',
+        dir: 'desc'
       },
       noteList: [],
       callingHistoryList: [],
@@ -189,12 +189,12 @@ export default {
     getTodayList() {
       const param = this.MixinClone(this.params)
       param.fixedCondition = ' part_id = ' + this.$store.getters.partId
-      let _this = this
+      const _this = this
       _this.todayList = []
       API_task.getList(param).then(response => {
         const today = (new Date().setHours(0, 0, 0, 0)) / 1000
         const todayend = (today * 1000 + 86400000) / 1000
-        response.data.forEach((item, index) =>{
+        response.data.forEach((item, index) => {
           if (item.task_plan_time >= today && item.task_plan_time < todayend) {
             _this.todayList.push(item)
           }
@@ -204,7 +204,7 @@ export default {
     getNoteList() {
       const param = this.MixinClone(this.params)
       param.fixedCondition = ' type = 2 and part_id=' + this.$store.getters.partId
-      let _this = this
+      const _this = this
       API_Remark.getRemarks(param).then(response => {
         _this.noteList = response.data
       })
@@ -212,7 +212,7 @@ export default {
     getRemarkList() {
       const param = this.MixinClone(this.params)
       param.fixedCondition = ' type = 1 and part_id=' + this.$store.getters.partId
-      let _this = this
+      const _this = this
       API_Remark.getRemarks(param).then(response => {
         _this.remarkList = response.data
       })
@@ -222,7 +222,7 @@ export default {
       param.page_size = 10
       param.fixedCondition = ' part_id=' + this.$store.getters.partId
       param.sort = 'id'
-      let _this = this
+      const _this = this
       API_CallingList.getList(param).then(response => {
         _this.callingHistoryList = response.data
       })
@@ -235,7 +235,7 @@ export default {
       this.isShowArticle = true
     },
     goMove(path) {
-      this.$router.push({name: path})
+      this.$router.push({ name: path })
     },
     formatterFromName(row, column, cellValue) {
       if (!row.outerior_action && row.relative_id === null) {
@@ -296,7 +296,7 @@ export default {
     },
     formatterCreateTime(row, column, cellValue) {
       return unixToDate(cellValue)
-    },
+    }
   }
 
 }

+ 3 - 3
src/views/hospital/ncs_customer/customerManager.vue

@@ -772,7 +772,7 @@ export default {
           this.emptyBeds = [...res]
           resolve()
         }).catch(err => {
-          this.$message.error('获取空床位:' + err)
+          this.$message.error('获取空床位:' + err.message)
           reject()
         })
       })
@@ -809,7 +809,7 @@ export default {
         //   this.isEmptyFrame = false
         // }
       }).catch(err => {
-        this.$message.error(err)
+        this.$message.error(err.message)
       })
     },
     /**
@@ -1019,7 +1019,7 @@ export default {
               this.getList()
               this.$emit('saved')
             }).catch(e => {
-              this.$message.error(e)
+              this.$message.error(e.message)
               this.isDisabled = false
             })
           } else {

+ 8 - 4
src/views/hospital/ncs_device/deviceManager.vue

@@ -245,7 +245,8 @@ export default {
         ],
         eth_mac: [
           { required: true, message: '请输入设备MAC地址', trigger: 'blur' },
-          { pattern: /^([0-9A-Fa-f]{2}:?){6}/gi, message: '请输入正确的MAC地址', trigger: 'blur' }
+          // { pattern: /^([0-9A-Fa-f]{2}:?){6}/gi, message: '请输入正确的MAC地址', trigger: 'blur' }
+          { pattern: null, message: '请输入正确的MAC地址', trigger: 'blur' }
         ],
         frame_id: [
           { required: Object.keys(this.frame).length === 0, message: '请选安装位置!', trigger: 'blur' } // 没有传入frame 属性,必须选择安装位置
@@ -432,7 +433,7 @@ export default {
           data_total: response.data_total
         }
       }).catch(err => {
-        this.$message.error(err)
+        this.$message.error(err.message)
       })
       this.getTypeFrame(this.$store.getters.partId)
       this.getShopOptions(this.$store.getters.partId)
@@ -563,6 +564,9 @@ export default {
       } else if (val === DEVICE_TYPE.REMOTE_CONTROL) {
         this.deviceRules.eth_mac[1].pattern = null
         this.deviceRules.eth_mac[0].required = true
+      } else if (val === DEVICE_TYPE.DIGIT_BED_DEVICE) {
+        this.deviceRules.eth_mac[1].pattern = null
+        this.deviceRules.eth_mac[0].required = true
       } else {
         // this.deviceRules.eth_mac[1].pattern = /^([0-9A-Fa-f]{2}:?){6}/gi
         this.deviceRules.eth_mac[1].pattern = null
@@ -650,7 +654,7 @@ export default {
               this.deviceDialogVisible = false
               this.getList()
             }).catch(err => {
-              this.$message.error(err)
+              this.$message.error(err.message)
             })
           } else {
             /** 修改 */
@@ -659,7 +663,7 @@ export default {
               this.deviceDialogVisible = false
               this.getList()
             }).catch(error => {
-              this.$message.error(error)
+              this.$message.error(error.message)
             })
           }
         }

+ 2 - 2
src/views/hospital/ncs_frame/frameTreeView.vue

@@ -5,7 +5,7 @@
         <div class="el-row--flex">
           <el-input
             v-model="filterText"
-            placeholder="输入关键字进行过滤"
+            :placeholder="this.$t('frameManage.keywordsFilter')"
             clearable
           />
           <!--          <el-button-->
@@ -387,7 +387,7 @@ export default {
         this.$refs.frameTree.setCurrentKey(this.selectedNodeId)
       }
     }).catch(err => {
-      this.$message.error(err)
+      this.$message.error(err.message)
     })
   },
   methods: {

+ 1 - 1
src/views/hospitalFrame/frameGroup.vue

@@ -373,7 +373,7 @@ export default {
             this.$message.success('保存成功!')
             this.getList()
           }).catch(err => {
-            this.$message.error(err)
+            this.$message.error(err.message)
           })
         }
       })

+ 1 - 1
src/views/hospitalFrame/frameGroupEdit.vue

@@ -77,7 +77,7 @@ export default {
         this.rooms = this.filterGroupFrames(res.frameTree, this.groupId)
         console.log('rooms', this.rooms)
       }).catch(err => {
-        this.$message.error(err)
+        this.$message.error(err.message)
       })
     },
 

+ 4 - 4
src/views/hospitalFrame/frameTreeView.vue

@@ -5,7 +5,7 @@
         <div class="el-row--flex">
           <el-input
             v-model="filterText"
-            placeholder="输入关键字进行过滤"
+            :placeholder="this.$t('frameManage.keywordsFilter')"
             clearable
           />
           <el-button
@@ -13,7 +13,7 @@
             size="mini"
             style="margin-left: 10px;color: #67C23A"
             @click="quickCreateFrame"
-          >快速创建</el-button>
+          >{{ this.$t('frameManage.quickCreate') }}</el-button>
 
         </div>
         <el-tree
@@ -264,7 +264,7 @@ export default {
       this.selectedNodeId = this.treeData[0].id
       this.$refs.frameTree.setCurrentKey(this.selectedNodeId)
     }).catch(err => {
-      this.$message.error(err)
+      this.$message.error(err.message)
     })
   },
   methods: {
@@ -452,7 +452,7 @@ export default {
           this.$refs.frameTree.setCurrentKey(this.selectedNodeId)
         })
       }).catch(err => {
-        this.$message.error(err)
+        this.$message.error(err.message)
       })
     },
 

+ 2 - 2
src/views/ncs-auth/compontents/roleEdit.vue

@@ -169,10 +169,10 @@ export default {
           }
           this.role_id === 0
             ? API_Auth.addRole(params).then((response) => saveSuccess(response)).catch(err => {
-              this.$message.error(err)
+              this.$message.error(err.message)
             })
             : API_Auth.editRole(this.role_id, params).then((response) => saveSuccess(response)).catch(err => {
-              this.$message.error(err)
+              this.$message.error(err.message)
             })
           const saveSuccess = (response) => {
             this.$message.success('保存成功!')

+ 1 - 1
src/views/ncs-broadcast/components/broadcastFileList.vue

@@ -417,7 +417,7 @@ export default {
               this.$message.success('保存成功!')
               this.getList()
             }).catch(err => {
-              this.$message.error(err)
+              this.$message.error(err.message)
             })
           } else {
             this.formmodel.part_id = this.$store.getters.partId

+ 2 - 2
src/views/ncs-broadcast/components/broadcastInfo.vue

@@ -262,7 +262,7 @@ export default {
       API_FrameGroup.getframestruct(this.$store.getters.partId, 4).then(res => {
         this.rooms = this.filterGroupFrames(res.frameTree, this.formmodel.frame_ids)
       }).catch(err => {
-        this.$message.error(err)
+        this.$message.error(err.message)
       })
     },
     /** 递归筛选被选空间节点 */
@@ -371,7 +371,7 @@ export default {
               this.getRoomStructs()
             })
           }).catch(err => {
-            this.$message.error(err)
+            this.$message.error(err.message)
           })
         } else {
           this.$message.error('表单填写错误,请检查!')

+ 1 - 1
src/views/ncs-broadcast/index.vue

@@ -629,7 +629,7 @@ export default {
             this.$message.success('保存成功!')
             this.getList()
           }).catch(err => {
-            this.$message.error(err)
+            this.$message.error(err.message)
           })
         } else {
           this.$message.error('表单填写错误,请检查!')

+ 43 - 33
src/views/ncs-device/components/deviceManager.vue

@@ -244,7 +244,8 @@ export default {
         ],
         eth_mac: [
           { required: true, message: '请输入设备MAC地址', trigger: 'blur' },
-          { pattern: /^([0-9A-Fa-f]{2}:?){6}/gi, message: '请输入正确的MAC地址', trigger: 'blur' }
+          // { pattern: /^([0-9A-Fa-f]{2}:?){6}/gi, message: '请输入正确的MAC地址', trigger: 'blur' }
+          { pattern: null, message: '请输入正确的MAC地址', trigger: 'blur' }
         ],
         frame_id: [
           { required: Object.keys(this.frame).length === 0, message: '请选安装位置!', trigger: 'blur' } // 没有传入frame 属性,必须选择安装位置
@@ -348,26 +349,28 @@ export default {
 
         filterParams: {
           textCustomComparator: (filter, value, filterText) => {
-            const filterTextLowerCase = filterText.toLowerCase()
-            const valueLowerCase = value.toString().toLowerCase()
-            switch (filter) {
-              case 'contains':
-                return valueLowerCase.indexOf(filterTextLowerCase) >= 0
-              case 'notContains':
-                return valueLowerCase.indexOf(filterTextLowerCase) === -1
-              case 'equals':
-                return valueLowerCase === filterTextLowerCase
-              case 'notEqual':
-                return valueLowerCase !== filterTextLowerCase
-              case 'startsWith':
-                return valueLowerCase.indexOf(filterTextLowerCase) === 0
-              case 'endsWith':
-                var index = valueLowerCase.lastIndexOf(filterTextLowerCase)
-                return index >= 0 && index === (valueLowerCase.length - filterTextLowerCase.length)
-              default:
-                // should never happen
-                console.warn('invalid filter type ' + filter)
-                return false
+            if (filterText) {
+              const filterTextLowerCase = filterText.toLowerCase()
+              const valueLowerCase = value.toString().toLowerCase()
+              switch (filter) {
+                case 'contains':
+                  return valueLowerCase.indexOf(filterTextLowerCase) >= 0
+                case 'notContains':
+                  return valueLowerCase.indexOf(filterTextLowerCase) === -1
+                case 'equals':
+                  return valueLowerCase === filterTextLowerCase
+                case 'notEqual':
+                  return valueLowerCase !== filterTextLowerCase
+                case 'startsWith':
+                  return valueLowerCase.indexOf(filterTextLowerCase) === 0
+                case 'endsWith':
+                  var index = valueLowerCase.lastIndexOf(filterTextLowerCase)
+                  return index >= 0 && index === (valueLowerCase.length - filterTextLowerCase.length)
+                default:
+                  // should never happen
+                  console.warn('invalid filter type ' + filter)
+                  return false
+              }
             }
           }
         },
@@ -468,12 +471,14 @@ export default {
         const deviceData = [...response.data]
         deviceData.forEach(item => {
           if (this.onlineDevice.length > 0) {
-            const mac = this.onlineDevice.filter(p => p.toLowerCase() === item.eth_mac.toLowerCase())[0]
-            // console.log('在线设备1', mac)
-            if (mac !== undefined && mac !== null) {
-              item['online_state'] = '在线'
-            } else {
-              item['online_state'] = '离线'
+            if (item.eth_mac) {
+              const mac = this.onlineDevice.filter(p => p.toLowerCase() === item.eth_mac.toLowerCase())[0]
+              // console.log('在线设备1', mac)
+              if (mac !== undefined && mac !== null) {
+                item['online_state'] = '在线'
+              } else {
+                item['online_state'] = '离线'
+              }
             }
           } else {
             item['online_state'] = '离线'
@@ -492,7 +497,7 @@ export default {
           }
         })
       }).catch(err => {
-        this.$message.error(err)
+        this.$message.error(err.message)
       })
       this.typeFrames = this.partFrames
     },
@@ -624,6 +629,9 @@ export default {
       } else if (val === DEVICE_TYPE.REMOTE_CONTROL) {
         this.deviceRules.eth_mac[1].pattern = null
         this.deviceRules.eth_mac[0].required = true
+      } else if (val === DEVICE_TYPE.DIGIT_BED_DEVICE) {
+        this.deviceRules.eth_mac[1].pattern = null
+        this.deviceRules.eth_mac[0].required = true
       } else {
         // this.deviceRules.eth_mac[1].pattern = /^([0-9A-Fa-f]{2}:?){6}/gi
         this.deviceRules.eth_mac[1].pattern = null
@@ -709,7 +717,7 @@ export default {
               this.deviceDialogVisible = false
               this.getList()
             }).catch(err => {
-              this.$message.error(err)
+              this.$message.error(err.message)
             })
           } else {
             /** 修改 */
@@ -718,7 +726,7 @@ export default {
               this.deviceDialogVisible = false
               this.getList()
             }).catch(error => {
-              this.$message.error(error)
+              this.$message.error(error.message)
             })
           }
         }
@@ -768,9 +776,11 @@ export default {
     websocketonmessage: function(e) {
       this.onlineDevice = JSON.parse(e.data)
       if (this.rowData !== null) {
-        for (var i = 0; i < this.rowData.length; i++) {
-          const mac = this.onlineDevice.filter(p => p.toLowerCase() === this.rowData[i].eth_mac.toLowerCase())[0]
-          this.rowData[i]['online_state'] = (mac !== undefined && mac !== null) ? '在线' : '离线'
+        for (let i = 0; i < this.rowData.length; i++) {
+          if (this.rowData[i].eth_mac) {
+            const mac = this.onlineDevice.filter(p => p.toLowerCase() === this.rowData[i].eth_mac.toLowerCase())[0]
+            this.rowData[i]['online_state'] = (mac !== undefined && mac !== null) ? '在线' : '离线'
+          }
         }
         const rowData = [...this.rowData]
         this.$set(this, 'rowData', rowData)

+ 1 - 1
src/views/ncs-device/device-edit.vue

@@ -291,7 +291,7 @@ export default {
               this.handlerAdd()
               this.$emit('saved')
             }).catch(err => {
-              this.$message.error(err)
+              this.$message.error(err.message)
             })
           } else {
             /** 修改 */

+ 1 - 1
src/views/ncs-orginazition/index.vue

@@ -451,7 +451,7 @@ export default {
             this.$message.success('保存成功!')
             this.getList()
           }).catch(err => {
-            this.$message.error(err)
+            this.$message.error(err.message)
           })
         }
       })

+ 2 - 2
src/views/ncs-system-config/index.vue

@@ -358,7 +358,7 @@ export default {
               this.$message.success('保存成功!')
               this.getList()
             }).catch(err => {
-              this.$message.error(err)
+              this.$message.error(err.message)
             })
           } else {
             /** 新增 */
@@ -367,7 +367,7 @@ export default {
               this.$message.success('保存成功!')
               this.getList()
             }).catch(err => {
-              this.$message.error(err)
+              this.$message.error(err.message)
             })
           }
         } else {