bug fix and performance improvements

This commit is contained in:
quantulr
2023-08-18 17:31:24 +08:00
parent b0206985cc
commit 52f9976196
9 changed files with 188 additions and 61 deletions

View File

@ -51,3 +51,11 @@ export const updateAchievement = (data) => {
data, data,
}); });
}; };
// /app/laboratory/importTemplate
export const labAchievementTemplate = () =>
request({
url: "/app/laboratory/importTemplate",
method: "GET",
responseType: "blob",
});

View File

@ -15,3 +15,10 @@ export const deleteTechnologyProject = (ids) => {
method: "DELETE", method: "DELETE",
}); });
}; };
export const researchArchievementTemplate = () =>
request({
url: "/app/research/importTemplate",
method: "GET",
responseType: "blob",
});

View File

@ -264,3 +264,24 @@ export function getCasNavigation() {
method: "get", method: "get",
}); });
} }
// /app/map/expertMap
export const getExpertMap = () =>
request({
url: "/app/map/expertMap",
method: "get",
});
// /app/map/enterpriseMap
export const getEnterpriseMap = () =>
request({
url: "/app/map/enterpriseMap",
method: "get",
});
// /app/map/achievementMap
export const getAchievementMap = () =>
request({
url: "/app/map/achievementMap",
method: "get",
});

View File

@ -31,6 +31,13 @@ const tips = {
// 下载文件出现错误,请联系管理员! // 下载文件出现错误,请联系管理员!
downloadFileError: downloadFileError:
"Ошибка загрузки файла, пожалуйста, свяжитесь с администратором!", "Ошибка загрузки файла, пожалуйста, свяжитесь с администратором!",
importTip:"Инструкция по импорту",
keywordsImportTip:
"Ключевые слова/Приложения клиентов, разделенные символом | (искусственный интеллект|квантовые вычисления)",
industryImportTip:
"Область принадлежности (>соединение уровней снизу вверх, разделенных символом |)",
industryImportExample:
'На примере: "Авиация и космонавтика>Космическая технология>Технология разработки носителей ракет|Биотехнологии и новая медицина>Традиционная медицина и природные лекарства>Технология разработки инновационных лекарств"',
}; };
export default tips; export default tips;

View File

@ -26,6 +26,11 @@ const tips = {
backendInterfaceConnectionException: "后端接口连接异常", backendInterfaceConnectionException: "后端接口连接异常",
// 下载文件出现错误,请联系管理员! // 下载文件出现错误,请联系管理员!
downloadFileError: "下载文件出现错误,请联系管理员!", downloadFileError: "下载文件出现错误,请联系管理员!",
importTip:"导入说明",
keywordsImportTip: "关键词/应用客户 多个用{'|'}隔开 (人工智能{'|'}量子计算)",
industryImportTip: "所属领域 (>拼接上下级 多个用{'|'}隔开) ",
industryImportExample:
"例如 : 航空航天>航天技术>运载火箭技术{'|'}生物与新医药>中药、天然药物>创新药物研发技术",
}; };
export default tips; export default tips;

View File

@ -368,35 +368,42 @@ export const countryOptions = [
key: "zh", key: "zh",
zh: "中国", zh: "中国",
ru: "Китай", ru: "Китай",
en: "China",
}, },
{ {
key: "ru", key: "ru",
zh: "俄罗斯", zh: "俄罗斯",
ru: "Россия", ru: "Россия",
en: "Russia",
}, },
{ {
key: "tj", key: "tj",
zh: "塔吉克斯坦", zh: "塔吉克斯坦",
ru: "Таджикистан", ru: "Таджикистан",
en: "Tajikistan",
}, },
{ {
key: "tm", key: "tm",
zh: "土库曼斯坦", zh: "土库曼斯坦",
ru: "Туркменистан", ru: "Туркменистан",
en: "Turkmenistan",
}, },
{ {
key: "uz", key: "uz",
zh: "乌兹别克斯坦", zh: "乌兹别克斯坦",
ru: "Узбекистан", ru: "Узбекистан",
en: "Uzbekistan",
}, },
{ {
key: "kz", key: "kz",
zh: "哈萨克斯坦", zh: "哈萨克斯坦",
ru: "Казахстан", ru: "Казахстан",
en: "Kazakhstan",
}, },
{ {
key: "kg", key: "kg",
zh: "吉尔吉斯斯坦", zh: "吉尔吉斯斯坦",
ru: "Кыргызстан", ru: "Кыргызстан",
} en: "Kyrgyzstan",
},
]; ];

View File

