licp
2024-04-22 0b1c5e6680c2986b54866b8dded31c4d9c497fdc
消息通知页面
已修改6个文件
已添加8个文件
746 ■■■■■ 文件已修改
src/components/view/a5-laboratory-management.vue 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/a6-device-management.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/b2-standard.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/b4-sample-defects.vue 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/index-index.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/view/index.vue 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/view/notice.vue 320 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/img/notice-1.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/img/notice-2.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/img/notice-3.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/img/notice-4.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/img/notice-5.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/img/notice-6.svg 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/js/menu.js 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/a5-laboratory-management.vue
@@ -34,6 +34,35 @@
        height: calc(100% - 60px - 80px - 10px - 40px);
        padding: 20px;
    }
  .el-upload {
    border: 1px dashed #d9d9d9;
    border-radius: 6px;
    cursor: pointer;
    position: relative;
    overflow: hidden;
  }
  .el-upload:hover {
    border-color: #409EFF;
  }
  .avatar-uploader-icon {
    border: 1px dashed #d9d9d9;
    font-size: 28px;
    color: #8c939d;
    width: 120px;
    height: 120px;
    line-height: 120px;
    text-align: center;
  }
  .avatar {
    width: 120px;
    height: 120px;
    display: block;
  }
  .btns{
    position: absolute;
    right: 80px;
    top: 13px;
  }
</style>
<template>
@@ -67,6 +96,52 @@
                :upUrl="$api.laboratoryScope.upParameter" :delUrl="$api.laboratoryScope.delParameter"
                :componentData="componentData" :key="upIndex" />
        </div>
    <el-dialog title="印章管理" :visible.sync="fileVisible" width="60vw">
      <div class="btns">
        <el-button size="medium" type="primary" @click="openUpload">更新印章</el-button>
      </div>
      <ValueTable ref="ValueTable0" :url="$api.laboratoryScope.selectItemParameter"
                :componentData="fileComponentData" :key="upIndex" style="height: 400px;" />
        </el-dialog>
    <el-dialog title="更新印章" :visible.sync="upFileVisible" width="400px">
            <div class="search_thing" style="margin-bottom: 16px;">
        <div class="search_label" style="width:90px">印章类型:</div>
        <div class="search_input">
          <el-cascader
          v-model="dataForm.insProductIds"
          :options="options"
          :show-all-levels="false"
          :props="props"
          placeholder="请选择" size="small"
          style="width:100%"
          collapse-tags
          clearable></el-cascader>
        </div>
      </div>
      <div class="search_thing">
        <div class="search_label" style="width:90px">印章图片:</div>
        <div class="search_input">
          <el-upload
            :action="action"
            :headers="headers"
            accept='image/jpg,image/jpeg,image/png'
            :show-file-list="false"
            :on-success="handleSuccess"
            :on-change="beforeUpload"
            ref="upload"
            :on-error="onError"
            :limit="1"
            >
            <img v-if="dataForm.pic1" :src="dataForm.pic1" >
            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
          </el-upload>
        </div>
      </div>
            <span slot="footer" class="dialog-footer">
                <el-button @click="upFileVisible = false">取 æ¶ˆ</el-button>
                <el-button type="primary" @click="confirmConnect" :loading="loading">ç¡® å®š</el-button>
            </span>
        </el-dialog>
    </div>
