bugfix and performance improvements

This commit is contained in:
quantulr
2023-08-04 17:26:52 +08:00
parent 57d8eff653
commit 7958e48512
58 changed files with 1200 additions and 770 deletions

View File

@ -1,6 +1,6 @@
:8007 {
handle_path /api/* {
reverse_proxy http://192.168.0.201:1618
:8006 {
handle /api/* {
reverse_proxy http://101.34.251.155
}
handle {
root * "/Volumes/iMac Doc/WebstormProjects/cas_cloud_web_i18n/dist"

View File

@ -222,7 +222,7 @@
<div id="loader"></div>
<div class="loader-section section-left"></div>
<div class="loader-section section-right"></div>
<div class="load_title">正在加载系统资源,请耐心等待</div>
<!--<div class="load_title">正在加载系统资源,请耐心等待</div>-->
</div>
</div>
<script src="/src/main.js" type="module"></script>

View File

@ -24,3 +24,30 @@ export const deleteAchievements = (ids) => {
method: "DELETE",
});
};
// 实验室成果详情
export const achievementInfo = (params) => {
return request({
url: `/app/laboratory/achievementInfo`,
method: "GET",
params,
});
};
// 实验室成果新增
export const insertAchievement = (data) => {
return request({
url: `/app/laboratory/insertAchievement`,
method: "POST",
data,
});
};
// 实验室成果修改
export const updateAchievement = (data) => {
return request({
url: `/app/laboratory/updateAchievement`,
method: "PUT",
data,
});
};

View File

@ -7,6 +7,7 @@ export function getAllCount() {
method: "get",
});
}
// 分布专家信息
export function getExpert() {
return request({
@ -14,6 +15,7 @@ export function getExpert() {
method: "get",
});
}
// 分布实验室信息
export function laboratory() {
return request({
@ -62,6 +64,7 @@ export function industry() {
method: "get",
});
}
// 客户端搜索
export function search(params) {
return request({
@ -70,6 +73,7 @@ export function search(params) {
params,
});
}
// 客户端专利搜索结果详情
export function searchPatentDetail(id) {
return request({
@ -77,6 +81,7 @@ export function searchPatentDetail(id) {
method: "get",
});
}
// 客户端企业搜索结果详情
export function searchEnterpriseDetail(id) {
return request({
@ -84,6 +89,7 @@ export function searchEnterpriseDetail(id) {
method: "get",
});
}
// 客户端成果搜索结果详情
export function searchAchievementDetail(id) {
return request({
@ -91,6 +97,14 @@ export function searchAchievementDetail(id) {
method: "get",
});
}
export function searchProductDetail(id) {
return request({
url: `/search/enterpriseProduct/${id}`,
method: "get",
});
}
// 客户端实验室搜索结果详情
export function searchLaboratoryDetail(id) {
return request({
@ -98,6 +112,7 @@ export function searchLaboratoryDetail(id) {
method: "get",
});
}
// 客户端专家搜索结果详情
export function searchExpertDetail(id) {
return request({
@ -105,6 +120,7 @@ export function searchExpertDetail(id) {
method: "get",
});
}
// 客户端服务需求搜索结果详情
export function searchServiceDemandDetail(id) {
return request({
@ -128,6 +144,7 @@ export function countExpertByProvince() {
method: "get",
});
}
// 获取[市]专家分布
export function countExpertByCity(provinceCode) {
return request({
@ -138,6 +155,7 @@ export function countExpertByCity(provinceCode) {
},
});
}
// 获取[县]专家分布
export function countExpertByArea(cityCode) {
return request({
@ -148,6 +166,7 @@ export function countExpertByArea(cityCode) {
},
});
}
// 获取[省]企业分布
export function countEnterpriseByProvince() {
return request({
@ -155,6 +174,7 @@ export function countEnterpriseByProvince() {
method: "get",
});
}
// 获取[市]企业分布
export function countEnterpriseByCity(provinceCode) {
return request({
@ -165,6 +185,7 @@ export function countEnterpriseByCity(provinceCode) {
},
});
}
// 获取[县]企业分布
export function countEnterpriseByArea(cityCode) {
return request({
@ -175,6 +196,7 @@ export function countEnterpriseByArea(cityCode) {
},
});
}
// 获取[省]需求分布
export function countDemandByProvince() {
return request({
@ -182,6 +204,7 @@ export function countDemandByProvince() {
method: "get",
});
}
// 获取[市]需求分布
export function countDemandByCity(provinceCode) {
return request({
@ -192,6 +215,7 @@ export function countDemandByCity(provinceCode) {
},
});
}
// 获取[县]需求分布
export function countDemandByArea(cityCode) {
return request({
@ -202,6 +226,7 @@ export function countDemandByArea(cityCode) {
},
});
}
// 获取[省]成果分布
export function countAchievementByProvince() {
return request({
@ -209,6 +234,7 @@ export function countAchievementByProvince() {
method: "get",
});
}
// 获取[市]成果分布
export function countAchievementByCity(provinceCode) {
return request({
@ -219,6 +245,7 @@ export function countAchievementByCity(provinceCode) {
},
});
}
// 获取[县]成果分布
export function countAchievementByArea(cityCode) {
return request({
@ -229,6 +256,7 @@ export function countAchievementByArea(cityCode) {
},
});
}
// 获取尾部导航
export function getCasNavigation() {
return request({

View File

@ -98,7 +98,10 @@ watch(
fileList.value = list.map((item) => {
if (typeof item === "string") {
if (item.indexOf(baseUrl) === -1) {
item = { name: baseUrl + item, url: baseUrl + item };
item = {
name: baseUrl + "/file" + item,
url: baseUrl + "/file" + item,
};
} else {
item = { name: item, url: item };
}
@ -120,7 +123,10 @@ function handleRemove(file, files) {
// 上传成功回调
function handleUploadSuccess(res) {
uploadList.value.push({ name: res.fileName, url: res.url });
uploadList.value.push({
name: res.fileName,
url: res.fileName,
});
if (uploadList.value.length === number.value) {
fileList.value = fileList.value
.filter((f) => f.url !== undefined)

View File

@ -174,7 +174,7 @@
<div class="switch-locale">
<el-button round @click="switchLocale">
<!-- {{ localeDict.find((item) => item.value === locale)?.label }}-->
{{ locale === "zh" ? "Русский" : "简体中文" }}
{{ locale === "zh" ? "ru" : "zh" }}
</el-button>
</div>
</div>
@ -216,11 +216,12 @@ watch(
pagePath.value = route.path;
const switchLocale = () => {
if (settingsStore.locale === "zh") {
settingsStore.setLocale("ru");
} else if (settingsStore.locale === "ru") {
settingsStore.setLocale("zh");
}
settingsStore.toggleLocale()
// if (settingsStore.locale === "zh") {
// settingsStore.setLocale("ru");
// } else if (settingsStore.locale === "ru") {
// settingsStore.setLocale("zh");
// }
};
function handlePage() {

View File

@ -33,7 +33,7 @@ export const serviceDemandStatusDict = [
* 技术需求dict
* @type {[{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string}]}
*/
export const technologyDemandStatusDict = [
/*export const technologyDemandStatusDict = [
{
value: "0",
label: "待受理",
@ -59,7 +59,7 @@ export const technologyDemandStatusDict = [
label: "已结束",
elTagType: "warning",
},
];
];*/
// 1->专利|2->成果|3->服务需求|4->专家|5->科研项目|6->论文
export const seeLogTypeDict = [
@ -109,12 +109,16 @@ export const orderTypeDict = [
label: "创新币充值",
i18n: "coinRecharge",
elTagType: "primary",
zh: "创新币充值",
ru: "Пополнение монеты инноваций",
},
{
value: "2",
label: "活动报名",
i18n: "activityRegistration",
elTagType: "success",
zh: "活动报名",
ru: "Регистрация на мероприятие",
},
];
@ -147,46 +151,20 @@ export const subjectRoleDict = [
label: "承担单位",
i18n: "undertakingUnit",
elTagType: "primary",
zh: "承担单位",
ru: "Исполнительная единица",
},
{
value: "2",
label: "参与单位",
i18n: "participatingUnit",
elTagType: "success",
zh: "参与单位",
ru: "Участвующая единица",
},
];
export const localeDict = [
{
value: "zh",
label: "简体中文",
},
{
value: "en",
label: "English",
},
{
value: "ru",
label: "русский",
},
{
value: "fr",
label: "français",
},
{
value: "ja",
label: "日本語",
},
];
const countryDict = [
{
zh: "中国",
ru: "Китай",
},
];
// 成果推广 关键成果解决 对接专家院士 上市辅导
/*// 成果推广 关键成果解决 对接专家院士 上市辅导
export const achievementPromotionDict = [
{
value: 1,
@ -208,7 +186,7 @@ export const achievementPromotionDict = [
label: "上市辅导",
i18n: "listingGuidance",
},
];
];*/
// 成果难题解决 成果储备/项目投资 新成果开发 检验检测
export const techinicalDemandTypeDict = [

View File

@ -92,6 +92,7 @@ const messages = {
noData: "暂无",
serviceSite: "全国服务站点",
more: "查看更多",
people: "人数",
},
activity: activity_zh,
innovation: {
@ -162,7 +163,7 @@ const messages = {
changeAvatar: "Сменить аватар",
},
footer: {
copyRight: "Все права защищены",
copyRight: "Чжункейун Авторское право",
},
webSearch: webSearch_ru,
webContact: webContact_ru,
@ -213,6 +214,8 @@ const messages = {
noData: "Нет данных",
serviceSite: "Сервисный сайт по всей стране",
more: "Подробнее",
// 人数
people: "человек",
},
activity: activity_ru,
innovation: {

View File

@ -38,7 +38,7 @@ const table = {
draftBox: "Черновик",
quickFunction: "Быстрые функции",
putOn: "В продаже",
pullOff: "Снять с продажи",
putOff: "Снять с продажи",
claim: "Претензия",
startDate: "Дата начала",
endDate: "Дата окончания",

View File

@ -38,7 +38,7 @@ const table = {
draftBox: "草稿箱",
quickFunction: "快捷功能",
putOn: "上架",
pullOff: "下架",
putOff: "下架",
claim: "认领",
startDate: "开始日期",
endDate: "结束日期",

View File

@ -37,6 +37,7 @@ const webSearch = {
expertIntroduction: "Описание экспертов",
expertLeadership: "Ведущие эксперты",
expertLibrary: "Библиотека экспертов",
productLibrary: "Библиотека продуктов",
findAchievement: "Найти достижение",
findAchievementNum: "достижений",
findCompany: "Найти компанию",
@ -51,7 +52,11 @@ const webSearch = {
findPatent: "Найти патент",
findPatentNum: "патентов",
findServiceDemand: "Найти потребность в услугах",
findServiceDemandNum: "потребностей в услугах",
findTechnologyDemand: "Найти потребность в технологиях",
findTechnologyDemandNum: "потребностей в технологиях",
findProduct: "Найти продукт",
findProductNum: "продуктов",
findTechnologyNum: "технологий",
industry: "Отрасль",
industryField: "Отраслевая область",
@ -60,6 +65,8 @@ const webSearch = {
ipc: "Классификационный номер IPC",
lab: "Лаборатория",
labDetails: "Детали лабораторий",
productDetails: "Детали продуктов",
productIntroduction: "Описание продуктов",
labIntroduction: "Описание лабораторий",
labLeadership: "Ведущие лаборатории",
labLibrary: "Библиотека лабораторий",
@ -112,6 +119,8 @@ const webSearch = {
patentStatus: "Статус патента",
// 后台暂未提供
noDataFromBackground: "Нет данных из фона",
// 中科云平台
zhongkeyunPlatform: "Платформа Чжункейюнь",
};
export default webSearch;

View File

@ -37,6 +37,7 @@ const webSearch = {
expertIntroduction: "专家简介",
expertLeadership: "专家领先性",
expertLibrary: "专家库",
productLibrary: "产品库",
findAchievement: "找成果",
findAchievementNum: "项成果",
findCompany: "找企业",
@ -51,7 +52,11 @@ const webSearch = {
findPatent: "找专利",
findPatentNum: "项专利",
findServiceDemand: "找服务需求",
findServiceDemandNum: "项服务需求",
findTechnologyDemand: "找技术需求",
findTechnologyDemandNum: "项技术需求",
findProduct: "找产品",
findProductNum: "项产品",
findTechnologyNum: "项技术",
industry: "所属领域",
industryField: "所属行业领域",
@ -60,6 +65,8 @@ const webSearch = {
ipc: "IPC分类号",
lab: "实验室",
labDetails: "实验室详情",
productDetails: "产品详情",
productIntroduction: "产品简介",
labIntroduction: "实验室简介",
labLeadership: "实验室领先性",
labLibrary: "实验室库",
@ -112,5 +119,7 @@ const webSearch = {
patentStatus: "专利状态",
// 后台暂未提供
noDataFromBackground: "后台暂未提供",
// 中科云平台
zhongkeyunPlatform: "中科云平台",
};
export default webSearch;

View File

@ -68,7 +68,7 @@
<el-dropdown-item command="setLocale">
<span>{{
// ru zh
locale === "zh" ? "Русский" : "简体中文"
locale === "zh" ? "ru" : "zh"
}}</span>
</el-dropdown-item>
<el-dropdown-item command="setLayout">

View File

@ -864,6 +864,17 @@ export const laboratoryRoutes = [
},
name: "LabAchievement",
},
{
path: "release",
component: () => import("@/views/admin/laboratory/research/achievement/release"),
hidden: true,
name: "Release",
meta: {
title: "发布成果",
icon: "list",
i18nStr: "routes.expert.publishAchievement",
},
},
{
path: "service-demand",
component: () =>

View File

@ -57,6 +57,7 @@ const useSettingsStore = defineStore("settings", {
},
toggleLocale() {
this.locale = this.locale === "zh" ? "ru" : "zh";
window.location.reload();
},
},
persist: [

View File

@ -1,5 +1,5 @@
// 归属导航
export const modeOptions = [
/*export const modeOptions = [
{
value: 101,
label: "中小企业服务",
@ -16,45 +16,86 @@ export const modeOptions = [
value: 104,
label: "科研院所服务",
},
];
];*/
// 学历
export const educationOptions = [
{ key: 1, text: "小学" },
{ key: 2, text: "初中" },
{ key: 3, text: "高中" },
{ key: 4, text: "大专" },
{ key: 5, text: "本科" },
{ key: 6, text: "研究生" },
{ key: 7, text: "博士" },
{
key: 1,
text: "小学",
zh: "小学",
ru: "Начальная школа",
},
{
key: 2,
text: "初中",
zh: "初中",
ru: "Средняя школа",
},
{
key: 3,
text: "高中",
zh: "高中",
ru: "Старшая школа",
},
{
key: 4,
text: "大专",
zh: "大专",
ru: "Колледж",
},
{
key: 5,
text: "本科",
zh: "本科",
ru: "Бакалавр",
},
{
key: 6,
text: "研究生",
zh: "研究生",
ru: "Аспирант",
},
{
key: 7,
text: "博士",
zh: "博士",
ru: "Доктор",
},
];
// 企业类型
export const enterpriseOptions = [
{ key: "101", value: "上市企业" },
{ key: "102", value: "独角兽企业" },
{ key: "103", value: "国家级专精特新企业" },
{ key: "104", value: "高新技术企业" },
{ key: "105", value: "科技企业" },
{
key: "101",
value: "上市企业",
zh: "上市企业",
ru: "Публичное предприятие",
},
{
key: "102",
value: "独角兽企业",
zh: "独角兽企业",
ru: "Единорог предприятие",
},
{
key: "103",
value: "国家级专精特新企业",
zh: "国家级专精特新企业",
ru: "Национальный уровень специализированных и новых предприятий",
},
{
key: "104",
value: "高新技术企业",
zh: "高新技术企业",
ru: "Предприятие высоких технологий",
},
{
key: "105",
value: "科技企业",
zh: "科技企业",
ru: "Научно - техническое предприятие",
},
];
// 基金对接-Фонд стыкуется
// 委托研发-Поручить разработку
// 海外留学生培养-Обучение иностранных студентов
// 贷款-Кредиты
// 对接专家院士-Академик - специалист по стыковке
// 人才培养-Подготовка кадров
// 一带一路国际合作-Международное сотрудничество
// 上市辅导-Консультирование по листингу
// 成果产业化-Индустриализация результатов
// 国家级科研平台合作-Сотрудничество национальных научно - исследовательских платформ
// 研发项目立项评估-Оценка проектов НИОКР
// 科技查新-Новые технологии.
// 产业链上下游对接-Промышленная цепочка вверх и вниз по течению
// 知识产权布局-Распределение интеллектуальной собственности
// 高价值专利培育-Высокая стоимость патентов
// 技术咨询-Технические консультации
// 对接政府项目落地-Посадка на правительственный проект
// 设立院士工作站-Создание академической рабочей станции
// 需求类型
export const demandCategoryList = [
{
@ -155,35 +196,169 @@ export const demandCategoryList = [
// ]
// 成果成熟度 技术
export const maturityOptions = [
{ key: "1", value: "正在研发" },
{ key: "2", value: "小试阶段" },
{ key: "3", value: "通过小试" },
{ key: "4", value: "中试阶段" },
{ key: "5", value: "通过中试" },
{ key: "6", value: "可规模生产" },
{
key: "1",
value: "正在研发",
valueRu: "В процессе разработки",
zh: "正在研发",
ru: "В процессе разработки",
},
{
key: "2",
value: "小试阶段",
valueRu: "Этап малого тестирования",
zh: "小试阶段",
ru: "Этап малого тестирования",
},
{
key: "3",
value: "通过小试",
valueRu: "Прошел малый тест",
zh: "通过小试",
ru: "Прошел малый тест",
},
{
key: "4",
value: "中试阶段",
valueRu: "Этап среднего тестирования",
zh: "中试阶段",
ru: "Этап среднего тестирования",
},
{
key: "5",
value: "通过中试",
valueRu: "Прошел средний тест",
zh: "通过中试",
ru: "Прошел средний тест",
},
{
key: "6",
value: "可规模生产",
valueRu: "Может быть массовым производством",
zh: "可规模生产",
ru: "Может быть массовым производством",
},
];
// 成果领先型 领先标准
export const leadOptions = [
{ key: "1", value: "国内先进" },
{ key: "2", value: "国内领先" },
{ key: "3", value: "国先进" },
{ key: "4", value: "国际领先" },
{
key: "1",
value: "国先进",
valueRu: "Национально ведущий",
zh: "国内先进",
ru: "Национально ведущий",
// value: this[locale],
},
{
key: "2",
value: "国内领先",
valueRu: "Национально ведущий",
zh: "国内领先",
ru: "Национально ведущий",
},
{
key: "3",
value: "国际先进",
valueRu: "Международно ведущий",
zh: "国际先进",
ru: "Международно ведущий",
},
{
key: "4",
value: "国际领先",
valueRu: "Международно ведущий",
zh: "国际领先",
ru: "Международно ведущий",
},
];
// 专利类型
export const patentOptions = [
{ key: "1", value: "发明专利" },
{ key: "2", value: "外观设计" },
{ key: "3", value: "实用新型" },
{
key: "1",
value: "发明专利",
valueRu: "Изобретение",
zh: "发明专利",
ru: "Изобретение",
},
{
key: "2",
value: "外观设计",
valueRu: "Дизайн",
zh: "外观设计",
ru: "Дизайн",
},
{
key: "3",
value: "实用新型",
valueRu: "Полезная модель",
zh: "实用新型",
ru: "Полезная модель",
},
];
// 合作模式
export const cooperationOptions = [
{ key: "101", value: "技术转让" },
{ key: "102", value: "技术许可" },
{ key: "103", value: "技术入股" },
{ key: "104", value: "合作开发" },
{ key: "105", value: "融资" },
{ key: "106", value: "公司" },
{ key: "107", value: "代理加盟" },
{ key: "108", value: "市场推广" },
{ key: "109", value: "其他" },
{
key: "101",
value: "技术转让",
valueRu: "Технологический трансфер",
zh: "技术转让",
ru: "Технологический трансфер",
},
{
key: "102",
value: "技术许可",
valueRu: "Техническая лицензия",
zh: "技术许可",
ru: "Техническая лицензия",
},
{
key: "103",
value: "技术入股",
valueRu: "Технические акции",
zh: "技术入股",
ru: "Технические акции",
},
{
key: "104",
value: "合作开发",
valueRu: "Совместная разработка",
zh: "合作开发",
ru: "Совместная разработка",
},
{
key: "105",
value: "融资",
valueRu: "Финансирование",
zh: "融资",
ru: "Финансирование",
},
{
key: "106",
value: "公司",
valueRu: "Компания",
zh: "公司",
ru: "Компания",
},
{
key: "107",
value: "代理加盟",
valueRu: "Агентство",
zh: "代理加盟",
ru: "Агентство",
},
{
key: "108",
value: "市场推广",
valueRu: "Маркетинг",
zh: "市场推广",
ru: "Маркетинг",
},
{
key: "109",
value: "其他",
valueRu: "Другие",
zh: "其他",
ru: "Другие",
},
];

View File

@ -10,7 +10,7 @@ import RightToolbar from "@/components/RightToolbar/index.vue";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const { t, locale } = useI18n();
const showSearch = ref(true);
const tableData = ref([]); // 表格数据
const total = ref(0); // 总条数
@ -231,8 +231,9 @@ getList();
>
<template #default="{ row }">
{{
orderTypeDict.find((item) => item.value === row.orderType)?.label ??
"-"
orderTypeDict.find((item) => item.value === row.orderType)?.[
locale
] ?? "-"
}}
</template>
</el-table-column>

View File

@ -30,14 +30,14 @@
locale === 'zh'
? item.name
: locale === 'ru'
? item.nameRu
? item[labelField]
: null
"
>{{
locale === "zh"
? item.name
: locale === "ru"
? item.nameRu
? item[labelField]
: null
}}
</el-checkbox>
@ -260,6 +260,10 @@ const data = reactive({
const { form, rules } = toRefs(data);
const labelField = computed(() => {
return locale.value === "zh" ? "name" : `name${toTitleCase(locale.value)}`;
});
const labelWidth = 140;
const checkList = reactive([...demandCategoryList]);
const checkInput = ref("");
@ -294,14 +298,12 @@ const backToList = () => {
function addCheck() {
if (!checkInput.value.trim().length) return ElMessage.error(t("input.input"));
const flag = checkList.some((item) => {
return item.name.trim() == checkInput.value.trim();
return item[labelField.value].trim() == checkInput.value.trim();
});
if (!flag) {
const nameField =
locale.value === "zh" ? "name" : `name${toTitleCase(locale.value)}`;
checkList.push({
id: checkList.length + 1,
[nameField]: checkInput.value,
[labelField.value]: checkInput.value,
});
checkInput.value = "";
}
@ -317,16 +319,12 @@ onMounted(() => {
});
tab.updatePage(obj);
getDemand({ id: route.query.id }).then((resp) => {
// const nameField = locale === "zh" ? "name" : "nameRu";
console.log(locale.value);
const nameField =
locale.value === "zh" ? "name" : `name${toTitleCase(locale.value)}`;
if (resp.data.kinds) {
resp.data.kinds.forEach((el, index) => {
if (!checkList.find((item) => item[nameField] === el)) {
if (!checkList.find((item) => item[labelField.value] === el)) {
checkList.push({
id: index,
[nameField]: el,
[labelField.value]: el,
});
}
});

View File

@ -63,19 +63,18 @@
</el-button>
</router-link>
<el-button
v-if="queryParams.status == 1"
size="small"
type="text"
:icon="row.shelfStatus == 2 ? 'Upload' : 'Download'"
@click="handleShelf(row)"
>{{
row.shelfStatus == 2
? t("admin.table.putOn")
: t("admin.table.putOff")
}}
) }}
</el-button>
<!-- <el-button-->
<!-- v-if="queryParams.status == 1"-->
<!-- size="small"-->
<!-- type="text"-->
<!-- :icon="row.shelfStatus == 2 ? 'Upload' : 'Download'"-->
<!-- @click="handleShelf(row)"-->
<!-- >{{-->
<!-- row.shelfStatus == 2-->
<!-- ? t("admin.table.putOn")-->
<!-- : t("admin.table.putOff")-->
<!-- }}-->
<!-- </el-button>-->
<el-button
v-if="queryParams.status != 1"
size="small"
@ -93,15 +92,15 @@
@click="handleResults(row)"
>{{ t("webSearch.viewMatchingResults") }}
</el-button>
<el-button
v-if="queryParams.status == 1"
disabled
size="small"
type="text"
icon="View"
@click="checkEnterpriseInfo(row.id)"
>{{ t("tips.browseEnterpriseInformation") }}
</el-button>
<!-- <el-button-->
<!-- v-if="queryParams.status == 1"-->
<!-- disabled-->
<!-- size="small"-->
<!-- type="text"-->
<!-- icon="View"-->
<!-- @click="checkEnterpriseInfo(row.id)"-->
<!-- >{{ t("tips.browseEnterpriseInformation") }}-->
<!-- </el-button>-->
<el-button
v-if="queryParams.status == 0"
size="small"
@ -147,7 +146,7 @@ const data = reactive({
queryParams: {
pageNum: 1,
pageSize: 10,
status: 0, // 状态(0-待审核1-通过2-驳回3-草稿)
status: 1, // 状态(0-待审核1-通过2-驳回3-草稿)
},
});

View File

@ -19,8 +19,8 @@
style="margin-top: 50px"
v-if="vipData.vipType == 1 || vipData.vipType == 2"
>
{{ vipData.vipType == 1 ? "VIP" : "SVIP"
}} {{ t("home.expirationTime") }}{{ vipData.expireTime }}
{{ vipData.vipType == 1 ? "VIP" : "SVIP" }}
{{ t("home.expirationTime") }}{{ vipData.expireTime }}
</div>
</div>
<span class="pointer" style="font-size: 14px" @click="vipBenefits">

View File

@ -134,7 +134,7 @@
<el-option
v-for="item in maturityOptions"
:key="item.key"
:label="item.value"
:label="item[locale]"
:value="item.key"
>
</el-option>
@ -160,7 +160,7 @@
<el-option
v-for="item in leadOptions"
:key="item.key"
:label="item.value"
:label="item[locale]"
:value="item.key"
>
</el-option>
@ -183,7 +183,7 @@
<el-option
v-for="item in cooperationOptions"
:key="item.key"
:label="item.value"
:label="item[locale]"
:value="item.key"
>
</el-option>
@ -294,7 +294,7 @@ import {
import { computed, reactive, ref, toRefs } from "vue";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const { t, locale } = useI18n();
const props = defineProps({
modelValue: Object,
isAdd: {

View File

@ -33,8 +33,8 @@
<el-checkbox
v-for="item in checkList"
:key="item.id"
:label="item.name"
>{{ item.name }}
:label="locale === 'zh' ? item.name : item[labelField]"
>{{ locale === "zh" ? item.name : item[labelField] }}
</el-checkbox>
</el-checkbox-group>
<el-row :gutter="20">
@ -155,15 +155,15 @@ import {
} from "@/api/admin/expert/demand";
import { demandCategoryList } from "@/utils/parameter";
import { uniqueId } from "lodash";
import tab from "@/plugins/tab";
// import CityOptions from "@/views/components/CityOptions";
import tab from "@/plugins/tab"; // import CityOptions from "@/views/components/CityOptions";
import { ElMessage } from "element-plus";
import { useRoute } from "vue-router";
import { updateCount } from "@/api/admin/count.js";
import { computed, reactive, ref, toRefs } from "vue";
import { useI18n } from "vue-i18n";
import { toTitleCase } from "@/utils/string";
const { t } = useI18n();
const { t, locale } = useI18n();
const data = reactive({
formData: {
check: [],
@ -273,6 +273,9 @@ const { queryParams, formData, rules } = toRefs(data);
const route = useRoute();
const formRef = ref();
const labelField = computed(() => {
return locale.value === "zh" ? "name" : `name${toTitleCase(locale.value)}`;
});
const back = () => {
tab.closeOpenPage({ path: "/demand/serviceDemand" });
};
@ -299,12 +302,12 @@ async function submitForm() {
function addCheck() {
if (!checkInput.value.trim().length) return ElMessage.error(t("input.input"));
const flag = checkList.some((item) => {
return item.name.trim() == checkInput.value.trim();
return item[labelField.value].trim() == checkInput.value.trim();
});
if (!flag) {
checkList.push({
id: checkList.length + 1,
name: checkInput.value,
[labelField.value]: checkInput.value,
});
checkInput.value = "";
}
@ -314,8 +317,8 @@ const getDetail = async () => {
const resp = await getDemandById(route.query.id);
formData.value = resp.data;
for (const item of resp.data.kinds) {
if (!checkList.find((el) => el.name === item)) {
checkList.push({ id: uniqueId("unq-"), name: item });
if (!checkList.find((el) => el[labelField.value] === item)) {
checkList.push({ id: uniqueId("unq-"), [labelField.value]: item });
}
}
};

View File

@ -37,6 +37,7 @@
/>
<el-table-column :label="t('admin.form.keywords')" prop="keyword" />
<!-- <el-zh-column label="浏览量" prop="visitCount" /> -->
<el-table-column :label="t('admin.form.industry')" prop="industryStr" />
<el-table-column
:label="t('admin.table.publishTime')"
prop="createTime"

View File

@ -250,7 +250,7 @@
<el-option
v-for="item in patentOptions"
:key="item.key"
:label="item.value"
:label="item[locale]"
:value="item.key"
>
</el-option>
@ -334,7 +334,7 @@ import { useRouter } from "vue-router";
import { useI18n } from "vue-i18n";
import { computed, getCurrentInstance, reactive, ref, toRefs } from "vue";
const { t } = useI18n();
const { t, locale } = useI18n();
const router = useRouter();
const { proxy } = getCurrentInstance();

View File

@ -31,6 +31,7 @@ import { useRoute, useRouter } from "vue-router";
import { updateCount } from "@/api/admin/count";
import ReleaseForm from "../components/ReleaseForm";
import { useI18n } from "vue-i18n";
import {updateAchievement} from "@/api/admin/laboratory/achievement";
const labelWidth = 140;
@ -64,7 +65,7 @@ if (id) {
const submitForm = async (status) => {
if (await releaseFormRef.value.validateForm()) {
if (id) {
await updateExpertAchievement({ ...form.value, status });
await updateAchievement({ ...form.value, status });
ElMessage.success(t("admin.common.editSuccess"));
// router.back();
} else {

View File

@ -1,63 +1,63 @@
<template>
<div class="app-container">
<el-card style="width: 55%; margin: 0 auto">
<p>
<b> {{ t("admin.form.basicData") }}</b>
</p>
<el-form
ref="personFormRef"
:model="personForm"
:rules="rules"
label-width="100px"
>
<el-form-item :label="t('admin.form.fullName')" prop="nickName">
<el-input
v-model="personForm.nickName"
:placeholder="
t('admin.form.placeholder', { type: t('admin.form.fullName') })
"
/>
</el-form-item>
<el-form-item :label="t('admin.form.mobile')" prop="mobile">
<!-- :maxlength="11"-->
<el-input
v-model="personForm.mobile"
oninput="value = value.replace(/\D/,'')"
:placeholder="
t('admin.form.placeholder', { type: t('admin.form.mobile') })
"
/>
</el-form-item>
<el-form-item :label="t('admin.form.email')" prop="email">
<el-input
v-model="personForm.email"
:placeholder="
t('admin.form.placeholder', { type: t('admin.form.email') })
"
/>
</el-form-item>
<el-form-item :label="t('admin.form.position')" prop="post">
<el-input
v-model="personForm.post"
:placeholder="
t('admin.form.placeholder', { type: t('admin.form.position') })
"
/>
</el-form-item>
<el-form-item :label="t('admin.form.phone')" prop="phone">
<el-input
v-model="personForm.phone"
:placeholder="
t('admin.form.placeholder', { type: t('admin.form.phone') })
"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitPersonalInfo"
>{{ t("admin.common.submit") }}
</el-button>
</el-form-item>
</el-form>
<!-- <p>-->
<!-- <b> {{ t("admin.form.basicData") }}</b>-->
<!-- </p>-->
<!-- <el-form-->
<!-- ref="personFormRef"-->
<!-- :model="personForm"-->
<!-- :rules="rules"-->
<!-- label-width="100px"-->
<!-- >-->
<!-- <el-form-item :label="t('admin.form.fullName')" prop="nickName">-->
<!-- <el-input-->
<!-- v-model="personForm.nickName"-->
<!-- :placeholder="-->
<!-- t('admin.form.placeholder', { type: t('admin.form.fullName') })-->
<!-- "-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item :label="t('admin.form.mobile')" prop="mobile">-->
<!-- &lt;!&ndash; :maxlength="11"&ndash;&gt;-->
<!-- <el-input-->
<!-- v-model="personForm.mobile"-->
<!-- oninput="value = value.replace(/\D/,'')"-->
<!-- :placeholder="-->
<!-- t('admin.form.placeholder', { type: t('admin.form.mobile') })-->
<!-- "-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item :label="t('admin.form.email')" prop="email">-->
<!-- <el-input-->
<!-- v-model="personForm.email"-->
<!-- :placeholder="-->
<!-- t('admin.form.placeholder', { type: t('admin.form.email') })-->
<!-- "-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item :label="t('admin.form.position')" prop="post">-->
<!-- <el-input-->
<!-- v-model="personForm.post"-->
<!-- :placeholder="-->
<!-- t('admin.form.placeholder', { type: t('admin.form.position') })-->
<!-- "-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item :label="t('admin.form.phone')" prop="phone">-->
<!-- <el-input-->
<!-- v-model="personForm.phone"-->
<!-- :placeholder="-->
<!-- t('admin.form.placeholder', { type: t('admin.form.phone') })-->
<!-- "-->
<!-- />-->
<!-- </el-form-item>-->
<!-- <el-form-item>-->
<!-- <el-button type="primary" @click="submitPersonalInfo"-->
<!-- >{{ t("admin.common.submit") }}-->
<!-- </el-button>-->
<!-- </el-form-item>-->
<!-- </el-form>-->
<p>
<b>{{ t("admin.form.data", { type: t("admin.common.lab") }) }}</b>
</p>
@ -102,7 +102,7 @@ const data = reactive({
});
const { form, personForm, rules } = toRefs(data);
const labFormRef = ref();
const personFormRef = ref();
// const personFormRef = ref();
const labelWidth = ref(140);
// 获取基础信息用于回显
@ -117,7 +117,7 @@ const getBasicInfo = async () => {
const submitPersonalInfo = async () => {
try {
await personFormRef.value.validate();
// await personFormRef.value.validate();
await insertClientUser(personForm.value);
ElMessage.success(t("admin.common.updatePersonalInformationSuccess"));
const { data } = await getInfo();

View File

@ -40,13 +40,22 @@
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<!-- <el-col v-if="route.name === 'LabAchievement'" :span="1.5">-->
<!-- <el-button-->
<!-- icon="UploadFilled"-->
<!-- size="small"-->
<!-- type="primary"-->
<!-- @click="handleImport"-->
<!-- >{{ t("admin.form.importAchievement") }}-->
<!-- </el-button>-->
<!-- </el-col>-->
<el-col v-if="route.name === 'LabAchievement'" :span="1.5">
<el-button
icon="UploadFilled"
size="small"
type="primary"
@click="handleImport"
>{{ t("admin.form.importAchievement") }}
<el-button icon="plus" size="small" type="primary" @click="handleAdd"
>{{
t("admin.form.add", {
type: t("admin.common.achievement"),
})
}}
</el-button>
</el-col>
<right-toolbar
@ -197,6 +206,7 @@ import importTip from "@/assets/achievement_import_description.txt?url";
import { saveAs } from "file-saver";
import { useI18n } from "vue-i18n";
import dayjs from "dayjs";
import modal from "@/plugins/modal";
const { t } = useI18n();
const router = useRouter();
@ -257,7 +267,8 @@ function resetQuery() {
* @param id
*/
function handleDelete(id) {
ElMessageBox.confirm(
modal
.confirm(
t("admin.common.confirmAction", {
action: t("admin.common.delete"),
type: t("admin.common.achievement"),
@ -329,5 +340,14 @@ function submitFileForm() {
uploadRef.value.submit();
}
const handleAdd = () => {
router.push({
path: "./release",
// query: {
// id: "",
// },
});
};
getList();
</script>

View File

@ -0,0 +1,81 @@
<template>
<div class="app-container">
<el-card shadow="always" style="width: 55%; margin: 0 auto">
<ReleaseForm
ref="releaseFormRef"
v-model="form"
:isAdd="false"
:labelWidth="labelWidth"
/>
<div :style="{ marginLeft: labelWidth + 'px' }">
<!-- <el-button type="primary" @click="submitForm(`3`)"-->
<!-- >{{ t("admin.form.saveDraft") }}-->
<!-- </el-button>-->
<el-button type="primary" @click="submitForm(`1`)"
>{{ t("admin.common.submitAudit") }}
</el-button>
</div>
</el-card>
</div>
</template>
<script name="ReleaseAchievement" setup>
import {
insertAchievement,
updateAchievement,
achievementInfo,
} from "@/api/admin/laboratory/achievement";
import tab from "@/plugins/tab";
import { ElMessage } from "element-plus";
import { reactive, ref, toRefs } from "vue";
import { useRoute, useRouter } from "vue-router";
import { updateCount } from "@/api/admin/count";
import ReleaseForm from "@/views/admin/expert/components/ReleaseForm";
import { useI18n } from "vue-i18n";
const labelWidth = 140;
const data = reactive({
form: { mode: 1, shelfStatus: "2" },
});
const formData = reactive({});
const { form } = toRefs(data);
const route = useRoute();
const router = useRouter();
const releaseFormRef = ref();
const { id } = route.query;
const { t } = useI18n();
if (id) {
const obj = Object.assign({}, route, {
title: t("admin.form.edit", {
type: t("admin.common.achievement"),
}),
});
tab.updatePage(obj);
achievementInfo({ id }).then((resp) => {
form.value = resp.data;
form.value.keywords =
form.value.keyword?.split(",").filter((el) => el !== "") ?? [];
form.value.customers =
form.value.customer?.split(",").filter((el) => el !== "") ?? [];
});
}
const submitForm = async (status) => {
if (await releaseFormRef.value.validateForm()) {
if (id) {
await updateAchievement({ ...form.value, status });
ElMessage.success(t("admin.common.editSuccess"));
// router.back();
} else {
await insertAchievement({ ...form.value, status });
ElMessage.success(t("admin.common.addSuccess"));
// router.back();
}
updateCount("achievement");
void tab.closeOpenPage({ path: "/admin/research/lab-achievement" });
} else {
console.log("validation failed");
}
};
</script>

View File

@ -8,7 +8,7 @@
@submit.prevent
>
<el-form-item
:label="t('admin.form.name', { type: t('admin.common.achievement') })"
:label="t('admin.form.name', { type: t('admin.common.expert') })"
prop="title"
>
<el-input
@ -16,8 +16,8 @@
clearable
:placeholder="
t('admin.form.placeholder', {
type: t('admin.common.name', {
type: t('admin.common.achievement'),
type: t('admin.form.name', {
type: t('admin.common.expert'),
}),
})
"
@ -76,7 +76,7 @@
clearable
:placeholder="
t('admin.form.placeholder', {
type: t('admin.common.name', {
type: t('admin.form.name', {
type: t('admin.common.expert'),
}),
})
@ -278,6 +278,7 @@ import {
import Pagination from "@/components/Pagination/index.vue";
import { useI18n } from "vue-i18n";
import dayjs from "dayjs";
import modal from "@/plugins/modal";
const router = useRouter();
const { t } = useI18n();
@ -332,7 +333,8 @@ function resetQuery() {
/** 删除按钮操作 */
function handleDeleteBind(id) {
ElMessageBox.confirm(
modal
.confirm(
t("admin.common.confirmAction", {
action: t("admin.table.cancelRelation"),
type: t("admin.common.expert"),
@ -417,7 +419,8 @@ const resetNotBindExpertQuery = () => {
* @param id
*/
const submitBind = (id) => {
ElMessageBox.confirm(
modal
.confirm(
/*"是否确认关联该专家?"*/
t("admin.common.confirmAction", {
action: t("admin.table.relation"),

View File

@ -63,7 +63,9 @@
<!-- <el-zh-column :label="t('admin.form.belongExpert')" prop="inventor" />-->
<el-table-column :label="t('admin.table.topicRole')">
<template #default="{ row }">
{{ subjectRoleDict.find((item) => item.value === row.role)?.label }}
{{
subjectRoleDict.find((item) => item.value === row.role)?.[locale]
}}
</template>
</el-table-column>
<el-table-column :label="t('admin.form.topicLeader')" prop="director" />
@ -113,7 +115,7 @@
<script setup>
import dayjs from "dayjs";
import { ElMessage, ElMessageBox } from "element-plus";
import { ElMessage } from "element-plus";
import modal from "@/plugins/modal";
import { useRouter } from "vue-router";
import { getCurrentInstance, reactive, ref, toRefs } from "vue";
@ -123,7 +125,8 @@ import {
} from "@/api/admin/laboratory/research-project";
import { subjectRoleDict } from "@/constant/dict";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const { t, locale } = useI18n();
const router = useRouter();
const { proxy } = getCurrentInstance();

View File

@ -131,7 +131,7 @@ import { reactive, ref, toRefs } from "vue";
import { ElMessage } from "element-plus";
import { useRoute } from "vue-router";
import tab from "@/plugins/tab";
import { serviceDemandInfo } from "@/api/admin/research/service-demand";
import { serviceDemandInfo } from "@/api/admin/laboratory/service-demand";
import { useI18n } from "vue-i18n";
const { t } = useI18n();

View File

@ -8,14 +8,14 @@
@submit.prevent
>
<el-form-item
:label="t('admin.form.name', { type: t('admin.common.achievement') })"
:label="t('admin.form.name', { type: t('admin.common.demand') })"
prop="title"
>
<el-input
v-model="queryParams.title"
clearable
:placeholder="
t('admin.form.placeholder', { type: t('admin.common.patent') })
t('admin.form.placeholder', { type: t('admin.common.demand') })
"
size="small"
style="width: 240px"
@ -86,9 +86,9 @@
:label="t('admin.common.operation')"
>
<template #default="{ row }">
<el-button icon="FolderRemove" size="small" type="text" @click=""
>{{ t("admin.table.cancelPublish") }}
</el-button>
<!-- <el-button icon="FolderRemove" size="small" type="text" @click=""-->
<!-- >{{ t("admin.table.cancelPublish") }}-->
<!-- </el-button>-->
<el-button
icon="view"
size="small"
@ -122,6 +122,7 @@ import { serviceDemandStatusDict } from "@/constant/dict";
import DictTag from "@/components/DictTag/index.vue";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const router = useRouter();

View File

@ -70,7 +70,7 @@
<el-table-column align="center" :label="t('admin.table.topicRole')">
<template #default="{ row }">
<span>{{
subjectRoleDict.find((item) => item.value === row.role)?.label
subjectRoleDict.find((item) => item.value === row.role)?.[locale]
}}</span>
</template>
</el-table-column>
@ -136,7 +136,7 @@ import {
import { subjectRoleDict } from "@/constant/dict";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const { t, locale } = useI18n();
const router = useRouter();
const { proxy } = getCurrentInstance();

View File

@ -91,7 +91,7 @@
<el-option
v-for="item in enterpriseOptions"
:key="item.key"
:label="item.value"
:label="item[locale]"
:value="item.key"
>
</el-option>
@ -221,7 +221,7 @@ import { computed, reactive, ref, toRefs } from "vue";
import ImageUpload from "@/components/ImageUpload/index.vue";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const { t, locale } = useI18n();
const props = defineProps({
modelValue: Object,
isAdd: {

View File

@ -114,9 +114,9 @@
>
<el-option
v-for="item in educationOptions"
:key="item.text"
:label="item.text"
:value="item.text"
:key="item.key"
:label="item[locale]"
:value="item.key"
>
</el-option>
</el-select>
@ -220,7 +220,7 @@ import { educationOptions } from "@/utils/parameter";
import { useI18n } from "vue-i18n";
import { computed, toRefs } from "vue";
const { t } = useI18n();
const { t, locale } = useI18n();
const props = defineProps({
modelValue: Object,

View File

@ -20,7 +20,7 @@
<el-option
v-for="item in levelI"
:key="item.id"
:label="item.name"
:label="item[labelField]"
:value="item.id"
>
</el-option>
@ -37,7 +37,7 @@
<el-option
v-for="item in levelII"
:key="item.id"
:label="item.name"
:label="item[labelField]"
:value="item.id"
>
</el-option>
@ -52,7 +52,7 @@
<el-option
v-for="item in levelIII"
:key="item.id"
:label="item.name"
:label="item[labelField]"
:value="item.id"
>
</el-option>
@ -71,7 +71,7 @@ import { listSysIndustry } from "@/api/config";
import { computed, reactive, ref, toRefs, watch } from "vue";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const { t, locale } = useI18n();
const props = defineProps({
modelValue: Object,
labelWidth: {
@ -80,6 +80,9 @@ const props = defineProps({
},
});
const { modelValue, labelWidth } = toRefs(props);
const labelField = computed(() =>
locale.value === "zh" ? "name" : `${locale.value}Name`
);
const data = reactive({
rules: {
"industrys.2": [

View File

@ -11,7 +11,8 @@
{{ t("admin.form.basicInfo") }}
</div>
<el-row v-if="isAdd">
<!-- v-if="isAdd"-->
<el-row>
<el-col :span="24">
<el-form-item
:label="t('admin.form.name', { type: t('admin.common.lab') })"

View File

@ -103,7 +103,7 @@
<el-option
v-for="item in maturityOptions"
:key="item.key"
:label="item.value"
:label="item[locale]"
:value="item.key"
>
</el-option>
@ -125,7 +125,7 @@
<el-option
v-for="item in leadOptions"
:key="item.key"
:label="item.value"
:label="item[locale]"
:value="item.key"
>
</el-option>
@ -149,7 +149,7 @@
<el-option
v-for="item in cooperationOptions"
:key="item.key"
:label="item.value"
:label="item[locale]"
:value="item.key"
>
</el-option>
@ -222,7 +222,7 @@ import { computed, reactive, toRefs } from "vue"; // import VideoUpload from "@/
// import { researchSelect, laboratorySelect } from "@/api/identity/index";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const { t, locale } = useI18n();
const props = defineProps({
modelValue: Object,
isAdd: {

View File

@ -66,7 +66,7 @@ const methods = [
{
name: "enterprise",
// title: "企业分布地图",
title: computed(() => t("map.enterpriseMap")),
title: computed(() => t("map.companyMap")),
byProvince: countEnterpriseByProvince,
byCity: countEnterpriseByCity,
byArea: countEnterpriseByArea,
@ -256,7 +256,10 @@ const mapClick = (ev) => {
const playScrollAnimation = (direction, start) => {
const pageWrap = document.querySelector(".page-wrap");
const rootWrap = document.querySelector(".root-container");
html2canvas(pageWrap).then((canvas) => {
html2canvas(pageWrap, {
// width: pageWrap.offsetWidth / 5,
// height: pageWrap.offsetHeight / 5,
}).then((canvas) => {
canvas.addEventListener("wheel", (ev) => {
ev.stopPropagation();
ev.preventDefault();
@ -346,11 +349,23 @@ watch(locale, (newVal) => {
<div class="table">
<div class="head">
<div class="th">
<div class="title">地区</div>
<div class="count">人数</div>
<div class="title">{{ t("map.area") }}</div>
<div class="count">{{ t("map.people") }}</div>
</div>
</div>
<div class="body">
<div
v-if="areaCountPaged.length === 0"
class="tr"
style="
height: 36px;
display: flex;
justify-content: center;
align-items: center;
"
>
{{ t("map.noData") }}
</div>
<div v-for="item in areaCountPaged" :key="item.adcode" class="tr">
<div class="title">{{ item.name }}</div>
<div class="count">{{ item.count }}</div>
@ -367,11 +382,23 @@ watch(locale, (newVal) => {
<div class="table">
<div class="head">
<div class="th">
<div class="title">领域</div>
<div class="count">人数</div>
<div class="title">{{ t("map.field") }}</div>
<div class="count">{{ t("map.people") }}</div>
</div>
</div>
<div class="body">
<div
v-if="industryCountPaged.length === 0"
class="tr"
style="
height: 36px;
display: flex;
justify-content: center;
align-items: center;
"
>
{{ t("map.noData") }}
</div>
<div
v-for="item in industryCountPaged"
:key="item.adcode"

View File

@ -138,7 +138,7 @@
</div>
<!-- 底部 -->
<div class="foot">Copyright © 2007-2021 中科云 版权所有</div>
<div class="foot">Copyright © 2007-2021 {{ t('footer.copyRight') }}</div>
</div>
</template>

View File

@ -2,7 +2,7 @@
<div v-loading="loading">
<searchContainer
bannerKey="首页>成果库>成果详情"
title="成果库"
:title="t('webSearch.achievementLibrary')"
@handleQuery="handleQuery"
>
<template v-slot>
@ -23,7 +23,8 @@
</el-breadcrumb>
</div>
<el-row type="flex" style="padding-bottom: 20px">
<div style="flex: 1">
<el-col :span="16">
<div>
<achievementItem :data="state.expertDetail">
<template v-slot:des>
<div>{{ state.expertDetail.introduce }}</div>
@ -41,58 +42,64 @@
<div class="pointTit">技术视频</div>
</div> -->
<div style="padding: 20px 0">
<div class="pointTit">成果简介</div>
<div class="pointTit">
{{ t("webSearch.achievementIntroduction") }}
</div>
</div>
<div class="html" v-html="state.expertDetail.description"></div>
<div style="padding: 20px 0">
<div class="pointTit">成果领先性</div>
<div class="pointTit">
{{ t("webSearch.achievementLeadership") }}
</div>
</div>
<section>
<div>
{{
leadOptions.find(
(el) => el.key == state.expertDetail.leadStandard
)?.value
)?.[locale]
}}
</div>
</section>
<div style="padding: 20px 0">
<div class="pointTit">{{ t("webSearch.cooperationMode") }}</div>
<div class="pointTit">
{{ t("webSearch.cooperationMode") }}
</div>
</div>
<section>
<div>
{{
cooperationOptions.find(
(el) => el.key == state.expertDetail.cooperationMode
)?.value
)?.[locale]
}}
</div>
</section>
<div style="padding: 20px 0">
<div class="pointTit">应用客户</div>
<div class="pointTit">
{{ t("webSearch.applicationCustomers") }}
</div>
</div>
<section>
<div>
{{ state.expertDetail.customer }}
</div>
</section>
<!-- -->
<div style="padding: 20px 0">
<div class="pointTit">所在地</div>
</div>
<section>
{{ state.localtion }}
</section>
<div style="padding: 20px 0">
<div class="pointTit">所属单位</div>
<div class="pointTit">{{ t("webSearch.unit") }}</div>
</div>
<section>
{{ state.expertDetail.unit }}
</section>
</div>
</div>
</el-col>
<el-col :span="8">
<div class="r">
<webContact />
</div>
</el-col>
</el-row>
</template>
</searchContainer>
@ -102,25 +109,21 @@
<script setup>
import webContact from "@/components/webContact/index.vue";
import achievementItem from "./components/achievementItem.vue";
import loadMore from "./components/loadMore.vue";
import request from "@/utils/request";
// import { onMounted } from "vue";
import achievementItem from "./components/achievementItem.vue"; // import { onMounted } from "vue";
import searchContainer from "./components/searchContainer.vue";
import wordcloud from "./components/wordcloud.vue";
import productItem from "./components/productItem.vue";
import { searchAchievementDetail } from "@/api/website/home";
import { useRoute, useRouter } from "vue-router";
import { reactive, ref } from "vue";
import { computed, reactive, ref } from "vue";
import docking from "./components/docking.vue";
import { getCity } from "@/utils/city";
import { leadOptions, cooperationOptions } from "@/utils/parameter";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
import { cooperationOptions, leadOptions } from "@/utils/parameter";
const { t, locale } = useI18n();
const leadValueField = computed(() =>
locale.value === "zh" ? "value" : "valueRu"
);
const showDocking = ref(false);
const loading = ref(true);
// import {lead}
const state = reactive({
pageNum: 1,
pageSize: 4,
@ -214,11 +217,11 @@ function getDataList() {
// if (200 == res.code) {
console.log(resp.data);
state.expertDetail = resp.data;
state.localtion = await getCity(
resp.data.province,
resp.data.city,
resp.data.district
);
// state.localtion = await getCity(
// resp.data.province,
// resp.data.city,
// resp.data.district
// );
loading.value = false;
});
}
@ -269,13 +272,13 @@ function getDataList() {
.r {
display: inline-block;
width: 325px;
width: 100%;
margin-left: 14px;
min-height: 200px;
}
.detail {
width: 661px;
//width: 661px;
box-sizing: border-box;
padding: 20px;
background: #fff;

View File

@ -46,7 +46,7 @@
<div class="line">
<!-- 联系人-->
{{ t("webSearch.contact") }}
<span>中科云平台</span>
<span>{{ t("webSearch.zhongkeyunPlatform") }}</span>
</div>
<div class="line">
{{ t("webSearch.contactInformation") }}({{ t("webSearch.wechat") }})

View File

@ -28,14 +28,14 @@
<div class="line">
<!-- 联系人-->
{{ t("webSearch.contact") }}
<span>中科云平台</span>
<span>{{ t("webSearch.zhongkeyunPlatform") }}</span>
</div>
<div class="line">
<!-- 联系方式-->
{{ t("webSearch.contactInformation") }}
(
<!-- 微信同号-->
{{ t("webSearch.WeChat") }}
{{ t("webSearch.wechat") }}
)
<span>18156053255</span>
</div>

View File

@ -41,8 +41,9 @@
{{ t("webSearch.companySize") }}
<span>{{
enterpriseOptions.find((el) => el.key == item.kind)
?.value ?? t("webSearch.noData")
enterpriseOptions.find((el) => el.key == item.kind)?.[
locale
] ?? t("webSearch.noData")
}}</span>
</div>
<div class="line">
@ -103,7 +104,7 @@ import { useRoute, useRouter } from "vue-router";
import { ref } from "vue";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const { t, locale } = useI18n();
const route = useRoute();
const router = useRouter();
const searchResults = ref([]);

View File

@ -53,7 +53,7 @@
<span>{{
enterpriseOptions.find(
(el) => el.key == state.companyDetail.kind
)?.value ?? t("webSearch.noData")
)?.[locale] ?? t("webSearch.noData")
}}</span>
</div>
<div class="line">
@ -218,8 +218,9 @@
{{ t("webSearch.companySize") }}
<span>{{
enterpriseOptions.find((el) => el.key == item.kind)
?.value ?? t("webSearch.noData")
enterpriseOptions.find((el) => el.key == item.kind)?.[
locale
] ?? t("webSearch.noData")
}}</span>
</div>
<div class="line">
@ -267,7 +268,7 @@ import { search } from "@/api/website/home";
import { getCity } from "@/utils/city";
import { useI18n } from "vue-i18n";
const { t } = useI18n();
const { t, locale } = useI18n();
const router = useRouter();
const route = useRoute();
const loading = ref(true);

View File

@ -2,7 +2,7 @@
<div class="index">
<searchContainer
bannerKey="首页>专家库>专家列表"
title="专家库"
:title="t('webSearch.expertLibrary')"
@handleQuery="handleQuery"
>
<template v-slot>
@ -11,7 +11,8 @@
<div style="position: relative">
<!-- <industrySelect @industryChange="industryChange"></industrySelect> -->
<div class="total">
{{ t("webSearch.findNum") }} <span>{{ total }}</span> 位专家
{{ t("webSearch.findNum") }} <span>{{ total }}</span>
{{ t("webSearch.findExpertNum") }}
</div>
<div v-loading="loading">
<section v-for="item in searchResults" :key="item.id">
@ -34,7 +35,9 @@
/>
</div>
</div>
<div class="r"><WebContact /></div>
<div class="r">
<WebContact />
</div>
</el-row>
</template>
</searchContainer>
@ -121,6 +124,7 @@ const getDataList = async () => {
font-weight: 500;
color: #333333;
margin-bottom: 20px;
span {
font-size: 30px;
color: #0054ff;

View File

@ -98,7 +98,11 @@
</div>
<section>
<div>
{{ state.expertDetail.education }}
{{
educationOptions.find(
(item) => item.key == state.expertDetail.education
)?.[locale]
}}
</div>
</section>
<div style="padding: 20px 0">
@ -424,8 +428,9 @@ import searchContainer from "./components/searchContainer.vue";
import { useRoute, useRouter } from "vue-router";
import docking from "./components/docking.vue";
import { useI18n } from "vue-i18n";
import { educationOptions } from "../../../utils/parameter";
const { t } = useI18n();
const { t, locale } = useI18n();
const showDocking = ref(false);
const router = useRouter();
const route = useRoute();

View File

@ -2,7 +2,7 @@
<div class="index">
<searchContainer
bannerKey="首页>实验室库>实验室列表"
title="实验室库"
:title="t('webSearch.labLibrary')"
@handleQuery="handleQuery"
>
<template v-slot>
@ -12,7 +12,7 @@
<industrySelect @industryChange="industryChange"></industrySelect>
<div class="total">
{{ t("webSearch.findNum") }}
<span>{{ state.total }}</span> 个实验室
<span>{{ state.total }}</span> {{t('webSearch.findLabNum')}}
</div>
<div v-loading="loading">
<section v-for="item in state.list" :key="item.id">

View File

@ -2,7 +2,7 @@
<div class="index">
<searchContainer
bannerKey="首页>实验室库>实验室列表"
title="实验室库"
:title="t('webSearch.labLibrary')"
@handleQuery="handleQuery"
>
<template v-slot>
@ -11,7 +11,7 @@
<div style="position: relative">
<!-- <industrySelect @industryChange="industryChange"></industrySelect> -->
<div class="total">
{{ t("webSearch.findNum") }} <span>{{ total }}</span> 个实验室
{{ t("webSearch.findNum") }} <span>{{ total }}</span> {{t('webSearch.findLabNum')}}
</div>
<div v-loading="loading">
<section v-for="item in searchResults" :key="item.id">

View File

@ -7,11 +7,13 @@
>
<template v-slot>
<el-row type="flex" style="padding: 20px 0">
<el-col :span="16">
<div style="flex: 1">
<div style="position: relative">
<!-- <industrySelect @industryChange="industryChange"></industrySelect> -->
<div class="total">
{{ t("webSearch.findNum") }} <span>{{ total }}</span> 个专利
{{ t("webSearch.findNum") }} <span>{{ total }}</span>
{{ t("webSearch.findPatentNum") }}
</div>
<div v-loading="loading">
<section v-for="item in searchResults" :key="item.id">
@ -32,9 +34,11 @@
/>
</div>
</div>
</el-col>
<el-col :span="8">
<div class="r">
<WebContact />
</div>
<WebContact /></div
></el-col>
</el-row>
</template>
</searchContainer>
@ -64,6 +68,7 @@ const queryParams = reactive({
queryType: route.query.queryType,
query: route.query.keyword,
});
function handleDetail(id) {
let routeData = router.resolve({
path: `/searchList/0/detail/${id}`,
@ -76,6 +81,7 @@ const loading = ref(false);
const searchResults = ref([]);
const total = ref(0);
function createdData(arr) {
let l = [];
let snap = JSON.parse(JSON.stringify(arr));
@ -90,12 +96,14 @@ const getSearchResult = async () => {
const resp = await search(queryParams);
console.log(resp);
};
function handleQuery(state) {
// state.keyword = keyword;
queryParams.query = state.currentKeyword;
queryParams.queryType = state.queryType;
getDataList();
}
function industryChange(industry) {
if (industry.id1) {
state.id1 = industry.id1;
@ -129,6 +137,7 @@ const getDataList = async () => {
font-weight: 500;
color: #333333;
margin-bottom: 20px;
span {
font-size: 30px;
color: #0054ff;
@ -137,7 +146,7 @@ const getDataList = async () => {
.r {
display: inline-block;
width: 325px;
width: 100%;
margin-left: 14px;
min-height: 200px;
// background-color: #fff;
@ -155,21 +164,25 @@ const getDataList = async () => {
display: flex;
align-items: center;
justify-content: center;
img {
width: 90px;
height: 90px;
border-radius: 50%;
}
}
.content {
display: inline-block;
width: 390px;
width: 100%;
.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;
@ -178,15 +191,18 @@ const getDataList = async () => {
}
}
}
.keywords {
flex: 1;
width: 129px;
height: 129px;
}
.tit {
width: 100%;
overflow: hidden;
cursor: pointer;
.text {
margin-right: 200px;
overflow: hidden;

View File

@ -123,7 +123,7 @@
<section>
{{
patentOptions.find((el) => el.key == state.patentDetail.kind)
?.value
?.[locale]
}}
</section>
<div style="padding: 20px 0">
@ -233,7 +233,7 @@ import { useRoute, useRouter } from "vue-router";
import docking from "./components/docking.vue";
import { useI18n } from "vue-i18n";
const showDocking = ref(false);
const { t } = useI18n();
const { t,locale } = useI18n();
const router = useRouter();
const route = useRoute();
const loading = ref(true);

View File

@ -22,7 +22,8 @@
</el-breadcrumb>
</div>
<el-row type="flex" style="padding-bottom: 20px">
<div style="flex: 1">
<el-col :span="16">
<div>
<achievementItem :data="state.expertDetail">
<template v-slot:des>
<div>{{ state.expertDetail.introduce }}</div>
@ -59,15 +60,15 @@
<div style="padding: 20px 0">
<div class="pointTit">
<!-- 产品领先性-->
{{ t("webSearch.productLeadership") }}
{{ t("admin.form.productLeadership") }}
</div>
</div>
<section>
<div>
{{
leadOptions.find(
(el) => el.key == state.expertDetail.leadStandard
)?.value
(el) => el.key === state.expertDetail.leadStandard
)?.[locale]
}}
</div>
</section>
@ -82,14 +83,14 @@
{{
cooperationOptions.find(
(el) => el.key == state.expertDetail.cooperationMode
)?.value
)?.[locale]
}}
</div>
</section>
<div style="padding: 20px 0">
<div class="pointTit">
<!-- 应用客户-->
{{ t("webSearch.applicationCustomer") }}
{{ t("webSearch.applicationCustomers") }}
</div>
</div>
<section>
@ -97,20 +98,14 @@
{{ state.expertDetail.customer }}
</div>
</section>
<div style="padding: 20px 0">
<div class="pointTit">
<!-- 所在地-->
{{ t("webSearch.location") }}
</div>
</div>
<section>
{{ state.localtion }}
</section>
</div>
</div>
</el-col>
<el-col :span="8">
<div class="r">
<webContact />
</div>
</el-col>
</el-row>
</template>
</searchContainer>
@ -128,17 +123,20 @@ import searchContainer from "./components/searchContainer.vue";
// import wordcloud from "./components/wordcloud.vue";
// import productItem from "./components/productItem.vue";
import { searchAchievementDetail } from "@/api/website/home";
import { searchProductDetail } from "@/api/website/home";
import { useRoute, useRouter } from "vue-router";
import { reactive, ref } from "vue";
import { computed, reactive, ref } from "vue";
import docking from "./components/docking.vue";
import { getCity } from "@/utils/city";
import { leadOptions, cooperationOptions } from "@/utils/parameter";
import { cooperationOptions, leadOptions } from "@/utils/parameter";
import { useI18n } from "vue-i18n";
const showDocking = ref(false);
const { t } = useI18n();
const { t, locale } = useI18n();
const loading = ref(true);
const leadValueField = computed(() =>
locale.value === "zh" ? "value" : "valueRu"
);
// import {lead}
const state = reactive({
pageNum: 1,
@ -227,17 +225,17 @@ function getDataList() {
loading.value = true;
let id = route.params.id;
if (!id) return;
searchAchievementDetail(id)
searchProductDetail(id)
// achievementDetail(id)
.then(async (resp) => {
// if (200 == res.code) {
console.log(resp.data);
state.expertDetail = resp.data;
state.localtion = await getCity(
resp.data.province,
resp.data.city,
resp.data.district
);
// state.localtion = await getCity(
// resp.data.province,
// resp.data.city,
// resp.data.district
// );
loading.value = false;
});
}
@ -294,7 +292,7 @@ function getDataList() {
}
.detail {
width: 661px;
//width: 661px;
box-sizing: border-box;
padding: 20px;
background: #fff;

View File

@ -23,6 +23,7 @@
</el-breadcrumb>
</div>
<el-row type="flex">
<el-col :span="16">
<div style="flex: 1">
<div class="item">
<el-row type="flex" style="padding: 40px 20px">
@ -168,9 +169,12 @@
</div>
</div> -->
</div>
</el-col>
<el-col :span="8">
<div class="r">
<webContact />
</div>
</el-col>
</el-row>
</template>
</searchContainer>
@ -290,13 +294,13 @@ function getDataList() {
.r {
display: inline-block;
width: 325px;
width: 100%;
margin-left: 14px;
min-height: 200px;
}
.product {
width: 661px;
//width: 661px;
box-sizing: border-box;
padding: 20px;
background: #fff;

View File

@ -7,6 +7,7 @@
>
<template v-slot>
<el-row type="flex" style="padding: 20px 0">
<el-col :span="16">
<div style="flex: 1">
<div style="position: relative">
<!-- <industrySelect @industryChange="industryChange"></industrySelect> -->
@ -33,9 +34,12 @@
/>
</div>
</div>
</el-col>
<el-col :span="8">
<div class="r">
<webContact />
</div>
</el-col>
</el-row>
</template>
</searchContainer>

View File

@ -23,6 +23,7 @@
</el-breadcrumb>
</div>
<el-row type="flex">
<el-col :span="16">
<div style="flex: 1">
<div class="item">
<el-row type="flex" style="padding: 40px 20px">
@ -55,12 +56,12 @@
<div class="line">
<!-- 联系人-->
{{ t("webSearch.demandType") }}
<span>中科云平台</span>
<span>{{ t("webSearch.zhongkeyunPlatform") }}</span>
</div>
<div class="line">
<!-- 联系方式-->
{{ t("webSearch.contactInformation") }}
({{ t("webSearch.WeChat") }})
({{ t("webSearch.wechat") }})
<span>18156053255</span>
</div>
</div>
@ -109,9 +110,12 @@
</section>
</div>
</div>
</el-col>
<el-col :span="8">
<div class="r">
<webContact />
</div>
</el-col>
</el-row>
</template>
</searchContainer>
@ -240,13 +244,13 @@ function getDataList() {
.r {
display: inline-block;
width: 325px;
width: 100%;
margin-left: 14px;
min-height: 200px;
}
.product {
width: 661px;
//width: 661px;
box-sizing: border-box;
padding: 20px;
background: #fff;