李林
2024-02-26 8d817b3847f9a96850c1a28f7923940697df7235
框架搭建
已修改16个文件
已重命名1个文件
已添加1个文件
1419 ■■■■ 文件已修改
index.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/App.vue 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/assets/api/controller.js 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/tool/value-table.vue 90 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/data-comparison.vue 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/data-reporting.vue 121 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/enums.vue 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/fans-submit.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/finance-submit.vue 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/index-index.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/person-manage.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/product-count.vue 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/registrant-count.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/view/role-manage.vue 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/view/404.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/view/enter.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/view/index.vue 264 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
static/js/menu.js 743 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
index.html
@@ -6,7 +6,7 @@
    <meta http-equiv="Expires" CONTENT="0">
    <meta http-equiv="Cache-Control" CONTENT="no-cache">
    <meta http-equiv="Pragma" CONTENT="no-cache">
    <title>胜云数据管理平台</title>
    <title>LIMS实验室管理系统</title>
    <link rel="icon" type="image/x-icon" href="./static/img/logo.png">
  </head>
  <body>
src/App.vue
@@ -1,6 +1,6 @@
<template>
    <div id="app">
        <router-view />
    <div id="app" style="overflow: hidden;">
        <router-view/>
    </div>
</template>
@@ -135,7 +135,7 @@
        color: #333;
    }
    .has-gutter .el-table__cell .cell {
    .el-table__header .has-gutter .el-table__cell .cell {
        font-size: 14px !important;
        font-weight: 500;
    }
src/assets/api/controller.js
@@ -23,6 +23,7 @@
    selectMenuList: "/role/selectMenuList", //获取菜单
    selectPowerByRoleId: "/role/selectPowerByRoleId", //通过角色id查询权限列表
    upRole: "/role/upRole", //修改角色
    getUserMenu: "/user/getUserMenu", //获取用户枚举
}
const dataReporting = {
@@ -40,11 +41,14 @@
    downFinanceSubmitFile: "/dataReporting/downFinanceSubmitFile", //导出财务上报
    inputFinanceSubmitCsv: "/dataReporting/inputFinanceSubmitCsv", //导入财务上报
    selectDataComparisonDtoPageList: "/dataReporting/selectDataComparisonDtoPageList", //获取数据对比列表
    deleteAllData: "/dataReporting/deleteAllData", //一键删除所有的数据上报
    selectDataReportingForCreateUserNames: "/dataReporting/selectDataReportingForCreateUserNames", //获取数据上报的登记人筛选项
    selectFansSubmitList: "/dataReporting/selectFansSubmitList", //获取进粉上报列表
    delFansSubmit: "/dataReporting/delFansSubmit", //删除进粉上报信息
    updateFansSubmit: "/dataReporting/updateFansSubmit", //修改进粉上报信息
    addFansSubmit: "/dataReporting/addFansSubmit", //添加进粉上报信息
    selectVxs: "/dataReporting/selectVxs", //获取进粉中的微信号列表
    selectFinanceSubmitList: "/dataReporting/selectFinanceSubmitList", //获取财务上报列表
    delFinanceSubmit: "/dataReporting/delFinanceSubmit", //删除财务上报信息
@@ -57,15 +61,8 @@
}
const enums = {
    selectCustomEnumLists: "/enum/selectCustomEnumLists", //获取客户列表
    selectCustomEnumList: "/enum/selectCustomEnumList", //获取客户枚举
    delCustomEnum: "/enum/delCustomEnum", //删除客户信息
    updateCustomEnum: "/enum/updateCustomEnum", //修改客户信息
    addCustomEnum: "/enum/addCustomEnum", //添加客户信息
    selectProductEnumLists: "/enum/selectProductEnumLists", //获取项目列表
    selectProductEnumList: "/enum/selectProductEnumList", //获取项目枚举
    delProductEnum: "/enum/delProductEnum", //删除项目信息
    updateProductEnum: "/enum/updateProductEnum", //修改项目信息
    addProductEnum: "/enum/addProductEnum", //添加项目信息
    selectEnumList: "/enum/selectEnumList", //获取枚举列表
    addEnum: "/enum/addEnum", //添加枚举
    upEnum: "/enum/upEnum", //修改枚举
    delEnum: "/enum/delEnum", //删除枚举
}
src/components/tool/value-table.vue
@@ -35,7 +35,7 @@
    .value-table .el-upload {
        width: 100%;
    }
    .value-table .el-upload-dragger {
        width: 100%;
    }
@@ -46,8 +46,8 @@
        <div class="table">
            <el-table ref="eltable" :data="tableData" style="width: 100%;" height="100%" tooltip-effect="dark" border
                @selection-change="selectChange" @select="select" v-loading="loading" @sort-change="sortChange"
                @row-click="rowClick">
                <el-table-column type="selection" width="50" v-if="data.showSelect">
                @row-click="rowClick" :show-summary="data.countFleid!=undefined && data.countFleid.length > 0" :summary-method="getSummaries">
                <el-table-column type="selection" width="65" v-if="data.showSelect">
                </el-table-column>
                <el-table-column align="center" type="index" label="序号" width="70" v-if="data.isIndex">
                </el-table-column>
@@ -99,9 +99,10 @@
            </span>
        </el-dialog>
        <el-dialog title="新增" :visible.sync="addDia" width="500px">
            <div class="body" v-if="addDia" style="max-height: 600px;overflow-y: auto;padding: 5px 0;">
            <div class="body" v-if="addDia" style="max-height: 550px;overflow-y: auto;padding: 5px 0;">
                <el-row v-for="(a, ai) in upHead" :key="ai" style="line-height: 50px;">
                    <el-col :span="6" style="text-align: right;"><span class="required-span" v-if="showAddReq(a.label)">* </span>{{a.value}}:</el-col>
                    <el-col :span="6" style="text-align: right;"><span class="required-span" v-if="showAddReq(a.label)">*
                        </span>{{a.value}}:</el-col>
                    <el-col :span="16" :offset="1">
                        <el-input v-model="upData[a.label]" size="small" clearable :placeholder="`请输入${a.value}`"
                            v-if="showType(a.label, data.selectField) == null"></el-input>
@@ -130,9 +131,9 @@
        </el-dialog>
        <el-dialog title="数据导入" :visible.sync="uploadDia" width="500px">
            <div style="margin: 0 auto;">
                <el-upload ref="upload" drag :action="javaApi + inputUrl" :headers="token"
                    :file-list="fileList" name="file" :auto-upload="false" accept=".csv" :limit="1" :on-change="beforeUpload"
                    :on-success="onSuccess" :on-error="onError">
                <el-upload ref="upload" drag :action="javaApi + inputUrl" :headers="token" :file-list="fileList" name="file"
                    :auto-upload="false" accept=".csv" :limit="1" :on-change="beforeUpload" :on-success="onSuccess"
                    :on-error="onError" :data="{param: data.uploadStr}">
                    <i class="el-icon-upload"></i>
                    <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
                </el-upload>
@@ -228,7 +229,8 @@
                        font: '删除',
                        type: 'text'
                    }],
                    type: []
                    type: [],
                    uploadStr: ""
                },
                tableHead: [],
                tableData: [],