</template>
@@ -75,6 +150,16 @@
    export default {
        components: {
            ValueTable
        },
    computed: {
            headers() {
                return {
                    'token': sessionStorage.getItem('token')
                }
            },
            action() {
                return this.javaApi + this.$api.deviceScope.uploadFile
            }
        },
        data() {
            return {
@@ -102,26 +187,92 @@
                        font: '删除',
                        type: 'text',
                        method: 'doDiy'
                    }, {
                        id: '',
                        font: '印章管理',
                        type: 'text',
                        method: 'fileManagement'
                    }],
                    tagField: {},
                    selectField: {},
                    requiredAdd: ['laboratoryName', 'laboratoryNumber', 'head', 'phoneNumber'],
                    requiredUp: ['laboratoryName', 'laboratoryNumber', 'head', 'phoneNumber']
                },
        fileComponentData: {
                    entity: {
                        orderBy: {
                            field: 'id',
                            order: 'asc'
                        }
                    },
          isPage:false,
          init:false,
                    isIndex: true,
                    showSelect: false,
                    select: false,
                    do: [],
                    tagField: {},
                    selectField: {},
                    requiredAdd: [],
                    requiredUp: []
                },
                entityCopy: {},
                upIndex: 0,
                addDia: true,
                addPower: true
                addPower: true,
        fileVisible:true,
        upFileVisible:false,
        loading:false,
        dataForm:{},
        props: { multiple: false,emitPath:false,},
        options:[
          {
            value:0,
            label:'实验室资质',
            children:[]
          },
          {
            value:1,
            label:'额外类型',
            children:null
          },
        ]
            }
        },
        mounted() {
            this.entityCopy = this.HaveJson(this.componentData.entity)
            this.getPower()
      this.getCertificationDetail()
        },
        methods: {
            refreshTable() {
                this.$refs['ValueTable'].selectList()
            },
      getCertificationDetail(){
        this.$axios.post(this.$api.certification.getCertificationDetail, {
                    page: {
            current: -1,
            size: -1,
          },
                    entity: {
            name: null,
          }
                }, {
                    headers: {
                        'Content-Type': 'application/json'
                    }
                }).then(res => {
                    if (res.code === 201) {
                        return
                    }
          let arr = res.data.body.records.map(m=>{
            m.value = m.id;
            m.label = m.name;
            return m
          })
          this.options[0].children = arr;
        })
      },
            refresh() {
                this.componentData.entity = this.HaveJson(this.entityCopy)
                this.upIndex++
@@ -129,6 +280,43 @@
            openAdd() {
                this.$refs.ValueTable.openAddDia(this.$api.laboratoryScope.addParameter);
            },
      openUpload(){
        this.dataForm = {};
        this.upFileVisible = true;
      },
      fileManagement(row){
        this.$refs['ValueTable0'].selectList()
        this.fileVisible = true;
      },
      confirmConnect(){
        if(!this.dataForm.pic1){
          this.$message.error('未上传企业印章');
          return
        }
        if(!this.dataForm.pic2){
          this.$message.error('未上传CNAS印章');
          return
        }
        this.loading = true;
      },
      handleSuccess(response,){
        if (response.code == 200) {
          this.dataForm.pic1 = response.data
                }
      },
      beforeUpload(file,type) {
                if (file.size > 1024 * 1024 * 10) {
                    this.$message.error('上传文件不超过10M');
          this.$refs.upload.clearFiles()
                    return false;
                } else {
                    return true;
                }
            },
            onError(err, file, fileList,type) {
                this.$message.error('上传失败')
                this.$refs.upload.clearFiles()
            },
            // æƒé™åˆ†é…
            getPower(radio) {
                let power = JSON.parse(sessionStorage.getItem('power'))
src/components/view/a6-device-management.vue
@@ -615,7 +615,6 @@
              n.value = n.id;
              return n
            })
            console.log(123,children)
            this.componentData.tagField.insProductIds.select = [...this.componentData.tagField.insProductIds.select,...children]
            this.componentData.selectField.insProductIds.select = [...this.componentData.selectField.insProductIds.select,...children]
            return m
src/components/view/b2-standard.vue
@@ -110,7 +110,7 @@
                :filter-node-method="filterNode" @node-click="handleNodeClick" highlight-current @node-expand="nodeOpen"
                @node-collapse="nodeClose" v-loading="treeLoad" :expand-on-click-node="false"
                :default-expanded-keys="expandedKeys"
        style="max-height: 500px;overflow-y: scroll;scrollbar-width: none;">
        style="height:calc(100% - 30px);overflow-y: scroll;scrollbar-width: none;">
                <div class="custom-tree-node" slot-scope="{ node, data }">
                    <el-row style="width: 100%;">
                        <el-col :span="21" :class="{sort:node.level>3}">
src/components/view/b4-sample-defects.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,201 @@
<style scoped>
    .title {
        height: 60px;
        line-height: 60px;
    }
    .search {
        background-color: #fff;
        height: 80px;
        display: flex;
        align-items: center;
    }
    .search_thing {
        width: 350px;
        display: flex;
        align-items: center;
    }
    .search_label {
        width: 110px;
        font-size: 14px;
        text-align: right;
    }
    .search_input {
        width: calc(100% - 110px);
    }
    .table {
        margin-top: 10px;
        background-color: #fff;
        width: calc(100% - 40px);
        height: calc(100% - 60px - 80px - 10px - 40px);
        padding: 20px;
    }
  >>>.cell{
    display: flex;
    align-items: center;
  }
  .page {
        width: 100%;
        height: 30px;
        text-align: right;
        margin-bottom: 10px;
    }
</style>
<template>
    <div class="role_manage">
    <div>
            <el-row class="title">
                <el-col :span="12" style="padding-left: 20px;">样品缺陷指数</el-col>
            </el-row>
        </div>
        <div class="search">
            <div class="search_thing">
                <div class="search_label">检验项目:</div>
                <div class="search_input"><el-input size="small" placeholder="请输入" clearable
                        v-model="entity.laboratoryName" @keyup.enter.native="refreshTable()"></el-input></div>
            </div>
            <div class="search_thing">
                <div class="search_label">委托编号:</div>
                <div class="search_input"><el-input size="small" placeholder="请输入" clearable
                        v-model="entity.laboratoryNumber" @keyup.enter.native="refreshTable()"></el-input></div>
            </div>
            <div class="search_thing" style="padding-left: 30px;">
                <el-button size="small" @click="refresh()">重 ç½®</el-button>
                <el-button size="small" type="primary" @click="refreshTable()">查 è¯¢</el-button>
            </div>
        </div>
        <div class="table">
      <el-table
        :data="tableData"
        style="width: 100%;margin-bottom: 10px;height: calc(100% - 40px);"
        row-key="id"
        v-loading="loading"
        border
        default-expand-all
        :tree-props="{children: 'children', hasChildren: 'hasChildren'}">
        <el-table-column
          prop="date"
          label="检验项目"
          sortable
          min-width="180">
          <template slot-scope="scope">
            <p>
              <el-tag style="margin-right: 10px;height: 24px;border-radius: 10px;line-height: 24px;border: 0;" :type="scope.row.level==2?'success':''">{{ '0' + scope.row.level }}</el-tag>
              <span>{{ scope.row.date }}</span>
            </p>
          </template>
        </el-table-column>
        <el-table-column
          prop="name"
          label="委托编号"
          sortable
          min-width="180">
        </el-table-column>
        <el-table-column
          prop="address"
          label="检验人"
          min-width="180">
        </el-table-column>
        <el-table-column
          prop="address"
          label="检验时间"
          min-width="180">
        </el-table-column>
      </el-table>
      <div class="page">
        <el-pagination @size-change="sizeChange" @current-change="currentChange" :current-page="page.current"
          :page-sizes="[10, 20, 30, 50, 100]" :page-size="page.size" layout="total, sizes, prev, pager, next, jumper"
          :total="total" >
        </el-pagination>
      </div>
        </div>
    </div>
</template>
<script>
    export default {
        data() {
            return {
                entity: {},
        tableData: [{
          id: 3,
          date: '2016-05-01',
          name: '王小虎',
          address: '上海市普陀区金沙江路 1519 å¼„',
          level:1,
          children: [{
              id: 31,
              date: '2016-05-01',
              name: '王小虎',
              address: '上海市普陀区金沙江路 1519 å¼„',
              level:2,
            }, {
              id: 32,
              date: '2016-05-01',
              name: '王小虎',
              address: '上海市普陀区金沙江路 1519 å¼„',
              level:2,
          }]
        }],
        page:{
          current:1,
          size:20,
        },
        total:0,
        loading:false,
            }
        },
        mounted() {
            this.getPower()
        },
        methods: {
      refreshTable(){
        this.loading = true
      },
      refresh(){
        this.page.size = 20;
        this.page.current = 1;
        this.refreshTable();
      },
      sizeChange(val){
        this.page.size = val
        this.refreshTable()
      },
      currentChange(val){
        this.page.current = val
        this.refreshTable()
      },
            // æƒé™åˆ†é…
            getPower(radio) {
                let power = JSON.parse(sessionStorage.getItem('power'));
                let up = false
                let del = false
                let add = false
                for (var i = 0; i < power.length; i++) {
                    if (power[i].menuMethod == 'upParameter') {
                        up = true
                    }
                    if (power[i].menuMethod == 'delParameter') {
                        del = true
                    }
                    if (power[i].menuMethod == 'addParameter') {
                        add = true
                    }
                }
                if (!del) {
                    this.componentData.do.splice(1, 1)
                }
                if (!up) {
                    this.componentData.do.splice(0, 1)
                }
                this.addPower = add
            }
        }
    }
</script>
src/components/view/index-index.vue
@@ -182,6 +182,7 @@
  }
  .left-2-item{
    border-right: 1px solid #F1F1F1;
    overflow: hidden !important;
  }
  .left-2-item:nth-last-child(1){
    border-right: 0;
@@ -255,7 +256,7 @@
                        </div>
                    </div>
                </div>
        <div class="left-2 card" v-loading="workLoading">
        <div class="left-2 card" v-loading="workLoading" style="overflow: hidden;">
          <div class="left-2-item" v-for="(item,index) in workDay" :key="index">
            <div class="left-item-title">
              <span style="font-size: 18px;">{{ item }}</span>
src/view/index.vue
@@ -295,6 +295,9 @@
            </div>
            <div class="label">LIMS实验室管理系统</div>
            <div class="user">
        <el-badge is-dot style="cursor: pointer;margin-right: 10px;">
          <i class="el-icon-bell" style="font-size: 20px;" @click="openNotice"></i>
        </el-badge>
        <el-dropdown trigger="click" @command="handleCommand">
          <el-avatar :size="26">{{ userName.substring(0, 1) }}</el-avatar>
                  <span>{{ userName }}</span>
@@ -363,6 +366,7 @@
                </el-card>
            </el-col>
        </div>
    <!-- ä¿®æ”¹å¯†ç  -->
    <el-dialog
      title="修改密码"
      :visible.sync="editVisible"
@@ -389,6 +393,7 @@
        <el-button type="primary" @click="handleEdit">ç¡® å®š</el-button>
      </span>
    </el-dialog>
    <notice ref="notice" />
    </div>
</template>
@@ -405,9 +410,10 @@
    });
    import menus from '../../static/js/menu.js'
    import nullFace from '../view/404.vue'
  import notice from './notice.vue'
    comObj['nullFace'] = nullFace
    export default {
        components: comObj,
        components: {...comObj,notice},
        data() {
            return {
                userName: "value",
@@ -607,6 +613,9 @@
      handleClose(){
        this.editVisible = false
        this.query = {}
      },
      openNotice(){
        this.$refs.notice.open()
      }
        }
    };
src/view/notice.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,320 @@
<template>
<div class="notice-page">
  <el-drawer
  title="消息通知"
  :visible.sync="drawer"
  :direction="direction"
  :before-close="handleClose" style="height: 100vh;">
    <div class="head">
      <div class="head-search">
        <label>消息类型:</label>
        <el-select v-model="type" placeholder="请选择" style="width: 150px;" size="small">
        <el-option
          v-for="item in options"
          :key="item.value"
          :label="item.label"
          :value="item.value">
        </el-option>
      </el-select>
      </div>
      <el-dropdown style="margin-right: 20px;">
        <span class="el-dropdown-link">
          <span class="more">&middot;&middot;&middot;</span>
        </span>
        <el-dropdown-menu slot="dropdown">
          <el-dropdown-item>
            <i class="el-icon-check"></i>
            <span>标记所有消息为已读</span>
          </el-dropdown-item>
          <el-dropdown-item>
            <i class="el-icon-delete"></i>
            <span>删除所有已读消息</span>
          </el-dropdown-item>
        </el-dropdown-menu>
      </el-dropdown>
    </div>
    <div class="notice-content">
      <div class="notice-content-item" v-for="(m,i) in list" :key="i">
        <div class="btns">
          <el-dropdown style="margin-right: 20px;" trigger="click">
            <span class="el-dropdown-link">
              <span class="more" style="line-height: 26px;display: inline-block;">&middot;&middot;&middot;</span>
            </span>
            <el-dropdown-menu slot="dropdown">
              <el-dropdown-item>
                æ‹’绝
              </el-dropdown-item>
              <el-dropdown-item>
                æŽ¥æ”¶
              </el-dropdown-item>
              <el-dropdown-item>
                é€šè¿‡
              </el-dropdown-item>
              <el-dropdown-item>
                ä¸é€šè¿‡
              </el-dropdown-item>
              <el-dropdown-item>
                æ‰¹å‡†
              </el-dropdown-item>
              <el-dropdown-item>
                ä¸æ‰¹å‡†
              </el-dropdown-item>
              <el-dropdown-item>
                æ›´å¤š
              </el-dropdown-item>
            </el-dropdown-menu>
          </el-dropdown>
          <i class="el-icon-close" style="cursor: pointer;"></i>
        </div>
        <div class="content">
          <img :src="`../../static/img/notice-${m.type}.svg`" alt="" style="width: 50px;margin-right: 18px;">
          <div class="content-info">
            <h4 style="font-weight: normal;margin-bottom: 6px;display: flex;align-items: center;justify-content: space-between;">
              <span>{{ m.title }}</span>
              <span class="time" style="color: #999999;font-size: 14px;">{{ m.time }}</span>
            </h4>
            <p style="color: #999999;font-size: 14px;margin-bottom: 8px;" class="ellipsis-multiline">{{ m.content }}</p>
            <el-tag type="danger" v-if="m.status==0">已拒绝</el-tag>
            <el-tag type="success" v-if="m.status==1">已接收</el-tag>
            <p style="font-size: 14px;color: #999999;display: flex;align-items: center;justify-content: space-between;">
              <span>发送人:{{m.sendUser}}</span>
              <span>收件人:{{ m.getUser }}</span>
            </p>
          </div>
        </div>
        <div class="new-notice" v-if="m.isRead==0">
          <span>new</span>
        </div>
      </div>
    </div>
  </el-drawer>
</div>
</template>
<script>
export default {
  data(){
    return{
      drawer:true,
      direction:'rtl',
      options:[],
      type:'0',
      list:[
        {
          type:1,
          title:'标题',
          content:'内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容',
          time:'2019-08-07 15:34:26',
          status:1,//消息状态:拒绝、接收
          isRead:0,//是否已读
          sendUser:'小明',
          getUser:'李华',
        },
        {
          type:2,
          title:'标题',
          content:'内容',
          time:'2019-08-07 15:34:26',
          status:1,//消息状态:拒绝、接收
          isRead:1,//是否已读
          sendUser:'小明',
          getUser:'李华',
        },
        {
          type:3,
          title:'标题',
          content:'内容',
          time:'2019-08-07 15:34:26',
          status:1,//消息状态:拒绝、接收
          isRead:0,//是否已读
          sendUser:'小明',
          getUser:'李华',
        },
        {
          type:4,
          title:'标题',
          content:'内容',
          time:'2019-08-07 15:34:26',
          status:1,//消息状态:拒绝、接收
          isRead:0,//是否已读
          sendUser:'小明',
          getUser:'李华',
        },
        {
          type:5,
          title:'标题',
          content:'内容',
          time:'2019-08-07 15:34:26',
          status:1,//消息状态:拒绝、接收
          isRead:0,//是否已读
          sendUser:'小明',
          getUser:'李华',
        },
        {
          type:6,
          title:'标题',
          content:'内容',
          time:'2019-08-07 15:34:26',
          status:1,//消息状态:拒绝、接收
          isRead:1,//是否已读
          sendUser:'小明',
          getUser:'李华',
        },
        {
          type:6,
          title:'标题',
          content:'内容',
          time:'2019-08-07 15:34:26',
          status:1,//消息状态:拒绝、接收
          isRead:1,//是否已读
          sendUser:'小明',
          getUser:'李华',
        },
        {
          type:6,
          title:'标题',
          content:'内容',
          time:'2019-08-07 15:34:26',
          status:1,//消息状态:拒绝、接收
          isRead:1,//是否已读
          sendUser:'小明',
          getUser:'李华',
        },
        {
          type:6,
          title:'标题',
          content:'内容',
          time:'2019-08-07 15:34:26',
          status:1,//消息状态:拒绝、接收
          isRead:1,//是否已读
          sendUser:'小明',
          getUser:'李华',
        },
        {
          type:6,
          title:'标题',
          content:'内容',
          time:'2019-08-07 15:34:26',
          status:1,//消息状态:拒绝、接收
          isRead:1,//是否已读
          sendUser:'小明',
          getUser:'李华',
        },
      ]
    }
  },
  mounted(){
    this.getTypeDicts();
  },
  methods:{
    open(){
      this.drawer = true;
    },
    handleClose(){
      this.drawer = false;
    },
    getTypeDicts() {
      this.$axios.post(this.$api.enums.selectEnumByCategory, {
        category: "消息类型"
      }).then(res => {
        let data = res.data
        this.options = data;
      })
    },
  }
}
</script>
<style scoped>
>>>.el-drawer__header::before {
  content: "";
  display: inline-block;
  width: 4px;
  height: 30.24px;
  background: #3A7BFA;
  border-radius: 10px;
  margin-left: 32px;
  margin-right: 8.5px;
}
>>>.el-drawer__header {
  color: #303133;
}
>>>.el-drawer__body{
  box-sizing: border-box;
  padding: 0 16px;
  height: calc(100vh - 82px);
  overflow: hidden;
}
.head{
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: 16px;
}
.more{
  font-size: 20px;
  color: grey !important;
  cursor: pointer;
}
.notice-content{
  height: calc(100% - 60px);
  overflow-y: auto;
}
.notice-content-item{
  position: relative;
  width: 100%;
  padding: 16px;
  border-radius: 8px;
  box-sizing: border-box;
  border: 1px solid #EEEEEE;
  margin-bottom: 10px;
  overflow: hidden;
}
.btns{
  position: absolute;
  right: 20px;
  top: 4px;
}
.notice-content-item .btns{
  opacity: 0;
}
.time{
  opacity: 1;
}
.notice-content-item:hover{
  box-shadow: 4px 4px 8px 0px rgba(51,51,51,0.04);
}
.notice-content-item:hover .btns{
  opacity: 1;
}
.notice-content-item:hover .time{
  opacity: 0;
}
.content{
  display: flex;
  align-items: center;
}
.content-info{
  flex: 1;
}
.new-notice{
  position: absolute;
  left: 0;
  top: 0;
  width: 0;
  height: 0;
  border-top: 14px solid red;
  border-right: 14px solid transparent;
  border-bottom: 14px solid transparent;
  border-left: 14px solid red;
}
.new-notice span{
  position: absolute;
  font-size: 12px;
  top: -13px;
  left: -17px;
  color: #fff;
  transform: rotate(-45deg) scale(0.8);
}
</style>
static/img/notice-1.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1713774541141" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2168" width="24" height="24" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M533.333333 533.333333h117.333334a32 32 0 1 1 0 64h-149.333334a31.914667 31.914667 0 0 1-32-32v-192a32 32 0 1 1 64 0v160zM85.333333 0h853.333334a85.333333 85.333333 0 0 1 85.333333 85.333333v853.333334a85.333333 85.333333 0 0 1-85.333333 85.333333H85.333333a85.333333 85.333333 0 0 1-85.333333-85.333333V85.333333a85.333333 85.333333 0 0 1 85.333333-85.333333z m426.666667 810.666667a298.666667 298.666667 0 1 0 0-597.333334 298.666667 298.666667 0 0 0 0 597.333334z" fill="#F57818" p-id="2169"></path></svg>
static/img/notice-2.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1713774580175" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2343" width="24" height="24" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M85.333333 0h853.333334a85.333333 85.333333 0 0 1 85.333333 85.333333v853.333334a85.333333 85.333333 0 0 1-85.333333 85.333333H85.333333a85.333333 85.333333 0 0 1-85.333333-85.333333V85.333333a85.333333 85.333333 0 0 1 85.333333-85.333333z m426.666667 213.333333c-68.778667-0.682667-278.144 112.426667-277.333333 149.248 3.242667 296.96 225.322667 447.744 277.333333 448.085334 52.010667 0.341333 278.613333-148.565333 277.333333-448-0.256-37.418667-208.554667-148.650667-277.333333-149.333334z m164.394667 196.010667c12.032 12.458667 12.032 32.981333-0.725334 44.672l-155.264 160.426667a30.506667 30.506667 0 0 1-22.656 9.557333 32.085333 32.085333 0 0 1-23.381333-9.514667l-91.477333-93.781333c-12.757333-13.226667-12.757333-33.706667 0-46.890667 12.8-13.226667 33.322667-13.226667 46.08 0l70.186666 72.533334 132.565334-137.002667a31.36 31.36 0 0 1 44.672 0z" fill="#15B4D4" p-id="2344"></path></svg>
static/img/notice-3.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1713774491978" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1483" width="24" height="24" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M554.666667 554.666667v-92.586667a128.042667 128.042667 0 1 0-85.333334 0V554.666667H267.946667a42.666667 42.666667 0 0 0-41.386667 53.034666l21.333333 85.333334a42.666667 42.666667 0 0 0 41.386667 32.298666h445.44a42.666667 42.666667 0 0 0 41.386667-32.298666l21.333333-85.333334A42.666667 42.666667 0 0 0 756.053333 554.666667H554.666667zM85.333333 0h853.333334a85.333333 85.333333 0 0 1 85.333333 85.333333v853.333334a85.333333 85.333333 0 0 1-85.333333 85.333333H85.333333a85.333333 85.333333 0 0 1-85.333333-85.333333V85.333333a85.333333 85.333333 0 0 1 85.333333-85.333333z m234.666667 768a21.333333 21.333333 0 1 0 0 42.666667h384a21.333333 21.333333 0 1 0 0-42.666667h-384z" fill="#FAAB0C" p-id="1484"></path></svg>
static/img/notice-4.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1713774535390" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1993" width="24" height="24" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M85.333333 0h853.333334a85.333333 85.333333 0 0 1 85.333333 85.333333v853.333334a85.333333 85.333333 0 0 1-85.333333 85.333333H85.333333a85.333333 85.333333 0 0 1-85.333333-85.333333V85.333333a85.333333 85.333333 0 0 1 85.333333-85.333333z m426.666667 810.666667a298.666667 298.666667 0 1 0 0-597.333334 298.666667 298.666667 0 0 0 0 597.333334z m-170.666667-256a42.666667 42.666667 0 1 1 0-85.333334 42.666667 42.666667 0 0 1 0 85.333334z m170.666667 0a42.666667 42.666667 0 1 1 0-85.333334 42.666667 42.666667 0 0 1 0 85.333334z m170.666667 0a42.666667 42.666667 0 1 1 0-85.333334 42.666667 42.666667 0 0 1 0 85.333334z" fill="#B162D9" p-id="1994"></path></svg>
static/img/notice-5.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1713774524927" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="1786" width="24" height="24" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M85.333333 0h853.333334a85.333333 85.333333 0 0 1 85.333333 85.333333v853.333334a85.333333 85.333333 0 0 1-85.333333 85.333333H85.333333a85.333333 85.333333 0 0 1-85.333333-85.333333V85.333333a85.333333 85.333333 0 0 1 85.333333-85.333333z m496.426667 257.792c-31.317333-59.306667-108.202667-59.306667-139.52 0L224.469333 672.853333C193.152 733.738667 231.594667 810.666667 294.229333 810.666667h435.541334c62.634667 0 101.12-76.928 69.76-137.813334l-217.770667-415.061333zM512 725.333333a42.666667 42.666667 0 1 1 0-85.333333 42.666667 42.666667 0 0 1 0 85.333333z m-0.938667-341.333333a40.874667 40.874667 0 0 1 40.746667 44.16l-11.562667 143.530667c-1.194667 14.506667-13.269333 25.642667-27.818666 25.642666a28.245333 28.245333 0 0 1-28.074667-25.6l-13.44-143.616A40.362667 40.362667 0 0 1 511.061333 384z" fill="#EA493D" p-id="1787"></path></svg>
static/img/notice-6.svg
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1 @@
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1713774611710" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="3358" width="24" height="24" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M85.333333 0h853.333334a85.333333 85.333333 0 0 1 85.333333 85.333333v853.333334a85.333333 85.333333 0 0 1-85.333333 85.333333H85.333333a85.333333 85.333333 0 0 1-85.333333-85.333333V85.333333a85.333333 85.333333 0 0 1 85.333333-85.333333z m227.541334 213.333333C257.92 213.333333 213.333333 249.002667 213.333333 292.992v438.016C213.333333 774.997333 257.92 810.666667 312.874667 810.666667h398.250666C766.08 810.666667 810.666667 774.997333 810.666667 731.008V292.992C810.666667 249.002667 766.08 213.333333 711.125333 213.333333H312.874667z m149.333333 85.333334a64 64 0 1 1 0 128 64 64 0 0 1 0-128z m-128 220.842666h355.584c19.626667 0 35.541333 14.336 35.541333 32 0 17.706667-15.914667 32-35.541333 32H334.208c-19.626667 0-35.541333-14.293333-35.541333-32 0-17.664 15.914667-32 35.541333-32z m0 130.56H512c19.626667 0 35.541333 14.293333 35.541333 32 0 17.664-15.914667 32-35.541333 32H334.208c-19.626667 0-35.541333-14.336-35.541333-32 0-17.706667 15.914667-32 35.541333-32z" fill="#F57818" p-id="3359"></path></svg>
static/js/menu.js
@@ -111,16 +111,16 @@
            v: "每日业务统计",
            i: "font icon-erjidaohang",
            u: "b4-daily-business-statistics",
            p: ""
            p: "businessStatisticsByDay"
        }, {
            v: "检测项目统计",
            i: "font icon-erjidaohang",
            u: "b4-inspection-item-statistics",
            p: ""
            p: "testProductByDay"
        }, {
            v: "样品缺陷指数",
            i: "font icon-erjidaohang",
            u: "",
            u: "b4-sample-defects",
            p: ""
        }, {
            v: "耗材统计",
@@ -234,7 +234,7 @@
            i: "font icon-erjidaohang",
            u: "a5-laboratory-qualifications",
            g: "C能力范围和资质",
            p: ""
            p: "getCertificationDetail"
        }, {
            v: "能力范围",
            i: "font icon-erjidaohang",
@@ -281,13 +281,13 @@
            i: "font icon-erjidaohang",
            u: "a6-personnel-overview",
            g: "6.2 äººå‘˜",
            p: ""
            p: "selectUserList"
        }, {
            v: "人员明细",
            i: "font icon-erjidaohang",
            u: "a6-personnel-detail",
            g: "6.2 äººå‘˜",
            p: ""
            p: "selectUserList"
        }, {
            v: "人员培训",
            i: "font icon-erjidaohang",