This commit is contained in:
quantulr
2022-10-19 00:22:39 +08:00
parent e2da1fd45b
commit 88e3b00298
44 changed files with 1827 additions and 1324 deletions

BIN
ccw.zip

Binary file not shown.

View File

@ -0,0 +1,60 @@
import request from "@/utils/request";
// 企业服务需求列表
export const demandList = (params) => {
return request({
url: "/app/demandList",
method: "GET",
params,
});
};
// 新增企业服务需求
export const insertDemand = (data) => {
return request({
url: "/app/insertDemand",
method: "post",
data,
});
};
// 企业技术需求列表
export const technologyDemandList = (params) => {
return request({
url: "/app/technologyDemandList",
method: "GET",
params,
});
};
// 新增企业技术需求
export const insertTechnologyDemand = (data) => {
return request({
url: "/app/insertTechnologyDemand",
method: "POST",
data,
});
};
// 企业技术需求详情
export const getTechnologyDemand = (params) => {
return request({
url: `/app/getTechnologyDemand`,
method: "GET",
params,
});
};
// 修改企业技术需求详情
export const updateTechnologyDemand = (data) => {
return request({
url: `/app/updateTechnologyDemand`,
method: "POST",
data,
});
};
// 删除企业技术需求
export const deleteTechnologyDemand = (ids) => {
return request({
url: `/app/technologyDemand/${ids}`,
method: "DELETE",
});
};

View File

@ -0,0 +1,43 @@
import request from "@/utils/request";
// 产品列表
export const getEnterpriseProduct = (params) => {
return request({
url: "/app/getEnterpriseProduct",
method: "GET",
params,
});
};
// 新增产品
export const insertEnterpriseProduct = (data) => {
return request({
url: "/app/insertEnterpriseProduct",
method: "POST",
data,
});
};
// 根据id获取产品信息
export const getProductById = (params) => {
return request({
url: "/app/getProductById",
method: "GET",
params,
});
};
// 修改产品
export const updateEnterpriseProduct = (data) => {
return request({
url: "/app/updateEnterpriseProduct",
method: "POST",
data,
});
};
// 修改产品
export const deleteEnterpriseProduct = (ids) => {
return request({
url: `/app/enterpriseProduct/${ids}`,
method: "DELETE",
});
};

View File

@ -0,0 +1,10 @@
import request from "@/utils/request";
// 专家信息修改
export const updateExpert = (data) => {
return request({
url: "/app/expert/updateExpert",
method: "POST",
data,
});
};

View File

@ -0,0 +1,9 @@
import request from "@/utils/request";
// 关于我们
export function getAboutList() {
return request({
url: "/app/about/getList",
method: "get",
});
}

View File

