客户端产品匹配
This commit is contained in:
BIN
cas_web_03.zip
Normal file
BIN
cas_web_03.zip
Normal file
Binary file not shown.
@ -8,6 +8,7 @@ export const demandList = (params) => {
|
|||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// 新增企业服务需求
|
// 新增企业服务需求
|
||||||
export const insertDemand = (data) => {
|
export const insertDemand = (data) => {
|
||||||
return request({
|
return request({
|
||||||
@ -35,6 +36,24 @@ export const insertTechnologyDemand = (data) => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// 企业服务需求详情
|
||||||
|
export const getDemand = (params) => {
|
||||||
|
return request({
|
||||||
|
url: `/app/getDemand`,
|
||||||
|
method: "GET",
|
||||||
|
params,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
// 企业服务需求详情
|
||||||
|
export const updateDemand = (data) => {
|
||||||
|
return request({
|
||||||
|
url: `/app/updateDemand`,
|
||||||
|
method: "POST",
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
// 企业技术需求详情
|
// 企业技术需求详情
|
||||||
export const getTechnologyDemand = (params) => {
|
export const getTechnologyDemand = (params) => {
|
||||||
return request({
|
return request({
|
||||||
@ -43,6 +62,7 @@ export const getTechnologyDemand = (params) => {
|
|||||||
params,
|
params,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// 修改企业技术需求详情
|
// 修改企业技术需求详情
|
||||||
export const updateTechnologyDemand = (data) => {
|
export const updateTechnologyDemand = (data) => {
|
||||||
return request({
|
return request({
|
||||||
@ -51,6 +71,7 @@ export const updateTechnologyDemand = (data) => {
|
|||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
// 删除企业技术需求
|
// 删除企业技术需求
|
||||||
export const deleteTechnologyDemand = (ids) => {
|
export const deleteTechnologyDemand = (ids) => {
|
||||||
return request({
|
return request({
|
||||||
|
@ -49,7 +49,7 @@ export function logout() {
|
|||||||
// 获取验证码
|
// 获取验证码
|
||||||
export function getCodeImg() {
|
export function getCodeImg() {
|
||||||
return request({
|
return request({
|
||||||
url: "/captchaImage",
|
url: "/app/captchaImage",
|
||||||
headers: {
|
headers: {
|
||||||
isToken: false,
|
isToken: false,
|
||||||
},
|
},
|
||||||
|
@ -77,13 +77,35 @@ export function searchPatentDetail(id) {
|
|||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// 客户端专利搜索结果详情
|
// 客户端企业搜索结果详情
|
||||||
export function searchEnterpriseDetail(id) {
|
export function searchEnterpriseDetail(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/search/enterprise/${id}`,
|
url: `/search/enterprise/${id}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// 客户端专家搜索结果详情
|
||||||
|
export function searchExpertDetail(id) {
|
||||||
|
return request({
|
||||||
|
url: `/search/expert/${id}`,
|
||||||
|
method: "get",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
// 客户端服务需求搜索结果详情
|
||||||
|
export function searchServiceDemandDetail(id) {
|
||||||
|
return request({
|
||||||
|
url: `/search/casDemand/${id}`,
|
||||||
|
method: "get",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 客户端服务需求搜索结果详情
|
||||||
|
export function searchTechnologyDemandDetail(id) {
|
||||||
|
return request({
|
||||||
|
url: `/search/technologyDemand/${id}`,
|
||||||
|
method: "get",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// 获取[省]专家分布
|
// 获取[省]专家分布
|
||||||
export function countExpertByProvince() {
|
export function countExpertByProvince() {
|
||||||
|
BIN
src/assets/index_banner.png
Normal file
BIN
src/assets/index_banner.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 495 KiB |
@ -164,7 +164,8 @@ function handleUploadError(err) {
|
|||||||
|
|
||||||
// 上传成功回调
|
// 上传成功回调
|
||||||
function handleUploadSuccess(res, file) {
|
function handleUploadSuccess(res, file) {
|
||||||
uploadList.value.push({ name: res.fileName, url: res.fileName });
|
// uploadList.value.push({ name: res.fileName, url: res.fileName });
|
||||||
|
uploadList.value.push({ name: res.fileName, url: res.url });
|
||||||
if (uploadList.value.length === number.value) {
|
if (uploadList.value.length === number.value) {
|
||||||
fileList.value = fileList.value
|
fileList.value = fileList.value
|
||||||
.filter((f) => f.url !== undefined)
|
.filter((f) => f.url !== undefined)
|
||||||
|
@ -11,10 +11,10 @@
|
|||||||
<el-col :span="8">
|
<el-col :span="8">
|
||||||
<div class="tit">联系我们</div>
|
<div class="tit">联系我们</div>
|
||||||
<p>
|
<p>
|
||||||
<a href="">客服电话:{{ state.mobile }}</a>
|
<a :href="`tel:${state.mobile}`">客服电话:{{ state.mobile }}</a>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a href="">邮箱:{{ state.email }}</a>
|
<a :href="`mailto:${state.email}`">邮箱:{{ state.email }}</a>
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<a href="">地址:{{ state.address }}</a>
|
<a href="">地址:{{ state.address }}</a>
|
||||||
|
@ -24,16 +24,12 @@ const whiteList = [
|
|||||||
"/innovate",
|
"/innovate",
|
||||||
"/activity",
|
"/activity",
|
||||||
"/about",
|
"/about",
|
||||||
"/searchList/enterprise",
|
|
||||||
"/searchList/patent",
|
|
||||||
"/searchList/expert",
|
|
||||||
// "/solution/detail/",
|
|
||||||
];
|
];
|
||||||
const whiteListReg = [
|
const whiteListReg = [
|
||||||
/\/solution\/detail\/[0-9]+/,
|
/\/solution\/detail\/[0-9]+/,
|
||||||
/\/innovate\/detail\/[0-9]+/,
|
/\/innovate\/detail\/[0-9]+/,
|
||||||
/\/searchList\/patent\/detail\/[0-9]+/,
|
/\/searchList\/[\S]+/,
|
||||||
/\/searchList\/enterprise\/detail\/[0-9]+/,
|
/\/searchList\/[\S]+\/detail\/[0-9]+/,
|
||||||
];
|
];
|
||||||
router.beforeEach((to, from, next) => {
|
router.beforeEach((to, from, next) => {
|
||||||
NProgress.start();
|
NProgress.start();
|
||||||
|
@ -52,6 +52,14 @@ export const constantRoutes = [
|
|||||||
component: () =>
|
component: () =>
|
||||||
import("../views/website/searchList/enterpriseDetail.vue"),
|
import("../views/website/searchList/enterpriseDetail.vue"),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "searchList/achievement",
|
||||||
|
component: () => import("../views/website/searchList/achievement.vue"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "searchList/achievement/detail/:id",
|
||||||
|
component: () => import("../views/website/searchList/achievementDetail.vue"),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: "searchList/patent",
|
path: "searchList/patent",
|
||||||
component: () => import("../views/website/searchList/patent.vue"),
|
component: () => import("../views/website/searchList/patent.vue"),
|
||||||
@ -64,6 +72,26 @@ export const constantRoutes = [
|
|||||||
path: "searchList/expert",
|
path: "searchList/expert",
|
||||||
component: () => import("../views/website/searchList/expert.vue"),
|
component: () => import("../views/website/searchList/expert.vue"),
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "searchList/expert/detail/:id",
|
||||||
|
component: () => import("../views/website/searchList/expertDetail.vue"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "searchList/serviceDemand",
|
||||||
|
component: () => import("../views/website/searchList/serviceDemand.vue"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "searchList/serviceDemand/detail/:id",
|
||||||
|
component: () => import("../views/website/searchList/serviceDemandDetail.vue"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "searchList/technologyDemand",
|
||||||
|
component: () => import("../views/website/searchList/technologyDemand.vue"),
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "searchList/technologyDemand/detail/:id",
|
||||||
|
component: () => import("../views/website/searchList/technologyDemandDetail.vue"),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: "solution/:name",
|
path: "solution/:name",
|
||||||
name: "solution",
|
name: "solution",
|
||||||
|
109
src/views/admin/components/collectAndVisit.vue
Normal file
109
src/views/admin/components/collectAndVisit.vue
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
<template>
|
||||||
|
<div class="collectAndVisit">
|
||||||
|
<div>{{ visit_count }}浏览</div>
|
||||||
|
<div class="heart_w">
|
||||||
|
<div
|
||||||
|
class="heart"
|
||||||
|
@click="change()"
|
||||||
|
:class="{ in: state.isCollect }"
|
||||||
|
></div>
|
||||||
|
<span>{{ state.collect }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import request from "@/utils/request";
|
||||||
|
import { reactive } from "vue";
|
||||||
|
function launch(id) {
|
||||||
|
return request({
|
||||||
|
url: "/v1/user/collect/launch",
|
||||||
|
method: "post",
|
||||||
|
data: { kind: props.kind, object_id: props.object_id },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
let flag = true;
|
||||||
|
const props = defineProps({
|
||||||
|
is_collect: {
|
||||||
|
type: Boolean,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
collect_count: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
visit_count: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
kind: {
|
||||||
|
type: Number,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
object_id: {
|
||||||
|
type: String,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const state = reactive({
|
||||||
|
collect: props.collect_count,
|
||||||
|
isCollect: props.is_collect,
|
||||||
|
});
|
||||||
|
|
||||||
|
async function postData() {
|
||||||
|
if (flag) {
|
||||||
|
flag = false;
|
||||||
|
await launch()
|
||||||
|
.then((res) => {
|
||||||
|
if (200 == res.code) {
|
||||||
|
state.isCollect = res.data;
|
||||||
|
if (res.data) {
|
||||||
|
state.collect++;
|
||||||
|
} else {
|
||||||
|
state.collect--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
flag = true;
|
||||||
|
})
|
||||||
|
.catch(() => {
|
||||||
|
flag = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function change() {
|
||||||
|
postData();
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.collectAndVisit {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-around;
|
||||||
|
.heart_w {
|
||||||
|
vertical-align: text-bottom;
|
||||||
|
span {
|
||||||
|
vertical-align: text-bottom;
|
||||||
|
position: relative;
|
||||||
|
top: 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.heart {
|
||||||
|
cursor: pointer;
|
||||||
|
user-select: none;
|
||||||
|
vertical-align: text-bottom;
|
||||||
|
display: inline-block;
|
||||||
|
width: 18.3px;
|
||||||
|
height: 16.4px;
|
||||||
|
margin-right: 5px;
|
||||||
|
background-size: cover;
|
||||||
|
background-image: url(./img/heart0.png);
|
||||||
|
}
|
||||||
|
.in {
|
||||||
|
background-image: url(./img/heart1.png);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
|
71
src/views/admin/components/enterpriseItem.vue
Normal file
71
src/views/admin/components/enterpriseItem.vue
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
<template>
|
||||||
|
<el-row type="flex" style="padding: 40px 20px">
|
||||||
|
<div class="img">
|
||||||
|
<el-image :src="data.image" alt />
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="tit" @click="handleDetail(data.id)">
|
||||||
|
<div class="text" style="flex: 1">{{ data.name }}</div>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
企业规模:
|
||||||
|
<span>{{ data.kind_title || "后台暂没提供" }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
核心产品及应用场景: <span>{{ data.product }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
企业网站:
|
||||||
|
<a :href="data.url"
|
||||||
|
><span>{{ data.url || "后台暂没提供" }}</span></a
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="keywords" style="flex: 1">
|
||||||
|
<wordcloud
|
||||||
|
:data="createdData(data.keyword?.split(',') ?? [])"
|
||||||
|
></wordcloud>
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import wordcloud from "./wordcloud.vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
const props = defineProps({
|
||||||
|
data: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
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/1/detail/${id}` });
|
||||||
|
window.open(routeData.href, "_blank");
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="scss">
|
||||||
|
.img {
|
||||||
|
width: 90px;
|
||||||
|
margin-right: 12px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
img {
|
||||||
|
width: 90px;
|
||||||
|
height: 90px;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
209
src/views/admin/components/wordcloud.vue
Normal file
209
src/views/admin/components/wordcloud.vue
Normal file
@ -0,0 +1,209 @@
|
|||||||
|
<template>
|
||||||
|
<div class="wordcloud">
|
||||||
|
<div
|
||||||
|
class="wordCloud__tagBall"
|
||||||
|
:style="{width:`${this.width}px`,height:`${this.height}px`}"
|
||||||
|
@mouseenter="stop"
|
||||||
|
@mouseleave="start"
|
||||||
|
>
|
||||||
|
<span
|
||||||
|
class="wordCloud__tag"
|
||||||
|
v-for="(item, index) of data"
|
||||||
|
:key="index"
|
||||||
|
:style="{color:color[index % color.length],...contentEle[index].style}"
|
||||||
|
:title="item.name+item.value"
|
||||||
|
>{{item.name}}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
<script>
|
||||||
|
export default {
|
||||||
|
name: 'cloudWork',
|
||||||
|
props: {
|
||||||
|
width: {
|
||||||
|
type: Number,
|
||||||
|
default: 129
|
||||||
|
},
|
||||||
|
height: {
|
||||||
|
type: Number,
|
||||||
|
default: 129
|
||||||
|
},
|
||||||
|
// 测试数据
|
||||||
|
data: {
|
||||||
|
type: Array,
|
||||||
|
default: () => [
|
||||||
|
{
|
||||||
|
name: '测试一类',
|
||||||
|
value: 30
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '测试二类',
|
||||||
|
value: 30
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '测试三类',
|
||||||
|
value: 30
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: '测试四类',
|
||||||
|
value: 30
|
||||||
|
},
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data: () => ({
|
||||||
|
color: ['#0054FF', '#B9B9B9', '#D1AF07', '#E27914', '#CB4A4D', '#B02690'],
|
||||||
|
contentEle: [],
|
||||||
|
direction: '-1',
|
||||||
|
speed: 400,
|
||||||
|
animateID: null
|
||||||
|
}),
|
||||||
|
created() {
|
||||||
|
this.contentEle = this.data.map(() => ({
|
||||||
|
x: 0,
|
||||||
|
y: 0,
|
||||||
|
z: 0,
|
||||||
|
style: {}
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
mounted() {
|
||||||
|
this.innit();
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
innit() {
|
||||||
|
const RADIUSX = (this.width - 50) / 2;
|
||||||
|
const RADIUSY = (this.height - 50) / 2;
|
||||||
|
this.contentEle = [];
|
||||||
|
for (let i = 0; i < this.data.length; i += 1) {
|
||||||
|
const k = -1 + (2 * (i + 1) - 1) / this.data.length;
|
||||||
|
const a = Math.acos(k);
|
||||||
|
const b = a * Math.sqrt(this.data.length * Math.PI);
|
||||||
|
const x = RADIUSX * Math.sin(a) * Math.cos(b);
|
||||||
|
const y = RADIUSY * Math.sin(a) * Math.sin(b);
|
||||||
|
const z = RADIUSX * Math.cos(a);
|
||||||
|
const singleEle = {
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
z,
|
||||||
|
style: {}
|
||||||
|
};
|
||||||
|
this.contentEle.push(singleEle);
|
||||||
|
}
|
||||||
|
this.animate();
|
||||||
|
},
|
||||||
|
animate() {
|
||||||
|
this.rotateX();
|
||||||
|
this.rotateY();
|
||||||
|
this.move();
|
||||||
|
this.animateID = window.requestAnimationFrame(this.animate);
|
||||||
|
},
|
||||||
|
rotateX() {
|
||||||
|
const angleX = ['-1', '1'].includes(this.direction)
|
||||||
|
? Math.PI / Infinity
|
||||||
|
: Math.PI / ((Number(this.direction) / 2) * Number(this.speed));
|
||||||
|
const cos = Math.cos(angleX);
|
||||||
|
const sin = Math.sin(angleX);
|
||||||
|
|
||||||
|
this.contentEle = this.contentEle.map((t) => {
|
||||||
|
const y1 = t.y * cos - t.z * sin;
|
||||||
|
const z1 = t.z * cos + t.y * sin;
|
||||||
|
return {
|
||||||
|
...t,
|
||||||
|
y: y1,
|
||||||
|
z: z1
|
||||||
|
};
|
||||||
|
});
|
||||||
|
},
|
||||||
|
rotateY() {
|
||||||
|
const angleY = ['-2', '2'].includes(this.direction)
|
||||||
|
? Math.PI / Infinity
|
||||||
|
: Math.PI / (Number(this.direction) * Number(this.speed));
|
||||||
|
const cos = Math.cos(angleY);
|
||||||
|
const sin = Math.sin(angleY);
|
||||||
|
this.contentEle = this.contentEle.map((t) => {
|
||||||
|
const x1 = t.x * cos - t.z * sin;
|
||||||
|
const z1 = t.z * cos + t.x * sin;
|
||||||
|
return {
|
||||||
|
...t,
|
||||||
|
x: x1,
|
||||||
|
z: z1
|
||||||
|
};
|
||||||
|
});
|
||||||
|
},
|
||||||
|
move() {
|
||||||
|
const CX = this.width / 2;
|
||||||
|
const CY = this.height / 2;
|
||||||
|
this.contentEle = this.contentEle.map((singleEle) => {
|
||||||
|
const { x, y, z } = singleEle;
|
||||||
|
const fallLength = 500;
|
||||||
|
const RADIUS = (this.width - 50) / 2;
|
||||||
|
const scale = fallLength / (fallLength - z);
|
||||||
|
const alpha = (z + RADIUS) / (2 * RADIUS);
|
||||||
|
const left = `${x + CX - 15}px`;
|
||||||
|
const top = `${y + CY - 15}px`;
|
||||||
|
const transform = `translate(${left}, ${top}) scale(${scale})`;
|
||||||
|
const style = {
|
||||||
|
...singleEle.style,
|
||||||
|
opacity: alpha + 0.5,
|
||||||
|
zIndex: parseInt(scale * 100, 10),
|
||||||
|
transform
|
||||||
|
};
|
||||||
|
return {
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
z,
|
||||||
|
style
|
||||||
|
};
|
||||||
|
});
|
||||||
|
},
|
||||||
|
// 鼠标移入暂停
|
||||||
|
stop() {
|
||||||
|
window.cancelAnimationFrame(this.animateID);
|
||||||
|
},
|
||||||
|
// 鼠标离开恢复
|
||||||
|
start() {
|
||||||
|
this.animate();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
</script>
|
||||||
|
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
button {
|
||||||
|
margin: 20px;
|
||||||
|
}
|
||||||
|
.wordcloud {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.wordCloud__tagBall {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wordCloud__tag {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
left: 0px;
|
||||||
|
top: 0px;
|
||||||
|
color: green;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: 12px;
|
||||||
|
font-family: '微软雅黑';
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.wordCloud__tag :hover {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
|
||||||
|
.wordCloud__home {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
|
</style>
|
@ -109,13 +109,19 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
import { insertDemand } from "@/api/admin/enterprise";
|
// import { insertDemand } from "@/api/admin/enterprise";
|
||||||
|
import {
|
||||||
|
insertDemand,
|
||||||
|
getDemand,
|
||||||
|
updateDemand,
|
||||||
|
} from "@/api/admin/enterprise/demand";
|
||||||
import CityOptions from "@/views/components/CityOptions";
|
import CityOptions from "@/views/components/CityOptions";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { onActivated } from "vue";
|
import { onActivated } from "vue";
|
||||||
import { useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
const route = useRoute();
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
form: {
|
form: {
|
||||||
check: [],
|
check: [],
|
||||||
@ -169,16 +175,14 @@ const submitForm = () => {
|
|||||||
formRef.value.validate(async (valid) => {
|
formRef.value.validate(async (valid) => {
|
||||||
const cityFormValid = cityFormRef.value.validateForm(); // 城市
|
const cityFormValid = cityFormRef.value.validateForm(); // 城市
|
||||||
if (valid && cityFormValid) {
|
if (valid && cityFormValid) {
|
||||||
console.log(form.value);
|
|
||||||
if (form.value.id != undefined) {
|
if (form.value.id != undefined) {
|
||||||
// updatePost(form.value).then((response) => {
|
await updateDemand(form.value);
|
||||||
// proxy.$modal.msgSuccess("修改成功");
|
ElMessage.success("修改成功");
|
||||||
// proxy.$router.go(-1);
|
router.back();
|
||||||
// });
|
|
||||||
} else {
|
} else {
|
||||||
await insertDemand(form.value);
|
await insertDemand(form.value);
|
||||||
ElMessage.success("新增服务需求成功");
|
ElMessage.success("新增服务需求成功");
|
||||||
router.go(-1);
|
router.back();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -198,5 +202,11 @@ function addCheck() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
onActivated(() => {});
|
onActivated(() => {
|
||||||
|
if (route.query.id) {
|
||||||
|
getDemand({ id: route.query.id }).then((resp) => {
|
||||||
|
form.value = resp.data;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
@ -16,7 +16,7 @@
|
|||||||
<el-radio-button :label="1">已发布</el-radio-button>
|
<el-radio-button :label="1">已发布</el-radio-button>
|
||||||
<el-radio-button :label="0">待审核</el-radio-button>
|
<el-radio-button :label="0">待审核</el-radio-button>
|
||||||
<el-radio-button :label="2">已驳回</el-radio-button>
|
<el-radio-button :label="2">已驳回</el-radio-button>
|
||||||
<el-radio-button :label="3">草稿箱</el-radio-button>
|
<!-- <el-radio-button :label="3">草稿箱</el-radio-button> -->
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="dataList" style="margin-top: 20px">
|
<el-table v-loading="loading" :data="dataList" style="margin-top: 20px">
|
||||||
|
@ -59,11 +59,12 @@
|
|||||||
size="small"
|
size="small"
|
||||||
type="text"
|
type="text"
|
||||||
icon="View"
|
icon="View"
|
||||||
@click="handleResults(row.id)"
|
@click="handleResults(row)"
|
||||||
>查看匹配结果</el-button
|
>查看匹配结果</el-button
|
||||||
>
|
>
|
||||||
<el-button
|
<el-button
|
||||||
v-if="queryParams.status == 1"
|
v-if="queryParams.status == 1"
|
||||||
|
disabled
|
||||||
size="small"
|
size="small"
|
||||||
type="text"
|
type="text"
|
||||||
icon="View"
|
icon="View"
|
||||||
@ -76,7 +77,7 @@
|
|||||||
type="text"
|
type="text"
|
||||||
icon="Close"
|
icon="Close"
|
||||||
@click="releaseCancel(row.id)"
|
@click="releaseCancel(row.id)"
|
||||||
>取消发布</el-button
|
>移到草稿箱</el-button
|
||||||
>
|
>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
@ -173,8 +174,8 @@ const handleShelf = (row) => {
|
|||||||
})
|
})
|
||||||
.catch(() => {});
|
.catch(() => {});
|
||||||
};
|
};
|
||||||
const handleResults = (id) => {
|
const handleResults = (row) => {
|
||||||
router.push({ path: "./results" });
|
router.push({ path: "./results", query: { keyword: row.title } });
|
||||||
};
|
};
|
||||||
const checkEnterpriseInfo = (id) => {
|
const checkEnterpriseInfo = (id) => {
|
||||||
router.push({ path: "./business" });
|
router.push({ path: "./business" });
|
||||||
|
@ -1 +1,178 @@
|
|||||||
<template>results</template>
|
<template>
|
||||||
|
<div class="app-container">
|
||||||
|
<el-radio-group
|
||||||
|
v-model="queryParams.searchType"
|
||||||
|
size="small"
|
||||||
|
@change="handleQuery"
|
||||||
|
>
|
||||||
|
<el-radio-button label="1">企业</el-radio-button>
|
||||||
|
<el-radio-button label="2">成果</el-radio-button>
|
||||||
|
<el-radio-button label="4">专利</el-radio-button>
|
||||||
|
<el-radio-button label="5">专家</el-radio-button>
|
||||||
|
<el-radio-button label="6">服务需求</el-radio-button>
|
||||||
|
<el-radio-button label="7">技术需求</el-radio-button>
|
||||||
|
<!-- <el-radio-button label="4">实验室</el-radio-button> -->
|
||||||
|
</el-radio-group>
|
||||||
|
|
||||||
|
<!-- <el-row :gutter="20">
|
||||||
|
<el-col
|
||||||
|
:xs="12"
|
||||||
|
:sm="6"
|
||||||
|
:lg="4"
|
||||||
|
style="margin-top: 20px"
|
||||||
|
v-for="item in 10"
|
||||||
|
:key="item"
|
||||||
|
>
|
||||||
|
<div style="border: 1px solid #787878">
|
||||||
|
<div style="text-align: right">
|
||||||
|
<el-tag type="warning" effect="dark" style="border-radius: 0">
|
||||||
|
7.8万
|
||||||
|
</el-tag>
|
||||||
|
</div>
|
||||||
|
<div style="padding: 10px">
|
||||||
|
<div class="ellipsis">
|
||||||
|
高碳当量高强度灰铁材质研发高碳当量高强度灰铁材质研发
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
style="
|
||||||
|
margin: 10px 0;
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
"
|
||||||
|
>
|
||||||
|
<el-tag type="info" effect="plain">所属领域</el-tag>
|
||||||
|
<el-tag type="info" effect="plain">普通企业需求</el-tag>
|
||||||
|
</div>
|
||||||
|
<div style="margin-bottom: 10px">研发类型:</div>
|
||||||
|
<div>截止时间:</div>
|
||||||
|
</div>
|
||||||
|
<div class="btn_info pointer">查看详情</div>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
</el-row> -->
|
||||||
|
|
||||||
|
<div v-if="dataList.length" style="margin-top: 20px" v-loading="loading">
|
||||||
|
<section v-for="item in dataList" :key="item.id">
|
||||||
|
<div style="border: 1px solid #dcdcdc; margin-bottom: 10px">
|
||||||
|
<enterpriseItem
|
||||||
|
:data="item"
|
||||||
|
v-if="queryParams.searchType == 1"
|
||||||
|
></enterpriseItem>
|
||||||
|
<AchievementItem
|
||||||
|
:data="item"
|
||||||
|
v-else-if="queryParams.searchType == 2"
|
||||||
|
></AchievementItem>
|
||||||
|
<gainItem
|
||||||
|
:data="item"
|
||||||
|
v-else-if="queryParams.searchType == 4"
|
||||||
|
></gainItem>
|
||||||
|
<expertItem
|
||||||
|
:data="item"
|
||||||
|
v-else-if="queryParams.searchType == 5"
|
||||||
|
></expertItem>
|
||||||
|
<serviceDemandItem
|
||||||
|
:data="item"
|
||||||
|
v-else-if="queryParams.searchType == 6"
|
||||||
|
></serviceDemandItem>
|
||||||
|
<TechnologyDemandItem
|
||||||
|
:data="item"
|
||||||
|
v-else-if="queryParams.searchType == 7"
|
||||||
|
></TechnologyDemandItem>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
<el-empty v-else></el-empty>
|
||||||
|
|
||||||
|
<pagination
|
||||||
|
v-show="total > 0"
|
||||||
|
:total="total"
|
||||||
|
v-model:page="queryParams.pageNum"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
@pagination="getList"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup name="Post">
|
||||||
|
import { search } from "@/api/website/home/index";
|
||||||
|
import gainItem from "@/views/website/searchList/components/gainItem.vue";
|
||||||
|
import expertItem from "@/views/website/searchList/components/expertItem.vue";
|
||||||
|
import serviceDemandItem from "@/views/website/searchList/components/serviceDemandItem.vue";
|
||||||
|
import enterpriseItem from "../../components/enterpriseItem.vue";
|
||||||
|
import TechnologyDemandItem from "@/views/website/searchList/components/technologyDemandItem.vue";
|
||||||
|
import AchievementItem from "@/views/website/searchList/components/achievementItem.vue";
|
||||||
|
import { useRoute } from "vue-router";
|
||||||
|
|
||||||
|
const route = useRoute();
|
||||||
|
|
||||||
|
const dataList = ref([]);
|
||||||
|
const loading = ref(true);
|
||||||
|
const total = ref(0);
|
||||||
|
|
||||||
|
const queryType = computed(() => {
|
||||||
|
if (queryParams.value.searchType == 1) {
|
||||||
|
return 2;
|
||||||
|
} else if (queryParams.value.searchType == 2) {
|
||||||
|
return 1;
|
||||||
|
} else if (queryParams.value.searchType == 4) {
|
||||||
|
return 2;
|
||||||
|
} else if (queryParams.value.searchType == 5) {
|
||||||
|
return 2;
|
||||||
|
} else if (queryParams.value.searchType == 6) {
|
||||||
|
return 1;
|
||||||
|
} else if (queryParams.value.searchType == 7) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const data = reactive({
|
||||||
|
queryParams: {
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 10,
|
||||||
|
query: route.query.keyword,
|
||||||
|
searchType: "1",
|
||||||
|
queryType: queryType,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const { queryParams } = toRefs(data);
|
||||||
|
|
||||||
|
/** 查询列表 */
|
||||||
|
async function getList() {
|
||||||
|
const resp = await search(queryParams.value);
|
||||||
|
dataList.value = resp.list;
|
||||||
|
total.value = resp.total;
|
||||||
|
loading.value = false;
|
||||||
|
}
|
||||||
|
/** 搜索按钮操作 */
|
||||||
|
function handleQuery() {
|
||||||
|
queryParams.value.pageNum = 1;
|
||||||
|
getList();
|
||||||
|
}
|
||||||
|
/** 删除按钮操作 */
|
||||||
|
// function handleDelete(id) {
|
||||||
|
// proxy.$modal
|
||||||
|
// .confirm('是否确认删除订单号为"' + id + '"的数据项?')
|
||||||
|
// .then(function () {
|
||||||
|
// return delPost(postIds);
|
||||||
|
// })
|
||||||
|
// .then(() => {
|
||||||
|
// getList();
|
||||||
|
// proxy.$modal.msgSuccess("删除成功");
|
||||||
|
// })
|
||||||
|
// .catch(() => {});
|
||||||
|
// }
|
||||||
|
// function handleResults(id) {
|
||||||
|
// router.push({ path: "./results" });
|
||||||
|
// }
|
||||||
|
handleQuery();
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.btn_info {
|
||||||
|
height: 35px;
|
||||||
|
line-height: 35px;
|
||||||
|
text-align: center;
|
||||||
|
color: #fff;
|
||||||
|
background-color: #787878;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<div class="card-panel surplus-currency" :class="flag ? 'vip-box' : ''">
|
<div class="card-panel surplus-currency" :class="flag ? 'vip-box' : ''">
|
||||||
<div class="_tit">
|
<div class="_tit">
|
||||||
<span> 会员banner图 </span>
|
<span style="visibility: hidden"> 会员banner图 </span>
|
||||||
<div class="fr" v-if="flag">
|
<div class="fr" v-if="flag">
|
||||||
<div class="text-right">续期</div>
|
<div class="text-right">续期</div>
|
||||||
<div>升级VIP</div>
|
<div>升级VIP</div>
|
||||||
@ -16,13 +16,13 @@
|
|||||||
</span>
|
</span>
|
||||||
<p class="text-center pointer" v-else>开通VIP</p>
|
<p class="text-center pointer" v-else>开通VIP</p>
|
||||||
</div>
|
</div>
|
||||||
|
<!--
|
||||||
<div class="card-panel surplus-currency">
|
<div class="card-panel surplus-currency">
|
||||||
<span style="margin-right: 50px; font-size: 16px; font-weight: 700"
|
<span style="margin-right: 50px; font-size: 16px; font-weight: 700"
|
||||||
>剩余创新币:98</span
|
>剩余创新币:98</span
|
||||||
>
|
>
|
||||||
<el-button class="x_btns">创新币充值</el-button>
|
<el-button class="x_btns">创新币充值</el-button>
|
||||||
</div>
|
</div> -->
|
||||||
|
|
||||||
<el-card style="margin-top: 20px">
|
<el-card style="margin-top: 20px">
|
||||||
<template #header>
|
<template #header>
|
||||||
@ -72,8 +72,10 @@ const flag = ref(true);
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.surplus-currency {
|
.surplus-currency {
|
||||||
|
background-image: url("@/assets/index_banner.png");
|
||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
height: 150px;
|
height: 150px;
|
||||||
|
color: white;
|
||||||
background-color: #f2f2f2;
|
background-color: #f2f2f2;
|
||||||
padding: 20px 50px;
|
padding: 20px 50px;
|
||||||
._tit {
|
._tit {
|
||||||
@ -82,12 +84,12 @@ const flag = ref(true);
|
|||||||
color: #bebebe;
|
color: #bebebe;
|
||||||
div {
|
div {
|
||||||
font-size: 18px;
|
font-size: 18px;
|
||||||
color: #000;
|
// color: #000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.vip-box {
|
.vip-box {
|
||||||
height: auto;
|
height: auto;
|
||||||
background-color: yellow;
|
// background-color: yellow;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -120,15 +120,6 @@
|
|||||||
<ImageUpload v-model="modelValue.image" :limit="1" />
|
<ImageUpload v-model="modelValue.image" :limit="1" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<!-- <el-col :span="12">
|
|
||||||
<el-form-item label="产品视频:">
|
|
||||||
<VideoUpload
|
|
||||||
v-model="modelValue.video"
|
|
||||||
:limit="1"
|
|
||||||
:fileType="['mp4']"
|
|
||||||
/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col> -->
|
|
||||||
</el-row>
|
</el-row>
|
||||||
<p>
|
<p>
|
||||||
<b>图片材料上传</b>
|
<b>图片材料上传</b>
|
||||||
|
@ -43,7 +43,7 @@
|
|||||||
</el-select>
|
</el-select>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</template>
|
</template>
|
||||||
<template #append>
|
<!-- <template #append>
|
||||||
<el-button
|
<el-button
|
||||||
class="x_btns"
|
class="x_btns"
|
||||||
type="primary"
|
type="primary"
|
||||||
@ -51,18 +51,25 @@
|
|||||||
@click="handleQuery"
|
@click="handleQuery"
|
||||||
>搜索</el-button
|
>搜索</el-button
|
||||||
>
|
>
|
||||||
</template>
|
</template> -->
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :push="4" :sm="10" :md="8">
|
<el-col :push="4" :sm="10" :md="8">
|
||||||
<div class="btnsWrap">
|
<div class="btnsWrap">
|
||||||
<el-button class="x_btns" @click="handleQuery"
|
<el-button
|
||||||
|
class="x_btns"
|
||||||
|
type="primary"
|
||||||
|
icon="Search"
|
||||||
|
@click="handleQuery"
|
||||||
|
>搜索</el-button
|
||||||
|
>
|
||||||
|
<!-- <el-button class="x_btns" @click="handleQuery"
|
||||||
>发布需求</el-button
|
>发布需求</el-button
|
||||||
>
|
> -->
|
||||||
<el-button class="x_btns" @click="handleQuery"
|
<!-- <el-button class="x_btns" @click="handleQuery"
|
||||||
>专家机构录入</el-button
|
>专家机构录入</el-button
|
||||||
>
|
> -->
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@ -135,11 +142,12 @@ const queryRules = reactive({
|
|||||||
const queryRef = ref();
|
const queryRef = ref();
|
||||||
const searchTypeList = ref([
|
const searchTypeList = ref([
|
||||||
"enterprise",
|
"enterprise",
|
||||||
"achivement",
|
"achievement",
|
||||||
"lab",
|
"lab",
|
||||||
"patent",
|
"patent",
|
||||||
"expert",
|
"expert",
|
||||||
"demand",
|
"serviceDemand",
|
||||||
|
"technologyDemand",
|
||||||
]);
|
]);
|
||||||
// const patentQueryTypeList = ;
|
// const patentQueryTypeList = ;
|
||||||
const queryTypeList = [
|
const queryTypeList = [
|
||||||
@ -150,7 +158,12 @@ const queryTypeList = [
|
|||||||
{ value: "4", label: "通过生产方向搜索" },
|
{ value: "4", label: "通过生产方向搜索" },
|
||||||
{ value: "5", label: "通过产品搜索" },
|
{ value: "5", label: "通过产品搜索" },
|
||||||
],
|
],
|
||||||
[],
|
[
|
||||||
|
{
|
||||||
|
value: "1",
|
||||||
|
label: "通过成果名称搜索",
|
||||||
|
},
|
||||||
|
],
|
||||||
[],
|
[],
|
||||||
[
|
[
|
||||||
{ value: "1", label: "通过标题搜索" },
|
{ value: "1", label: "通过标题搜索" },
|
||||||
@ -162,7 +175,8 @@ const queryTypeList = [
|
|||||||
{ value: "2", label: "通过个人简介搜索" },
|
{ value: "2", label: "通过个人简介搜索" },
|
||||||
{ value: "3", label: "通过关键词搜索" },
|
{ value: "3", label: "通过关键词搜索" },
|
||||||
],
|
],
|
||||||
[],
|
[{ value: "1", label: "通过标题搜索" }],
|
||||||
|
[{ value: "1", label: "通过标题搜索" }],
|
||||||
];
|
];
|
||||||
const switchTab = (index) => {
|
const switchTab = (index) => {
|
||||||
state.tabIndex = index;
|
state.tabIndex = index;
|
||||||
@ -189,7 +203,15 @@ function handleQuery() {
|
|||||||
|
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
keyword: "",
|
keyword: "",
|
||||||
tabList: ["找企业", "找成果", "找实验室", "找专利", "找专家", "接需求"],
|
tabList: [
|
||||||
|
"找企业",
|
||||||
|
"找成果",
|
||||||
|
"找实验室",
|
||||||
|
"找专利",
|
||||||
|
"找专家",
|
||||||
|
"接服务需求",
|
||||||
|
"接技术需求",
|
||||||
|
],
|
||||||
tabIndex: 0,
|
tabIndex: 0,
|
||||||
banner: "",
|
banner: "",
|
||||||
data: {
|
data: {
|
||||||
@ -283,11 +305,11 @@ onMounted(() => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.tab {
|
.tab {
|
||||||
width: 480px;
|
width: 630px;
|
||||||
height: 42px;
|
height: 42px;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
& > div {
|
& > div {
|
||||||
width: 80px;
|
width: 90px;
|
||||||
height: 42px;
|
height: 42px;
|
||||||
line-height: 42px;
|
line-height: 42px;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
@ -45,9 +45,9 @@
|
|||||||
/></template>
|
/></template>
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item prop="captcha" style="margin-bottom: 0">
|
<el-form-item prop="code" style="margin-bottom: 0" class="captcha-input">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="registerForm.captcha"
|
v-model="registerForm.code"
|
||||||
auto-complete="off"
|
auto-complete="off"
|
||||||
placeholder="验证码"
|
placeholder="验证码"
|
||||||
style="width: 65%"
|
style="width: 65%"
|
||||||
@ -57,7 +57,12 @@
|
|||||||
><svg-icon icon-class="validCode" class="el-input__icon input-icon"
|
><svg-icon icon-class="validCode" class="el-input__icon input-icon"
|
||||||
/></template>
|
/></template>
|
||||||
</el-input>
|
</el-input>
|
||||||
<webGetCode v-model:username="registerForm.username" />
|
<!-- <webGetCode v-model:username="registerForm.username" /> -->
|
||||||
|
<el-image
|
||||||
|
style="height: 38px"
|
||||||
|
:src="`data:image/png;base64,${captchaSrc}`"
|
||||||
|
@click="getCaptchImage"
|
||||||
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item prop="isCheck" style="margin: 10px 0; height: 28px">
|
<el-form-item prop="isCheck" style="margin: 10px 0; height: 28px">
|
||||||
<el-checkbox v-model="registerForm.isCheck">
|
<el-checkbox v-model="registerForm.isCheck">
|
||||||
@ -91,8 +96,8 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import { ElMessageBox } from "element-plus";
|
import { ElMessageBox } from "element-plus";
|
||||||
import { register } from "@/api/login";
|
import { register, getCodeImg } from "@/api/login";
|
||||||
import webGetCode from "@/components/webGetCode";
|
// import webGetCode from "@/components/webGetCode";
|
||||||
import md5 from "js-md5";
|
import md5 from "js-md5";
|
||||||
|
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
@ -108,11 +113,14 @@ function handleLogin() {
|
|||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
const registerRef = ref();
|
const registerRef = ref();
|
||||||
|
const captchaSrc = ref("");
|
||||||
const registerForm = ref({
|
const registerForm = ref({
|
||||||
username: "",
|
username: "",
|
||||||
password: "",
|
password: "",
|
||||||
repeat_pass: "",
|
repeat_pass: "",
|
||||||
captcha: "",
|
// captcha: "",
|
||||||
|
code: "",
|
||||||
|
uuid: "",
|
||||||
isCheck: true,
|
isCheck: true,
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -131,6 +139,12 @@ const isCheck = (rule, value, callback) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const getCaptchImage = async () => {
|
||||||
|
const { img, uuid } = await getCodeImg();
|
||||||
|
captchaSrc.value = img;
|
||||||
|
registerForm.value.uuid = uuid;
|
||||||
|
};
|
||||||
|
getCaptchImage();
|
||||||
const registerRules = {
|
const registerRules = {
|
||||||
username: [
|
username: [
|
||||||
{ required: true, message: "手机号不能为空", trigger: "blur" },
|
{ required: true, message: "手机号不能为空", trigger: "blur" },
|
||||||
@ -153,7 +167,7 @@ const registerRules = {
|
|||||||
{ required: true, trigger: "blur", message: "请再次输入您的密码" },
|
{ required: true, trigger: "blur", message: "请再次输入您的密码" },
|
||||||
{ required: true, validator: equalToPassword, trigger: "blur" },
|
{ required: true, validator: equalToPassword, trigger: "blur" },
|
||||||
],
|
],
|
||||||
// captcha: [{ required: true, trigger: "change", message: "请输入验证码" }],
|
code: [{ required: true, trigger: "change", message: "请输入验证码" }],
|
||||||
isCheck: [{ required: true, validator: isCheck, trigger: "change" }],
|
isCheck: [{ required: true, validator: isCheck, trigger: "change" }],
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -185,7 +199,9 @@ function handleRegister() {
|
|||||||
})
|
})
|
||||||
.catch(() => {});
|
.catch(() => {});
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
getCaptchImage();
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -232,4 +248,8 @@ function handleRegister() {
|
|||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
letter-spacing: 1px;
|
letter-spacing: 1px;
|
||||||
}
|
}
|
||||||
|
:deep(.captcha-input .el-form-item__content) {
|
||||||
|
display: flex;
|
||||||
|
justify-content: space-between;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -9,25 +9,25 @@
|
|||||||
<el-row type="flex" style="padding: 20px 0">
|
<el-row type="flex" style="padding: 20px 0">
|
||||||
<div style="flex: 1">
|
<div style="flex: 1">
|
||||||
<div style="position: relative">
|
<div style="position: relative">
|
||||||
<industrySelect @industryChange="industryChange"></industrySelect>
|
<!-- <industrySelect @industryChange="industryChange"></industrySelect> -->
|
||||||
<div class="total">
|
<div class="total">
|
||||||
共找到
|
共找到
|
||||||
<span>{{ state.total }}</span> 个成果
|
<span>{{ total }}</span> 个成果
|
||||||
</div>
|
</div>
|
||||||
<div v-loading="loading">
|
<div v-loading="loading">
|
||||||
<section v-for="item in state.list" :key="item.id">
|
<section v-for="item in searchResults" :key="item.id">
|
||||||
<div style="border: 1px solid #dcdcdc; margin-bottom: 10px">
|
<div style="border: 1px solid #dcdcdc; margin-bottom: 10px">
|
||||||
<gainItem :data="item"></gainItem>
|
<achievementItem :data="item"></achievementItem>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<pagination
|
<pagination
|
||||||
class="pagination"
|
class="pagination"
|
||||||
:total="state.total"
|
:total="total"
|
||||||
:pageSizes="state.pageSizes"
|
:pageSizes="[10, 10 << 1, 10 << 2, 10 << 3]"
|
||||||
v-model:page="state.pageNum"
|
v-model:page="queryParams.pageNum"
|
||||||
v-model:limit="state.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
:autoScroll="false"
|
:autoScroll="false"
|
||||||
@pagination="getDataList"
|
@pagination="getDataList"
|
||||||
/>
|
/>
|
||||||
@ -42,114 +42,43 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup name="SearchAchievement">
|
||||||
import webContact from "@/components/webContact/index.vue";
|
import webContact from "@/components/webContact/index.vue";
|
||||||
import request from "@/utils/request";
|
import { search } from "@/api/website/home/index";
|
||||||
const router = useRouter();
|
|
||||||
import { onMounted } from "vue";
|
|
||||||
import searchContainer from "./components/searchContainer.vue";
|
import searchContainer from "./components/searchContainer.vue";
|
||||||
import industrySelect from "./components/industrySelect.vue";
|
// import industrySelect from "./components/industrySelect.vue";
|
||||||
import gainItem from "./components/gainItem.vue";
|
import achievementItem from "./components/achievementItem";
|
||||||
import wordcloud from "./components/wordcloud.vue";
|
import { useRoute } from "vue-router";
|
||||||
|
|
||||||
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 loading = ref(true);
|
||||||
const state = reactive({
|
const searchResults = ref([]);
|
||||||
|
const total = ref(0);
|
||||||
|
const route = useRoute();
|
||||||
|
|
||||||
|
const queryParams = reactive({
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
total: 1,
|
pageSize: 5,
|
||||||
pageSize: 10,
|
searchType: 2,
|
||||||
pageSizes: [10, 10 << 1, 10 << 2, 10 << 3],
|
queryType: route.query.queryType,
|
||||||
keyword: "",
|
query: route.query.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: 2,
|
|
||||||
page_num: state.pageNum,
|
|
||||||
page_size: state.pageSize,
|
|
||||||
keyword: state.keyword,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function handleQuery(keyword) {
|
function handleQuery(keyword) {
|
||||||
state.keyword = keyword;
|
queryParams.query = 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();
|
getDataList();
|
||||||
}
|
}
|
||||||
|
|
||||||
function getDataList() {
|
const getDataList = async () => {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
search()
|
try {
|
||||||
.then((res) => {
|
const resp = await search(queryParams);
|
||||||
if (200 == res.code) {
|
searchResults.value = resp.list;
|
||||||
console.log(res);
|
total.value = resp.total;
|
||||||
// 总条数
|
loading.value = false;
|
||||||
state.total = res.data.count;
|
} catch (error) {
|
||||||
state.list = res.data.data;
|
loading.value = false;
|
||||||
loading.value = false;
|
}
|
||||||
}
|
};
|
||||||
})
|
|
||||||
.catch(() => {
|
|
||||||
loading.value = false;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
@ -230,4 +159,4 @@ function getDataList() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
@ -18,11 +18,11 @@
|
|||||||
</div>
|
</div>
|
||||||
<el-row type="flex" style="padding-bottom: 20px">
|
<el-row type="flex" style="padding-bottom: 20px">
|
||||||
<div style="flex: 1">
|
<div style="flex: 1">
|
||||||
<gainItem :data="state.expertDetail">
|
<achievementItem :data="state.expertDetail">
|
||||||
<template v-slot:des>
|
<template v-slot:des>
|
||||||
<div>{{ state.expertDetail.introduce }}</div>
|
<div>{{ state.expertDetail.introduce }}</div>
|
||||||
</template>
|
</template>
|
||||||
</gainItem>
|
</achievementItem>
|
||||||
<div class="btns">
|
<div class="btns">
|
||||||
<div class="order">预约对接</div>
|
<div class="order">预约对接</div>
|
||||||
<div class="share">一键分享</div>
|
<div class="share">一键分享</div>
|
||||||
@ -49,7 +49,7 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import webContact from "@/components/webContact/index.vue";
|
import webContact from "@/components/webContact/index.vue";
|
||||||
import gainItem from "./components/gainItem.vue";
|
import achievementItem from "./components/achievementItem.vue";
|
||||||
import loadMore from "./components/loadMore.vue";
|
import loadMore from "./components/loadMore.vue";
|
||||||
import request from "@/utils/request";
|
import request from "@/utils/request";
|
||||||
// import { onMounted } from "vue";
|
// import { onMounted } from "vue";
|
||||||
@ -58,8 +58,7 @@ import wordcloud from "./components/wordcloud.vue";
|
|||||||
import productItem from "./components/productItem.vue";
|
import productItem from "./components/productItem.vue";
|
||||||
import { useRoute, useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
import { reactive, ref } from "vue";
|
import { reactive, ref } from "vue";
|
||||||
const router = useRouter();
|
|
||||||
const route = useRoute();
|
|
||||||
const loading = ref(true);
|
const loading = ref(true);
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
@ -80,28 +79,30 @@ const state = reactive({
|
|||||||
activeName: "first",
|
activeName: "first",
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
const route = useRoute();
|
||||||
|
const searchResults = ref([]);
|
||||||
|
const total = ref(0);
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 5,
|
||||||
|
searchType: 5,
|
||||||
|
queryType: route.query.queryType,
|
||||||
|
query: route.query.keyword,
|
||||||
|
});
|
||||||
// 建议 列表前4条
|
// 建议 列表前4条
|
||||||
function recommend() {
|
// function recommend() {
|
||||||
return request({
|
// return request({
|
||||||
url: "/v1/search",
|
// url: "/v1/search",
|
||||||
method: "post",
|
// method: "post",
|
||||||
data: {
|
// data: {
|
||||||
mode: 5,
|
// mode: 5,
|
||||||
page_num: state.pageNum,
|
// page: state.pageNum,
|
||||||
page_size: state.pageSize,
|
// page_size: state.pageSize,
|
||||||
keyword: state.keyword,
|
// keyword: state.keyword,
|
||||||
},
|
// },
|
||||||
});
|
// });
|
||||||
}
|
// }
|
||||||
|
|
||||||
// 成果详情
|
|
||||||
function achievementDetail(id) {
|
|
||||||
return request({
|
|
||||||
url: "/v1/technology/achievement/detail",
|
|
||||||
method: "post",
|
|
||||||
data: { id: id },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function createdData(arr) {
|
function createdData(arr) {
|
||||||
let l = [];
|
let l = [];
|
||||||
@ -142,17 +143,17 @@ function getDataList() {
|
|||||||
loading.value = true;
|
loading.value = true;
|
||||||
let id = route.params.id;
|
let id = route.params.id;
|
||||||
if (!id) return;
|
if (!id) return;
|
||||||
achievementDetail(id)
|
// achievementDetail(id)
|
||||||
.then((res) => {
|
// .then((res) => {
|
||||||
if (200 == res.code) {
|
// if (200 == res.code) {
|
||||||
console.log(res.data);
|
// console.log(res.data);
|
||||||
state.expertDetail = res.data;
|
// state.expertDetail = res.data;
|
||||||
loading.value = false;
|
// loading.value = false;
|
||||||
}
|
// }
|
||||||
})
|
// })
|
||||||
.catch(() => {
|
// .catch(() => {
|
||||||
loading.value = false;
|
// loading.value = false;
|
||||||
});
|
// });
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
171
src/views/website/searchList/components/achievementItem.vue
Normal file
171
src/views/website/searchList/components/achievementItem.vue
Normal file
@ -0,0 +1,171 @@
|
|||||||
|
<template>
|
||||||
|
<div class="box">
|
||||||
|
<div class="wrap">
|
||||||
|
<div class="img" v-if="data.image">
|
||||||
|
<el-image :src="data.image" alt="" style="height: 150px" />
|
||||||
|
</div>
|
||||||
|
<div v-else class="type">成果</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="tit" @click="handleDetail(data.id)">{{ data.title }}</div>
|
||||||
|
<slot name="des" />
|
||||||
|
<div v-if="data.industryStr" class="line">
|
||||||
|
所属领域:
|
||||||
|
<!-- <span>{{ data.industrys[data.industrys.length - 1] }}</span> -->
|
||||||
|
<span>{{ data.industryStr }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
所属专家:
|
||||||
|
<span>{{ data.expertName }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
成果成熟度:
|
||||||
|
<span>{{
|
||||||
|
maturityOptions.find((el) => el.key == data.maturity)?.value ??
|
||||||
|
"未知"
|
||||||
|
}}</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 { maturityOptions } from "@/utils/parameter";
|
||||||
|
import wordcloud from "./wordcloud.vue";
|
||||||
|
// import collectAndVisit from "./collectAndVisit.vue";
|
||||||
|
import { maturityOptions } from "@/utils/parameter.js";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
|
||||||
|
const router = useRouter();
|
||||||
|
const props = defineProps({
|
||||||
|
data: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
function handleDetail(id) {
|
||||||
|
let routeData = router.resolve({
|
||||||
|
path: `/searchList/achievement/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;
|
||||||
|
.type {
|
||||||
|
width: 200px;
|
||||||
|
height: 150px;
|
||||||
|
margin-right: 10px;
|
||||||
|
background-color: #417bff;
|
||||||
|
color: white;
|
||||||
|
font-size: 36px;
|
||||||
|
font-weight: bold;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
// img {
|
||||||
|
// display: block;
|
||||||
|
// margin: 0;
|
||||||
|
// width: 100%;
|
||||||
|
// height: 100%;
|
||||||
|
// }
|
||||||
|
}
|
||||||
|
.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>
|
@ -22,12 +22,10 @@
|
|||||||
<!-- <div class="labelList">
|
<!-- <div class="labelList">
|
||||||
<div v-for="item in data.industrys">{{ item }}</div>
|
<div v-for="item in data.industrys">{{ item }}</div>
|
||||||
</div>-->
|
</div>-->
|
||||||
<div v-if="data.industrys" class="line" style="overflow: hidden">
|
<div v-if="data.industryStr" class="line" style="overflow: hidden">
|
||||||
<el-col>所属领域:</el-col>
|
<el-col>所属领域:</el-col>
|
||||||
<el-col
|
<!-- :title="data.industrys[data.industrys.length - 1]" -->
|
||||||
:title="data.industrys[data.industrys.length - 1]"
|
<el-col style="display: inline-block; width: calc(100% - 86px)">
|
||||||
style="display: inline-block; width: calc(100% - 86px)"
|
|
||||||
>
|
|
||||||
<span
|
<span
|
||||||
style="
|
style="
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
@ -36,13 +34,13 @@
|
|||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
"
|
"
|
||||||
>{{ data.industrys[data.industrys.length - 1] }}</span
|
>{{ data.industryStr }}</span
|
||||||
>
|
>
|
||||||
</el-col>
|
</el-col>
|
||||||
</div>
|
</div>
|
||||||
<div class="line">
|
<div class="line">
|
||||||
所在机构:
|
研究方向:
|
||||||
<span>{{ data.research_name }}</span>
|
<span>{{ data.research }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="data.patent_title"
|
v-if="data.patent_title"
|
||||||
@ -56,8 +54,8 @@
|
|||||||
<div class="keywordsWrap">
|
<div class="keywordsWrap">
|
||||||
<div class="keywords">
|
<div class="keywords">
|
||||||
<wordcloud
|
<wordcloud
|
||||||
v-if="data.keywords"
|
v-if="data.keyword"
|
||||||
:data="createdData(data.keywords)"
|
:data="createdData(data.keyword?.split(',') ?? [])"
|
||||||
></wordcloud>
|
></wordcloud>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -66,10 +64,11 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup name="ExpertItem">
|
||||||
import wordcloud from "./wordcloud.vue";
|
import wordcloud from "./wordcloud.vue";
|
||||||
import collectAndVisit from "./collectAndVisit.vue";
|
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
|
// import collectAndVisit from "./collectAndVisit.vue";
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
data: {
|
data: {
|
||||||
@ -79,14 +78,10 @@ const props = defineProps({
|
|||||||
});
|
});
|
||||||
|
|
||||||
function handleDetail(id) {
|
function handleDetail(id) {
|
||||||
let routeData = router.resolve({ path: `/searchList/4/detail/${id}` });
|
let routeData = router.resolve({ path: `/searchList/expert/detail/${id}` });
|
||||||
window.open(routeData.href, "_blank");
|
window.open(routeData.href, "_blank");
|
||||||
}
|
}
|
||||||
|
|
||||||
const state = reactive({
|
|
||||||
val: 3,
|
|
||||||
});
|
|
||||||
|
|
||||||
function createdData(arr) {
|
function createdData(arr) {
|
||||||
let l = [];
|
let l = [];
|
||||||
let snap = JSON.parse(JSON.stringify(arr));
|
let snap = JSON.parse(JSON.stringify(arr));
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
<div class="keywords">
|
<div class="keywords">
|
||||||
<wordcloud
|
<wordcloud
|
||||||
v-if="data.keywords"
|
v-if="data.keywords"
|
||||||
:data="createdData(data.customers)"
|
:data="createdData(data.customers ?? [])"
|
||||||
></wordcloud>
|
></wordcloud>
|
||||||
</div>
|
</div>
|
||||||
<!-- <collectAndVisit
|
<!-- <collectAndVisit
|
||||||
@ -48,6 +48,7 @@
|
|||||||
import { maturityOptions } from "@/utils/parameter";
|
import { maturityOptions } from "@/utils/parameter";
|
||||||
import wordcloud from "./wordcloud.vue";
|
import wordcloud from "./wordcloud.vue";
|
||||||
import collectAndVisit from "./collectAndVisit.vue";
|
import collectAndVisit from "./collectAndVisit.vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
data: {
|
data: {
|
||||||
|
158
src/views/website/searchList/components/serviceDemandItem.vue
Normal file
158
src/views/website/searchList/components/serviceDemandItem.vue
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
<template>
|
||||||
|
<div class="box">
|
||||||
|
<div class="wrap">
|
||||||
|
<div class="type">
|
||||||
|
<!-- <img :src="data.image" alt /> -->
|
||||||
|
<!-- <img src="./img/achieve.png" /> -->
|
||||||
|
服务需求
|
||||||
|
<!-- <div class="type"> -->
|
||||||
|
<!-- </div> -->
|
||||||
|
</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.kind }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
联系方式:
|
||||||
|
<span>{{ data.mobile }}</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 { maturityOptions } from "@/utils/parameter";
|
||||||
|
import wordcloud from "./wordcloud.vue";
|
||||||
|
import collectAndVisit from "./collectAndVisit.vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
const router = useRouter();
|
||||||
|
const props = defineProps({
|
||||||
|
data: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
function handleDetail(id) {
|
||||||
|
let routeData = router.resolve({
|
||||||
|
path: `/searchList/serviceDemand/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;
|
||||||
|
.type {
|
||||||
|
width: 200px;
|
||||||
|
height: 150px;
|
||||||
|
margin-right: 10px;
|
||||||
|
background-color: #417bff;
|
||||||
|
color: white;
|
||||||
|
font-size: 36px;
|
||||||
|
font-weight: bold;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
// 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>
|
158
src/views/website/searchList/components/technologyDemandItem.vue
Normal file
158
src/views/website/searchList/components/technologyDemandItem.vue
Normal file
@ -0,0 +1,158 @@
|
|||||||
|
<template>
|
||||||
|
<div class="box">
|
||||||
|
<div class="wrap">
|
||||||
|
<div class="type">
|
||||||
|
<!-- <img :src="data.image" alt /> -->
|
||||||
|
<!-- <img src="./img/achieve.png" /> -->
|
||||||
|
技术需求
|
||||||
|
<!-- <div class="type"> -->
|
||||||
|
<!-- </div> -->
|
||||||
|
</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.kind }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
联系方式:
|
||||||
|
<span>{{ data.mobile }}</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 { maturityOptions } from "@/utils/parameter";
|
||||||
|
import wordcloud from "./wordcloud.vue";
|
||||||
|
import collectAndVisit from "./collectAndVisit.vue";
|
||||||
|
import { useRouter } from "vue-router";
|
||||||
|
const router = useRouter();
|
||||||
|
const props = defineProps({
|
||||||
|
data: {
|
||||||
|
type: Object,
|
||||||
|
required: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
function handleDetail(id) {
|
||||||
|
let routeData = router.resolve({
|
||||||
|
path: `/searchList/technologyDemand/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;
|
||||||
|
.type {
|
||||||
|
width: 200px;
|
||||||
|
height: 150px;
|
||||||
|
margin-right: 10px;
|
||||||
|
background-color: #417bff;
|
||||||
|
color: white;
|
||||||
|
font-size: 36px;
|
||||||
|
font-weight: bold;
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
align-items: center;
|
||||||
|
// 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>
|
@ -44,19 +44,19 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import WebContact from "@/components/webContact/index.vue";
|
import WebContact from "@/components/webContact/index.vue";
|
||||||
import request from "@/utils/request";
|
import { reactive, ref } from "vue";
|
||||||
import { onMounted, reactive, ref } from "vue";
|
|
||||||
import { search } from "@/api/website/home/index";
|
import { search } from "@/api/website/home/index";
|
||||||
import searchContainer from "./components/searchContainer.vue";
|
import searchContainer from "./components/searchContainer.vue";
|
||||||
import industrySelect from "./components/industrySelect.vue";
|
// import industrySelect from "./components/industrySelect.vue";
|
||||||
import expertItem from "./components/expertItem.vue";
|
import expertItem from "./components/expertItem.vue";
|
||||||
import wordcloud from "./components/wordcloud.vue";
|
// import wordcloud from "./components/wordcloud.vue";
|
||||||
import { useRoute, useRouter } from "vue-router";
|
import { useRoute } from "vue-router";
|
||||||
|
|
||||||
const router = useRouter();
|
// const router = useRouter();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const searchResults = ref([]);
|
const searchResults = ref([]);
|
||||||
const total = ref(0);
|
const total = ref(0);
|
||||||
|
const loading = ref(true);
|
||||||
const queryParams = reactive({
|
const queryParams = reactive({
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
pageSize: 5,
|
pageSize: 5,
|
||||||
@ -65,87 +65,37 @@ const queryParams = reactive({
|
|||||||
query: route.query.keyword,
|
query: route.query.keyword,
|
||||||
});
|
});
|
||||||
|
|
||||||
function handleDetail(id) {
|
// function handleDetail(id) {
|
||||||
let routeData = router.resolve({
|
// let routeData = router.resolve({
|
||||||
path: `/searchList/0/detail/${id}`,
|
// path: `/searchList/expert/detail/${id}`,
|
||||||
query: { keyword: state.keyword },
|
// query: { keyword: queryParams.query },
|
||||||
});
|
|
||||||
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: 5,
|
|
||||||
// page_num: state.pageNum,
|
|
||||||
// page_size: state.pageSize,
|
|
||||||
// keyword: state.keyword,
|
|
||||||
// },
|
|
||||||
// });
|
// });
|
||||||
|
// window.open(routeData.href, "_blank");
|
||||||
|
// }
|
||||||
|
|
||||||
|
// const state = reactive({
|
||||||
|
// pageNum: 1,
|
||||||
|
// total: 1,
|
||||||
|
// pageSize: 10,
|
||||||
|
// pageSizes: [10, 10 << 1, 10 << 2, 10 << 3],
|
||||||
|
// keyword: "",
|
||||||
|
// industryList: [],
|
||||||
|
// });
|
||||||
|
|
||||||
|
// 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 handleQuery(keyword) {
|
function handleQuery(keyword) {
|
||||||
queryParams.query = keyword;
|
queryParams.query = keyword;
|
||||||
getDataList();
|
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();
|
|
||||||
}
|
|
||||||
|
|
||||||
const getDataList = async () => {
|
const getDataList = async () => {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
|
@ -46,7 +46,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div v-if="state.expertDetail.id" style="padding: 20px 0">
|
<div v-if="state.expertDetail.id" style="padding: 20px 0">
|
||||||
<el-tabs v-model="state.activeName">
|
<el-tabs v-model="state.activeName">
|
||||||
<el-tab-pane label="代表成果及合作模式" name="first">
|
<!-- <el-tab-pane label="代表成果及合作模式" name="first">
|
||||||
<loadMore
|
<loadMore
|
||||||
:getData="achievement"
|
:getData="achievement"
|
||||||
:params="{ expert_id: state.expertDetail.id }"
|
:params="{ expert_id: state.expertDetail.id }"
|
||||||
@ -75,8 +75,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</loadMore>
|
</loadMore>
|
||||||
</el-tab-pane>
|
</el-tab-pane> -->
|
||||||
<el-tab-pane label="科研项目" name="second">
|
<!-- <el-tab-pane label="科研项目" name="second">
|
||||||
<loadMore
|
<loadMore
|
||||||
:getData="project"
|
:getData="project"
|
||||||
:params="{ expert_id: state.expertDetail.id }"
|
:params="{ expert_id: state.expertDetail.id }"
|
||||||
@ -132,8 +132,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</loadMore>
|
</loadMore>
|
||||||
</el-tab-pane>
|
</el-tab-pane> -->
|
||||||
<el-tab-pane label="代表专利" name="third">
|
<!-- <el-tab-pane label="代表专利" name="third">
|
||||||
<loadMore
|
<loadMore
|
||||||
:getData="patent"
|
:getData="patent"
|
||||||
:params="{ expert_id: state.expertDetail.id }"
|
:params="{ expert_id: state.expertDetail.id }"
|
||||||
@ -154,8 +154,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</loadMore>
|
</loadMore>
|
||||||
</el-tab-pane>
|
</el-tab-pane> -->
|
||||||
<el-tab-pane label="代表论文" name="fourth">
|
<!-- <el-tab-pane label="代表论文" name="fourth">
|
||||||
<loadMore
|
<loadMore
|
||||||
:getData="paper"
|
:getData="paper"
|
||||||
:params="{ expert_id: state.expertDetail.id }"
|
:params="{ expert_id: state.expertDetail.id }"
|
||||||
@ -191,8 +191,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</loadMore>
|
</loadMore>
|
||||||
</el-tab-pane>
|
</el-tab-pane> -->
|
||||||
<el-tab-pane label="已合作企业" name="five">
|
<!-- <el-tab-pane label="已合作企业" name="five">
|
||||||
<loadMore
|
<loadMore
|
||||||
:getData="cooperate"
|
:getData="cooperate"
|
||||||
:params="{ expert_id: state.expertDetail.id }"
|
:params="{ expert_id: state.expertDetail.id }"
|
||||||
@ -302,7 +302,7 @@
|
|||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
</loadMore>
|
</loadMore>
|
||||||
</el-tab-pane>
|
</el-tab-pane> -->
|
||||||
</el-tabs>
|
</el-tabs>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -329,12 +329,14 @@ import webContact from "@/components/webContact/index.vue";
|
|||||||
import expertItem from "./components/expertItem.vue";
|
import expertItem from "./components/expertItem.vue";
|
||||||
import loadMore from "./components/loadMore.vue";
|
import loadMore from "./components/loadMore.vue";
|
||||||
import request from "@/utils/request";
|
import request from "@/utils/request";
|
||||||
const router = useRouter();
|
import { searchExpertDetail } from "@/api/website/home";
|
||||||
const route = useRoute();
|
import { onMounted, reactive, ref } from "vue";
|
||||||
import { onMounted } from "vue";
|
|
||||||
import searchContainer from "./components/searchContainer.vue";
|
import searchContainer from "./components/searchContainer.vue";
|
||||||
import wordcloud from "./components/wordcloud.vue";
|
import wordcloud from "./components/wordcloud.vue";
|
||||||
import productItem from "./components/productItem.vue";
|
import productItem from "./components/productItem.vue";
|
||||||
|
import { useRoute, useRouter } from "vue-router";
|
||||||
|
const router = useRouter();
|
||||||
|
const route = useRoute();
|
||||||
const loading = ref(true);
|
const loading = ref(true);
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
@ -460,6 +462,8 @@ function handleList(mode, keyword) {
|
|||||||
let flag = true;
|
let flag = true;
|
||||||
|
|
||||||
function handleQuery(keyword) {
|
function handleQuery(keyword) {
|
||||||
|
// loading.value = false;
|
||||||
|
// return;
|
||||||
state.keyword = keyword;
|
state.keyword = keyword;
|
||||||
if (flag) {
|
if (flag) {
|
||||||
getDataList();
|
getDataList();
|
||||||
@ -471,28 +475,33 @@ function handleQuery(keyword) {
|
|||||||
|
|
||||||
function getDataList() {
|
function getDataList() {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
recommend().then((res) => {
|
// recommend().then((res) => {
|
||||||
if (200 == res.code) {
|
// if (200 == res.code) {
|
||||||
// 总条数
|
// // 总条数
|
||||||
state.total = res.data.count;
|
// state.total = res.data.count;
|
||||||
state.list = res.data.data;
|
// state.list = res.data.data;
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
let id = route.params.id;
|
let id = route.params.id;
|
||||||
if (!id) return;
|
if (!id) return;
|
||||||
expert(id)
|
// expert(id)
|
||||||
.then((res) => {
|
// .then((res) => {
|
||||||
if (200 == res.code) {
|
// if (200 == res.code) {
|
||||||
let str = " ".repeat(8);
|
// let str = " ".repeat(8);
|
||||||
let nbsp = "\u00A0".repeat(8);
|
// let nbsp = "\u00A0".repeat(8);
|
||||||
res.data.introduce = res.data.introduce.replace(/\n/g, "<br>");
|
// res.data.introduce = res.data.introduce.replace(/\n/g, "<br>");
|
||||||
res.data.introduce = res.data.introduce.replace(
|
// res.data.introduce = res.data.introduce.replace(
|
||||||
new RegExp(str, "g"),
|
// new RegExp(str, "g"),
|
||||||
nbsp
|
// nbsp
|
||||||
);
|
// );
|
||||||
state.expertDetail = res.data;
|
// state.expertDetail = res.data;
|
||||||
loading.value = false;
|
// loading.value = false;
|
||||||
}
|
// }
|
||||||
|
// })
|
||||||
|
searchExpertDetail(id)
|
||||||
|
.then((resp) => {
|
||||||
|
state.expertDetail = resp.data;
|
||||||
|
loading.value = false;
|
||||||
})
|
})
|
||||||
.catch(() => {
|
.catch(() => {
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
@ -657,4 +666,4 @@ function getDataList() {
|
|||||||
color: #666666;
|
color: #666666;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
@ -70,28 +70,7 @@ function handleDetail(id) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
// 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,
|
|
||||||
// },
|
|
||||||
// ],
|
|
||||||
// });
|
|
||||||
const searchResults = ref([]);
|
const searchResults = ref([]);
|
||||||
const total = ref(0);
|
const total = ref(0);
|
||||||
function createdData(arr) {
|
function createdData(arr) {
|
||||||
@ -103,29 +82,7 @@ function createdData(arr) {
|
|||||||
});
|
});
|
||||||
return l;
|
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: 4,
|
|
||||||
// page_num: state.pageNum,
|
|
||||||
// page_size: state.pageSize,
|
|
||||||
// keyword: state.keyword,
|
|
||||||
// },
|
|
||||||
// });
|
|
||||||
// }
|
|
||||||
const getSearchResult = async () => {
|
const getSearchResult = async () => {
|
||||||
const resp = await search(queryParams);
|
const resp = await search(queryParams);
|
||||||
console.log(resp);
|
console.log(resp);
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
<div v-loading="loading">
|
<div v-loading="loading">
|
||||||
<searchContainer
|
<searchContainer
|
||||||
bannerKey="首页>专利库>专利详情"
|
bannerKey="首页>专利库>专利详情"
|
||||||
title="企业库"
|
title="专利库"
|
||||||
@handleQuery="handleQuery"
|
@handleQuery="handleQuery"
|
||||||
>
|
>
|
||||||
<template v-slot>
|
<template v-slot>
|
||||||
@ -38,18 +38,18 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="line">
|
<div class="line">
|
||||||
企业规模:
|
申请号:
|
||||||
<span>{{ state.patentDetail.kind_title }}</span>
|
<span>{{ state.patentDetail.applyCode }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="line">
|
<div class="line">
|
||||||
核心产品及应用场景:
|
申请日
|
||||||
<span>{{ state.patentDetail.product }}</span>
|
<span>{{ state.patentDetail.applyAt }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="line">
|
<div class="line">
|
||||||
企业网站:
|
申请(专利权)人
|
||||||
<a :href="state.patentDetail.url">
|
<!-- <a :href="state.patentDetail.applyName"> -->
|
||||||
<span>{{ state.patentDetail.url }}</span>
|
<span>{{ state.patentDetail.applyName }}</span>
|
||||||
</a>
|
<!-- </a> -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="keywords" style="flex: 1">
|
<div class="keywords" style="flex: 1">
|
||||||
@ -67,13 +67,17 @@
|
|||||||
|
|
||||||
<div class="product">
|
<div class="product">
|
||||||
<div style="padding: 20px 0">
|
<div style="padding: 20px 0">
|
||||||
<div class="pointTit">专利描述</div>
|
<div class="pointTit">专利摘要</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="html" v-html="state.patentDetail.description"></div>
|
<div class="html" v-html="state.patentDetail.description"></div>
|
||||||
<div style="padding: 20px 0">
|
<div style="padding: 20px 0">
|
||||||
<div class="pointTit">生产方向</div>
|
<div class="pointTit">主权项</div>
|
||||||
</div>
|
</div>
|
||||||
<section v-if="state.patentDetail.directions">
|
<div
|
||||||
|
class="html"
|
||||||
|
v-html="state.patentDetail.principalClaim"
|
||||||
|
></div>
|
||||||
|
<!-- <section v-if="state.patentDetail.directions">
|
||||||
<div
|
<div
|
||||||
v-for="(item, index) in state.patentDetail.directions"
|
v-for="(item, index) in state.patentDetail.directions"
|
||||||
:key="index"
|
:key="index"
|
||||||
@ -81,15 +85,15 @@
|
|||||||
>
|
>
|
||||||
{{ item }}
|
{{ item }}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section> -->
|
||||||
<div style="padding: 20px 0">
|
<!-- <div style="padding: 20px 0">
|
||||||
<div class="pointTit">产品列表</div>
|
<div class="pointTit">产品列表</div>
|
||||||
</div>
|
</div>
|
||||||
<section v-for="item in state.companyProduct" :key="item.id">
|
<section v-for="item in state.companyProduct" :key="item.id">
|
||||||
<div style="border: 1px solid #dcdcdc; margin-bottom: 10px">
|
<div style="border: 1px solid #dcdcdc; margin-bottom: 10px">
|
||||||
<productItem :data="item"></productItem>
|
<productItem :data="item"></productItem>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section> -->
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- <div style="padding: 20px 0">
|
<!-- <div style="padding: 20px 0">
|
||||||
|
163
src/views/website/searchList/serviceDemand.vue
Normal file
163
src/views/website/searchList/serviceDemand.vue
Normal file
@ -0,0 +1,163 @@
|
|||||||
|
<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>{{ total }}</span> 个需求
|
||||||
|
</div>
|
||||||
|
<div v-loading="loading">
|
||||||
|
<section v-for="item in searchResults" :key="item.id">
|
||||||
|
<div style="border: 1px solid #dcdcdc; margin-bottom: 10px">
|
||||||
|
<ServiceDemandItem :data="item"></ServiceDemandItem>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<pagination
|
||||||
|
class="pagination"
|
||||||
|
:total="total"
|
||||||
|
:pageSizes="[10, 10 << 1, 10 << 2, 10 << 3]"
|
||||||
|
v-model:page="queryParams.pageNum"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
:autoScroll="false"
|
||||||
|
@pagination="getDataList"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="r">
|
||||||
|
<webContact />
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
</searchContainer>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup name="SearchAchievement">
|
||||||
|
import webContact from "@/components/webContact/index.vue";
|
||||||
|
import { search } from "@/api/website/home/index";
|
||||||
|
import searchContainer from "./components/searchContainer.vue";
|
||||||
|
// import industrySelect from "./components/industrySelect.vue";
|
||||||
|
// import achievementItem from "./components/achievementItem";
|
||||||
|
import { useRoute } from "vue-router";
|
||||||
|
import ServiceDemandItem from "./components/serviceDemandItem.vue";
|
||||||
|
|
||||||
|
const loading = ref(true);
|
||||||
|
const searchResults = ref([]);
|
||||||
|
const total = ref(0);
|
||||||
|
const route = useRoute();
|
||||||
|
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 5,
|
||||||
|
searchType: 6,
|
||||||
|
queryType: route.query.queryType,
|
||||||
|
query: route.query.keyword,
|
||||||
|
});
|
||||||
|
|
||||||
|
function handleQuery(keyword) {
|
||||||
|
queryParams.query = keyword;
|
||||||
|
getDataList();
|
||||||
|
}
|
||||||
|
|
||||||
|
const getDataList = async () => {
|
||||||
|
loading.value = true;
|
||||||
|
try {
|
||||||
|
const resp = await search(queryParams);
|
||||||
|
searchResults.value = resp.list;
|
||||||
|
total.value = resp.total;
|
||||||
|
loading.value = false;
|
||||||
|
} catch (error) {
|
||||||
|
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>
|
384
src/views/website/searchList/serviceDemandDetail.vue
Normal file
384
src/views/website/searchList/serviceDemandDetail.vue
Normal file
@ -0,0 +1,384 @@
|
|||||||
|
<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">
|
||||||
|
<div style="flex: 1">
|
||||||
|
<div class="item">
|
||||||
|
<el-row type="flex" style="padding: 40px 20px">
|
||||||
|
<div class="img">
|
||||||
|
<img :src="state.demandDetail.image" alt />
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="tit">
|
||||||
|
<!-- <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">
|
||||||
|
{{ state.demandDetail.title }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
需求类型:
|
||||||
|
<span>{{ state.demandDetail.kind }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
申请日
|
||||||
|
<span>{{ state.demandDetail.createTime }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
提交人
|
||||||
|
<!-- <a :href="state.demandDetail.applyName"> -->
|
||||||
|
<span>{{ state.demandDetail.commitUserName }}</span>
|
||||||
|
<!-- </a> -->
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
联系方式
|
||||||
|
<span>{{ state.demandDetail.mobile }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="keywords" style="flex: 1">
|
||||||
|
<wordcloud
|
||||||
|
v-if="state.demandDetail.keywords"
|
||||||
|
:data="createdData(state.demandDetail.keywords)"
|
||||||
|
></wordcloud>
|
||||||
|
</div>
|
||||||
|
<div class="btns">
|
||||||
|
<div class="order">预约对接</div>
|
||||||
|
<div class="share">一键分享</div>
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="product">
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">需求描述</div>
|
||||||
|
</div>
|
||||||
|
<div class="html" v-html="state.demandDetail.description"></div>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">主要应用</div>
|
||||||
|
</div>
|
||||||
|
<div
|
||||||
|
class="html"
|
||||||
|
v-html="state.demandDetail.principalClaim"
|
||||||
|
></div>
|
||||||
|
<!-- <section v-if="state.demandDetail.directions">
|
||||||
|
<div
|
||||||
|
v-for="(item, index) in state.demandDetail.directions"
|
||||||
|
:key="index"
|
||||||
|
class="describe"
|
||||||
|
>
|
||||||
|
{{ item }}
|
||||||
|
</div>
|
||||||
|
</section> -->
|
||||||
|
<!-- <div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">产品列表</div>
|
||||||
|
</div>
|
||||||
|
<section v-for="item in state.companyProduct" :key="item.id">
|
||||||
|
<div style="border: 1px solid #dcdcdc; margin-bottom: 10px">
|
||||||
|
<productItem :data="item"></productItem>
|
||||||
|
</div>
|
||||||
|
</section> -->
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- <div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">企业推荐</div>
|
||||||
|
</div>
|
||||||
|
<div>
|
||||||
|
<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 />
|
||||||
|
</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>
|
||||||
|
</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";
|
||||||
|
import { searchServiceDemandDetail } from "@/api/website/home";
|
||||||
|
import { onMounted, reactive, ref } from "vue";
|
||||||
|
import searchContainer from "./components/searchContainer.vue";
|
||||||
|
import wordcloud from "./components/wordcloud.vue";
|
||||||
|
import productItem from "./components/productItem.vue";
|
||||||
|
import { useRoute, useRouter } from "vue-router";
|
||||||
|
const router = useRouter();
|
||||||
|
const route = useRoute();
|
||||||
|
const loading = ref(true);
|
||||||
|
const state = reactive({
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 4,
|
||||||
|
keyword: "",
|
||||||
|
val: 3,
|
||||||
|
demandDetail: {},
|
||||||
|
companyProduct: [],
|
||||||
|
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 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;
|
||||||
|
searchServiceDemandDetail(id)
|
||||||
|
.then((resp) => {
|
||||||
|
state.demandDetail = resp.data;
|
||||||
|
loading.value = false;
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
loading.value = false;
|
||||||
|
});
|
||||||
|
// searchdemandDetail(id)
|
||||||
|
// .then((resp) => {})
|
||||||
|
// .catch((err) => {
|
||||||
|
// console.log(err);
|
||||||
|
// loading.value = false;
|
||||||
|
// });
|
||||||
|
// companyProduct(id).then((res) => {
|
||||||
|
// if (200 == res.code) {
|
||||||
|
// state.companyProduct = res.data.data;
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.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;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.item {
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: #fff;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
|
||||||
|
.btns {
|
||||||
|
overflow: hidden;
|
||||||
|
padding-top: 20px;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
div {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.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>
|
162
src/views/website/searchList/technologyDemand.vue
Normal file
162
src/views/website/searchList/technologyDemand.vue
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
<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>{{ total }}</span> 个技术需求
|
||||||
|
</div>
|
||||||
|
<div v-loading="loading">
|
||||||
|
<section v-for="item in searchResults" :key="item.id">
|
||||||
|
<div style="border: 1px solid #dcdcdc; margin-bottom: 10px">
|
||||||
|
<TechnologyDemandItem :data="item"></TechnologyDemandItem>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<pagination
|
||||||
|
class="pagination"
|
||||||
|
:total="total"
|
||||||
|
:pageSizes="[10, 10 << 1, 10 << 2, 10 << 3]"
|
||||||
|
v-model:page="queryParams.pageNum"
|
||||||
|
v-model:limit="queryParams.pageSize"
|
||||||
|
:autoScroll="false"
|
||||||
|
@pagination="getDataList"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="r">
|
||||||
|
<webContact />
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
</searchContainer>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup name="SearchAchievement">
|
||||||
|
import webContact from "@/components/webContact/index.vue";
|
||||||
|
import { search } from "@/api/website/home/index";
|
||||||
|
import searchContainer from "./components/searchContainer.vue";
|
||||||
|
// import industrySelect from "./components/industrySelect.vue";
|
||||||
|
import { useRoute } from "vue-router";
|
||||||
|
import TechnologyDemandItem from "./components/technologyDemandItem.vue";
|
||||||
|
|
||||||
|
const loading = ref(true);
|
||||||
|
const searchResults = ref([]);
|
||||||
|
const total = ref(0);
|
||||||
|
const route = useRoute();
|
||||||
|
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 5,
|
||||||
|
searchType: 7,
|
||||||
|
queryType: route.query.queryType,
|
||||||
|
query: route.query.keyword,
|
||||||
|
});
|
||||||
|
|
||||||
|
function handleQuery(keyword) {
|
||||||
|
queryParams.value = keyword;
|
||||||
|
getDataList();
|
||||||
|
}
|
||||||
|
|
||||||
|
const getDataList = async () => {
|
||||||
|
loading.value = true;
|
||||||
|
try {
|
||||||
|
const resp = await search(queryParams);
|
||||||
|
searchResults.value = resp.list;
|
||||||
|
total.value = resp.total;
|
||||||
|
loading.value = false;
|
||||||
|
} catch (error) {
|
||||||
|
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>
|
319
src/views/website/searchList/technologyDemandDetail.vue
Normal file
319
src/views/website/searchList/technologyDemandDetail.vue
Normal file
@ -0,0 +1,319 @@
|
|||||||
|
<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">
|
||||||
|
<div style="flex: 1">
|
||||||
|
<div class="item">
|
||||||
|
<el-row type="flex" style="padding: 40px 20px">
|
||||||
|
<div class="img">
|
||||||
|
<img :src="state.demandDetail.image" alt />
|
||||||
|
</div>
|
||||||
|
<div class="content">
|
||||||
|
<div class="tit">
|
||||||
|
<!-- <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">
|
||||||
|
{{ state.demandDetail.title }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
需求类型:
|
||||||
|
<span>{{ state.demandDetail.kind }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
申请日
|
||||||
|
<span>{{ state.demandDetail.createTime }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
联系人
|
||||||
|
<!-- <a :href="state.demandDetail.applyName"> -->
|
||||||
|
<span>{{ state.demandDetail.name }}</span>
|
||||||
|
<!-- </a> -->
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
联系方式
|
||||||
|
<span>{{ state.demandDetail.mobile }}</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="keywords" style="flex: 1">
|
||||||
|
<wordcloud
|
||||||
|
v-if="state.demandDetail.keywords"
|
||||||
|
:data="createdData(state.demandDetail.keywords)"
|
||||||
|
></wordcloud>
|
||||||
|
</div>
|
||||||
|
<div class="btns">
|
||||||
|
<div class="order">预约对接</div>
|
||||||
|
<div class="share">一键分享</div>
|
||||||
|
</div>
|
||||||
|
</el-row>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="product">
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">所属领域</div>
|
||||||
|
</div>
|
||||||
|
<div>{{ state.demandDetail.industryStr }}</div>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">需求描述</div>
|
||||||
|
</div>
|
||||||
|
<div class="html" v-html="state.demandDetail.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 request from "@/utils/request";
|
||||||
|
import { searchTechnologyDemandDetail } from "@/api/website/home";
|
||||||
|
import { onMounted, reactive, ref } from "vue";
|
||||||
|
import searchContainer from "./components/searchContainer.vue";
|
||||||
|
import wordcloud from "./components/wordcloud.vue";
|
||||||
|
import productItem from "./components/productItem.vue";
|
||||||
|
import { useRoute, useRouter } from "vue-router";
|
||||||
|
const router = useRouter();
|
||||||
|
const route = useRoute();
|
||||||
|
const loading = ref(true);
|
||||||
|
const state = reactive({
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 4,
|
||||||
|
keyword: "",
|
||||||
|
val: 3,
|
||||||
|
demandDetail: {},
|
||||||
|
companyProduct: [],
|
||||||
|
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 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;
|
||||||
|
searchTechnologyDemandDetail(id)
|
||||||
|
.then((resp) => {
|
||||||
|
state.demandDetail = resp.data;
|
||||||
|
loading.value = false;
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
loading.value = false;
|
||||||
|
});
|
||||||
|
// searchdemandDetail(id)
|
||||||
|
// .then((resp) => {})
|
||||||
|
// .catch((err) => {
|
||||||
|
// console.log(err);
|
||||||
|
// loading.value = false;
|
||||||
|
// });
|
||||||
|
// companyProduct(id).then((res) => {
|
||||||
|
// if (200 == res.code) {
|
||||||
|
// state.companyProduct = res.data.data;
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.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;
|
||||||
|
}
|
||||||
|
|
||||||
|
.product {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.item {
|
||||||
|
overflow: hidden;
|
||||||
|
background-color: #fff;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
|
||||||
|
.btns {
|
||||||
|
overflow: hidden;
|
||||||
|
padding-top: 20px;
|
||||||
|
width: 100%;
|
||||||
|
|
||||||
|
div {
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.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>
|
@ -32,7 +32,8 @@ export default defineConfig(({ mode, command }) => {
|
|||||||
// https://cn.vitejs.dev/config/#server-proxy
|
// https://cn.vitejs.dev/config/#server-proxy
|
||||||
"/dev-api": {
|
"/dev-api": {
|
||||||
// target: 'http://120.26.107.74:1618',
|
// target: 'http://120.26.107.74:1618',
|
||||||
target: "http://101.34.131.16:1618",
|
// target: "http://101.34.131.16:1618",
|
||||||
|
target: "http://192.168.110.10:1618",
|
||||||
// target: 'http://172.18.3.127:1618',
|
// target: 'http://172.18.3.127:1618',
|
||||||
changeOrigin: true,
|
changeOrigin: true,
|
||||||
rewrite: (p) => p.replace(/^\/dev-api/, ""),
|
rewrite: (p) => p.replace(/^\/dev-api/, ""),
|
||||||
|
Reference in New Issue
Block a user