This commit is contained in:
hh
2022-02-18 14:48:45 +08:00
parent 43023de455
commit 0d3ffe3619
16 changed files with 1153 additions and 237 deletions

View File

@ -1,78 +1 @@
## 平台简介
* 本仓库为前端技术栈 [Vue3](https://v3.cn.vuejs.org) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 版本。
* 配套后端代码仓库地址[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) 或 [RuoYi-Vue-fast](https://github.com/yangzongzhuan/RuoYi-Vue-fast) 版本。
* 前端技术栈([Vue2](https://cn.vuejs.org) + [Element](https://github.com/ElemeFE/element) + [Vue CLI](https://cli.vuejs.org/zh)),请移步[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue/tree/master/ruoyi-ui)。
* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip)  
* 阿里云优惠券:[点我领取](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console)  
## 内置功能
1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。
2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。
3. 岗位管理:配置系统用户所属担任职务。
4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。
5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。
7. 参数管理:对系统动态配置常用参数。
8. 通知公告:系统通知公告信息发布维护。
9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
10. 登录日志:系统登录日志记录查询包含登录异常。
11. 在线用户:当前系统中活跃用户状态监控。
12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。
13. 代码生成前后端代码的生成java、html、xml、sql支持CRUD下载 。
14. 系统接口根据业务代码自动生成相关的api接口文档。
15. 服务监控监视当前系统CPU、内存、磁盘、堆栈等相关信息。
16. 缓存监控:对系统的缓存信息查询,命令统计等。
17. 在线构建器拖动表单元素生成相应的HTML代码。
18. 连接池监视监视当前系统数据库连接池状态可进行分析SQL找出系统性能瓶颈。
## 在线体验
- admin/admin123
- 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。
演示地址http://vue.ruoyi.vip
文档地址http://doc.ruoyi.vip
## 演示图
<table>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/cd1f90be5f2684f4560c9519c0f2a232ee8.jpg"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/1cbcf0e6f257c7d3a063c0e3f2ff989e4b3.jpg"/></td>
</tr>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/up-8074972883b5ba0622e13246738ebba237a.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-9f88719cdfca9af2e58b352a20e23d43b12.png"/></td>
</tr>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/up-39bf2584ec3a529b0d5a3b70d15c9b37646.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-936ec82d1f4872e1bc980927654b6007307.png"/></td>
</tr>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/up-b2d62ceb95d2dd9b3fbe157bb70d26001e9.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-d67451d308b7a79ad6819723396f7c3d77a.png"/></td>
</tr>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/5e8c387724954459291aafd5eb52b456f53.jpg"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/644e78da53c2e92a95dfda4f76e6d117c4b.jpg"/></td>
</tr>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/up-8370a0d02977eebf6dbf854c8450293c937.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-49003ed83f60f633e7153609a53a2b644f7.png"/></td>
</tr>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/up-d4fe726319ece268d4746602c39cffc0621.png"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-c195234bbcd30be6927f037a6755e6ab69c.png"/></td>
</tr>
<tr>
<td><img src="https://oscimg.oschina.net/oscnet/b6115bc8c31de52951982e509930b20684a.jpg"/></td>
<td><img src="https://oscimg.oschina.net/oscnet/up-5e4daac0bb59612c5038448acbcef235e3a.png"/></td>
</tr>
</table>
## 若依前后端分离交流群
QQ群 [![加入QQ群](https://img.shields.io/badge/已满-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![加入QQ群](https://img.shields.io/badge/已满-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![加入QQ群](https://img.shields.io/badge/已满-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![加入QQ群](https://img.shields.io/badge/已满-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![加入QQ群](https://img.shields.io/badge/已满-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![加入QQ群](https://img.shields.io/badge/已满-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![加入QQ群](https://img.shields.io/badge/已满-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![加入QQ群](https://img.shields.io/badge/101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) 点击按钮入群。
npm run dev 启动项目

View File

@ -53,6 +53,18 @@ export const constantRoutes = [
path: 'searchList/1',
component: () => import('../views/website/searchList/index1.vue'),
},
{
path: 'searchList/1/detail/:id',
component: () => import('../views/website/searchList/index1Detail.vue'),
},
{
path: 'searchList/2',
component: () => import('../views/website/searchList/index2.vue'),
},
{
path: 'searchList/3',
component: () => import('../views/website/searchList/index3.vue'),
},
{
path: 'searchList/4',
component: () => import('../views/website/searchList/index4.vue'),

View File

@ -1,5 +1,7 @@
<template>
<div class="box">
<div class="box"
style="background-size: cover;background-color: #fff"
:style="{ backgroundImage: state.banner ? `url(${state.banner})` : '' }">
<div>
<el-row>
<el-col :push="4" :sm="10" :md="12">
@ -61,6 +63,7 @@
<script setup>
import { onMounted, reactive } from "vue";
import { banner } from "@/api/website/home/index";
const router = useRouter();
import request from '@/utils/request'
function indexData () {
@ -85,6 +88,7 @@ const state = reactive({
'找企业', '找成果', '找实验室', '找专利', '找专家', '接需求'
],
tabIndex: 0,
banner: '',
data: {
expert_count: 0,
company_count: 0,
@ -96,6 +100,11 @@ const state = reactive({
});
onMounted(() => {
banner('首页背景').then(res => {
if (200 == res.code) {
state.banner = res.data.images
}
})
indexData().then(res => {
if (200 == res.code) {
state.data = res.data

View File

@ -337,27 +337,27 @@ function loadMap (mapName, data) {
backgroundColor: "transparent",
itemStyle: {
normal: {
color: '#ccc',
color: '#333333',
areaColor: '#fff',
borderColor: '#fff',
borderColor: '#666666',
borderWidth: 0.5,
label: {
show: true,
textStyle: {
color: "rgb(249, 249, 249)"
color: "#333333",
}
}
},
emphasis: {
areaColor: "rgb(237, 201, 216)",
borderColor: '#fff',
areaColor: "rgb(38, 219, 11)",
borderColor: '#666666',
areaStyle: {
color: '#fff'
color: '#333333'
},
label: {
show: true,
textStyle: {
color: "rgb(249, 249, 249)"
color: "#333333"
},
// formatter: function (value) { //标签的格式化工具。
// return value.name + '' + value.value; // 范围标签显示内容。
@ -423,10 +423,10 @@ function loadMap (mapName, data) {
}
}
.leftBox {
left: 10%;
left: 6%;
}
.rightBox {
right: 10%;
right: 6%;
max-height: 465px !important;
}
@ -434,7 +434,7 @@ function loadMap (mapName, data) {
.rightBox {
position: absolute;
top: 25%;
max-width: 280px;
max-width: 250px;
min-width: 200px;
max-height: 256px;
overflow: hidden;

View File

@ -335,7 +335,7 @@ function loadMap (mapName, data) {
normal: {
color: '#333333',
areaColor: '#fff',
borderColor: '#333333',
borderColor: '#666666',
borderWidth: 0.5,
label: {
show: true,
@ -345,8 +345,8 @@ function loadMap (mapName, data) {
}
},
emphasis: {
areaColor: "rgb(237, 201, 216)",
borderColor: '#333333',
areaColor: "rgb(38, 219, 11)",
borderColor: '#666666',
areaStyle: {
color: '#333333'
},
@ -418,10 +418,10 @@ function loadMap (mapName, data) {
}
}
.leftBox {
left: 10%;
left: 6%;
}
.rightBox {
right: 10%;
right: 6%;
max-height: 465px !important;
}
@ -429,7 +429,7 @@ function loadMap (mapName, data) {
.rightBox {
position: absolute;
top: 25%;
max-width: 280px;
max-width: 250px;
min-width: 200px;
max-height: 256px;
overflow: hidden;

View File

@ -333,27 +333,27 @@ function loadMap (mapName, data) {
backgroundColor: "transparent",
itemStyle: {
normal: {
color: '#ccc',
color: '#333333',
areaColor: '#fff',
borderColor: '#fff',
borderColor: '#666666',
borderWidth: 0.5,
label: {
show: true,
textStyle: {
color: "rgb(249, 249, 249)"
color: "#333333",
}
}
},
emphasis: {
areaColor: "rgb(237, 201, 216)",
borderColor: '#fff',
areaColor: "rgb(38, 219, 11)",
borderColor: '#666666',
areaStyle: {
color: '#fff'
color: '#333333'
},
label: {
show: true,
textStyle: {
color: "rgb(249, 249, 249)"
color: "#333333"
},
// formatter: function (value) { //标签的格式化工具。
// return value.name + '' + value.value; // 范围标签显示内容。
@ -419,10 +419,10 @@ function loadMap (mapName, data) {
}
}
.leftBox {
left: 10%;
left: 6%;
}
.rightBox {
right: 10%;
right: 6%;
max-height: 465px !important;
}
@ -430,7 +430,7 @@ function loadMap (mapName, data) {
.rightBox {
position: absolute;
top: 25%;
max-width: 280px;
max-width: 250px;
min-width: 200px;
max-height: 256px;
overflow: hidden;

View File

@ -335,7 +335,7 @@ function loadMap (mapName, data) {
normal: {
color: '#333333',
areaColor: '#fff',
borderColor: '#333333',
borderColor: '#666666',
borderWidth: 0.5,
label: {
show: true,
@ -345,8 +345,8 @@ function loadMap (mapName, data) {
}
},
emphasis: {
areaColor: "rgb(237, 201, 216)",
borderColor: '#333333',
areaColor: "rgb(38, 219, 11)",
borderColor: '#666666',
areaStyle: {
color: '#333333'
},
@ -418,10 +418,10 @@ function loadMap (mapName, data) {
}
}
.leftBox {
left: 10%;
left: 6%;
}
.rightBox {
right: 10%;
right: 6%;
max-height: 465px !important;
}
@ -429,7 +429,7 @@ function loadMap (mapName, data) {
.rightBox {
position: absolute;
top: 25%;
max-width: 280px;
max-width: 250px;
min-width: 200px;
max-height: 256px;
overflow: hidden;

View File

@ -333,27 +333,27 @@ function loadMap (mapName, data) {
backgroundColor: "transparent",
itemStyle: {
normal: {
color: '#ccc',
color: '#333333',
areaColor: '#fff',
borderColor: '#fff',
borderColor: '#666666',
borderWidth: 0.5,
label: {
show: true,
textStyle: {
color: "rgb(249, 249, 249)"
color: "#333333",
}
}
},
emphasis: {
areaColor: "rgb(237, 201, 216)",
borderColor: '#fff',
areaColor: "rgb(38, 219, 11)",
borderColor: '#666666',
areaStyle: {
color: '#fff'
color: '#333333'
},
label: {
show: true,
textStyle: {
color: "rgb(249, 249, 249)"
color: "#333333"
},
// formatter: function (value) { //标签的格式化工具。
// return value.name + '' + value.value; // 范围标签显示内容。
@ -419,10 +419,10 @@ function loadMap (mapName, data) {
}
}
.leftBox {
left: 10%;
left: 6%;
}
.rightBox {
right: 10%;
right: 6%;
max-height: 465px !important;
}
@ -430,7 +430,7 @@ function loadMap (mapName, data) {
.rightBox {
position: absolute;
top: 25%;
max-width: 280px;
max-width: 250px;
min-width: 200px;
max-height: 256px;
overflow: hidden;

View File

@ -125,16 +125,16 @@ let state = reactive({
},
showBox: 0,
boxList: [
{
comp: index1,
zIndex: 1,
title: "index1",
},
{
comp: index2,
zIndex: 1,
title: "index2",
},
// {
// comp: index1,
// zIndex: 1,
// title: "index1",
// },
// {
// comp: index2,
// zIndex: 1,
// title: "index2",
// },
{
comp: index3,
zIndex: 1,

View File

@ -0,0 +1,136 @@
<template>
<div class="box">
<div class="wrap">
<div class="img">
<!-- <img :src="data.image" alt /> -->
<img src="https://t7.baidu.com/it/u=1951548898,3927145&fm=193&f=GIF" />
</div>
<div class="content">
<div class="tit" @click="handleDetail(data.id)">{{ data.title }}</div>
<slot name="des" />
<div v-if="data.industrys" class="line">
所属领域
<span>{{ data.industrys[data.industrys.length - 1] }}</span>
</div>
<div class="line">
合作模式
<span>{{ data.mode_title }}</span>
</div>
<div class="line">
技术成熟度
<span>{{ data.maturity_title }}</span>
</div>
</div>
<div>
<div class="keywords">
<wordcloud v-if="data.keywords" :data="createdData(data.customers)"></wordcloud>
</div>
<collectAndVisit :is_collect="data.is_collect" :collect_count="data.collect_count" :visit_count="data.visit_count" :object_id="data.id" :kind="1005"/>
</div>
</div>
</div>
</template>
<script setup>
import wordcloud from './wordcloud.vue'
import collectAndVisit from './collectAndVisit.vue'
const router = useRouter();
const props = defineProps({
data: {
type: Object,
required: true,
},
});
function handleDetail (id) {
let routeData = router.resolve({ path: `/searchList/1/detail/${id}` });
window.open(routeData.href, '_blank');
}
function createdData (arr) {
let l = [];
let snap = JSON.parse(JSON.stringify(arr))
snap.map(e => {
l.push({ name: e, value: 30 })
return { name: e, value: 30 }
})
return l;
}
</script>
<style lang="scss" scoped>
.box {
width: 100%;
height: 190px;
background: #ffffff;
padding: 20px;
box-sizing: border-box;
.wrap {
display: flex;
flex-direction: row;
.img {
width: 200px;
height: 150px;
margin-right: 10px;
img {
display: block;
margin: 0;
width: 100%;
height: 100%;
}
}
.keywords {
width: 129px;
height: 129px;
}
.content {
flex: 1;
overflow: hidden;
.labelList {
overflow: hidden;
div {
padding: 2px 4px;
float: left;
background: #0054ff;
border-radius: 4px;
margin-right: 5px;
margin-bottom: 5px;
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #ffffff;
}
}
.line {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
margin: 10px 0;
span {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 500;
color: #333;
}
}
.tit {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 100%;
font-size: 20px;
font-family: Source Han Sans CN;
font-weight: bold;
color: #333333;
overflow: hidden;
cursor: pointer;
}
}
}
}
</style>

View File

@ -0,0 +1,141 @@
<!-- to do 实验室后台模块未开发 2022/02/17 -->
<template>
<div class="box">
<div class="wrap">
<div class="img">
<!-- <img :src="data.image" alt /> -->
<img src="https://t7.baidu.com/it/u=1951548898,3927145&fm=193&f=GIF" />
</div>
<div class="content">
<div class="tit" @click="handleDetail(data.id)">{{ data.title }}</div>
<slot name="des" />
<div v-if="data.industrys" class="line">
所属领域
<span>{{ data.industrys[data.industrys.length - 1] }}</span>
</div>
<div class="line">
依托管理部门
<span>{{ data.mode_title }}</span>
</div>
<div class="line">
合作模式
<span>{{ data.mode_title }}</span>
</div>
<div class="line">
技术成熟度
<span>{{ data.maturity_title }}</span>
</div>
</div>
<div>
<div class="keywords">
<wordcloud v-if="data.keywords" :data="createdData(data.customers)"></wordcloud>
</div>
<collectAndVisit :is_collect="data.is_collect" :collect_count="data.collect_count" :visit_count="data.visit_count" :object_id="data.id" :kind="1005"/>
</div>
</div>
</div>
</template>
<script setup>
import wordcloud from './wordcloud.vue'
import collectAndVisit from './collectAndVisit.vue'
const router = useRouter();
const props = defineProps({
data: {
type: Object,
required: true,
},
});
function handleDetail (id) {
let routeData = router.resolve({ path: `/searchList/1/detail/${id}` });
window.open(routeData.href, '_blank');
}
function createdData (arr) {
let l = [];
let snap = JSON.parse(JSON.stringify(arr))
snap.map(e => {
l.push({ name: e, value: 30 })
return { name: e, value: 30 }
})
return l;
}
</script>
<style lang="scss" scoped>
.box {
width: 100%;
height: 190px;
background: #ffffff;
padding: 20px;
box-sizing: border-box;
.wrap {
display: flex;
flex-direction: row;
.img {
width: 200px;
height: 150px;
margin-right: 10px;
img {
display: block;
margin: 0;
width: 100%;
height: 100%;
}
}
.keywords {
width: 129px;
height: 129px;
}
.content {
flex: 1;
overflow: hidden;
.labelList {
overflow: hidden;
div {
padding: 2px 4px;
float: left;
background: #0054ff;
border-radius: 4px;
margin-right: 5px;
margin-bottom: 5px;
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #ffffff;
}
}
.line {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
margin: 10px 0;
span {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 500;
color: #333;
}
}
.tit {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 100%;
font-size: 20px;
font-family: Source Han Sans CN;
font-weight: bold;
color: #333333;
overflow: hidden;
cursor: pointer;
}
}
}
}
</style>

View File

@ -6,54 +6,20 @@
@handleQuery="handleQuery"
>
<template v-slot>
<el-row type="flex" style="padding: 20px 0">
<el-row type="flex" style="padding: 20px 0;">
<div style="flex: 1">
<div style="position: relative">
<div style="position: relative;">
<industrySelect @industryChange="industryChange"></industrySelect>
<div class="total">
共找到
<span>{{ state.total }}</span> 个成果
</div>
<div v-loading="loading">
<div class="item" v-for="item in state.list" :key="item.id">
<el-row type="flex" style="padding: 40px 20px">
<div class="img">
<!-- <img :src="item.image" alt /> -->
<img
src="https://t7.baidu.com/it/u=1951548898,3927145&fm=193&f=GIF"
alt
/>
</div>
<div class="content">
<div class="tit" @click="handleDetail(item.id)">
<div style="float: right">
<span>匹配度</span>
<el-rate
style="display: inline-block"
v-model="state.val"
disabled
></el-rate>
</div>
<div class="text" style="flex: 1">{{ item.name }}</div>
</div>
<div class="line">
企业规模 <span>{{ item.kind_title }}</span>
</div>
<div class="line">
核心产品及应用场景 <span>{{ item.product }}</span>
</div>
<div class="line">
企业网站
<a :href="item.url"
><span>{{ item.url }}</span></a
>
</div>
</div>
<div class="keywords" style="flex: 1">
<wordcloud :data="createdData(item.keywords)"></wordcloud>
</div>
</el-row>
</div>
<section v-for="item in state.list" :key="item.id">
<div style="border: 1px solid #DCDCDC;margin-bottom: 10px;">
<gainItem :data="item"></gainItem>
</div>
</section>
</div>
<pagination
@ -67,7 +33,9 @@
/>
</div>
</div>
<div class="r"><webContact /></div>
<div class="r">
<webContact />
</div>
</el-row>
</template>
</searchContainer>
@ -76,19 +44,17 @@
<script setup>
import webContact from "@/components/webContact/index.vue";
import request from "@/utils/request";
import request from '@/utils/request'
const router = useRouter();
import { onMounted } from "vue";
import searchContainer from "./components/searchContainer.vue";
import industrySelect from "./components/industrySelect.vue";
import wordcloud from "./components/wordcloud.vue";
import { onMounted } from 'vue';
import searchContainer from './components/searchContainer.vue'
import industrySelect from './components/industrySelect.vue'
import gainItem from './components/gainItem.vue'
import wordcloud from './components/wordcloud.vue'
function handleDetail(id) {
let routeData = router.resolve({
path: `/searchList/0/detail/${id}`,
query: { keyword: state.keyword },
});
window.open(routeData.href, "_blank");
function handleDetail (id) {
let routeData = router.resolve({ path: `/searchList/0/detail/${id}`, query: { keyword: state.keyword } });
window.open(routeData.href, '_blank');
}
const loading = ref(true);
@ -97,35 +63,33 @@ const state = reactive({
total: 1,
pageSize: 10,
pageSizes: [10, 10 << 1, 10 << 2, 10 << 3],
keyword: "",
keyword: '',
industryList: [],
id1: "",
id2: "",
id3: "",
id1: '',
id2: '',
id3: '',
val: 3,
arr: [
{
name: "Cat",
value: 26,
},
{
name: "fish",
value: 19,
},
],
arr: [{
"name": "Cat",
"value": 26
},
{
"name": "fish",
"value": 19
}]
});
function createdData(arr) {
function createdData (arr) {
let l = [];
let snap = JSON.parse(JSON.stringify(arr));
snap.map((e) => {
l.push({ name: e, value: 30 });
return { name: e, value: 30 };
});
let snap = JSON.parse(JSON.stringify(arr))
snap.map(e => {
l.push({ name: e, value: 30 })
return { name: e, value: 30 }
})
return l;
}
function search() {
let industry = "";
function search () {
let industry = '';
if (state.id1) {
industry += state.id1;
}
@ -136,23 +100,19 @@ function search() {
industry += `-${state.id3}`;
}
return request({
url: "/v1/search",
method: "post",
data: {
industry,
mode: 2,
page_num: state.pageNum,
page_size: state.pageSize,
keyword: state.keyword,
},
});
url: '/v1/search',
method: 'post',
data: { industry, mode: 2, page_num: state.pageNum, page_size: state.pageSize, keyword: state.keyword }
})
}
function handleQuery(keyword) {
function handleQuery (keyword) {
state.keyword = keyword;
getDataList();
getDataList()
}
function industryChange(industry) {
function industryChange (industry) {
if (industry.id1) {
state.id1 = industry.id1;
}
@ -162,27 +122,23 @@ function industryChange(industry) {
if (industry.id3) {
state.id3 = industry.id3;
}
getDataList();
getDataList()
}
function getDataList() {
function getDataList () {
loading.value = true;
search()
.then((res) => {
if (200 == res.code) {
// 总条数
// state.total = res.data.count;
// state.list = res.data.data;
// todo... detail页暂无
state.total = 0;
state.list = [];
loading.value = false;
}
})
.catch(() => {
search().then(res => {
if (200 == res.code) {
// 总条数
state.total = res.data.count;
state.list = res.data.data;
loading.value = false;
});
}
}).catch(() => {
loading.value = false;
})
}
</script>
<style lang="scss" scoped>
@ -203,7 +159,7 @@ function getDataList() {
width: 325px;
margin-left: 14px;
min-height: 200px;
background-color: #fff;
// background-color: #fff;
}
.item {

View File

@ -0,0 +1,295 @@
<template>
<div v-loading="loading">
<searchContainer bannerKey="首页>成果列表" title="成果库" @handleQuery="handleQuery">
<template v-slot>
<div class="head">
<el-breadcrumb separator="/">
<el-breadcrumb-item>
<span class="one">找成果</span>
</el-breadcrumb-item>
<el-breadcrumb-item>
<span>成果详情</span>
</el-breadcrumb-item>
</el-breadcrumb>
</div>
<el-row type="flex" style="padding-bottom: 20px;">
<div style="flex: 1">
<gainItem :data="state.expertDetail">
<template v-slot:des>
<div>{{state.expertDetail.introduce}}</div>
</template>
</gainItem>
<div class="btns">
<div class="order">预约对接</div>
<div class="share">一键分享</div>
</div>
<div class="detail">
<div style="padding: 20px 0;">
<div class="pointTit">技术视频</div>
</div>
<div style="padding: 20px 0;">
<div class="pointTit">产品详情</div>
</div>
<div class="html" v-html="state.expertDetail.introduce"></div>
</div>
</div>
<div class="r">
<webContact />
</div>
</el-row>
</template>
</searchContainer>
</div>
</template>
<script setup>
import webContact from "@/components/webContact/index.vue";
import gainItem from './components/gainItem.vue'
import loadMore from './components/loadMore.vue'
import request from '@/utils/request'
const router = useRouter();
const route = useRoute();
import { onMounted } from 'vue';
import searchContainer from './components/searchContainer.vue'
import wordcloud from './components/wordcloud.vue'
import productItem from './components/productItem.vue'
const loading = ref(true);
const state = reactive({
pageNum: 1,
pageSize: 4,
keyword: '',
val: 3,
expertDetail: {},
arr: [{
"name": "Cat",
"value": 26
},
{
"name": "fish",
"value": 19
}],
activeName: 'first'
});
// 建议 列表前4条
function recommend () {
return request({
url: '/v1/search',
method: 'post',
data: { mode: 5, page_num: state.pageNum, page_size: state.pageSize, keyword: state.keyword }
})
}
// 成果详情
function achievementDetail (id) {
return request({
url: '/v1/technology/achievement/detail',
method: 'post',
data: { id: id }
})
}
function createdData (arr) {
let l = [];
let snap = JSON.parse(JSON.stringify(arr))
snap.map(e => {
l.push({ name: e, value: 30 })
return { name: e, value: 30 }
})
return l;
}
function handleDetail (id) {
let routeData = router.resolve({ path: `/searchList/0/detail/${id}`, query: { keyword: state.keyword } });
window.open(routeData.href, '_blank');
}
function handleList (mode, keyword) {
router.push({ path: `/searchList/${mode}`, query: { keyword } });
}
// 首次加载数据,其后跳转页面
let flag = true;
function handleQuery (keyword) {
state.keyword = keyword;
if (flag) {
getDataList();
flag = false;
} else {
handleList(0, keyword);
}
}
function getDataList () {
loading.value = true;
let id = route.params.id;
if (!id) return
achievementDetail(id).then(res => {
if (200 == res.code) {
state.expertDetail = res.data;
loading.value = false;
}
}).catch(() => {
loading.value = false;
});
}
</script>
<style lang="scss" scoped>
:deep(.el-tabs) {
.el-tabs__item {
color: #666666;
font-size: 14px;
}
.el-tabs__item:hover {
opacity: 0.8;
}
.el-tabs__item.is-active {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: bold;
color: #333333;
}
.el-tabs__active-bar {
background-color: #333333;
height: 4px;
}
.el-tabs__nav-wrap::after {
background-color: transparent;
}
}
.head {
padding: 15px 0px;
span {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
}
.one {
color: #333333;
}
}
.r {
display: inline-block;
width: 325px;
margin-left: 14px;
min-height: 200px;
}
.detail {
width: 661px;
box-sizing: border-box;
padding: 20px;
background: #fff;
.describe {
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
margin-bottom: 5px;
}
}
.pointTit {
position: relative;
padding-left: 10px;
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 500;
color: #333333;
&:before {
content: "";
top: 8px;
left: 0px;
position: absolute;
display: block;
width: 5px;
height: 5px;
background: #0054ff;
}
}
.btns {
overflow: hidden;
padding: 0 20px 20px 20px;
width: 100%;
background-color: #fff;
margin-top: -20px;
div {
margin-top: 20px;
text-align: center;
float: right;
cursor: pointer;
user-select: none;
width: 101px;
height: 36px;
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 400;
line-height: 36px;
box-sizing: border-box;
&:hover {
opacity: 0.7;
}
}
.share {
color: #333333;
background: #f2f6ff;
border: 1px solid #dcdcdc;
margin-right: 10px;
}
.order {
background: #0054ff;
color: #ffffff;
border: none;
}
}
.achievementItem,
.loadMoreItem {
padding: 20px;
background-color: #fff;
margin-bottom: 10px;
.tit {
margin-left: -8px;
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: bold;
color: #333333;
}
.line {
margin: 10px 0;
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
}
}
.patentItem {
padding: 20px;
background-color: #fff;
margin-bottom: 10px;
.tit {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: bold;
color: #333333;
}
.line {
padding-left: 8px;
margin: 10px 0;
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
}
}
</style>

View File

@ -0,0 +1,222 @@
<template>
<div class="index">
<searchContainer
bannerKey="首页>实验室库>实验室列表"
title="实验室库"
@handleQuery="handleQuery"
>
<template v-slot>
<el-row type="flex" style="padding: 20px 0;">
<div style="flex: 1">
<div style="position: relative;">
<industrySelect @industryChange="industryChange"></industrySelect>
<div class="total">
共找到
<span>{{ state.total }}</span> 个实验室
</div>
<div v-loading="loading">
<section v-for="item in state.list" :key="item.id">
<div style="border: 1px solid #DCDCDC;margin-bottom: 10px;">
<gainItem :data="item"></gainItem>
</div>
</section>
</div>
<pagination
class="pagination"
:total="state.total"
:pageSizes="state.pageSizes"
v-model:page="state.pageNum"
v-model:limit="state.pageSize"
:autoScroll="false"
@pagination="getDataList"
/>
</div>
</div>
<div class="r">
<webContact />
</div>
</el-row>
</template>
</searchContainer>
</div>
</template>
<script setup>
import webContact from "@/components/webContact/index.vue";
import request from '@/utils/request'
const router = useRouter();
import { onMounted } from 'vue';
import searchContainer from './components/searchContainer.vue'
import industrySelect from './components/industrySelect.vue'
import gainItem from './components/gainItem.vue'
import wordcloud from './components/wordcloud.vue'
function handleDetail (id) {
let routeData = router.resolve({ path: `/searchList/0/detail/${id}`, query: { keyword: state.keyword } });
window.open(routeData.href, '_blank');
}
const loading = ref(true);
const state = reactive({
pageNum: 1,
total: 1,
pageSize: 10,
pageSizes: [10, 10 << 1, 10 << 2, 10 << 3],
keyword: '',
industryList: [],
id1: '',
id2: '',
id3: '',
val: 3,
arr: [{
"name": "Cat",
"value": 26
},
{
"name": "fish",
"value": 19
}]
});
function createdData (arr) {
let l = [];
let snap = JSON.parse(JSON.stringify(arr))
snap.map(e => {
l.push({ name: e, value: 30 })
return { name: e, value: 30 }
})
return l;
}
function search () {
let industry = '';
if (state.id1) {
industry += state.id1;
}
if (state.id2) {
industry += `-${state.id2}`;
}
if (state.id3) {
industry += `-${state.id3}`;
}
return request({
url: '/v1/search',
method: 'post',
data: { industry, mode: 3, page_num: state.pageNum, page_size: state.pageSize, keyword: state.keyword }
})
}
function handleQuery (keyword) {
state.keyword = keyword;
getDataList()
}
function industryChange (industry) {
if (industry.id1) {
state.id1 = industry.id1;
}
if (industry.id2) {
state.id2 = industry.id2;
}
if (industry.id3) {
state.id3 = industry.id3;
}
getDataList()
}
function getDataList () {
loading.value = true;
search().then(res => {
if (200 == res.code) {
// 总条数
state.total = res.data.count;
state.list = res.data.data;
loading.value = false;
}
}).catch(() => {
loading.value = false;
})
}
</script>
<style lang="scss" scoped>
.total {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 500;
color: #333333;
margin-bottom: 20px;
span {
font-size: 30px;
color: #0054ff;
}
}
.r {
display: inline-block;
width: 325px;
margin-left: 14px;
min-height: 200px;
// background-color: #fff;
}
.item {
height: 200px;
overflow: hidden;
background-color: #fff;
margin-bottom: 16px;
.img {
width: 90px;
margin-right: 12px;
display: flex;
align-items: center;
justify-content: center;
img {
width: 90px;
height: 90px;
border-radius: 50%;
}
}
.content {
display: inline-block;
width: 390px;
.line {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
margin: 10px 0;
span {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 500;
color: #333;
}
}
}
.keywords {
flex: 1;
width: 129px;
height: 129px;
}
.tit {
width: 100%;
overflow: hidden;
cursor: pointer;
.text {
margin-right: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 20px;
font-family: Source Han Sans CN;
font-weight: bold;
color: #333333;
}
}
}
</style>

View File

@ -0,0 +1,222 @@
<template>
<div class="index">
<searchContainer
bannerKey="首页>专利库>专利列表"
title="专利库"
@handleQuery="handleQuery"
>
<template v-slot>
<el-row type="flex" style="padding: 20px 0;">
<div style="flex: 1">
<div style="position: relative;">
<industrySelect @industryChange="industryChange"></industrySelect>
<div class="total">
共找到
<span>{{ state.total }}</span> 个专利
</div>
<div v-loading="loading">
<section v-for="item in state.list" :key="item.id">
<div style="border: 1px solid #DCDCDC;margin-bottom: 10px;">
<gainItem :data="item"></gainItem>
</div>
</section>
</div>
<pagination
class="pagination"
:total="state.total"
:pageSizes="state.pageSizes"
v-model:page="state.pageNum"
v-model:limit="state.pageSize"
:autoScroll="false"
@pagination="getDataList"
/>
</div>
</div>
<div class="r">
<webContact />
</div>
</el-row>
</template>
</searchContainer>
</div>
</template>
<script setup>
import webContact from "@/components/webContact/index.vue";
import request from '@/utils/request'
const router = useRouter();
import { onMounted } from 'vue';
import searchContainer from './components/searchContainer.vue'
import industrySelect from './components/industrySelect.vue'
import gainItem from './components/gainItem.vue'
import wordcloud from './components/wordcloud.vue'
function handleDetail (id) {
let routeData = router.resolve({ path: `/searchList/0/detail/${id}`, query: { keyword: state.keyword } });
window.open(routeData.href, '_blank');
}
const loading = ref(true);
const state = reactive({
pageNum: 1,
total: 1,
pageSize: 10,
pageSizes: [10, 10 << 1, 10 << 2, 10 << 3],
keyword: '',
industryList: [],
id1: '',
id2: '',
id3: '',
val: 3,
arr: [{
"name": "Cat",
"value": 26
},
{
"name": "fish",
"value": 19
}]
});
function createdData (arr) {
let l = [];
let snap = JSON.parse(JSON.stringify(arr))
snap.map(e => {
l.push({ name: e, value: 30 })
return { name: e, value: 30 }
})
return l;
}
function search () {
let industry = '';
if (state.id1) {
industry += state.id1;
}
if (state.id2) {
industry += `-${state.id2}`;
}
if (state.id3) {
industry += `-${state.id3}`;
}
return request({
url: '/v1/search',
method: 'post',
data: { industry, mode: 3, page_num: state.pageNum, page_size: state.pageSize, keyword: state.keyword }
})
}
function handleQuery (keyword) {
state.keyword = keyword;
getDataList()
}
function industryChange (industry) {
if (industry.id1) {
state.id1 = industry.id1;
}
if (industry.id2) {
state.id2 = industry.id2;
}
if (industry.id3) {
state.id3 = industry.id3;
}
getDataList()
}
function getDataList () {
loading.value = true;
search().then(res => {
if (200 == res.code) {
// 总条数
state.total = res.data.count;
state.list = res.data.data;
loading.value = false;
}
}).catch(() => {
loading.value = false;
})
}
</script>
<style lang="scss" scoped>
.total {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 500;
color: #333333;
margin-bottom: 20px;
span {
font-size: 30px;
color: #0054ff;
}
}
.r {
display: inline-block;
width: 325px;
margin-left: 14px;
min-height: 200px;
// background-color: #fff;
}
.item {
height: 200px;
overflow: hidden;
background-color: #fff;
margin-bottom: 16px;
.img {
width: 90px;
margin-right: 12px;
display: flex;
align-items: center;
justify-content: center;
img {
width: 90px;
height: 90px;
border-radius: 50%;
}
}
.content {
display: inline-block;
width: 390px;
.line {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
margin: 10px 0;
span {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 500;
color: #333;
}
}
}
.keywords {
flex: 1;
width: 129px;
height: 129px;
}
.tit {
width: 100%;
overflow: hidden;
cursor: pointer;
.text {
margin-right: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 20px;
font-family: Source Han Sans CN;
font-weight: bold;
color: #333333;
}
}
}
</style>

View File

@ -16,7 +16,7 @@
</div>
<div v-loading="loading">
<section v-for="item in state.list" :key="item.id">
<expertItem style="width: 661px" :data="item"></expertItem>
<expertItem style="width: 661px;margin-bottom: 10px;" :data="item"></expertItem>
</section>
</div>