@ -40,16 +40,19 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<!-- <el-col v-if="route.name === 'LabAchievement'" :span="1.5">--> <el-col
<!-- <el-button--> v-if="route.name === 'LabAchievement' && locale === 'zh'"
<!-- icon="UploadFilled"--> :span="1.5"
<!-- size="small"--> >
<!-- type="primary"--> <el-button
<!-- @click="handleImport"--> icon="UploadFilled"
<!-- >{{ t("admin.form.importAchievement") }}--> size="small"
<!-- </el-button>--> type="primary"
<!-- </el-col>--> @click="handleImport"
<el-col v-if="route.name === 'LabAchievement'" :span="1.5"> >{{ t("admin.form.importAchievement") }}
</el-button>
</el-col>
<!-- <el-col v-if="route.name === 'LabAchievement'" :span="1.5">
<el-button icon="plus" size="small" type="primary" @click="handleAdd" <el-button icon="plus" size="small" type="primary" @click="handleAdd"
>{{ >{{
t("admin.form.add", { t("admin.form.add", {
@ -57,7 +60,7 @@
}) })
}} }}
</el-button> </el-button>
</el-col> </el-col>-->
<right-toolbar <right-toolbar
v-model:showSearch="showSearch" v-model:showSearch="showSearch"
@queryTable="getList" @queryTable="getList"
@ -156,25 +159,30 @@
:underline="false" :underline="false"
style="font-size: 12px; vertical-align: baseline" style="font-size: 12px; vertical-align: baseline"
type="primary" type="primary"
@click=" @click="downloadImportTemplate"
saveAs(
xlsl,
`${t('admin.common.achievementImportTemplate')}.xlsx`
)
"
>{{ t("tips.downloadTemplate") }} >{{ t("tips.downloadTemplate") }}
</el-link> </el-link>
<br />
<span>{{ t('tips.importTip') }}</span>
<ol style="text-align: left">
<li>{{ t("tips.keywordsImportTip") }}</li>
<li>
{{ t("tips.industryImportTip") }}
<br />
{{ t("tips.industryImportExample") }}
</li>
</ol>
</div> </div>
<div class="el-upload__tip text-center"> <!-- <div class="el-upload__tip text-center">-->
<span style="color: red">{{ t("tips.importInstructions") }}</span> <!-- <span style="color: red">{{ t("tips.importInstructions") }}</span>-->
<el-link <!-- <el-link-->
:underline="false" <!-- :underline="false"-->
style="font-size: 12px; vertical-align: baseline" <!-- style="font-size: 12px; vertical-align: baseline"-->
type="primary" <!-- type="primary"-->
@click="saveAs(importTip, `${t('tips.importInstructions')}.txt`)" <!-- @click="saveAs(importTip, `${t('tips.importInstructions')}.txt`)"-->
><!--下载-->{{ t("common.download") }} <!-- >&lt;!&ndash;下载&ndash;&gt;{{ t("common.download") }}-->
</el-link> <!-- </el-link>-->
</div> <!-- </div>-->
</template> </template>
</el-upload> </el-upload>
<template #footer> <template #footer>
@ -198,6 +206,7 @@ import { getCurrentInstance, reactive, ref, toRefs } from "vue";
import { import {
achievementList, achievementList,
deleteAchievements, deleteAchievements,
labAchievementTemplate,
laboratoryAchievementList, laboratoryAchievementList,
} from "@/api/admin/laboratory/achievement"; } from "@/api/admin/laboratory/achievement";
import { getToken } from "@/utils/auth"; import { getToken } from "@/utils/auth";
@ -208,7 +217,7 @@ import { useI18n } from "vue-i18n";
import dayjs from "dayjs"; import dayjs from "dayjs";
import modal from "@/plugins/modal"; import modal from "@/plugins/modal";
const { t } = useI18n(); const { t, locale } = useI18n();
const router = useRouter(); const router = useRouter();
const route = useRoute(); const route = useRoute();
@ -349,5 +358,10 @@ const handleAdd = () => {
}); });
}; };
const downloadImportTemplate = async () => {
const blob = await labAchievementTemplate();
saveAs(blob, `${t("admin.common.achievementImportTemplate")}.xlsx`);
};
getList(); getList();
</script> </script>

View File

