董国庆
2025-06-20 e169d66efe2eebc580ba405f1c984914c422ce0a
修改中台和组件引入
8个文件已修改
509 ■■■■■ 已修改文件
culture/src/main.js 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/views/middleground/index.vue 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/components/SelectMember/index.vue 78 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/main.js 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/utils/request.js 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/middleground/index.vue 332 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
laboratory/src/views/projectList/addProject.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
culture/src/main.js
@@ -1,9 +1,12 @@
import Vue from "vue";
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
import Antd from 'ant-design-vue';
import 'ant-design-vue/dist/antd.css';
// import Antd from 'ant-design-vue';
// import 'ant-design-vue/dist/antd.css';
// import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN';
import {Calendar,ConfigProvider } from 'ant-design-vue';
import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN';
import 'ant-design-vue/dist/antd.css';
import '@/assets/font/font.css'
import App from "./App.vue";
import router from "./router";
@@ -21,7 +24,9 @@
Vue.config.productionTip = false;
Vue.use(ElementUI, { size: 'small' })
Vue.use(Antd)
// Vue.use(Antd)
Vue.use('Calendar',Calendar)
Vue.use(ConfigProvider)
Vue.component('Table', Table)
Vue.component('TableCustom', TableCustom)
Vue.component('Card', Card)
culture/src/views/middleground/index.vue
@@ -65,11 +65,13 @@
</template>
<script>
import { loginReq } from './service'
import { Calendar } from "ant-design-vue";
import HeaderNav from '../../layouts/components/HeaderNav.vue'
export default {
  name: 'Login',
  components: {
    HeaderNav,
    ACalendar: Calendar,
    // ElCalendar // 注册 ElCalendar 组件
  },
@@ -286,6 +288,7 @@
        .module-item {
          width: 100%;
          height: 307px;
          border-radius: 20px;
        }
      }
@@ -353,6 +356,8 @@
      cursor: pointer;
      transition: all 0.3s ease;
      overflow: hidden;
      border-radius: 20px;
      padding-bottom: 40px;
    }
    .module-bg {
@@ -439,11 +444,12 @@
        content: '';
        position: absolute;
        left: 50%;
        bottom: -5px;
        bottom: -15px;
        transform: translateX(-50%);
        width: 50%;
        height: 2px;
        background-color: #007bff;
        width: 66px;
        height: 3px;
        background: #24595b;
        border-radius: 1px;
      }
    }
@@ -780,7 +786,7 @@
              height: 55px;
              background: #FFFFFF;
              border-radius: 8px;
              border: 1px solid #EDEDED;
              border: 1px solid #ededed;
              display: flex;
              justify-content: center;
              align-items: center;
