zhangwei
8 天以前 03c275439949875a857538df89a41696642c42b3
src/views/home/index.vue
@@ -1,103 +1,49 @@
<template>
  <div class="header">
    <img width="227px" height="74px" src="@/assets/home/logo.png" alt="" />
    <img width="427px" height="74px" src="@/assets/home/Header.png" alt="" />
    <div class="other">
      <div class="item">
        <img width="21px" height="21px" src="@/assets/home/share.png" alt="" />
        <span>分享网站</span>
      </div>
      <div class="item">
        <img
          width="21px"
          height="21px"
          src="@/assets/home/BellFilled.png"
          alt=""
        />
        <span>我的消息</span>
      </div>
    </div>
  </div>
  <div class="banner">
    <!-- <img width="100%" height="306px" src="@/assets/home/banner.png" alt="" /> -->
  </div>
  <my-header />
  <div class="notice">
    <div class="left">
      <div class="item item1">
        <img src="@/assets/home/notice1.png" alt="" />
        <div>招采公告</div>
      </div>
      <div class="item">
        <img src="@/assets/home/notice.png" alt="" />
        <div>更正公告</div>
      </div>
      <div class="item">
        <img src="@/assets/home/notice.png" alt="" />
        <div>结果公告</div>
      </div>
      <div class="item">
        <img src="@/assets/home/notice.png" alt="" />
        <div>其他公告</div>
      <div
        v-for="(item, index) in state.gonggaoList"
        :key="index"
        :class="['item', stateHook.active == index ? 'item1' : '']"
        @click="getShouyeOrder(index)"
      >
        <img
          v-if="stateHook.active == index"
          src="@/assets/home/notice1.png"
          alt=""
        />
        <img v-else src="@/assets/home/notice.png" alt="" />
        <div>{{ item.name }}</div>
      </div>
    </div>
    <div class="right">
      <el-tabs v-model="activeName" class="demo-tabs">
        <el-tab-pane label="工程招标" name="first">
          工程招标
          <!-- <div class="item">
            <span
              ><span style="color: #145ccd; font-weight: 600">·</span
              >【四川省成都市】2024年石盘街道付家祠村粮油产业园区及配套基础设施建设项目磋商公告</span
            >
            <span>2024-04-15 18:10</span>
          </div>
          <div class="item">
            <span
              ><span style="color: #145ccd; font-weight: 600">·</span
              >【四川省成都市】熊猫谷游客中心局部改造项目磋商公告</span
            >
            <span>2024-04-15 18:10</span>
          </div>
          <div class="item">
            <span
              ><span style="color: #145ccd; font-weight: 600">·</span
              >【四川省成都市】丹景街道民湖社区红白喜事服务场所磋商公告</span
            >
            <span>2024-04-15 18:10</span>
          </div>
          <div class="item">
            <span
              ><span style="color: #145ccd; font-weight: 600">·</span
              >【四川省成都市】成都东部新区三岔湖高级中学体艺中心前临时停车区和正校门两侧门卫室间区域黑化及排水提升解除内涝项目磋商公告</span
            >
            <span>2024-04-15 18:10</span>
          </div>
          <div class="item">
            <span
              ><span style="color: #145ccd; font-weight: 600">·</span
              >【四川省成都市】四川省成都戒毒康复所病残戒毒人员康复活动中心维修改造项目第二次磋商公告</span
            >
            <span>2024-04-15 18:10</span>
          </div>
          <div class="item">
            <span
              ><span style="color: #145ccd; font-weight: 600">·</span
              >【四川省成都市】老干部活动中心装修改造项目磋商公告</span
            >
            <span>2024-04-15 18:10</span>
          </div>
          <div class="item">
            <span
              ><span style="color: #145ccd; font-weight: 600">·</span
              >【四川省成都市】金牛区抢险救灾工程项目工程队伍储备库(房建、市政类)招标公告</span
            >
            <span>2024-04-15 18:10</span>
          </div> -->
        </el-tab-pane>
        <el-tab-pane label="货物招标" name="second">货物招标</el-tab-pane>
        <el-tab-pane label="服务招标" name="third">服务招标</el-tab-pane>
        <el-tab-pane label="网上竞价" name="fourth">网上竞价</el-tab-pane>
      </el-tabs>
      <!-- <el-tabs v-model="activeName" class="demo-tabs">
        <el-tab-pane label="意向公开" name="first">
          意向公开 -->
      <div
        v-for="item in stateHook.shouyeOrderList"
        :key="item.id"
        class="item"
        @click="goDetail(item.tenderId ?? item.id)"
      >
        <span>
          <span style="color: #145ccd; font-weight: 600">·</span>
          {{
            item.xingzhengquyuName &&
            `【${item.xingzhengquyuName.match(/^.*?市/)}】`
          }}
          {{ item.projectName }}
        </span>
        <span>{{ item.createTime }}</span>
      </div>
      <!-- </el-tab-pane>
        <el-tab-pane label="工程招标" name="second">工程招标</el-tab-pane>
        <el-tab-pane label="货物招标" name="third">货物招标</el-tab-pane>
        <el-tab-pane label="服务招标" name="fourth">服务招标</el-tab-pane>
        <el-tab-pane label="网上竞价" name="fourth1">网上竞价</el-tab-pane>
      </el-tabs> -->
    </div>
  </div>
  <div class="daixie">