@ -42,7 +42,7 @@
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<el-col :span="1.5"> <el-col :span="1.5">
<el-button <el-button
v-if="route.name === 'ResearchAchievement'" v-if="route.name === 'ResearchAchievement' && locale === 'zh'"
icon="UploadFilled" icon="UploadFilled"
size="small" size="small"
type="primary" type="primary"
@ -147,25 +147,30 @@
:underline="false" :underline="false"
style="font-size: 12px; vertical-align: baseline" style="font-size: 12px; vertical-align: baseline"
type="primary" type="primary"
@click=" @click="downloadImportTemplate"
saveAs(
xlsl,
`${t('admin.common.achievementImportTemplate')}.xlsx`
)
"
>{{ t("tips.downloadTemplate") }} >{{ t("tips.downloadTemplate") }}
</el-link> </el-link>
</div> </div>
<div class="el-upload__tip text-center"> <div class="el-upload__tip text-center">
<span style="color: red">{{ t("tips.importInstructions") }}</span> <br />
<el-link <span>{{ t('tips.importTip') }}</span>
:underline="false" <ol style="text-align: left">
style="font-size: 12px; vertical-align: baseline" <li>{{ t("tips.keywordsImportTip") }}</li>
type="primary" <li>
@click="saveAs(importTip, `${t('tips.importInstructions')}.txt`)" {{ t("tips.industryImportTip") }}
><!--下载--> <br />
{{ t("common.download") }} {{ t("tips.industryImportExample") }}
</el-link> </li>
</ol>
<!-- <span style="color: red">{{ t("tips.importInstructions") }}</span>-->
<!-- <el-link-->
<!-- :underline="false"-->
<!-- style="font-size: 12px; vertical-align: baseline"-->
<!-- type="primary"-->
<!-- @click="saveAs(importTip, `${t('tips.importInstructions')}.txt`)"-->
<!-- >&lt;!&ndash;下载&ndash;&gt;-->
<!-- {{ t("common.download") }}-->
<!-- </el-link>-->
</div> </div>
</template> </template>
</el-upload> </el-upload>
@ -198,9 +203,10 @@ import importTip from "@/assets/achievement_import_description.txt?url";
import { saveAs } from "file-saver"; import { saveAs } from "file-saver";
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
import dayjs from "dayjs"; import dayjs from "dayjs";
import {UploadFilled} from "@element-plus/icons-vue"; import { UploadFilled } from "@element-plus/icons-vue";
import { researchArchievementTemplate } from "@/api/admin/laboratory/research-project";
const { t } = useI18n(); const { t, locale } = useI18n();
const router = useRouter(); const router = useRouter();
const dataList = ref([]); const dataList = ref([]);
@ -320,5 +326,10 @@ function submitFileForm() {
uploadRef.value.submit(); uploadRef.value.submit();
} }
const downloadImportTemplate = async () => {
const blob = await researchArchievementTemplate();
saveAs(blob, `${t("admin.common.achievementImportTemplate")}.xlsx`);
};
getList(); getList();
</script> </script>

View File