@@ -807,13 +813,32 @@
            &.ant-fullcalendar-today .ant-fullcalendar-date {
              // border-color: #009688;
            }
            &.ant-fullcalendar-last-month-cell {
              .ant-fullcalendar-value {
                color: #ffffff !important;
              }
            }
            &.ant-fullcalendar-next-month-btn-day {
              .ant-fullcalendar-date {}
              .ant-fullcalendar-value {
                color: #ffffff !important;
                &:hover {
                  // background: #FFFFFF;
                  color: rgba(4, 156, 154, 0.1) !important;
                }
              }
            }
          }
        }
        .ant-fullcalendar-month-panel-selected-cell {
          .ant-fullcalendar-month {
            border-top-color: #009688 !important;
            background: rgba(4, 156, 154, .2);
            // background: rgba(4, 156, 154, .2);
            background: rgba(4, 156, 154, 0.2);
            .ant-fullcalendar-value {
              color: #FFFFFF;
laboratory/package.json
@@ -17,6 +17,7 @@
    "core-js": "^3.41.0",
    "element-ui": "^2.15.6",
    "moment": "^2.30.1",
    "dayjs": "^1.11.0",
    "sm-crypto": "^0.3.13",
    "vue": "^2.7.16",
    "vue-router": "^3.6.5",
laboratory/src/components/SelectMember/index.vue
@@ -13,16 +13,16 @@
                                <img src="@/assets/public/search-outline@2x.png" />
                                <el-input v-model="search" placeholder="请输入" />
                                <div class="select-member-content-left-search-input-close">
                                    <img @click.stop="searchRole" v-if="search"
                                    <img @click.stop="searchRoleRest" v-if="search"
                                        src="@/assets/public/close-circle-fill@2x.png" />
                                </div>
                            </div>
                            <el-button type="primary">搜索</el-button>
                            <el-button type="primary" @click="searchRole()">搜索</el-button>
                        </div>
                        <div class="select-member-content-left-list">
                            <div class="select-member-content-left-list-title">角色列表</div>
                            <div class="select-member-content-left-list-itemBox">
                                <div @click="searchUserList(item.roleId)" v-for="item in roleList" :key="item.roleId"
                                <div @click="handleRoleClick(item.roleId)" v-for="item in roleList" :key="item.roleId"
                                    class="select-member-content-left-list-itemBox-item"
                                    :class="roleId == item.roleId && 'active'">
                                    {{ item.roleName }}
@@ -36,20 +36,20 @@
                        <div class="select-member-content-right-header">
                            <div class="select-member-content-right-header-text">人员列表</div>
                            <div class="select-member-content-right-header-search">
                                <el-input clearable v-model="nickNameOrPhone" placeholder="请输入姓名" />
                                <el-button type="primary">搜索</el-button>
                                <el-input clearable v-model="nickNameOrPhone" placeholder="请输入姓名"  />
                                <el-button type="primary" @click="searchUserList(null)">搜索</el-button>
                            </div>
                        </div>
                        <Table ref="memberTable" :height="null" :row-key="row => row.userId" :data="tableData"
                        <Table ref="memberTable" :height="500" :row-key="row => row.userId" :data="tableData"
                            :total="0" @selection-change="handleSelectionChange" :row-class-name="tableRowClassName">
                            <el-table-column type="selection" width="55" />
                            <el-table-column label="角色" prop="roleType" >
                            <el-table-column label="角色" prop="roleId" >
                                <template #default="scope">
                                    <span v-if="scope.row.roleType == 1">超级管理员</span>
                                    <span v-if="scope.row.roleType == 2">审批人</span>
                                    <span v-if="scope.row.roleType == 3">工艺工程师</span>
                                    <span v-if="scope.row.roleType == 4">化验师</span>
                                    <span v-if="scope.row.roleType == 5">实验员</span>
                                    <span v-if="scope.row.roleId == 1">超级管理员</span>
                                    <span v-if="scope.row.roleId == 2">审批人</span>
                                    <span v-if="scope.row.roleId == 3">工艺工程师</span>
                                    <span v-if="scope.row.roleId == 4">化验师</span>
                                    <span v-if="scope.row.roleId == 5">实验员</span>
                                </template>
                            </el-table-column>
                            <el-table-column label="姓名" prop="nickName" />
@@ -92,6 +92,21 @@
        }
    },
    methods: {
        searchRole(){
            if(this.search){
                this.roleList=this.roleList.filter(item=> item.roleName.includes(this.search))
            }else{
                getRoleList().then(res => {
                if (this.projectId) {
                    // 过滤出实验员和化验师角色
                    this.roleList = res.filter(item => item.roleId == 4 || item.roleId == 5);
                } else {
                    this.roleList = res;
                }
            });
            }
        },
        setSelection(selected) {
            this.selectData = selected;
            // 确保 tableData 和 memberTable 都存在
@@ -118,23 +133,49 @@
            this.searchUserList(null);
        },
        handleSelectionChange(val) {
            this.selectData = val
            // 获取当前表格所有 userId
            const currentIds = this.tableData.map(i => i.userId);
            // 1. 保留不在当前表格的已选
            const remain = this.selectData.filter(i => !currentIds.includes(i.userId));
            // 2. 合并当前表格新选中的
            const merged = [...remain, ...val];
            // 3. 去重(以 userId 为唯一标识)
            const unique = [];
            const map = {};
            for (const item of merged) {
                if (!map[item.userId]) {
                    unique.push(item);
                    map[item.userId] = true;
                }
            }
            this.selectData = unique;
        },
        handleRoleClick(clickedRoleId) {
            if (this.roleId === clickedRoleId) {
                // 再次点击,取消筛选
                this.roleId = null;
                this.searchUserList(null);
            } else {
                // 切换到新角色
                this.roleId = clickedRoleId;
                this.searchUserList(clickedRoleId);
            }
        },
        async searchUserList(roleId) {
            this.roleId = roleId
            // this.roleId = roleId // 不再赋值 roleId,由 handleRoleClick 控制
            // 根据是否有项目组ID来决定调用不同的接口
            let params = {
                roleIds: roleId ? [roleId] : [],
                nickNameOrPhone: this.searchName,
                nickNameOrPhone: this.nickNameOrPhone,
                pageSize: 9999,
                pageNum: 1
            };
            if (this.projectId) {
                params={
                    ...params,
                    roleId: roleId?roleId:'',
                    projectId: this.projectId
                    projectId: this.projectId,
                    nickName: this.nickNameOrPhone,
                }
                delete params.roleIds;
                // TODO: 这里需要替换为新的接口调用
@@ -144,11 +185,10 @@
                const res = await getUserList(params);
                this.tableData = res.records;
            }
            // 数据加载完成后重新应用选中状态
            this.setSelection(this.selectData)
        },
        searchRole() {
        searchRoleRest() {
            this.search = ''
        },
        open() {
laboratory/src/main.js
@@ -1,8 +1,12 @@
import Vue from "vue";
import ElementUI from "element-ui";
import "element-ui/lib/theme-chalk/index.css";
import {Calendar} from 'ant-design-vue';
import {Calendar,ConfigProvider } from 'ant-design-vue';
import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN';
import 'ant-design-vue/dist/antd.css';
// import Antd from 'ant-design-vue';
// import 'ant-design-vue/dist/antd.css';
// import zhCN from 'ant-design-vue/lib/locale-provider/zh_CN';
import '@/assets/font/font.css'
import App from "./App.vue";
import router from "./router";
@@ -17,11 +21,18 @@
import './assets/tailwind.css'
import './styles/element-variables.less'
import dayjs from "../node_modules/dayjs/dayjs.min.js";
import "dayjs/locale/zh-cn";
dayjs.locale("zh-cn");
Vue.config.productionTip = false;
Vue.use(ElementUI, { size: 'small' })
Vue.use('Calendar',Calendar)
Vue.use(ConfigProvider)
// Vue.use(Antd)
Vue.component('Table', Table)
Vue.component('TableCustom', TableCustom)
Vue.component('Card', Card)
@@ -71,5 +82,9 @@
new Vue({
  router,
  store,
  render: (h) => h(App),
  render: (h) => (
    <a-config-provider locale={zhCN}>
      <App />
    </a-config-provider>
  ),
}).$mount("#app");
laboratory/src/utils/request.js
@@ -60,25 +60,25 @@
      if (!res.data) {
        return Promise.resolve({})
      }
      console.log('res', res.data.data || res.data)
      return Promise.resolve(res.data.data || res.data)
    } else {
      if (res.data.code == 103 || res.data.code == 401) {
      if (res.data.data.code == 200) {
        return Promise.resolve(res.data.data || res.data)
      } else if (res.data.data.code == 103 || res.data.data.code == 401) {
        Message({
          message: res.data.msg || '登录已过期,请重新登录',
          message: res.data.data.msg || '登录已过期,请重新登录',
          type: 'warning',
          duration: 2000
        })
        sessionStorage.clear();
        window.location.replace('/');
      } else if (res.data.data.code == 500) {
        Message({
          message: res.data.data.msg || '服务器错误',
          type: 'error',
          duration: 2000
        })
        return Promise.reject(res.data.data)
      } else {
        return Promise.resolve(res.data.data || res.data)
      }
      Message({
        message: res.data.msg || '服务器错误',
        type: 'error',
        duration: 2000
      })
      return Promise.reject(res.data.data)
    }
  },
  error => {
laboratory/src/views/middleground/index.vue
@@ -5,13 +5,16 @@
    </div>
    <div class="middleground" :class="{
      'column': windowWidth < 1240,
      'mobile': windowWidth < 800
      column: windowWidth < 1240,
      mobile: windowWidth < 800,
    }">
      <!-- 左侧模块区域 -->
      <div class="left-modules" :class="[currentModuleLayout, {
        'mobile-layout': windowWidth < 800
      }]">
      <div class="left-modules" :class="[
        currentModuleLayout,
        {
          'mobile-layout': windowWidth < 800,
        },
      ]">
        <div class="module-item" v-for="(item, index) in filteredModuleList" :key="index"
          @click="handleModuleClick(item)">
          <div class="module-bg"></div>