@ -1,92 +1,195 @@
import request from "@/utils/request";
// 获取首页统计
export function getAllCount() {
return request({
url: "/app/map/getAllCount",
method: "get",
});
}
// 分布专家信息
export function getExpert() {
return request({
url: "/v1/index/distribution/expert",
method: "get",
});
return request({
url: "/v1/index/distribution/expert",
method: "get",
});
}
// 分布实验室信息
export function laboratory() {
return request({
url: "/v1/index/distribution/laboratory",
method: "get",
});
return request({
url: "/v1/index/distribution/laboratory",
method: "get",
});
}
// 分布需求信息
export function demand() {
return request({
url: "/v1/index/distribution/demand",
method: "get",
});
return request({
url: "/v1/index/distribution/demand",
method: "get",
});
}
// 分布技术成果信息
export function achievement() {
return request({
url: "/v1/index/distribution/achievement",
method: "get",
});
return request({
url: "/v1/index/distribution/achievement",
method: "get",
});
}
// 分布技术成果信息
export function company() {
return request({
url: "/v1/index/distribution/company",
method: "get",
});
return request({
url: "/v1/index/distribution/company",
method: "get",
});
}
// 获取banner
export function banner(params) {
return request({
url: "/app/config/list",
method: "get",
params,
});
return request({
url: "/app/config/list",
method: "get",
params,
});
}
// 行业领域信息
export function industry() {
return request({
url: "/v1/sys/industry",
method: "get",
});
return request({
url: "/v1/sys/industry",
method: "get",
});
}
// 客户端搜索
export function search(params) {
return request({
url: "/search/search",
method: "get",
params,
});
return request({
url: "/search/search",
method: "get",
params,
});
}
// 客户端专利搜索结果详情
export function searchPatentDetail(id) {
return request({
url: `/search/patent/${id}`,
method: "get",
});
}
// 客户端专利搜索结果详情
export function searchEnterpriseDetail(id) {
return request({
url: `/search/enterprise/${id}`,
method: "get",
});
}
// 获取[省]专家分布
export function countExpertByProvince() {
return request({
url: "/app/map/countExpertByProvince",
method: "get",
});
return request({
url: "/app/map/countExpertByProvince",
method: "get",
});
}
// 获取[市]专家分布
export function countExpertByCity(provinceCode) {
return request({
url: "/app/map/countExpertByCity",
method: "get",
params: {
provinceCode,
},
});
return request({
url: "/app/map/countExpertByCity",
method: "get",
params: {
provinceCode,
},
});
}
// 获取[县]专家分布
export function countExpertByArea() {
return request({
url: "/app/map/countExpertByArea",
method: "get",
params: {
cityCode,
},
});
export function countExpertByArea(cityCode) {
return request({
url: "/app/map/countExpertByArea",
method: "get",
params: {
cityCode,
},
});
}
// 获取[省]企业分布
export function countEnterpriseByProvince() {
return request({
url: "/app/map/countEnterpriseByProvince",
method: "get",
});
}
// 获取[市]企业分布
export function countEnterpriseByCity(provinceCode) {
return request({
url: "/app/map/countEnterpriseByCity",
method: "get",
params: {
provinceCode,
},
});
}
// 获取[县]企业分布
export function countEnterpriseByArea(cityCode) {
return request({
url: "/app/map/countEnterpriseByArea",
method: "get",
params: {
cityCode,
},
});
}
// 获取[省]需求分布
export function countDemandByProvince() {
return request({
url: "/app/map/countDemandByProvince",
method: "get",
});
}
// 获取[市]需求分布
export function countDemandByCity(provinceCode) {
return request({
url: "/app/map/countDemandByCity",
method: "get",
params: {
provinceCode,
},
});
}
// 获取[县]需求分布
export function countDemandByArea(cityCode) {
return request({
url: "/app/map/countDemandByArea",
method: "get",
params: {
cityCode,
},
});
}
// 获取[省]成果分布
export function countAchievementByProvince() {
return request({
url: "/app/map/countAchievementByProvince",
method: "get",
});
}
// 获取[市]成果分布
export function countAchievementByCity(provinceCode) {
return request({
url: "/app/map/countAchievementByCity",
method: "get",
params: {
provinceCode,
},
});
}
// 获取[县]成果分布
export function countAchievementByArea(cityCode) {
return request({
url: "/app/map/countAchievementByArea",
method: "get",
params: {
cityCode,
},
});
}

View File

@ -0,0 +1,25 @@
import request from "@/utils/request";
// 获取导航分类
export function getKinds() {
return request({
url: "/app/inovate/getKinds",
method: "get",
});
}
// 获取列表
export function getInovateList(params) {
return request({
url: "/app/inovate/list",
method: "get",
params,
});
}
// 获取详情
export function getInovateInfo(params) {
return request({
url: "/app/inovate/getInfo",
method: "get",
params,
});
}

View File

@ -0,0 +1,10 @@
import request from "@/utils/request";
// 发布留言
export function pubMessage(data) {
return request({
url: "/app/message",
method: "POST",
data,
});
}

View File

@ -0,0 +1,18 @@
import request from "@/utils/request";
// 获取列表
export function getCase(params) {
return request({
url: "/app/solution/getCase",
method: "get",
params,
});
}
// 获取详情
export function getInfo(params) {
return request({
url: "/app/solution/getInfo",
method: "get",
params,
});
}

View File

@ -20,18 +20,36 @@
<!-- 上传提示 -->
<div class="el-upload__tip" v-if="showTip">
请上传
<template v-if="fileSize"> 大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b> </template>
<template v-if="fileType"> 格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b> </template>
<template v-if="fileSize">
大小不超过 <b style="color: #f56c6c">{{ fileSize }}MB</b>
</template>
<template v-if="fileType">
格式为 <b style="color: #f56c6c">{{ fileType.join("/") }}</b>
</template>
的文件
</div>
<!-- 文件列表 -->
<transition-group class="upload-file-list el-upload-list el-upload-list--text" name="el-fade-in-linear" tag="ul">
<li :key="file.uid" class="el-upload-list__item ele-upload-list__item-content" v-for="(file, index) in fileList">
<el-link :href="`${baseUrl}${file.url}`" :underline="false" target="_blank">
<transition-group
class="upload-file-list el-upload-list el-upload-list--text"
name="el-fade-in-linear"
tag="ul"
>
<li
:key="file.uid"
class="el-upload-list__item ele-upload-list__item-content"
v-for="(file, index) in fileList"
>
<el-link
:href="`${baseUrl}${file.url}`"
:underline="false"
target="_blank"
>
<span class="el-icon-document"> {{ getFileName(file.name) }} </span>
</el-link>
<div class="ele-upload-list__item-content-action">
<el-link :underline="false" @click="handleDelete(index)" type="danger">删除</el-link>
<el-link :underline="false" @click="handleDelete(index)" type="danger"
>删除</el-link
>
</div>
</li>
</transition-group>
@ -61,8 +79,8 @@ const props = defineProps({
// 是否显示提示
isShowTip: {
type: Boolean,
default: true
}
default: true,
},
});
const { proxy } = getCurrentInstance();
@ -71,30 +89,35 @@ const number = ref(0);
const uploadList = ref([]);
const baseUrl = import.meta.env.VITE_APP_BASE_API;
const uploadFileUrl = ref(import.meta.env.VITE_APP_BASE_API + "/common/upload"); // 上传的图片服务器地址
const headers = ref({ Authorization: "Bearer " + getToken() });
// const headers = ref({ Authorization: "Bearer " + getToken() });
const headers = ref({});
const fileList = ref([]);
const showTip = computed(
() => props.isShowTip && (props.fileType || props.fileSize)
);
watch(() => props.modelValue, val => {
if (val) {
let temp = 1;
// 首先将值转为数组
const list = Array.isArray(val) ? val : props.modelValue.split(',');
// 然后将数组转为对象数组
fileList.value = list.map(item => {
if (typeof item === "string") {
item = { name: item, url: item };
}
item.uid = item.uid || new Date().getTime() + temp++;
return item;
});
} else {
fileList.value = [];
return [];
}
},{ deep: true, immediate: true });
watch(
() => props.modelValue,
(val) => {
if (val) {
let temp = 1;
// 首先将值转为数组
const list = Array.isArray(val) ? val : props.modelValue.split(",");
// 然后将数组转为对象数组
fileList.value = list.map((item) => {
if (typeof item === "string") {
item = { name: item, url: item };
}
item.uid = item.uid || new Date().getTime() + temp++;
return item;
});
} else {
fileList.value = [];
return [];
}
},
{ deep: true, immediate: true }
);
// 上传前校检格式和大小
function handleBeforeUpload(file) {
@ -110,7 +133,9 @@ function handleBeforeUpload(file) {
return false;
});
if (!isTypeOk) {
proxy.$modal.msgError(`文件格式不正确, 请上传${props.fileType.join("/")}格式文件!`);
proxy.$modal.msgError(
`文件格式不正确, 请上传${props.fileType.join("/")}格式文件!`
);
return false;
}
}
@ -141,7 +166,9 @@ function handleUploadError(err) {
function handleUploadSuccess(res, file) {
uploadList.value.push({ name: res.fileName, url: res.fileName });
if (uploadList.value.length === number.value) {
fileList.value = fileList.value.filter(f => f.url !== undefined).concat(uploadList.value);
fileList.value = fileList.value
.filter((f) => f.url !== undefined)
.concat(uploadList.value);
uploadList.value = [];
number.value = 0;
emit("update:modelValue", listToString(fileList.value));
@ -169,11 +196,11 @@ function listToString(list, separator) {
let strs = "";
separator = separator || ",";
for (let i in list) {
if(undefined !== list[i].url) {
if (undefined !== list[i].url) {
strs += list[i].url + separator;
}
}
return strs != '' ? strs.substr(0, strs.length - 1) : '';
return strs != "" ? strs.substr(0, strs.length - 1) : "";
}
</script>

View File

@ -49,8 +49,10 @@
</el-form>
</template>
<script setup>
import { launch } from "@/api/config";
const { proxy } = getCurrentInstance();
// import { launch } from "@/api/config";
import { pubMessage } from "@/api/website/message";
import { ElMessage } from "element-plus";
// const { proxy } = getCurrentInstance();
const data = reactive({
form: {},
rules: {
@ -77,14 +79,18 @@ function reset() {
mobile: undefined,
email: undefined,
};
proxy.resetForm("formRef");
if (formRef.value) {
formRef.value.resetFields();
}
}
const formRef = ref();
/** 提交按钮 */
function submitForm() {
proxy.$refs["formRef"].validate((valid) => {
formRef.value.validate((valid) => {
if (valid) {
launch(form.value).then((res) => {
proxy.$modal.msgSuccess(res.message);
pubMessage(form.value).then((res) => {
// proxy.$modal.msgSuccess(res.message);
ElMessage.success("发送成功");
reset();
});
}

View File

@ -26,9 +26,15 @@ const whiteList = [
"/about",
"/searchList/enterprise",
"/searchList/patent",
"/searchList/expert"
"/searchList/expert",
// "/solution/detail/",
];
const whiteListReg = [
/\/solution\/detail\/[0-9]+/,
/\/innovate\/detail\/[0-9]+/,
/\/searchList\/patent\/detail\/[0-9]+/,
/\/searchList\/enterprise\/detail\/[0-9]+/,
];
router.beforeEach((to, from, next) => {
NProgress.start();
if (getToken()) {
@ -77,6 +83,13 @@ router.beforeEach((to, from, next) => {
if (whiteList.indexOf(to.path) !== -1) {
// 在免登录白名单,直接进入
next();
} else if (
whiteListReg.findIndex((el) => {
// console.log(el);
return el.test(to.path);
}) !== -1
) {
next();
} else {
next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页
NProgress.done();

View File

@ -44,31 +44,50 @@ export const constantRoutes = [
component: () => import("../views/website/home/index.vue"),
},
{
path: 'searchList/enterprise',
component: () => import('../views/website/searchList/enterprise.vue'),
path: "searchList/enterprise",
component: () => import("../views/website/searchList/enterprise.vue"),
},
{
path: 'searchList/patent',
component: () => import('../views/website/searchList/patent.vue'),
path: "searchList/enterprise/detail/:id",
component: () =>
import("../views/website/searchList/enterpriseDetail.vue"),
},
{
path: 'searchList/expert',
component: () => import('../views/website/searchList/expert.vue'),
path: "searchList/patent",
component: () => import("../views/website/searchList/patent.vue"),
},
{
path: 'solution/:name',
name: 'solution',
component: () => import('../views/website/solution/solution.vue'),
path: "searchList/patent/detail/:id",
component: () => import("../views/website/searchList/patentDetail.vue"),
},
{
path: '/innovate',
name: 'innovate',
component: () => import('../views/website/innovate/innovate.vue'),
path: "searchList/expert",
component: () => import("../views/website/searchList/expert.vue"),
},
{
path: 'activity',
name: 'activity',
component: () => import('../views/website/activity/activity.vue'),
path: "solution/:name",
name: "solution",
component: () => import("../views/website/solution/solution.vue"),
},
{
path: "solution/detail/:id",
name: "solutionDetail",
component: () => import("../views/website/solution/detail.vue"),
},
{
path: "/innovate",
name: "innovate",
component: () => import("../views/website/innovate/innovate.vue"),
},
{
path: "innovate/detail/:id",
name: "innovateDetail",
component: () => import("../views/website/innovate/detail.vue"),
},
{
path: "activity",
name: "activity",
component: () => import("../views/website/activity/activity.vue"),
// children: [
// {
// path: '',
@ -83,9 +102,9 @@ export const constantRoutes = [
// ]
},
{
path: 'about',
name: 'about',
component: () => import('../views/website/about/about.vue'),
path: "about",
name: "about",
component: () => import("../views/website/about/about.vue"),
},
],
},
@ -140,10 +159,10 @@ export const constantRoutes = [
meta: { title: "企业入驻" },
},
{
path: 'expert',
component: () => import('@/views/identity/expert'),
name: 'expert',
meta: { title: '专家入驻' }
path: "expert",
component: () => import("@/views/identity/expert"),
name: "expert",
meta: { title: "专家入驻" },
},
// {
// path:'research',
@ -225,7 +244,8 @@ export const enterpriseRoutes = [
},
{
path: "joinMembership",
component: () => import('@/views/admin/enterprise/account/joinMembership'),
component: () =>
import("@/views/admin/enterprise/account/joinMembership"),
name: "joinMembership",
meta: { title: "开通会员", icon: "list" },
},
@ -295,7 +315,8 @@ export const enterpriseRoutes = [
},
{
path: "releaseService",
component: () => import("@/views/admin/enterprise/demand/releaseService"),
component: () =>
import("@/views/admin/enterprise/demand/releaseService"),
hidden: true,
name: "releaseService",
meta: { title: "发布服务需求", icon: "list" },
@ -308,7 +329,8 @@ export const enterpriseRoutes = [
},
{
path: "releaseTechnology",
component: () => import("@/views/admin/enterprise/demand/releaseTechnology"),
component: () =>
import("@/views/admin/enterprise/demand/releaseTechnology"),
hidden: true,
name: "releaseTechnology",
meta: { title: "发布技术需求", icon: "list" },

View File

@ -42,7 +42,7 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<!-- <el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="text">
<b style="color: #000">总订单金额¥2044</b>
@ -52,7 +52,7 @@
v-model:showSearch="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
</el-row> -->
<el-table v-loading="loading" :data="dataList">
<el-table-column label="订单号" align="center" prop="orderNumber" />

View File

@ -81,7 +81,7 @@
</el-form-item>
</el-col>
</el-row>
<!--
<el-row>
<el-col :span="12">
<el-form-item label="需求提交人:" prop="commitUserName">
@ -99,7 +99,7 @@
></el-input>
</el-form-item>
</el-col>
</el-row>
</el-row> -->
</el-form>
<div :style="{ marginLeft: labelWidth + 'px' }">
<el-button @click="$router.go(-1)">取消</el-button>

View File

@ -19,6 +19,7 @@
<el-row>
<el-col :span="24">
<!-- <el-checkbox label="0" @change="handleCheck">其他</el-checkbox> -->
<el-form-item label="需求类别:">
<el-checkbox-group v-model="form.kinds">
<el-checkbox
@ -27,7 +28,6 @@
:label="item.name"
>{{ item.name }}</el-checkbox
>
<!-- <el-checkbox label="0" @change="handleCheck">其他</el-checkbox> -->
</el-checkbox-group>
<el-row :gutter="20">
<el-col :span="20">
@ -129,7 +129,7 @@
</el-col>
</el-row>
<el-row>
<!-- <el-row>
<el-col :span="12">
<el-form-item label="需求提交人:" prop="commitUserName">
<el-input
@ -146,7 +146,7 @@
></el-input>
</el-form-item>
</el-col>
</el-row>
</el-row> -->
<el-row>
<el-col :span="24">
@ -170,13 +170,19 @@
</template>
<script setup>
// import { expert } from "@/api/identity/index";
import { insertTechnologyDemand } from "@/api/admin/enterprise";
// import { insertTechnologyDemand } from "@/api/admin/enterprise";
import CityOptions from "@/views/components/CityOptions";
import FieldOptions from "@/views/components/FieldOptions";
import InputBoxAdd from "@/views/components/InputBoxAdd";
import { ElMessage } from "element-plus";
import { useRouter } from "vue-router";
import { useRoute, useRouter } from "vue-router";
import {
getTechnologyDemand,
updateTechnologyDemand,
insertTechnologyDemand,
} from "@/api/admin/enterprise/demand";
const router = useRouter();
const route = useRoute();
const data = reactive({
form: {
check: [],
@ -241,7 +247,6 @@ const fieldFormRef = ref(null);
const directionsFormRef = ref(null);
const checkInput = ref("");
const submitForm = async () => {
// await formRef.value.validate();
let formValid;
try {
formValid = await formRef.value.validate();
@ -251,8 +256,13 @@ const submitForm = async () => {
const fieldFormValid = await fieldFormRef.value.validateForm();
const directionsFormValid = await directionsFormRef.value.validateForm();
if (formValid && fieldFormValid && directionsFormValid) {
await insertTechnologyDemand(form.value);
ElMessage.success("新增企业需求成功");
if (route.query.id) {
await updateTechnologyDemand(form.value);
ElMessage.success("修改企业需求成功");
} else {
await insertTechnologyDemand(form.value);
ElMessage.success("新增企业需求成功");
}
router.go(-1);
} else {
console.log("校验未通过");
@ -293,4 +303,16 @@ function addCheck() {
checkInput.value = "";
}
}
if (route.query.id) {
getTechnologyDemand({ id: route.query.id }).then((resp) => {
form.value = resp.data;
if (!form.value.kinds) {
form.value.kinds = resp.data.kind?.split(",") ?? [];
}
if (!form.value.wants) {
form.value.wants = resp.data.want?.split(",") ?? [];
}
});
}
</script>

View File

@ -25,7 +25,7 @@
<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="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="mobile" />
<el-table-column
@ -163,7 +163,7 @@ function handleDelete(id) {
.catch(() => {});
}
function handleEdit(id) {
router.push({ path: "./release", query: { id } });
router.push({ path: "./releaseService", query: { id } });
}
getList();
onActivated(() => {

View File

@ -53,7 +53,7 @@
>
<template #default="{ row }">
<router-link
:to="{ path: './released', query: { id: row.id } }"
:to="{ path: './releaseTechnology', query: { id: row.id } }"
v-if="queryParams.status == 0"
>
<el-button size="small" type="text" icon="Edit">编辑</el-button>
@ -64,7 +64,7 @@
size="small"
type="text"
icon="Delete"
@click="handleDelete(scope.row.id)"
@click="handleDelete(row.id)"
>删除</el-button
>
<el-button
@ -72,7 +72,7 @@
size="small"
type="text"
icon="View"
@click="handleResults(scope.row.id)"
@click="handleResults(row.id)"
>查看匹配结果</el-button
>
<el-button
@ -97,7 +97,10 @@
</template>
<script setup name="technologyDemand">
import { technologyDemandList } from "@/api/admin/enterprise";
import {
technologyDemandList,
deleteTechnologyDemand,
} from "@/api/admin/enterprise/demand";
import { ElMessage, ElMessageBox } from "element-plus";
import { useRouter } from "vue-router";
@ -167,13 +170,16 @@ function handleQuery() {
function handleDelete(id) {
ElMessageBox.confirm('是否确认删除数据编号为"' + id + '"的需求项?')
.then(function () {
return achievementDelete({ id });
console.log("delete");
return deleteTechnologyDemand(id);
})
.then(() => {
getList();
ElMessage.success("删除成功");
})
.catch(() => {});
.catch((err) => {
console.log(err);
});
}
function handleShelf(row) {
let text = row.shelf_status == 2 ? "上架" : "下架";

View File

@ -42,9 +42,9 @@
v-if="queryParams.status == 1"
size="small"
type="text"
icon="Download"
:icon="row.shelfStatus == 2 ? 'Upload' : 'Download'"
@click="handleShelf(row)"
>下架</el-button
>{{ row.shelfStatus == 2 ? "上架" : "下架" }}</el-button
>
<el-button
v-if="queryParams.status != 1"
@ -75,6 +75,7 @@
size="small"
type="text"
icon="Close"
@click="releaseCancel(row.id)"
>取消发布</el-button
>
</template>
@ -92,8 +93,13 @@
</template>
<script setup name="Product">
import { getEnterpriseProduct } from "@/api/admin/enterprise";
import {
getEnterpriseProduct,
deleteEnterpriseProduct,
updateEnterpriseProduct,
} from "@/api/admin/enterprise/product";
import { ElMessage, ElMessageBox } from "element-plus";
import { onActivated } from "vue";
import { useRouter } from "vue-router";
const router = useRouter();
@ -127,9 +133,9 @@ const getList = async () => {
const handleDelete = (id) => {
ElMessageBox.confirm('是否确认删除数据编号为"' + id + '"的产品项?')
.then(async () => {
// delete product
//await deleteProduct(id);
// ElMessage.success("删除成功");
await deleteEnterpriseProduct(id);
ElMessage.success("删除成功");
getList();
})
.catch((error) => {
console.log("已取消");
@ -141,14 +147,25 @@ function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
// 取消发布
const releaseCancel = (id) => {
ElMessageBox.confirm('确认要取消发布id为"' + id + '"的产品吗?')
.then(async () => {
await updateEnterpriseProduct({ id, status: 3 });
ElMessage.success("取消发布成功");
getList();
})
.catch((err) => {
console.log(err);
});
};
// 下架和上架
const handleShelf = (row) => {
let text = row.shelf_status == 2 ? "上架" : "下架";
let text = row.shelfStatus == 2 ? "上架" : "下架";
ElMessageBox.confirm('确认要"' + text + '""' + row.id + '"的产品吗?')
.then(function () {
let status = row.shelf_status == 1 ? 2 : 1;
// return achievementShelf({ id: row.id, status });
let status = row.shelfStatus == 1 ? 2 : 1;
return updateEnterpriseProduct({ id: row.id, shelfStatus: status });
})
.then(() => {
getList();
@ -162,5 +179,8 @@ const handleResults = (id) => {
const checkEnterpriseInfo = (id) => {
router.push({ path: "./business" });
};
getList();
onActivated(() => {
getList();
});
</script>

View File

@ -18,7 +18,11 @@
import ReleaseForm from "@/views/components/ReleaseForm";
import { ElMessage } from "element-plus";
import { useRoute, useRouter } from "vue-router";
import { getProductById, insertEnterpriseProduct } from "@/api/admin/enterprise";
import {
getProductById,
insertEnterpriseProduct,
updateEnterpriseProduct,
} from "@/api/admin/enterprise/product";
import { reactive, toRefs } from "vue";
const route = useRoute();
const router = useRouter();
@ -34,8 +38,13 @@ const submitForm = async (is_submit) => {
console.log(await releaseFormRef.value.validateForm());
const isValid = await releaseFormRef.value.validateForm();
if (isValid) {
await insertEnterpriseProduct(form.value);
ElMessage.success("新增产品成功");
if (route.query.id) {
await updateEnterpriseProduct(form.value);
ElMessage.success("修改产品成功");
} else {
await insertEnterpriseProduct(form.value);
ElMessage.success("新增产品成功");
}
router.go(-1);
} else {
console.log("验证未通过");

View File

@ -3,7 +3,7 @@
<el-card shadow="always" style="width: 55%; margin: 0 auto">
<p><b>基本资料</b></p>
<el-form
ref="postRef"
ref="personalInfoFormRef"
:model="PersonalInfoForm"
:rules="rules"
label-width="100px"
@ -14,17 +14,17 @@
placeholder="请输入姓名"
/>
</el-form-item>
<el-form-item label="手机:" prop="phone">
<el-form-item label="手机:" prop="mobile">
<el-input
v-model="PersonalInfoForm.phone"
v-model="PersonalInfoForm.mobile"
placeholder="请输入手机号"
/>
</el-form-item>
<el-form-item label="邮箱:" prop="email">
<el-input v-model="PersonalInfoForm.email" placeholder="请输入邮箱" />
</el-form-item>
<el-form-item label="职务:" prop="email">
<el-input v-model="PersonalInfoForm.email" placeholder="请输入职务" />
<el-form-item label="职务:" prop="post">
<el-input v-model="PersonalInfoForm.post" placeholder="请输入职务" />
</el-form-item>
<el-form-item label="固定电话:" prop="phone">
<el-input
@ -33,18 +33,18 @@
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button type="primary" @click="submitPersonalInfo">提交</el-button>
</el-form-item>
</el-form>
<p><b>专家资料</b></p>
<ExpertForm
v-model="form"
v-model="expertForm"
:isAdd="false"
:labelWidth="labelWidth"
ref="expertForm"
ref="expertFormRef"
/>
<div :style="{ marginLeft: labelWidth + 'px' }">
<el-button type="primary" @click="submitForm">提交</el-button>
<el-button type="primary" @click="submitExpertForm">提交</el-button>
</div>
</el-card>
</div>
@ -52,7 +52,11 @@
<script setup>
// import { expert } from "@/api/identity/index";
import { getInfo } from "@/api/login";
import { insertClientUser } from "@/api/admin/enterprise";
import { updateExpert } from "@/api/admin/expert/account";
import ExpertForm from "@/views/components/ExpertForm";
import { ElMessage } from "element-plus";
import { useRouter } from "vue-router";
const data = reactive({
PersonalInfoForm: {},
queryParams: {
@ -60,6 +64,9 @@ const data = reactive({
pageSize: 10,
postCode: undefined,
},
expertForm: {
gender: 1,
},
rules: {
name: [{ required: true, message: "公司名称不能为空", trigger: "blur" }],
dutyParagraph: [
@ -85,28 +92,46 @@ const data = reactive({
},
});
const { queryParams, PersonalInfoForm, rules } = toRefs(data);
const { expertForm, PersonalInfoForm, rules } = toRefs(data);
const { proxy } = getCurrentInstance();
const router = useRouter();
const expertFormRef = ref();
const labelWidth = 140;
// 获取基础信息用于回显
const getBasicInfo = async () => {
const { data } = await getInfo();
PersonalInfoForm.value = data.user ?? {};
// enterpriseInfoForm.value = data.enterprise ?? {};
expertForm.value = data.enterprise ?? {};
};
getBasicInfo();
const form = reactive({
laboratory_id: undefined, // 所属实验室
// laboratory_id: undefined, // 所属实验室
gender: 1,
});
function submitForm(status) {
if (proxy.$refs.expertForm.submitForm()) {
expert(form).then((res) => {
proxy.$modal.msgSuccess("新增成功");
proxy.$router.go(-1);
const personalInfoFormRef = ref();
// 更新个人信息
const submitPersonalInfo = async () => {
try {
await personalInfoFormRef.value.validate();
await insertClientUser(PersonalInfoForm.value);
ElMessage.success("更新个人信息成功");
const { data } = await getInfo();
PersonalInfoForm.value = data.user ?? {};
} catch (error) {
console.log(error);
}
};
async function submitExpertForm(status) {
const valid = await expertFormRef.value.validateForm();
if (valid) {
updateExpert(expertForm.value).then((res) => {
ElMessage.success("新增成功");
router.back();
});
} else {
console.log("校验未通过");

View File

@ -15,17 +15,17 @@
</el-col>
</el-row>
<el-row v-if="isAdd">
<el-row>
<el-col :span="24">
<el-form-item label="单位名称" prop="name">
<el-form-item label="企业名称" prop="name">
<el-input v-model="modelValue.name"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="isAdd">
<el-row>
<el-col :span="24">
<el-form-item label="组织机构代码:" prop="code">
<el-form-item label="信用代码:" prop="code">
<el-row type="flex" justify="space-between">
<el-col :span="20">
<el-input v-model="modelValue.code"></el-input>
@ -37,7 +37,6 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="企业类型:" prop="kind">

View File

@ -198,6 +198,9 @@ getIndustryTreeData();
watch(modelValue, (newVal) => {
modelValue.value.industrys = [];
industrysTags.value = [];
if (!modelValue.value.industry) {
return;
}
modelValue.value.industrys.push(...modelValue.value.industry.split(","));
for (const field of modelValue.value.industry.split(",")) {
industrysTags.value.push(field.split("-").map((el) => parseInt(el)));

View File

@ -120,7 +120,7 @@
<ImageUpload v-model="modelValue.image" :limit="1" />
</el-form-item>
</el-col>
<el-col :span="12">
<!-- <el-col :span="12">
<el-form-item label="产品视频:">
<VideoUpload
v-model="modelValue.video"
@ -128,7 +128,7 @@
:fileType="['mp4']"
/>
</el-form-item>
</el-col>
</el-col> -->
</el-row>
<p>
<b>图片材料上传</b>

View File

@ -28,24 +28,6 @@
class="html"
v-html="state.data[kindId]['content']"
></div>
<!-- 公司简介---后期可能是接收富文本内容 -->
<!-- <h3>公司简介</h3>
<p>
中国科学院重庆绿色智能技术研究院合肥分院以下简称合肥分院是在响应中科院号召支持合肥国家科学中心建设的前提下中国科学院重庆绿色智能技术研究院与合肥市共建的直属事业法人科研机构2018年2月20号在中科院与安徽省共建领导小组会议上正式签约筹建2018年12月20日正式获得事业法人登记证书合肥分院设立科技咨询委员会和产业咨询委员会设人工智能精准医疗5G物联绿色环保等研究单元主要从事绿色智能科技研发与科技成果转化合肥分院秉持重庆研究院市场为魂创新为本的理念按照院企共建源头创新科技共享产业集聚模式建设以服务好科技工作者服务好合作企业为宗旨开展形式多样的成果转移转化加快科研成果落地
</p>
<el-image
src="https://fuss10.elemecdn.com/9/bb/e27858e973f5d7d3904835f46abbdjpeg.jpeg"
fit="fill"
></el-image>
<p>
中国科学院重庆绿色智能技术研究院合肥分院以下简称合肥分院是在响应中科院号召支持合肥国家科学中心建设的前提下中国科学院重庆绿色智能技术研究院与合肥市共建的直属事业法人科研机构2018年2月20号在中科院与安徽省共建领导小组会议上正式签约筹建2018年12月20日正式获得事业法人登记证书合肥分院设立科技咨询委员会和产业咨询委员会设人工智能精准医疗5G物联绿色环保等研究单元主要从事绿色智能科技研发与科技成果转化合肥分院秉持重庆研究院市场为魂创新为本的理念按照院企共建源头创新科技共享产业集聚模式建设以服务好科技工作者服务好合作企业为宗旨开展形式多样的成果转移转化加快科研成果落地
</p>
<p>
中国科学院重庆绿色智能技术研究院合肥分院以下简称合肥分院是在响应中科院号召支持合肥国家科学中心建设的前提下中国科学院重庆绿色智能技术研究院与合肥市共建的直属事业法人科研机构2018年2月20号在中科院与安徽省共建领导小组会议上正式签约筹建2018年12月20日正式获得事业法人登记证书合肥分院设立科技咨询委员会和产业咨询委员会设人工智能精准医疗5G物联绿色环保等研究单元主要从事绿色智能科技研发与科技成果转化合肥分院秉持重庆研究院市场为魂创新为本的理念按照院企共建源头创新科技共享产业集聚模式建设以服务好科技工作者服务好合作企业为宗旨开展形式多样的成果转移转化加快科研成果落地
</p>
<p>
中国科学院重庆绿色智能技术研究院合肥分院以下简称合肥分院是在响应中科院号召支持合肥国家科学中心建设的前提下中国科学院重庆绿色智能技术研究院与合肥市共建的直属事业法人科研机构2018年2月20号在中科院与安徽省共建领导小组会议上正式签约筹建2018年12月20日正式获得事业法人登记证书合肥分院设立科技咨询委员会和产业咨询委员会设人工智能精准医疗5G物联绿色环保等研究单元主要从事绿色智能科技研发与科技成果转化合肥分院秉持重庆研究院市场为魂创新为本的理念按照院企共建源头创新科技共享产业集聚模式建设以服务好科技工作者服务好合作企业为宗旨开展形式多样的成果转移转化加快科研成果落地主要从事绿色智能科技研发与科技成果转化合肥分院秉持重庆研究院市场为魂创新为本的理念按照院企共建源头创新科技共享产业集聚模式建设以服务好科技工作者服务好合作企业为宗旨开展形式多样的成果转移转化加快科研成果落地
</p>-->
</div>
</div>
<webFooter></webFooter>
@ -56,6 +38,7 @@
import webFooter from "@/components/webFooter/index.vue";
import request from "@/utils/request";
import { banner } from "@/api/website/home/index";
import { getAboutList } from "../../../api/website/aboutUs";
function about() {
return request({
url: "/v1/sys/about",
@ -72,17 +55,7 @@ const kindId = ref(0);
/** 查询 */
function getData() {
loading.value = true;
const res = {
code: 200,
message: "ok",
data: {
id: "LBZ5aPXa6NkM",
title: "关于我们",
is_multiple: 0,
images:
"https://www.casshare.com/upimages/upload/20220310/7ed3a751b8c799f5f6f29d68d50cf7da.png",
},
};
banner({ locals: "关于我们" })
.then((resp) => {
state.banner = resp.data[0].images;
@ -90,45 +63,16 @@ function getData() {
.catch(() => {
loading.value = false;
});
// .then((res) => {
// if (200 == res.code) {
// loading.value = false;
// }
// })
// console.log("baout1");
const resp = {
code: 200,
message: "ok",
data: [
{
id: "1m9Qa2ZaOvEp",
title: "机构简介",
content:
'\u003cul\u003e\u003cli class="ql-align-justify"\u003e 安徽中科云数字科技有限公司是由中科院中科第三极技术研究院联合中科院文献情报中心共同发起,并创建中科云数字科创服务系统(中科云)。\u003c/li\u003e\u003cli\u003e 中科云致力于中科院及全球科技资源开放共享及科技成果转化。中科云集聚中科院等高校院所体系人才、团队、科技成果等创新资源为企业提供包括人才专家、科技成果、实验室、科技情报、知识产权等创新资源的精准服务通过知识图谱、语义理解、智能算法为企业提供“一键匹配”的科技资源信息精准推送服务提高创新效率降低创新成本解决企业在创新发展中遇到的难题。目前中科云平台已集聚中科院约10000+专家教授、30万+科技成果、600+个省部级重点实验室服务约600家高科技企业。同时中科云服务安徽省合肥市“四送一服”科技专项服务行动线上征集与发布本地企业需求科技成果实现本地科技成果就地转化落地。\u003c/li\u003e\u003cli\u003e 中科云作为“合肥市‘一带一路’科技产业创新战略联盟”的秘书长单位,帮助企业开展国际产学研合作,拓展海外市场。\u003c/li\u003e\u003c/ul\u003e',
children: null,
},
{
id: "Q7K1Jx6VYodq",
title: "公司动态",
content: "\u003cp\u003e\u003cbr\u003e\u003c/p\u003e",
children: null,
},
{
id: "E8MnaAkwDj1X",
title: "公司动态二级目录",
content: "\u003cp\u003e\u003cbr\u003e\u003c/p\u003e",
children: null,
},
],
};
// about().then((res) => {
// console.log("baout2");
// if (200 == res.code) {
console.log("baout", resp);
state.data = resp.data;
loading.value = false;
// }
// });
// 获取关于我们列表
getAboutList()
.then((resp) => {
console.log("baout", resp);
state.data = resp.data;
loading.value = false;
})
.catch(() => {
loading.value = false;
});
}
onMounted(() => {
getData();

View File

@ -71,27 +71,31 @@
<el-row>
<el-col :push="3" :pull="3" :span="18">
<div class="numBox">
<div>
<div class="val">{{ state.data.patent_count }}</div>
<div class="des">专利数量</div>
</div>
<div>
<div class="val">{{ state.data.expert_count }}</div>
<div class="des">专家数量</div>
</div>
<div>
<!-- <div>
<div class="val">
{{ state.data.patent_count + state.data.achievement_count }}
</div>
<div class="des">专利成果数量</div>
</div>
</div> -->
<div>
<div class="val">{{ state.data.demand_count }}</div>
<div class="des">需求数量</div>
</div>
<div>
<!-- <div>
<div class="val">{{ state.data.docking_count }}</div>
<div class="des">对接数量</div>
</div>
</div> -->
<div>
<div class="val">{{ state.data.company_count }}</div>
<div class="des">实验室数量</div>
<div class="des">企业数量</div>
</div>
</div>
</el-col>
@ -110,6 +114,7 @@
import { onMounted, reactive } from "vue";
import { banner } from "@/api/website/home/index";
import { useRouter } from "vue-router";
import { getAllCount } from "../../../../api/website/home";
// import request from "@/utils/request";
const router = useRouter();
@ -202,27 +207,27 @@ onMounted(() => {
console.log(resp);
state.banner = resp.data[0].images;
});
state.data = {
expert_count: 15,
company_count: 9,
patent_count: 181233,
achievement_count: 12,
demand_count: 0,
docking_count: 0,
distribution: {
expert: null,
laboratory: null,
demand: null,
patent: null,
achievement: null,
company: null,
},
};
// indexData().then((res) => {
// if (200 == res.code) {
// state.data = res.data;
// }
// });
// state.data = {
// expert_count: 15,
// company_count: 9,
// patent_count: 181233,
// achievement_count: 12,
// demand_count: 0,
// docking_count: 0,
// distribution: {
// expert: null,
// laboratory: null,
// demand: null,
// patent: null,
// achievement: null,
// company: null,
// },
// };
getAllCount().then((res) => {
// if (200 == res.code) {
state.data = res.data;
// }
});
// console.log("onmunted");
});
</script>

View File

@ -5,7 +5,7 @@
<img src="./img/back_button.png" />
</div>
<!-- echartsDom 兼容缩放 -->
<div ref="mapRef" class="map echartsDom" id="map"></div>
<div ref="map" class="map echartsDom" id="map"></div>
<div class="leftBox">
<div class="head">
<div class="a">地区</div>
@ -41,41 +41,68 @@
</template>
<script setup>
import { getCurrentInstance, onMounted, reactive } from "vue";
import { defineComponent, getCurrentInstance, onMounted, reactive } from "vue";
import {
countExpertByProvince,
countExpertByCity,
countExpertByArea,
} from "../../../../api/website/home";
countExpertByCity,
countExpertByProvince,
} from "../../../../api/website/home/index";
// return;
// console.log(echarts);
import * as echarts from "echarts";
import { ElMessage } from "element-plus";
// import * as ama from "echarts-extension-amap";
// console.log(ama);
// import { AMap } from "echarts-extension-amap";
// import { echarts } from "echarts";
// import { getExpert } from "@/api/website/home/index";
const { proxy } = getCurrentInstance();
const loading = shallowRef(true);
// console.log(123);
let treeData = {};
// let treeData = {};
let treeData = [];
const snapTree = shallowRef({});
async function searchRegionData(code, level) {
// console.log(code, treeData,'searchRegionData')
const searchRegionData = async (code, level) => {
if (level == "province") {
return await countExpertByCity(code);
} else if ((level = "city")) {
return await countExpertByArea(code);
} else {
return await countExpertByProvince();
}
// return deepFindTree(code, treeData);
}
const provcode = code.substring(0, 2) + "0000";
let data = {};
if (
snapTree.value.length &&
snapTree.value[0].code.substring(0, 2) == code.substring(0, 2) &&
snapTree.value[0].code.substring(2, 4) != code.substring(2, 4)
) {
data = snapTree.value;
} else {
const resp = await countExpertByCity(provcode);
snapTree.value = resp.data;
data = resp.data;
}
return data.find((item) => item.code == code) || false;
} else if (level == "city") {
const ctcode = code.substring(0, 4) + "00";
let data = {};
if (
snapTree.value.length &&
snapTree.value[0].code.substring(0, 4) == code.substring(0, 4) &&
snapTree.value[0].code.substring(4, 6) != code.substring(4, 6)
) {
data = snapTree.value;
} else {
const resp = await countExpertByArea(ctcode);
snapTree.value = resp.data;
data = resp.data;
}
return data.find((item) => item.code == code) || false;
} else {
if (treeData.length) {
return treeData.find((item) => item.code == code) || false;
} else {
const { data } = await countExpertByProvince();
return data.find((item) => item.code == code) || false;
}
}
};
const findMapCount = (data, code) => {
return data.find((item) => item.code == code) || false;
};
function deepFindTree(code, tree) {
let snap = false;
for (const key in tree) {
@ -151,35 +178,26 @@ const state = reactive({
isShowTips: false, //是否显示下载提示
});
const convertResFormat = (data) => {
const obj = {};
for (const item of data) {
obj[item.code] = item;
const formatData = (origin) => {
const data = {};
for (const item of origin) {
data[item.code] = item;
}
return obj;
return data;
};
const mapRef = ref();
onMounted(() => {
// 数据接口
countExpertByProvince().then((resp) => {
const res = {
210000: {
code: "8",
name: "辽宁",
count: 155,
},
};
treeData = res;
snapTree.value = res;
// treeData = convertResFormat(resp.data);
// snapTree.value = convertResFormat(resp.data);
// const data = formatData(resp.data);
treeData = resp.data;
snapTree.value = resp.data;
loading.value = false;
});
let height = document.body.clientHeight;
let width = document.body.clientWidth;
let dom = mapRef.value;
let dom = proxy.$refs["map"];
dom.style.width = width + "px";
dom.style.height = height - 80 + "px";
state.echartsMap = echarts.init(dom);
@ -207,17 +225,15 @@ onMounted(() => {
function goBack() {
state.isShowGoBack = false;
loading.value = true;
state.district.search("中国", (status, result) => {
state.district.search("中国", async (status, result) => {
if (status == "complete") {
getData(result.districtList[0], "", 100000);
snapTree.value = treeData;
await getData(result.districtList[0], "", 100000);
snapTree.value = formatData(treeData);
}
});
}
function echartsMapClick(params) {
// ElMessage.success("点击了地图");
console.log(params);
async function echartsMapClick(params) {
//地图点击事件
if (params.data.cityCode == "710000") {
return;
@ -225,15 +241,16 @@ function echartsMapClick(params) {
if (params.data.level == "district") {
return;
}
if (params.data.level == "street") {
return;
} //此处的params.data为state.mapData里的数据
let snap = searchRegionData(params.data.cityCode, params.data.level);
snapTree.value = {};
if (snap) {
snapTree.value = snap["children"];
}
if (params.data.level == "street") return; //此处的params.data为state.mapData里的数据
console.log(params.data.level, params.data.cityCode);
let snap = await searchRegionData(params.data.cityCode, params.data.level);
// snapTree.value = {};
// console.log(snap, "-----------****---------");
// ElMessage.success(snap);
// if (snap) {
// // console.log("snap------------****************");
// snapTree.value = snap["children"];
// }
state.cityCode = params.data.cityCode;
state.cityName = params.data.name;
state.district.setLevel(params.data.level); //行政区级别
@ -253,8 +270,7 @@ function echartsMapClick(params) {
});
}
function getData(data, level, adcode) {
// ElMessage.warning(level);
async function getData(data, level, adcode) {
//处理获取出来的边界数据
var subList = data.districtList;
if (subList) {
@ -269,7 +285,7 @@ function getData(data, level, adcode) {
}
}
state.mapData = [];
let item = searchRegionData(cityCode, level);
let item = await searchRegionData(cityCode, level);
if (item) {
console.log("1 searchRegionData(cityCode)", item);
}
@ -290,7 +306,7 @@ function getData(data, level, adcode) {
var name = subList[i].name;
var cityCode = subList[i].adcode;
//这个mapData里包含每个区域的code、名称、对应的等级实现第三步功能时能用上
let item = searchRegionData(cityCode, level);
let item = await searchRegionData(cityCode, level);
if (item) {
console.log("2 searchRegionData(cityCode)", item);
@ -333,7 +349,6 @@ function loadMapData(areaCode) {
}
}
console.log("------------------");
console.log(mapJson);
loadMap(state.cityName, mapJson);
});
});

View File

@ -20,7 +20,7 @@
<div class="b">暂无</div>
</div>
</div>
<div class="rightBox">
<!-- <div class="rightBox">
<div class="head">
<div class="a">领域</div>
<div class="b">实验室数量</div>
@ -36,92 +36,65 @@
<div class="a">暂无</div>
<div class="b">暂无</div>
</div>
</div>
</div> -->
</div>
</template>
<script setup>
import { defineComponent, getCurrentInstance, onMounted, reactive } from "vue";
import { getCurrentInstance, onMounted, reactive } from "vue";
import * as echarts from "echarts";
// import { laboratory } from "@/api/website/home/index";
import {
countEnterpriseByProvince,
countEnterpriseByCity,
countEnterpriseByArea,
} from "@/api/website/home/index";
const { proxy } = getCurrentInstance();
const loading = shallowRef(true);
let treeData = {
340000: {
code: "340000",
name: "安徽省",
count: 107,
industry: { "1-1": 2, "1-2": 1, "2-1": 3 },
children: {
340100: {
code: "340100",
name: "合肥市",
count: 106,
industry: { "1-1": 1, "1-2": 1, "2-1": 2 },
children: {
340111: {
code: "340111",
name: "包河区",
count: 105,
industry: { "1-1": 1, "2-1": 1 },
children: null,
},
340121: {
code: "340121",
name: "长丰县",
count: 105,
industry: { "1-2": 1, "2-1": 1 },
children: null,
},
},
},
340200: {
code: "340200",
name: "芜湖市",
count: 105,
industry: { "1-1": 1, "2-1": 1 },
children: {},
},
},
},
500000: {
code: "500000",
name: "重庆",
count: 300,
industry: null,
children: {
500100: {
code: "500100",
name: "市辖区",
count: 300,
industry: null,
children: null,
},
},
},
630000: {
code: "630000",
name: "青海省",
count: 1200,
industry: null,
children: {
630200: {
code: "630200",
name: "海东市",
count: 1200,
industry: null,
children: null,
},
},
},
};
const snapTree = shallowRef({});
let treeData = [];
const snapTree = shallowRef([]);
function searchRegionData(code) {
// console.log(code, treeData,'searchRegionData')
return deepFindTree(code, treeData);
}
const searchRegionData = async (code, level) => {
if (level == "province") {
const provcode = code.substring(0, 2) + "0000";
let data = {};
if (
snapTree.value.length &&
snapTree.value[0].code.substring(0, 2) == code.substring(0, 2) &&
snapTree.value[0].code.substring(2, 4) != code.substring(2, 4)
) {
data = snapTree.value;
} else {
const resp = await countEnterpriseByCity(provcode);
snapTree.value = resp.data;
data = resp.data;
}
return data.find((item) => item.code == code) || false;
} else if (level == "city") {
const ctcode = code.substring(0, 4) + "00";
let data = {};
if (
snapTree.value.length &&
snapTree.value[0].code.substring(0, 4) == code.substring(0, 4) &&
snapTree.value[0].code.substring(4, 6) != code.substring(4, 6)
) {
data = snapTree.value;
} else {
const resp = await countEnterpriseByArea(ctcode);
snapTree.value = resp.data;
data = resp.data;
}
return data.find((item) => item.code == code) || false;
} else {
if (treeData.length) {
return treeData.find((item) => item.code == code) || false;
} else {
const { data } = await countEnterpriseByProvince();
return data.find((item) => item.code == code) || false;
}
}
};
function deepFindTree(code, tree) {
let snap = false;
@ -200,24 +173,11 @@ const state = reactive({
onMounted(() => {
// 数据接口
const res = { code: 200, message: "ok", data: {} };
// laboratory().then((res) => {
// if (200 == res.code) {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
// }
// });
// let echartsDomList = document.querySelectorAll('.echartsDom');
// // 兼容echarts
// echartsDomList.forEach(element => {
// element.style.zoom = window.devicePixelRatio;
// element.style.transform = "scale(" + (1 / window.devicePixelRatio) + ")";
// element.style.transformOrigin = "0%0%";
// element.style.width = window.devicePixelRatio * 100 + '%';
// element.style.height = window.devicePixelRatio * 100 + '%';
// console.log(element.style.zoom, 'element.style.zoom')
// });
countEnterpriseByProvince().then((resp) => {
treeData = resp.data;
snapTree.value = resp.data;
loading.value = false;
});
let height = document.body.clientHeight;
let width = document.body.clientWidth;
@ -249,15 +209,15 @@ onMounted(() => {
function goBack() {
state.isShowGoBack = false;
loading.value = true;
state.district.search("中国", (status, result) => {
state.district.search("中国", async (status, result) => {
if (status == "complete") {
getData(result.districtList[0], "", 100000);
await getData(result.districtList[0], "", 100000);
snapTree.value = treeData;
}
});
}
function echartsMapClick(params) {
async function echartsMapClick(params) {
//地图点击事件
if (params.data.cityCode == "710000") {
return;
@ -267,11 +227,11 @@ function echartsMapClick(params) {
}
if (params.data.level == "street") return; //此处的params.data为state.mapData里的数据
let snap = searchRegionData(params.data.cityCode);
snapTree.value = {};
if (snap) {
snapTree.value = snap["children"];
}
await searchRegionData(params.data.cityCode, params.data.level);
// snapTree.value = {};
// if (snap) {
// snapTree.value = snap["children"];
// }
state.cityCode = params.data.cityCode;
state.cityName = params.data.name;
state.district.setLevel(params.data.level); //行政区级别
@ -291,7 +251,7 @@ function echartsMapClick(params) {
});
}
function getData(data, level, adcode) {
async function getData(data, level, adcode) {
//处理获取出来的边界数据
var subList = data.districtList;
if (subList) {
@ -306,7 +266,7 @@ function getData(data, level, adcode) {
}
}
state.mapData = [];
let item = searchRegionData(cityCode);
let item = await searchRegionData(cityCode, level);
if (item) {
console.log("1 searchRegionData(cityCode)", item);
}
@ -327,7 +287,7 @@ function getData(data, level, adcode) {
var name = subList[i].name;
var cityCode = subList[i].adcode;
//这个mapData里包含每个区域的code、名称、对应的等级实现第三步功能时能用上
let item = searchRegionData(cityCode);
let item = await searchRegionData(cityCode, level);
if (item) {
console.log("2 searchRegionData(cityCode)", item);

View File

@ -20,7 +20,7 @@
<div class="b">暂无</div>
</div>
</div>
<div class="rightBox">
<!-- <div class="rightBox">
<div class="head">
<div class="a">领域</div>
<div class="b">成果数量</div>
@ -36,92 +36,66 @@
<div class="a">暂无</div>
<div class="b">暂无</div>
</div>
</div>
</div> -->
</div>
</template>
<script setup>
import { defineComponent, getCurrentInstance, onMounted, reactive } from "vue";
import {
countAchievementByProvince,
countAchievementByCity,
countAchievementByArea,
} from "@/api/website/home/index";
import * as echarts from "echarts";
// import { achievement } from "@/api/website/home/index";
const { proxy } = getCurrentInstance();
const loading = shallowRef(true);
let treeData = {
340000: {
code: "340000",
name: "安徽省",
count: 107,
industry: { "1-1": 2, "1-2": 1, "2-1": 3 },
children: {
340100: {
code: "340100",
name: "合肥市",
count: 106,
industry: { "1-1": 1, "1-2": 1, "2-1": 2 },
children: {
340111: {
code: "340111",
name: "包河区",
count: 105,
industry: { "1-1": 1, "2-1": 1 },
children: null,
},
340121: {
code: "340121",
name: "长丰县",
count: 105,
industry: { "1-2": 1, "2-1": 1 },
children: null,
},
},
},
340200: {
code: "340200",
name: "芜湖市",
count: 105,
industry: { "1-1": 1, "2-1": 1 },
children: {},
},
},
},
500000: {
code: "500000",
name: "重庆",
count: 300,
industry: null,
children: {
500100: {
code: "500100",
name: "市辖区",
count: 300,
industry: null,
children: null,
},
},
},
630000: {
code: "630000",
name: "青海省",
count: 1200,
industry: null,
children: {
630200: {
code: "630200",
name: "海东市",
count: 1200,
industry: null,
children: null,
},
},
},
};
const snapTree = shallowRef({});
let treeData = [];
const snapTree = shallowRef([]);
function searchRegionData(code) {
// console.log(code, treeData,'searchRegionData')
return deepFindTree(code, treeData);
}
const searchRegionData = async (code, level) => {
if (level == "province") {
const provcode = code.substring(0, 2) + "0000";
let data = {};
if (
snapTree.value.length &&
snapTree.value[0].code.substring(0, 2) == code.substring(0, 2) &&
snapTree.value[0].code.substring(2, 4) != code.substring(2, 4)
) {
data = snapTree.value;
} else {
const resp = await countAchievementByCity(provcode);
snapTree.value = resp.data;
data = resp.data;
}
return data.find((item) => item.code == code) || false;
} else if (level == "city") {
const ctcode = code.substring(0, 4) + "00";
let data = {};
if (
snapTree.value.length &&
snapTree.value[0].code.substring(0, 4) == code.substring(0, 4) &&
snapTree.value[0].code.substring(4, 6) != code.substring(4, 6)
) {
data = snapTree.value;
} else {
const resp = await countAchievementByArea(ctcode);
snapTree.value = resp.data;
data = resp.data;
}
return data.find((item) => item.code == code) || false;
} else {
if (treeData.length) {
return treeData.find((item) => item.code == code) || false;
} else {
const { data } = await countAchievementByProvince();
return data.find((item) => item.code == code) || false;
}
}
};
function deepFindTree(code, tree) {
let snap = false;
@ -200,122 +174,12 @@ const state = reactive({
onMounted(() => {
// 数据接口
const res = {
code: 200,
message: "ok",
data: {
220000: {
code: "220000",
name: "吉林省",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 12,
"电子信息-农业": 12,
航空航天: 12,
},
children: {
220700: {
code: "220700",
name: "松原市",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 12,
"电子信息-农业": 12,
航空航天: 12,
},
children: {
220771: {
code: "220771",
name: "吉林松原经济开发区",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 12,
"电子信息-农业": 12,
航空航天: 12,
},
children: null,
},
},
},
},
},
340000: {
code: "340000",
name: "安徽省",
count: 2,
industry: {
"生物与新医药-煤炭开采和洗选业": 48,
"电子信息-农业": 48,
航空航天: 48,
},
children: {
340100: {
code: "340100",
name: "合肥市",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 12,
"电子信息-农业": 12,
航空航天: 12,
},
children: {
340171: {
code: "340171",
name: "合肥高新技术产业开发区",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 12,
"电子信息-农业": 12,
航空航天: 12,
},
children: null,
},
},
},
340800: {
code: "340800",
name: "安庆市",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 36,
"电子信息-农业": 36,
航空航天: 36,
},
children: {
340826: {
code: "340826",
name: "宿松县",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 36,
"电子信息-农业": 36,
航空航天: 36,
},
children: null,
},
},
},
},
},
},
};
// achievement().then((res) => {
// if (200 == res.code) {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
// }
// });
// let echartsDomList = document.querySelectorAll('.echartsDom');
// // 兼容echarts
// echartsDomList.forEach(element => {
// element.style.zoom = window.devicePixelRatio;
// element.style.transform = "scale(" + (1 / window.devicePixelRatio) + ")";
// element.style.transformOrigin = "0%0%";
// element.style.width = window.devicePixelRatio * 100 + '%';
// element.style.height = window.devicePixelRatio * 100 + '%';
// console.log(element.style.zoom, 'element.style.zoom')
// });
const res = [];
countAchievementByProvince().then((resp) => {
treeData = resp.data;
snapTree.value = resp.data;
loading.value = false;
});
let height = document.body.clientHeight;
let width = document.body.clientWidth;
@ -347,15 +211,15 @@ onMounted(() => {
function goBack() {
state.isShowGoBack = false;
loading.value = true;
state.district.search("中国", (status, result) => {
state.district.search("中国", async (status, result) => {
if (status == "complete") {
getData(result.districtList[0], "", 100000);
await getData(result.districtList[0], "", 100000);
snapTree.value = treeData;
}
});
}
function echartsMapClick(params) {
async function echartsMapClick(params) {
//地图点击事件
if (params.data.cityCode == "710000") {
return;
@ -365,11 +229,8 @@ function echartsMapClick(params) {
}
if (params.data.level == "street") return; //此处的params.data为state.mapData里的数据
let snap = searchRegionData(params.data.cityCode);
snapTree.value = {};
if (snap) {
snapTree.value = snap["children"];
}
await searchRegionData(params.data.cityCode, params.data.level);
state.cityCode = params.data.cityCode;
state.cityName = params.data.name;
state.district.setLevel(params.data.level); //行政区级别
@ -389,7 +250,7 @@ function echartsMapClick(params) {
});
}
function getData(data, level, adcode) {
async function getData(data, level, adcode) {
//处理获取出来的边界数据
var subList = data.districtList;
if (subList) {
@ -404,7 +265,7 @@ function getData(data, level, adcode) {
}
}
state.mapData = [];
let item = searchRegionData(cityCode);
let item = await searchRegionData(cityCode, level);
if (item) {
console.log("1 searchRegionData(cityCode)", item);
}
@ -425,7 +286,7 @@ function getData(data, level, adcode) {
var name = subList[i].name;
var cityCode = subList[i].adcode;
//这个mapData里包含每个区域的code、名称、对应的等级实现第三步功能时能用上
let item = searchRegionData(cityCode);
let item = await searchRegionData(cityCode, level);
if (item) {
console.log("2 searchRegionData(cityCode)", item);

View File

@ -20,7 +20,7 @@
<div class="b">暂无</div>
</div>
</div>
<div class="rightBox">
<!-- <div class="rightBox">
<div class="head">
<div class="a">领域</div>
<div class="b">需求数量</div>
@ -36,92 +36,65 @@
<div class="a">暂无</div>
<div class="b">暂无</div>
</div>
</div>
</div> -->
</div>
</template>
<script setup>
import { defineComponent, getCurrentInstance, onMounted, reactive } from "vue";
import * as echarts from "echarts";
import {
countDemandByProvince,
countDemandByCity,
countDemandByArea,
} from "@/api/website/home/index";
// import { demand } from "@/api/website/home/index";
const { proxy } = getCurrentInstance();
const loading = shallowRef(true);
let treeData = {
340000: {
code: "340000",
name: "安徽省",
count: 107,
industry: { "1-1": 2, "1-2": 1, "2-1": 3 },
children: {
340100: {
code: "340100",
name: "合肥市",
count: 106,
industry: { "1-1": 1, "1-2": 1, "2-1": 2 },
children: {
340111: {
code: "340111",
name: "包河区",
count: 105,
industry: { "1-1": 1, "2-1": 1 },
children: null,
},
340121: {
code: "340121",
name: "长丰县",
count: 105,
industry: { "1-2": 1, "2-1": 1 },
children: null,
},
},
},
340200: {
code: "340200",
name: "芜湖市",
count: 105,
industry: { "1-1": 1, "2-1": 1 },
children: {},
},
},
},
500000: {
code: "500000",
name: "重庆",
count: 300,
industry: null,
children: {
500100: {
code: "500100",
name: "市辖区",
count: 300,
industry: null,
children: null,
},
},
},
630000: {
code: "630000",
name: "青海省",
count: 1200,
industry: null,
children: {
630200: {
code: "630200",
name: "海东市",
count: 1200,
industry: null,
children: null,
},
},
},
};
const snapTree = shallowRef({});
let treeData = [];
const snapTree = shallowRef([]);
function searchRegionData(code) {
// console.log(code, treeData,'searchRegionData')
return deepFindTree(code, treeData);
}
const searchRegionData = async (code, level) => {
if (level == "province") {
const provcode = code.substring(0, 2) + "0000";
let data = {};
if (
snapTree.value.length &&
snapTree.value[0].code.substring(0, 2) == code.substring(0, 2) &&
snapTree.value[0].code.substring(2, 4) != code.substring(2, 4)
) {
data = snapTree.value;
} else {
const resp = await countDemandByCity(provcode);
snapTree.value = resp.data;
data = resp.data;
}
return data.find((item) => item.code == code) || false;
} else if (level == "city") {
const ctcode = code.substring(0, 4) + "00";
let data = {};
if (
snapTree.value.length &&
snapTree.value[0].code.substring(0, 4) == code.substring(0, 4) &&
snapTree.value[0].code.substring(4, 6) != code.substring(4, 6)
) {
data = snapTree.value;
} else {
const resp = await countDemandByArea(ctcode);
snapTree.value = resp.data;
data = resp.data;
}
return data.find((item) => item.code == code) || false;
} else {
if (treeData.length) {
return treeData.find((item) => item.code == code) || false;
} else {
const { data } = await countDemandByProvince();
return data.find((item) => item.code == code) || false;
}
}
};
function deepFindTree(code, tree) {
let snap = false;
@ -201,13 +174,11 @@ const state = reactive({
onMounted(() => {
// 数据接口
const res = { code: 200, message: "ok", data: {} };
// demand().then((res) => {
// if (200 == res.code) {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
// }
// });
countDemandByProvince().then((res) => {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
});
// let echartsDomList = document.querySelectorAll('.echartsDom');
// // 兼容echarts
// echartsDomList.forEach(element => {
@ -249,15 +220,15 @@ onMounted(() => {
function goBack() {
state.isShowGoBack = false;
loading.value = true;
state.district.search("中国", (status, result) => {
state.district.search("中国", async (status, result) => {
if (status == "complete") {
getData(result.districtList[0], "", 100000);
await getData(result.districtList[0], "", 100000);
snapTree.value = treeData;
}
});
}
function echartsMapClick(params) {
async function echartsMapClick(params) {
//地图点击事件
if (params.data.cityCode == "710000") {
return;
@ -267,11 +238,11 @@ function echartsMapClick(params) {
}
if (params.data.level == "street") return; //此处的params.data为state.mapData里的数据
let snap = searchRegionData(params.data.cityCode);
snapTree.value = {};
if (snap) {
snapTree.value = snap["children"];
}
await searchRegionData(params.data.cityCode, params.data.level);
// snapTree.value = {};
// if (snap) {
// snapTree.value = snap["children"];
// }
state.cityCode = params.data.cityCode;
state.cityName = params.data.name;
state.district.setLevel(params.data.level); //行政区级别
@ -291,7 +262,7 @@ function echartsMapClick(params) {
});
}
function getData(data, level, adcode) {
async function getData(data, level, adcode) {
//处理获取出来的边界数据
var subList = data.districtList;
if (subList) {
@ -306,7 +277,7 @@ function getData(data, level, adcode) {
}
}
state.mapData = [];
let item = searchRegionData(cityCode);
let item = await searchRegionData(cityCode, level);
if (item) {
console.log("1 searchRegionData(cityCode)", item);
}
@ -327,7 +298,7 @@ function getData(data, level, adcode) {
var name = subList[i].name;
var cityCode = subList[i].adcode;
//这个mapData里包含每个区域的code、名称、对应的等级实现第三步功能时能用上
let item = searchRegionData(cityCode);
let item = await searchRegionData(cityCode, level);
if (item) {
console.log("2 searchRegionData(cityCode)", item);

View File

@ -20,7 +20,7 @@
<div class="b">暂无</div>
</div>
</div>
<div class="rightBox">
<!-- <div class="rightBox">
<div class="head">
<div class="a">领域</div>
<div class="b">企业数量</div>
@ -36,92 +36,66 @@
<div class="a">暂无</div>
<div class="b">暂无</div>
</div>
</div>
</div> -->
</div>
</template>
<script setup>
import { defineComponent, getCurrentInstance, onMounted, reactive } from "vue";
import * as echarts from "echarts";
import {
countEnterpriseByProvince,
countEnterpriseByCity,
countEnterpriseByArea,
} from "@/api/website/home/index";
// import { company } from "@/api/website/home/index";
const { proxy } = getCurrentInstance();
const loading = shallowRef(true);
let treeData = {
340000: {
code: "340000",
name: "安徽省",
count: 107,
industry: { "1-1": 2, "1-2": 1, "2-1": 3 },
children: {
340100: {
code: "340100",
name: "合肥市",
count: 106,
industry: { "1-1": 1, "1-2": 1, "2-1": 2 },
children: {
340111: {
code: "340111",
name: "包河区",
count: 105,
industry: { "1-1": 1, "2-1": 1 },
children: null,
},
340121: {
code: "340121",
name: "长丰县",
count: 105,
industry: { "1-2": 1, "2-1": 1 },
children: null,
},
},
},
340200: {
code: "340200",
name: "芜湖市",
count: 105,
industry: { "1-1": 1, "2-1": 1 },
children: {},
},
},
},
500000: {
code: "500000",
name: "重庆",
count: 300,
industry: null,
children: {
500100: {
code: "500100",
name: "市辖区",
count: 300,
industry: null,
children: null,
},
},
},
630000: {
code: "630000",
name: "青海省",
count: 1200,
industry: null,
children: {
630200: {
code: "630200",
name: "海东市",
count: 1200,
industry: null,
children: null,
},
},
},
};
const snapTree = shallowRef({});
let treeData = [];
const snapTree = shallowRef([]);
function searchRegionData(code) {
// console.log(code, treeData,'searchRegionData')
return deepFindTree(code, treeData);
}
const searchRegionData = async (code, level) => {
if (level == "province") {
const provcode = code.substring(0, 2) + "0000";
let data = {};
if (
snapTree.value.length &&
snapTree.value[0].code.substring(0, 2) == code.substring(0, 2) &&
snapTree.value[0].code.substring(2, 4) != code.substring(2, 4)
) {
data = snapTree.value;
} else {
const resp = await countEnterpriseByCity(provcode);
snapTree.value = resp.data;
data = resp.data;
}
return data.find((item) => item.code == code) || false;
} else if (level == "city") {
const ctcode = code.substring(0, 4) + "00";
let data = {};
if (
snapTree.value.length &&
snapTree.value[0].code.substring(0, 4) == code.substring(0, 4) &&
snapTree.value[0].code.substring(4, 6) != code.substring(4, 6)
) {
data = snapTree.value;
} else {
const resp = await countEnterpriseByArea(ctcode);
snapTree.value = resp.data;
data = resp.data;
}
return data.find((item) => item.code == code) || false;
} else {
if (treeData.length) {
return treeData.find((item) => item.code == code) || false;
} else {
const { data } = await countEnterpriseByProvince();
return data.find((item) => item.code == code) || false;
}
}
};
function deepFindTree(code, tree) {
let snap = false;
@ -200,189 +174,14 @@ const state = reactive({
onMounted(() => {
// 数据接口
const res = {
code: 200,
message: "ok",
data: {
110000: {
code: "110000",
name: "北京市",
count: 1,
industry: { "新能源与节能-可再生清洁能源-风能": 1 },
children: {
110100: {
code: "110100",
name: "市辖区",
count: 1,
industry: { "新能源与节能-可再生清洁能源-风能": 1 },
children: {
110102: {
code: "110102",
name: "西城区",
count: 1,
industry: { "新能源与节能-可再生清洁能源-风能": 1 },
children: null,
},
},
},
},
},
130000: {
code: "130000",
name: "河北省",
count: 1,
industry: { 资源与环境: 1 },
children: {
130300: {
code: "130300",
name: "秦皇岛市",
count: 1,
industry: { 资源与环境: 1 },
children: {
130304: {
code: "130304",
name: "北戴河区",
count: 1,
industry: { 资源与环境: 1 },
children: null,
},
},
},
},
},
220000: {
code: "220000",
name: "吉林省",
count: 1,
industry: { "生物与新医药-煤炭开采和洗选业": 1 },
children: {
220700: {
code: "220700",
name: "松原市",
count: 1,
industry: { "生物与新医药-煤炭开采和洗选业": 1 },
children: {
220771: {
code: "220771",
name: "吉林松原经济开发区",
count: 1,
industry: { "生物与新医药-煤炭开采和洗选业": 1 },
children: null,
},
},
},
},
},
310000: {
code: "310000",
name: "上海市",
count: 1,
industry: { "电子信息-农业": 1, "电子信息-林业": 1 },
children: {
310100: {
code: "310100",
name: "市辖区",
count: 1,
industry: { "电子信息-农业": 1, "电子信息-林业": 1 },
children: {
310101: {
code: "310101",
name: "黄浦区",
count: 1,
industry: { "电子信息-农业": 1, "电子信息-林业": 1 },
children: null,
},
},
},
},
},
340000: {
code: "340000",
name: "安徽省",
count: 4,
industry: {
"生物与新医药-石油和天然气开采业": 1,
"电子信息-农业": 1,
"电子信息-农业-测试名称": 3,
"电子信息-微电子技术-集成电路封装技术": 1,
"电子信息-林业": 1,
资源与环境: 1,
},
children: {
340100: {
code: "340100",
name: "合肥市",
count: 3,
industry: {
"生物与新医药-石油和天然气开采业": 1,
"电子信息-农业-测试名称": 2,
"电子信息-微电子技术-集成电路封装技术": 1,
资源与环境: 1,
},
children: {
340104: {
code: "340104",
name: "蜀山区",
count: 1,
industry: { "电子信息-农业-测试名称": 1 },
children: null,
},
340111: {
code: "340111",
name: "包河区",
count: 1,
industry: {
"电子信息-微电子技术-集成电路封装技术": 1,
资源与环境: 1,
},
children: null,
},
340171: {
code: "340171",
name: "合肥高新技术产业开发区",
count: 1,
industry: {
"生物与新医药-石油和天然气开采业": 1,
"电子信息-农业-测试名称": 1,
},
children: null,
},
},
},
340800: {
code: "340800",
name: "安庆市",
count: 1,
industry: {
"电子信息-农业": 1,
"电子信息-农业-测试名称": 1,
"电子信息-林业": 1,
},
children: {
340826: {
code: "340826",
name: "宿松县",
count: 1,
industry: {
"电子信息-农业": 1,
"电子信息-农业-测试名称": 1,
"电子信息-林业": 1,
},
children: null,
},
},
},
},
},
},
};
// company().then((res) => {
// if (200 == res.code) {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
// }
// });
countEnterpriseByProvince().then((resp) => {
// if (200 == res.code) {
treeData = resp.data;
snapTree.value = resp.data;
loading.value = false;
// }
});
// let echartsDomList = document.querySelectorAll('.echartsDom');
// // 兼容echarts
// echartsDomList.forEach(element => {
@ -424,15 +223,15 @@ onMounted(() => {
function goBack() {
state.isShowGoBack = false;
loading.value = true;
state.district.search("中国", (status, result) => {
state.district.search("中国", async (status, result) => {
if (status == "complete") {
getData(result.districtList[0], "", 100000);
await getData(result.districtList[0], "", 100000);
snapTree.value = treeData;
}
});
}
function echartsMapClick(params) {
async function echartsMapClick(params) {
//地图点击事件
if (params.data.cityCode == "710000") {
return;
@ -442,11 +241,11 @@ function echartsMapClick(params) {
}
if (params.data.level == "street") return; //此处的params.data为state.mapData里的数据
let snap = searchRegionData(params.data.cityCode);
snapTree.value = {};
if (snap) {
snapTree.value = snap["children"];
}
await searchRegionData(params.data.cityCode, params.data.level);
// snapTree.value = {};
// if (snap) {
// snapTree.value = snap["children"];
// }
state.cityCode = params.data.cityCode;
state.cityName = params.data.name;
state.district.setLevel(params.data.level); //行政区级别
@ -466,7 +265,7 @@ function echartsMapClick(params) {
});
}
function getData(data, level, adcode) {
async function getData(data, level, adcode) {
//处理获取出来的边界数据
var subList = data.districtList;
if (subList) {
@ -481,7 +280,7 @@ function getData(data, level, adcode) {
}
}
state.mapData = [];
let item = searchRegionData(cityCode);
let item = await searchRegionData(cityCode, level);
if (item) {
console.log("1 searchRegionData(cityCode)", item);
}
@ -502,7 +301,7 @@ function getData(data, level, adcode) {
var name = subList[i].name;
var cityCode = subList[i].adcode;
//这个mapData里包含每个区域的code、名称、对应的等级实现第三步功能时能用上
let item = searchRegionData(cityCode);
let item = await searchRegionData(cityCode, level);
if (item) {
console.log("2 searchRegionData(cityCode)", item);

View File

@ -49,7 +49,7 @@
</div>-->
</template>
<script setup lang="ts">
<script setup>
import {
reactive,
onMounted,
@ -67,7 +67,7 @@ import index6 from "./comp/index6.vue";
import index7 from "./comp/index7.vue";
import index8 from "./comp/index8.vue";
const loading = ref<boolean>(true);
const loading = ref(true);
setTimeout(() => {
loading.value = false;
}, 500);
@ -106,7 +106,7 @@ const pre = () => {
move(state.fullpage.current); // 执行切换
}
};
function move(index: number) {
function move(index) {
state.fullpage.isScrolling = true; // 为了防止滚动多页,需要通过一个变量来控制是否滚动
directToMove(index); //执行滚动
setTimeout(() => {
@ -114,10 +114,10 @@ function move(index: number) {
state.fullpage.isScrolling = false;
}, 1010);
}
function directToMove(index: number) {
function directToMove(index) {
let height = fullPageRef.value["clientHeight"]; //获取屏幕的宽度
// let scrollPage = proxy.$refs["fullPageContainer"]; // 获取执行tarnsform的元素
let scrollHeight: string; // 计算滚动的告诉,是往上滚还往下滚
let scrollHeight; // 计算滚动的告诉,是往上滚还往下滚
scrollHeight = -(index - 1) * height + "px";
fullPageContainerRef.value.style.transform = `translateY(${scrollHeight})`;
state.fullpage.current = index;
@ -167,11 +167,11 @@ let state = reactive({
zIndex: 1,
title: "index3",
},
{
comp: shallowRef(index4),
zIndex: 1,
title: "index4",
},
// {
// comp: shallowRef(index4),
// zIndex: 1,
// title: "index4",
// },
{
comp: shallowRef(index5),
zIndex: 1,
@ -200,7 +200,7 @@ let state = reactive({
});
// 点击 indicator 时
const handleIndicatorClick = (idx: number) => {
const handleIndicatorClick = (idx) => {
if (idx == state.fullpage.current) {
return;
} else if (idx > state.fullpage.current) {

View File

@ -0,0 +1,155 @@
<template>
<div class="innovate">
<div class="box conter1000" v-loading="loading">
<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>
<div class="_head">
<p class="text_hidden">{{ state.data.title }}</p>
<div class="_tags">
<el-tag class="x_fff x_bg_blue" size="small">{{
state.data.description
}}</el-tag>
</div>
<div class="text-right">
<el-button class="x_btns">购买服务</el-button>
</div>
</div>
<div class="_info">
<div class="_l">
<div class="html" v-html="state.data.content"></div>
</div>
<div class="_r">
<WebContact />
</div>
</div>
</div>
<webFooter></webFooter>
</div>
</template>
<script setup>
import webFooter from "@/components/webFooter/index.vue";
// import webBreadcrumb from "@/components/webBreadcrumb/index.vue";
import WebContact from "@/components/webContact/index.vue";
import { getInovateInfo } from "../../../api/website/innovate";
// import request from '@/utils/request'
// to do 创新服务详情
// function detail (id) {
// return request({
// url: '/v1/service/innovate/detail',
// method: 'post',
// data: { id }
// })
// }
const loading = ref(true);
const state = reactive({
data: {},
});
const route = useRoute();
watch(route, () => {
getData();
});
onMounted(() => {
getData();
});
function getData() {
let id = route.params.id;
if (!id) return;
getInovateInfo({ id }).then((resp) => {
// if (200 == res.code) {
state.data = resp.data;
loading.value = false;
// }
});
// .catch(() => {
// loading.value = false;
// });
}
</script>
<style lang="scss" scoped>
.innovate {
background-color: #f2f6ff;
min-height: 100%;
overflow: hidden;
display: flex;
flex-direction: column;
.box {
flex: 1;
.head {
padding: 30px 0 20px 0;
span {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
}
.one {
color: #333333;
}
}
._head {
padding: 20px;
background-color: #fff;
p {
margin: 0;
font-size: 18px;
font-weight: 500;
color: #333333;
line-height: 30px;
}
._tags {
margin: 9px 0;
}
}
._info {
display: flex;
margin-top: 16px;
margin-bottom: 35px;
._l {
width: 662px;
margin-right: 14px;
padding: 14px 40px 0 20px;
background-color: #fff;
._tit {
&::before {
content: "";
display: inline-block;
margin-right: 5px;
width: 5px;
height: 5px;
background-color: #0054ff;
vertical-align: middle;
}
}
._txt {
margin-bottom: 45px;
font-size: 14px;
font-weight: 400;
color: #666666;
line-height: 24px;
div {
color: #333333;
}
}
}
._r {
flex: 1;
background-color: #fff;
}
}
}
}
</style>

View File

@ -4,7 +4,7 @@
<div class="_l">
<div
class="_item pointer"
:class="item.id == state.kindId ? 'x_fff x_bg_blue' : ''"
:class="item.id == queryParams.kindId ? 'x_fff x_bg_blue' : ''"
v-for="item in state.kind"
:key="item.id"
@click="handleActive(item.id, item.title)"
@ -14,7 +14,7 @@
</div>
<div class="_r">
<div style="width: 70%">
<el-input v-model.trim="state.title" placeholder="请输入关键词">
<el-input v-model.trim="queryParams.title" placeholder="请输入关键词">
<template #append>
<el-button @click="handleQuery">搜索</el-button>
</template>
@ -39,8 +39,8 @@
class="pagination"
:total="state.total"
:pageSizes="state.pageSizes"
v-model:page="state.pageNum"
v-model:limit="state.pageSize"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
:autoScroll="false"
@pagination="getDataList"
/>
@ -55,55 +55,30 @@ import webFooter from "@/components/webFooter/index.vue";
import request from "@/utils/request";
import { reactive, ref } from "vue";
import { useRouter } from "vue-router";
import { getKinds, getInovateList } from "../../../api/website/innovate";
const router = useRouter();
const loading = ref(true);
const listLoading = ref(true);
const state = reactive({
kind: [],
kindId: "",
list: [],
pageNum: 1,
total: 1,
pageSize: 9,
pageSizes: [9, 9 << 1, 9 << 2, 9 << 3],
pageSizes: [5, 10, 20, 30],
title: "",
});
function kind() {
return request({
url: "/v1/service/innovate/kind",
method: "get",
});
}
function innovate() {
return request({
url: "/v1/service/innovate",
method: "post",
data: {
kind_id: state.kindId,
page_num: state.pageNum,
page_size: state.pageSize,
title: state.title,
},
});
}
const queryParams = reactive({
pageSize: 10,
pageNum: 1,
kindId: "",
});
function getDataList() {
listLoading.value = true;
const res = { code: 200, message: "ok", data: { data: [], count: 0 } };
// innovate()
// .then((res) => {
// if (200 == res.code) {
state.total = res.data.count;
state.list = res.data.data;
listLoading.value = false;
// }
// })
// .catch(() => {
// listLoading.value = false;
// });
getInovateList(queryParams).then((resp) => {
state.total = resp.total;
state.list = resp.rows;
listLoading.value = false;
});
}
onMounted(() => {
@ -112,24 +87,17 @@ onMounted(() => {
function init() {
loading.value = true;
const res = {
code: 200,
message: "ok",
data: [
{ id: "Q7K1Jx6VYodq", title: "知识产权" },
{ id: "gympJE5JrLxe", title: "技术培训" },
{ id: "pd3rJnGwE9ov", title: "产学研用" },
],
};
getKinds().then((resp) => {
state.kind = resp.data;
if (resp.data.length > 0) {
queryParams.kindId = resp.data[0].id;
getDataList();
}
loading.value = false;
});
// kind()
// .then((res) => {
// if (200 == res.code) {
state.kind = res.data;
if (res.data.length > 0) {
state.kindId = res.data[0].id;
getDataList();
}
loading.value = false;
// }
// })
// .catch(() => {
@ -143,13 +111,13 @@ function handleDetail(id) {
}
function handleActive(id, title) {
state.kindId = id;
state.pageNum = 1;
state.title = "";
queryParams.kindId = id;
queryParams.pageNum = 1;
queryParams.title = "";
getDataList();
}
function handleQuery() {
state.pageNum = 1;
queryParams.pageNum = 1;
getDataList();
}
</script>

View File

@ -1,9 +1,12 @@
<template>
<div class="box">
<div class="wrap">
<div class="img">
<div class="type">
<!-- <img :src="data.image" alt /> -->
<img src="./img/achieve.png" />
<!-- <img src="./img/achieve.png" /> -->
专利
<!-- <div class="type"> -->
<!-- </div> -->
</div>
<div class="content">
<div class="tit" @click="handleDetail(data.id)">{{ data.title }}</div>
@ -14,12 +17,12 @@
<span>{{ data.industrys[data.industrys.length - 1] }}</span>
</div>
<div class="line">
合作模式
<span>{{ data.mode_title }}</span>
公开日
<span>{{ data.openAt }}</span>
</div>
<div class="line">
技术成熟度
<span>{{ data.maturity_title }}</span>
申请人
<span>{{ data.applyName }}</span>
</div>
</div>
<div>
@ -29,13 +32,13 @@
:data="createdData(data.customers)"
></wordcloud>
</div>
<collectAndVisit
<!-- <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>
@ -54,7 +57,7 @@ const props = defineProps({
});
function handleDetail(id) {
let routeData = router.resolve({ path: `/searchList/1/detail/${id}` });
let routeData = router.resolve({ path: `/searchList/patent/detail/${id}` });
window.open(routeData.href, "_blank");
}
@ -79,16 +82,23 @@ function createdData(arr) {
.wrap {
display: flex;
flex-direction: row;
.img {
.type {
width: 200px;
height: 150px;
margin-right: 10px;
img {
display: block;
margin: 0;
width: 100%;
height: 100%;
}
background-color: #417bff;
color: white;
font-size: 36px;
font-weight: bold;
display: flex;
justify-content: center;
align-items: center;
// img {
// display: block;
// margin: 0;
// width: 100%;
// height: 100%;
// }
}
.keywords {
width: 129px;

View File

@ -97,7 +97,7 @@ const queryParams = reactive({
function handleDetail(id) {
let routeData = router.resolve({
path: `/searchList/0/detail/${id}`,
path: `/searchList/enterprise/detail/${id}`,
query: { keyword: queryParams.query },
});
window.open(routeData.href, "_blank");

View File

@ -103,14 +103,14 @@
</div>
<div class="content">
<div class="tit" @click="handleDetail(item.id)">
<div style="float: right">
<!-- <div style="float: right">
<span>匹配度</span>
<el-rate
style="display: inline-block"
v-model="state.val"
disabled
></el-rate>
</div>
</div> -->
<div class="text" style="flex: 1">
{{ item.name }}
</div>
@ -147,10 +147,12 @@
<script setup>
import webContact from "@/components/webContact/index.vue";
import request from "@/utils/request";
import { onMounted } from "vue";
import { searchEnterpriseDetail } from "@/api/website/home";
import { onMounted, reactive, ref } from "vue";
import searchContainer from "./components/searchContainer.vue";
import wordcloud from "./components/wordcloud.vue";
import productItem from "./components/productItem.vue";
import { useRoute, useRouter } from "vue-router";
const router = useRouter();
const route = useRoute();
const loading = ref(true);
@ -180,8 +182,8 @@ function recommend() {
method: "post",
data: {
mode: 1,
page_num: state.pageNum,
page_size: state.pageSize,
pageNum: state.pageNum,
pageSize: state.pageSize,
keyword: state.keyword,
},
});
@ -240,31 +242,30 @@ function handleQuery(keyword) {
function getDataList() {
loading.value = true;
recommend().then((res) => {
if (200 == res.code) {
//
state.total = res.data.count;
state.list = res.data.data;
console.log(res.data.data);
}
});
// recommend().then((res) => {
// if (200 == res.code) {
// //
// state.total = res.data.count;
// state.list = res.data.data;
// console.log(res.data.data);
// }
// });
let id = route.params.id;
if (!id) return;
company(id)
.then((res) => {
if (200 == res.code) {
state.companyDetail = res.data;
loading.value = false;
}
searchEnterpriseDetail(id)
.then((resp) => {
state.companyDetail = resp.data;
loading.value = false;
})
.catch(() => {
.catch((err) => {
console.log(err);
loading.value = false;
});
companyProduct(id).then((res) => {
if (200 == res.code) {
state.companyProduct = res.data.data;
}
});
// companyProduct(id).then((res) => {
// if (200 == res.code) {
// state.companyProduct = res.data.data;
// }
// });
}
</script>

View File

@ -52,12 +52,14 @@ import webContact from "@/components/webContact/index.vue";
import gainItem from "./components/gainItem.vue";
import loadMore from "./components/loadMore.vue";
import request from "@/utils/request";
const router = useRouter();
const route = useRoute();
import { onMounted } from "vue";
// import { onMounted } 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 { reactive, ref } from "vue";
const router = useRouter();
const route = useRoute();
const loading = ref(true);
const state = reactive({
pageNum: 1,

View File

@ -0,0 +1,415 @@
<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.patentDetail.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.patentDetail.name }}
</div>
</div>
<div class="line">
企业规模:
<span>{{ state.patentDetail.kind_title }}</span>
</div>
<div class="line">
核心产品及应用场景:
<span>{{ state.patentDetail.product }}</span>
</div>
<div class="line">
企业网站:
<a :href="state.patentDetail.url">
<span>{{ state.patentDetail.url }}</span>
</a>
</div>
</div>
<div class="keywords" style="flex: 1">
<wordcloud
v-if="state.patentDetail.keywords"
:data="createdData(state.patentDetail.keywords)"
></wordcloud>
</div>
<div class="btns">
<div class="order">预约对接</div>
<div class="share">一键分享</div>
</div>
</el-row>
</div>
<div class="product">
<div style="padding: 20px 0">
<div class="pointTit">专利描述</div>
</div>
<div class="html" v-html="state.patentDetail.description"></div>
<div style="padding: 20px 0">
<div class="pointTit">生产方向</div>
</div>
<section v-if="state.patentDetail.directions">
<div
v-for="(item, index) in state.patentDetail.directions"
:key="index"
class="describe"
>
{{ item }}
</div>
</section>
<div style="padding: 20px 0">
<div class="pointTit">产品列表</div>
</div>
<section v-for="item in state.companyProduct" :key="item.id">
<div style="border: 1px solid #dcdcdc; margin-bottom: 10px">
<productItem :data="item"></productItem>
</div>
</section>
</div>
<!-- <div style="padding: 20px 0">
<div class="pointTit">企业推荐</div>
</div>
<div>
<div class="item" v-for="item in state.list" :key="item.id">
<el-row type="flex" style="padding: 40px 20px">
<div class="img">
<img :src="item.image" alt />
</div>
<div class="content">
<div class="tit" @click="handleDetail(item.id)">
<div style="float: right">
<span>匹配度</span>
<el-rate
style="display: inline-block"
v-model="state.val"
disabled
></el-rate>
</div>
<div class="text" style="flex: 1">
{{ item.name }}
</div>
</div>
<div class="line">
企业规模
<span>{{ item.kind_title || "后台暂没提供" }}</span>
</div>
<div class="line">
核心产品及应用场景
<span>{{ item.product }}</span>
</div>
<div class="line">
企业网站
<a :href="item.url">
<span>{{ item.url || "后台暂没提供" }}</span>
</a>
</div>
</div>
<div class="keywords" style="flex: 1">
<wordcloud :data="createdData(item.keywords)"></wordcloud>
</div>
</el-row>
</div>
</div> -->
</div>
<div class="r"><webContact /></div>
</el-row>
</template>
</searchContainer>
</div>
</template>
<script setup>
import webContact from "@/components/webContact/index.vue";
import request from "@/utils/request";
import { searchPatentDetail } from "@/api/website/home";
import { onMounted, reactive, ref } from "vue";
import searchContainer from "./components/searchContainer.vue";
import wordcloud from "./components/wordcloud.vue";
import productItem from "./components/productItem.vue";
import { useRoute, useRouter } from "vue-router";
const router = useRouter();
const route = useRoute();
const loading = ref(true);
const state = reactive({
pageNum: 1,
pageSize: 4,
keyword: "",
val: 3,
patentDetail: {},
companyProduct: [],
arr: [
{
name: "Cat",
value: 26,
},
{
name: "fish",
value: 19,
},
],
});
// 建议 列表前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) {
let l = [];
let snap = JSON.parse(JSON.stringify(arr));
snap.map((e) => {
l.push({ name: e, value: 30 });
return { name: e, value: 30 };
});
return l;
}
function handleDetail(id) {
let routeData = router.resolve({
path: `/searchList/0/detail/${id}`,
query: { keyword: state.keyword },
});
window.open(routeData.href, "_blank");
}
function handleList(mode, keyword) {
router.push({ path: `/searchList/${mode}`, query: { keyword } });
}
// 首次加载数据,其后跳转页面
let flag = true;
function handleQuery(keyword) {
state.keyword = keyword;
if (flag) {
getDataList();
flag = false;
} else {
handleList(0, keyword);
}
}
function getDataList() {
loading.value = true;
// recommend().then((res) => {
// if (200 == res.code) {
// // 总条数
// state.total = res.data.count;
// state.list = res.data.data;
// console.log(res.data.data);
// }
// });
let id = route.params.id;
if (!id) return;
searchPatentDetail(id)
.then((resp) => {
state.patentDetail = resp.data;
loading.value = false;
})
.catch((err) => {
console.log(err);
loading.value = false;
});
// companyProduct(id).then((res) => {
// if (200 == res.code) {
// state.companyProduct = res.data.data;
// }
// });
}
</script>
<style lang="scss" scoped>
.head {
padding: 15px 0px;
span {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
}
.one {
color: #333333;
}
}
.r {
display: inline-block;
width: 325px;
margin-left: 14px;
min-height: 200px;
}
.product {
width: 661px;
box-sizing: border-box;
padding: 20px;
background: #fff;
.describe {
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
margin-bottom: 5px;
}
}
.pointTit {
position: relative;
padding-left: 10px;
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 500;
color: #333333;
&:before {
content: "";
top: 8px;
left: 0px;
position: absolute;
display: block;
width: 5px;
height: 5px;
background: #0054ff;
}
}
.item {
overflow: hidden;
background-color: #fff;
margin-bottom: 16px;
.btns {
overflow: hidden;
padding-top: 20px;
width: 100%;
div {
text-align: center;
float: right;
cursor: pointer;
user-select: none;
width: 101px;
height: 36px;
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 400;
line-height: 36px;
box-sizing: border-box;
&:hover {
opacity: 0.7;
}
}
.share {
color: #333333;
background: #f2f6ff;
border: 1px solid #dcdcdc;
margin-right: 10px;
}
.order {
background: #0054ff;
color: #ffffff;
border: none;
}
}
.img {
width: 90px;
margin-right: 12px;
display: flex;
align-items: center;
justify-content: center;
img {
width: 90px;
height: 90px;
border-radius: 50%;
}
}
.content {
display: inline-block;
width: 390px;
.line {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
margin: 10px 0;
span {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 500;
color: #333;
}
}
}
.keywords {
flex: 1;
width: 129px;
height: 129px;
}
.tit {
width: 100%;
overflow: hidden;
cursor: pointer;
.text {
margin-right: 200px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 20px;
font-family: Source Han Sans CN;
font-weight: bold;
color: #333333;
}
}
}
</style>

View File

@ -15,7 +15,7 @@
</el-breadcrumb>
<div>
<ul class="_list" v-loading="loading">
<li v-for="item in state.list" :key="item" @click="handlePath(item.id)">
<li v-for="item in props.data" :key="item" @click="handlePath(item.id)">
<el-image
style="width: 100%; height: 135px"
:src="item.image"
@ -26,7 +26,7 @@
</li>
</ul>
</div>
<div class="conter1400" style="position: relative">
<!-- <div class="conter1400" style="position: relative">
<pagination
:total="state.total"
:pageSizes="state.pageSizes"
@ -35,7 +35,7 @@
:autoScroll="false"
@pagination="getDataList"
/>
</div>
</div> -->
</div>
</template>
<script setup>
@ -47,34 +47,25 @@ function handlePath(id) {
let routeData = router.resolve({ path: `/solution/detail/${id}/` });
window.open(routeData.href, "_blank");
}
async function solution_case_list() {
return {
code: 200,
message: "ok",
data: {
data: [
{
id: "DXN0wBPaQldP",
title: "复杂条件下城际轨道交通地下结构施工关键技术研究",
image:
"https://www.casshare.com/upimages/upload/20220310/9784d1c88922ef03f75ebc2a2db25f14.jpg",
description: "复杂条件下城际轨道交通地下结构施工关键技术研究",
},
],
count: 1,
},
};
// return request({
// url: "/v1/service/solution_case/list",
// method: "post",
// data: {
// kind_id: props.oneLevelTitle.id,
// page_num: state.pageNum,
// page_size: state.pageSize,
// },
// });
}
const loading = ref(true);
// async function solution_case_list() {
// return {
// code: 200,
// message: "ok",
// data: {
// data: [
// {
// id: "DXN0wBPaQldP",
// title: "复杂条件下城际轨道交通地下结构施工关键技术研究",
// image:
// "https://www.casshare.com/upimages/upload/20220310/9784d1c88922ef03f75ebc2a2db25f14.jpg",
// description: "复杂条件下城际轨道交通地下结构施工关键技术研究",
// },
// ],
// count: 1,
// },
// };
// }
const loading = ref(false);
const state = reactive({
pageNum: 1,
@ -83,6 +74,7 @@ const state = reactive({
total: 0,
list: [],
});
const props = defineProps({
isShowMore: {
type: Boolean,
@ -96,28 +88,33 @@ const props = defineProps({
type: String,
default: "查看更多",
},
data: {
type: Array,
required: true,
},
});
console.log(props.data);
const emit = defineEmits();
function handleShow() {
emit("update:isShowMore", false);
}
function getDataList() {
loading.value = true;
solution_case_list()
.then((res) => {
if (200 == res.code) {
state.total = res.data.count;
state.list = res.data.data;
loading.value = false;
}
})
.catch(() => {
loading.value = false;
});
// loading.value = true;
// solution_case_list()
// .then((res) => {
// if (200 == res.code) {
// state.total = res.data.count;
// state.list = res.data.data;
// loading.value = false;
// }
// })
// .catch(() => {
// loading.value = false;
// });
}
onMounted(() => {
getDataList();
// getDataList();
});
</script>
<style lang="scss" scoped>

View File

@ -1,127 +1,125 @@
<template>
<div class="bg">
<div class="conter1400" v-loading="loading">
<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>
<div class="content">
<div class="title">
<div>{{ state.data.title }}</div>
<div class="bg">
<div class="conter1400" v-loading="loading">
<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>
<div class="content">
<div class="title">
<div>{{ state.data.title }}</div>
<div class="description">
<span class="visits">浏览量{{ state.data.visits }}</span>
<span>{{ parseTime(state.data.created_at) }}</span>
</div>
</div>
<div class="html" v-html="state.data.content"></div>
</div>
<div class="description">
<span class="visits">浏览量{{ state.data.visits }}</span>
<span>{{ parseTime(state.data.created_at) }}</span>
</div>
</div>
<webFooter></webFooter>
<div class="html" v-html="state.data.content"></div>
</div>
</div>
<webFooter></webFooter>
</div>
</template>
<script setup>
import { nextTick, onMounted } from "vue";
import seeMore from "./components/seeMore.vue";
import { getInfo } from "@/api/website/solution/index";
import webFooter from "@/components/webFooter/index.vue";
import request from '@/utils/request'
import request from "@/utils/request";
function detail (id) {
return request({
url: '/v1/service/solution_case/detail',
method: 'post',
data: { id }
})
function detail(id) {
return request({
url: "/v1/service/solution_case/detail",
method: "post",
data: { id },
});
}
const loading = ref(true);
const state = reactive({
data: {},
data: {},
});
const route = useRoute();
watch(route, () => {
getData()
})
getData();
});
onMounted(() => {
getData()
getData();
});
function getData () {
let id = route.params.id;
if (!id) return
detail(id).then(res => {
if (200 == res.code) {
state.data = res.data;
loading.value = false;
}
}).catch(() => {
loading.value = false;
function getData() {
let id = route.params.id;
if (!id) return;
getInfo({ id })
.then((resp) => {
state.data = resp.data;
loading.value = false;
})
.catch(() => {
loading.value = false;
});
}
</script>
<style lang="scss" scoped>
.bg {
background: rgba(242, 246, 255, 1);
min-height: 100%;
overflow: hidden;
display: flex;
flex-direction: column;
.conter1400 {
flex: 1;
background: rgba(242, 246, 255, 1);
min-height: 100%;
overflow: hidden;
display: flex;
flex-direction: column;
.conter1400 {
flex: 1;
}
.head {
padding: 30px 0 20px 0;
span {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
}
.head {
padding: 30px 0 20px 0;
span {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
}
.one {
color: #333333;
}
.one {
color: #333333;
}
.content {
background: #fff;
margin-bottom: 40px;
}
.content {
background: #fff;
margin-bottom: 40px;
.title,
.html {
padding: 30px 40px;
}
.title {
font-size: 18px;
font-family: Source Han Sans CN;
font-weight: 600;
color: #333333;
border-bottom: 1px solid #dcdcdc;
.description {
padding-top: 20px;
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
.visits {
display: inline-block;
width: 120px;
}
}
}
.title,
.html {
padding: 30px 40px;
}
.title {
font-size: 18px;
font-family: Source Han Sans CN;
font-weight: 600;
color: #333333;
border-bottom: 1px solid #dcdcdc;
.description {
padding-top: 20px;
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #666666;
.visits {
display: inline-block;
width: 120px;
}
}
}
}
}
</style>
<style>
</style>
<style></style>

View File

@ -62,7 +62,7 @@
<div class="_list conter1400">
<ul>
<li
v-for="child in item.children"
v-for="child in item.children.slice(0, 2)"
:key="child.id"
@click="handlePath(child.id)"
>
@ -85,6 +85,7 @@
</div>
<seeMore
v-if="isShowMore"
:data="moreData"
v-model:isShowMore="isShowMore"
v-model:oneLevelTitle="oneLevelTitle"
></seeMore>
@ -92,11 +93,12 @@
</div>
</template>
<script setup>
import { nextTick, onMounted } from "vue";
import { nextTick, onMounted, reactive } from "vue";
import seeMore from "./components/seeMore.vue";
import webFooter from "@/components/webFooter/index.vue";
import { banner } from "@/api/website/home/index";
import { useRoute, useRouter } from "vue-router";
import { getCase } from "@/api/website/solution";
const router = useRouter();
@ -104,10 +106,8 @@ function handlePath(id) {
let routeData = router.resolve({ path: `/solution/detail/${id}/` });
window.open(routeData.href, "_blank");
}
function solution_case(mode) {
return { code: 200, message: "ok", data: [] };
}
let moreData = ref([]);
const loading = ref(true);
const oneLevelTitle = ref({});
const modeDict = { small: 101, large: 102, government: 103, scientific: 104 };
@ -146,41 +146,11 @@ function initData() {
if (!name) return;
let mode = modeDict[name];
let key = keyDict[name];
let res = {};
if (name == "large") {
res = {
code: 200,
message: "ok",
data: [
{
id: "oKZkJoBa9lmX",
mode: 102,
title: "技术资讯",
image:
"https://www.casshare.com/upimages/upload/20220310/e461612dff5675507d04885174397d40.png",
description:
"内部技术成果孵化\n\n提供从顶层设计到项目市场化的\n 全套解决方案,加速大企业内部创新创业\n 提高内孵成功率\n\n 孵化机制设计咨询 商业培训资源对接\n 产品体系延伸拓展 项目落地渠道对接",
children: [
{
id: "DXN0wBPaQldP",
title: "复杂条件下城际轨道交通地下结构施工关键技术研究",
image:
"https://www.casshare.com/upimages/upload/20220310/9784d1c88922ef03f75ebc2a2db25f14.jpg",
description: "复杂条件下城际轨道交通地下结构施工关键技术研究",
},
],
},
],
};
} else {
res = { code: 200, message: "ok", data: [] };
}
// solution_case(mode).then((res) => {
// if (200 == res.code) {
state.caseList = res.data;
initScroll();
// }
// });
getCase({ mode }).then((res) => {
state.caseList = res.data;
initScroll();
});
loading.value = true;
banner({ locals: key })
.then((resp) => {
@ -230,7 +200,6 @@ function setScrollTop(id, index) {
isShowMore.value = false;
nextTick(() => {
window.scrollTo({
// - 80
top: itemRefs[index].offsetTop,
});
});
@ -240,6 +209,8 @@ function isOddEvenNumber(num) {
return num % 2 == 0 ? false : true;
}
function handleShowMore(item) {
console.log(item);
moreData.value = item.children;
oneLevelTitle.value = item;
window.scrollTo({
top: 0,

View File

@ -1,27 +1,27 @@
import { defineConfig, loadEnv } from 'vite'
import path from 'path'
import createVitePlugins from './vite/plugins'
import { defineConfig, loadEnv } from "vite";
import path from "path";
import createVitePlugins from "./vite/plugins";
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
const env = loadEnv(mode, process.cwd())
const { VITE_APP_ENV } = env
const env = loadEnv(mode, process.cwd());
const { VITE_APP_ENV } = env;
return {
// 部署生产环境和开发环境下的URL。
// 默认情况下vite 会假设你的应用是被部署在一个域名的根路径上
// 例如 https://www.ruoyi.vip/。如果应用被部署在一个子路径上,你就需要用这个选项指定这个子路径。例如,如果你的应用被部署在 https://www.ruoyi.vip/admin/,则设置 baseUrl 为 /admin/。
base: VITE_APP_ENV === 'production' ? '/' : '/',
plugins: createVitePlugins(env, command === 'build'),
base: VITE_APP_ENV === "production" ? "/" : "/",
plugins: createVitePlugins(env, command === "build"),
resolve: {
// https://cn.vitejs.dev/config/#resolve-alias
alias: {
// 设置路径
'~': path.resolve(__dirname, './'),
"~": path.resolve(__dirname, "./"),
// 设置别名
'@': path.resolve(__dirname, './src')
"@": path.resolve(__dirname, "./src"),
},
// https://cn.vitejs.dev/config/#resolve-extensions
extensions: ['.mjs', '.js', '.ts', '.jsx', '.tsx', '.json', '.vue']
extensions: [".mjs", ".js", ".ts", ".jsx", ".tsx", ".json", ".vue"],
},
// vite 相关配置
server: {
@ -30,30 +30,31 @@ export default defineConfig(({ mode, command }) => {
open: true,
proxy: {
// https://cn.vitejs.dev/config/#server-proxy
'/dev-api': {
"/dev-api": {
// target: 'http://120.26.107.74:1618',
target: 'http://172.18.3.127:1618',
target: "http://101.34.131.16:1618",
// target: 'http://172.18.3.127:1618',
changeOrigin: true,
rewrite: (p) => p.replace(/^\/dev-api/, '')
}
}
rewrite: (p) => p.replace(/^\/dev-api/, ""),
},
},
},
//fix:error:stdin>:7356:1: warning: "@charset" must be the first rule in the file
css: {
postcss: {
plugins: [
{
postcssPlugin: 'internal:charset-removal',
postcssPlugin: "internal:charset-removal",
AtRule: {
charset: (atRule) => {
if (atRule.name === 'charset') {
if (atRule.name === "charset") {
atRule.remove();
}
}
}
}
]
}
}
}
})
},
},
},
],
},
},
};
});