bug fixed
This commit is contained in:
69
info.ts
Normal file
69
info.ts
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
export interface User {
|
||||||
|
userId: number;
|
||||||
|
userName: string;
|
||||||
|
nickName: string;
|
||||||
|
email: string;
|
||||||
|
mobile: string;
|
||||||
|
sex: string;
|
||||||
|
post?: any;
|
||||||
|
phone: string;
|
||||||
|
avatar: string;
|
||||||
|
password: string;
|
||||||
|
status: string;
|
||||||
|
loginIp: string;
|
||||||
|
loginDate?: any;
|
||||||
|
createBy: string;
|
||||||
|
createTime: string;
|
||||||
|
updateBy: string;
|
||||||
|
updateTime?: any;
|
||||||
|
remark?: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Enterprise {
|
||||||
|
id: number;
|
||||||
|
tenantId: number;
|
||||||
|
area?: any;
|
||||||
|
inviterId: number;
|
||||||
|
uid: number;
|
||||||
|
username: string;
|
||||||
|
phone: string;
|
||||||
|
email: string;
|
||||||
|
kind: string;
|
||||||
|
name: string;
|
||||||
|
code: string;
|
||||||
|
image: string;
|
||||||
|
product: string;
|
||||||
|
province: string;
|
||||||
|
city: string;
|
||||||
|
cityStr: string;
|
||||||
|
district: string;
|
||||||
|
address: string;
|
||||||
|
url: string;
|
||||||
|
license: string;
|
||||||
|
industry: string;
|
||||||
|
industrys?: any;
|
||||||
|
industryStr: string;
|
||||||
|
keyword: string;
|
||||||
|
keywords: string[];
|
||||||
|
direction: string;
|
||||||
|
directions?: any;
|
||||||
|
introduce: string;
|
||||||
|
examineStatus: string;
|
||||||
|
examineRemark: string;
|
||||||
|
examineAt: string;
|
||||||
|
isDeleted: string;
|
||||||
|
createdAt: string;
|
||||||
|
updatedAt: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Data {
|
||||||
|
vip?: any;
|
||||||
|
user: User;
|
||||||
|
enterprise: Enterprise;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface RootObject {
|
||||||
|
msg: string;
|
||||||
|
code: number;
|
||||||
|
data: Data;
|
||||||
|
}
|
@ -2,82 +2,96 @@ import request from "@/utils/request";
|
|||||||
|
|
||||||
// 专家想合作企业列表
|
// 专家想合作企业列表
|
||||||
export const expertWantEnterpriseList = (params) => {
|
export const expertWantEnterpriseList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/app/expert/expertWantEnterpriseList`,
|
url: `/app/expert/expertWantEnterpriseList`,
|
||||||
method: "GET",
|
method: "GET",
|
||||||
params
|
params,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
// 新增想合作企业
|
// 新增想合作企业
|
||||||
export const insertExpertWantEnterprise = (data) => {
|
export const insertExpertWantEnterprise = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/app/expert/insertExpertWantEnterprise`,
|
url: `/app/expert/insertExpertWantEnterprise`,
|
||||||
method: "POST",
|
method: "POST",
|
||||||
data
|
data,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
// 修改想合作企业
|
// 修改想合作企业
|
||||||
export const updateExpertWantEnterprise = (data) => {
|
export const updateExpertWantEnterprise = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/app/expert/updateExpertWantEnterprise`,
|
url: `/app/expert/updateExpertWantEnterprise`,
|
||||||
method: "PUT",
|
method: "PUT",
|
||||||
data
|
data,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
// 删除想合作企业
|
// 删除想合作企业
|
||||||
export const deleteExpertWantEnterpriseByIds = (data) => {
|
export const deleteExpertWantEnterpriseByIds = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/app/expert/deleteExpertWantEnterpriseByIds`,
|
url: `/app/expert/deleteExpertWantEnterpriseByIds`,
|
||||||
method: "DELETE",
|
method: "DELETE",
|
||||||
data
|
data,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// 专家服务需求列表
|
// 专家服务需求列表
|
||||||
export const demandList = (params) => {
|
export const demandList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/app/expert/demandList`,
|
url: `/app/expert/demandList`,
|
||||||
method: "GET",
|
method: "GET",
|
||||||
params
|
params,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
// 新增服务需求
|
// 新增服务需求
|
||||||
export const insertDemand = (data) => {
|
export const insertDemand = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/app/expert/insertDemand`,
|
url: `/app/expert/insertDemand`,
|
||||||
method: "POST",
|
method: "POST",
|
||||||
data
|
data,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
// 专家已合作企业列表
|
// 专家已合作企业列表
|
||||||
export const getExpertCooperateEnterpriseList = (params) => {
|
export const getExpertCooperateEnterpriseList = (params) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/app/expert/getExpertCooperateEnterpriseList`,
|
url: `/app/expert/getExpertCooperateEnterpriseList`,
|
||||||
method: "GET",
|
method: "GET",
|
||||||
params
|
params,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
// 专家新增已合作企业
|
// 专家新增已合作企业
|
||||||
export const insertExpertCooperateEnterprise = (data) => {
|
export const insertExpertCooperateEnterprise = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/app/expert/insertExpertCooperateEnterprise`,
|
url: `/app/expert/insertExpertCooperateEnterprise`,
|
||||||
method: "POST",
|
method: "POST",
|
||||||
data
|
data,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
// 专家修改已合作企业
|
// 专家修改已合作企业
|
||||||
export const updateExpertCooperateEnterprise = (data) => {
|
export const updateExpertCooperateEnterprise = (data) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/app/expert/updateExpertCooperateEnterprise`,
|
url: `/app/expert/updateExpertCooperateEnterprise`,
|
||||||
method: "PUT",
|
method: "PUT",
|
||||||
data
|
data,
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
// 删除已合作
|
// 删除已合作
|
||||||
export const deleteExpertCooperateEnterpriseByIds = (ids) => {
|
export const deleteExpertCooperateEnterpriseByIds = (ids) => {
|
||||||
return request({
|
return request({
|
||||||
url: `/app/expert/deleteExpertCooperateEnterpriseByIds/${ids}`,
|
url: `/app/expert/deleteExpertCooperateEnterpriseByIds/${ids}`,
|
||||||
method: "DELETE",
|
method: "DELETE",
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
// 获取服务需求详情
|
||||||
|
export const getDemandById = (id) => {
|
||||||
|
return request({
|
||||||
|
url: `/app/expert/getDemand/${id}`,
|
||||||
|
method: "GET",
|
||||||
|
});
|
||||||
|
};
|
||||||
|
// 修改服务需求
|
||||||
|
export const updateDemand = (data) => {
|
||||||
|
return request({
|
||||||
|
url: `/app/expert/updateDemand`,
|
||||||
|
method: "PUT",
|
||||||
|
data,
|
||||||
|
});
|
||||||
|
};
|
||||||
|
@ -91,6 +91,13 @@ export function searchAchievementDetail(id) {
|
|||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// 客户端实验室搜索结果详情
|
||||||
|
export function searchLaboratoryDetail(id) {
|
||||||
|
return request({
|
||||||
|
url: `/search/laboratory/${id}`,
|
||||||
|
method: "get",
|
||||||
|
});
|
||||||
|
}
|
||||||
// 客户端专家搜索结果详情
|
// 客户端专家搜索结果详情
|
||||||
export function searchExpertDetail(id) {
|
export function searchExpertDetail(id) {
|
||||||
return request({
|
return request({
|
||||||
@ -222,3 +229,10 @@ export function countAchievementByArea(cityCode) {
|
|||||||
},
|
},
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// 获取尾部导航
|
||||||
|
export function getCasNavigation() {
|
||||||
|
return request({
|
||||||
|
url: "/app/about/getCasNavigation",
|
||||||
|
method: "get",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
import request from "@/utils/request";
|
import request from "@/utils/request";
|
||||||
import { onMounted, reactive, watch } from "vue";
|
import { onMounted, reactive, watch } from "vue";
|
||||||
import { getCategory } from "@/api/website/solution";
|
import { getCategory } from "@/api/website/solution";
|
||||||
|
import { getCasNavigation } from "@/api/website/home";
|
||||||
|
|
||||||
function navigation() {
|
function navigation() {
|
||||||
return request({
|
return request({
|
||||||
@ -66,178 +67,179 @@ const state = reactive({
|
|||||||
email: "",
|
email: "",
|
||||||
address: "",
|
address: "",
|
||||||
});
|
});
|
||||||
function getNavigation() {
|
async function getNavigation() {
|
||||||
// navigation().then((res) => {
|
// navigation().then((res) => {
|
||||||
// if (200 == res.code) {
|
// if (200 == res.code) {
|
||||||
// state.list = res.data;
|
// state.list = res.data;
|
||||||
// }
|
// }
|
||||||
// });
|
// });
|
||||||
const res = {
|
const resp = await getCasNavigation();
|
||||||
msg: "操作成功",
|
// const res = {
|
||||||
code: 200,
|
// msg: "操作成功",
|
||||||
data: [
|
// code: 200,
|
||||||
{
|
// data: [
|
||||||
id: 21,
|
// {
|
||||||
tenantId: 3,
|
// id: 21,
|
||||||
parentId: 0,
|
// tenantId: 3,
|
||||||
title: "创新服务",
|
// parentId: 0,
|
||||||
link: "/",
|
// title: "创新服务",
|
||||||
targetFlag: "0",
|
// link: "/",
|
||||||
sort: 0,
|
// targetFlag: "0",
|
||||||
status: "1",
|
// sort: 0,
|
||||||
createTime: "2022-02-21 14:03:28",
|
// status: "1",
|
||||||
updateTime: "2022-02-21 14:03:28",
|
// createTime: "2022-02-21 14:03:28",
|
||||||
children: [
|
// updateTime: "2022-02-21 14:03:28",
|
||||||
{
|
// children: [
|
||||||
id: 22,
|
// {
|
||||||
tenantId: 1,
|
// id: 22,
|
||||||
parentId: 21,
|
// tenantId: 1,
|
||||||
title: "中科院设备共享平台",
|
// parentId: 21,
|
||||||
link: "http://samp.cas.cn",
|
// title: "中科院设备共享平台",
|
||||||
targetFlag: "0",
|
// link: "http://samp.cas.cn",
|
||||||
sort: 0,
|
// targetFlag: "0",
|
||||||
status: "1",
|
// sort: 0,
|
||||||
createTime: "2022-02-21 14:03:47",
|
// status: "1",
|
||||||
updateTime: "2022-02-21 14:03:47",
|
// createTime: "2022-02-21 14:03:47",
|
||||||
children: [],
|
// updateTime: "2022-02-21 14:03:47",
|
||||||
},
|
// children: [],
|
||||||
{
|
// },
|
||||||
id: 23,
|
// {
|
||||||
tenantId: 1,
|
// id: 23,
|
||||||
parentId: 21,
|
// tenantId: 1,
|
||||||
title: "中科院文献情报中心",
|
// parentId: 21,
|
||||||
link: "https://www.las.ac.cn",
|
// title: "中科院文献情报中心",
|
||||||
targetFlag: "0",
|
// link: "https://www.las.ac.cn",
|
||||||
sort: 0,
|
// targetFlag: "0",
|
||||||
status: "1",
|
// sort: 0,
|
||||||
createTime: "2022-02-21 14:04:52",
|
// status: "1",
|
||||||
updateTime: "2022-02-21 14:04:52",
|
// createTime: "2022-02-21 14:04:52",
|
||||||
children: [],
|
// updateTime: "2022-02-21 14:04:52",
|
||||||
},
|
// children: [],
|
||||||
{
|
// },
|
||||||
id: 25,
|
// {
|
||||||
tenantId: 1,
|
// id: 25,
|
||||||
parentId: 21,
|
// tenantId: 1,
|
||||||
title: "中国科学院",
|
// parentId: 21,
|
||||||
link: "https://www.cas.cn",
|
// title: "中国科学院",
|
||||||
targetFlag: "0",
|
// link: "https://www.cas.cn",
|
||||||
sort: 0,
|
// targetFlag: "0",
|
||||||
status: "1",
|
// sort: 0,
|
||||||
createTime: "2022-02-21 14:05:59",
|
// status: "1",
|
||||||
updateTime: "2022-02-21 14:05:59",
|
// createTime: "2022-02-21 14:05:59",
|
||||||
children: [],
|
// updateTime: "2022-02-21 14:05:59",
|
||||||
},
|
// children: [],
|
||||||
{
|
// },
|
||||||
id: 26,
|
// {
|
||||||
tenantId: 1,
|
// id: 26,
|
||||||
parentId: 21,
|
// tenantId: 1,
|
||||||
title: "中科院重庆院合肥分院",
|
// parentId: 21,
|
||||||
link: "http://www.caszl.cn",
|
// title: "中科院重庆院合肥分院",
|
||||||
targetFlag: "0",
|
// link: "http://www.caszl.cn",
|
||||||
sort: 0,
|
// targetFlag: "0",
|
||||||
status: "1",
|
// sort: 0,
|
||||||
createTime: "2022-02-21 14:06:29",
|
// status: "1",
|
||||||
updateTime: "2022-02-21 14:06:29",
|
// createTime: "2022-02-21 14:06:29",
|
||||||
children: [],
|
// updateTime: "2022-02-21 14:06:29",
|
||||||
},
|
// children: [],
|
||||||
],
|
// },
|
||||||
},
|
// ],
|
||||||
{
|
// },
|
||||||
id: 29,
|
// {
|
||||||
tenantId: 3,
|
// id: 29,
|
||||||
parentId: 0,
|
// tenantId: 3,
|
||||||
title: "联系我们",
|
// parentId: 0,
|
||||||
link: "/",
|
// title: "联系我们",
|
||||||
targetFlag: "0",
|
// link: "/",
|
||||||
sort: 0,
|
// targetFlag: "0",
|
||||||
status: "1",
|
// sort: 0,
|
||||||
createTime: "2022-11-15 16:20:19",
|
// status: "1",
|
||||||
updateTime: null,
|
// createTime: "2022-11-15 16:20:19",
|
||||||
children: [
|
// updateTime: null,
|
||||||
{
|
// children: [
|
||||||
id: 30,
|
// {
|
||||||
tenantId: 3,
|
// id: 30,
|
||||||
parentId: 29,
|
// tenantId: 3,
|
||||||
title: "客服电话:18156053255",
|
// parentId: 29,
|
||||||
link: "/",
|
// title: "客服电话:18156053255",
|
||||||
targetFlag: "0",
|
// link: "/",
|
||||||
sort: 0,
|
// targetFlag: "0",
|
||||||
status: "1",
|
// sort: 0,
|
||||||
createTime: "2022-11-15 16:20:39",
|
// status: "1",
|
||||||
updateTime: null,
|
// createTime: "2022-11-15 16:20:39",
|
||||||
children: [],
|
// updateTime: null,
|
||||||
},
|
// children: [],
|
||||||
{
|
// },
|
||||||
id: 31,
|
// {
|
||||||
tenantId: 3,
|
// id: 31,
|
||||||
parentId: 29,
|
// tenantId: 3,
|
||||||
title: "邮箱:zky@gmail.com",
|
// parentId: 29,
|
||||||
link: "/",
|
// title: "邮箱:zky@gmail.com",
|
||||||
targetFlag: "0",
|
// link: "/",
|
||||||
sort: 0,
|
// targetFlag: "0",
|
||||||
status: "1",
|
// sort: 0,
|
||||||
createTime: "2022-11-15 16:20:56",
|
// status: "1",
|
||||||
updateTime: null,
|
// createTime: "2022-11-15 16:20:56",
|
||||||
children: [],
|
// updateTime: null,
|
||||||
},
|
// children: [],
|
||||||
{
|
// },
|
||||||
id: 32,
|
// {
|
||||||
tenantId: 3,
|
// id: 32,
|
||||||
parentId: 29,
|
// tenantId: 3,
|
||||||
title: "地址:安徽省合肥市高新区创新产业园D1南楼",
|
// parentId: 29,
|
||||||
link: "/",
|
// title: "地址:安徽省合肥市高新区创新产业园D1南楼",
|
||||||
targetFlag: "0",
|
// link: "/",
|
||||||
sort: 0,
|
// targetFlag: "0",
|
||||||
status: "1",
|
// sort: 0,
|
||||||
createTime: "2022-11-15 16:21:43",
|
// status: "1",
|
||||||
updateTime: null,
|
// createTime: "2022-11-15 16:21:43",
|
||||||
children: [],
|
// updateTime: null,
|
||||||
},
|
// children: [],
|
||||||
],
|
// },
|
||||||
},
|
// ],
|
||||||
{
|
// },
|
||||||
id: 33,
|
// {
|
||||||
tenantId: 3,
|
// id: 33,
|
||||||
parentId: 0,
|
// tenantId: 3,
|
||||||
title: "解决方案",
|
// parentId: 0,
|
||||||
link: "/",
|
// title: "解决方案",
|
||||||
targetFlag: "0",
|
// link: "/",
|
||||||
sort: 0,
|
// targetFlag: "0",
|
||||||
status: "1",
|
// sort: 0,
|
||||||
createTime: "2022-11-15 16:22:41",
|
// status: "1",
|
||||||
updateTime: null,
|
// createTime: "2022-11-15 16:22:41",
|
||||||
children: [
|
// updateTime: null,
|
||||||
{
|
// children: [
|
||||||
id: 34,
|
// {
|
||||||
tenantId: 3,
|
// id: 34,
|
||||||
parentId: 33,
|
// tenantId: 3,
|
||||||
title: "企业创新升级",
|
// parentId: 33,
|
||||||
link: "/",
|
// title: "企业创新升级",
|
||||||
targetFlag: "0",
|
// link: "/",
|
||||||
sort: 0,
|
// targetFlag: "0",
|
||||||
status: "1",
|
// sort: 0,
|
||||||
createTime: "2022-11-15 16:22:58",
|
// status: "1",
|
||||||
updateTime: null,
|
// createTime: "2022-11-15 16:22:58",
|
||||||
children: [],
|
// updateTime: null,
|
||||||
},
|
// children: [],
|
||||||
{
|
// },
|
||||||
id: 35,
|
// {
|
||||||
tenantId: 3,
|
// id: 35,
|
||||||
parentId: 33,
|
// tenantId: 3,
|
||||||
title: "成果转化",
|
// parentId: 33,
|
||||||
link: "/",
|
// title: "成果转化",
|
||||||
targetFlag: "0",
|
// link: "/",
|
||||||
sort: 0,
|
// targetFlag: "0",
|
||||||
status: "1",
|
// sort: 0,
|
||||||
createTime: "2022-11-15 16:23:21",
|
// status: "1",
|
||||||
updateTime: null,
|
// createTime: "2022-11-15 16:23:21",
|
||||||
children: [],
|
// updateTime: null,
|
||||||
},
|
// children: [],
|
||||||
],
|
// },
|
||||||
},
|
// ],
|
||||||
],
|
// },
|
||||||
};
|
// ],
|
||||||
state.list = res.data;
|
// };
|
||||||
|
state.list = resp.data;
|
||||||
}
|
}
|
||||||
async function getConfig() {
|
async function getConfig() {
|
||||||
// const mobileData = await config({ key: "mobile" });
|
// const mobileData = await config({ key: "mobile" });
|
||||||
@ -275,7 +277,7 @@ async function getConfig() {
|
|||||||
// });
|
// });
|
||||||
}
|
}
|
||||||
getNavigation();
|
getNavigation();
|
||||||
getConfig();
|
// getConfig();
|
||||||
|
|
||||||
const solutionCategoryList = ref([]);
|
const solutionCategoryList = ref([]);
|
||||||
const loadsolutionCategoryList = async () => {
|
const loadsolutionCategoryList = async () => {
|
||||||
|
@ -73,6 +73,21 @@ export const constantRoutes = [
|
|||||||
searchType: 2,
|
searchType: 2,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: "searchList/lab",
|
||||||
|
component: () => import("../views/website/searchList/lab.vue"),
|
||||||
|
meta: {
|
||||||
|
searchType: 8,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: "searchList/lab/detail/:id",
|
||||||
|
component: () =>
|
||||||
|
import("../views/website/searchList/laboratoryDetail.vue"),
|
||||||
|
meta: {
|
||||||
|
searchType: 8,
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: "searchList/patent",
|
path: "searchList/patent",
|
||||||
component: () => import("../views/website/searchList/patent.vue"),
|
component: () => import("../views/website/searchList/patent.vue"),
|
||||||
|
28
src/utils/city.js
Normal file
28
src/utils/city.js
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import request from "@/utils/request";
|
||||||
|
|
||||||
|
export const getCity = async (provinceCode, cityCode, areaCode) => {
|
||||||
|
const resps = await Promise.all([
|
||||||
|
request({
|
||||||
|
url: `/region/allProvince`,
|
||||||
|
}),
|
||||||
|
request({
|
||||||
|
url: `/region/allCity`,
|
||||||
|
params: {
|
||||||
|
provinceCode,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
request({
|
||||||
|
url: `/region/allArea`,
|
||||||
|
params: {
|
||||||
|
cityCode,
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
]);
|
||||||
|
const provinceStr = resps[0].data.find(
|
||||||
|
(el) => el.provinceCode == provinceCode
|
||||||
|
).provinceName;
|
||||||
|
// console.log(provinceStr);
|
||||||
|
const cityStr = resps[1].data.find((el) => el.cityCode == cityCode).cityName;
|
||||||
|
const areaStr = resps[2].data.find((el) => el.areaCode == areaCode).areaName;
|
||||||
|
return `${provinceStr} ${cityStr} ${areaStr}`;
|
||||||
|
};
|
@ -35,6 +35,27 @@ export const enterpriseOptions = [
|
|||||||
{ key: "104", value: "高新技术企业" },
|
{ key: "104", value: "高新技术企业" },
|
||||||
{ key: "105", value: "科技企业" },
|
{ key: "105", value: "科技企业" },
|
||||||
];
|
];
|
||||||
|
// 需求类型
|
||||||
|
export const demandCategoryList = [
|
||||||
|
{ id: 1, name: "基金对接" },
|
||||||
|
{ id: 2, name: "贷款" },
|
||||||
|
{ id: 3, name: "对接专家院士" },
|
||||||
|
{ id: 4, name: "人才培养" },
|
||||||
|
{ id: 5, name: "一带一路国际合作" },
|
||||||
|
{ id: 6, name: "上市辅导" },
|
||||||
|
{ id: 7, name: "成果产业化" },
|
||||||
|
{ id: 8, name: "国家级科研平台合作" },
|
||||||
|
{ id: 9, name: "研发项目立项评估" },
|
||||||
|
{ id: 10, name: "科技查新" },
|
||||||
|
{ id: 11, name: "产业链上下游对接" },
|
||||||
|
{ id: 12, name: "委托研发" },
|
||||||
|
{ id: 13, name: "对接政府项目落地" },
|
||||||
|
{ id: 14, name: "技术咨询" },
|
||||||
|
{ id: 15, name: "高价值专利培育" },
|
||||||
|
{ id: 16, name: "知识产权布局" },
|
||||||
|
{ id: 17, name: "设立院士工作站" },
|
||||||
|
{ id: 18, name: "海外留学生培养" },
|
||||||
|
];
|
||||||
// export const enterpriseOptions = [
|
// export const enterpriseOptions = [
|
||||||
// { key: "101", value: '上市企业' },
|
// { key: "101", value: '上市企业' },
|
||||||
// { key: "102", value: '优质企业' },
|
// { key: "102", value: '优质企业' },
|
||||||
|
@ -120,6 +120,7 @@ import {
|
|||||||
// 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 { demandCategoryList } from "@/utils/parameter";
|
||||||
// import { onActivated } from "vue";
|
// import { onActivated } from "vue";
|
||||||
import { useRoute, useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
|
|
||||||
@ -154,24 +155,7 @@ const data = reactive({
|
|||||||
const { form, rules } = toRefs(data);
|
const { form, rules } = toRefs(data);
|
||||||
|
|
||||||
const labelWidth = 140;
|
const labelWidth = 140;
|
||||||
const checkList = reactive([
|
const checkList = reactive([...demandCategoryList]);
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
name: "成果推广",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 2,
|
|
||||||
name: "关键成果解决",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
name: "对接专家院士",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 4,
|
|
||||||
name: "上市辅导",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
const checkInput = ref("");
|
const checkInput = ref("");
|
||||||
// const cityFormRef = ref();
|
// const cityFormRef = ref();
|
||||||
const formRef = ref();
|
const formRef = ref();
|
||||||
@ -215,6 +199,8 @@ function addCheck() {
|
|||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
formRef.value.resetFields();
|
formRef.value.resetFields();
|
||||||
if (route.query.id) {
|
if (route.query.id) {
|
||||||
|
const obj = Object.assign({}, route, { title: "修改服务需求" });
|
||||||
|
tab.updatePage(obj);
|
||||||
getDemand({ id: route.query.id }).then((resp) => {
|
getDemand({ id: route.query.id }).then((resp) => {
|
||||||
if (resp.data.kinds) {
|
if (resp.data.kinds) {
|
||||||
resp.data.kinds.forEach((el, index) => {
|
resp.data.kinds.forEach((el, index) => {
|
||||||
|
@ -310,19 +310,19 @@ const submitForm = async (status) => {
|
|||||||
// }
|
// }
|
||||||
// });
|
// });
|
||||||
};
|
};
|
||||||
function addCheck() {
|
// function addCheck() {
|
||||||
if (!checkInput.value.trim().length) return proxy.$modal.msgError("请输入");
|
// if (!checkInput.value.trim().length) return proxy.$modal.msgError("请输入");
|
||||||
const flag = checkList.some((item) => {
|
// const flag = checkList.some((item) => {
|
||||||
return item.name.trim() == checkInput.value.trim();
|
// return item.name.trim() == checkInput.value.trim();
|
||||||
});
|
// });
|
||||||
if (!flag) {
|
// if (!flag) {
|
||||||
checkList.push({
|
// checkList.push({
|
||||||
id: checkList.length + 1,
|
// id: checkList.length + 1,
|
||||||
name: checkInput.value,
|
// name: checkInput.value,
|
||||||
});
|
// });
|
||||||
checkInput.value = "";
|
// checkInput.value = "";
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
// 返回技术需求列表
|
// 返回技术需求列表
|
||||||
const backToList = () => {
|
const backToList = () => {
|
||||||
tab.closeOpenPage({ path: "/demand/technology" });
|
tab.closeOpenPage({ path: "/demand/technology" });
|
||||||
@ -332,6 +332,8 @@ onMounted(() => {
|
|||||||
formRef.value.resetFields();
|
formRef.value.resetFields();
|
||||||
|
|
||||||
if (route.query.id) {
|
if (route.query.id) {
|
||||||
|
const obj = Object.assign({}, route, { title: "修改技术需求" });
|
||||||
|
tab.updatePage(obj);
|
||||||
getTechnologyDemand({ id: route.query.id }).then((resp) => {
|
getTechnologyDemand({ id: route.query.id }).then((resp) => {
|
||||||
form.value = resp.data;
|
form.value = resp.data;
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
<el-radio-button label="5">专家</el-radio-button>
|
<el-radio-button label="5">专家</el-radio-button>
|
||||||
<!-- <el-radio-button label="6">服务需求</el-radio-button> -->
|
<!-- <el-radio-button label="6">服务需求</el-radio-button> -->
|
||||||
<!-- <el-radio-button label="7">技术需求</el-radio-button> -->
|
<!-- <el-radio-button label="7">技术需求</el-radio-button> -->
|
||||||
<!-- <el-radio-button label="4">实验室</el-radio-button> -->
|
<el-radio-button label="8">实验室</el-radio-button>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
|
|
||||||
<div v-if="dataList.length" style="margin-top: 20px" v-loading="loading">
|
<div v-if="dataList.length" style="margin-top: 20px" v-loading="loading">
|
||||||
@ -79,6 +79,7 @@ const loading = ref(true);
|
|||||||
const total = ref(0);
|
const total = ref(0);
|
||||||
|
|
||||||
const queryType = computed(() => {
|
const queryType = computed(() => {
|
||||||
|
console.log(queryParams.value.searchType);
|
||||||
if (queryParams.value.searchType == 1) {
|
if (queryParams.value.searchType == 1) {
|
||||||
return 2;
|
return 2;
|
||||||
} else if (queryParams.value.searchType == 2) {
|
} else if (queryParams.value.searchType == 2) {
|
||||||
@ -87,9 +88,9 @@ const queryType = computed(() => {
|
|||||||
return 2;
|
return 2;
|
||||||
} else if (queryParams.value.searchType == 5) {
|
} else if (queryParams.value.searchType == 5) {
|
||||||
return 2;
|
return 2;
|
||||||
|
} else if (queryParams.value.searchType == 8) {
|
||||||
|
return 2;
|
||||||
}
|
}
|
||||||
// else if (queryParams.value.searchType == 6) {
|
|
||||||
// return 1;
|
|
||||||
// } else if (queryParams.value.searchType == 7) {
|
// } else if (queryParams.value.searchType == 7) {
|
||||||
// return 1;
|
// return 1;
|
||||||
// }
|
// }
|
||||||
|
@ -12,8 +12,10 @@
|
|||||||
<el-radio-button label="4">专利</el-radio-button>
|
<el-radio-button label="4">专利</el-radio-button>
|
||||||
<el-radio-button label="5">专家</el-radio-button>
|
<el-radio-button label="5">专家</el-radio-button>
|
||||||
<!-- <el-radio-button label="6">服务需求</el-radio-button> -->
|
<!-- <el-radio-button label="6">服务需求</el-radio-button> -->
|
||||||
<el-radio-button label="7">技术需求</el-radio-button>
|
<el-radio-button label="8">实验室</el-radio-button>
|
||||||
<!-- <el-radio-button label="4">实验室</el-radio-button> -->
|
<el-radio-button label="7" v-if="route.path != '/demand/results'"
|
||||||
|
>技术需求</el-radio-button
|
||||||
|
>
|
||||||
</el-radio-group>
|
</el-radio-group>
|
||||||
|
|
||||||
<!-- <el-row :gutter="20">
|
<!-- <el-row :gutter="20">
|
||||||
@ -80,6 +82,10 @@
|
|||||||
:data="item"
|
:data="item"
|
||||||
v-else-if="queryParams.searchType == 7"
|
v-else-if="queryParams.searchType == 7"
|
||||||
></TechnologyDemandItem>
|
></TechnologyDemandItem>
|
||||||
|
<LaboratoryItem
|
||||||
|
:data="item"
|
||||||
|
v-else-if="queryParams.searchType == 8"
|
||||||
|
></LaboratoryItem>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
</div>
|
</div>
|
||||||
@ -102,16 +108,20 @@ import expertItem from "@/views/website/searchList/components/expertItem.vue";
|
|||||||
import serviceDemandItem from "@/views/website/searchList/components/serviceDemandItem.vue";
|
import serviceDemandItem from "@/views/website/searchList/components/serviceDemandItem.vue";
|
||||||
import enterpriseItem from "../../components/enterpriseItem.vue";
|
import enterpriseItem from "../../components/enterpriseItem.vue";
|
||||||
import TechnologyDemandItem from "@/views/website/searchList/components/technologyDemandItem.vue";
|
import TechnologyDemandItem from "@/views/website/searchList/components/technologyDemandItem.vue";
|
||||||
|
|
||||||
import AchievementItem from "@/views/website/searchList/components/achievementItem.vue";
|
import AchievementItem from "@/views/website/searchList/components/achievementItem.vue";
|
||||||
import { useRoute, useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
import useUserStore from "@/store/modules/user";
|
import useUserStore from "@/store/modules/user";
|
||||||
|
import LaboratoryItem from "@/views/website/searchList/components/laboratoryItem.vue";
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
|
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const dataList = ref([]);
|
const dataList = ref([]);
|
||||||
const loading = ref(true);
|
const loading = ref(true);
|
||||||
const total = ref(0);
|
const total = ref(0);
|
||||||
const userStore = useUserStore();
|
const userStore = useUserStore();
|
||||||
const queryType = computed(() => {
|
const queryType = computed(() => {
|
||||||
|
console.log(queryParams.value.searchType);
|
||||||
if (queryParams.value.searchType == 1) {
|
if (queryParams.value.searchType == 1) {
|
||||||
return 2;
|
return 2;
|
||||||
} else if (queryParams.value.searchType == 2) {
|
} else if (queryParams.value.searchType == 2) {
|
||||||
@ -124,6 +134,8 @@ const queryType = computed(() => {
|
|||||||
return 1;
|
return 1;
|
||||||
} else if (queryParams.value.searchType == 7) {
|
} else if (queryParams.value.searchType == 7) {
|
||||||
return 1;
|
return 1;
|
||||||
|
} else if (queryParams.value.searchType == 8) {
|
||||||
|
return 2;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -134,6 +146,7 @@ const data = reactive({
|
|||||||
query: route.query.keyword,
|
query: route.query.keyword,
|
||||||
searchType: "1",
|
searchType: "1",
|
||||||
queryType: queryType,
|
queryType: queryType,
|
||||||
|
isMatch: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -158,17 +171,17 @@ async function getList() {
|
|||||||
// console.log(userStore.enterprise.id);
|
// console.log(userStore.enterprise.id);
|
||||||
dataList.value = resp.list;
|
dataList.value = resp.list;
|
||||||
// 排除自己企业
|
// 排除自己企业
|
||||||
if (queryParams.value.searchType === "1") {
|
// if (queryParams.value.searchType === "1") {
|
||||||
dataList.value = dataList.value.filter(
|
// dataList.value = dataList.value.filter(
|
||||||
(el) => el.id != userStore.enterprise?.id
|
// (el) => el.id != userStore.enterprise?.id
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
// 成果排除专家自己
|
// 成果排除专家自己
|
||||||
else if (queryParams.value.searchType === "2") {
|
// if (queryParams.value.searchType === "2") {
|
||||||
dataList.value = dataList.value.filter(
|
// dataList.value = dataList.value.filter(
|
||||||
(el) => el.expertId != userStore.userId
|
// (el) => el.expertId != userStore.userId
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
total.value = resp.total;
|
total.value = resp.total;
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
}
|
}
|
||||||
|
@ -8,7 +8,10 @@
|
|||||||
{{ vipData.vipType == 1 ? "VIP" : "SVIP" }}
|
{{ vipData.vipType == 1 ? "VIP" : "SVIP" }}
|
||||||
</div> -->
|
</div> -->
|
||||||
<!-- <div class="text-right">续期</div> -->
|
<!-- <div class="text-right">续期</div> -->
|
||||||
<div v-if="vipData.vipType == 1">升级SVIP</div>
|
<div v-if="vipData.vipType == 1">
|
||||||
|
<div>VIP</div>
|
||||||
|
<div>升级SVIP</div>
|
||||||
|
</div>
|
||||||
<div v-else-if="!vipData.vipType">普通会员</div>
|
<div v-else-if="!vipData.vipType">普通会员</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
|
@ -85,7 +85,11 @@
|
|||||||
ref="customersFormRef"
|
ref="customersFormRef"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<CityOptions v-model="modelValue" :labelWidth="labelWidth"></CityOptions>
|
<CityOptions
|
||||||
|
ref="cityFormRef"
|
||||||
|
v-model="modelValue"
|
||||||
|
:labelWidth="labelWidth"
|
||||||
|
></CityOptions>
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="成果成熟度:" prop="maturity">
|
<el-form-item label="成果成熟度:" prop="maturity">
|
||||||
@ -168,6 +172,7 @@
|
|||||||
<el-form-item label="所属单位:" prop="unit">
|
<el-form-item label="所属单位:" prop="unit">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="modelValue.unit"
|
v-model="modelValue.unit"
|
||||||
|
placeholder="请输入所属单位"
|
||||||
></el-input> </el-form-item></el-col
|
></el-input> </el-form-item></el-col
|
||||||
></el-row>
|
></el-row>
|
||||||
<el-row>
|
<el-row>
|
||||||
@ -253,11 +258,22 @@ const props = defineProps({
|
|||||||
const { modelValue, isAdd, showTitle, labelWidth } = toRefs(props);
|
const { modelValue, isAdd, showTitle, labelWidth } = toRefs(props);
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
rules: {
|
rules: {
|
||||||
title: [{ required: true, message: "请输入", trigger: "blur" }],
|
title: [{ required: true, message: "请输入成果名称", trigger: "blur" }],
|
||||||
maturity: [{ required: true, message: "请选择", trigger: "change" }],
|
maturity: [{ required: true, message: "请选择成熟度", trigger: "change" }],
|
||||||
leadStandard: [{ required: true, message: "请选择", trigger: "change" }],
|
leadStandard: [
|
||||||
description: [{ required: true, message: "请输入", trigger: "blur" }],
|
{ required: true, message: "请选择领先情况", trigger: "change" },
|
||||||
image: [{ required: true, message: "请上传", trigger: ["change", "blur"] }],
|
],
|
||||||
|
description: [
|
||||||
|
{ required: true, message: "请输入成果简介", trigger: "blur" },
|
||||||
|
],
|
||||||
|
image: [
|
||||||
|
{
|
||||||
|
required: true,
|
||||||
|
message: "请上传成果图片",
|
||||||
|
trigger: ["change", "blur"],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
unit: [{ required: true, message: "请输入所属单位", trigger: "blur" }],
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
const { rules } = toRefs(data);
|
const { rules } = toRefs(data);
|
||||||
@ -266,6 +282,7 @@ const formRef = ref();
|
|||||||
const fieldFormRef = ref();
|
const fieldFormRef = ref();
|
||||||
const customersFormRef = ref();
|
const customersFormRef = ref();
|
||||||
const directionsFormRef = ref();
|
const directionsFormRef = ref();
|
||||||
|
const cityFormRef = ref();
|
||||||
const keywordsFormRef = ref();
|
const keywordsFormRef = ref();
|
||||||
const validateForm = async () => {
|
const validateForm = async () => {
|
||||||
let formValid;
|
let formValid;
|
||||||
@ -277,13 +294,15 @@ const validateForm = async () => {
|
|||||||
const fieldFormValid = await fieldFormRef.value.validateForm(); // 城市选择表单验证
|
const fieldFormValid = await fieldFormRef.value.validateForm(); // 城市选择表单验证
|
||||||
const customersValid = await customersFormRef.value.validateForm(); // 领域选择表单验证
|
const customersValid = await customersFormRef.value.validateForm(); // 领域选择表单验证
|
||||||
// const directionsFormRef = await customersFormRef.value.validateForm(); // 领域选择表单验证
|
// const directionsFormRef = await customersFormRef.value.validateForm(); // 领域选择表单验证
|
||||||
const keywordsFormRef = await customersFormRef.value.validateForm(); // 领域选择表单验证
|
|
||||||
|
const cityFormValid = await cityFormRef.value.validateForm();
|
||||||
|
const keywordsFormValid = await keywordsFormRef.value.validateForm(); // 关键词
|
||||||
return (
|
return (
|
||||||
formValid &&
|
formValid &&
|
||||||
fieldFormValid &&
|
fieldFormValid &&
|
||||||
customersValid &&
|
customersValid &&
|
||||||
// directionsFormRef &&
|
cityFormValid &&
|
||||||
keywordsFormRef
|
keywordsFormValid
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
defineExpose({
|
defineExpose({
|
||||||
|
@ -112,23 +112,18 @@
|
|||||||
</template>
|
</template>
|
||||||
<script setup>
|
<script setup>
|
||||||
// import { expert } from "@/api/identity/index";
|
// import { expert } from "@/api/identity/index";
|
||||||
import { insertDemand } from "@/api/admin/expert/demand";
|
import {
|
||||||
|
insertDemand,
|
||||||
|
getDemandById,
|
||||||
|
updateDemand,
|
||||||
|
} from "@/api/admin/expert/demand";
|
||||||
|
import { demandCategoryList } from "@/utils/parameter";
|
||||||
|
import { uniqueId } from "lodash";
|
||||||
import tab from "@/plugins/tab";
|
import tab from "@/plugins/tab";
|
||||||
// import CityOptions from "@/views/components/CityOptions";
|
// import CityOptions from "@/views/components/CityOptions";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { useRoute, useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
|
|
||||||
const validateWangEditor = (rule, value, callback) => {
|
|
||||||
console.log(rule);
|
|
||||||
if (wangEditorRef.value.isEmpty()) {
|
|
||||||
callback(new Error(rule.message));
|
|
||||||
} else {
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
const testBlur = () => {
|
|
||||||
console.log("fsd");
|
|
||||||
};
|
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
formData: {
|
formData: {
|
||||||
check: [],
|
check: [],
|
||||||
@ -173,38 +168,15 @@ const data = reactive({
|
|||||||
|
|
||||||
const { queryParams, formData, rules } = toRefs(data);
|
const { queryParams, formData, rules } = toRefs(data);
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance();
|
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const router = useRouter();
|
|
||||||
// const cityFormRef = ref();
|
|
||||||
const formRef = ref();
|
const formRef = ref();
|
||||||
|
|
||||||
if (route.query.id) {
|
|
||||||
}
|
|
||||||
|
|
||||||
const back = () => {
|
const back = () => {
|
||||||
tab.closeOpenPage({ path: "/demand/serviceDemand" });
|
tab.closeOpenPage({ path: "/demand/serviceDemand" });
|
||||||
};
|
};
|
||||||
const labelWidth = 140;
|
const labelWidth = 140;
|
||||||
// const isContainOther = ref(false);
|
// const isContainOther = ref(false);
|
||||||
const checkList = reactive([
|
const checkList = reactive([...demandCategoryList]);
|
||||||
{
|
|
||||||
id: 1,
|
|
||||||
name: "成果推广",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 2,
|
|
||||||
name: "关键成果解决",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 3,
|
|
||||||
name: "对接专家院士",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: 4,
|
|
||||||
name: "上市辅导",
|
|
||||||
},
|
|
||||||
]);
|
|
||||||
const wangEditorRef = ref();
|
const wangEditorRef = ref();
|
||||||
const checkInput = ref("");
|
const checkInput = ref("");
|
||||||
async function submitForm() {
|
async function submitForm() {
|
||||||
@ -212,19 +184,16 @@ async function submitForm() {
|
|||||||
await formRef.value.validate();
|
await formRef.value.validate();
|
||||||
if (formData.value.id) {
|
if (formData.value.id) {
|
||||||
// TODO: 修改专家需求
|
// TODO: 修改专家需求
|
||||||
// updatePost(form.value).then((response) => {
|
await updateDemand(formData.value);
|
||||||
// proxy.$modal.msgSuccess("修改成功");
|
ElMessage.success("修改成功");
|
||||||
// proxy.$router.go(-1);
|
|
||||||
// });
|
|
||||||
} else {
|
} else {
|
||||||
await insertDemand(formData.value);
|
await insertDemand(formData.value);
|
||||||
ElMessage.success("新增成功");
|
ElMessage.success("新增成功");
|
||||||
// router.back();
|
|
||||||
}
|
}
|
||||||
tab.closeOpenPage({ path: "/demand/serviceDemand" });
|
tab.closeOpenPage({ path: "/demand/serviceDemand" });
|
||||||
}
|
}
|
||||||
function addCheck() {
|
function addCheck() {
|
||||||
if (!checkInput.value.trim().length) return proxy.$modal.msgError("请输入");
|
if (!checkInput.value.trim().length) return ElMessage.error("请输入");
|
||||||
const flag = checkList.some((item) => {
|
const flag = checkList.some((item) => {
|
||||||
return item.name.trim() == checkInput.value.trim();
|
return item.name.trim() == checkInput.value.trim();
|
||||||
});
|
});
|
||||||
@ -236,4 +205,18 @@ function addCheck() {
|
|||||||
checkInput.value = "";
|
checkInput.value = "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
const getDetail = async () => {
|
||||||
|
const resp = await getDemandById(route.query.id);
|
||||||
|
formData.value = resp.data;
|
||||||
|
for (const item of resp.data.kinds) {
|
||||||
|
if (!checkList.find((el) => el.name === item)) {
|
||||||
|
checkList.push({ id: uniqueId("unq-"), name: item });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if (route.query.id) {
|
||||||
|
const obj = Object.assign({}, route, { title: "修改需求" });
|
||||||
|
tab.updatePage(obj);
|
||||||
|
getDetail();
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
</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">
|
||||||
<el-table-column label="需求名称" align="center" prop="title" />
|
<!-- <el-table-column label="需求名称" align="center" prop="title" /> -->
|
||||||
<el-table-column label="需求类别" align="center" prop="kind" />
|
<el-table-column label="需求类别" align="center" prop="kind" />
|
||||||
<el-table-column label="状态" align="center" prop="status" />
|
<el-table-column label="状态" align="center" prop="status" />
|
||||||
<el-table-column label="联系人" align="center" prop="name" />
|
<el-table-column label="联系人" align="center" prop="name" />
|
||||||
|
@ -44,7 +44,7 @@
|
|||||||
v-if="queryParams.status == 1"
|
v-if="queryParams.status == 1"
|
||||||
size="small"
|
size="small"
|
||||||
type="text"
|
type="text"
|
||||||
icon="Download"
|
:icon="row.shelfStatus == 1 ? `Download` : `Upload`"
|
||||||
@click="handleShelf(row)"
|
@click="handleShelf(row)"
|
||||||
>{{ row.shelfStatus == 1 ? "下架" : "上架" }}</el-button
|
>{{ row.shelfStatus == 1 ? "下架" : "上架" }}</el-button
|
||||||
>
|
>
|
||||||
|
@ -136,9 +136,9 @@
|
|||||||
></el-input>
|
></el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<!-- //TODO:上传论文添加字段 -->
|
<!-- //TODO:上传论文添加字段 -->
|
||||||
<el-form-item label="上传论文:" prop="paper">
|
<el-form-item label="上传论文:" prop="fileUrl">
|
||||||
<FileUpload
|
<FileUpload
|
||||||
v-model="form.paper"
|
v-model="form.fileUrl"
|
||||||
:limit="1"
|
:limit="1"
|
||||||
:fileType="['docx', 'doc', 'pdf']"
|
:fileType="['docx', 'doc', 'pdf']"
|
||||||
></FileUpload>
|
></FileUpload>
|
||||||
|
@ -20,6 +20,7 @@ import {
|
|||||||
expertAchievementInfo,
|
expertAchievementInfo,
|
||||||
updateExpertAchievement,
|
updateExpertAchievement,
|
||||||
} from "@/api/admin/expert/achievement";
|
} from "@/api/admin/expert/achievement";
|
||||||
|
import tab from "@/plugins/tab";
|
||||||
import { ElMessage } from "element-plus";
|
import { ElMessage } from "element-plus";
|
||||||
import { reactive, ref, toRefs } from "vue";
|
import { reactive, ref, toRefs } from "vue";
|
||||||
import { useRoute, useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
@ -27,7 +28,7 @@ import ReleaseForm from "../components/ReleaseForm";
|
|||||||
const labelWidth = 140;
|
const labelWidth = 140;
|
||||||
|
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
form: { mode: 1 },
|
form: { mode: 1, shelfStatus: "2" },
|
||||||
});
|
});
|
||||||
const formData = reactive({});
|
const formData = reactive({});
|
||||||
|
|
||||||
@ -38,6 +39,8 @@ const releaseFormRef = ref();
|
|||||||
const { id } = route.query;
|
const { id } = route.query;
|
||||||
|
|
||||||
if (id) {
|
if (id) {
|
||||||
|
const obj = Object.assign({}, route, { title: "修改成果" });
|
||||||
|
tab.updatePage(obj);
|
||||||
expertAchievementInfo({ id }).then((resp) => {
|
expertAchievementInfo({ id }).then((resp) => {
|
||||||
form.value = resp.data;
|
form.value = resp.data;
|
||||||
form.value.keywords =
|
form.value.keywords =
|
||||||
@ -52,12 +55,13 @@ const submitForm = async (status) => {
|
|||||||
if (id) {
|
if (id) {
|
||||||
await updateExpertAchievement({ ...form.value, status });
|
await updateExpertAchievement({ ...form.value, status });
|
||||||
ElMessage.success("修改成果成功");
|
ElMessage.success("修改成果成功");
|
||||||
router.back();
|
// router.back();
|
||||||
} else {
|
} else {
|
||||||
await insertAchievement({ ...form.value, status });
|
await insertAchievement({ ...form.value, status });
|
||||||
ElMessage.success("新增成果成功");
|
ElMessage.success("新增成果成功");
|
||||||
router.back();
|
// router.back();
|
||||||
}
|
}
|
||||||
|
tab.closeOpenPage({ path: "/technology/achievement" });
|
||||||
} else {
|
} else {
|
||||||
console.log("校验未通过");
|
console.log("校验未通过");
|
||||||
}
|
}
|
||||||
|
@ -187,13 +187,19 @@
|
|||||||
<!-- //TODO:添加项目简介字段 -->
|
<!-- //TODO:添加项目简介字段 -->
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="项目简介:" prop="kind">
|
<el-form-item label="项目简介:" prop="introduce">
|
||||||
<el-input
|
<WangEditor
|
||||||
|
v-model="form.introduce"
|
||||||
|
width="100%"
|
||||||
|
min-height="150px"
|
||||||
|
@blur="researchRef.validateField(`introduce`)"
|
||||||
|
></WangEditor>
|
||||||
|
<!-- <el-input
|
||||||
type="textarea"
|
type="textarea"
|
||||||
v-model="form.kind"
|
v-model="form.kind"
|
||||||
placeholder="请输入项目简介"
|
placeholder="请输入项目简介"
|
||||||
:autosize="{ minRows: 8, maxRows: 16 }"
|
:autosize="{ minRows: 8, maxRows: 16 }"
|
||||||
/>
|
/> -->
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
@ -259,6 +265,9 @@ const data = reactive({
|
|||||||
director: [
|
director: [
|
||||||
{ required: true, message: "课题负责人不能为空", trigger: "blur" },
|
{ required: true, message: "课题负责人不能为空", trigger: "blur" },
|
||||||
],
|
],
|
||||||
|
introduce: [
|
||||||
|
{ required: true, message: "项目简介不能为空", trigger: "blur" },
|
||||||
|
],
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -181,7 +181,10 @@ watch(
|
|||||||
() => modelValue.value.province,
|
() => modelValue.value.province,
|
||||||
(val) => {
|
(val) => {
|
||||||
console.log("changed province");
|
console.log("changed province");
|
||||||
getCityListByProvinceId(val);
|
val && getCityListByProvinceId(val);
|
||||||
|
},
|
||||||
|
{
|
||||||
|
immediate: true,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -189,7 +192,10 @@ watch(
|
|||||||
() => modelValue.value.city,
|
() => modelValue.value.city,
|
||||||
(val) => {
|
(val) => {
|
||||||
console.log("changed city");
|
console.log("changed city");
|
||||||
getAreaListByCityId(val);
|
val && getAreaListByCityId(val);
|
||||||
|
},
|
||||||
|
{
|
||||||
|
immediate: true,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
getProvinceList();
|
getProvinceList();
|
||||||
|
@ -7,7 +7,8 @@
|
|||||||
>
|
>
|
||||||
<div class="form_title" v-if="showTitle">基本信息</div>
|
<div class="form_title" v-if="showTitle">基本信息</div>
|
||||||
|
|
||||||
<el-row v-if="isAdd">
|
<!-- <el-row v-if="isAdd"> -->
|
||||||
|
<el-row>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="企业logo:">
|
<el-form-item label="企业logo:">
|
||||||
<ImageUpload v-model="modelValue.image" :limit="1" />
|
<ImageUpload v-model="modelValue.image" :limit="1" />
|
||||||
@ -153,7 +154,7 @@
|
|||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-row v-if="isAdd">
|
<!-- <el-row v-if="isAdd">
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="营业执照:" prop="license">
|
<el-form-item label="营业执照:" prop="license">
|
||||||
<ImageUpload
|
<ImageUpload
|
||||||
@ -163,7 +164,7 @@
|
|||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row> -->
|
||||||
|
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
|
@ -173,13 +173,19 @@
|
|||||||
<el-row>
|
<el-row>
|
||||||
<el-col :span="24">
|
<el-col :span="24">
|
||||||
<el-form-item label="个人简介:" prop="introduce">
|
<el-form-item label="个人简介:" prop="introduce">
|
||||||
<el-input
|
<!-- <el-input
|
||||||
v-model="modelValue.introduce"
|
v-model="modelValue.introduce"
|
||||||
placeholder="请输入研究方向、核心技术及产品、代表专利和论文、承担科研项目名称及项目摘要"
|
placeholder="请输入研究方向、核心技术及产品、代表专利和论文、承担科研项目名称及项目摘要"
|
||||||
type="textarea"
|
type="textarea"
|
||||||
:autosize="{ minRows: 16, maxRows: 20 }"
|
:autosize="{ minRows: 16, maxRows: 20 }"
|
||||||
show-word-limit
|
show-word-limit
|
||||||
/>
|
/> -->
|
||||||
|
<WangEditor
|
||||||
|
v-model="modelValue.introduce"
|
||||||
|
width="100%"
|
||||||
|
min-height="150px"
|
||||||
|
@blur="formRef.validateField(`introduce`)"
|
||||||
|
></WangEditor>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-col>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
@ -10,10 +10,10 @@
|
|||||||
<div class="tab">
|
<div class="tab">
|
||||||
<div
|
<div
|
||||||
v-for="(v, index) in state.tabList"
|
v-for="(v, index) in state.tabList"
|
||||||
:style="v == '找实验室' ? `display:none` : ''"
|
|
||||||
:class="{ active: state.tabIndex == index }"
|
:class="{ active: state.tabIndex == index }"
|
||||||
@click="switchTab(index)"
|
@click="switchTab(index)"
|
||||||
>
|
>
|
||||||
|
<!-- :style="v == '找实验室' ? `display:none` : ''" -->
|
||||||
{{ v }}
|
{{ v }}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -28,7 +28,7 @@
|
|||||||
v-model.trim="queryParams.keyword"
|
v-model.trim="queryParams.keyword"
|
||||||
placeholder="请输入检索词"
|
placeholder="请输入检索词"
|
||||||
>
|
>
|
||||||
<template #suffix>
|
<template #suffix v-if="false">
|
||||||
<el-form-item prop="queryType">
|
<el-form-item prop="queryType">
|
||||||
<el-select
|
<el-select
|
||||||
v-model="queryParams.queryType"
|
v-model="queryParams.queryType"
|
||||||
@ -166,8 +166,15 @@ const queryTypeList = [
|
|||||||
value: "1",
|
value: "1",
|
||||||
label: "通过成果名称搜索",
|
label: "通过成果名称搜索",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
value: "2",
|
||||||
|
label: "通过成果简介搜索",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
[
|
||||||
|
{ value: "1", label: "通过实验室名称搜索" },
|
||||||
|
{ value: "2", label: "通过实验室简介搜索" },
|
||||||
],
|
],
|
||||||
[],
|
|
||||||
[
|
[
|
||||||
{ value: "1", label: "通过标题搜索" },
|
{ value: "1", label: "通过标题搜索" },
|
||||||
{ value: "2", label: "通过摘要搜索" },
|
{ value: "2", label: "通过摘要搜索" },
|
||||||
@ -179,11 +186,20 @@ const queryTypeList = [
|
|||||||
{ value: "2", label: "通过个人简介搜索" },
|
{ value: "2", label: "通过个人简介搜索" },
|
||||||
{ value: "3", label: "通过关键词搜索" },
|
{ value: "3", label: "通过关键词搜索" },
|
||||||
],
|
],
|
||||||
[{ value: "1", label: "通过标题搜索" }],
|
[
|
||||||
|
{ value: "1", label: "通过需求标题搜索" },
|
||||||
|
{ value: "2", label: "通过需求简介搜索" },
|
||||||
|
],
|
||||||
|
[],
|
||||||
|
[
|
||||||
|
{ value: "1", label: "通过实验室名称搜索" },
|
||||||
|
{ value: "2", label: "通过实验室简介搜索" },
|
||||||
|
],
|
||||||
// [{ value: "1", label: "通过标题搜索" }],
|
// [{ value: "1", label: "通过标题搜索" }],
|
||||||
];
|
];
|
||||||
|
|
||||||
const handleDetail = async (mode, keyword, queryType) => {
|
const handleDetail = async (mode, keyword, queryType) => {
|
||||||
|
console.log(mode);
|
||||||
await queryRef.value.validate();
|
await queryRef.value.validate();
|
||||||
const routeData = router.resolve({
|
const routeData = router.resolve({
|
||||||
path: `/searchList/${mode}`,
|
path: `/searchList/${mode}`,
|
||||||
@ -232,15 +248,15 @@ const switchTab = (index) => {
|
|||||||
queryRef.value.resetFields("queryType");
|
queryRef.value.resetFields("queryType");
|
||||||
};
|
};
|
||||||
|
|
||||||
watch(
|
// watch(
|
||||||
() => state.tabIndex,
|
// () => state.tabIndex,
|
||||||
(val) => {
|
// (val) => {
|
||||||
console.log(val);
|
// console.log(val);
|
||||||
// return [2, 0][val];
|
// // return [2, 0][val];
|
||||||
queryParams.queryType = ["2", "1", "0", "2", "2", "1"][val];
|
// queryParams.queryType = ["2", "2", "2", "2", "2", "2"][val];
|
||||||
},
|
// },
|
||||||
{ immediate: true }
|
// { immediate: true }
|
||||||
);
|
// );
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
banner({ locals: "首页背景" }).then((resp) => {
|
banner({ locals: "首页背景" }).then((resp) => {
|
||||||
// console.log(resp);
|
// console.log(resp);
|
||||||
|
@ -20,23 +20,23 @@
|
|||||||
<div class="b">暂无</div>
|
<div class="b">暂无</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- <div class="rightBox">
|
<div class="rightBox">
|
||||||
<div class="head">
|
<div class="head">
|
||||||
<div class="a">领域</div>
|
<div class="a">领域</div>
|
||||||
<div class="b">专家数量</div>
|
<div class="b">专家数量</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="Object.keys(getIndustry(snapTree)).length > 0"
|
v-if="Object.keys(industryTree).length > 0"
|
||||||
v-for="(v, k) in getIndustry(snapTree)"
|
v-for="(v, k) in industryTree"
|
||||||
>
|
>
|
||||||
<div class="a" :title="k">{{ k }}</div>
|
<div class="a" :title="k">{{ k }}</div>
|
||||||
<div class="b">{{ v }}</div>
|
<div class="b">{{ v ?? 0 }}</div>
|
||||||
</div>
|
</div>
|
||||||
<div v-else>
|
<div v-else>
|
||||||
<div class="a">暂无</div>
|
<div class="a">暂无</div>
|
||||||
<div class="b">暂无</div>
|
<div class="b">暂无</div>
|
||||||
</div>
|
</div>
|
||||||
</div> -->
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -50,13 +50,14 @@ import {
|
|||||||
// return;
|
// return;
|
||||||
// console.log(echarts);
|
// console.log(echarts);
|
||||||
import * as echarts from "echarts";
|
import * as echarts from "echarts";
|
||||||
import { ElMessage } from "element-plus";
|
// import { ElMessage } from "element-plus";
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
const loading = shallowRef(true);
|
const loading = shallowRef(true);
|
||||||
|
|
||||||
let treeData = [];
|
let treeData = {};
|
||||||
const snapTree = shallowRef({});
|
const snapTree = shallowRef({});
|
||||||
|
const industryTree = shallowRef({});
|
||||||
|
|
||||||
const searchRegionData = async (code, level) => {
|
const searchRegionData = async (code, level) => {
|
||||||
if (level == "province") {
|
if (level == "province") {
|
||||||
@ -71,8 +72,9 @@ const searchRegionData = async (code, level) => {
|
|||||||
data = snapTree.value;
|
data = snapTree.value;
|
||||||
} else {
|
} else {
|
||||||
const resp = await countExpertByCity(provcode);
|
const resp = await countExpertByCity(provcode);
|
||||||
snapTree.value = resp.data;
|
snapTree.value = resp.count;
|
||||||
data = resp.data;
|
industryTree.value = resp.industry ?? {};
|
||||||
|
data = resp.count;
|
||||||
}
|
}
|
||||||
return data.find((item) => item.code == code) || false;
|
return data.find((item) => item.code == code) || false;
|
||||||
} else if (level == "city") {
|
} else if (level == "city") {
|
||||||
@ -86,16 +88,20 @@ const searchRegionData = async (code, level) => {
|
|||||||
data = snapTree.value;
|
data = snapTree.value;
|
||||||
} else {
|
} else {
|
||||||
const resp = await countExpertByArea(ctcode);
|
const resp = await countExpertByArea(ctcode);
|
||||||
snapTree.value = resp.data;
|
snapTree.value = resp.count;
|
||||||
data = resp.data;
|
industryTree.value = resp.industry ?? {};
|
||||||
|
data = resp.count;
|
||||||
}
|
}
|
||||||
return data.find((item) => item.code == code) || false;
|
return data.find((item) => item.code == code) || false;
|
||||||
} else {
|
} else {
|
||||||
if (treeData.length) {
|
if (Object.keys(treeData).length) {
|
||||||
return treeData.find((item) => item.code == code) || false;
|
industryTree.value = treeData.industry ?? {};
|
||||||
|
snapTree.value = treeData.count ?? {};
|
||||||
|
return treeData.count.find((item) => item.code == code) || false;
|
||||||
} else {
|
} else {
|
||||||
const { data } = await countExpertByProvince();
|
const { count, industry } = await countExpertByProvince();
|
||||||
return data.find((item) => item.code == code) || false;
|
industryTree.value = industry ?? {};
|
||||||
|
return count.find((item) => item.code == code) || false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -123,33 +129,35 @@ function deepFindTree(code, tree) {
|
|||||||
return snap;
|
return snap;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getIndustry(object) {
|
const getIndustry = () => {};
|
||||||
let snap = {};
|
|
||||||
for (const key in object) {
|
|
||||||
if (Object.hasOwnProperty.call(object, key)) {
|
|
||||||
const element = object[key];
|
|
||||||
if (element["industry"] != null) {
|
|
||||||
for (const ek in element["industry"]) {
|
|
||||||
if (Object.hasOwnProperty.call(element["industry"], ek)) {
|
|
||||||
const ele = element["industry"][ek];
|
|
||||||
if (!Object.hasOwnProperty.call(snap, ek)) {
|
|
||||||
snap[ek] = 0;
|
|
||||||
}
|
|
||||||
snap[ek] += ele;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// for (let index = 0; index < element['industry'].length; index++) {
|
|
||||||
// const ele = element['industry'][index];
|
|
||||||
// if(Object.hasOwnProperty.call(snap, ele)) {
|
|
||||||
|
|
||||||
// }
|
// function getIndustry(object) {
|
||||||
|
// let snap = {};
|
||||||
|
// for (const key in object) {
|
||||||
|
// if (Object.hasOwnProperty.call(object, key)) {
|
||||||
|
// const element = object[key];
|
||||||
|
// if (element["industry"] != null) {
|
||||||
|
// for (const ek in element["industry"]) {
|
||||||
|
// if (Object.hasOwnProperty.call(element["industry"], ek)) {
|
||||||
|
// const ele = element["industry"][ek];
|
||||||
|
// if (!Object.hasOwnProperty.call(snap, ek)) {
|
||||||
|
// snap[ek] = 0;
|
||||||
|
// }
|
||||||
|
// snap[ek] += ele;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// // for (let index = 0; index < element['industry'].length; index++) {
|
||||||
|
// // const ele = element['industry'][index];
|
||||||
|
// // if(Object.hasOwnProperty.call(snap, ele)) {
|
||||||
|
|
||||||
// }
|
// // }
|
||||||
}
|
|
||||||
}
|
// // }
|
||||||
}
|
// }
|
||||||
return snap;
|
// }
|
||||||
}
|
// }
|
||||||
|
// return snap;
|
||||||
|
// }
|
||||||
|
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
loading: false,
|
loading: false,
|
||||||
@ -190,8 +198,9 @@ onMounted(() => {
|
|||||||
// 数据接口
|
// 数据接口
|
||||||
countExpertByProvince().then((resp) => {
|
countExpertByProvince().then((resp) => {
|
||||||
// const data = formatData(resp.data);
|
// const data = formatData(resp.data);
|
||||||
treeData = resp.data;
|
treeData = resp;
|
||||||
snapTree.value = resp.data;
|
snapTree.value = resp.count;
|
||||||
|
industryTree.value = resp.industry ?? {};
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -228,7 +237,7 @@ function goBack() {
|
|||||||
state.district.search("中国", async (status, result) => {
|
state.district.search("中国", async (status, result) => {
|
||||||
if (status == "complete") {
|
if (status == "complete") {
|
||||||
await getData(result.districtList[0], "", 100000);
|
await getData(result.districtList[0], "", 100000);
|
||||||
snapTree.value = formatData(treeData);
|
snapTree.value = formatData(treeData.count);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -243,7 +252,8 @@ async function echartsMapClick(params) {
|
|||||||
}
|
}
|
||||||
if (params.data.level == "street") return; //此处的params.data为state.mapData里的数据
|
if (params.data.level == "street") return; //此处的params.data为state.mapData里的数据
|
||||||
console.log(params.data.level, params.data.cityCode);
|
console.log(params.data.level, params.data.cityCode);
|
||||||
let snap = await searchRegionData(params.data.cityCode, params.data.level);
|
// let snap =
|
||||||
|
await searchRegionData(params.data.cityCode, params.data.level);
|
||||||
// snapTree.value = {};
|
// snapTree.value = {};
|
||||||
// console.log(snap, "-----------****---------");
|
// console.log(snap, "-----------****---------");
|
||||||
// ElMessage.success(snap);
|
// ElMessage.success(snap);
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="box3" v-loading="loading">
|
<div class="box3" v-loading="loading">
|
||||||
<div class="tit">专利与成果分布地图</div>
|
<div class="tit">技术分布地图</div>
|
||||||
<div v-if="state.isShowGoBack" class="close-back" @click="goBack">
|
<div v-if="state.isShowGoBack" class="close-back" @click="goBack">
|
||||||
<img src="./img/back_button.png" />
|
<img src="./img/back_button.png" />
|
||||||
</div>
|
</div>
|
||||||
@ -20,14 +20,14 @@
|
|||||||
<div class="b">暂无</div>
|
<div class="b">暂无</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- <div class="rightBox">
|
<div class="rightBox">
|
||||||
<div class="head">
|
<div class="head">
|
||||||
<div class="a">领域</div>
|
<div class="a">领域</div>
|
||||||
<div class="b">成果数量</div>
|
<div class="b">成果数量</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="Object.keys(getIndustry(snapTree)).length > 0"
|
v-if="Object.keys(industryTree).length > 0"
|
||||||
v-for="(v, k) in getIndustry(snapTree)"
|
v-for="(v, k) in industryTree"
|
||||||
>
|
>
|
||||||
<div class="a" :title="k">{{ k }}</div>
|
<div class="a" :title="k">{{ k }}</div>
|
||||||
<div class="b">{{ v }}</div>
|
<div class="b">{{ v }}</div>
|
||||||
@ -36,7 +36,7 @@
|
|||||||
<div class="a">暂无</div>
|
<div class="a">暂无</div>
|
||||||
<div class="b">暂无</div>
|
<div class="b">暂无</div>
|
||||||
</div>
|
</div>
|
||||||
</div> -->
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -52,8 +52,9 @@ import * as echarts from "echarts";
|
|||||||
|
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
const loading = shallowRef(true);
|
const loading = shallowRef(true);
|
||||||
let treeData = [];
|
let treeData = {};
|
||||||
const snapTree = shallowRef([]);
|
const snapTree = shallowRef({});
|
||||||
|
const industryTree = shallowRef({});
|
||||||
|
|
||||||
const searchRegionData = async (code, level) => {
|
const searchRegionData = async (code, level) => {
|
||||||
if (level == "province") {
|
if (level == "province") {
|
||||||
@ -68,8 +69,9 @@ const searchRegionData = async (code, level) => {
|
|||||||
data = snapTree.value;
|
data = snapTree.value;
|
||||||
} else {
|
} else {
|
||||||
const resp = await countAchievementByCity(provcode);
|
const resp = await countAchievementByCity(provcode);
|
||||||
snapTree.value = resp.data;
|
snapTree.value = resp.count;
|
||||||
data = resp.data;
|
industryTree.value = resp.industry ?? {};
|
||||||
|
data = resp.count;
|
||||||
}
|
}
|
||||||
return data.find((item) => item.code == code) || false;
|
return data.find((item) => item.code == code) || false;
|
||||||
} else if (level == "city") {
|
} else if (level == "city") {
|
||||||
@ -83,16 +85,20 @@ const searchRegionData = async (code, level) => {
|
|||||||
data = snapTree.value;
|
data = snapTree.value;
|
||||||
} else {
|
} else {
|
||||||
const resp = await countAchievementByArea(ctcode);
|
const resp = await countAchievementByArea(ctcode);
|
||||||
snapTree.value = resp.data;
|
snapTree.value = resp.count;
|
||||||
data = resp.data;
|
industryTree.value = resp.industry ?? {};
|
||||||
|
data = resp.count;
|
||||||
}
|
}
|
||||||
return data.find((item) => item.code == code) || false;
|
return data.find((item) => item.code == code) || false;
|
||||||
} else {
|
} else {
|
||||||
if (treeData.length) {
|
if (Object.keys(treeData).length) {
|
||||||
return treeData.find((item) => item.code == code) || false;
|
industryTree.value = treeData.industry ?? {};
|
||||||
|
snapTree.value = treeData.count ?? {};
|
||||||
|
return treeData.count.find((item) => item.code == code) || false;
|
||||||
} else {
|
} else {
|
||||||
const { data } = await countAchievementByProvince();
|
const { count, industry } = await countAchievementByProvince();
|
||||||
return data.find((item) => item.code == code) || false;
|
industryTree.value = industry ?? {};
|
||||||
|
return count.find((item) => item.code == code) || false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -174,10 +180,11 @@ const state = reactive({
|
|||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// 数据接口
|
// 数据接口
|
||||||
const res = [];
|
// const res = [];
|
||||||
countAchievementByProvince().then((resp) => {
|
countAchievementByProvince().then((resp) => {
|
||||||
treeData = resp.data;
|
treeData = resp;
|
||||||
snapTree.value = resp.data;
|
snapTree.value = resp.count;
|
||||||
|
industryTree.value = resp.industry ?? {};
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -214,7 +221,8 @@ function goBack() {
|
|||||||
state.district.search("中国", async (status, result) => {
|
state.district.search("中国", async (status, result) => {
|
||||||
if (status == "complete") {
|
if (status == "complete") {
|
||||||
await getData(result.districtList[0], "", 100000);
|
await getData(result.districtList[0], "", 100000);
|
||||||
snapTree.value = treeData;
|
// snapTree.value = treeData.count;
|
||||||
|
snapTree.value = treeData.count;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -20,14 +20,14 @@
|
|||||||
<div class="b">暂无</div>
|
<div class="b">暂无</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- <div class="rightBox">
|
<div class="rightBox">
|
||||||
<div class="head">
|
<div class="head">
|
||||||
<div class="a">领域</div>
|
<div class="a">领域</div>
|
||||||
<div class="b">需求数量</div>
|
<div class="b">需求数量</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="Object.keys(getIndustry(snapTree)).length > 0"
|
v-if="Object.keys(industryTree).length > 0"
|
||||||
v-for="(v, k) in getIndustry(snapTree)"
|
v-for="(v, k) in industryTree"
|
||||||
>
|
>
|
||||||
<div class="a" :title="k">{{ k }}</div>
|
<div class="a" :title="k">{{ k }}</div>
|
||||||
<div class="b">{{ v }}</div>
|
<div class="b">{{ v }}</div>
|
||||||
@ -36,7 +36,7 @@
|
|||||||
<div class="a">暂无</div>
|
<div class="a">暂无</div>
|
||||||
<div class="b">暂无</div>
|
<div class="b">暂无</div>
|
||||||
</div>
|
</div>
|
||||||
</div> -->
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -52,8 +52,10 @@ import {
|
|||||||
|
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
const loading = shallowRef(true);
|
const loading = shallowRef(true);
|
||||||
let treeData = [];
|
|
||||||
const snapTree = shallowRef([]);
|
let treeData = {};
|
||||||
|
const snapTree = shallowRef({});
|
||||||
|
const industryTree = shallowRef({});
|
||||||
|
|
||||||
const searchRegionData = async (code, level) => {
|
const searchRegionData = async (code, level) => {
|
||||||
if (level == "province") {
|
if (level == "province") {
|
||||||
@ -67,8 +69,9 @@ const searchRegionData = async (code, level) => {
|
|||||||
data = snapTree.value;
|
data = snapTree.value;
|
||||||
} else {
|
} else {
|
||||||
const resp = await countDemandByCity(provcode);
|
const resp = await countDemandByCity(provcode);
|
||||||
snapTree.value = resp.data;
|
snapTree.value = resp.count;
|
||||||
data = resp.data;
|
industryTree.value = resp.industry ?? {};
|
||||||
|
data = resp.count;
|
||||||
}
|
}
|
||||||
return data.find((item) => item.code == code) || false;
|
return data.find((item) => item.code == code) || false;
|
||||||
} else if (level == "city") {
|
} else if (level == "city") {
|
||||||
@ -82,16 +85,20 @@ const searchRegionData = async (code, level) => {
|
|||||||
data = snapTree.value;
|
data = snapTree.value;
|
||||||
} else {
|
} else {
|
||||||
const resp = await countDemandByArea(ctcode);
|
const resp = await countDemandByArea(ctcode);
|
||||||
snapTree.value = resp.data;
|
snapTree.value = resp.count;
|
||||||
data = resp.data;
|
industryTree.value = resp.industry ?? {};
|
||||||
|
data = resp.count;
|
||||||
}
|
}
|
||||||
return data.find((item) => item.code == code) || false;
|
return data.find((item) => item.code == code) || false;
|
||||||
} else {
|
} else {
|
||||||
if (treeData.length) {
|
if (Object.keys(treeData).length) {
|
||||||
return treeData.find((item) => item.code == code) || false;
|
industryTree.value = treeData.industry ?? {};
|
||||||
|
snapTree.value = treeData.count ?? {};
|
||||||
|
return treeData.count.find((item) => item.code == code) || false;
|
||||||
} else {
|
} else {
|
||||||
const { data } = await countDemandByProvince();
|
const { count, industry } = await countDemandByProvince();
|
||||||
return data.find((item) => item.code == code) || false;
|
industryTree.value = industry ?? {};
|
||||||
|
return count.find((item) => item.code == code) || false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -173,10 +180,10 @@ const state = reactive({
|
|||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
// 数据接口
|
// 数据接口
|
||||||
const res = { code: 200, message: "ok", data: {} };
|
countDemandByProvince().then((resp) => {
|
||||||
countDemandByProvince().then((res) => {
|
treeData = resp;
|
||||||
treeData = res.data;
|
snapTree.value = resp.count;
|
||||||
snapTree.value = res.data;
|
industryTree.value = resp.industry ?? {};
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
});
|
});
|
||||||
// let echartsDomList = document.querySelectorAll('.echartsDom');
|
// let echartsDomList = document.querySelectorAll('.echartsDom');
|
||||||
@ -223,7 +230,7 @@ function goBack() {
|
|||||||
state.district.search("中国", async (status, result) => {
|
state.district.search("中国", async (status, result) => {
|
||||||
if (status == "complete") {
|
if (status == "complete") {
|
||||||
await getData(result.districtList[0], "", 100000);
|
await getData(result.districtList[0], "", 100000);
|
||||||
snapTree.value = treeData;
|
snapTree.value = treeData.count;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -20,14 +20,14 @@
|
|||||||
<div class="b">暂无</div>
|
<div class="b">暂无</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<!-- <div class="rightBox">
|
<div class="rightBox">
|
||||||
<div class="head">
|
<div class="head">
|
||||||
<div class="a">领域</div>
|
<div class="a">领域</div>
|
||||||
<div class="b">企业数量</div>
|
<div class="b">企业数量</div>
|
||||||
</div>
|
</div>
|
||||||
<div
|
<div
|
||||||
v-if="Object.keys(getIndustry(snapTree)).length > 0"
|
v-if="Object.keys(industryTree).length > 0"
|
||||||
v-for="(v, k) in getIndustry(snapTree)"
|
v-for="(v, k) in industryTree"
|
||||||
>
|
>
|
||||||
<div class="a" :title="k">{{ k }}</div>
|
<div class="a" :title="k">{{ k }}</div>
|
||||||
<div class="b">{{ v }}</div>
|
<div class="b">{{ v }}</div>
|
||||||
@ -36,7 +36,7 @@
|
|||||||
<div class="a">暂无</div>
|
<div class="a">暂无</div>
|
||||||
<div class="b">暂无</div>
|
<div class="b">暂无</div>
|
||||||
</div>
|
</div>
|
||||||
</div> -->
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
@ -52,8 +52,9 @@ import {
|
|||||||
|
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
const loading = shallowRef(true);
|
const loading = shallowRef(true);
|
||||||
let treeData = [];
|
let treeData = {};
|
||||||
const snapTree = shallowRef([]);
|
const snapTree = shallowRef({});
|
||||||
|
const industryTree = shallowRef({});
|
||||||
|
|
||||||
const searchRegionData = async (code, level) => {
|
const searchRegionData = async (code, level) => {
|
||||||
if (level == "province") {
|
if (level == "province") {
|
||||||
@ -68,8 +69,9 @@ const searchRegionData = async (code, level) => {
|
|||||||
data = snapTree.value;
|
data = snapTree.value;
|
||||||
} else {
|
} else {
|
||||||
const resp = await countEnterpriseByCity(provcode);
|
const resp = await countEnterpriseByCity(provcode);
|
||||||
snapTree.value = resp.data;
|
snapTree.value = resp.count;
|
||||||
data = resp.data;
|
industryTree.value = resp.industry ?? {};
|
||||||
|
data = resp.count;
|
||||||
}
|
}
|
||||||
return data.find((item) => item.code == code) || false;
|
return data.find((item) => item.code == code) || false;
|
||||||
} else if (level == "city") {
|
} else if (level == "city") {
|
||||||
@ -83,16 +85,20 @@ const searchRegionData = async (code, level) => {
|
|||||||
data = snapTree.value;
|
data = snapTree.value;
|
||||||
} else {
|
} else {
|
||||||
const resp = await countEnterpriseByArea(ctcode);
|
const resp = await countEnterpriseByArea(ctcode);
|
||||||
snapTree.value = resp.data;
|
snapTree.value = resp.count;
|
||||||
data = resp.data;
|
industryTree.value = resp.industry ?? {};
|
||||||
|
data = resp.count;
|
||||||
}
|
}
|
||||||
return data.find((item) => item.code == code) || false;
|
return data.find((item) => item.code == code) || false;
|
||||||
} else {
|
} else {
|
||||||
if (treeData.length) {
|
if (Object.keys(treeData).length) {
|
||||||
return treeData.find((item) => item.code == code) || false;
|
industryTree.value = treeData.industry ?? {};
|
||||||
|
snapTree.value = treeData.count ?? {};
|
||||||
|
return treeData.count.find((item) => item.code == code) || false;
|
||||||
} else {
|
} else {
|
||||||
const { data } = await countEnterpriseByProvince();
|
const { count, industry } = await countEnterpriseByProvince();
|
||||||
return data.find((item) => item.code == code) || false;
|
industryTree.value = industry ?? {};
|
||||||
|
return count.find((item) => item.code == code) || false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@ -177,8 +183,9 @@ onMounted(() => {
|
|||||||
|
|
||||||
countEnterpriseByProvince().then((resp) => {
|
countEnterpriseByProvince().then((resp) => {
|
||||||
// if (200 == res.code) {
|
// if (200 == res.code) {
|
||||||
treeData = resp.data;
|
treeData = resp;
|
||||||
snapTree.value = resp.data;
|
snapTree.value = resp.count;
|
||||||
|
industryTree.value = resp.industry ?? {};
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
// }
|
// }
|
||||||
});
|
});
|
||||||
@ -226,7 +233,7 @@ function goBack() {
|
|||||||
state.district.search("中国", async (status, result) => {
|
state.district.search("中国", async (status, result) => {
|
||||||
if (status == "complete") {
|
if (status == "complete") {
|
||||||
await getData(result.districtList[0], "", 100000);
|
await getData(result.districtList[0], "", 100000);
|
||||||
snapTree.value = treeData;
|
snapTree.value = treeData.count;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,50 @@
|
|||||||
<div class="pointTit">成果简介</div>
|
<div class="pointTit">成果简介</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="html" v-html="state.expertDetail.description"></div>
|
<div class="html" v-html="state.expertDetail.description"></div>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">成果领先性</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
<div>
|
||||||
|
{{
|
||||||
|
leadOptions.find(
|
||||||
|
(el) => el.key == state.expertDetail.leadStandard
|
||||||
|
)?.value
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">合作模式</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
<div>
|
||||||
|
{{
|
||||||
|
cooperationOptions.find(
|
||||||
|
(el) => el.key == state.expertDetail.cooperationMode
|
||||||
|
)?.value
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">应用客户</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
<div>
|
||||||
|
{{ state.expertDetail.customer }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">所在地</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
{{ state.localtion }}
|
||||||
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">所属单位</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
{{ state.expertDetail.unit }}
|
||||||
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="r">
|
<div class="r">
|
||||||
@ -55,14 +99,18 @@ import loadMore from "./components/loadMore.vue";
|
|||||||
import request from "@/utils/request";
|
import request from "@/utils/request";
|
||||||
// import { onMounted } 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 { searchAchievementDetail } from "../../../api/website/home";
|
import { searchAchievementDetail } from "@/api/website/home";
|
||||||
import { useRoute, useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
import { reactive, ref } from "vue";
|
import { reactive, ref } from "vue";
|
||||||
import docking from "./components/docking.vue";
|
import docking from "./components/docking.vue";
|
||||||
|
import { getCity } from "@/utils/city";
|
||||||
|
import { leadOptions, cooperationOptions } from "@/utils/parameter";
|
||||||
const showDocking = ref(false);
|
const showDocking = ref(false);
|
||||||
const loading = ref(true);
|
const loading = ref(true);
|
||||||
|
// import {lead}
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
pageSize: 4,
|
pageSize: 4,
|
||||||
@ -152,10 +200,15 @@ function getDataList() {
|
|||||||
if (!id) return;
|
if (!id) return;
|
||||||
searchAchievementDetail(id)
|
searchAchievementDetail(id)
|
||||||
// achievementDetail(id)
|
// achievementDetail(id)
|
||||||
.then((res) => {
|
.then(async (resp) => {
|
||||||
// if (200 == res.code) {
|
// if (200 == res.code) {
|
||||||
console.log(res.data);
|
console.log(resp.data);
|
||||||
state.expertDetail = res.data;
|
state.expertDetail = resp.data;
|
||||||
|
state.localtion = await getCity(
|
||||||
|
resp.data.province,
|
||||||
|
resp.data.city,
|
||||||
|
resp.data.district
|
||||||
|
);
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
// }
|
// }
|
||||||
});
|
});
|
||||||
|
@ -1,141 +1,178 @@
|
|||||||
<!-- to do 实验室后台模块未开发 2022/02/17 -->
|
<!-- to do 实验室后台模块未开发 2022/02/17 -->
|
||||||
<template>
|
<template>
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<div class="wrap">
|
<div class="wrap">
|
||||||
<div class="img">
|
<div class="type">实验室</div>
|
||||||
<!-- <img :src="data.image" alt /> -->
|
<div class="content">
|
||||||
<img src="https://t7.baidu.com/it/u=1951548898,3927145&fm=193&f=GIF" />
|
<div class="tit" @click="handleDetail(data.id)">{{ data.name }}</div>
|
||||||
</div>
|
<slot name="des" />
|
||||||
<div class="content">
|
|
||||||
<div class="tit" @click="handleDetail(data.id)">{{ data.title }}</div>
|
|
||||||
<slot name="des" />
|
|
||||||
|
|
||||||
<div v-if="data.industrys" class="line">
|
<div v-if="data.industryStr" class="line">
|
||||||
所属领域:
|
所属领域:
|
||||||
<span>{{ data.industrys[data.industrys.length - 1] }}</span>
|
<span>{{ data.industryStr }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="line">
|
<div class="line">
|
||||||
依托管理部门:
|
网址:
|
||||||
<span>{{ data.mode_title }}</span>
|
<span>{{ data.url }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="line">
|
<div class="line">
|
||||||
|
所属院所或高校:
|
||||||
|
<span>{{ data.school }}</span>
|
||||||
|
</div>
|
||||||
|
<!-- <div class="line">
|
||||||
合作模式:
|
合作模式:
|
||||||
<span>{{ data.mode_title }}</span>
|
<span>{{ data.mode_title }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="line">
|
<div class="line">
|
||||||
技术成熟度:
|
技术成熟度:
|
||||||
<span>{{ data.maturity_title }}</span>
|
<span>{{ data.maturity_title }}</span>
|
||||||
</div>
|
</div> -->
|
||||||
</div>
|
</div>
|
||||||
<div>
|
<div>
|
||||||
<div class="keywords">
|
<div class="keywords">
|
||||||
<wordcloud v-if="data.keywords" :data="createdData(data.customers)"></wordcloud>
|
<wordcloud
|
||||||
</div>
|
v-if="data.keyword"
|
||||||
<collectAndVisit :is_collect="data.is_collect" :collect_count="data.collect_count" :visit_count="data.visit_count" :object_id="data.id" :kind="1005"/>
|
:data="createdData(data.keyword)"
|
||||||
</div>
|
></wordcloud>
|
||||||
</div>
|
</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>
|
||||||
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import wordcloud from './wordcloud.vue'
|
import wordcloud from "./wordcloud.vue";
|
||||||
import collectAndVisit from './collectAndVisit.vue'
|
import collectAndVisit from "./collectAndVisit.vue";
|
||||||
|
import { useRoute, useRouter } from "vue-router";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
const route = useRoute();
|
||||||
const props = defineProps({
|
const props = defineProps({
|
||||||
data: {
|
data: {
|
||||||
type: Object,
|
type: Object,
|
||||||
required: true,
|
required: true,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
function handleDetail (id) {
|
function handleDetail(id) {
|
||||||
let routeData = router.resolve({ path: `/searchList/1/detail/${id}` });
|
let routeData = router.resolve({
|
||||||
window.open(routeData.href, '_blank');
|
path: `/searchList/lab/detail/${id}`,
|
||||||
|
query: {
|
||||||
|
keyword: route.query.keyword,
|
||||||
|
queryType: route.query.queryType,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
// window.open(routeData.href, "_blank");
|
||||||
|
router.push(routeData);
|
||||||
}
|
}
|
||||||
|
|
||||||
function createdData (arr) {
|
function createdData(arr) {
|
||||||
let l = [];
|
let l = [];
|
||||||
let snap = JSON.parse(JSON.stringify(arr))
|
arr = arr ? arr.split(",") : [];
|
||||||
snap.map(e => {
|
let snap = JSON.parse(JSON.stringify(arr));
|
||||||
l.push({ name: e, value: 30 })
|
snap.map((e) => {
|
||||||
return { name: e, value: 30 }
|
l.push({ name: e, value: 30 });
|
||||||
})
|
return { name: e, value: 30 };
|
||||||
return l;
|
});
|
||||||
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
<style lang="scss" scoped>
|
||||||
.box {
|
.box {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
// height: 190px;
|
// height: 190px;
|
||||||
background: #ffffff;
|
background: #ffffff;
|
||||||
padding: 20px;
|
padding: 20px;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
.wrap {
|
.wrap {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-direction: row;
|
||||||
.img {
|
.type {
|
||||||
width: 200px;
|
width: 200px;
|
||||||
height: 150px;
|
height: 150px;
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
img {
|
background-color: #417bff;
|
||||||
display: block;
|
color: white;
|
||||||
margin: 0;
|
font-size: 36px;
|
||||||
width: 100%;
|
font-weight: bold;
|
||||||
height: 100%;
|
display: flex;
|
||||||
}
|
justify-content: center;
|
||||||
}
|
align-items: center;
|
||||||
.keywords {
|
// img {
|
||||||
width: 129px;
|
// display: block;
|
||||||
height: 129px;
|
// margin: 0;
|
||||||
}
|
// width: 100%;
|
||||||
.content {
|
// height: 100%;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
.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>
|
</style>
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
v-model.trim="state.currentKeyword"
|
v-model.trim="state.currentKeyword"
|
||||||
placeholder="请输入检索词"
|
placeholder="请输入检索词"
|
||||||
>
|
>
|
||||||
<template #suffix>
|
<template #suffix v-if="false">
|
||||||
<el-form-item prop="queryType">
|
<el-form-item prop="queryType">
|
||||||
<el-select
|
<el-select
|
||||||
v-model="state.queryType"
|
v-model="state.queryType"
|
||||||
@ -99,7 +99,10 @@ const queryTypeList = [
|
|||||||
label: "通过成果名称搜索",
|
label: "通过成果名称搜索",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
[],
|
[
|
||||||
|
{ value: "1", label: "通过实验室名称名称搜索" },
|
||||||
|
{ value: "2", label: "通过实验室名称简介搜索" },
|
||||||
|
],
|
||||||
[
|
[
|
||||||
{ value: "1", label: "通过标题搜索" },
|
{ value: "1", label: "通过标题搜索" },
|
||||||
{ value: "2", label: "通过摘要搜索" },
|
{ value: "2", label: "通过摘要搜索" },
|
||||||
@ -112,6 +115,10 @@ const queryTypeList = [
|
|||||||
],
|
],
|
||||||
[{ value: "1", label: "通过标题搜索" }],
|
[{ value: "1", label: "通过标题搜索" }],
|
||||||
[{ value: "1", label: "通过标题搜索" }],
|
[{ value: "1", label: "通过标题搜索" }],
|
||||||
|
[
|
||||||
|
{ value: "1", label: "通过实验室名称搜索" },
|
||||||
|
{ value: "2", label: "通过实验室简介搜索" },
|
||||||
|
],
|
||||||
];
|
];
|
||||||
async function handleQuery() {
|
async function handleQuery() {
|
||||||
// state.queryType = route.query.queryType;
|
// state.queryType = route.query.queryType;
|
||||||
|
@ -79,10 +79,10 @@
|
|||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import WebContact from "@/components/webContact/index.vue";
|
import WebContact from "@/components/webContact/index.vue";
|
||||||
import request from "@/utils/request";
|
// import request from "@/utils/request";
|
||||||
import { enterpriseOptions } from "@/utils/parameter";
|
import { enterpriseOptions } from "@/utils/parameter";
|
||||||
import { search } from "@/api/website/home/index";
|
import { search } from "@/api/website/home/index";
|
||||||
import { onMounted } from "vue";
|
// 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 wordcloud from "./components/wordcloud.vue";
|
import wordcloud from "./components/wordcloud.vue";
|
||||||
@ -92,6 +92,7 @@ const route = useRoute();
|
|||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const searchResults = ref([]);
|
const searchResults = ref([]);
|
||||||
const total = ref(0);
|
const total = ref(0);
|
||||||
|
|
||||||
const queryParams = reactive({
|
const queryParams = reactive({
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
pageSize: 5,
|
pageSize: 5,
|
||||||
|
@ -69,7 +69,6 @@
|
|||||||
</div>
|
</div>
|
||||||
</el-row>
|
</el-row>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="product">
|
<div class="product">
|
||||||
<div style="padding: 20px 0">
|
<div style="padding: 20px 0">
|
||||||
<div class="pointTit">企业简介</div>
|
<div class="pointTit">企业简介</div>
|
||||||
@ -87,6 +86,25 @@
|
|||||||
{{ item }}
|
{{ item }}
|
||||||
</div>
|
</div>
|
||||||
</section> -->
|
</section> -->
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">联系人</div>
|
||||||
|
</div>
|
||||||
|
<section v-if="state.companyDetail.username">
|
||||||
|
{{ state.companyDetail.username }}
|
||||||
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">联系方式</div>
|
||||||
|
</div>
|
||||||
|
<section v-if="state.companyDetail.phone">
|
||||||
|
{{ state.companyDetail.phone }}
|
||||||
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">邮箱</div>
|
||||||
|
</div>
|
||||||
|
<section v-if="state.companyDetail.email">
|
||||||
|
{{ state.companyDetail.email }}
|
||||||
|
</section>
|
||||||
|
|
||||||
<div style="padding: 20px 0">
|
<div style="padding: 20px 0">
|
||||||
<div class="pointTit">所属领域</div>
|
<div class="pointTit">所属领域</div>
|
||||||
</div>
|
</div>
|
||||||
@ -103,8 +121,8 @@
|
|||||||
<div style="padding: 20px 0">
|
<div style="padding: 20px 0">
|
||||||
<div class="pointTit">所在地</div>
|
<div class="pointTit">所在地</div>
|
||||||
</div>
|
</div>
|
||||||
<section v-if="state.companyDetail.address">
|
<section>
|
||||||
{{ state.companyDetail.address }}
|
{{ state.localtion }}
|
||||||
</section>
|
</section>
|
||||||
<div style="padding: 20px 0">
|
<div style="padding: 20px 0">
|
||||||
<div class="pointTit">详细地址</div>
|
<div class="pointTit">详细地址</div>
|
||||||
@ -192,15 +210,16 @@
|
|||||||
<script setup>
|
<script setup>
|
||||||
import docking from "./components/docking.vue";
|
import docking from "./components/docking.vue";
|
||||||
import webContact from "@/components/webContact/index.vue";
|
import webContact from "@/components/webContact/index.vue";
|
||||||
import request from "@/utils/request";
|
// import request from "@/utils/request";
|
||||||
import { searchEnterpriseDetail } from "@/api/website/home";
|
import { searchEnterpriseDetail } from "@/api/website/home";
|
||||||
import { enterpriseOptions } from "@/utils/parameter";
|
import { enterpriseOptions } from "@/utils/parameter";
|
||||||
import { onMounted, reactive, ref } from "vue";
|
// import { onMounted, reactive, ref } 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";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
import { search } from "../../../api/website/home";
|
import { search } from "../../../api/website/home";
|
||||||
|
import { getCity } from "../../../utils/city";
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
const route = useRoute();
|
const route = useRoute();
|
||||||
const loading = ref(true);
|
const loading = ref(true);
|
||||||
@ -212,6 +231,9 @@ const state = reactive({
|
|||||||
val: 3,
|
val: 3,
|
||||||
companyDetail: {},
|
companyDetail: {},
|
||||||
companyProduct: [],
|
companyProduct: [],
|
||||||
|
// 获取所在地
|
||||||
|
localtion: "",
|
||||||
|
// const location = ref("");
|
||||||
arr: [
|
arr: [
|
||||||
{
|
{
|
||||||
name: "Cat",
|
name: "Cat",
|
||||||
@ -224,36 +246,6 @@ const state = reactive({
|
|||||||
],
|
],
|
||||||
});
|
});
|
||||||
|
|
||||||
// 建议 列表前4条
|
|
||||||
function recommend() {
|
|
||||||
return request({
|
|
||||||
url: "/v1/search",
|
|
||||||
method: "post",
|
|
||||||
data: {
|
|
||||||
mode: 1,
|
|
||||||
pageNum: state.pageNum,
|
|
||||||
pageSize: state.pageSize,
|
|
||||||
keyword: state.keyword,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// 公司详情
|
|
||||||
function company(id) {
|
|
||||||
return request({
|
|
||||||
url: "/v1/manage/company",
|
|
||||||
method: "post",
|
|
||||||
data: { company_id: id },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function companyProduct(id) {
|
|
||||||
return request({
|
|
||||||
url: "/v1/manage/company/product",
|
|
||||||
method: "post",
|
|
||||||
data: { company_id: id, page_num: 1, page_size: 10 },
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function createdData(arr) {
|
function createdData(arr) {
|
||||||
let l = [];
|
let l = [];
|
||||||
let snap = JSON.parse(JSON.stringify(arr));
|
let snap = JSON.parse(JSON.stringify(arr));
|
||||||
@ -305,8 +297,13 @@ function getDataList() {
|
|||||||
let id = route.params.id;
|
let id = route.params.id;
|
||||||
if (!id) return;
|
if (!id) return;
|
||||||
searchEnterpriseDetail(id)
|
searchEnterpriseDetail(id)
|
||||||
.then((resp) => {
|
.then(async (resp) => {
|
||||||
state.companyDetail = resp.data;
|
state.companyDetail = resp.data;
|
||||||
|
state.localtion = await getCity(
|
||||||
|
resp.data.province,
|
||||||
|
resp.data.city,
|
||||||
|
resp.data.district
|
||||||
|
);
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
|
@ -29,6 +29,68 @@
|
|||||||
<div class="pointTit">个人简介</div>
|
<div class="pointTit">个人简介</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="html" v-html="state.expertDetail.introduce"></div>
|
<div class="html" v-html="state.expertDetail.introduce"></div>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">性别</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
<div>
|
||||||
|
{{
|
||||||
|
state.expertDetail.gender == "1"
|
||||||
|
? "男"
|
||||||
|
: state.expertDetail.gender == "2"
|
||||||
|
? "女"
|
||||||
|
: "未知"
|
||||||
|
}}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">手机号</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
<div>
|
||||||
|
{{ state.expertDetail.mobile }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">主修专业</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
<div>
|
||||||
|
{{ state.expertDetail.major }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">毕业院校</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
<div>
|
||||||
|
{{ state.expertDetail.school }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">职称</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
<div>
|
||||||
|
{{ state.expertDetail.title }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">所属领域</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
<div>
|
||||||
|
{{ state.expertDetail.industryStr }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">最高学历</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
<div>
|
||||||
|
{{ state.expertDetail.education }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
<div style="padding: 20px 0">
|
<div style="padding: 20px 0">
|
||||||
<div class="pointTit">研究方向</div>
|
<div class="pointTit">研究方向</div>
|
||||||
</div>
|
</div>
|
||||||
@ -40,6 +102,14 @@
|
|||||||
{{ item }}
|
{{ item }}
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">从业时间</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
<div>
|
||||||
|
{{ state.expertDetail.workTime }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
<!-- <div style="padding: 20px 0">
|
<!-- <div style="padding: 20px 0">
|
||||||
<div class="pointTit">联系方式</div>
|
<div class="pointTit">联系方式</div>
|
||||||
</div>
|
</div>
|
||||||
|
202
src/views/website/searchList/lab.vue
Normal file
202
src/views/website/searchList/lab.vue
Normal file
@ -0,0 +1,202 @@
|
|||||||
|
<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">
|
||||||
|
<!-- <gainItem :data="item"></gainItem> -->
|
||||||
|
<LaboratoryItem :data="item"></LaboratoryItem>
|
||||||
|
</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>
|
||||||
|
// import request from "@/utils/request";
|
||||||
|
import { onMounted, reactive } from "vue";
|
||||||
|
import { search } from "@/api/website/home/index";
|
||||||
|
import WebContact from "@/components/webContact/index.vue";
|
||||||
|
import searchContainer from "./components/searchContainer.vue";
|
||||||
|
// import industrySelect from "./components/industrySelect.vue";
|
||||||
|
import gainItem from "./components/gainItem.vue";
|
||||||
|
import wordcloud from "./components/wordcloud.vue";
|
||||||
|
import { useRoute, useRouter } from "vue-router";
|
||||||
|
import LaboratoryItem from "./components/laboratoryItem.vue";
|
||||||
|
// const router = useRouter();
|
||||||
|
const route = useRoute();
|
||||||
|
const queryParams = reactive({
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 5,
|
||||||
|
searchType: 8,
|
||||||
|
queryType: route.query.queryType,
|
||||||
|
query: route.query.keyword,
|
||||||
|
});
|
||||||
|
// function handleDetail(id) {
|
||||||
|
// let routeData = router.resolve({
|
||||||
|
// path: `/searchList/0/detail/${id}`,
|
||||||
|
// query: { keyword: queryParams.query },
|
||||||
|
// });
|
||||||
|
// window.open(routeData.href, "_blank");
|
||||||
|
// }
|
||||||
|
|
||||||
|
const loading = ref(false);
|
||||||
|
|
||||||
|
const searchResults = ref([]);
|
||||||
|
const total = ref(0);
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
// const getSearchResult = async () => {
|
||||||
|
// const resp = await search(queryParams);
|
||||||
|
// console.log(resp);
|
||||||
|
// };
|
||||||
|
function handleQuery(state) {
|
||||||
|
// state.keyword = keyword;
|
||||||
|
queryParams.query = state.currentKeyword;
|
||||||
|
queryParams.queryType = state.queryType;
|
||||||
|
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 () => {
|
||||||
|
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>
|
338
src/views/website/searchList/laboratoryDetail.vue
Normal file
338
src/views/website/searchList/laboratoryDetail.vue
Normal file
@ -0,0 +1,338 @@
|
|||||||
|
<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.LabDetail.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.LabDetail.name }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
所属领域:
|
||||||
|
<span>{{ state.LabDetail.industryStr }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
网址:
|
||||||
|
<span>{{ state.LabDetail.url }}</span>
|
||||||
|
</div>
|
||||||
|
<div class="line">
|
||||||
|
所属院所或高校:
|
||||||
|
<!-- <a :href="state.LabDetail.applyName"> -->
|
||||||
|
<span>{{ state.LabDetail.school }}</span>
|
||||||
|
<!-- </a> -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="keywords" style="flex: 1">
|
||||||
|
<wordcloud
|
||||||
|
v-if="state.LabDetail.keyword"
|
||||||
|
:data="createdData(state.LabDetail.keyword.split(','))"
|
||||||
|
></wordcloud>
|
||||||
|
</div>
|
||||||
|
<div class="btns">
|
||||||
|
<div class="order" @click="showDocking = true">预约对接</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.LabDetail.introduction"></div>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">核心成员及简介</div>
|
||||||
|
</div>
|
||||||
|
<div class="html" v-html="state.LabDetail.member"></div>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">研究方向</div>
|
||||||
|
</div>
|
||||||
|
<div>{{ state.LabDetail.researchDirection }}</div>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">主要技术应用场景</div>
|
||||||
|
</div>
|
||||||
|
<div>{{ state.LabDetail.primaryTechnology }}</div>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">承担科研项目情况</div>
|
||||||
|
</div>
|
||||||
|
<div>{{ state.LabDetail.researchProject }}</div>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">代表性科技成果</div>
|
||||||
|
</div>
|
||||||
|
<div>{{ state.LabDetail.achievement }}</div>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">所属行业领域</div>
|
||||||
|
</div>
|
||||||
|
<div>{{ state.LabDetail.industryStr }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="r"><webContact /></div>
|
||||||
|
</el-row>
|
||||||
|
</template>
|
||||||
|
</searchContainer>
|
||||||
|
<docking v-model:visible="showDocking"></docking>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import webContact from "@/components/webContact/index.vue";
|
||||||
|
// import request from "@/utils/request";
|
||||||
|
import { searchLaboratoryDetail } 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";
|
||||||
|
import docking from "./components/docking.vue";
|
||||||
|
const showDocking = ref(false);
|
||||||
|
const router = useRouter();
|
||||||
|
const route = useRoute();
|
||||||
|
const loading = ref(true);
|
||||||
|
const state = reactive({
|
||||||
|
pageNum: 1,
|
||||||
|
pageSize: 4,
|
||||||
|
keyword: "",
|
||||||
|
val: 3,
|
||||||
|
LabDetail: {},
|
||||||
|
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 handleDetail(id) {
|
||||||
|
// let routeData = router.resolve({
|
||||||
|
// path: `/searchList/0/detail/${id}`,
|
||||||
|
// query: { keyword: state.keyword },
|
||||||
|
// });
|
||||||
|
// window.open(routeData.href, "_blank");
|
||||||
|
// }
|
||||||
|
|
||||||
|
function handleList(mode, keyword) {
|
||||||
|
router.push({
|
||||||
|
path: `/searchList/${mode}`,
|
||||||
|
query: { keyword, queryType: route.query.queryType },
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// 首次加载数据,其后跳转页面
|
||||||
|
let flag = true;
|
||||||
|
|
||||||
|
function handleQuery(state) {
|
||||||
|
state.keyword = state.currentKeyword;
|
||||||
|
if (flag) {
|
||||||
|
getDataList();
|
||||||
|
flag = false;
|
||||||
|
} else {
|
||||||
|
handleList("lab", state.currentKeyword);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDataList() {
|
||||||
|
loading.value = true;
|
||||||
|
|
||||||
|
let id = route.params.id;
|
||||||
|
if (!id) return;
|
||||||
|
searchLaboratoryDetail(id)
|
||||||
|
.then((resp) => {
|
||||||
|
state.LabDetail = resp.data;
|
||||||
|
loading.value = false;
|
||||||
|
})
|
||||||
|
.catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
loading.value = false;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
</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>
|
@ -77,6 +77,37 @@
|
|||||||
class="html"
|
class="html"
|
||||||
v-html="state.patentDetail.principalClaim"
|
v-html="state.patentDetail.principalClaim"
|
||||||
></div>
|
></div>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">发明人</div>
|
||||||
|
</div>
|
||||||
|
<div class="html" v-html="state.patentDetail.inventor"></div>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">IPC分类号</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
{{ state.patentDetail.ipcCode }}
|
||||||
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">专利类型</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
{{
|
||||||
|
patentOptions.find((el) => el.key == state.patentDetail.kind)
|
||||||
|
?.value
|
||||||
|
}}
|
||||||
|
</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">公开日</div>
|
||||||
|
</div>
|
||||||
|
<section>{{ state.patentDetail.openAt }}</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">公开号</div>
|
||||||
|
</div>
|
||||||
|
<section>{{ state.patentDetail.openCode }}</section>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">申请人地址</div>
|
||||||
|
</div>
|
||||||
|
<section>{{ state.patentDetail.applyAddress }}</section>
|
||||||
<!-- <section v-if="state.patentDetail.directions">
|
<!-- <section v-if="state.patentDetail.directions">
|
||||||
<div
|
<div
|
||||||
v-for="(item, index) in state.patentDetail.directions"
|
v-for="(item, index) in state.patentDetail.directions"
|
||||||
@ -156,8 +187,10 @@ import { searchPatentDetail } from "@/api/website/home";
|
|||||||
import { onMounted, reactive, ref } from "vue";
|
import { onMounted, reactive, ref } 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 { patentOptions } from "@/utils/parameter";
|
||||||
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 { getCity } from "../../../utils/city";
|
||||||
import docking from "./components/docking.vue";
|
import docking from "./components/docking.vue";
|
||||||
const showDocking = ref(false);
|
const showDocking = ref(false);
|
||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
@ -170,6 +203,7 @@ const state = reactive({
|
|||||||
val: 3,
|
val: 3,
|
||||||
patentDetail: {},
|
patentDetail: {},
|
||||||
companyProduct: [],
|
companyProduct: [],
|
||||||
|
// localtion: "",
|
||||||
arr: [
|
arr: [
|
||||||
{
|
{
|
||||||
name: "Cat",
|
name: "Cat",
|
||||||
@ -265,8 +299,13 @@ function getDataList() {
|
|||||||
let id = route.params.id;
|
let id = route.params.id;
|
||||||
if (!id) return;
|
if (!id) return;
|
||||||
searchPatentDetail(id)
|
searchPatentDetail(id)
|
||||||
.then((resp) => {
|
.then(async (resp) => {
|
||||||
state.patentDetail = resp.data;
|
state.patentDetail = resp.data;
|
||||||
|
// state.localtion = await getCity(
|
||||||
|
// resp.data.province,
|
||||||
|
// resp.data.city,
|
||||||
|
// resp.data.district
|
||||||
|
// );
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="index">
|
<div class="index">
|
||||||
<searchContainer
|
<searchContainer
|
||||||
bannerKey="首页>技术需求库>技术需求列表"
|
bannerKey="首页>需求库>需求列表"
|
||||||
title="技术需求库"
|
title="需求库"
|
||||||
@handleQuery="handleQuery"
|
@handleQuery="handleQuery"
|
||||||
>
|
>
|
||||||
<template v-slot>
|
<template v-slot>
|
||||||
@ -12,7 +12,7 @@
|
|||||||
<!-- <industrySelect @industryChange="industryChange"></industrySelect> -->
|
<!-- <industrySelect @industryChange="industryChange"></industrySelect> -->
|
||||||
<div class="total">
|
<div class="total">
|
||||||
共找到
|
共找到
|
||||||
<span>{{ total }}</span> 个技术需求
|
<span>{{ total }}</span> 个需求
|
||||||
</div>
|
</div>
|
||||||
<div v-loading="loading">
|
<div v-loading="loading">
|
||||||
<section v-for="item in searchResults" :key="item.id">
|
<section v-for="item in searchResults" :key="item.id">
|
||||||
|
@ -1,18 +1,18 @@
|
|||||||
<template>
|
<template>
|
||||||
<div v-loading="loading">
|
<div v-loading="loading">
|
||||||
<searchContainer
|
<searchContainer
|
||||||
bannerKey="首页>技术需求库>技术需求详情"
|
bannerKey="首页>需求库>需求详情"
|
||||||
title="技术需求库"
|
title="需求库"
|
||||||
@handleQuery="handleQuery"
|
@handleQuery="handleQuery"
|
||||||
>
|
>
|
||||||
<template v-slot>
|
<template v-slot>
|
||||||
<div class="head">
|
<div class="head">
|
||||||
<el-breadcrumb separator="/">
|
<el-breadcrumb separator="/">
|
||||||
<el-breadcrumb-item>
|
<el-breadcrumb-item>
|
||||||
<span class="one">接技术需求</span>
|
<span class="one">接需求</span>
|
||||||
</el-breadcrumb-item>
|
</el-breadcrumb-item>
|
||||||
<el-breadcrumb-item>
|
<el-breadcrumb-item>
|
||||||
<span>技术需求详情</span>
|
<span>需求详情</span>
|
||||||
</el-breadcrumb-item>
|
</el-breadcrumb-item>
|
||||||
</el-breadcrumb>
|
</el-breadcrumb>
|
||||||
</div>
|
</div>
|
||||||
@ -20,6 +20,9 @@
|
|||||||
<div style="flex: 1">
|
<div style="flex: 1">
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<el-row type="flex" style="padding: 40px 20px">
|
<el-row type="flex" style="padding: 40px 20px">
|
||||||
|
<!-- <technologyDemandItem
|
||||||
|
:data="state.demandDetail"
|
||||||
|
></technologyDemandItem> -->
|
||||||
<div class="img">
|
<div class="img">
|
||||||
<img :src="state.demandDetail.image" alt />
|
<img :src="state.demandDetail.image" alt />
|
||||||
</div>
|
</div>
|
||||||
@ -41,19 +44,13 @@
|
|||||||
需求类型:
|
需求类型:
|
||||||
<span>{{ state.demandDetail.kind }}</span>
|
<span>{{ state.demandDetail.kind }}</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="line">
|
|
||||||
申请日
|
|
||||||
<span>{{ state.demandDetail.createTime }}</span>
|
|
||||||
</div>
|
|
||||||
<div class="line">
|
<div class="line">
|
||||||
联系人
|
联系人
|
||||||
<!-- <a :href="state.demandDetail.applyName"> -->
|
<span>中科云平台</span>
|
||||||
<span>{{ state.demandDetail.name }}</span>
|
|
||||||
<!-- </a> -->
|
|
||||||
</div>
|
</div>
|
||||||
<div class="line">
|
<div class="line">
|
||||||
联系方式
|
联系方式(微信同号):
|
||||||
<span>{{ state.demandDetail.mobile }}</span>
|
<span>18156053255</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="keywords" style="flex: 1">
|
<div class="keywords" style="flex: 1">
|
||||||
@ -78,6 +75,12 @@
|
|||||||
<div class="pointTit">需求描述</div>
|
<div class="pointTit">需求描述</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="html" v-html="state.demandDetail.introduce"></div>
|
<div class="html" v-html="state.demandDetail.introduce"></div>
|
||||||
|
<div style="padding: 20px 0">
|
||||||
|
<div class="pointTit">所在地</div>
|
||||||
|
</div>
|
||||||
|
<section>
|
||||||
|
{{ state.localtion }}
|
||||||
|
</section>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="r"><webContact /></div>
|
<div class="r"><webContact /></div>
|
||||||
@ -96,6 +99,7 @@ import { onMounted, reactive, ref } 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 { getCity } from "@/utils/city";
|
||||||
import { useRoute, useRouter } from "vue-router";
|
import { useRoute, useRouter } from "vue-router";
|
||||||
import docking from "./components/docking.vue";
|
import docking from "./components/docking.vue";
|
||||||
const showDocking = ref(false);
|
const showDocking = ref(false);
|
||||||
@ -109,6 +113,7 @@ const state = reactive({
|
|||||||
val: 3,
|
val: 3,
|
||||||
demandDetail: {},
|
demandDetail: {},
|
||||||
companyProduct: [],
|
companyProduct: [],
|
||||||
|
localtion: "",
|
||||||
arr: [
|
arr: [
|
||||||
{
|
{
|
||||||
name: "Cat",
|
name: "Cat",
|
||||||
@ -157,8 +162,15 @@ function getDataList() {
|
|||||||
let id = route.params.id;
|
let id = route.params.id;
|
||||||
if (!id) return;
|
if (!id) return;
|
||||||
searchTechnologyDemandDetail(id)
|
searchTechnologyDemandDetail(id)
|
||||||
.then((resp) => {
|
.then(async (resp) => {
|
||||||
state.demandDetail = resp.data;
|
state.demandDetail = resp.data;
|
||||||
|
if (resp.data.province && resp.data.city && resp.data.district) {
|
||||||
|
state.localtion = await getCity(
|
||||||
|
resp.data.province,
|
||||||
|
resp.data.city,
|
||||||
|
resp.data.district
|
||||||
|
);
|
||||||
|
}
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
})
|
})
|
||||||
.catch((err) => {
|
.catch((err) => {
|
||||||
|
Reference in New Issue
Block a user