@@ -29,7 +32,7 @@
        <!-- 日历 -->
        <div class="calendar-section">
          <div class="title-canlender">日历</div>
          <a-calendar @panelChange="onPanelChange" />
          <a-calendar @panelChange="onPanelChange" :locale="local" />
        </div>
        <!-- 待办事项 -->
@@ -40,11 +43,9 @@
            <div class="todo-item" v-for="i in 6" :key="i">
              <div class="todo-details">
                <div class="notice-card">
                  <div class="todo-icon">
                  </div>
                  <div class="todo-icon"></div>
                  <div class="red-notice"></div>
                </div>
                <span class="todo-title">您有 [1] 条 【项目课题方案】 等待审批</span>
              </div>
@@ -59,18 +60,17 @@
        </div>
      </div>
    </div>
  </div>
</template>
<script>
import { Calendar } from 'ant-design-vue';
import { loginReq } from './service'
import HeaderNav from '../../layouts/components/HeaderNav.vue'
import { Calendar } from "ant-design-vue";
import { loginReq } from "./service";
import HeaderNav from "../../layouts/components/HeaderNav.vue";
import zhCN from "ant-design-vue/lib/locale-provider/zh_CN";
// 引入 Element UI 的日历组件
// import { ElCalendar } from 'element-ui';
export default {
  name: 'Login',
  name: "Login",
  components: {
    HeaderNav,
    ACalendar: Calendar,
@@ -80,146 +80,146 @@
  data() {
    return {
      windowWidth: window.innerWidth,
      local: zhCN,
      loginForm: {
        username: '',
        password: ''
        username: "",
        password: "",
      },
      date: new Date(),
      viewWidth: '',
      viewWidth: "",
      scale: 1,
      // 审批人
      moduleList2: [
      {
          text: '实验室运行模块',
          icon: require('../../assets/login/img1.png'),
          path: '/dataManagement'
        {
          text: "实验室运行模块",
          icon: require("../../assets/login/img1.png"),
          path: "/dataManagement/approvalPlan",
        },
        {
          text: '专业报告库',
          icon: require('../../assets/login/img2.png'),
          path: '/reportLibrary'
          text: "专业报告库",
          icon: require("../../assets/login/img2.png"),
          path: "/reportLibrary/feasibilityStudy",
        },
        {
          text: '化验师提交',
          icon: require('../../assets/login/img7.png'),
          path: '/chemistQa'
          text: "化验师提交",
          icon: require("../../assets/login/img7.png"),
          path: "/chemistQa/projectTesting",
        },
        {
          text: '评定模块',
          icon: require('../../assets/login/img4.png'),
          path: '/deliveryAssessment'
        }
          text: "评定模块",
          icon: require("../../assets/login/img4.png"),
          path: "/deliveryAssessment/projectTeamIntegral",
        },
      ],
      // 工艺工程师
      moduleList3: [
        {
          text: '实验室运行模块',
          icon: require('../../assets/login/img1.png'),
          path: '/dataManagement'
          text: "实验室运行模块",
          icon: require("../../assets/login/img1.png"),
          path: "/dataManagement/approvalPlan",
        },
        {
          text: '评定模块',
          icon: require('../../assets/login/img4.png'),
          path: '/deliveryAssessment'
          text: "评定模块",
          icon: require("../../assets/login/img4.png"),
          path: "/deliveryAssessment/projectTeamIntegral",
        },
        {
          text: '专业报告库',
          icon: require('../../assets/login/img2.png'),
          path: '/reportLibrary'
          text: "专业报告库",
          icon: require("../../assets/login/img2.png"),
          path: "/reportLibrary/feasibilityStudy",
        },
        {
          text: '化验师QA专题报告库',
          icon: require('../../assets/login/img7.png'),
          path: '/chemistQa'
        }
          text: "化验师QA专题报告库",
          icon: require("../../assets/login/img7.png"),
          path: "/chemistQa/projectTesting",
        },
      ],
      // 化验师
      moduleList4: [
        {
          text: '实验室运行模块',
          icon: require('../../assets/login/img1.png'),
          path: '/dataManagement'
          text: "实验室运行模块",
          icon: require("../../assets/login/img1.png"),
          path: "/dataManagement/dispatching",
        },
        {
          text: '评定模块',
          icon: require('../../assets/login/img4.png'),
          path: '/deliveryAssessment'
          text: "评定模块",
          icon: require("../../assets/login/img4.png"),
          path: "/deliveryAssessment/projectTeamIntegral",
        },
        {
          text: '专业报告库',
          icon: require('../../assets/login/img2.png'),
          path: '/reportLibrary'
          text: "专业报告库",
          icon: require("../../assets/login/img2.png"),
          path: "/reportLibrary/feasibilityStudy",
        },
        {
          text: '化验师提交',
          icon: require('../../assets/login/img7.png'),
          path: '/chemistQa'
        }
          text: "化验师提交",
          icon: require("../../assets/login/img7.png"),
          path: "/chemistQa/projectTesting",
        },
      ],
      // 实验员
      moduleList5: [
        {
          text: '实验室运行模块',
          icon: require('../../assets/login/img1.png'),
          path: '/dataManagement'
          text: "实验室运行模块",
          icon: require("../../assets/login/img1.png"),
          path: "/dataManagement/dispatching",
        },
        {
          text: '菌种库',
          icon: require('../../assets/login/img8.png'),
          path: '/projectList'
        },
        {
          text: '专业报告库',
          icon: require('../../assets/login/img2.png'),
          path: '/reportLibrary'
        },
        {
          text: '化验师提交',
          icon: require('../../assets/login/img3.png'),
          path: '/chemistQa'
        },
        // {
        //   text: "菌种库",
        //   icon: require("../../assets/login/img8.png"),
        //   path: "/projectList/list",
        // },
        {
          text: '评定模块',
          icon: require('../../assets/login/img4.png'),
          path: '/deliveryAssessment'
          path: '/deliveryAssessment/projectTeamIntegral'
        },
        {
          text: "专业报告库",
          icon: require("../../assets/login/img2.png"),
          path: "/reportLibrary/feasibilityStudy",
        },
        {
          text: "化验师提交",
          icon: require("../../assets/login/img3.png"),
          path: "/chemistQa/projectTesting",
        },
      ],
      // 超级管理员
      moduleList6: [
        {
          text: '实验室运行模块',
          icon: require('../../assets/login/img1.png'),
          path: '/dataManagement'
          text: "实验室运行模块",
          icon: require("../../assets/login/img1.png"),
          path: "/dataManagement/approvalPlan",
        },
        {
          text: '评定模块',
          icon: require('../../assets/login/img4.png'),
          path: '/deliveryAssessment'
          text: "评定模块",
          icon: require("../../assets/login/img4.png"),
          path: "/deliveryAssessment/projectTeamIntegral",
        },
        {
          text: '项目组管理',
          icon: require('../../assets/login/img5.png'),
          path: '/projectList'
          text: "项目组管理",
          icon: require("../../assets/login/img5.png"),
          path: "/projectList/list",
        },
        {
          text: '专业报告库',
          icon: require('../../assets/login/img2.png'),
          path: '/reportLibrary'
          text: "专业报告库",
          icon: require("../../assets/login/img2.png"),
          path: "/reportLibrary/feasibilityStudy",
        },
        {
          text: '化验师提交',
          icon: require('../../assets/login/img7.png'),
          path: '/chemistQa'
          text: "化验师提交",
          icon: require("../../assets/login/img7.png"),
          path: "/chemistQa/projectTesting",
        },
        {
          text: '系统管理',
          icon: require('../../assets/login/img6.png'),
          path: '/system'
        }
      ]
    }
          text: "系统管理",
          icon: require("../../assets/login/img6.png"),
          path: "/system/user",
        },
      ],
    };
  },
  created() {
@@ -229,7 +229,6 @@
  mounted() {
    // 监听窗口大小变化
    window.addEventListener("resize", this.handleResize);
  },
  beforeDestroy() {
    // 组件销毁前移除事件监听
@@ -237,24 +236,24 @@
  },
  methods: {
    onPanelChange(e) {
      console.log('eeeeeee', e)
      console.log("eeeeeee", e);
    },
    // 添加处理窗口大小变化的方法
    handleResize() {
      this.windowWidth = window.innerWidth;
    },
    handleModuleClick(item) {
     if(item.path){
      this.$router.push({
        path: item.path,
      })
     }
      if (item.path) {
        this.$router.push({
          path: item.path,
        });
      }
    },
  },
  computed: {
    currentModuleList() {
      const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
      const userType = userInfo.userType;
      const userInfo = JSON.parse(sessionStorage.getItem("userInfo") || "{}");
      const userType = userInfo.roleType;
      switch (userType) {
        case 2: // 审批人
@@ -272,29 +271,29 @@
      }
    },
    filteredModuleList() {
      return this.currentModuleList.filter(item => item);
      return this.currentModuleList.filter((item) => item);
    },
    currentModuleLayout() {
      const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
      const userType = userInfo.userType;
      const userInfo = JSON.parse(sessionStorage.getItem("userInfo") || "{}");
      const userType = userInfo.roleType;
      switch (userType) {
        case 2: // 审批人
          return 'layout-4';
          return "layout-4";
        case 3: // 工艺工程师
          return 'layout-4';
          return "layout-4";
        case 4: // 化验师
          return 'layout-4';
          return "layout-4";
        case 5: // 实验员
          return 'layout-5';
          return "layout-4";
        case 6: // 超级管理员
          return 'layout-6';
          return "layout-6";
        default:
          return 'layout-6'; // 默认返回化验师的布局
          return "layout-6"; // 默认返回化验师的布局
      }
    }
  }
}
    },
  },
};
</script>
<style scoped lang="less">
.flex {
@@ -313,7 +312,7 @@
  width: 100vw;
  min-height: 100vh;
  /* 确保页面至少和视口一样高,并随内容扩展 */
  background: url('../../assets/login/midBg.png') no-repeat center center;
  background: url("../../assets/login/midBg.png") no-repeat center center;
  background-size: cover;
  display: flex;
  flex-direction: column;
@@ -364,6 +363,7 @@
        .module-item {
          width: 100%;
          height: 307px;
          border-radius: 20px;
        }
      }