@@ -139,7 +85,7 @@
  <div class="user">
    <div class="all">
      <div class="left">
        <div class="item item1">
        <div v-for="item in state.roleList" :key="item.id" class="item item1">
          <div class="box">
            <img
              width="18px"
@@ -147,60 +93,55 @@
              src="@/assets/home/car1.png"
              alt=""
            />
            采购人/招标人
            {{ item.name }}
          </div>
          <div>注册<span class="m-2">|</span>登录</div>
        </div>
        <div class="item">
          <div class="box">
            <img
              width="18px"
              height="18px"
              src="@/assets/home/car.png"
              alt=""
            />
            采购人
          <div>
            <el-link
              v-if="state.rolesCode.indexOf(item.code) !== -1"
              :underline="false"
              class="hover:cursor-pointer"
              @click="logOut"
              >退出</el-link
            >
            <el-link
              v-else-if="!state.accessToken"
              :underline="false"
              class="hover:cursor-pointer"
              @click="toRegister(item)"
              >注册</el-link
            >
            <el-link
              v-else
              :underline="false"
              class="hover:cursor-pointer"
              @click="toApply(item)"
              ><span v-if="item.name !== '评审专家'">申请</span></el-link
            ><span
              v-if="!state.accessToken || item.name !== '评审专家'"
              class="m-2"
              >|</span
            >
            <el-link
              v-if="state.rolesCode.indexOf(item.code) !== -1"
              :underline="false"
              class="hover:cursor-pointer"
              @click="toWelcome(item)"
              >进入</el-link
            >
            <el-link
              v-else
              :underline="false"
              class="hover:cursor-pointer"
              :disabled="!!state.accessToken"
              @click="toLogin(item)"
              >登录</el-link
            >
          </div>
          <div>注册<span class="m-2">|</span>登录</div>
        </div>
        <div class="item">
          <div class="box">
            <img
              width="18px"
              height="18px"
              src="@/assets/home/car.png"
              alt=""
            />招标代理机构
          </div>
          <div>注册<span class="m-2">|</span>登录</div>
        </div>
        <div class="item">
          <div class="box">
            <img
              width="18px"
              height="18px"
              src="@/assets/home/car.png"
              alt=""
            />供应商
          </div>
          <div>注册<span class="m-2">|</span>登录</div>
        </div>
        <div class="item">
          <div class="box">
            <img
              width="18px"
              height="18px"
              src="@/assets/home/car.png"
              alt=""
            />评审专家
          </div>
          <div>注册<span class="m-2">|</span>登录</div>
        </div>
      </div>
      <div class="right" />
    </div>
  </div>
  <div class="more">
    <div class="content">
      <div class="item">
@@ -392,72 +333,140 @@
  <my-footer />