@@ -343,23 +345,23 @@
                var str = ob[val]
                return str == undefined ? null : ob[val].select
            },
            showAddReq(label){
                if(this.data.requiredAdd==undefined){
            showAddReq(label) {
                if (this.data.requiredAdd == undefined) {
                    return
                }
                for (var i = 0; i < this.data.requiredAdd.length; i++) {
                    if(label == this.data.requiredAdd[i]){
                    if (label == this.data.requiredAdd[i]) {
                        return true
                    }
                }
                return false
            },
            showUpReq(label){
                if(this.data.requiredUp==undefined){
            showUpReq(label) {
                if (this.data.requiredUp == undefined) {
                    return
                }
                for (var i = 0; i < this.data.requiredUp.length; i++) {
                    if(label == this.data.requiredUp[i]){
                    if (label == this.data.requiredUp[i]) {
                        return true
                    }
                }
@@ -429,11 +431,11 @@
                    return
                }
                for (var i = 0; i < this.data.requiredUp.length; i++) {
                    if(this.upData[this.data.requiredUp[i]]==null||this.upData[this.data.requiredUp[i]]==''){
                        var list = this.upHead.filter(a=>{
                            if(a.label == this.data.requiredUp[i]) return a
                    if (this.upData[this.data.requiredUp[i]] == null || this.upData[this.data.requiredUp[i]] == '') {
                        var list = this.upHead.filter(a => {
                            if (a.label == this.data.requiredUp[i]) return a
                        })
                        if(list[0].value == undefined) continue
                        if (list[0].value == undefined) continue
                        this.$message.error(list[0].value + '是必填项')
                        return
                    }
@@ -500,11 +502,11 @@
                    return
                }
                for (var i = 0; i < this.data.requiredAdd.length; i++) {
                    if(this.upData[this.data.requiredAdd[i]]==null||this.upData[this.data.requiredAdd[i]]==''){
                        var list = this.upHead.filter(a=>{
                            if(a.label == this.data.requiredAdd[i]) return a
                    if (this.upData[this.data.requiredAdd[i]] == null || this.upData[this.data.requiredAdd[i]] == '') {
                        var list = this.upHead.filter(a => {
                            if (a.label == this.data.requiredAdd[i]) return a
                        })
                        if(list[0].value == undefined) continue
                        if (list[0].value == undefined) continue
                        this.$message.error(list[0].value + '是必填项')
                        return
                    }
@@ -596,7 +598,7 @@
                this.$refs.upload.clearFiles()
                this.uploadDia = false
                this.uploading = false
                if(response.code==201){
                if (response.code == 201) {
                    this.$message.error(response.message)
                    return
                }
@@ -608,16 +610,50 @@
                this.$refs.upload.clearFiles()
                this.uploading = false
            },
            isDisabled(label){
                if(this.data.disabledUp==undefined){
            isDisabled(label) {
                if (this.data.disabledUp == undefined) {
                    return
                }
                for (var i = 0; i < this.data.disabledUp.length; i++) {
                    if(label == this.data.disabledUp[i]){
                    if (label == this.data.disabledUp[i]) {
                        return true
                    }
                }
                return false
            },
            getSummaries(param) {
                const {
                    columns,
                    data
                } = param;
                const sums = [];
                columns.forEach((column, index) => {
                    if (index === 0) {
                        sums[index] = '合计';
                        return;
                    }
                    const values = data.map(item => Number(item[column.property]));
                    if(this.data.countFleid==undefined){
                        sums[index] = ''
                        return
                    }
                    if (this.data.countFleid.filter(str=>{
                        return str === column.property
                    }).length > 0) {
                        sums[index] = values.reduce((prev, curr) => {
                            const value = Number(curr);
                            if (!isNaN(value)) {
                                return prev + curr;
                            } else {
                                return prev;
                            }
                        }, 0);
                        sums[index] += '';
                    } else {
                        sums[index] = '';
                    }
                });
                return sums;
            }
        }
    }
src/components/view/data-comparison.vue
@@ -58,7 +58,7 @@
                <div class="search_label">登记日期:</div>
                <div class="search_input">
                    <el-date-picker size="small" v-model="componentData.entity.createTime" type="date" placeholder="选择日期"
                        value-format="yyyy-MM-dd" clearable></el-date-picker>
                        value-format="yyyy-MM-dd" :clearable="false" :editable="false"></el-date-picker>
                </div>
            </div>
            <div class="search_thing" style="padding-left: 30px;">
@@ -118,42 +118,29 @@
                mm = "0" + mm;
            }
            this.componentData.entity.createTime = `${yyyy}-${mm}-${dd} 00:00:00`
            this.componentData.entity.name = localStorage.getItem('data_com_name')==undefined?null:localStorage.getItem('data_com_name')
        },
        mounted() {
            this.entityCopy = this.HaveJson(this.componentData.entity)
            // this.selectDataComparisonDtoPageList()
        },
        methods: {
            refreshTable() {
                if (this.componentData.entity.name == null || this.componentData.entity.name == '') {
                    this.$message.error('账户名称是必填项')
                    this.$message.error('主账户名称是必填项')
                } else if (this.componentData.entity.comparisonName == null || this.componentData.entity.comparisonName == '') {
                    this.$message.error('对比的账户名称是必填项')
                    this.$message.error('子账户名称是必填项')
                } else if (this.componentData.entity.createTime == null) {
                    this.$message.error('登记时间是必填项')
                } else if (this.componentData.entity.name === this.componentData.entity.comparisonName) {
                    this.$message.error('对比的账户不能重复')
                } else {
                    localStorage.setItem('data_com_name', this.componentData.entity.name)
                    this.$refs['ValueTable'].selectList()
                }
            },
            refresh() {
                this.componentData.entity = this.HaveJson(this.entityCopy)
                this.upIndex++
            },
            selectDataComparisonDtoPageList() {
                this.$axios.post(this.$api.dataReporting.selectDataComparisonDtoPageList, {
                    headers: {
                        'Content-Type': 'application/json'
                    }
                }).then(res => {
                    res.data.forEach(a => {
                        a.isClick = false
                        a.look = false
                    })
                    this.menu = res.data
                    this.menuCopy = this.HaveJson(res.data)
                })
            }
        }
    }
src/components/view/data-reporting.vue
@@ -34,6 +34,9 @@
        height: calc(100% - 60px - 80px - 10px - 40px);
        padding: 20px;
    }
    .el-radio-group{
        width: 100%;
    }
</style>
<style>
    .data_reporting .data_reporting_dia .el-dialog__body {
@@ -55,7 +58,7 @@
            <el-row class="title">
                <el-col :span="12" style="padding-left: 20px;">数据上报</el-col>
                <el-col :span="12" style="text-align: right;padding-right: 8px;">
                    <el-button size="medium" @click="openUpload()" v-if="inPower">
                    <el-button size="medium" @click="chooseDia = true" v-if="inPower">
                        <i class="el-icon-upload2" style="color: #3A7BFA;"></i>
                        <span style="color: #3A7BFA;">导入</span>
                    </el-button>
@@ -64,6 +67,7 @@
                        <span style="color: #3A7BFA;">导出</span>
                    </el-button>
                    <el-button size="medium" type="primary" @click="opeaAdd" v-if="addPower">新增</el-button>
                    <el-button size="medium" type="danger" @click="delNowAll" v-if="delAllPower">一键删除</el-button>
                </el-col>
            </el-row>
        </div>
@@ -72,14 +76,16 @@
                <div class="search_label">系统日期:</div>
                <div class="search_input">
                    <el-date-picker size="small" v-model="componentData.entity.createTime" type="date" placeholder="选择日期"
                        value-format="yyyy-MM-dd HH:mm:ss" clearable></el-date-picker>
                        value-format="yyyy-MM-dd HH:mm:ss" :clearable="false" :editable="false" @change="refreshTable"></el-date-picker>
                </div>
            </div>
            <div class="search_thing">
                <div class="search_label">登记人:</div>
                <div class="search_input">
                    <el-input size="small" v-model="componentData.entity.registrant" clearable placeholder="登记人"
                        @keyup.enter.native="refreshTable()"></el-input>
                    <el-select size="small" style="width: 100%;" placeholder="登记人" v-model="componentData.entity.registrant">
                        <el-option :value="null" label="全部"></el-option>
                        <el-option v-for="(a, ai) in userNames" :key="ai" :label="a" :value="a"></el-option>
                    </el-select>
                </div>
            </div>
            <div class="search_thing">
@@ -101,7 +107,7 @@
                :delUrl="$api.dataReporting.delDataReporting" :componentData="componentData" :key="upIndex" @upRole="upRole" :downUrl="$api.dataReporting.downDataReportingFile"/>
        </div>
        <el-dialog title="上报修改" :visible.sync="upDia" width="700px" class="data_reporting_dia">
            <div class="body" v-if="upDia">
            <div class="body" v-if="upDia" style="max-height: 550px;overflow-y: auto;">
                <el-row style="line-height: 50px;">
                    <el-col :span="4" style="text-align: right;padding-right: 8px;">系统日期</el-col>
                    <el-col :span="7">
@@ -212,6 +218,12 @@
                        <el-input v-model="upData.remark" size="small"></el-input>
                    </el-col>
                </el-row>
                <el-row style="line-height: 50px;">
                    <el-col :span="4" style="text-align: right;padding-right: 8px;">微信号</el-col>
                    <el-col :span="7">
                        <el-input v-model="upData.vxCard" size="small"></el-input>
                    </el-col>
                </el-row>
            </div>
            <span slot="footer" class="dialog-footer" style="margin-right: 18px;">
                <el-button type="primary" @click="saveUpData" :loading="upLoad">ç¡® å®š</el-button>
@@ -222,7 +234,7 @@
            <div style="margin: 0 auto;">
                <el-upload ref="upload" drag :action="javaApi + $api.dataReporting.inputCsv" :headers="token"
                    :file-list="fileList" name="file" :auto-upload="false" accept=".csv" :limit="1" :on-change="beforeUpload"
                    :on-success="onSuccess" :on-error="onError">
                    :on-success="onSuccess" :on-error="onError" :data="{param: componentData.uploadStr}">
                    <i class="el-icon-upload"></i>
                    <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
                </el-upload>
@@ -230,6 +242,19 @@
            <span slot="footer" class="dialog-footer">
                <el-button @click="uploadDia = false">取 æ¶ˆ</el-button>
                <el-button type="primary" @click="submitUpload()">上 ä¼ </el-button>
            </span>
        </el-dialog>
        <el-dialog title="请选择数据上报的微信号" :visible.sync="chooseDia" width="500px">
            <div class="body" v-if="chooseDia" style="max-height: 550px;overflow-y: auto;padding: 5px 0;">
                <el-radio-group v-model="vx">
                    <el-col :span="8" v-for="(a, ai) in vxs" :key="ai" style="margin-bottom: 5px;">
                        <el-radio border size="small" :label="a.vx">{{a.vx}}</el-radio>
                    </el-col>
                </el-radio-group>
            </div>
            <span slot="footer" class="dialog-footer">
                <el-button @click="chooseDia = false">取消</el-button>
                <el-button type="primary" @click="openUpload()">下一步</el-button>
            </span>
        </el-dialog>
    </div>
@@ -250,11 +275,11 @@
                        product: null,
                        orderBy: {
                            field: 'id',
                            order: 'desc'
                            order: 'asc'
                        }
                    },
                    isIndex: true,
                    showSelect: true,
                    showSelect: false,
                    select: true,
                    do: [{
                        id: 'update',
@@ -271,8 +296,14 @@
                        method: 'doDiy'
                    }],
                    tagField: {},
                    selectField: {},
                    requiredAdd:['name2','agent','channel','product','showNum','click','accountConsumption'],
                    selectField: {
                        vxCard: {
                            select: []
                        }
                    },
                    requiredAdd:['name2','agent','channel','product','showNum','click','accountConsumption','vxCard'],
                    countFleid: ['fansAdd'],
                    uploadStr: ""
                },
                entityCopy: {},
                upIndex: 0,
@@ -287,7 +318,12 @@
                addPower: true,
                token: null,
                inPower: true,
                outPower: true
                outPower: true,
                delAllPower: true,
                userNames: [],
                vxs: [],
                chooseDia: false,
                vx: null
            }
        },
        created() {
@@ -312,14 +348,19 @@
            this.token = {
                'token': sessionStorage.getItem('token')
            }
            this.selectDataReportingForCreateUserNames()
            this.selectVxs()
        },
        methods: {
            refreshTable() {
                this.$refs['ValueTable'].selectList()
                this.selectDataReportingForCreateUserNames()
                this.selectVxs()
            },
            refresh() {
                this.componentData.entity = this.HaveJson(this.entityCopy)
                this.upIndex++
                this.selectDataReportingForCreateUserNames()
            },
            upRole(row) {
                this.upData = this.HaveJson(row)
@@ -358,6 +399,7 @@
                let add = false
                let inPower = false
                let outPower = false
                let delAllPower = false
                for (var i = 0; i < power.length; i++) {
                    if (power[i].menuMethod == 'upDataReporting') {
                        up = true
@@ -374,6 +416,9 @@
                    if (power[i].menuMethod == 'downDataReportingFile') {
                        outPower = true
                    }
                    if (power[i].menuMethod == 'deleteAllData') {
                        delAllPower = true
                    }
                }
                if (!del) {
                    this.componentData.do.splice(1, 1)
@@ -384,8 +429,14 @@
                this.addPower = add
                this.inPower = inPower
                this.outPower = outPower
                this.delAllPower = delAllPower
            },
            openUpload() {
                if(this.vx == null || this.vx == undefined) {
                    this.$message.error('请选择数据上报的微信号')
                    return
                }
                this.componentData.uploadStr = this.vx
                this.uploadDia = true
            },
            beforeUpload(file, fileList) {
@@ -402,11 +453,13 @@
                }
                this.uploading = true
                this.$refs.upload.submit();
                this.uploadDia = false
            },
            onSuccess(response, file, fileList) {
                this.$refs.upload.clearFiles()
                this.uploadDia = false
                this.uploading = false
                this.chooseDia = false
                if(response.code==201){
                    this.$message.error(response.message)
                    return
@@ -421,6 +474,52 @@
            },
            opeaAdd() {
                this.$refs.ValueTable.openAddDia(this.$api.dataReporting.addDataReporting);
            },
            delNowAll(){
                this.$confirm('是否删除 '+this.componentData.entity.createTime.split(' ')[0]+' æ•°æ®æ—¶é—´çš„全部数据?', "警告", {
                    confirmButtonText: "确定",
                    cancelButtonText: "取消",
                    type: "error"
                }).then(() => {
                    this.uploading = true
                    this.$axios.post(this.$api.dataReporting.deleteAllData, {
                        date: this.componentData.entity.createTime.split(' ')[0]
                    }).then(res => {
                        this.uploading = false
                        if (res.code === 201) {
                            return
                        }
                        this.$message.success('删除成功')
                        this.refreshTable()
                    })
                }).catch(() => {})
            },
            selectDataReportingForCreateUserNames(){
                this.$axios.post(this.$api.dataReporting.selectDataReportingForCreateUserNames,{
                    time: this.componentData.entity.createTime
                }).then(res => {
                    this.userNames = res.data
                })
            },
            selectVxs(){
                this.$axios.get(this.$api.dataReporting.selectVxs,{
                    params:{
                        time: this.componentData.entity.createTime
                    }
                }).then(res => {
                    if (res.code === 201) {
                        return
                    }
                    this.vxs = res.data
                    var str = []
                    res.data.forEach(a => {
                        str.push({
                            label: a.vx,
                            value: a.vx
                        })
                    })
                    this.componentData.selectField.vxCard.select = str
                })
            }
        }
    }
src/components/view/enums.vue
ÎļþÃû´Ó src/components/view/custom-enum.vue ÐÞ¸Ä
@@ -40,7 +40,7 @@
    <div class="role_manage">
        <div>
            <el-row class="title">
                <el-col :span="12" style="padding-left: 20px;">客户管理</el-col>
                <el-col :span="12" style="padding-left: 20px;">枚举管理</el-col>
                <el-col :span="12" style="text-align: right;">
                    <el-button size="medium" type="primary" @click="openAdd" v-if="addPower">新增</el-button>
                </el-col>
@@ -48,14 +48,14 @@
        </div>
        <div class="search">
            <div class="search_thing">
                <div class="search_label">客户名称:</div>
                <div class="search_label">标题:</div>
                <div class="search_input"><el-input size="small" placeholder="请输入" clearable
                        v-model="componentData.entity.name" @keyup.enter.native="refreshTable()"></el-input></div>
                        v-model="componentData.entity.label" @keyup.enter.native="refreshTable()"></el-input></div>
            </div>
            <div class="search_thing">
                <div class="search_label">公司名称:</div>
                <div class="search_label">分类:</div>
                <div class="search_input"><el-input size="small" placeholder="请输入" clearable
                        v-model="componentData.entity.company" @keyup.enter.native="refreshTable()"></el-input></div>
                        v-model="componentData.entity.category" @keyup.enter.native="refreshTable()"></el-input></div>
            </div>
            <div class="search_thing" style="padding-left: 30px;">
                <el-button size="small" @click="refresh()">重 ç½®</el-button>
@@ -63,7 +63,7 @@
            </div>
        </div>
        <div class="table">
            <ValueTable ref="ValueTable" :url="$api.enums.selectCustomEnumLists" :upUrl="$api.enums.updateCustomEnum" :delUrl="$api.enums.delCustomEnum" :componentData="componentData" :key="upIndex"/>
            <ValueTable ref="ValueTable" :url="$api.enums.selectEnumList" :upUrl="$api.enums.upEnum" :delUrl="$api.enums.delEnum" :componentData="componentData" :key="upIndex"/>
        </div>
    </div>
</template>
@@ -78,22 +78,22 @@
            return {
                componentData: {
                    entity: {
                        name: null,
                        company: null,
                        label: null,
                        category: null,
                        orderBy: {
                            field: 'id',
                            order: 'asc'
                        }
                    },
                    isIndex: true,
                    showSelect: true,
                    select: true,
                    showSelect: false,
                    select: false,
                    do: [{
                        id: 'update',
                        font: '编辑',
                        type: 'text',
                        method: 'doDiy',
                        field:[]
                        field:['createUserName','updateUserName']
                    },{
                        id: 'delete',
                        font: '删除',
@@ -102,8 +102,8 @@
                    }],
                    tagField: {},
                    selectField: {},
                    requiredAdd:['company','name'],
                    requiredUp:['company','name']
                    requiredAdd:['category','label','value'],
                    requiredUp:['category','label','value']
                },
                entityCopy: {},
                upIndex: 0,
@@ -124,7 +124,7 @@
                this.upIndex++
            },
            openAdd(){
                this.$refs.ValueTable.openAddDia(this.$api.enums.addCustomEnum);
                this.$refs.ValueTable.openAddDia(this.$api.enums.addEnum);
            },
            // æƒé™åˆ†é…
            getPower(){
@@ -133,13 +133,13 @@
                let del = false
                let add = false
                for (var i = 0; i < power.length; i++) {
                    if(power[i].menuMethod=='updateCustomEnum'){
                    if(power[i].menuMethod=='upEnum'){
                        up = true
                    }
                    if(power[i].menuMethod=='delCustomEnum'){
                    if(power[i].menuMethod=='delEnum'){
                        del = true
                    }
                    if(power[i].menuMethod=='addCustomEnum'){
                    if(power[i].menuMethod=='addEnum'){
                        add = true
                    }
                }
src/components/view/fans-submit.vue
@@ -59,7 +59,7 @@
                <div class="search_label">系统日期:</div>
                <div class="search_input">
                    <el-date-picker size="small" v-model="componentData.entity.createTime" type="date" placeholder="选择日期"
                        value-format="yyyy-MM-dd HH:mm:ss" clearable></el-date-picker>
                        value-format="yyyy-MM-dd HH:mm:ss" :clearable="false" :editable="false" @change="refreshTable()"></el-date-picker>
                </div>
            </div>
            <div class="search_thing">
@@ -143,9 +143,9 @@
                            select: []
                        }
                    },
                    requiredAdd: ['custom', 'product', 'fansAdd'],
                    requiredUp: ['custom', 'product', 'fansAdd'],
                    disabledUp: ['custom','product']
                    requiredAdd: ['product', 'fansAdd', 'vx'],
                    requiredUp: ['product', 'fansAdd', 'vx'],
                    disabledUp: ['product', 'vx']
                },
                entityCopy: {},
                upIndex: 0,
src/components/view/finance-submit.vue
@@ -34,6 +34,9 @@
        height: calc(100% - 60px - 80px - 10px - 40px);
        padding: 20px;
    }
    .el-radio-group{
        width: 100%;
    }
</style>
<template>
@@ -42,7 +45,7 @@
            <el-row class="title">
                <el-col :span="12" style="padding-left: 20px;">财务上报</el-col>
                <el-col :span="12" style="text-align: right;">
                    <el-button size="medium" @click="$refs.ValueTable.openUpload()" v-if="inPower">
                    <el-button size="medium" @click="chooseDia = true" v-if="inPower">
                        <i class="el-icon-upload2" style="color: #3A7BFA;"></i>
                        <span style="color: #3A7BFA;">导入</span>
                    </el-button>
@@ -59,7 +62,7 @@
                <div class="search_label">系统日期:</div>
                <div class="search_input">
                    <el-date-picker size="small" v-model="componentData.entity.createTime" type="date" placeholder="选择日期"
                        value-format="yyyy-MM-dd HH:mm:ss" clearable></el-date-picker>
                        value-format="yyyy-MM-dd HH:mm:ss" :clearable="false" :editable="false" @change="refreshTable()"></el-date-picker>
                </div>
            </div>
            <div class="search_thing">
@@ -79,6 +82,19 @@
                :upUrl="$api.dataReporting.updateFinanceSubmit" :delUrl="$api.dataReporting.delFinanceSubmit"
                :componentData="componentData" :key="upIndex" :downUrl="$api.dataReporting.downFinanceSubmitFile" :inputUrl="$api.dataReporting.inputFinanceSubmitCsv"/>
        </div>
        <el-dialog title="请选择财务上报的对象" :visible.sync="chooseDia" width="500px">
            <div class="body" v-if="chooseDia" style="max-height: 550px;overflow-y: auto;padding: 5px 0;">
                <el-radio-group v-model="userId">
                    <el-col :span="8" v-for="(a, ai) in users" :key="ai" style="margin-bottom: 2px;">
                        <el-radio border size="small" :label="a.id">{{a.name}}</el-radio>
                    </el-col>
                </el-radio-group>
            </div>
            <span slot="footer" class="dialog-footer">
                <el-button @click="chooseDia = false">取消</el-button>
                <el-button type="primary" @click="goDown">下一步</el-button>
            </span>
        </el-dialog>
    </div>
</template>
@@ -107,7 +123,7 @@
                        font: '编辑',
                        type: 'text',
                        method: 'doDiy',
                        field: ['createUserName']
                        field: ['createUserName','对象=param']
                    }, {
                        id: 'delete',
                        font: '删除',
@@ -121,10 +137,15 @@
                        },
                        custom: {
                            select: []
                        },
                        param:{
                            select:[]
                        }
                    },
                    requiredAdd: ['company', 'name', 'employeeRebate'],
                    requiredUp: ['company', 'name', 'employeeRebate']
                    requiredAdd: ['company', 'name', 'employeeRebate','param'],
                    requiredUp: ['employeeRebate'],
                    disabledUp: ['company', 'name','param'],
                    uploadStr: ""
                },
                entityCopy: {},
                upIndex: 0,
@@ -132,7 +153,10 @@
                custom: [],
                addPower: true,
                inPower: true,
                outPower: true
                outPower: true,
                chooseDia: false,
                users: [],
                userId: null
            }
        },
        created() {
@@ -153,6 +177,7 @@
            this.selectProductEnumList()
            this.selectCustomEnumList()
            this.getPower()
            this.getUserList()
        },
        methods: {
            refreshTable() {
@@ -225,6 +250,30 @@
                this.addPower = add
                this.inPower = inPower
                this.outPower = outPower
            },
            getUserList(){
                this.$axios.get(this.$api.user.getUserMenu).then(res => {
                    if (res.code === 201) {
                        return
                    }
                    this.users = res.data
                    var str = []
                    res.data.forEach(a => {
                        str.push({
                            label: a.name,
                            value: a.id
                        })
                    })
                    this.componentData.selectField.param.select = str
                })
            },
            goDown(){
                if(this.userId == null || this.userId == undefined) {
                    this.$message.error('请选择财务上报的对象')
                    return
                }
                this.componentData.uploadStr = this.userId
                this.$refs.ValueTable.openUpload()
            }
        }
    }
src/components/view/index-index.vue
@@ -323,9 +323,9 @@
            setInterval(() => {
                this.nowTime()
            }, 1000)
            setInterval(() => {
            /* setInterval(() => {
                this.getDataList()
            }, 60 * 1000)
            }, 60 * 1000) */
        },
        methods: {
            nowTime() {
src/components/view/person-manage.vue
@@ -48,7 +48,7 @@
        </div>
        <div class="search">
            <div class="search_thing">
                <div class="search_label">客户名称:</div>
                <div class="search_label">用户名:</div>
                <div class="search_input"><el-input size="small" placeholder="请输入" clearable
                        v-model="componentData.entity.name" @keyup.enter.native="refreshTable()"></el-input></div>
            </div>
@@ -97,9 +97,9 @@
                            order: 'asc'
                        }
                    },
                    isIndex: false,
                    showSelect: true,
                    select: true,
                    isIndex: true,
                    showSelect: false,
                    select: false,
                    do: [{
                        id: 'update',
                        font: '编辑',
src/components/view/product-count.vue
@@ -51,15 +51,10 @@
        </div>
        <div class="search">
            <div class="search_thing">
                <div class="search_label">系统日期:</div>
                <div class="search_input">
                    <el-date-picker size="small" v-model="componentData.entity.updateTime" type="date" placeholder="选择日期" value-format="yyyy-MM-dd HH:mm:ss" clearable></el-date-picker>
                </div>
            </div>
            <div class="search_thing">
                <div class="search_label">登记日期:</div>
                <div class="search_input">
                    <el-date-picker size="small" v-model="componentData.entity.createTime" type="date" placeholder="选择日期" value-format="yyyy-MM-dd HH:mm:ss" clearable></el-date-picker>
                    <el-date-picker size="small" v-model="componentData.entity.createTime" type="date" placeholder="选择日期"
                        value-format="yyyy-MM-dd HH:mm:ss" :clearable="false" :editable="false"></el-date-picker>
                </div>
            </div>
            <div class="search_thing">
@@ -77,7 +72,8 @@
            </div>
        </div>
        <div class="table">
            <ValueTable ref="ValueTable" :url="$api.dataReporting.selectProductCountDtoPageList" :componentData="componentData" :key="upIndex" :downUrl="$api.dataReporting.downProductCountFile"/>
            <ValueTable ref="ValueTable" :url="$api.dataReporting.selectProductCountDtoPageList"
                :componentData="componentData" :key="upIndex" :downUrl="$api.dataReporting.downProductCountFile" />
        </div>
    </div>
</template>
@@ -141,8 +137,8 @@
                this.componentData.entity = this.HaveJson(this.entityCopy)
                this.upIndex++
            },
            selectProductEnumList(){
                this.$axios.get(this.$api.enums.selectProductEnumList).then(res=>{
            selectProductEnumList() {
                this.$axios.get(this.$api.enums.selectProductEnumList).then(res => {
                    this.product = res.data
                })
            },
src/components/view/registrant-count.vue
@@ -97,7 +97,7 @@
                        name: null,
                        product: null,
                        orderBy: {
                            field: 'update_time',
                            field: 'create_time',
                            order: 'desc'
                        }
                    },
src/components/view/role-manage.vue
@@ -93,6 +93,14 @@
                        <div style="padding: 3px 30px;" v-for="(a, ai) in menu" :key="ai" v-if="a.type=='删除'"><el-checkbox
                                v-model="a.isClick" :disabled="type=='查看'">{{a.remark}}</el-checkbox></div>
                    </el-collapse-item>
                    <el-collapse-item title="导入">
                        <div style="padding: 3px 30px;" v-for="(a, ai) in menu" :key="ai" v-if="a.type=='导入'"><el-checkbox
                                v-model="a.isClick" :disabled="type=='查看'">{{a.remark}}</el-checkbox></div>
                    </el-collapse-item>
                    <el-collapse-item title="导出">
                        <div style="padding: 3px 30px;" v-for="(a, ai) in menu" :key="ai" v-if="a.type=='导出'"><el-checkbox
                                v-model="a.isClick" :disabled="type=='查看'">{{a.remark}}</el-checkbox></div>
                    </el-collapse-item>
                </el-collapse>
            </div>
            <span slot="footer" class="dialog-footer">
src/view/404.vue
@@ -3,9 +3,9 @@
    <div class="text-center">
      <div class="error mx-auto" data-text="404">404</div>
      <p class="lead text-gray-800 mb-5">找不到你要访问的页面</p>
      <p class="text-gray-500 mb-0">页面不存在</p>
      <!-- <p class="text-gray-500 mb-0">页面不存在</p>
      <p><a href="/">返回首页</a></p>
      <el-button @click="back" type="danger" round>返回上一页</el-button>
      <el-button @click="back" type="danger" round>返回上一页</el-button> -->
    </div>
  </div>
</template>
@@ -31,8 +31,8 @@
      };
      let icon = "../../static/img/logo.png"; // å›¾ç‰‡åœ°å€
      changeFavicon(icon); // åŠ¨æ€ä¿®æ”¹ç½‘ç«™å›¾æ ‡
      let title = "访问出错"; // ç½‘站标题
      document.title = title; // åŠ¨æ€ä¿®æ”¹ç½‘ç«™æ ‡é¢˜
      // let title = "访问出错"; // ç½‘站标题
      // document.title = title; // åŠ¨æ€ä¿®æ”¹ç½‘ç«™æ ‡é¢˜
    },
    methods: {
      back() {
src/view/enter.vue
@@ -102,7 +102,7 @@
    <div class="right">
      <div style="width: calc(100% - 100px * 2);">
        <div class="title_big">欢迎您登录!</div>
        <div class="title_small">山东胜云数据管理平台(DMS)</div>
        <div class="title_small">LIMS实验室管理系统</div>
        <el-form :model="ruleForm" :rules="rules" ref="ruleForm" class="elform" :hide-required-asterisk="true">
          <el-form-item label="用户名" prop="account">
            <el-input v-model="ruleForm.account" placeholder="请输入账号" clearable></el-input>
src/view/index.vue
@@ -9,7 +9,7 @@
    .title {
        width: 100%;
        height: 58px;
        height: 48px;
        display: flex;
        align-items: center;
        padding: 0 30px;
@@ -25,7 +25,7 @@
    }
    .title .label {
        font-size: 16px;
        font-size: 14px;
        text-align: center;
        width: calc(100% - 130px - 200px);
    }
@@ -54,7 +54,7 @@
    }
    .left {
        height: calc(100vh - 58px - 40px);
        height: calc(100vh - 48px - 40px);
        background-color: #3A7BFA;
        display: flex;
        align-items: center;
@@ -78,7 +78,7 @@
        color: #fff;
        width: 68px;
        height: 68px;
        margin: 12px 0;
        margin: 8px 0;
        cursor: pointer;
        display: flex;
        align-items: center;
@@ -97,12 +97,12 @@
    }
    .left .box i {
        font-size: 28px;
        font-size: 24px;
        margin-bottom: 4px;
    }
    .left .box div {
        font-size: 14px;
        font-size: 12px;
    }
    .small_menu {
@@ -113,13 +113,13 @@
        color: #3A7BFA;
    }
    .small_menu p {
        padding: 12px 15px;
    .small_menu .p {
        padding: 6px 10px;
        cursor: pointer;
    }
    .small_menu p:hover {
        background-color: rgba(0, 0, 0, 0.05);
    .small_menu .p:hover {
        color: #3A7BFA;
    }
    .small_menu i {
@@ -127,17 +127,17 @@
    }
    .small_menu span {
        font-size: 14px;
        font-size: 12px;
    }
    .right {
        height: calc(100vh - 58px);
        height: calc(100vh - 48px);
        transition: .3s;
    }
    .tag {
        width: 100%;
        height: 36px;
        height: 32px;
        background: rgb(255, 255, 255);
        opacity: 0.8;
        box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.1);
@@ -163,7 +163,7 @@
    .tag>.el-icon-s-unfold,
    .el-icon-s-fold,
    .el-icon-delete {
        font-size: 18px;
        font-size: 16px;
        cursor: pointer;
        margin: 0 8px;
    }
@@ -174,21 +174,26 @@
        align-items: center;
        display: flex;
        overflow-x: auto;
        overflow-y: hidden;
    }
    .tabs::-webkit-scrollbar {
        height: 4px;
    }
    .tab {
        cursor: pointer;
        font-size: 14px;
        font-size: 12px;
        margin: 0 8px;
        line-height: 32px;
        line-height: 28px;
        transition: 0.3s;
        border-top: 2px solid transparent;
        border-bottom: 2px solid transparent;
        user-select: none;
        flex-shrink: 0;
    }
    .tab:hover{
    .tab:hover {
        color: #3A7BFA;
    }
@@ -208,7 +213,7 @@
    }
    .component_view {
        height: calc(100vh - 94px);
        height: calc(100vh - 84px);
        width: calc(100% - 52px);
        padding: 0 26px;
        background: rgb(245, 247, 251);
@@ -226,23 +231,32 @@
        left: 0;
        display: none;
        z-index: 999;
        padding: 0;
    }
    .right_key_menu li {
        list-style-type: none;
        padding: 5px 0;
        padding: 6px 0;
        padding-left: 10px;
        font-size: 0.9rem;
        transition: .5s;
        font-size: 12px;
        transition: .3s;
        cursor: pointer;
    }
    .right_key_menu li i{
        margin-right: 20px;
    .right_key_menu li i {
        margin-right: 14px;
    }
    .right_key_menu li:hover {
        background-color: #dedede;
        background-color: #eeeeee;
    }
    .group {
        font-size: 12px;
        color: #ed940d;
        background-color: transparent !important;
        cursor: auto !important;
        margin: 8px 12px;
    }
</style>
<style></style>
@@ -252,30 +266,38 @@
            <div class="logo">
                <!-- <img src="../../static/img/logo 1.png" /> -->
            </div>
            <div class="label">山东胜云数据管理系统</div>
            <div class="label">LIMS实验室管理系统</div>
            <div class="user">
                <el-avatar :size="26">{{ userName.substring(0, 1) }}</el-avatar>
                <span>{{ userName }}</span>
                <img src="../../static/img/退出.png" @click="out" />
                <img src="../../static/img/退出.png" @click="out" title="退出账号" />
            </div>
        </div>
        <div class="left" :style="`width: ${leftOpen?'92':'0'}px;`">
            <div v-for="(a, ai) in menu" :key="ai">
                <div :class="`box ${activeBox == a.c[0].k ? 'active_box' : ''}`" @click="addTab(a.c[0], -1)" v-if="a.self && getPower(a.c[0].p)">
                <div :class="`box ${activeBox == a.c[0].k ? 'active_box' : ''}`" @click="addTab(a.c[0], -1)"
                    v-if="a.self && getPower(a.c[0].p)">
                    <i :class="a.i"></i>
                    <div>{{a.v}}</div>
                </div>
                <el-popover placement="right-start" width="90" trigger="click" v-if="a.self != true && getPower(a.p)">
                <el-popover placement="right-start" trigger="click" v-if="a.self != true && getPower(a.p)">
                    <div :class="`box ${activeBox == a.k ? 'active_box' : ''}`" slot="reference">
                        <i :class="a.i"></i>
                        <div>{{ a.v }}</div>
                        <div style="text-align: center;">{{ a.v }}</div>
                    </div>
                    <div class="small_menu">
                        <p v-for="(b, bi) in a.c" :key="bi" :class="activeP == b.k ? 'active_p' : ''" @click="addTab(b, a.k)" v-if="getPower(b.p)">
                            <i :class="b.i"></i>
                            <span>{{ b.v }}</span>
                        </p>
                        <div v-for="(b, bi) in a.c" :key="bi">
                            <el-col v-if="groupMenu(b.g, a.c[bi - 1])" class="group">{{b.g}}</el-col>
                            <el-col :span="groupCount(b.g, a.c)" :class="activeP == b.k ? 'active_p p' : 'p'"
                                @click.native="addTab(b, a.k)" v-if="getPower(b.p)">
                                <p :title="b.v" style="white-space: nowrap;text-overflow: ellipsis;overflow: hidden;">
                                    <i :class="b.i"></i>
                                    <span>{{ b.v }}</span>
                                </p>
                            </el-col>
                        </div>
                    </div>
                </el-popover>
                </el-popover>
            </div>
        </div>
@@ -292,15 +314,15 @@
                <i class="el-icon-delete" @click="allDel" title="删除所有标签页"></i>
            </div>
            <div class="component_view">
                <component class="com_index" v-for="(com, index) in tabs" :is="com.u" :key="com.k"
                    v-show="com.k == tabActive" :ref="`com-${com.k}`">
                <component class="com_index" v-for="(com, index) in tabs" :is="com.u" :key="com.k" v-show="com.k == tabActive"
                    :ref="`com-${com.k}`">
                </component>
            </div>
        </div>
        <!-- å³é”®èœå• -->
        <div class="right_key_menu">
            <el-col :span="24">
                <el-card :body-style="{padding: '6px 0'}">
                <el-card :body-style="{padding: '6px'}">
                    <ul>
                        <li style="color: red;" @click="removeTab(activeIndex)"><i class="el-icon-close"></i>关闭</li>
                        <el-divider></el-divider>
@@ -323,151 +345,34 @@
        const componentConfig = requireComponent(fileName);
        comObj[names] = componentConfig.default || componentConfig;
    });
    import menu from '../../static/js/menu.js';
    import menus from '../../static/js/menu.js'
    import nullFace from '../view/404.vue'
    comObj['nullFace'] = nullFace
    export default {
        components: comObj,
        data() {
            return {
                userName: "value",
                leftOpen: true,
                menu: [{
                        k: 0,
                        v: "首页",
                        i: "font icon-shouyefill",
                        self: true,
                        c: [{
                            k: 0,
                            v: "首页",
                            i: "font icon-shouyefill",
                            u: "index-index"
                        }]
                    },
                    {
                        k: 2,
                        v: "数据上报",
                        i: "font icon-a-Group1118",
                        self: true,
                        c: [{
                            k: 2,
                            v: "数据上报",
                            i: "font icon-a-Group1118",
                            u: "data-reporting",
                            p: "selectDataReportingList"
                        }]
                    },
                    {
                        k: 3,
                        v: "数据统计",
                        i: "font icon-a-Group1120",
                        p: "selectProductCountDtoPageList selectRegistrantCountDtoPageList",
                        c: [{
                            k: 9,
                            v: "项目数据统计",
                            i: "font icon-24gl-clipboardList",
                            u: "product-count",
                            p: "selectProductCountDtoPageList"
                        },{
                            k: 10,
                            v: "员工数据统计",
                            i: "font icon-24gl-clipboardList",
                            u: "registrant-count",
                            p: "selectRegistrantCountDtoPageList"
                        },{
                            k: 12,
                            v: "员工数据对比",
                            i: "font icon-24gl-clipboardList",
                            u: "data-comparison",
                            p: "selectDataComparisonDtoPageList"
                        }]
                    },
                    {
                        k: 5,
                        v: "进粉上报",
                        i: "font icon-a-Group1122",
                        self: true,
                        c: [{
                            k: 5,
                            v: "进粉上报",
                            i: "font icon-a-Group1122",
                            u: "fans-submit",
                            p: "selectFansSubmitList"
                        }]
                    },
                    {
                        k: 6,
                        v: "财务上报",
                        i: "font icon-a-Group1236",
                        self: true,
                        c: [{
                            k: 6,
                            v: "财务上报",
                            i: "font icon-a-Group1236",
                            u: "finance-submit",
                            p: "selectFinanceSubmitList"
                        }]
                    },
                    {
                        k: 7,
                        v: "角色管理",
                        i: "font icon-a-Group1126",
                        self: true,
                        c: [{
                            k: 7,
                            v: "角色管理",
                            i: "font icon-a-Group1126",
                            u: "role-manage",
                            p: "selectRoleLists"
                        }]
                    },
                    {
                        k: 4,
                        v: "数据字典",
                        i: "font icon-odbc-full",
                        p: "selectCustomEnumLists selectProductEnumLists",
                        c: [{
                                k: 4,
                                v: "客户管理",
                                i: "font icon-24gl-clipboardList",
                                u: "custom-enum",
                                p: "selectCustomEnumLists"
                            },
                            {
                                k: 11,
                                v: "项目管理",
                                i: "font icon-24gl-clipboardList",
                                u: "product-enum",
                                p: "selectProductEnumLists"
                            }
                        ]
                    },
                    {
                        k: 8,
                        v: "人员管理",
                        i: "font icon-a-Group1124",
                        self: true,
                        c: [{
                            k: 8,
                            v: "人员管理",
                            i: "font icon-a-Group1124",
                            u: "person-manage",
                            p: "selectUserList"
                        }]
                    }
                ],
                menu: [],
                activeBox: 0,
                activeP: 0,
                tabActive: 0,
                tabs: [{
                    k: 0,
                    v: "首页",
                    v: "个人首页",
                    i: "font icon-a-Group1124",
                    u: "index-index"
                    u: "nullFace"
                }],
                upIndex: 0,
                activeIndex: 0,
                power: []
            };
        },
        created() {},
        created() {
            this.menu = menus.menu
        },
        mounted() {
            this.userName = JSON.parse(localStorage.getItem("user")).name;
            this.power = JSON.parse(sessionStorage.getItem('power'))
@@ -485,6 +390,7 @@
                    }
                });
                if (num == -1) {
                    if(ob.u == "") ob.u = "nullFace"
                    this.tabs.push(ob);
                }
            },
@@ -542,23 +448,41 @@
                })
            },
            // åˆ·æ–°è¡¨æ ¼å†…容
            refreshTable(){
            refreshTable() {
                var thing = this.tabs.splice(this.activeIndex, 1)
                setTimeout(()=>{
                setTimeout(() => {
                    this.tabs.splice(this.activeIndex, 0, thing[0])
                }, 0)
            },
            // æƒé™åˆ†é…
            getPower(p){
                if(p==undefined) return true
            getPower(p) {
                if (p == undefined || p == '') return true
                let str = p.split(' ')
                for (var a = 0; a < str.length; a++) {
                    for (var i = 0; i < this.power.length; i++) {
                        if(this.power[i].menuMethod == str[a]) {
                        if (this.power[i].menuMethod == str[a]) {
                            return true
                        }
                    }
                }
            },
            // èœå•栏分类判断
            groupMenu(g1, g2) {
                if (g1 == undefined) return false
                if (g2 == undefined) return true
                if (g1 == g2.g) return false
                return true
            },
            // ç›¸åŒåˆ†ç±»çš„菜单数量是否大于4
            groupCount(g1, gs) {
                if (g1 == undefined) return 24
                let count = 0
                gs.forEach(a=>{
                    if(a.g == g1) count++
                })
                if (count > 4) return 8
                if (count > 1) return 12
                if (count == 1) return 24
            }
        }
    };
static/js/menu.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,743 @@
var menu = [{
        k: 0,
        v: "个人首页",
        i: "font icon-shouyefill",
        self: true,
        c: [{
            k: 0,
            v: "个人首页",
            i: "font icon-shouyefill",
            u: "index-index"
        }]
    },
    {
        v: "业务管理",
        i: "font icon-a-Group1118",
        p: "",
        c: [{
            v: "检验下单",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "检验任务",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "报告编制",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "费用统计",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "样品管理",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }]
    },
    {
        v: "标准集",
        i: "font icon-a-Group1120",
        p: "",
        c: [{
            v: "标准库",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "标准模板",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }]
    },
    {
        v: "绩效管理",
        i: "font icon-24gl-clipboardList",
        p: "",
        c: [{
            v: "工时管理",
            i: "font icon-24gl-clipboardList",
            u: "fans-submit",
            p: ""
        }, {
            v: "人员考勤",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "人员考评",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "人员考核",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "技能等级",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "工资结算",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "班次",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }]
    },
    {
        v: "统计图表",
        i: "font icon-24gl-clipboardList",
        p: "",
        c: [{
            v: "实验室要素",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "每日业务统计",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "检测项目统计",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "样品缺陷指数",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "耗材统计",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "人员工作报表",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }]
    },
    {
        v: "电子看板",
        i: "font icon-a-Group1126",
        p: "",
        c: [{
            v: "客户接待",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "任务展示",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }, {
            v: "设备状态及饱和度",
            i: "font icon-24gl-clipboardList",
            u: "",
            p: ""
        }]
    },
    {
        v: "系统功能",
        i: "el-icon-s-tools",
        p: "",
        c: [{
            v: "数据字典",
            i: "el-icon-s-tools",
            u: "enums",
            p: "selectEnumList"
        }, {
            v: "角色管理",
            i: "el-icon-s-tools",
            u: "role-manage",
            p: ""
        }, {
            v: "用户管理",
            i: "el-icon-s-tools",
            u: "person-manage",
            p: ""
        }, {
            v: "客户管理",
            i: "el-icon-s-tools",
            u: "",
            p: ""
        }, {
            v: "系统日志",
            i: "el-icon-s-tools",
            u: "",
            p: ""
        }]
    },
    {
        v: "4 é€šç”¨è¦æ±‚",
        i: "el-icon-tickets",
        p: "selectCustomEnumLists selectProductEnumLists",
        c: [{
                v: "通用要求",
                i: "font icon-24gl-clipboardList",
                u: "",
                g: "4 é€šç”¨è¦æ±‚",
                p: ""
            },
            {
                v: "公正性",
                i: "font icon-24gl-clipboardList",
                u: "",
                g: "4.1 å…¬æ­£æ€§",
                p: ""
            },
            {
                v: "保密性",
                i: "font icon-24gl-clipboardList",
                u: "",
                g: "4.2 ä¿å¯†æ€§",
                p: ""
            }
        ]
    },
    {
        v: "5 ç»“构要求",
        i: "el-icon-tickets",
        p: "",
        c: [{
            v: "实验室的法律地位",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "A实验室的法律地位",
            p: ""
        }, {
            v: "全权负责的管理层",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "B全权负责的管理层",
            p: ""
        }, {
            v: "实验室资质",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "C能力范围和资质",
            p: ""
        }, {
            v: "能力范围",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "C能力范围和资质",
            p: ""
        }, {
            v: "场所或设施",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "D场所或设施",
            p: ""
        }, {
            v: "组织相关文件",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "E组织相关文件",
            p: ""
        }, {
            v: "人员岗位任职",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "F人员岗位任职",
            p: ""
        }, {
            v: "沟通和宣贯",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "G沟通和宣贯",
            p: ""
        }]
    }, {
        v: "6 èµ„源要求",
        i: "el-icon-tickets",
        p: "",
        c: [{
            v: "总则",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.1 æ€»åˆ™",
            p: ""
        }, {
            v: "人员总览",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.2 äººå‘˜",
            p: ""
        }, {
            v: "人员明细",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.2 äººå‘˜",
            p: ""
        }, {
            v: "人员培训",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.2 äººå‘˜",
            p: ""
        }, {
            v: "人员监督",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.2 äººå‘˜",
            p: ""
        }, {
            v: "岗位职责",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.2 äººå‘˜",
            p: ""
        }, {
            v: "人员基本信息",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.2 äººå‘˜",
            p: ""
        }, {
            v: "工作履历",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.2 äººå‘˜",
            p: ""
        }, {
            v: "奖惩记录",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.2 äººå‘˜",
            p: ""
        }, {
            v: "培训记录",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.2 äººå‘˜",
            p: ""
        }, {
            v: "监督记录",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.2 äººå‘˜",
            p: ""
        }, {
            v: "任职授权记录",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.2 äººå‘˜",
            p: ""
        }, {
            v: "人员能力监控记录",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.2 äººå‘˜",
            p: ""
        }, {
            v: "沟通记录",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.2 äººå‘˜",
            p: ""
        }, {
            v: "外来人员管理",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.3 è®¾æ–½å’ŒçŽ¯å¢ƒæ¡ä»¶",
            p: ""
        }, {
            v: "实验室设施场所信息",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.3 è®¾æ–½å’ŒçŽ¯å¢ƒæ¡ä»¶",
            p: ""
        }, {
            v: "设施和环境条件要求",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.3 è®¾æ–½å’ŒçŽ¯å¢ƒæ¡ä»¶",
            p: ""
        }, {
            v: "环境条件引用",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.3 è®¾æ–½å’ŒçŽ¯å¢ƒæ¡ä»¶",
            p: ""
        }, {
            v: "安全区代表检查",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.3 è®¾æ–½å’ŒçŽ¯å¢ƒæ¡ä»¶",
            p: ""
        }, {
            v: "安全内务",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.3 è®¾æ–½å’ŒçŽ¯å¢ƒæ¡ä»¶",
            p: ""
        }, {
            v: "废物处理交接记录",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.3 è®¾æ–½å’ŒçŽ¯å¢ƒæ¡ä»¶",
            p: ""
        }, {
            v: "设备总览",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.4 è®¾å¤‡",
            p: ""
        }, {
            v: "设备工具明细",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.4 è®¾å¤‡",
            p: ""
        }, {
            v: "资源预定",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.4 è®¾å¤‡",
            p: ""
        }, {
            v: "作业指导书",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.4 è®¾å¤‡",
            p: ""
        }, {
            v: "设备运行总览",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.4 è®¾å¤‡",
            p: ""
        }, {
            v: "设备档案",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.4 è®¾å¤‡",
            p: ""
        }, {
            v: "设备验收",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.4 è®¾å¤‡",
            p: ""
        }, {
            v: "设备校准",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.4 è®¾å¤‡",
            p: ""
        }, {
            v: "设备核查",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.4 è®¾å¤‡",
            p: ""
        }, {
            v: "设备维护",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.4 è®¾å¤‡",
            p: ""
        }, {
            v: "设备借用",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.4 è®¾å¤‡",
            p: ""
        }, {
            v: "设备故障",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.4 è®¾å¤‡",
            p: ""
        }, {
            v: "使用记录",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.4 è®¾å¤‡",
            p: ""
        }, {
            v: "设备停用/启用",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.4 è®¾å¤‡",
            p: ""
        }, {
            v: "量值溯源计划",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.5 è®¡é‡æº¯æºæ€§",
            p: ""
        }, {
            v: "标准物质清单",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.5 è®¡é‡æº¯æºæ€§",
            p: ""
        }, {
            v: "标准物质验收",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.5 è®¡é‡æº¯æºæ€§",
            p: ""
        }, {
            v: "标准物质领用",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.5 è®¡é‡æº¯æºæ€§",
            p: ""
        }, {
            v: "过期标样处置",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.5 è®¡é‡æº¯æºæ€§",
            p: ""
        }, {
            v: "服务和供应品采购",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.6 å¤–部提供的产品和服务",
            p: ""
        },{
            v: "供应商管理",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "6.6 å¤–部提供的产品和服务",
            p: ""
        }]
    },
    {
        v: "7 è¿‡ç¨‹è¦æ±‚",
        i: "el-icon-tickets",
        p: "",
        c: [{
            v: "检验委托单",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.1 è¦æ±‚、标书和合同评审",
            p: ""
        }, {
            v: "合同评审",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.1 è¦æ±‚、标书和合同评审",
            p: ""
        }, {
            v: "实验室的检测能力档案",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.2 æ–¹æ³•的选择、验证和确认",
            p: ""
        }, {
            v: "标准查新",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.2 æ–¹æ³•的选择、验证和确认",
            p: ""
        }, {
            v: "标准方法的变更",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.2 æ–¹æ³•的选择、验证和确认",
            p: ""
        }, {
            v: "方法验证",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.2 æ–¹æ³•的选择、验证和确认",
            p: ""
        }, {
            v: "抽样",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.3 æŠ½æ ·",
            p: ""
        }, {
            v: "检测或校准物品的处置",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.4 æ£€æµ‹æˆ–校准物品的处置",
            p: ""
        }, {
            v: "技术记录",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.5 æŠ€æœ¯è®°å½•",
            p: ""
        }, {
            v: "测量不确定度的评定",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.6 æµ‹é‡ä¸ç¡®å®šåº¦çš„评定",
            p: ""
        }, {
            v: "确保结果有效性",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.7 ç¡®ä¿ç»“果有效性",
            p: ""
        }, {
            v: "报告结果",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.8 æŠ¥å‘Šç»“æžœ",
            p: ""
        }, {
            v: "投诉详情",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.9 æŠ•诉",
            p: ""
        }, {
            v: "投诉情况汇总表",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.9 æŠ•诉",
            p: ""
        }, {
            v: "不符合项",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.10 ä¸ç¬¦åˆå·¥ä½œ",
            p: ""
        }, {
            v: "不符合项的分布",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.10 ä¸ç¬¦åˆå·¥ä½œ",
            p: ""
        }, {
            v: "数据控制和信息管理",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "7.11 æ•°æ®æŽ§åˆ¶å’Œä¿¡æ¯ç®¡ç†",
            p: ""
        }]
    },
    {
        v: "8 ä½“系管理要求",
        i: "el-icon-tickets",
        p: "",
        c: [{
            v: "方式",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "8.1 æ–¹å¼",
            p: ""
        }, {
            v: "管理体系文件",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "8.2 ç®¡ç†ä½“系文件",
            p: ""
        }, {
            v: "文件清单",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "8.3 ç®¡ç†ä½“系文件的控制",
            p: ""
        }, {
            v: "文件受控",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "8.3 ç®¡ç†ä½“系文件的控制",
            p: ""
        }, {
            v: "文件发放回收",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "8.3 ç®¡ç†ä½“系文件的控制",
            p: ""
        }, {
            v: "文件变更",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "8.3 ç®¡ç†ä½“系文件的控制",
            p: ""
        }, {
            v: "文件作废",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "8.3 ç®¡ç†ä½“系文件的控制",
            p: ""
        }, {
            v: "记录的控制",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "8.4 è®°å½•的控制",
            p: ""
        }, {
            v: "应对风险和机遇的措施",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "8.5 åº”对风险和机遇的措施",
            p: ""
        }, {
            v: "客户基本信息管理",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "8.6 æ”¹è¿›",
            p: ""
        }, {
            v: "客户满意度",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "8.6 æ”¹è¿›",
            p: ""
        }, {
            v: "纠正措施",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "8.7 çº æ­£æŽªæ–½",
            p: ""
        }, {
            v: "内审管理",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "8.8 å†…审管理",
            p: ""
        }, {
            v: "管理评审",
            i: "font icon-24gl-clipboardList",
            u: "",
            g: "8.9 ç®¡ç†è¯„审",
            p: ""
        }]
    }
]
function computeK() {
    let k = 1;
    function computeK(menu) {
        menu.forEach(item => {
            if (item.k == undefined) item.k = k++;
            if (item.c) {
                computeK(item.c);
            }
        });
    }
    computeK(menu);
}
computeK();
export default {
    menu: menu
}