Explorar el Código

修改孵化基地显示 首页

zs hace 8 meses
padre
commit
9b669882ad

BIN
public/images/111.jpg


BIN
public/images/222.jpg


BIN
public/images/333.jpg


BIN
public/images/444.jpg


BIN
public/images/555.jpg


+ 12 - 0
src/router/index.js

@@ -162,6 +162,18 @@ const router = createRouter({
       meta: { title: '产学研用协同创新数字化平台-企业详情' },
       component: () => import('@/views/detail/companyDetail.vue')
     },
+    {
+      path: '/base',
+      name: 'base',
+      meta: { title: '产学研用协同创新数字化平台-孵化基地列表' },
+      component: () => import('@/views/detail/base.vue')
+    },
+    {
+      path: '/base/detail',
+      name: 'baseDetail',
+      meta: { title: '产学研用协同创新数字化平台-孵化基地详情' },
+      component: () => import('@/views/detail/baseDetail.vue')
+    },
     {
       path: '/platform/detail',
       name: 'platformDetail',

+ 5 - 0
src/store/api/user/incubator.js

@@ -17,6 +17,10 @@ export const IncubatorStore = defineStore('incubator', () => {
     const res = await axios.$get(`${url}/${payload}`)
     return res
   }
+  const detail = async (payload) => {
+    const res = await axios.$get(`${url}/detail/${payload}`)
+    return res
+  }
   const create = async (payload) => {
     const res = await axios.$post(`${url}`, payload)
     return res
@@ -32,6 +36,7 @@ export const IncubatorStore = defineStore('incubator', () => {
   }
   return {
     query,
+    detail,
     fetch,
     create,
     update,

+ 7 - 0
src/views/center/attestation.vue

@@ -55,6 +55,8 @@ import { UsersStore } from '@/store/api/user/user'
 const store = UsersStore()
 import { DictDataStore } from '@/store/api/system/dictData'
 import { RegionStore } from '@/store/api/system/region'
+import { SectorStore } from '@/store/api/platform/sector'
+const sectorStore = SectorStore()
 const dictDataStore = DictDataStore()
 const regionStore = RegionStore()
 
@@ -74,6 +76,7 @@ const scaleList = ref([])
 const IndustryList = ref([])
 const cardTypeList = ref([])
 const contributionList = ref([])
+const plateList = ref([])
 // 请求
 onMounted(async () => {
   loading.value = true
@@ -122,6 +125,9 @@ const searchOther = async () => {
   // 城市
   result = await regionStore.area({ level: 'province', code: 22 })
   if ($checkRes(result)) cityList.value = result.data
+  // 板块
+  result = await sectorStore.query({ is_use: '0' })
+  if ($checkRes(result)) plateList.value = result.data
 }
 const search = async () => {
   if (user.value.id) {
@@ -143,6 +149,7 @@ provide('scaleList', scaleList)
 provide('IndustryList', IndustryList)
 provide('cardTypeList', cardTypeList)
 provide('contributionList', contributionList)
+provide('plateList', plateList)
 </script>
 <style scoped lang="scss">
 .main {

+ 1 - 0
src/views/center/collection.vue

@@ -115,6 +115,7 @@ const toView = (data) => {
   if (data.type == 'project') router.push({ path: '/project/detail', query: { id: data.source } })
   if (data.type == 'support') router.push({ path: '/service/detail', query: { id: data.source } })
   if (data.type == 'supply') router.push({ path: '/supply/detail', query: { id: data.source } })
+  if (data.type == 'incubator') router.push({ path: '/base/detail', query: { id: data.source } })
 }
 // 删除
 const toDelete = (data) => {

+ 46 - 8
src/views/center/parts/incubator.vue

@@ -1,6 +1,11 @@
 <template>
   <div class="index">
     <el-form ref="ruleFormRef" :model="form" :rules="rules" label-width="auto" class="form" label-position="left">
+      <el-row>
+        <el-form-item label="Logo" prop="logo">
+          <custom-upload model="logo" :list="form.logo" :limit="1" url="/files/web/cxyy_incubator/upload" @change="onUpload" listType="picture-card"></custom-upload>
+        </el-form-item>
+      </el-row>
       <el-row :gutter="20">
         <el-col :span="12">
           <el-form-item label="孵化基地名称" prop="name">
@@ -27,14 +32,37 @@
           </el-form-item>
         </el-col>
       </el-row>
-      <el-col :span="24">
-        <el-form-item label="地址" prop="address">
-          <el-input size="large" v-model="form.address" :autosize="{ minRows: 2, maxRows: 4 }" type="textarea" placeholder="请输入地址" />
-        </el-form-item>
-      </el-col>
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="所属行业" prop="industry">
+            <el-select size="large" clearable v-model="form.industry" placeholder="请选择所属行业">
+              <el-option v-for="(item, index) in plateList" :key="index" :label="item.title" :value="item.title" />
+            </el-select>
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="是否和平台合作标识" prop="cooperate">
+            <el-radio-group v-model="form.cooperate">
+              <el-radio v-for="i in isUseList" :key="i.id" :label="i.value">{{ i.label }}</el-radio>
+            </el-radio-group>
+          </el-form-item>
+        </el-col>
+      </el-row>
+      <el-row :gutter="20">
+        <el-col :span="12">
+          <el-form-item label="所在地区" prop="area">
+            <el-cascader size="large" v-model="form.area" :props="{ value: 'name', label: 'name' }" :options="cityList" clearable placeholder="请选择所在地区" style="width: 100%" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12">
+          <el-form-item label="地址" prop="address">
+            <el-input size="large" v-model="form.address" :autosize="{ minRows: 2, maxRows: 4 }" type="textarea" placeholder="请输入地址" />
+          </el-form-item>
+        </el-col>
+      </el-row>
       <el-col :span="24">
         <el-form-item label="简介" prop="brief">
-          <el-input size="large" v-model="form.brief" :autosize="{ minRows: 2, maxRows: 4 }" type="textarea" placeholder="请输入简介" />
+          <WangEditor v-model="form.brief" />
         </el-form-item>
       </el-col>
       <el-col :span="24" class="button">
@@ -55,10 +83,12 @@ const user = computed(() => userStore.user)
 const ruleFormRef = ref()
 // 字典表
 const isUseList = inject('isUseList')
+const plateList = inject('plateList')
+const cityList = inject('cityList')
 // 接口
 import { IncubatorStore } from '@/store/api/user/incubator'
 const incubatorStore = IncubatorStore()
-const form = ref({})
+const form = ref({ logo: [] })
 const rules = reactive({
   // nick_name: [{ required: true, message: '请输入昵称', trigger: 'blur' }],
   // gender: [{ required: true, message: '请选择性别', trigger: 'blur' }],
@@ -67,6 +97,11 @@ const rules = reactive({
   // password: [{ required: true, message: '请输入密码', trigger: 'blur' }],
   // refpassword: [{ required: true, validator: validatePassword, trigger: 'blur' }]
 })
+// 上传图片
+const onUpload = (e) => {
+  const { model, value } = e
+  form.value[model] = value
+}
 // 注册
 const submitForm = async (formEl) => {
   if (!formEl) return
@@ -92,7 +127,10 @@ onMounted(async () => {
 const search = async () => {
   if (user.value.id) {
     let res = await incubatorStore.query({ user: user.value.id })
-    if (res.errcode == '0') form.value = res.data[0] || {}
+    if (res.errcode == '0') {
+      if (!res.data[0].logo) res.data[0].logo = []
+      form.value = res.data[0] || { logo: [] }
+    }
   }
 }
 </script>

+ 435 - 0
src/views/detail/base.vue

@@ -0,0 +1,435 @@
+<template>
+  <custom-layout class="main">
+    <el-col :span="24" class="one">
+      <el-image class="image" :src="lists" fit="fill" />
+    </el-col>
+    <div class="w_1300">
+      <el-col :span="24" class="two">
+        <div class="Seacher">
+          <div class="Left">
+            <span>行业</span>
+          </div>
+          <div v-if="!oneShow" class="Right">
+            <div class="label" :class="[item.is_active ? 'show' : '']" v-for="(item, index) in plateList.slice(0, 6)" :key="index" @click="toSelect(item, '1')">
+              {{ item.title }}
+            </div>
+          </div>
+          <div v-else class="Right">
+            <div class="label" :class="[item.is_active ? 'show' : '']" v-for="(item, index) in plateList" :key="index" @click="toSelect(item, '1')">
+              {{ item.title }}
+            </div>
+          </div>
+          <div class="button">
+            <span v-if="!oneShow" @click="oneShow = true">
+              <el-icon><ArrowDown /></el-icon>
+            </span>
+            <span v-else @click="oneShow = false">
+              <el-icon><ArrowUp /></el-icon>
+            </span>
+          </div>
+        </div>
+        <div class="Seacher border">
+          <div class="Left">
+            <span>所在地</span>
+          </div>
+          <div class="Right">
+            <div class="label" :class="[item.is_active ? 'show' : '']" v-for="(item, index) in cityList" :key="index" @click="toSelect(item, '3')">
+              {{ item.name }}
+            </div>
+          </div>
+        </div>
+        <div class="two_ipunt">
+          <el-input class="input" size="large" v-model="searchForm.name" placeholder="名称" />
+          <el-input class="input" size="large" v-model="searchForm.tags" placeholder="标签名称" />
+          <el-button class="button" size="large" type="primary" @click="toSearchInfo">检索</el-button>
+        </div>
+      </el-col>
+      <div class="thr">
+        <div class="list" v-for="(item, index) in list" :key="index" @click="toView(item)">
+          <div class="name">{{ item.name || '暂无' }}</div>
+          <div class="other">
+            <div class="other_1">
+              <el-image class="image" :src="getUrl(item.logo)" fit="fill">
+                <template v-slot:error>
+                  <el-image class="image" :src="companyLogo" fit="fill" />
+                </template>
+              </el-image>
+            </div>
+            <div class="other_2">
+              <span class="text"><em>负责人姓名:</em>{{ item.person || '暂无' }}</span>
+              <span class="text"><em>是否和平台合作标识:</em>{{ getDict(item.cooperate, 'cooperate') || '暂无' }}</span>
+              <span class="text"><em>地址:</em>{{ getArea(item.area) || '暂无' }}</span>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="four">
+        <el-pagination background layout="prev, pager, next" :total="total" :page-size="limit" v-model:current-page="currentPage" @current-change="changePage" @size-change="sizeChange" />
+      </div>
+    </div>
+  </custom-layout>
+</template>
+
+<script setup>
+// 图片引入
+import lists from '/images/company.png'
+const $checkRes = inject('$checkRes')
+import { get } from 'lodash-es'
+// 接口
+import { IncubatorStore } from '@/store/api/user/incubator'
+import { RegionStore } from '@/store/api/system/region'
+import { SectorStore } from '@/store/api/platform/sector'
+import { DictDataStore } from '@/store/api/system/dictData'
+const store = IncubatorStore()
+const regionStore = RegionStore()
+const sectorStore = SectorStore()
+const dictDataStore = DictDataStore()
+// 加载中
+const loading = ref(false)
+// 路由
+const router = useRouter()
+const list = ref([])
+let skip = 0
+let limit = 15
+const total = ref(0)
+// 是否展开
+const oneShow = ref(false)
+// 字典表
+const cityList = ref([])
+const plateList = ref([])
+const isUseList = ref([])
+// 搜索
+const searchForm = ref({})
+// 查询
+const industry = ref([])
+const city = ref([])
+// 请求
+onMounted(async () => {
+  loading.value = true
+  await searchOther()
+  await search({ skip, limit })
+  loading.value = false
+})
+const searchOther = async () => {
+  let result
+  // 是否使用
+  result = await dictDataStore.query({ code: 'isUse', is_use: '0' })
+  if ($checkRes(result)) isUseList.value = result.data
+  // 城市
+  result = await regionStore.list({ level: 'city', parent_code: 22 })
+  if ($checkRes(result)) cityList.value = result.data
+  cityList.value.unshift({ id: '-1', code: '-1', name: '不限', is_active: true })
+  // 行业
+  result = await sectorStore.query({ is_use: '0' })
+  if ($checkRes(result)) plateList.value = result.data
+  plateList.value.unshift({ id: '-1', title: '不限', is_active: true })
+}
+const search = async (query = { skip, limit }) => {
+  skip = query.skip
+  limit = query.limit
+  const info = {
+    skip: query.skip,
+    limit: query.limit,
+    status: '1',
+    is_show: '0',
+    ...searchForm.value
+  }
+  const res = await store.query(info)
+  if (res.errcode == '0') {
+    list.value = res.data
+    total.value = res.total
+  }
+}
+// 查看
+const toView = (item) => {
+  router.push({ path: `/base/detail`, query: { id: item.id || item._id } })
+}
+const getUrl = (item) => {
+  if (item && item.length > 0) return `${import.meta.env.VITE_APP_HOST}${item[0].uri}`
+}
+// 地区
+const getArea = (data) => {
+  if (data) return data.join('-')
+  else return '暂无地区'
+}
+// 字典数据转换
+const getDict = (data, model) => {
+  let res
+  if (model == 'cooperate') res = isUseList.value.find((f) => f.value == data)
+  return get(res, 'label')
+}
+const currentPage = ref(1)
+// 分页
+const changePage = (page = currentPage.value) => {
+  search({ skip: (page - 1) * limit, limit: limit })
+}
+const sizeChange = (limits) => {
+  limit = limits
+  currentPage.value = 1
+  search({ skip: 0, limit: limit })
+}
+// 筛选条件
+const toSearchFind = async () => {
+  if (industry.value && industry.value.length > 0) {
+    searchForm.value.industry = industry.value.map((i) => {
+      return i.title
+    })
+  } else delete searchForm.value.industry
+  if (city.value && city.value.length > 0) {
+    searchForm.value.area = city.value.map((i) => {
+      return i.name
+    })
+  } else delete searchForm.value.area
+
+  await search({ skip, limit })
+}
+const toSelect = async (data, type) => {
+  if (data.is_active) {
+    toDel(data, type)
+  } else {
+    if (data.id != '-1') {
+      if (type == '1') {
+        for (const val of plateList.value) {
+          if (data.id == val.id) val.is_active = true
+          if (val.id == '-1') val.is_active = false
+        }
+        const res = industry.value.find((i) => i.id == data.id)
+        if (!res) industry.value.push(data)
+      } else {
+        for (const val of cityList.value) {
+          if (data.id == val.id) val.is_active = true
+          if (val.id == '-1') val.is_active = false
+        }
+        const res = city.value.find((i) => i.id == data.id)
+        if (!res) city.value.push(data)
+      }
+    } else {
+      if (type == '1') {
+        for (const val of plateList.value) {
+          if (val.id == '-1') val.is_active = true
+          else val.is_active = false
+        }
+        industry.value = []
+      } else {
+        for (const val of cityList.value) {
+          if (val.id == '-1') val.is_active = true
+          else val.is_active = false
+        }
+        city.value = []
+      }
+    }
+  }
+  await toSearchFind()
+}
+const toDel = async (data, type) => {
+  if (type == '1') {
+    for (const val of plateList.value) {
+      if (data.id == val.id) val.is_active = false
+    }
+    industry.value = industry.value.filter((f) => f.id != data.id)
+    if (industry.value.length == 0) {
+      for (const val of plateList.value) {
+        if (val.id == '-1') val.is_active = true
+      }
+    }
+  } else {
+    for (const val of cityList.value) {
+      if (data.id == val.id) val.is_active = false
+    }
+    city.value = city.value.filter((f) => f.id != data.id)
+    if (city.value.length == 0) {
+      for (const val of cityList.value) {
+        if (val.id == '-1') val.is_active = true
+      }
+    }
+  }
+  await toSearchFind()
+}
+</script>
+<style scoped lang="scss">
+.main {
+  .one {
+    .image {
+      width: 100%;
+      height: 350px;
+    }
+  }
+  .active {
+    .active_1 {
+      display: inline-flex;
+      background: #f5f7f9;
+      border-radius: 2px;
+      min-height: 28px;
+      line-height: 28px;
+      margin: 0 10px 0 0;
+      position: relative;
+      background-color: #fff;
+      padding: 10px;
+      .active_left {
+        flex: 0 0 auto;
+        font-family: PingFangSC-Regular;
+        color: #525a68;
+        line-height: 36px;
+      }
+      .active_right {
+        font-family: PingFangSC-Regular;
+        color: rgba(0, 0, 0, 0.85);
+        line-height: 28px;
+        padding-right: 4px;
+        display: flex;
+        flex-wrap: wrap;
+        overflow: hidden;
+        .active_label {
+          overflow: hidden;
+          display: inline-block;
+          margin-right: 10px;
+          margin-top: 3px;
+          margin-bottom: 3px;
+          padding: 10px;
+          display: flex;
+          align-items: center;
+          flex: none;
+          box-sizing: border-box;
+          max-width: 100%;
+          height: 30px;
+          background: #f5f5f5;
+          border: 1px solid #f0f0f0;
+          border-radius: 2px;
+          cursor: default;
+        }
+      }
+    }
+  }
+  .two {
+    margin: 10px 0 0 0;
+    .Seacher {
+      display: flex;
+      justify-content: center;
+      align-items: stretch;
+      position: relative;
+      border: solid 1px #e5e5e5;
+      border-bottom: 0;
+      font-size: $global-font-size-18;
+      color: #666;
+      min-height: 60px;
+      overflow: hidden;
+      .Left {
+        display: flex;
+        justify-content: center;
+        align-items: center;
+        flex-shrink: 0;
+        width: 110px;
+        text-align: center;
+        color: #000;
+        font-weight: bold;
+        background-color: #fafafa;
+      }
+      .Right {
+        display: flex;
+        flex-wrap: wrap;
+        align-items: center;
+        padding: 12px;
+        flex: 1;
+        border-left: solid 1px #e5e5e5;
+        background-color: #fff;
+        .label {
+          margin-right: 3px;
+          color: #313131;
+          margin-bottom: 10px;
+          padding: 8px 10px;
+          border-radius: 3px;
+          background-color: #fff;
+          border: solid 1px transparent;
+          cursor: pointer;
+        }
+        .show {
+          color: #0a58c2;
+          border: solid 1px #006dd2;
+        }
+        .label:hover {
+          color: $global-color-107;
+        }
+      }
+      .button {
+        display: flex;
+        align-items: center;
+        margin: 0 5px 0 0;
+      }
+    }
+    .border {
+      border: solid 1px #e5e5e5;
+      border-bottom: 1;
+    }
+    .two_ipunt {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      margin: 10px 0;
+      .input {
+        margin: 0 5px 0 0;
+      }
+      .button {
+        margin: 0 0 0 5px;
+      }
+    }
+  }
+  .thr {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-wrap: wrap;
+    .list {
+      float: left;
+      width: 405px;
+      padding: 15px;
+      margin: 0 10px 25px 10px;
+      background: #f0f8ff;
+      color: #000;
+      cursor: default;
+      .name {
+        height: 57px;
+        line-height: 57px;
+        overflow: hidden;
+        font-size: $global-font-size-18;
+        font-weight: bold;
+      }
+      .other {
+        display: flex;
+        .other_1 {
+          .image {
+            width: 95px;
+            height: 95px;
+            display: inline-block;
+          }
+        }
+        .other_2 {
+          display: flex;
+          flex-direction: column;
+          margin: 0 0 0 10px;
+          .text {
+            height: 25px;
+            display: block;
+            line-height: 24px;
+            overflow: hidden;
+            color: #666;
+            margin-bottom: 10px;
+            em {
+              border: 1px #ccc solid;
+              background: #fff;
+              border: 1px #ab94f8 solid;
+              padding: 1px 5px;
+              color: #4131bb;
+              margin-right: 6px;
+            }
+          }
+        }
+      }
+    }
+  }
+  .four {
+    display: flex;
+    justify-content: center;
+    margin: 20px 0;
+  }
+}
+</style>

+ 307 - 0
src/views/detail/baseDetail.vue

@@ -0,0 +1,307 @@
+<template>
+  <custom-layout class="main">
+    <el-col :span="24" class="one">
+      <div class="w_1300">
+        <div class="info_1"></div>
+        <div class="info_2">
+          <div class="top">
+            <div class="info_left">
+              <el-carousel height="260px">
+                <el-carousel-item v-for="(item, index) in info.logo" :key="index">
+                  <el-image class="image" :src="getUrl(item.uri)" fit="fill" />
+                </el-carousel-item>
+              </el-carousel>
+            </div>
+            <div class="info_right">
+              <div class="info_title">
+                <div class="name">{{ info.name || '暂无' }}</div>
+                <div class="collect iscollect" @click="toCollect" v-if="info.is_collection">
+                  <el-icon :size="24" color="#1073ff"><StarFilled /></el-icon>
+                  <span>已收藏</span>
+                </div>
+                <div class="collect" v-else @click="toCollect">
+                  <el-icon :size="24"><Star /></el-icon>
+                  <span>收藏</span>
+                </div>
+              </div>
+              <el-col :span="24" class="other_1">
+                <span>负责人姓名:</span>
+                {{ info.person || '暂无' }}
+              </el-col>
+              <el-col :span="24" class="other_1">
+                <span>是否和平台合作标识:</span>
+                {{ getDict(info.cooperate, 'cooperate') || '暂无' }}
+              </el-col>
+              <el-col :span="24" class="other_1">
+                <span>所在地区:</span>
+                {{ getArea(info.area) || '暂无' }}
+              </el-col>
+            </div>
+          </div>
+          <div class="center">
+            <div class="title">简介</div>
+            <div class="content">
+              <div v-if="info.brief" v-html="info.brief"></div>
+            </div>
+          </div>
+          <div class="bottom">
+            <div class="title">相关孵化基地</div>
+            <div class="content">
+              <el-row :gutter="16">
+                <el-col :span="12" v-for="(item, index) in list" :key="index" @click="toView(item)">
+                  <div class="list">
+                    <el-col :span="24" class="name textOne">
+                      <el-tooltip effect="dark" :content="item.name" placement="top">
+                        {{ item.name || '暂无名称' }}
+                      </el-tooltip>
+                    </el-col>
+                    <el-col :span="24" class="other">
+                      <el-col :span="24" class="other_1">
+                        <span>负责人姓名:</span>
+                        {{ item.field || '暂无' }}
+                      </el-col>
+                      <el-col :span="24" class="other_1">
+                        <span>所在地区:</span>
+                        {{ getArea(item.area) || '暂无' }}
+                      </el-col>
+                    </el-col>
+                  </div>
+                </el-col>
+              </el-row>
+            </div>
+          </div>
+        </div>
+      </div>
+    </el-col>
+  </custom-layout>
+</template>
+
+<script setup>
+const $checkRes = inject('$checkRes')
+import { get } from 'lodash-es'
+// 接口
+import { IncubatorStore } from '@/store/api/user/incubator'
+import { DictDataStore } from '@/store/api/system/dictData'
+const store = IncubatorStore()
+const dictDataStore = DictDataStore()
+import { UserStore } from '@/store/user'
+const userStore = UserStore()
+const user = computed(() => userStore.user)
+
+// 收藏
+import moment from 'moment'
+import { CollectionStore } from '@/store/api/platform/collection'
+const collectionStore = CollectionStore()
+
+// 加载中
+const loading = ref(false)
+// 路由
+const router = useRouter()
+const route = useRoute()
+
+const info = ref({})
+// 列表
+const list = ref([])
+const isUseList = ref([])
+// 请求
+onMounted(async () => {
+  loading.value = true
+  await searchOther()
+  await search()
+  loading.value = false
+})
+const searchOther = async () => {
+  const data = { skip: 0, limit: 3, status: '1', is_show: '0' }
+  let res
+  res = await store.query(data)
+  if (res.errcode == '0') list.value = res.data
+  // 是否使用
+  const result = await dictDataStore.query({ code: 'isUse', is_use: '0' })
+  if ($checkRes(result)) isUseList.value = result.data
+}
+const search = async () => {
+  let id = route.query.id
+  if (id) {
+    let res = await store.detail(id)
+    if (res.errcode == '0') info.value = res.data
+  }
+}
+// 查看
+const toView = (item) => {
+  router.push({ path: '/base/detail', query: { id: item.id || item._id } })
+}
+const getUrl = (item) => {
+  if (item) return `${import.meta.env.VITE_APP_HOST}${item}`
+}
+// 字典数据转换
+const getDict = (data, model) => {
+  let res
+  if (model == 'cooperate') res = isUseList.value.find((f) => f.value == data)
+  return get(res, 'label')
+}
+// 地区
+const getArea = (data) => {
+  if (data) return data.join('-')
+  else return '暂无地区'
+}
+const toCollect = async () => {
+  if (user.value.id) {
+    info.value.is_collection = !info.value.is_collection
+    let res
+    let message
+    const data = {
+      user: user.value.id,
+      source: info.value.id,
+      type: 'incubator',
+      time: moment().format('YYYY-MM-DD')
+    }
+    if (info.value.is_collection) {
+      message = '收藏成功'
+      res = await collectionStore.create(data)
+    } else {
+      message = '取消收藏成功'
+      res = await collectionStore.cancel(data)
+    }
+    if (res.errcode === 0) {
+      ElMessage({ message, type: 'success' })
+      await search()
+    }
+  } else ElMessage({ message: '未登录!', type: 'error' })
+}
+</script>
+<style scoped lang="scss">
+.main {
+  .one {
+    padding-bottom: 40px;
+    background: #f9faff url(/images/fw-det-bg.jpg) center top no-repeat;
+    .info_1 {
+      padding: 30px 0;
+    }
+    .info_2 {
+      background-color: #fff;
+      box-shadow: 0 0 13px 0 rgba(14, 5, 10, 0.16);
+      padding: 27px;
+      margin-bottom: 20px;
+      .top {
+        display: flex;
+        .info_left {
+          width: 460px;
+          height: 260px;
+          .image {
+            height: 100%;
+            width: 100%;
+          }
+        }
+        .info_right {
+          margin-left: 40px;
+          width: 740px;
+          .info_title {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+            margin-bottom: 30px;
+
+            .name {
+              color: #22284e;
+              font-size: $global-font-size-26;
+              line-height: 26px;
+            }
+            .collect {
+              display: flex;
+              align-items: center;
+              justify-content: flex-end;
+              width: 35%;
+              font-size: $global-font-size-20;
+              color: #929292;
+              cursor: default;
+              span {
+                margin: 0 0 0 5px;
+              }
+            }
+            .iscollect {
+              color: #1073ff;
+            }
+          }
+          .other_1 {
+            font-size: $global-font-size-18;
+            margin: 10px 0;
+            span {
+              color: #686f7b;
+              margin-left: 0;
+              margin-right: 15px;
+            }
+          }
+        }
+      }
+      .center {
+        margin: 20px 0 0 0;
+        .title {
+          color: #000;
+          display: inline-block;
+          margin-right: 80px;
+          padding-bottom: 20px;
+          font-size: $global-font-size-20;
+          color: #000000;
+          border-bottom: 5px solid #378cff;
+          cursor: pointer;
+        }
+        .content {
+          padding: 20px;
+          font-size: $global-font-size-16;
+        }
+      }
+      .bottom {
+        margin: 20px 0 0 0;
+        .title {
+          color: #000;
+          display: inline-block;
+          margin-right: 80px;
+          padding-bottom: 20px;
+          font-size: $global-font-size-20;
+          color: #000000;
+          border-bottom: 5px solid #378cff;
+          cursor: pointer;
+        }
+        .content {
+          padding: 20px 0;
+          .list {
+            float: left;
+            width: 565px;
+            height: 159px;
+            border: solid 1px #cedbe7;
+            background: url(/images/bg-teclist.jpg) no-repeat right;
+            padding: 25px 0 0;
+            margin: 10px 5px;
+            .name {
+              font-size: $global-font-size-20;
+              font-weight: bold;
+              display: inline-block;
+              margin: 0 0 20px 7px;
+            }
+
+            .name:hover {
+              color: #2374ff;
+              cursor: pointer;
+            }
+            .other {
+              .other_1 {
+                margin: 10px 0;
+                width: 100%;
+                font-family: 'PingFangSC-Light', 'Microsoft YaHei', 'WenQuanYi Micro Hei', arial, sans-serif;
+                font-size: $global-font-size-18;
+                font-weight: normal;
+                color: #666;
+              }
+
+              .other_1:hover {
+                color: #2374ff;
+                cursor: pointer;
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 1 - 0
src/views/detail/company.vue

@@ -473,6 +473,7 @@ const toDel = async (data, type) => {
       margin: 0 10px 25px 10px;
       background: #f0f8ff;
       color: #000;
+      cursor: default;
       .name {
         height: 57px;
         line-height: 57px;

+ 630 - 0
src/views/one/index copy 2.vue

@@ -0,0 +1,630 @@
+<template>
+  <custom-layout v-loading="loading" :is_carousel="true" :carouselList="carouselList">
+    <el-col :span="24" class="two">
+      <div class="two_left">
+        <div class="left_more left_1" @click="toComon('/nine', '1')">
+          <div class="name">成果中心</div>
+          <div class="english">ACHIEVEMENT CENTER</div>
+          <div class="remark">成果征集入口</div>
+        </div>
+        <div class="left_more left_2" @click="toComon('/center/basic', '0')">
+          <div class="name">信息发布</div>
+          <div class="english">INFORMATION DELIVERY</div>
+          <div class="remark">信息发布入口</div>
+        </div>
+        <div class="left_more left_3" @click="toComon('/four', '1')">
+          <div class="name">信息检索</div>
+          <div class="english">INFORMATION RETRIEVAL</div>
+          <div class="remark">信息检索入口</div>
+        </div>
+      </div>
+      <div class="two_center">
+        <div class="center_1">
+          <div class="center_left">新闻资讯</div>
+          <div class="center_right" @click="toMore">更多>></div>
+        </div>
+        <div class="center_2">
+          <vue3-seamless-scroll :list="newsList" :hover="true" :step="0.5" :wheel="true" :isWatch="true">
+            <div class="center_list" v-for="(item, index) in newsList" :key="index">
+              <div class="center_left textOne">{{ item.title || '暂无' }}</div>
+              <div class="center_right">{{ moment(item.time).format('YYYY-MM-DD') || '暂无' }}</div>
+            </div>
+          </vue3-seamless-scroll>
+        </div>
+      </div>
+      <div class="two_right">
+        <div class="right_more right_1" @click="toComon('/expert', '1')">
+          <div class="right_left">
+            <el-image class="image" :src="home_1" fit="fill" />
+            <div class="right_name">
+              <div class="name">专家库</div>
+              <div class="english">EXPERT LIBRARY</div>
+            </div>
+          </div>
+          <div class="right_right">点击进入>></div>
+        </div>
+        <div class="right_more right_2" @click="toComon('/company', '1')">
+          <div class="right_left">
+            <el-image class="image" :src="home_2" fit="fill" />
+            <div class="right_name">
+              <div class="name">企业库</div>
+              <div class="english">ENTERPRISE LIBRARY</div>
+            </div>
+          </div>
+          <div class="right_right">点击进入>></div>
+        </div>
+        <div class="right_more right_3" @click="toComon('/project', '1')">
+          <div class="right_left">
+            <el-image class="image" :src="home_3" fit="fill" />
+            <div class="right_name">
+              <div class="name">项目库</div>
+              <div class="english">PROJECT LIBRARY</div>
+            </div>
+          </div>
+          <div class="right_right">点击进入>></div>
+        </div>
+      </div>
+    </el-col>
+    <el-col :span="24" class="thr">
+      <div class="thr_1">
+        <div class="title">赛事推广</div>
+      </div>
+      <div class="thr_2">
+        <div class="left" v-if="matchInfo && matchInfo.id">
+          <el-image v-if="matchInfo.file && matchInfo.file.length > 0" class="image" :src="getUrl(matchInfo.file, 'array')" fit="cover">
+            <template v-slot:error>
+              <el-image class="image" :src="match_3" fit="fill" />
+            </template>
+          </el-image>
+          <el-image v-else class="image" :src="match_3" fit="fill" />
+          <div class="name textMore">{{ matchInfo.name || '暂无' }}</div>
+          <div class="brief">{{ removeHtmlStyle(matchInfo.brief) }}</div>
+          <div class="other">
+            <div class="time">
+              <el-image class="image" :src="time1" fit="fill" />
+              <div>{{ matchInfo.start_time || '暂无' }}~{{ matchInfo.end_time || '暂无' }}</div>
+            </div>
+            <div class="button" @click="toView(matchInfo, '2')">查看 ></div>
+          </div>
+        </div>
+        <div class="right">
+          <div class="list" v-for="(item, index) in matchList" :key="index">
+            <el-image v-if="item.file && item.file.length > 0" class="image" :src="getUrl(item.file, 'array')" fit="cover">
+              <template v-slot:error>
+                <el-image class="image" :src="match_3" fit="fill" />
+              </template>
+            </el-image>
+            <el-image v-else class="image" :src="match_3" fit="fill" />
+            <div class="name textMore">{{ item.name }}</div>
+            <div class="other">
+              <div class="time">
+                <el-image class="image" :src="time1" fit="fill" />
+                <div>{{ item.start_time || '暂无' }}~{{ item.end_time || '暂无' }}</div>
+              </div>
+              <div class="button" @click="toView(item, '2')">查看 ></div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </el-col>
+    <el-col :span="24" class="four">
+      <div class="four_1">
+        <div class="title">合作伙伴</div>
+      </div>
+      <div class="four_2">
+        <div class="list" v-for="(item, index) in friendList" :key="index">
+          <el-image class="image" :src="getUrl(item.file, 'array')" fit="fill"></el-image>
+        </div>
+      </div>
+    </el-col>
+    <el-col :span="24" class="five">
+      <div class="five_1">
+        <div class="title">友情链接</div>
+      </div>
+      <div class="five_2">
+        <el-col :span="8" class="list" v-for="(item, index) in typeList" :key="index">
+          <div class="list_1">
+            <div class="title">{{ item.title }}</div>
+          </div>
+          <div class="list_2" v-for="(tag, indexx) in item.list" :key="indexx" @click="toLink(tag)">
+            {{ tag.name }}
+          </div>
+        </el-col>
+      </div>
+    </el-col>
+  </custom-layout>
+</template>
+
+<script setup>
+import moment from 'moment'
+// 图片引入
+import home_1 from '/images/home_1.png'
+import home_2 from '/images/home_2.png'
+import home_3 from '/images/home_3.png'
+import time1 from '/images/time-dary.png'
+import match_3 from '/images/match_3.jpg'
+const $checkRes = inject('$checkRes')
+
+import { UserStore } from '@/store/user'
+const userStore = UserStore()
+const user = computed(() => userStore.user)
+
+// 接口
+import { NewsStore } from '@/store/api/platform/news'
+import { MatchStore } from '@/store/api/platform/match'
+import { DesignStore } from '@/store/api/platform/design'
+import { FriendStore } from '@/store/api/platform/friend'
+const newsStore = NewsStore()
+const matchStore = MatchStore()
+const designStore = DesignStore()
+const friendStore = FriendStore()
+// 加载中
+const loading = ref(false)
+// 路由
+const router = useRouter()
+const carouselList = ref([])
+const friendList = ref([])
+// 新闻
+const newsList = ref([])
+// 比赛
+const matchList = ref([])
+const matchInfo = ref({})
+// 分类
+const typeList = ref([
+  { title: '热门高校', list: [] },
+  { title: '政府部门', list: [] },
+  { title: '科研机构', list: [] }
+])
+// 请求
+onMounted(async () => {
+  loading.value = true
+  await searchOther()
+  await searchMatch()
+  loading.value = false
+})
+const searchOther = async () => {
+  const info = { skip: 0, limit: 10, is_use: '0', is_show: '0', status: '1' }
+  let res
+  // 政策新闻
+  res = await newsStore.query({ ...info })
+  if (res.errcode == '0') newsList.value = res.data
+  // 合作伙伴
+  res = await friendStore.list({ is_use: '0' })
+  if (res.errcode == '0') friendList.value = res.data
+  // 基础设置
+  res = await designStore.query({})
+  if ($checkRes(res)) {
+    carouselList.value = res.data[0].carouselUrl || []
+    const friendship = res.data[0].friendship || []
+    for (const val of friendship) {
+      for (const tag of typeList.value) {
+        if (val.type == tag.title) {
+          tag.list.push(val)
+        }
+      }
+    }
+  }
+}
+const searchMatch = async () => {
+  const info = { skip: 0, limit: 5, is_use: '0', is_show: '0', status: '1' }
+  const res = await matchStore.query(info)
+  if (res.errcode == '0') {
+    matchList.value = res.data.slice(1, 5)
+    matchInfo.value = res.data[0]
+  }
+}
+// 查看详情
+const toView = (item, type) => {
+  if (type == '0') router.push({ path: '/news/detail', query: { id: item.id || item._id } })
+  else if (type == '1') router.push({ path: '/achievement/detail', query: { id: item.id || item._id } })
+  else router.push({ path: '/match/detail', query: { id: item.id || item._id } })
+}
+// 查看更多
+const toMore = () => {
+  router.push({ path: '/news' })
+}
+// 查看
+const toComon = (route, type) => {
+  if (user.value.id || type == '1') {
+    router.push({ path: route })
+  } else {
+    router.push({ path: '/login', query: { status: '1' } })
+  }
+}
+const removeHtmlStyle = (html) => {
+  let relStyle = /style\s*?=\s*?([‘"])[\s\S]*?\1/g //去除样式
+  let relTag = /<.+?>/g //去除标签
+  let relClass = /class\s*?=\s*?([‘"])[\s\S]*?\1/g // 清除类名
+  let newHtml = ''
+  if (html) {
+    newHtml = html.replace(relStyle, '')
+    newHtml = newHtml.replace(relTag, '')
+    newHtml = newHtml.replace(relClass, '')
+  }
+  return newHtml
+}
+const toLink = (item) => {
+  window.open(item.href, '_blank') // 在新标签页中打开URL
+}
+const getUrl = (item, type) => {
+  if (item) {
+    if (type == 'array') return `${import.meta.env.VITE_APP_HOST}${item[0].uri}`
+    else return `${import.meta.env.VITE_APP_HOST}${item.uri}`
+  }
+}
+</script>
+<style scoped lang="scss">
+.one {
+  .image {
+    width: 100%;
+    height: 100%;
+  }
+}
+.two {
+  width: 1300px;
+  margin: 20px auto;
+  display: flex;
+  justify-content: space-between;
+  .two_left {
+    width: 327px;
+
+    .left_more {
+      width: 327px;
+      padding-left: 45px;
+      height: 127px;
+      border-radius: 2px;
+      color: #fff;
+      margin-bottom: 9px;
+      position: relative;
+      cursor: default;
+
+      .name {
+        font-size: $global-font-size-26;
+        font-weight: 700;
+        line-height: 30px;
+        padding-top: 20px;
+      }
+      .english {
+        font-size: $global-font-size-14;
+        padding: 7px 0;
+      }
+      .remark {
+        font-size: $global-font-size-14;
+        padding: 0 10px;
+        height: 30px;
+        display: block;
+        border: 1px solid hsla(0, 0%, 100%, 0.5);
+        text-align: center;
+        line-height: 30px;
+        float: left;
+      }
+    }
+    .left_1 {
+      background: linear-gradient(90deg, #6a8df3, #119eee);
+    }
+    .left_2 {
+      background: linear-gradient(90deg, #ef7d2b, #fcaa64);
+    }
+    .left_3 {
+      background: linear-gradient(90deg, #22b9c7, #32cfc6);
+    }
+  }
+  .two_center {
+    margin: 0 10px;
+    width: 635px;
+
+    .center_1 {
+      display: flex;
+      justify-content: space-between;
+      height: 49px;
+      background: #d3e0fe;
+      font-size: 20px;
+      line-height: 49px;
+      padding: 0 10px 0 20px;
+      .center_right {
+        color: #ababab;
+        font-size: $global-font-size-14;
+        cursor: default;
+      }
+    }
+    .center_2 {
+      background: #f1f7ff;
+      height: 350px;
+      overflow: hidden;
+      .center_list {
+        width: 100%;
+        display: flex;
+        align-items: center;
+        height: 47px;
+        border-bottom: 1px dashed #e5e5e5;
+        line-height: 47px;
+        padding-left: 20px;
+        .center_left {
+          width: 84%;
+          font-size: $global-font-size-16;
+        }
+        .center_right {
+          color: #999;
+          font-size: $global-font-size-14;
+        }
+      }
+    }
+  }
+  .two_right {
+    width: 307px;
+    .right_more {
+      width: 307px;
+      height: 124px;
+      margin-bottom: 13px;
+      border-radius: 8px;
+      cursor: default;
+      .right_left {
+        display: flex;
+        align-items: center;
+        padding-top: 25px;
+        .image {
+          padding: 0 10px 0 15px;
+        }
+        .name {
+          font-size: $global-font-size-28;
+          font-weight: 400;
+          line-height: 30px;
+          margin: 0 0 8px 0;
+        }
+        .english {
+          font-size: $global-font-size-14;
+          line-height: 14px;
+        }
+      }
+      .right_right {
+        display: flex;
+        justify-content: flex-end;
+        padding-right: 16px;
+        padding-top: 5px;
+        font-size: $global-font-size-14;
+      }
+    }
+    .right_1 {
+      background: linear-gradient(90deg, #d1dcff, #d7e7fb);
+      color: #2073c7;
+      .right_right {
+        color: #89b9ee;
+      }
+    }
+    .right_2 {
+      background: linear-gradient(90deg, #f9e6d7, #fcf6f2);
+      color: #e48a27;
+      .right_right {
+        color: #f5c494;
+      }
+    }
+    .right_3 {
+      background: linear-gradient(90deg, #b4e7d0, #cdf2eb);
+      color: #11af84;
+      margin-bottom: 0;
+      .right_right {
+        color: #62c5aa;
+      }
+    }
+  }
+}
+.thr {
+  width: 1300px;
+  margin: 20px auto;
+  .thr_1 {
+    display: flex;
+    justify-content: center;
+    margin: 0 0 20px 0;
+    .title {
+      background-image: url(/images/sg-title.png);
+      background-position: center center;
+      background-repeat: no-repeat;
+      background-size: cover;
+      text-align: center;
+      font-size: $global-font-size-36;
+      width: 500px;
+      line-height: 46px;
+      height: 46px;
+    }
+  }
+  .thr_2 {
+    display: flex;
+    .left {
+      width: 580px;
+      padding: 10px;
+      transition: box-shadow 0.3s ease; /* 添加过渡效果,使阴影的出现更平滑 */
+      .image {
+        width: 558px;
+        height: 342px;
+        border-radius: 4px;
+        overflow: hidden;
+      }
+      .name {
+        margin: 16px 0;
+        max-height: 52px;
+        font-size: $global-font-size-20;
+      }
+      .brief {
+        min-height: 115px;
+        margin-bottom: 20px !important;
+        font-size: $global-font-size-16;
+        color: #717794;
+        -webkit-line-clamp: 3;
+        display: -webkit-box;
+        -webkit-box-orient: vertical;
+        overflow: hidden;
+      }
+      .other {
+        display: flex;
+        align-items: center;
+        justify-content: space-between;
+        .time {
+          display: flex;
+          align-items: center;
+          color: #858585;
+          .image {
+            width: 18px;
+            height: 18px;
+            margin: 0 5px 0 0;
+          }
+        }
+        .button {
+          color: $global-color-107;
+          padding: 5px 15px;
+          cursor: default;
+        }
+        .button:hover {
+          color: $global-color-fff;
+          background-color: $global-color-107;
+          border-radius: 20px;
+          cursor: default;
+        }
+      }
+    }
+
+    .left:hover {
+      box-shadow: 0 0 10px rgb(186, 196, 240); /* 阴影效果 */
+    }
+    .right {
+      display: flex;
+      justify-content: space-between;
+      flex-wrap: wrap;
+      align-items: flex-start;
+      .list {
+        width: 50%;
+        padding: 10px;
+        transition: box-shadow 0.3s ease; /* 添加过渡效果,使阴影的出现更平滑 */
+        .image {
+          border-radius: 4px;
+          overflow: hidden;
+        }
+        .name {
+          min-height: 40px;
+          margin: 5px 0;
+          font-size: $global-font-size-18;
+        }
+        .other {
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+          .time {
+            display: flex;
+            align-items: center;
+            color: #858585;
+            .image {
+              width: 18px;
+              height: 18px;
+              margin: 0 5px 0 0;
+            }
+          }
+          .button {
+            color: $global-color-107;
+            padding: 5px 15px;
+            cursor: default;
+          }
+          .button:hover {
+            color: $global-color-fff;
+            background-color: $global-color-107;
+            border-radius: 20px;
+            cursor: default;
+          }
+        }
+      }
+
+      .list:hover {
+        box-shadow: 0 0 10px rgb(186, 196, 240); /* 阴影效果 */
+      }
+    }
+  }
+}
+.four {
+  width: 1300px;
+  margin: 20px auto;
+  .four_1 {
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    margin: 0 0 20px 0;
+    .title {
+      background-image: url(/images/sg-title.png);
+      background-position: center center;
+      background-repeat: no-repeat;
+      background-size: cover;
+      text-align: center;
+      font-size: $global-font-size-36;
+      width: 500px;
+      line-height: 46px;
+      height: 46px;
+    }
+  }
+  .four_2 {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    flex-wrap: wrap;
+    .list {
+      margin: 10px;
+      .image {
+        width: 245px;
+        height: 140px;
+      }
+    }
+  }
+}
+.five {
+  width: 1300px;
+  margin: 20px auto;
+  .five_1 {
+    display: flex;
+    justify-content: center;
+    margin: 0 0 20px 0;
+    .title {
+      background-image: url(/images/sg-title.png);
+      background-position: center center;
+      background-repeat: no-repeat;
+      background-size: cover;
+      text-align: center;
+      font-size: $global-font-size-36;
+      width: 500px;
+      line-height: 46px;
+      height: 46px;
+    }
+  }
+  .five_2 {
+    display: flex;
+    .list {
+      .list_1 {
+        background-image: url(/images/rczy-title.png);
+        background-position: center center;
+        background-repeat: no-repeat;
+        background-size: cover;
+        text-align: center;
+        font-size: $global-font-size-36;
+        line-height: 33px;
+        height: 33px;
+        margin: 20px 0;
+        .title {
+          font-size: $global-font-size-20;
+          font-weight: 600;
+          text-align: center;
+          color: #252f49;
+        }
+      }
+
+      .list_2 {
+        font-size: $global-font-size-18;
+        margin: 8px;
+        padding: 5px;
+        text-align: center;
+        border: 1px #ebe2e2 solid;
+        border-radius: 4px;
+      }
+      .list_2:hover {
+        background: #2280ff;
+        color: #ffffff;
+        cursor: default;
+      }
+    }
+  }
+}
+</style>

+ 93 - 148
src/views/one/index.vue

@@ -2,20 +2,33 @@
   <custom-layout v-loading="loading" :is_carousel="true" :carouselList="carouselList">
     <el-col :span="24" class="two">
       <div class="two_left">
-        <div class="left_more left_1" @click="toComon('/nine', '1')">
-          <div class="name">成果中心</div>
-          <div class="english">ACHIEVEMENT CENTER</div>
-          <div class="remark">成果征集入口</div>
+        <div class="two_1" @click="toComon('/expert', '1')">
+          <el-image class="image" :src="bg_1" fit="fill" />
+          <div class="content">
+            <div class="name">专家库</div>
+            <div class="english">EXPERT LIBRARY</div>
+          </div>
+        </div>
+        <div class="two_1" @click="toComon('/company', '1')">
+          <el-image class="image" :src="bg_2" fit="fill" />
+          <div class="content">
+            <div class="name">企业库</div>
+            <div class="english">ENTERPRISE LIBRARY</div>
+          </div>
         </div>
-        <div class="left_more left_2" @click="toComon('/center/basic', '0')">
-          <div class="name">信息发布</div>
-          <div class="english">INFORMATION DELIVERY</div>
-          <div class="remark">信息发布入口</div>
+        <div class="two_1" @click="toComon('/project', '1')">
+          <el-image class="image" :src="bg_3" fit="fill" />
+          <div class="content">
+            <div class="name">项目库</div>
+            <div class="english">PROJECT LIBRARY</div>
+          </div>
         </div>
-        <div class="left_more left_3" @click="toComon('/four', '1')">
-          <div class="name">信息检索</div>
-          <div class="english">INFORMATION RETRIEVAL</div>
-          <div class="remark">信息检索入口</div>
+        <div class="two_1" @click="toComon('/thr', '1')">
+          <el-image class="image" :src="bg_4" fit="fill" />
+          <div class="content">
+            <div class="name">需求库</div>
+            <div class="english">DEMAND LIBRARY</div>
+          </div>
         </div>
       </div>
       <div class="two_center">
@@ -32,36 +45,34 @@
           </vue3-seamless-scroll>
         </div>
       </div>
-      <div class="two_right">
-        <div class="right_more right_1" @click="toComon('/expert', '1')">
-          <div class="right_left">
-            <el-image class="image" :src="home_1" fit="fill" />
-            <div class="right_name">
-              <div class="name">专家库</div>
-              <div class="english">EXPERT LIBRARY</div>
-            </div>
+      <div class="two_left">
+        <div class="two_1" @click="toComon('/nine', '1')">
+          <el-image class="image" :src="bg_5" fit="fill" />
+          <div class="content">
+            <div class="name">成果中心</div>
+            <div class="english">ACHIEVEMENT CENTER</div>
           </div>
-          <div class="right_right">点击进入>></div>
         </div>
-        <div class="right_more right_2" @click="toComon('/company', '1')">
-          <div class="right_left">
-            <el-image class="image" :src="home_2" fit="fill" />
-            <div class="right_name">
-              <div class="name">企业库</div>
-              <div class="english">ENTERPRISE LIBRARY</div>
-            </div>
+        <div class="two_1" @click="toComon('/center/basic', '0')">
+          <el-image class="image" :src="bg_3" fit="fill" />
+          <div class="content">
+            <div class="name">信息发布</div>
+            <div class="english">INFORMATION RETRIEVAL</div>
           </div>
-          <div class="right_right">点击进入>></div>
         </div>
-        <div class="right_more right_3" @click="toComon('/project', '1')">
-          <div class="right_left">
-            <el-image class="image" :src="home_3" fit="fill" />
-            <div class="right_name">
-              <div class="name">项目库</div>
-              <div class="english">PROJECT LIBRARY</div>
-            </div>
+        <div class="two_1" @click="toComon('/four', '1')">
+          <el-image class="image" :src="bg_4" fit="fill" />
+          <div class="content">
+            <div class="name">信息检索</div>
+            <div class="english">INFORMATION RETRIEVAL</div>
+          </div>
+        </div>
+        <div class="two_1" @click="toComon('/base', '1')">
+          <el-image class="image" :src="bg_1" fit="fill" />
+          <div class="content">
+            <div class="name">孵化基地</div>
+            <div class="english">INCUBATORS</div>
           </div>
-          <div class="right_right">点击进入>></div>
         </div>
       </div>
     </el-col>
@@ -138,9 +149,11 @@
 <script setup>
 import moment from 'moment'
 // 图片引入
-import home_1 from '/images/home_1.png'
-import home_2 from '/images/home_2.png'
-import home_3 from '/images/home_3.png'
+import bg_1 from '/images/111.jpg'
+import bg_2 from '/images/222.jpg'
+import bg_3 from '/images/333.jpg'
+import bg_4 from '/images/444.jpg'
+import bg_5 from '/images/555.jpg'
 import time1 from '/images/time-dary.png'
 import match_3 from '/images/match_3.jpg'
 const $checkRes = inject('$checkRes')
@@ -263,72 +276,61 @@ const getUrl = (item, type) => {
 .two {
   width: 1300px;
   margin: 20px auto;
-  display: flex;
-  justify-content: space-between;
   .two_left {
-    width: 327px;
-
-    .left_more {
-      width: 327px;
-      padding-left: 45px;
-      height: 127px;
-      border-radius: 2px;
-      color: #fff;
-      margin-bottom: 9px;
+    display: flex;
+    .two_1 {
+      margin: 0 10px 0 0;
       position: relative;
       cursor: default;
-
-      .name {
-        font-size: $global-font-size-26;
-        font-weight: 700;
-        line-height: 30px;
-        padding-top: 20px;
-      }
-      .english {
-        font-size: $global-font-size-14;
-        padding: 7px 0;
+      .image {
+        width: 320px;
       }
-      .remark {
-        font-size: $global-font-size-14;
-        padding: 0 10px;
-        height: 30px;
-        display: block;
-        border: 1px solid hsla(0, 0%, 100%, 0.5);
-        text-align: center;
-        line-height: 30px;
-        float: left;
+      .content {
+        position: absolute;
+        top: 30px;
+        left: 20px;
+        font-family: PingFang SC;
+        font-weight: bold;
+        color: #ffffff;
+        .name {
+          font-size: $global-font-size-30;
+        }
+        .english {
+          margin: 10px 0 0 0;
+          font-size: $global-font-size-14;
+        }
       }
     }
-    .left_1 {
-      background: linear-gradient(90deg, #6a8df3, #119eee);
-    }
-    .left_2 {
-      background: linear-gradient(90deg, #ef7d2b, #fcaa64);
-    }
-    .left_3 {
-      background: linear-gradient(90deg, #22b9c7, #32cfc6);
-    }
   }
   .two_center {
-    margin: 0 10px;
-    width: 635px;
+    margin: 25px 0;
+    box-shadow: 0px 1px 9px 0px rgba(50, 122, 244, 0.12);
+    padding: 10px;
 
     .center_1 {
       display: flex;
       justify-content: space-between;
-      height: 49px;
-      background: #d3e0fe;
-      font-size: 20px;
-      line-height: 49px;
-      padding: 0 10px 0 20px;
+      align-items: center;
+      padding: 10px;
+      .center_left {
+        width: 90px;
+        height: 30px;
+        background: linear-gradient(90deg, #1e79ef, #93b1ea);
+        border-radius: 14px;
+        text-align: center;
+        line-height: 30px;
+        font-size: $global-font-size-18;
+        font-family: PingFang SC;
+        font-weight: 500;
+        color: #ffffff;
+      }
       .center_right {
-        color: #ababab;
-        font-size: $global-font-size-14;
+        color: #1890ff;
+        font-size: $global-font-size-18;
         cursor: default;
       }
     }
     .center_2 {
-      background: #f1f7ff;
       height: 350px;
       overflow: hidden;
       .center_list {
@@ -340,7 +342,7 @@ const getUrl = (item, type) => {
         line-height: 47px;
         padding-left: 20px;
         .center_left {
-          width: 84%;
+          width: 92%;
           font-size: $global-font-size-16;
         }
         .center_right {
@@ -350,63 +352,6 @@ const getUrl = (item, type) => {
       }
     }
   }
-  .two_right {
-    width: 307px;
-    .right_more {
-      width: 307px;
-      height: 124px;
-      margin-bottom: 13px;
-      border-radius: 8px;
-      cursor: default;
-      .right_left {
-        display: flex;
-        align-items: center;
-        padding-top: 25px;
-        .image {
-          padding: 0 10px 0 15px;
-        }
-        .name {
-          font-size: $global-font-size-28;
-          font-weight: 400;
-          line-height: 30px;
-          margin: 0 0 8px 0;
-        }
-        .english {
-          font-size: $global-font-size-14;
-          line-height: 14px;
-        }
-      }
-      .right_right {
-        display: flex;
-        justify-content: flex-end;
-        padding-right: 16px;
-        padding-top: 5px;
-        font-size: $global-font-size-14;
-      }
-    }
-    .right_1 {
-      background: linear-gradient(90deg, #d1dcff, #d7e7fb);
-      color: #2073c7;
-      .right_right {
-        color: #89b9ee;
-      }
-    }
-    .right_2 {
-      background: linear-gradient(90deg, #f9e6d7, #fcf6f2);
-      color: #e48a27;
-      .right_right {
-        color: #f5c494;
-      }
-    }
-    .right_3 {
-      background: linear-gradient(90deg, #b4e7d0, #cdf2eb);
-      color: #11af84;
-      margin-bottom: 0;
-      .right_right {
-        color: #62c5aa;
-      }
-    }
-  }
 }
 .thr {
   width: 1300px;
@@ -414,7 +359,7 @@ const getUrl = (item, type) => {
   .thr_1 {
     display: flex;
     justify-content: center;
-    margin: 0 0 20px 0;
+    margin: 20px 0;
     .title {
       background-image: url(/images/sg-title.png);
       background-position: center center;