bug fixed

This commit is contained in:
cxc
2022-11-25 17:30:39 +08:00
parent 28808f6024
commit d4778207c7
38 changed files with 1623 additions and 623 deletions

69
info.ts Normal file
View 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;
}

View File

@ -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,
});
};

View File

@ -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",
});
}

View File

@ -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 () => {

View File

@ -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
View 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}`;
};

View File

@ -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: '优质企业' },

View File

@ -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) => {

View File

@ -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;

View File

@ -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;
// } // }

View File

@ -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;
} }

View File

@ -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

View File

@ -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({

View File

@ -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>

View File

@ -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" />

View File

@ -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
> >

View File

@ -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>

View File

@ -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("校验未通过");
} }

View File

@ -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" },
],
}, },
}); });

View File

@ -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();

View File

@ -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">

View File

@ -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>

View File

@ -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);

View File

@ -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);

View File

@ -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;
} }
}); });
} }

View File

@ -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;
} }
}); });
} }

View File

@ -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;
} }
}); });
} }

View File

@ -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;
// } // }
}); });

View File

@ -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>

View File

@ -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;

View File

@ -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,

View File

@ -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) => {

View File

@ -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>

View 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>

View 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>

View File

@ -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) => {

View File

@ -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">

View File

@ -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) => {