</template>
<script lang="ts" setup>
import { ref } from "vue";
import myFooter from "./component/myFooter.vue";
<script lang="tsx" setup>
import { onMounted, ref, computed, reactive } from "vue";
import MyFooter from "./component/myFooter.vue";
import MyHeader from "./component/myHeader.vue";
import { useUserStoreHook } from "@/store/modules/user";
import { exRole } from "@/api/register/index";
import { storageLocal, isString, isIncludeAllChildren } from "@pureadmin/utils";
import { initRouter, getTopMenu } from "@/router/utils";
import { useIndex } from "../home/utils/hook";
import { getToken } from "@/utils/auth";
import { useRoute, useRouter } from "vue-router";
const router = useRouter();
import { useUserStore } from "@/store/modules/user";
import { addDialog } from "@/components/ReDialog";
import { applyRole } from "@/api/register/index";
import { message } from "@/utils/message";
import type { userType } from "@/store/types";
import type { RoleItem } from "@/api/types";
const userStore = useUserStore();
const { stateHook, getShouyeOrder, goDetail } = useIndex();
// 访问 state 属性
// console.log(userStore.roles,'-'); // 直接获取值
defineOptions({
  name: "MainPage"
});
let activeName = ref("first");
/** 角色(如果昵称为空则显示用户名) */
const getUseRoles = () => {
  state.userInfo = storageLocal().getItem("user-info");
  state.userInfo?.exRoles.forEach((element: RoleItem) => {
    state.rolesCode.push(element.code);
  });
};
const state = reactive({
  roleList: [],
  rolesCode: [],
  userInfo: {} as userType,
  accessToken: "",
  gonggaoList: [
    { name: "招采公告" },
    { name: "更正公告" },
    { name: "结果公告" }
    // { name: "其他公告" }
  ]
});
onMounted(() => {
  // exRole().then(res => {
  //   state.roleList = res.result;
  // });
  getShouyeOrder(0);
  state.roleList = useUserStoreHook().rolesList;
  getUseRoles();
  state.accessToken = getToken()?.accessToken;
});
const toRegister = item => {
  router.push({ name: "newRegister", query: { code: item.code } });
};
// 退出
const logOut = () => {
  useUserStoreHook().logOut();
  state.rolesCode = [];
  state.accessToken = "";
};
// 申请
const toApply = item => {
  addDialog({
    width: "20%",
    title: "确认信息",
    contentRenderer: () => <p>是否申请为{item.name}!</p>, // jsx 语法 (注意在.vue文件启用jsx语法,需要在script开启lang="tsx")
    closeCallBack: ({ options, args }) => {
      if (args?.command === "cancel") {
        // 您点击了取消按钮
      } else if (args?.command === "sure") {
        applyRole({ ruleCode: item.code }).then(res => {
          if (res.code == 200) {
            message("申请成功!", { type: "success" });
          } else {
            message(res?.message || "申请失败!", { type: "error" });
          }
        });
      } else {
      }
    }
  });
  // router.push({ name: "RegisterNav", query: { code: item.code } });
};
// 去首页
const toWelcome = async item => {
  // if (useUserStoreHook().nowRole.code !== item.code) {
  // 获取后端路由
  useUserStoreHook()
    .changeLogoInExRule({
      ruleCode: item.code
    })
    .then(res => {
      initRouter().then(() => {
        let path = getTopMenu(true);
        router.push({ name: path.name });
      });
    });
  // }
};
// 去登录
const toLogin = item => {
  router.push({ name: "Login" });
};
</script>
<style lang="scss" scoped>
.header {
  display: flex;
  align-items: center;
  justify-content: space-evenly;
  height: 80px;
  width: 100%;
  .middle {
    width: 50%;
    display: flex;
    justify-content: space-around;
    color: rgb(51, 51, 51);
    font-family: 思源黑体;
  }
  .other {
    display: flex;
    .item {
      display: flex;
      justify-content: center;
      width: 63px;
      height: 48px;
      color: rgb(51, 51, 51);
      font-family: 思源黑体;
      font-size: 12px;
      font-weight: 400;
      line-height: 20px;
      letter-spacing: 0%;
      text-align: left;
      text-transform: capitalize;
      flex-wrap: wrap;
      margin-right: 10px;
    }
  }
}
.banner {
  //   left: -3.76px;
  //   top: 80px;
  //   position: absolute;
  background: url("@/assets/home/banner.png") no-repeat left center;
  background-size: cover;
  width: 100%;
  height: 306px;
}
.notice {
  box-sizing: border-box;
  display: flex;
  justify-content: space-between;
  width: 72%;
  height: 518px;
  height: 400px;
  padding: 15px;
  margin: 20px auto;
  background: rgb(254, 254, 254);
  border-radius: 8px;
  box-shadow: rgba(149, 157, 165, 0.2) 0px 8px 24px;
  box-shadow:
    rgba(149, 157, 165, 0.15) 0px -6px 18px,
    rgba(149, 157, 165, 0.2) 0px 8px 24px;
  .left {
    width: 10%;
    height: 483px;
    height: 100%;
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
    justify-content: space-around;
    align-content: space-between;
    .item {
      width: 137px;
      height: 111px;
@@ -500,12 +509,12 @@
      padding: 0 10px;
    }
    /* 偶数行背景色 */
    .item:nth-child(even) {
    .item:nth-child(odd) {
      background: rgb(244, 244, 244);
      border-radius: 4px;
    }
    /* 奇数行背景色 */
    .item:nth-child(odd) {
    .item:nth-child(even) {
      padding: 8px;
      background-color: #fff;
    }
@@ -518,7 +527,7 @@
  padding: 40px 0;
  .all {
    width: 72%;
    height: 482px;
    height: 385px;
    background: #fff;
    margin: 0 auto;
    display: flex;
@@ -535,9 +544,12 @@
        justify-content: space-between;
        align-items: center;
        padding: 0 30px;
        height: 20%;
        height: 23%;
        text-align: left;
        color: #5f5f5f;
        // box-shadow: rgba(149, 157, 165, 0.2) 0px 8px 24px;
        border-radius: 6px;
        margin-bottom: 10px;
        .box {
          display: flex;
          justify-content: center;
@@ -552,13 +564,13 @@
        color: #ffffff;
      }
    }
    .left :first-child {
      border-top-left-radius: 8px;
      border-top-right-radius: 8px;
    }
    .left *:not(:first-child):not(:last-child) {
      border-bottom: #c6c6c6 1px solid;
    }
    // .left :first-child {
    //   border-top-left-radius: 8px;
    //   border-top-right-radius: 8px;
    // }
    // .left *:not(:first-child):not(:last-child) {
    //   border-bottom: #c6c6c6 1px solid;
    // }
    .right {
      background: #a9b3c4;
      width: 75%;
@@ -704,4 +716,18 @@
    border-radius: 4px;
  }
}
a {
  font-size: 16px;
  // font-weight: 600;
  color: #fff;
}
a:hover,
a:active {
  color: #fff;
}
.el-link.is-disabled {
  color: #a8abb2;
  cursor: not-allowed;
}
</style>