@@ -431,6 +431,8 @@
      cursor: pointer;
      transition: all 0.3s ease;
      overflow: hidden;
      border-radius: 20px;
      padding-bottom: 40px;
    }
    .module-bg {
@@ -439,7 +441,7 @@
      left: 0;
      width: 100%;
      height: calc(100% - 75px);
      background: url('../../assets/login/cardBg.png') no-repeat center;
      background: url("../../assets/login/cardBg.png") no-repeat center;
      background-size: cover;
      transition: transform 0.3s ease;
      z-index: 1;
@@ -460,18 +462,20 @@
      display: flex;
      justify-content: center;
      align-items: center;
      background: url('../../assets/login/iconBg.png') no-repeat center;
      background: url("../../assets/login/iconBg.png") no-repeat center;
      background-size: 100% 100%;
      z-index: 2;
      &::before {
        content: '';
        content: "";
        position: absolute;
        left: 0;
        top: 0;
        width: 100%;
        height: 40px;
        background: linear-gradient(to bottom, rgba(255, 255, 255, 0.3) 0%, rgba(255, 255, 255, 0) 100%);
        background: linear-gradient(to bottom,
            rgba(255, 255, 255, 0.3) 0%,
            rgba(255, 255, 255, 0) 100%);
        backdrop-filter: blur(4px);
        -webkit-backdrop-filter: blur(4px);
        pointer-events: none;
@@ -479,13 +483,15 @@
      }
      &::after {
        content: '';
        content: "";
        position: absolute;
        left: 0;
        bottom: 0;
        width: 100%;
        height: 40px;
        background: linear-gradient(to bottom, rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.8) 100%);
        background: linear-gradient(to bottom,
            rgba(255, 255, 255, 0) 0%,
            rgba(255, 255, 255, 0.8) 100%);
        backdrop-filter: blur(4px);
        -webkit-backdrop-filter: blur(4px);
        pointer-events: none;
@@ -514,14 +520,16 @@
      z-index: 3;
      &::after {
        content: '';
        content: "";
        position: absolute;
        left: 50%;
        bottom: -5px;
        bottom: -15px;
        transform: translateX(-50%);
        width: 50%;
        height: 2px;
        background-color: #007bff;
        width: 66px;
        height: 3px;
        background: #24595b;
        border-radius: 1px;
      }
    }