@ -15,6 +15,9 @@ import {
countExpertByArea, countExpertByArea,
countExpertByCity, countExpertByCity,
countExpertByProvince, countExpertByProvince,
getAchievementMap,
getEnterpriseMap,
getExpertMap,
} from "@/api/website/home"; } from "@/api/website/home";
import backBtnPng from "@/assets/images/map_back.png"; import backBtnPng from "@/assets/images/map_back.png";
import RegionPagine from "@/views/website/home/comp/RegionPagine.vue"; import RegionPagine from "@/views/website/home/comp/RegionPagine.vue";
@ -22,6 +25,7 @@ import html2canvas from "html2canvas";
import anime from "animejs"; import anime from "animejs";
import { useI18n } from "vue-i18n"; import { useI18n } from "vue-i18n";
import geoJSONRU from "@/assets/world.json"; import geoJSONRU from "@/assets/world.json";
import { countryOptions } from "@/utils/parameter";
const { t, locale } = useI18n(); const { t, locale } = useI18n();
const leftBoxPageNum = ref(1); const leftBoxPageNum = ref(1);
@ -43,6 +47,7 @@ const methods = [
{ {
name: "expert", name: "expert",
title: computed(() => t("map.expertMap")), title: computed(() => t("map.expertMap")),
method: getExpertMap,
byProvince: countExpertByProvince, byProvince: countExpertByProvince,
byCity: countExpertByCity, byCity: countExpertByCity,
byArea: countExpertByArea, byArea: countExpertByArea,
@ -51,6 +56,7 @@ const methods = [
name: "technology", name: "technology",
// title: "技术分布地图", // title: "技术分布地图",
title: computed(() => t("map.technologyMap")), title: computed(() => t("map.technologyMap")),
method: getAchievementMap,
byProvince: countAchievementByProvince, byProvince: countAchievementByProvince,
byCity: countAchievementByCity, byCity: countAchievementByCity,
byArea: countAchievementByArea, byArea: countAchievementByArea,
@ -67,6 +73,7 @@ const methods = [
name: "enterprise", name: "enterprise",
// title: "企业分布地图", // title: "企业分布地图",
title: computed(() => t("map.companyMap")), title: computed(() => t("map.companyMap")),
method: getEnterpriseMap,
byProvince: countEnterpriseByProvince, byProvince: countEnterpriseByProvince,
byCity: countEnterpriseByCity, byCity: countEnterpriseByCity,
byArea: countEnterpriseByArea, byArea: countEnterpriseByArea,
@ -109,7 +116,8 @@ const options = {
tooltip: { tooltip: {
//提示框信息 //提示框信息
trigger: "item", trigger: "item",
formatter: "{b}\n{c}", formatter: "{b}\n{c}",
valueFormatter: (value) => (value + locale.value === "zh" ? "人" : "людей"),
}, },
series: [ series: [
{ {
@ -204,7 +212,7 @@ const loadChinaDistrict = (adcode) => {
}); });
}; };
const loadRussiaDistrict = () => { const loadI18nDistrict = async () => {
mapData.value = geoJSONRU.features.map((el) => { mapData.value = geoJSONRU.features.map((el) => {
const areaProp = el.properties; const areaProp = el.properties;
return { return {
@ -213,6 +221,40 @@ const loadRussiaDistrict = () => {
}; };
}); });
registerMap("map", { geoJSON: geoJSONRU, specialAreas: {} }); registerMap("map", { geoJSON: geoJSONRU, specialAreas: {} });
myEcharts.value.setOption(options);
let result;
try {
result = await methods[mapIndex.value]["method"]();
} catch (e) {
result = { data: {} };
}
areaCount.value =
result?.data?.count?.map((el) => {
return {
name: countryOptions.find((ct) => el.country === ct.key)?.[
locale.value
],
count: el.count,
};
}) ?? [];
industryCount.value = Object.keys(result.data?.industry ?? {}).map(
(key) => ({
name: key,
count: result.data.industry[key],
})
);
mapData.value = geoJSONRU.features.map((el) => {
const areaProp = el.properties;
return {
name: areaProp.name,
value:
result.data?.count?.find(
(el) =>
countryOptions.find((ct) => ct.key === el.country)?.en ===
areaProp.name
)?.count ?? 0,
};
});
options.series[0].data = mapData.value; options.series[0].data = mapData.value;
myEcharts.value.setOption(options); myEcharts.value.setOption(options);
// TODO:get count // TODO:get count
@ -231,7 +273,7 @@ onMounted(async () => {
// loadChinaDistrict("100000"); // loadChinaDistrict("100000");
// } else { // } else {
// } // }
loadRussiaDistrict(); loadI18nDistrict();
}); });
/** /**
@ -267,7 +309,10 @@ const playScrollAnimation = (direction, start) => {
html2canvas(pageWrap, { html2canvas(pageWrap, {
// width: pageWrap.offsetWidth / 5, // width: pageWrap.offsetWidth / 5,
// height: pageWrap.offsetHeight / 5, // height: pageWrap.offsetHeight / 5,
scale: 1 / 5,
}).then((canvas) => { }).then((canvas) => {
canvas.style.width = "100%";
canvas.style.height = "100%";
canvas.addEventListener("wheel", (ev) => { canvas.addEventListener("wheel", (ev) => {
ev.stopPropagation(); ev.stopPropagation();
ev.preventDefault(); ev.preventDefault();
@ -328,7 +373,7 @@ watch(mapIndex, (newVal, oldVal) => {
// if (locale.value === "zh") { // if (locale.value === "zh") {
// loadChinaDistrict("100000"); // loadChinaDistrict("100000");
// } else { // } else {
loadRussiaDistrict(); loadI18nDistrict();
// } // }
}); });
@ -349,9 +394,9 @@ watch(mapIndex, (newVal, oldVal) => {
<div class="title">{{ methods[mapIndex].title.value }}</div> <div class="title">{{ methods[mapIndex].title.value }}</div>
<div v-if="loading" class="loading-modal"></div> <div v-if="loading" class="loading-modal"></div>
<!-- 返回上一级按钮 --> <!-- 返回上一级按钮 -->
<div class="back-btn" @click=""> <!-- <div class="back-btn" @click="">
<img :src="backBtnPng" alt="back" /> <img :src="backBtnPng" alt="back" />
</div> </div>-->
<!-- 人数表格 --> <!-- 人数表格 -->
<div class="count-table area"> <div class="count-table area">
<div class="table"> <div class="table">
@ -529,7 +574,9 @@ watch(mapIndex, (newVal, oldVal) => {
} }
.title { .title {
width: 160px;
border-right: 1px solid #0054ff; border-right: 1px solid #0054ff;
word-break: break-all;
} }
} }