zs 8 miesięcy temu
rodzic
commit
358cdf1678

+ 3 - 0
src/styles/variables.scss

@@ -136,3 +136,6 @@ $global-color-595: #595959;
 .ant-menu-title-content {
   font-size: 18px !important; /* 设置复选框内部文字的字体大小 */
 }
+.el-checkbox__label {
+  font-size: 16px !important; /* 设置复选框内部文字的字体大小 */
+}

+ 1 - 1
src/utils/file.js

@@ -16,7 +16,7 @@ export async function uploadFileApi(file) {
   if (token) axios.defaults.headers.common['token'] = token
   if (apiToken) axios.defaults.headers.common['api-token'] = apiToken
   return await axios.request({
-    url: '/web/template/upload',
+    url: '/web/template_wangEditor/upload',
     method: 'post',
     data: formData,
     headers: {

+ 42 - 45
src/views/detail/company.vue

@@ -9,21 +9,21 @@
           <div class="Left">
             <span>行业</span>
           </div>
-          <div v-if="!twoShow" class="Right">
+          <div v-if="!oneShow" class="Right">
             <div class="label" v-for="(item, index) in plateList.slice(0, 6)" :key="index">
-              {{ item.label }}
+              {{ item.title }}
             </div>
           </div>
           <div v-else class="Right">
             <div class="label" v-for="(item, index) in plateList" :key="index">
-              {{ item.label }}
+              {{ item.title }}
             </div>
           </div>
           <div class="button">
-            <span v-if="!twoShow" @click="twoShow = true">
+            <span v-if="!oneShow" @click="oneShow = true">
               <el-icon><ArrowDown /></el-icon>
             </span>
-            <span v-else @click="twoShow = false">
+            <span v-else @click="oneShow = false">
               <el-icon><ArrowUp /></el-icon>
             </span>
           </div>
@@ -38,28 +38,22 @@
             </div>
           </div>
         </div>
-        <div class="Seacher">
+        <div class="Seacher border">
           <div class="Left">
             <span>所在地</span>
           </div>
-          <div v-if="!oneShow" class="Right">
-            <div class="label" v-for="(item, index) in cityList.slice(0, 15)" :key="index">
-              {{ item.label }}
-            </div>
-          </div>
-          <div v-else class="Right">
+          <div class="Right">
             <div class="label" v-for="(item, index) in cityList" :key="index">
-              {{ item.label }}
+              {{ item.name }}
             </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="two_ipunt">
+          <a-input class="input" size="large" v-model:value="searchForm.name" placeholder="公司名称" />
+          <a-input class="input" size="large" v-model:value="searchForm.tags" placeholder="标签名称" />
+          <a-input class="input" size="large" v-model:value="searchForm.direction" placeholder="研究方向" />
+          <a-input class="input" size="large" v-model:value="searchForm.scale" placeholder="公司规模" />
+          <a-button class="button" size="large" type="primary">检索</a-button>
         </div>
       </el-col>
       <div class="thr">
@@ -95,14 +89,16 @@ import companyLogo from '/images/companyLogo.jpg'
 import { UserStore } from '@/store/user'
 const userStore = UserStore()
 const user = computed(() => userStore.user)
-// API 引用
-import { getCity } from '@/utils/city'
 const $checkRes = inject('$checkRes')
 import { get } from 'lodash-es'
 // 接口
 import { CompanyStore } from '@/store/api/user/company'
+import { RegionStore } from '@/store/api/system/region'
+import { SectorStore } from '@/store/api/platform/sector'
 import { DictDataStore } from '@/store/api/system/dictData'
 const store = CompanyStore()
+const regionStore = RegionStore()
+const sectorStore = SectorStore()
 const dictDataStore = DictDataStore()
 // 加载中
 const loading = ref(false)
@@ -114,30 +110,15 @@ let limit = 15
 const total = ref(0)
 // 是否展开
 const oneShow = ref(false)
-const twoShow = ref(false)
 // 字典表
 const fieldList = ref([])
 const statusList = ref([])
 const patternList = ref([])
 const scaleList = ref([])
-const IndustryList = ref([])
 const cityList = ref([])
-const plateList = ref([
-  { label: '不限', value: '-1' },
-  { label: '汽车电子及新型汽车零部件', value: '0' },
-  { label: '精细化工及天然气化工', value: '1' },
-  { label: '农产品加工及绿色食品', value: '2' },
-  { label: '光电子及智能传感器', value: '3' },
-  { label: '车规级芯片及功率半导体器件', value: '4' },
-  { label: '新能源及动力电池', value: '5' },
-  { label: '生物基新材料', value: '6' },
-  { label: '人工智能及智能机器人', value: '7' },
-  { label: '碳纤维及复合材料', value: '8' },
-  { label: '遥感卫星及航天航空技术', value: '9' },
-  { label: '精密仪器及先进装备', value: '10' },
-  { label: '生物医药及先进医疗器械', value: '11' },
-  { label: '生物制造', value: '12' }
-])
+const plateList = ref([])
+// 搜索
+const searchForm = ref({})
 // 请求
 onMounted(async () => {
   loading.value = true
@@ -156,14 +137,19 @@ const searchOther = async () => {
   // 企业类型
   result = await dictDataStore.query({ code: 'companyType', is_use: '0' })
   if ($checkRes(result)) patternList.value = result.data
+  patternList.value.unshift({ value: '-1', label: '不限' })
   // // 企业规模
   // result = await dictDataStore.query({ code: 'companyScale', is_use: '0' })
   // if ($checkRes(result)) scaleList.value = result.data
   // // 企业所属行业
   // result = await dictDataStore.query({ code: 'companyIndustry', is_use: '0' })
   // if ($checkRes(result)) IndustryList.value = result.data
-  // 城市
-  getCity().then((response) => (cityList.value = response.address))
+  result = await regionStore.list({ level: 'city', parent_code: 22 })
+  if ($checkRes(result)) cityList.value = result.data
+  cityList.value.unshift({ code: '-1', name: '不限' })
+  result = await sectorStore.query({ is_use: '0' })
+  if ($checkRes(result)) plateList.value = result.data
+  plateList.value.unshift({ id: '-1', title: '不限' })
 }
 const search = async (query = { skip, limit }) => {
   skip = query.skip
@@ -273,13 +259,24 @@ const sizeChange = (limits) => {
         margin: 0 5px 0 0;
       }
     }
-    .Seacher:last-child {
+    .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 {
-    padding: 25px 0 0 0;
     display: flex;
     flex-wrap: wrap;
     .list {

+ 56 - 47
src/views/detail/expert.vue

@@ -11,12 +11,12 @@
           </div>
           <div v-if="!oneShow" class="twoRight">
             <div class="label" v-for="(item, index) in plateList.slice(0, 6)" :key="index">
-              {{ item.label }}
+              {{ item.title }}
             </div>
           </div>
           <div v-else class="twoRight">
             <div class="label" v-for="(item, index) in plateList" :key="index">
-              {{ item.label }}
+              {{ item.title }}
             </div>
           </div>
           <div class="button">
@@ -32,23 +32,13 @@
           <div class="twoLeft">
             <span>技术领域</span>
           </div>
-          <div class="twoRight">
-            <div class="label" v-for="(item, index) in typeList" :key="index">
-              {{ item.label }}
-            </div>
-          </div>
-        </div>
-        <div class="twoSeacher">
-          <div class="twoLeft">
-            <span>所在地</span>
-          </div>
           <div v-if="!twoShow" class="twoRight">
-            <div class="label" v-for="(item, index) in cityList.slice(0, 15)" :key="index">
+            <div class="label" v-for="(item, index) in typeList.slice(0, 10)" :key="index">
               {{ item.label }}
             </div>
           </div>
           <div v-else class="twoRight">
-            <div class="label" v-for="(item, index) in cityList" :key="index">
+            <div class="label" v-for="(item, index) in typeList" :key="index">
               {{ item.label }}
             </div>
           </div>
@@ -61,6 +51,23 @@
             </span>
           </div>
         </div>
+        <div class="twoSeacher">
+          <div class="twoLeft">
+            <span>所在地</span>
+          </div>
+          <div class="twoRight">
+            <div class="label" v-for="(item, index) in cityList" :key="index">
+              {{ item.name }}
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="two_ipunt">
+        <a-input class="input" size="large" v-model:value="searchForm.name" placeholder="专家名称" />
+        <a-input class="input" size="large" v-model:value="searchForm.tags" placeholder="标签名称" />
+        <a-input class="input" size="large" v-model:value="searchForm.direction" placeholder="研究方向" />
+        <a-input class="input" size="large" v-model:value="searchForm.industry" placeholder="所属产业" />
+        <a-button class="button" size="large" type="primary">检索</a-button>
       </div>
       <div class="twoTwo">
         <div class="twoTable">
@@ -89,13 +96,17 @@
 <script setup>
 // 图片引入
 import lists from '/images/expert.png'
-import { getCity } from '@/utils/city'
+const $checkRes = inject('$checkRes')
 import { UserStore } from '@/store/user'
 const userStore = UserStore()
 const user = computed(() => userStore.user)
 // 接口
-import { DictDataStore } from '@/store/api/system/dictData'
 import { ExpertStore } from '@/store/api/user/expert'
+import { RegionStore } from '@/store/api/system/region'
+import { SectorStore } from '@/store/api/platform/sector'
+import { DictDataStore } from '@/store/api/system/dictData'
+const regionStore = RegionStore()
+const sectorStore = SectorStore()
 const store = ExpertStore()
 const dictDataStore = DictDataStore()
 // 加载中
@@ -106,34 +117,8 @@ const router = useRouter()
 const oneShow = ref(false)
 const twoShow = ref(false)
 const cityList = ref([])
-const typeList = ref([
-  { label: '不限', value: '-1' },
-  { label: '教育休闲', value: '0' },
-  { label: '包装印刷', value: '1' },
-  { label: '电气自动化', value: '2' },
-  { label: '采矿冶金', value: '3' },
-  { label: '航空航天', value: '4' },
-  { label: '海洋开发', value: '5' },
-  { label: '衣林牧业', value: '6' },
-  { label: '医药与医疗', value: '7' },
-  { label: '电子信息', value: '8' }
-])
-const plateList = ref([
-  { label: '不限', value: '-1' },
-  { label: '汽车电子及新型汽车零部件', value: '0' },
-  { label: '精细化工及天然气化工', value: '1' },
-  { label: '农产品加工及绿色食品', value: '2' },
-  { label: '光电子及智能传感器', value: '3' },
-  { label: '车规级芯片及功率半导体器件', value: '4' },
-  { label: '新能源及动力电池', value: '5' },
-  { label: '生物基新材料', value: '6' },
-  { label: '人工智能及智能机器人', value: '7' },
-  { label: '碳纤维及复合材料', value: '8' },
-  { label: '遥感卫星及航天航空技术', value: '9' },
-  { label: '精密仪器及先进装备', value: '10' },
-  { label: '生物医药及先进医疗器械', value: '11' },
-  { label: '生物制造', value: '12' }
-])
+const typeList = ref([])
+const plateList = ref([])
 const column = ref([
   { name: '序号', style: { width: '116px' }, key: 'key' },
   { name: '名称', style: { width: '216px' }, key: 'name' },
@@ -147,16 +132,28 @@ const list = ref([])
 let skip = 0
 let limit = 15
 const total = ref(0)
+// 搜索
+const searchForm = ref({})
 // 请求
 onMounted(async () => {
   loading.value = true
-  // 城市
-  getCity().then((response) => (cityList.value = [{ label: '不限', value: '-1' }, ...response.address]))
   await searchOther()
   await search({ skip, limit })
   loading.value = false
 })
-const searchOther = async () => {}
+const searchOther = async () => {
+  let result
+  // 技术领域
+  result = await dictDataStore.query({ code: 'field', is_use: '0' })
+  if ($checkRes(result)) typeList.value = result.data
+  typeList.value.unshift({ value: '-1', label: '不限' })
+  result = await regionStore.list({ level: 'city', parent_code: 22 })
+  if ($checkRes(result)) cityList.value = result.data
+  cityList.value.unshift({ code: '-1', name: '不限' })
+  result = await sectorStore.query({ is_use: '0' })
+  if ($checkRes(result)) plateList.value = result.data
+  plateList.value.unshift({ id: '-1', title: '不限' })
+}
 const search = async (query = { skip, limit }) => {
   skip = query.skip
   limit = query.limit
@@ -252,6 +249,18 @@ const sizeChange = (limits) => {
       }
     }
   }
+  .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;
+    }
+  }
   .twoTwo {
     margin: 10px 0;
     .twoTable {

+ 109 - 9
src/views/detail/matchDetail.vue

@@ -5,19 +5,20 @@
         <div class="info_1">
           <h3 class="name">{{ info.name || '暂无' }}</h3>
           <p class="brief">{{ info.industry || '暂无' }}</p>
-          <p class="money">{{ info.money || '暂无' }}</p>
+          <p class="money" v-if="info.money">{{ info.money || '暂无' }}</p>
           <div class="time">
             <el-image class="image" :src="time" fit="fill"></el-image>
             <span>{{ info.start_time || '暂无' }} ~ {{ info.end_time || '暂无' }}</span>
           </div>
-          <div class="button">活动报名</div>
+          <div class="button" @click="toSign">活动报名</div>
         </div>
         <div class="info_2">
           <div class="title">活动介绍</div>
           <div class="content">
             <!-- 正文 -->
             <div class="content_1">
-              <div v-html="info.brief"></div>
+              <div v-if="info.brief" v-html="info.brief"></div>
+              <div v-else>暂无简介</div>
             </div>
             <!-- 封面 -->
             <div class="image">
@@ -106,21 +107,65 @@
       </div>
     </el-col>
   </custom-layout>
+  <el-dialog v-model="dialog" title="活动报名" :destroy-on-close="true" @close="toClose">
+    <data-form></data-form>
+  </el-dialog>
 </template>
 
 <script setup>
+import moment from 'moment'
+import { cloneDeep } from 'lodash-es'
+const $checkRes = inject('$checkRes')
+// 组件
+import dataForm from './parts/index.vue'
 import time from '/images/time.png'
 import { UserStore } from '@/store/user'
 const userStore = UserStore()
 const user = computed(() => userStore.user)
 // 接口
+import { DictDataStore } from '@/store/api/system/dictData'
 import { MatchStore } from '@/store/api/platform/match'
+import { SignStore } from '@/store/api/platform/sign'
+const dictDataStore = DictDataStore()
 const store = MatchStore()
+const signStore = SignStore()
 // 加载中
 const loading = ref(false)
 // 路由
 const route = useRoute()
 const info = ref({})
+// 弹框
+const cardTypeList = ref([])
+const ruleFormRef = ref()
+const form = ref({})
+const validatePhoneNumber = (rule, value, callback) => {
+  const reg = /^1[3-9]\d{9}$/
+  if (!value) {
+    return callback(new Error('手机号不能为空'))
+  }
+  if (!reg.test(value)) {
+    return callback(new Error('请输入正确的手机号'))
+  }
+  callback()
+}
+const validateCardNumber = (rule, value, callback) => {
+  var reg = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
+  if (!value) {
+    return callback(new Error('证件号码不能为空'))
+  }
+  if (!reg.test(value)) {
+    return callback(new Error('请输入正确的证件号码'))
+  }
+  callback()
+}
+const rules = reactive({
+  name: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
+  phone: [{ required: true, validator: validatePhoneNumber, trigger: 'blur' }],
+  cardType: [{ required: true, message: '请选择证件类型', trigger: 'change' }],
+  card: [{ required: true, validator: validateCardNumber, trigger: 'change' }],
+  remark: [{ required: true, message: '请输入备注', trigger: 'blur' }]
+})
+const dialog = ref(false)
 // 请求
 onMounted(async () => {
   loading.value = true
@@ -128,7 +173,12 @@ onMounted(async () => {
   await search()
   loading.value = false
 })
-const searchOther = async () => {}
+const searchOther = async () => {
+  let result
+  // 证件类型
+  result = await dictDataStore.query({ code: 'cardType', is_use: '0' })
+  if ($checkRes(result)) cardTypeList.value = result.data
+}
 const search = async () => {
   let id = route.query.id
   if (id) {
@@ -136,12 +186,48 @@ const search = async () => {
     if (res.errcode == '0') info.value = res.data
   }
 }
+// 报名参赛
+const toSign = () => {
+  dialog.value = true
+}
+const toClose = () => {
+  dialog.value = false
+  form.value = {}
+}
 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}`
   }
 }
+// 报名
+const submitForm = async (formEl) => {
+  if (user.value.id) {
+    if (!formEl) return
+    await formEl.validate(async (valid, fields) => {
+      if (valid) {
+        const data = cloneDeep(form.value)
+        const other = {
+          match: info.value.id,
+          user: user.value.id,
+          time: moment().format('YYYY-MM-DD')
+        }
+        let res = await signStore.create({ ...data, ...other })
+        if ($checkRes(res, true)) toClose()
+      } else {
+        console.log('error submit!', fields)
+      }
+    })
+  } else {
+    ElMessage.error('用户未登录无法报名活动!')
+  }
+}
+// provide
+provide('form', form)
+provide('rules', rules)
+provide('ruleFormRef', ruleFormRef)
+provide('cardTypeList', cardTypeList)
+provide('submitForm', submitForm)
 </script>
 <style scoped lang="scss">
 .main {
@@ -191,10 +277,8 @@ const getUrl = (item, type) => {
       .title {
         color: #000;
         display: inline-block;
-        margin-right: 80px;
         padding-bottom: 20px;
         font-size: $global-font-size-30;
-        color: #000000;
         border-bottom: 5px solid #378cff;
         cursor: pointer;
       }
@@ -202,11 +286,13 @@ const getUrl = (item, type) => {
         display: flex;
         margin-top: 50px;
         .content_1 {
+          height: 200px;
           width: 630px;
           text-indent: 2em;
           font-size: 16px;
           line-height: 36px;
           color: #333333;
+          overflow: hidden;
         }
         .image {
           margin-left: 66px;
@@ -222,18 +308,32 @@ const getUrl = (item, type) => {
       .title {
         color: #000;
         display: inline-block;
-        margin-right: 80px;
         padding-bottom: 20px;
         font-size: $global-font-size-30;
-        color: #000000;
         border-bottom: 5px solid #378cff;
         cursor: pointer;
       }
       .content {
         display: flex;
         flex-direction: column;
-        align-items: center;
         justify-content: center;
+        align-items: center;
+        .thr_cont {
+          text-align: center;
+          margin: 10px 0;
+          width: 100%;
+          .thr_1 {
+            color: #000;
+            display: inline-block;
+            padding-bottom: 10px;
+            border-bottom: 5px solid #378cff;
+            font-size: $global-font-size-20;
+            cursor: pointer;
+          }
+          .thr_2 {
+            padding: 20px;
+          }
+        }
         .button {
           margin-top: 70px !important;
           justify-content: center;

+ 93 - 0
src/views/detail/parts/index.vue

@@ -0,0 +1,93 @@
+<template>
+  <div id="index">
+    <el-row>
+      <el-col :span="24" class="main">
+        <el-col :span="24" class="one">
+          <el-form
+            label-position="top"
+            ref="ruleFormRef"
+            :model="form"
+            :rules="rules"
+            label-width="80px"
+            class="form"
+          >
+            <el-row :gutter="20">
+              <el-col :span="12">
+                <el-form-item label="姓名" prop="name">
+                  <el-input clearable v-model="form.name" placeholder="请输入姓名"> </el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="电话号" prop="phone">
+                  <el-input clearable v-model="form.phone" placeholder="请输入电话号"> </el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row :gutter="20">
+              <el-col :span="12">
+                <el-form-item label="证件类型" prop="cardType">
+                  <el-select clearable v-model="form.cardType" placeholder="请选择证件类型">
+                    <el-option
+                      v-for="(item, index) in cardTypeList"
+                      :key="index"
+                      :label="item.label"
+                      :value="item.value"
+                    />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="证件号码" prop="card">
+                  <el-input clearable v-model="form.card" placeholder="请输入证件号码"> </el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row :gutter="20">
+              <el-col :span="12">
+                <el-form-item label="微信/QQ" prop="communication">
+                  <el-input clearable v-model="form.communication" placeholder="请输入微信/QQ">
+                  </el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="电子邮箱" prop="email">
+                  <el-input clearable v-model="form.email" placeholder="请输入电子邮箱"> </el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-form-item label="备注" prop="brief">
+              <el-input
+                v-model="form.remark"
+                :autosize="{ minRows: 2, maxRows: 8 }"
+                type="textarea"
+                placeholder="请输入备注"
+              />
+            </el-form-item>
+            <el-form-item>
+              <el-col :span="24" class="button">
+                <el-button type="primary" @click="submitForm(ruleFormRef)">保存</el-button>
+              </el-col>
+            </el-form-item>
+          </el-form>
+        </el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup>
+const ruleFormRef = inject('ruleFormRef')
+const form = inject('form')
+const rules = inject('rules')
+const cardTypeList = inject('cardTypeList')
+const submitForm = inject('submitForm')
+</script>
+<style scoped lang="scss">
+.main {
+  .one {
+    .button {
+      text-align: center;
+    }
+  }
+}
+</style>

+ 25 - 4
src/views/detail/project.vue

@@ -18,7 +18,7 @@
                 <span>行业</span>
               </div>
               <div v-if="!twoShow" class="OneRight">
-                <el-checkbox class="label" v-for="(item, index) in plateList.slice(0, 6)" :key="index" v-model="checked1" :label="item.title" size="large" />
+                <el-checkbox class="label" v-for="(item, index) in plateList.slice(0, 5)" :key="index" v-model="checked1" :label="item.title" size="large" />
               </div>
               <div v-else class="OneRight">
                 <el-checkbox class="label" v-for="(item, index) in plateList" :key="index" v-model="checked1" :label="item.title" size="large" />
@@ -37,10 +37,10 @@
                 <span>技术领域</span>
               </div>
               <div v-if="!oneShow" class="OneRight">
-                <el-checkbox class="label" v-for="(item, index) in typeList.slice(0, 8)" :key="index" v-model="checked1" :label="item.label" size="large" />
+                <el-checkbox class="label" v-for="(item, index) in typeList.slice(0, 8)" :key="index" v-model="checked2" :label="item.label" size="large" />
               </div>
               <div v-else class="OneRight">
-                <el-checkbox class="label" v-for="(item, index) in typeList" :key="index" v-model="checked1" :label="item.label" size="large" />
+                <el-checkbox class="label" v-for="(item, index) in typeList" :key="index" v-model="checked2" :label="item.label" size="large" />
               </div>
               <div class="button">
                 <span v-if="!oneShow" @click="oneShow = true">
@@ -67,6 +67,13 @@
                 <el-checkbox class="label" v-for="(item, index) in maturityList" :key="index" v-model="checked1" :label="item.label" size="large" />
               </div>
             </div>
+            <div class="one_ipunt">
+              <a-input class="input" size="large" v-model:value="searchForm.name" placeholder="项目名称" />
+              <a-input class="input" size="large" v-model:value="searchForm.tags" placeholder="标签名称" />
+              <a-input class="input" size="large" v-model:value="searchForm.source" placeholder="项目来源" />
+              <a-input class="input" size="large" v-model:value="searchForm.industry" placeholder="所属产业" />
+              <a-button class="button" size="large" type="primary">检索</a-button>
+            </div>
           </div>
           <div class="one_2_2">
             <div class="list" :class="['list' + index]" v-for="(item, index) in list" :key="index" @click="toView(item)">
@@ -125,6 +132,8 @@ const list = ref([])
 let skip = 0
 let limit = 15
 const total = ref(0)
+// 搜索
+const searchForm = ref({})
 // 请求
 onMounted(async () => {
   loading.value = true
@@ -146,8 +155,8 @@ const searchOther = async () => {
   // 技术领域
   result = await dictDataStore.query({ code: 'field', is_use: '0' })
   if ($checkRes(result)) typeList.value = result.data
-
   maturityList.value.unshift({ value: '-1', label: '不限' })
+
   result = await regionStore.list({ level: 'city', parent_code: 22 })
   if ($checkRes(result)) cityList.value = result.data
   cityList.value.unshift({ code: '-1', name: '不限' })
@@ -243,6 +252,18 @@ const sizeChange = (limits) => {
             margin: 0 5px 0 0;
           }
         }
+        .one_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;
+          }
+        }
       }
       .one_2_2 {
         margin: 20px 0;

+ 35 - 64
src/views/detail/studyDetail.vue

@@ -12,7 +12,7 @@
         </div>
         <div class="twoValue">
           <div class="value" v-for="(item, index) in list" :key="index">
-            <div class="table-colunm table-colunm1 textOne">{{ item.id || '暂无' }}</div>
+            <div class="table-colunm table-colunm1 textOne">{{ index + 1 || '暂无' }}</div>
             <div class="table-colunm table-colunm2 textOne">{{ item.name || '暂无' }}</div>
             <div class="table-colunm table-colunm1 textOne">{{ item.client || '暂无' }}</div>
             <div class="table-colunm table-colunm1 textOne">{{ item.partner || '暂无' }}</div>
@@ -21,7 +21,7 @@
           </div>
         </div>
         <div class="twoTotal">
-          <el-pagination background layout="prev, pager, next" :total="1000" />
+          <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>
     </div>
@@ -31,6 +31,9 @@
 <script setup>
 // 图片引入
 import lists from '/images/bg-tec-list.jpg'
+// 接口
+import { NotesStore } from '@/store/api/platform/notes'
+const store = NotesStore()
 import { UserStore } from '@/store/user'
 const userStore = UserStore()
 const user = computed(() => userStore.user)
@@ -38,6 +41,8 @@ const user = computed(() => userStore.user)
 const loading = ref(false)
 // 路由
 const router = useRouter()
+const route = useRoute()
+
 const column = ref([
   { name: '序号', key: 'id', style: { width: '116px' } },
   { name: '名称', key: 'name', style: { width: '420px' } },
@@ -46,77 +51,43 @@ const column = ref([
   { name: '研究主旨', key: 'brief', style: { width: '450px' } }
   // { name: '操作', key: 'operation', style: { width: '216px' } }
 ])
-const list = ref([
-  {
-    id: '1',
-    name: '吉林省智能传感器产业链创新发展研究',
-    client: '省工信厅',
-    partner: '吉林大学',
-    brief: '结合我曾经济发展特色和科研院所技术优势,明确产业发展方向'
-  },
-  {
-    id: '2',
-    name: '吉林省玉米深加工产业链创新发展研究',
-    client: '省工信厅',
-    partner: '省石化院',
-    brief: '针对产业锁条的堵点、断点,明确重需突破的关键共性技术,促进全首玉米深加工高质量发展'
-  },
-  {
-    id: '3',
-    name: '松原市玉米深加工产业园区高质量发展规划',
-    client: '省工信厅',
-    partner: '吉林大学',
-    brief:
-      '以松原市嘉吉生物化工产业园区为研究核心。提出推进产业基础高级化和产业现代化的政策保隐措施'
-  },
-  {
-    id: '4',
-    name: '吉林省肉牛(加工》产业发展研究',
-    client: '省工信厅',
-    partner: '吉林大学',
-    brief:
-      '以松原市嘉吉生物化工产业园区为研究核心。提出推进产业基础高级化和产业现代化的政策保隐措施'
-  },
-  {
-    id: '5',
-    name: '吉林省智能传感器产业链创新发展研究',
-    client: '省工信厅',
-    partner: '吉林大学',
-    brief: '结合我曾经济发展特色和科研院所技术优势,明确产业发展方向'
-  },
-  {
-    id: '6',
-    name: '吉林省玉米深加工产业链创新发展研究',
-    client: '省工信厅',
-    partner: '省石化院',
-    brief: '针对产业锁条的堵点、断点,明确重需突破的关键共性技术,促进全首玉米深加工高质量发展'
-  },
-  {
-    id: '7',
-    name: '松原市玉米深加工产业园区高质量发展规划',
-    client: '省工信厅',
-    partner: '吉林大学',
-    brief:
-      '以松原市嘉吉生物化工产业园区为研究核心。提出推进产业基础高级化和产业现代化的政策保隐措施'
-  },
-  {
-    id: '8',
-    name: '吉林省肉牛(加工》产业发展研究',
-    client: '省工信厅',
-    partner: '吉林大学',
-    brief:
-      '以松原市嘉吉生物化工产业园区为研究核心。提出推进产业基础高级化和产业现代化的政策保隐措施'
-  }
-])
+const list = ref([])
+let skip = 0
+let limit = inject('limit')
+const total = ref(0)
 // 请求
 onMounted(async () => {
   loading.value = true
+  await search({ skip, limit })
   loading.value = false
 })
+const search = async (query = { skip, limit }) => {
+  if (route.query.id) {
+    skip = query.skip
+    limit = query.limit
+    const info = { skip: query.skip, limit: query.limit, journal: route.query.id }
+    const res = await store.query(info)
+    if (res.errcode == '0') {
+      list.value = res.data
+      total.value = res.total
+    }
+  }
+}
 // 查看
 const toView = (item) => {
   // router.push({ path: `/expert/detail`, query: { id: item.id || item._id } })
 }
+const currentPage = ref(1)
+// 分页
+const changePage = (page = currentPage.value) => {
+  search({ skip: (page - 1) * limit, limit: limit })
+}
+const sizeChange = (limits) => {
+  console.log(limits)
+  limit = limits
+  currentPage.value = 1
+  search({ skip: 0, limit: limit })
+}
 </script>
 <style scoped lang="scss">
 .main {

+ 23 - 17
src/views/five/index.vue

@@ -63,6 +63,13 @@
             </el-col>
           </el-row>
         </el-col>
+        <div class="two_ipunt">
+          <a-input class="input" size="large" v-model:value="searchForm.name" placeholder="活动名称" />
+          <a-input class="input" size="large" v-model:value="searchForm.tags" placeholder="标签名称" />
+          <a-input class="input" size="large" v-model:value="searchForm.industry" placeholder="所属产业" />
+          <a-input class="input" size="large" v-model:value="searchForm.work" placeholder="组织单位" />
+          <a-button class="button" size="large" type="primary">检索</a-button>
+        </div>
         <el-col :span="24" class="two_2">
           <div class="list" v-for="(item, index) in list" :key="index">
             <el-image class="image" :src="getUrl(item.file)" fit="cover"> </el-image>
@@ -90,7 +97,6 @@ import lists from '/images/bg-act-list.jpg'
 import time1 from '/images/time-dary.png'
 const $checkRes = inject('$checkRes')
 import { Search } from '@element-plus/icons-vue'
-import { get } from 'lodash-es'
 import { MatchStore } from '@/store/api/platform/match'
 import { DictDataStore } from '@/store/api/system/dictData'
 const store = MatchStore()
@@ -165,22 +171,10 @@ const handleClick = async (tab) => {
   await search({ skip, limit })
   loading.value = false
 }
-// 字典数据转换
-const getDict = (data, model) => {
-  let res
-  if (model == 'form') res = formList.value.find((f) => f.value == data)
-  else if (model == 'type') res = typeList.value.find((f) => f.value == data)
-  else if (model == 'status') res = statusList.value.find((f) => f.value == data)
-  return get(res, 'label')
-}
 // 查看
 const toView = (item) => {
   router.push({ path: '/match/detail', query: { id: item.id || item._id } })
 }
-// 时间
-const getTime = (data) => {
-  if (data) return `${data[0]} - ${data[1]}`
-}
 // 查询名称
 const onSearch = () => {
   search({ skip, limit })
@@ -244,7 +238,7 @@ const getUrl = (item) => {
     .two_1 {
       background: #ffffff;
       border-radius: 10px;
-      padding: 15px;
+      padding: 15px 0;
       margin: 10px 0;
       .two_1_1 {
         border-bottom: 1px solid #e4e7ed;
@@ -300,6 +294,18 @@ const getUrl = (item) => {
         }
       }
     }
+    .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;
+      }
+    }
     .two_2 {
       display: flex;
       justify-content: space-between;
@@ -307,13 +313,13 @@ const getUrl = (item) => {
       align-items: center;
 
       .list {
-        width: 425px;
-        padding: 20px;
+        width: 430px;
+        padding: 20px 10px;
         border-radius: 3px;
 
         transition: box-shadow 0.3s ease; /* 添加过渡效果,使阴影的出现更平滑 */
         .image {
-          width: 385px;
+          width: 410px;
           height: 250px;
           border-radius: 4px;
           overflow: hidden;

+ 28 - 32
src/views/four/parts/index.vue

@@ -317,9 +317,9 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9
-        // is_use: '0',
-        // status: '1'
+        limit: 9,
+        is_use: '0',
+        status: '1'
       }
       if (active) info.industry = '汽车电子及新型汽车零部件'
       const res = await store.query(info)
@@ -334,9 +334,9 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9
-        // is_use: '0',
-        // status: '1'
+        limit: 9,
+        is_use: '0',
+        status: '1'
       }
       if (active) info.industry = '光电子及智能传感器'
       const res = await store.query(info)
@@ -351,9 +351,9 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9
-        // is_use: '0',
-        // status: '1'
+        limit: 9,
+        is_use: '0',
+        status: '1'
       }
       if (active) info.industry = '精密仪器及先进装备'
       const res = await store.query(info)
@@ -368,9 +368,9 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9
-        // is_use: '0',
-        // status: '1'
+        limit: 9,
+        is_use: '0',
+        status: '1'
       }
       if (active) info.industry = '生物医药及先进医疗器械'
       const res = await store.query(info)
@@ -385,9 +385,9 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9
-        // is_use: '0',
-        // status: '1'
+        limit: 9,
+        is_use: '0',
+        status: '1'
       }
       if (active) info.industry = '车规级芯片及功率半导体器件'
       const res = await store.query(info)
@@ -402,9 +402,9 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9
-        // is_use: '0',
-        // status: '1'
+        limit: 9,
+        is_use: '0',
+        status: '1'
       }
       if (active) info.industry = '人工智能及智能机器人'
       const res = await store.query(info)
@@ -419,9 +419,9 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9
-        // is_use: '0',
-        // status: '1'
+        limit: 9,
+        is_use: '0',
+        status: '1'
       }
       if (active) info.industry = '生物基及高性能新材料'
       const res = await store.query(info)
@@ -436,9 +436,9 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9
-        // is_use: '0',
-        // status: '1'
+        limit: 9,
+        is_use: '0',
+        status: '1'
       }
       if (active) info.industry = '新能源及动力电池'
       const res = await store.query(info)
@@ -453,9 +453,9 @@ const search = async (active) => {
     else {
       const info = {
         skip: 0,
-        limit: 9
-        // is_use: '0',
-        // status: '1'
+        limit: 9,
+        is_use: '0',
+        status: '1'
       }
       if (active) info.industry = '碳纤维及复合材料'
       const res = await store.query(info)
@@ -532,7 +532,7 @@ const toView = (item, type) => {
 }
 // 查看更多
 const toMore = (type) => {
-  if (type == '0') router.push({ path: '/news', query: { type } })
+  if (type == '0') router.push({ path: '/news' })
   else if (type == '1') router.push({ path: '/project' })
   else if (type == '2') router.push({ path: '/expert' })
   else if (type == '3') router.push({ path: '/company' })
@@ -543,10 +543,6 @@ const mouseOver = async (item) => {
   active.value = item.type
   await search(item.type)
 }
-// 联络专家
-const toChat = (item) => {
-  router.push({ path: '/chat', query: { id: item.user } })
-}
 // 查看成果
 const toAchive = (item) => {
   router.push({ path: '/nine', query: { type: item.value } })

+ 23 - 2
src/views/nine/index.vue

@@ -81,7 +81,7 @@
             </div>
           </div>
         </div>
-        <div class="twoSeacher">
+        <div class="twoSeacher border">
           <div class="twoLeft">
             <span>所在地</span>
           </div>
@@ -91,6 +91,13 @@
             </div>
           </div>
         </div>
+        <div class="two_ipunt">
+          <a-input class="input" size="large" v-model:value="searchForm.name" placeholder="成果名称" />
+          <a-input class="input" size="large" v-model:value="searchForm.tags" placeholder="标签名称" />
+          <a-input class="input" size="large" v-model:value="searchForm.source" placeholder="项目来源" />
+          <a-input class="input" size="large" v-model:value="searchForm.industry" placeholder="所属产业" />
+          <a-button class="button" size="large" type="primary">检索</a-button>
+        </div>
       </div>
       <div class="thr">
         <div class="list" v-for="(item, index) in list" :key="index" @click="toView(item)">
@@ -172,6 +179,8 @@ const sellList = ref([])
 const cityList = ref([])
 const typeList = ref([])
 const plateList = ref([])
+// 搜索
+const searchForm = ref({})
 // 请求
 onMounted(async () => {
   loading.value = true
@@ -299,10 +308,22 @@ const sizeChange = (limits) => {
         margin: 0 5px 0 0;
       }
     }
-    .twoSeacher:last-child {
+    .border {
       border: solid 1px #e5e5e5;
       border-bottom: 1 !important;
     }
+    .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 {
     margin: 10px 0;

+ 4 - 3
src/views/one/index.vue

@@ -81,7 +81,7 @@
           </div>
           <div class="two_2_2">
             <vue3-seamless-scroll :list="achievementList" :hover="true" :step="0.5" :wheel="true" :isWatch="true">
-              <el-col :span="24" class="list" v-for="(item, index) in achievementList" :key="index" @click="toView(item, '0')">
+              <el-col :span="24" class="list" v-for="(item, index) in achievementList" :key="index" @click="toView(item, '1')">
                 <el-col :span="19" class="left">
                   <el-image class="image" :src="liIcon" fit="fill" />
                   <div class="content textOne">{{ item.name || '暂无标题' }}-{{ item.field || '暂无' }}-{{ item.source || '暂无' }}</div>
@@ -115,7 +115,7 @@
               <el-image class="image" :src="time1" fit="fill" />
               <div>{{ matchInfo.start_time || '暂无' }}~{{ matchInfo.end_time || '暂无' }}</div>
             </div>
-            <div class="button" @click="toView(matchInfo, '1')">查看 ></div>
+            <div class="button" @click="toView(matchInfo, '2')">查看 ></div>
           </div>
         </div>
         <div class="right">
@@ -132,7 +132,7 @@
                 <el-image class="image" :src="time1" fit="fill" />
                 <div>{{ item.start_time || '暂无' }}~{{ item.end_time || '暂无' }}</div>
               </div>
-              <div class="button" @click="toView(item, '1')">查看 ></div>
+              <div class="button" @click="toView(item, '2')">查看 ></div>
             </div>
           </div>
         </div>
@@ -275,6 +275,7 @@ const searchMatch = async () => {
 // 查看详情
 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 } })
 }
 // 查看更多

+ 18 - 0
src/views/seven/index.vue

@@ -62,6 +62,12 @@
           </div>
         </div>
       </div>
+      <div class="two_ipunt">
+        <a-input class="input" size="large" v-model:value="searchForm.name" placeholder="服务名称" />
+        <a-input class="input" size="large" v-model:value="searchForm.tags" placeholder="标签名称" />
+        <a-input class="input" size="large" v-model:value="searchForm.industry" placeholder="所属产业" />
+        <a-button class="button" size="large" type="primary">检索</a-button>
+      </div>
       <div class="twoTwo">
         <div class="twoTable">
           <div class="label" v-for="(item, index) in column" :key="index" :style="item.style">
@@ -234,6 +240,18 @@ const sizeChange = (limits) => {
       }
     }
   }
+  .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;
+    }
+  }
   .twoTwo {
     margin: 10px 0;
     .twoTable {

+ 1 - 1
src/views/thirteen/index.vue

@@ -53,7 +53,7 @@ const search = async (query = { skip, limit }) => {
 }
 // 查看详情
 const toView = async (item) => {
-  router.push({ path: '/thirteen/list', query: { id: item.id || item._id } })
+  router.push({ path: '/study/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}`

+ 20 - 0
src/views/thr/parts/demand.vue

@@ -58,6 +58,13 @@
         </div>
       </div>
     </div>
+    <div class="demandIpunt">
+      <a-input class="input" size="large" v-model:value="searchForm.name" placeholder="需求名称" />
+      <a-input class="input" size="large" v-model:value="searchForm.tags" placeholder="标签名称" />
+      <a-input class="input" size="large" v-model:value="searchForm.industry" placeholder="所属产业" />
+      <a-input class="input" size="large" v-model:value="searchForm.company" placeholder="所属企业" />
+      <a-button class="button" size="large" type="primary">检索</a-button>
+    </div>
     <div class="demandTwo">
       <div class="demandTable">
         <div class="label" v-for="(item, index) in column" :key="index" :style="item.style">
@@ -90,6 +97,7 @@ const changePage = inject('changePage')
 const plateList = inject('plateList')
 const typeList = inject('typeList')
 const cityList = inject('cityList')
+const searchForm = ref({})
 // 是否展开
 const oneShow = ref(false)
 const twoShow = ref(false)
@@ -171,6 +179,18 @@ const getArea = (data) => {
       }
     }
   }
+  .demandIpunt {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin: 10px 0;
+    .input {
+      margin: 0 5px 0 0;
+    }
+    .button {
+      margin: 0 0 0 5px;
+    }
+  }
   .demandTwo {
     margin: 10px 0;
     .demandTable {

+ 20 - 0
src/views/thr/parts/supply.vue

@@ -58,6 +58,13 @@
         </div>
       </div>
     </div>
+    <div class="demandIpunt">
+      <a-input class="input" size="large" v-model:value="searchForm.name" placeholder="供应名称" />
+      <a-input class="input" size="large" v-model:value="searchForm.tags" placeholder="标签名称" />
+      <a-input class="input" size="large" v-model:value="searchForm.industry" placeholder="所属产业" />
+      <a-input class="input" size="large" v-model:value="searchForm.source" placeholder="所属来源" />
+      <a-button class="button" size="large" type="primary">检索</a-button>
+    </div>
     <div class="demandTwo">
       <div class="demandTable">
         <div class="label" v-for="(item, index) in column" :key="index" :style="item.style">
@@ -90,6 +97,7 @@ const changePage = inject('changePage')
 const plateList = inject('plateList')
 const typeList = inject('typeList')
 const cityList = inject('cityList')
+const searchForm = ref({})
 // 是否展开
 const oneShow = ref(false)
 const twoShow = ref(false)
@@ -165,6 +173,18 @@ const toView = (item) => {
       }
     }
   }
+  .demandIpunt {
+    display: flex;
+    align-items: center;
+    justify-content: space-between;
+    margin: 10px 0;
+    .input {
+      margin: 0 5px 0 0;
+    }
+    .button {
+      margin: 0 0 0 5px;
+    }
+  }
   .demandTwo {
     margin: 10px 0;
     .demandTable {