@@ -774,7 +782,7 @@
        .ant-fullcalendar-header {
          .ant-radio-group {
            .ant-radio-button-wrapper {
              background: #FFFFFF;
              background: #ffffff;
              margin: 0 4px;
              color: #666;
@@ -785,7 +793,7 @@
              &.ant-radio-button-wrapper-checked {
                background-color: #009688 !important;
                border-color: #009688 !important;
                color: #FFFFFF !important;
                color: #ffffff !important;
                box-shadow: none !important;
              }
            }
@@ -793,8 +801,8 @@
          .ant-select {
            .ant-select-selection {
              background: #FFFFFF;
              border: 1px solid #EDEDED;
              background: #ffffff;
              border: 1px solid #ededed;
              border-radius: 8px;
              color: #666;
@@ -815,8 +823,8 @@
          .ant-select-dropdown {
            .ant-select-dropdown-menu {
              background: #FFFFFF;
              border: 1px solid #EDEDED;
              background: #ffffff;
              border: 1px solid #ededed;
              border-radius: 8px;
              box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
@@ -825,11 +833,12 @@
                &:hover {
                  background-color: #f0f0f0;
                  // color: #f0f0f0;
                }
                &.ant-select-dropdown-menu-item-selected {
                  background-color: #009688 !important;
                  color: #FFFFFF !important;
                  color: #ffffff !important;
                }
              }
            }
@@ -856,15 +865,15 @@
              margin: 0;
              padding: 0;
              height: 55px;
              background: #FFFFFF;
              background: #ffffff;
              border-radius: 8px;
              border: 1px solid #EDEDED;
              border: 1px solid #ededed;
              display: flex;
              justify-content: center;
              align-items: center;
              &:hover {
                background-color: rgba(4, 156, 154, .1);
                background-color: rgba(4, 156, 154, 0.1);
              }
              .ant-fullcalendar-value {
@@ -885,21 +894,40 @@
            &.ant-fullcalendar-today .ant-fullcalendar-date {
              // border-color: #009688;
            }
            &.ant-fullcalendar-last-month-cell {
              .ant-fullcalendar-value {
                color: #ffffff !important;
              }
            }
            &.ant-fullcalendar-next-month-btn-day {
              .ant-fullcalendar-date {}
              .ant-fullcalendar-value {
                color: #ffffff !important;
                &:hover {
                  // background: #FFFFFF;
                  color: rgba(4, 156, 154, 0.1) !important;
                }
              }
            }
          }
        }
        .ant-fullcalendar-month-panel-selected-cell {
          .ant-fullcalendar-month {
            border-top-color: #009688 !important;
            background: rgba(4, 156, 154, .2);
            background: rgba(4, 156, 154, 0.2);
            .ant-fullcalendar-value {
              color: #FFFFFF;
              color: #ffffff;
            }
            :hover {
              .ant-fullcalendar-month {
                background: rgba(4, 156, 154, .2);
                background: rgba(4, 156, 154, 0.2);
              }
            }
          }
@@ -911,7 +939,7 @@
            :hover {
              .ant-fullcalendar-month {
                background: rgba(4, 156, 154, .2);
                background: rgba(4, 156, 154, 0.2);
              }
            }
          }
@@ -919,7 +947,7 @@
        .ant-fullcalendar-month-panel-cell {
          .ant-fullcalendar-month:hover {
            background: rgba(4, 156, 154, .2);
            background: rgba(4, 156, 154, 0.2);
          }
        }
      }
@@ -955,7 +983,7 @@
        display: flex;
        align-items: center;
        justify-content: space-between;
        margin-bottom: 20PX;
        margin-bottom: 20px;
        /* 分隔线 */
        &:first-child {
@@ -970,7 +998,6 @@
        .notice-card {
          position: relative;
          margin-right: 12px;
        }
        .todo-icon {
@@ -978,10 +1005,9 @@
          width: 24px;
          height: 24px;
          flex-shrink: 0;
          background: url('../../assets//login/notice.png') no-repeat center;
          background: url("../../assets//login/notice.png") no-repeat center;
          background-position: center;
          background-size: 100% 100%;
        }
        .red-notice {
@@ -1013,7 +1039,7 @@
          margin-right: 6px;
          margin-left: 20px;
          flex-shrink: 0;
          background: url('../../assets//login/time.png') no-repeat center;
          background: url("../../assets//login/time.png") no-repeat center;
          background-position: center;
          background-size: 100% 100%;
        }
@@ -1023,7 +1049,7 @@
          height: 14px;
          margin-right: 6px;
          flex-shrink: 0;
          background: url('../../assets//login/mi.png') no-repeat center;
          background: url("../../assets//login/mi.png") no-repeat center;
          background-position: center;
          background-size: 100% 100%;
        }
laboratory/src/views/projectList/addProject.vue
@@ -23,7 +23,7 @@
                        <div :class="item == 1 || item == 2 ? 'member-name-box' : 'member-name-box-2'">
                            <el-tooltip v-for="i in memberList(item)" :key="i.userId" class="member-name" effect="dark"
                                :content="i.nickName" placement="top">
                                <span>{{ i.nickName }}</span>
                                <span style="overflow: hidden;width: 60px; display: block;padding: 0 7px;">{{ i.nickName }}</span>
                            </el-tooltip>
                        </div>
                        <div class="member-edit" v-if="memberList(item).length != 0" @click="editUserList">修改</div>
@@ -76,7 +76,7 @@
                        personCharge: this.form.personCharge,
                        staffs: this.selectMemberData.map(member => ({
                            userId: member.userId,
                            roleType: ROLE_NAME_TO_TYPE[member.roleName]
                            roleType: member.roleType
                        }))
                    }
                    addProject(data).then(res => {
@@ -113,6 +113,7 @@
                    return
                }
            }
            console.log('data data data',data)
            this.selectMemberData = data;
            this.$refs.selectMember.close();
        },