bug fix and performance improvements
This commit is contained in:
@ -185,3 +185,27 @@ const countryDict = [
|
||||
ru: "Китай",
|
||||
},
|
||||
];
|
||||
|
||||
// 成果推广 关键成果解决 对接专家院士 上市辅导
|
||||
export const achievementPromotionDict = [
|
||||
{
|
||||
value: 1,
|
||||
label: "成果推广",
|
||||
i18n: "achievementPromotion",
|
||||
},
|
||||
{
|
||||
value: 2,
|
||||
label: "关键成果解决",
|
||||
i18n: "keyAchievementSolution",
|
||||
},
|
||||
{
|
||||
value: 3,
|
||||
label: "对接专家院士",
|
||||
i18n: "dockingExpertsAcademicians",
|
||||
},
|
||||
{
|
||||
value: 4,
|
||||
label: "上市辅导",
|
||||
i18n: "listingGuidance",
|
||||
},
|
||||
];
|
||||
|
@ -13,6 +13,8 @@ import dict_zh from "@/i18n/message/dict/zh";
|
||||
import dict_ru from "@/i18n/message/dict/ru";
|
||||
import tips_zh from "@/i18n/message/tips/zh";
|
||||
import tips_ru from "@/i18n/message/tips/ru";
|
||||
import home_zh from "@/i18n/message/home/zh";
|
||||
import home_ru from "@/i18n/message/home/ru";
|
||||
|
||||
const messages = {
|
||||
zh: {
|
||||
@ -22,6 +24,7 @@ const messages = {
|
||||
common: common_zh,
|
||||
dict: dict_zh,
|
||||
tips: tips_zh,
|
||||
home: home_zh,
|
||||
headerMenu: {
|
||||
hello: "你好,世界",
|
||||
home: "首页",
|
||||
@ -142,6 +145,7 @@ const messages = {
|
||||
common: common_ru,
|
||||
dict: dict_ru,
|
||||
tips: tips_ru,
|
||||
home: home_ru,
|
||||
headerMenu: {
|
||||
hello: "Привет мир",
|
||||
home: "Главная",
|
||||
|
@ -36,6 +36,9 @@ const common = {
|
||||
submitAudit: "Отправить на проверку",
|
||||
item: "этот пункт",
|
||||
success: "{action} успешно",
|
||||
demandCategory: "Категория спроса",
|
||||
// 成果导入模板
|
||||
achievementImportTemplate: "Шаблон импорта достижений",
|
||||
};
|
||||
|
||||
export default common;
|
||||
|
@ -36,6 +36,9 @@ const common = {
|
||||
submitAudit: "提交审核",
|
||||
item: "该项",
|
||||
success: "{action}成功",
|
||||
demandCategory: "需求类别",
|
||||
// 成果导入模板
|
||||
achievementImportTemplate: "成果导入模板",
|
||||
};
|
||||
|
||||
export default common;
|
||||
|
@ -103,5 +103,15 @@ const form = {
|
||||
productionDirection: "Производственное направление",
|
||||
// 需求提交人手机号
|
||||
demandSubmitterPhone: "Телефон отправителя потребностей",
|
||||
// 成果需求预算
|
||||
achievementDemandBudget: "Бюджет потребностей достижений",
|
||||
// 技术需求预算
|
||||
technicalDemandBudget: "Бюджет технических потребностей",
|
||||
// 购买时间
|
||||
purchaseTime: "Время покупки",
|
||||
// 领先情况
|
||||
leadership: "Лидерство",
|
||||
// 成果图片
|
||||
achievementPicture: "Изображение достижений",
|
||||
};
|
||||
export default form;
|
||||
|
@ -101,6 +101,16 @@ const form = {
|
||||
productionDirection: "生产方向",
|
||||
// 需求提交人手机号
|
||||
demandSubmitterPhone: "需求提交人手机号",
|
||||
// 成果需求预算
|
||||
achievementDemandBudget: "成果需求预算",
|
||||
// 技术需求预算
|
||||
technicalDemandBudget: "技术需求预算",
|
||||
// 购买时间
|
||||
purchaseTime: "购买时间",
|
||||
// 领先情况
|
||||
leadership: "领先情况",
|
||||
// 成果图片
|
||||
achievementPicture: "成果图片",
|
||||
};
|
||||
|
||||
export default form;
|
||||
|
@ -60,6 +60,10 @@ const table = {
|
||||
createTime: "Время создания",
|
||||
// 需求提交人
|
||||
demandSubmitter: "Податель требования",
|
||||
// 解绑
|
||||
unbind: "Отвязать",
|
||||
// 承接需求
|
||||
undertakeDemand: "Принять требование",
|
||||
};
|
||||
|
||||
export default table;
|
||||
|
@ -60,5 +60,9 @@ const table = {
|
||||
createTime: "创建时间",
|
||||
// 需求提交人
|
||||
demandSubmitter: "需求提交人",
|
||||
// 解绑
|
||||
unbind: "解绑",
|
||||
// 承接需求
|
||||
undertakeDemand: "承接需求",
|
||||
};
|
||||
export default table;
|
||||
|
@ -28,5 +28,13 @@ const common = {
|
||||
requestTimeout: "Системный интерфейсный запрос превысил время ожидания",
|
||||
// 结束
|
||||
finish: "Завершить",
|
||||
download: "Скачать",
|
||||
// 浏览
|
||||
browse: "Просмотреть",
|
||||
// 确定注销并退出系统吗
|
||||
areYouSureYouWantToLogOutAndExitTheSystem:
|
||||
"Вы уверены, что хотите выйти из системы?",
|
||||
// 提示
|
||||
prompt: "Подсказка",
|
||||
};
|
||||
export default common;
|
||||
|
@ -27,6 +27,13 @@ export const common = {
|
||||
requestTimeout: "系统接口请求超时",
|
||||
// 结束
|
||||
finish: "结束",
|
||||
download: "下载",
|
||||
// 浏览
|
||||
browse: "浏览",
|
||||
// 确定注销并退出系统吗
|
||||
areYouSureYouWantToLogOutAndExitTheSystem: "确定注销并退出系统吗?",
|
||||
// 提示
|
||||
prompt: "提示",
|
||||
};
|
||||
|
||||
export default common;
|
||||
|
@ -16,6 +16,16 @@ const dict = {
|
||||
processed: "Обработано",
|
||||
undertakingUnit: "Исполнительная единица",
|
||||
participatingUnit: "Участвующая единица",
|
||||
// 授权 实审 公开
|
||||
authorized: "Авторизовано",
|
||||
substantiveExamination: "Существенный анализ",
|
||||
public: "Публичный",
|
||||
// 专利状态
|
||||
patentStatus: "Статус патента",
|
||||
achievementPromotion: "Продвижение достижений",
|
||||
keyAchievementSolution: "Ключевое решение достижений",
|
||||
dockingExpertsAcademicians: "Док-ин экспертов и академиков",
|
||||
listingGuidance: "Руководство по листингу",
|
||||
};
|
||||
|
||||
export default dict;
|
||||
|
@ -16,6 +16,17 @@ const dict = {
|
||||
processed: "已处理",
|
||||
undertakingUnit: "承担单位",
|
||||
participatingUnit: "参与单位",
|
||||
// 授权 实审 公开
|
||||
authorized: "已授权",
|
||||
substantiveExamination: "实审",
|
||||
public: "公开",
|
||||
// 专利状态
|
||||
patentStatus: "专利状态",
|
||||
|
||||
achievementPromotion: "成果推广",
|
||||
keyAchievementSolution: "重点成果解决方案",
|
||||
dockingExpertsAcademicians: "对接专家院士",
|
||||
listingGuidance: "上市指导",
|
||||
};
|
||||
|
||||
export default dict;
|
||||
|
24
src/i18n/message/home/ru.js
Normal file
24
src/i18n/message/home/ru.js
Normal file
@ -0,0 +1,24 @@
|
||||
const home = {
|
||||
// 升级SVIP 普通会员 到期时间 查看会员权益 开通VIP
|
||||
upgradeSVIP: "Обновление SVIP",
|
||||
ordinaryMember: "Обычный член",
|
||||
expirationTime: "Время истечения",
|
||||
viewMembershipRights: "Просмотр прав членства",
|
||||
openVIP: "Открыть VIP",
|
||||
// 服务内容 任意检索 创新科技资源自动匹配推送功能 上市公司及优质客户的企业需求优先推送 一般企业的需求匹配推送 VIP会员服务 高级VIP会员服务
|
||||
serviceContent: "Содержание услуг",
|
||||
anyRetrieval: "Любой поиск",
|
||||
innovationTechnology:
|
||||
"Функция автоматического сопоставления и отправки ресурсов инновационных технологий",
|
||||
listedCompany:
|
||||
"Приоритетная отправка потребностей предприятий, входящих в число котируемых компаний и качественных клиентов",
|
||||
generalEnterprise:
|
||||
"Сопоставление и отправка потребностей обычных предприятий",
|
||||
VIPMemberService: "Услуги для членов VIP",
|
||||
advancedVIPMemberService: "Услуги для членов VIP высшего уровня",
|
||||
// 会员服务内容
|
||||
memberServiceContent: "Содержание услуг для членов",
|
||||
// 是否确认解绑实验室
|
||||
unbindLab: "Вы уверены, что хотите отвязать лабораторию?",
|
||||
};
|
||||
export default home;
|
21
src/i18n/message/home/zh.js
Normal file
21
src/i18n/message/home/zh.js
Normal file
@ -0,0 +1,21 @@
|
||||
const home = {
|
||||
upgradeSVIP: "升级SVIP",
|
||||
ordinaryMember: "普通会员",
|
||||
expirationTime: "到期时间",
|
||||
viewMembershipRights: "查看会员权益",
|
||||
openVIP: "开通VIP",
|
||||
// 服务内容 任意检索 创新科技资源自动匹配推送功能 上市公司及优质客户的企业需求优先推送 一般企业的需求匹配推送 VIP会员服务 高级VIP会员服务
|
||||
serviceContent: "服务内容",
|
||||
anyRetrieval: "任意检索",
|
||||
innovationTechnology: "创新科技资源自动匹配推送功能",
|
||||
listedCompany: "上市公司及优质客户的企业需求优先推送",
|
||||
generalEnterprise: "一般企业的需求匹配推送",
|
||||
VIPMemberService: "VIP会员服务",
|
||||
advancedVIPMemberService: "高级VIP会员服务",
|
||||
// 会员服务内容
|
||||
memberServiceContent: "会员服务内容",
|
||||
// 是否确认解绑实验室
|
||||
unbindLab: "是否确认解绑实验室",
|
||||
};
|
||||
|
||||
export default home;
|
@ -9,6 +9,20 @@ const tips = {
|
||||
reasonDescription: "Описание причины незавершенного проекта",
|
||||
browseEnterpriseInformation: "Просмотр информации о предприятии",
|
||||
moveToDraftBox: "Переместить в черновик",
|
||||
// 取消关联成功 取消发布成功 认领专利成功
|
||||
cancelAssociationSuccess: "Отмена связи прошла успешно",
|
||||
cancelReleaseSuccess: "Отмена публикации прошла успешно",
|
||||
claimPatentSuccess: "Патент успешно принят",
|
||||
// 解绑实验室成功
|
||||
unbindLabSuccess: "Успешно отвязана лаборатория",
|
||||
// 导入结果
|
||||
importResult: "Результат импорта",
|
||||
// 面议
|
||||
faceToFace: "По договоренности",
|
||||
|
||||
// 更新企业信息成功
|
||||
updateEnterpriseInformationSuccess:
|
||||
"Информация о предприятии успешно обновлена",
|
||||
};
|
||||
|
||||
export default tips;
|
||||
|
@ -9,6 +9,19 @@ const tips = {
|
||||
reasonDescription: "未结题原因描述",
|
||||
browseEnterpriseInformation: "浏览企业信息",
|
||||
moveToDraftBox: "移到草稿箱",
|
||||
// 取消关联成功 取消发布成功 认领专利成功
|
||||
cancelAssociationSuccess: "取消关联成功",
|
||||
cancelReleaseSuccess: "取消发布成功",
|
||||
claimPatentSuccess: "认领专利成功",
|
||||
// 解绑实验室成功
|
||||
unbindLabSuccess: "解绑实验室成功",
|
||||
// 导入结果
|
||||
importResult: "导入结果",
|
||||
// 面议
|
||||
faceToFace: "面议",
|
||||
|
||||
// 更新企业信息成功
|
||||
updateEnterpriseInformationSuccess: "更新企业信息成功",
|
||||
};
|
||||
|
||||
export default tips;
|
||||
|
@ -108,6 +108,8 @@ const webSearch = {
|
||||
"Пожалуйста, введите содержание технических требований и подробные технические показатели",
|
||||
// 查看匹配结果
|
||||
viewMatchingResults: "Просмотр результатов сопоставления",
|
||||
// 专利状态
|
||||
patentStatus: "Статус патента",
|
||||
};
|
||||
|
||||
export default webSearch;
|
||||
|
@ -108,5 +108,7 @@ const webSearch = {
|
||||
"请输入技术需求内容和详细的技术指标",
|
||||
// 查看匹配结果
|
||||
viewMatchingResults: "查看匹配结果",
|
||||
// 专利状态
|
||||
patentStatus: "专利状态",
|
||||
};
|
||||
export default webSearch;
|
||||
|
@ -108,16 +108,20 @@
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
:prop="form.budgetMode == 1 ? 'budget' : ''"
|
||||
label="成果需求预算:"
|
||||
:label="t('admin.form.achievementDemandBudget')"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.budget"
|
||||
oninput="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').replace(/^\./g, '')"
|
||||
placeholder="请输入技术需求预算"
|
||||
:placeholder="
|
||||
t('admin.form.placeholder', {
|
||||
type: t('admin.form.technicalDemandBudget'),
|
||||
})
|
||||
"
|
||||
>
|
||||
<template #append>{{
|
||||
t("admin.table.tenThousandYuan")
|
||||
}}</template>
|
||||
<template #append
|
||||
>{{ t("admin.table.tenThousandYuan") }}
|
||||
</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -127,7 +131,7 @@
|
||||
v-model="form.budgetMode"
|
||||
false-label="1"
|
||||
true-label="2"
|
||||
>面议
|
||||
>{{ t("tips.faceToFace") }}
|
||||
</el-checkbox>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -231,6 +235,7 @@
|
||||
<script setup>
|
||||
// import { expert } from "@/api/identity/index";
|
||||
// import { insertTechnologyDemand } from "@/api/admin/enterprise";
|
||||
|
||||
import tab from "@/plugins/tab";
|
||||
import CityOptions from "@/views/components/CityOptions";
|
||||
import FieldOptions from "@/views/components/FieldOptions";
|
||||
@ -249,6 +254,7 @@ import {
|
||||
import { updateCount } from "@/api/admin/count";
|
||||
import { insertDemand } from "@/api/admin/agent/service/technology-demand";
|
||||
import { useI18n } from "vue-i18n";
|
||||
import modal from "@/plugins/modal";
|
||||
|
||||
const { t } = useI18n();
|
||||
const router = useRouter();
|
||||
@ -424,7 +430,8 @@ const backToList = () => {
|
||||
};
|
||||
|
||||
const addCheck = () => {
|
||||
if (!checkInput.value.trim().length) return proxy.$modal.msgError("请输入");
|
||||
if (!checkInput.value.trim().length)
|
||||
return modal.msgError(t("admin.form.placeholder"));
|
||||
const flag = checkList.some((item) => {
|
||||
return item.name.trim() === checkInput.value.trim();
|
||||
});
|
||||
@ -441,7 +448,11 @@ onMounted(() => {
|
||||
formRef.value.resetFields();
|
||||
|
||||
if (route.query.id) {
|
||||
const obj = Object.assign({}, route, { title: "修改技术需求" });
|
||||
const obj = Object.assign({}, route, {
|
||||
title: t("admin.form.edit", {
|
||||
type: t("routes.company.technicalDemand"),
|
||||
}),
|
||||
});
|
||||
tab.updatePage(obj);
|
||||
getTechnologyDemand({ id: route.query.id }).then((resp) => {
|
||||
form.value = resp.data;
|
||||
|
@ -13,7 +13,14 @@
|
||||
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="技术需求名称:" prop="title">
|
||||
<el-form-item
|
||||
:label="
|
||||
t('admin.form.name', {
|
||||
type: t('routes.company.technicalDemand'),
|
||||
})
|
||||
"
|
||||
prop="title"
|
||||
>
|
||||
<el-input v-model="form.title"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -64,16 +71,20 @@
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
:prop="form.budgetMode == 1 ? 'budget' : ''"
|
||||
label="成果需求预算:"
|
||||
:label="t('admin.form.achievementDemandBudget')"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.budget"
|
||||
oninput="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').replace(/^\./g, '')"
|
||||
placeholder="请输入技术需求预算"
|
||||
:placeholder="
|
||||
t('admin.form.placeholder', {
|
||||
type: t('admin.form.technicalDemandBudget'),
|
||||
})
|
||||
"
|
||||
>
|
||||
<template #append>{{
|
||||
t("admin.table.tenThousandYuan")
|
||||
}}</template>
|
||||
<template #append
|
||||
>{{ t("admin.table.tenThousandYuan") }}
|
||||
</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -83,7 +94,7 @@
|
||||
v-model="form.budgetMode"
|
||||
false-label="1"
|
||||
true-label="2"
|
||||
>面议
|
||||
>{{ t("tips.faceToFace") }}
|
||||
</el-checkbox>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -184,7 +195,7 @@ const submitForm = async (status) => {
|
||||
if (formValid && fieldFormValid && directionsFormValid && cityFormValid) {
|
||||
if (route.query.id) {
|
||||
await updateTechnologyDemand(form.value);
|
||||
ElMessage.success("修改企业需求成功");
|
||||
ElMessage.success(t("admin.common.EditSuccess"));
|
||||
} else {
|
||||
await insertTechnologyDemand(form.value);
|
||||
ElMessage.success(t("admin.common.AddSuccess"));
|
||||
@ -201,7 +212,7 @@ const backToList = () => {
|
||||
tab.closeOpenPage({ path: "/demand/technology" });
|
||||
};
|
||||
|
||||
function addCheck() {
|
||||
/*function addCheck() {
|
||||
if (!checkInput.value.trim().length) return ElMessage.error("请输入");
|
||||
const flag = checkList.some((item) => {
|
||||
return item.name.trim() == checkInput.value.trim();
|
||||
@ -213,7 +224,7 @@ function addCheck() {
|
||||
});
|
||||
checkInput.value = "";
|
||||
}
|
||||
}
|
||||
}*/
|
||||
|
||||
onMounted(() => {
|
||||
formRef.value.resetFields();
|
||||
|
@ -1,5 +1,5 @@
|
||||
<script setup>
|
||||
import { reactive, ref, toRefs } from "vue";
|
||||
import { computed, reactive, ref, toRefs } from "vue";
|
||||
import FieldSingle from "@/views/components/FieldSingle";
|
||||
import dayjs from "dayjs";
|
||||
import {
|
||||
@ -29,7 +29,14 @@ const data = reactive({
|
||||
enterpriseName: [
|
||||
{
|
||||
required: true,
|
||||
message: "请输入企业名称",
|
||||
/*"请输入企业名称"*/
|
||||
message: computed(() =>
|
||||
t("admin.form.placeholder", {
|
||||
type: t("admin.form.name", {
|
||||
type: t("admin.common.company"),
|
||||
}),
|
||||
})
|
||||
),
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
@ -168,7 +175,10 @@ getList();
|
||||
><!--查看详情-->
|
||||
{{ t("common.viewDetails") }}
|
||||
</el-button>
|
||||
<el-button link type="primary">承接需求</el-button>
|
||||
<el-button link type="primary"
|
||||
><!--承接需求-->
|
||||
{{ t("admin.table.undertakeDemand") }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div class="collectAndVisit">
|
||||
<div>{{ visit_count }}浏览</div>
|
||||
<div>{{ visit_count }} {{ t("common.browse") }}</div>
|
||||
<div class="heart_w">
|
||||
<div
|
||||
class="heart"
|
||||
@ -15,6 +15,7 @@
|
||||
<script setup>
|
||||
import request from "@/utils/request";
|
||||
import { reactive } from "vue";
|
||||
|
||||
function launch(id) {
|
||||
return request({
|
||||
url: "/v1/user/collect/launch",
|
||||
@ -22,6 +23,7 @@ function launch(id) {
|
||||
data: { kind: props.kind, object_id: props.object_id },
|
||||
});
|
||||
}
|
||||
|
||||
let flag = true;
|
||||
const props = defineProps({
|
||||
is_collect: {
|
||||
@ -81,14 +83,17 @@ function change() {
|
||||
.collectAndVisit {
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
|
||||
.heart_w {
|
||||
vertical-align: text-bottom;
|
||||
|
||||
span {
|
||||
vertical-align: text-bottom;
|
||||
position: relative;
|
||||
top: 1px;
|
||||
}
|
||||
}
|
||||
|
||||
.heart {
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
@ -100,6 +105,7 @@ function change() {
|
||||
background-size: cover;
|
||||
background-image: url(./img/heart0.png);
|
||||
}
|
||||
|
||||
.in {
|
||||
background-image: url(./img/heart1.png);
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ const submitEnterpriseForm = async (status) => {
|
||||
const enterpriseFormValid = await enterpriseFormRef.value.validateForm();
|
||||
if (enterpriseFormValid) {
|
||||
await updateEnterprise(enterpriseInfoForm.value);
|
||||
ElMessage.success("更新企业信息成功");
|
||||
ElMessage.success(t("tips.updateEnterpriseInformationSuccess"));
|
||||
const { data } = await getInfo();
|
||||
enterpriseInfoForm.value = data.enterprise ?? {};
|
||||
} else {
|
||||
|
@ -69,7 +69,13 @@
|
||||
prop="orderType"
|
||||
>
|
||||
<template #default="{ row }">
|
||||
{{ orderTypeDic[row.orderType] }}
|
||||
{{
|
||||
t(
|
||||
`dict.${
|
||||
orderTypeDict.find((item) => item.value === row.orderType).label
|
||||
}`
|
||||
)
|
||||
}}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
@ -261,8 +267,9 @@ import {
|
||||
} from "@/api/admin/enterprise";
|
||||
import { ElMessage } from "element-plus";
|
||||
import modal from "@/plugins/modal";
|
||||
import { computed, reactive, toRefs } from "vue";
|
||||
import { computed, reactive, ref, toRefs } from "vue";
|
||||
import { useI18n } from "vue-i18n";
|
||||
import { orderTypeDict } from "../../../../constant/dict";
|
||||
|
||||
const { t } = useI18n();
|
||||
const dataList = ref([]);
|
||||
@ -314,13 +321,13 @@ const data = reactive({
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
bank: [{ required: true, message: "开户行不能为空", trigger: "blur" }],
|
||||
/* bank: [{ required: true, message: "开户行不能为空", trigger: "blur" }],
|
||||
bankAccount: [
|
||||
{ required: true, message: "开户行账号不能为空", trigger: "blur" },
|
||||
],
|
||||
bankPhone: [
|
||||
{ required: true, message: "开户行电话不能为空", trigger: "blur" },
|
||||
],
|
||||
],*/
|
||||
email: [
|
||||
{
|
||||
required: true,
|
||||
@ -377,9 +384,9 @@ const data = reactive({
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
userAddress: [
|
||||
/* userAddress: [
|
||||
{ required: true, message: "邮寄地址不能为空", trigger: "blur" },
|
||||
],
|
||||
],*/
|
||||
},
|
||||
});
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<div class="container">
|
||||
<h1 class="title">会员服务内容</h1>
|
||||
<h1 class="title">{{ t("home.memberServiceContent") }}</h1>
|
||||
<div class="compare-plan">
|
||||
<div
|
||||
class="service-content"
|
||||
@ -9,7 +9,7 @@
|
||||
:key="index"
|
||||
:style="`background:${index == 0 ? '#f2f2f2' : '#fff'}`"
|
||||
>
|
||||
{{ item }}
|
||||
{{ item.value }}
|
||||
</div>
|
||||
<div
|
||||
class="ordinary-member"
|
||||
@ -18,7 +18,7 @@
|
||||
:style="`background:${index == 0 ? '#f2f2f2' : '#fff'}`"
|
||||
>
|
||||
<span v-if="index == 0">
|
||||
{{ item }}
|
||||
{{ item.value }}
|
||||
</span>
|
||||
<el-icon v-else>
|
||||
<Select v-if="item" />
|
||||
@ -32,7 +32,7 @@
|
||||
:style="`background:${index == 0 ? '#f2f2f2' : '#fff'}`"
|
||||
>
|
||||
<span v-if="index == 0">
|
||||
{{ item }}
|
||||
{{ item.value }}
|
||||
</span>
|
||||
<el-icon v-else>
|
||||
<Select v-if="item" />
|
||||
@ -46,7 +46,7 @@
|
||||
:style="`background:${index == 0 ? '#f2f2f2' : '#fff'}`"
|
||||
>
|
||||
<span v-if="index == 0">
|
||||
{{ item }}
|
||||
{{ item.value }}
|
||||
</span>
|
||||
<el-icon v-else>
|
||||
<Select v-if="item" />
|
||||
@ -62,20 +62,38 @@
|
||||
</div>
|
||||
</template>
|
||||
<script setup name="JoinMembership">
|
||||
import { ref } from "vue";
|
||||
import { computed, ref } from "vue";
|
||||
import { useI18n } from "vue-i18n";
|
||||
|
||||
const { t } = useI18n();
|
||||
const serviceContent = ref([
|
||||
"服务内容",
|
||||
"任意检索",
|
||||
"创新科技资源自动匹配推送功能",
|
||||
"上市公司及优质客户的企业需求优先推送",
|
||||
"一般企业的需求匹配推送",
|
||||
computed(() => t("home.serviceContent")),
|
||||
computed(() => t("home.anyRetrieval")),
|
||||
computed(() => t("home.innovationTechnology")),
|
||||
computed(() => t("home.listedCompany")),
|
||||
computed(() => t("home.generalEnterprise")),
|
||||
]);
|
||||
const ordinaryMember = ref([
|
||||
computed(() => t("home.ordinaryMember")),
|
||||
true,
|
||||
false,
|
||||
false,
|
||||
false,
|
||||
]);
|
||||
const vipMember = ref([
|
||||
computed(() => t("home.VIPMemberService")),
|
||||
true,
|
||||
true,
|
||||
false,
|
||||
true,
|
||||
]);
|
||||
const advanceVipMember = ref([
|
||||
computed(() => t("home.advancedVIPMemberService")),
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
true,
|
||||
]);
|
||||
const ordinaryMember = ref(["普通会员", true, false, false, false]);
|
||||
const vipMember = ref(["VIP会员服务", true, true, false, true]);
|
||||
const advanceVipMember = ref(["高级VIP会员服务", true, true, true, true]);
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.container {
|
||||
|
@ -21,11 +21,7 @@
|
||||
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item
|
||||
:label="
|
||||
t('admin.form.category', { type: t('admin.common.demand') })
|
||||
"
|
||||
>
|
||||
<el-form-item :label="t('admin.common.demandCategory')">
|
||||
<el-checkbox-group v-model="form.kinds">
|
||||
<el-checkbox
|
||||
v-for="item in checkList"
|
||||
@ -39,12 +35,17 @@
|
||||
<el-col :span="20">
|
||||
<el-input
|
||||
v-model="checkInput"
|
||||
placeholder="请输入需求类别"
|
||||
:placeholder="
|
||||
/*请输入需求类别*/
|
||||
t('admin.form.placeholder', {
|
||||
type: t('admin.common.demandCategory'),
|
||||
})
|
||||
"
|
||||
></el-input>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-button type="primary" @click="addCheck"
|
||||
><!--添加-->
|
||||
<el-button type="primary" @click="addCheck">
|
||||
<!--添加-->
|
||||
{{ t("admin.common.add") }}
|
||||
</el-button>
|
||||
</el-col>
|
||||
@ -59,13 +60,6 @@
|
||||
:label="t('webSearch.demandDescription')"
|
||||
prop="description"
|
||||
>
|
||||
<!-- <Editor v-model="form.description" :minHeight="150" /> -->
|
||||
<!-- <wangEditor
|
||||
v-model="form.description"
|
||||
width="100%"
|
||||
min-height="150px"
|
||||
@blur="formRef.validateField(`description`)"
|
||||
></wangEditor>-->
|
||||
<el-input
|
||||
type="textarea"
|
||||
v-model="form.description"
|
||||
@ -285,7 +279,7 @@ const backToList = () => {
|
||||
|
||||
// 添加需求类别时验证
|
||||
function addCheck() {
|
||||
if (!checkInput.value.trim().length) return ElMessage.error("请输入");
|
||||
if (!checkInput.value.trim().length) return ElMessage.error(t("input.input"));
|
||||
const flag = checkList.some((item) => {
|
||||
return item.name.trim() == checkInput.value.trim();
|
||||
});
|
||||
|
@ -13,7 +13,14 @@
|
||||
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="技术需求名称:" prop="title">
|
||||
<el-form-item
|
||||
:label="
|
||||
t('admin.form.name', {
|
||||
type: t('routes.company.technicalDemand'),
|
||||
})
|
||||
"
|
||||
prop="title"
|
||||
>
|
||||
<el-input v-model="form.title"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -78,26 +85,30 @@
|
||||
:labelWidth="labelWidth"
|
||||
ref="fieldFormRef"
|
||||
/>
|
||||
<city-options
|
||||
v-model="form"
|
||||
:labelWidth="labelWidth"
|
||||
ref="cityFormRef"
|
||||
></city-options>
|
||||
<!--<city-options
|
||||
v-model="form"
|
||||
:labelWidth="labelWidth"
|
||||
ref="cityFormRef"
|
||||
></city-options>-->
|
||||
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
label="成果需求预算:"
|
||||
:label="t('admin.form.achievementDemandBudget')"
|
||||
:prop="form.budgetMode == 1 ? 'budget' : ''"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.budget"
|
||||
oninput="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').replace(/^\./g, '')"
|
||||
placeholder="请输入技术需求预算"
|
||||
:placeholder="
|
||||
t('admin.form.placeholder', {
|
||||
type: t('admin.form.technicalDemandBudget'),
|
||||
})
|
||||
"
|
||||
>
|
||||
<template #append>{{
|
||||
t("admin.table.tenThousandYuan")
|
||||
}}</template>
|
||||
<template #append
|
||||
>{{ t("admin.table.tenThousandYuan") }}
|
||||
</template>
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -107,7 +118,7 @@
|
||||
false-label="1"
|
||||
true-label="2"
|
||||
v-model="form.budgetMode"
|
||||
>面议
|
||||
>{{ t("tips.faceToFace") }}
|
||||
</el-checkbox>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
@ -212,11 +223,17 @@
|
||||
// import { expert } from "@/api/identity/index";
|
||||
import { insertTechnologyDemand } from "@/api/admin/enterprise";
|
||||
import { useI18n } from "vue-i18n";
|
||||
import CityOptions from "@/views/components/CityOptions";
|
||||
import { useRoute, useRouter } from "vue-router";
|
||||
import FieldOptions from "@/views/components/FieldOptions";
|
||||
import InputBoxAdd from "@/views/components/InputBoxAdd";
|
||||
import { computed, getCurrentInstance, onMounted, reactive, toRefs } from "vue";
|
||||
import {
|
||||
computed,
|
||||
getCurrentInstance,
|
||||
onMounted,
|
||||
reactive,
|
||||
ref,
|
||||
toRefs,
|
||||
} from "vue";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { updateCount } from "@/api/admin/count";
|
||||
import {
|
||||
@ -238,11 +255,44 @@ const data = reactive({
|
||||
postCode: undefined,
|
||||
},
|
||||
rules: {
|
||||
title: [{ required: true, message: "需求名称不能为空", trigger: "blur" }],
|
||||
introduce: [
|
||||
{ required: true, message: "需求描述不能为空", trigger: "change" },
|
||||
title: [
|
||||
{
|
||||
required: true,
|
||||
/*"需求名称不能为空"*/
|
||||
message: computed(() =>
|
||||
t("admin.validation.required", {
|
||||
type: t("admin.form.name", {
|
||||
type: t("admin.common.demand"),
|
||||
}),
|
||||
})
|
||||
),
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
introduce: [
|
||||
{
|
||||
required: true,
|
||||
/*"需求描述不能为空"*/
|
||||
message: computed(() =>
|
||||
t("admin.validation.required", {
|
||||
type: t("webSearch.demandDescription"),
|
||||
})
|
||||
),
|
||||
trigger: "change",
|
||||
},
|
||||
],
|
||||
name: [
|
||||
{
|
||||
required: true,
|
||||
/*"需求联系人不能为空"*/
|
||||
message: computed(() =>
|
||||
t("admin.validation.required", {
|
||||
type: t("admin.form.demandContact"),
|
||||
})
|
||||
),
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
name: [{ required: true, message: "需求联系人不能为空", trigger: "blur" }],
|
||||
mobile: [
|
||||
{
|
||||
required: true,
|
||||
@ -339,7 +389,7 @@ const checkList = reactive([
|
||||
const formRef = ref(null);
|
||||
const fieldFormRef = ref(null);
|
||||
const directionsFormRef = ref(null);
|
||||
const cityFormRef = ref(null);
|
||||
// const cityFormRef = ref(null);
|
||||
const checkInput = ref("");
|
||||
const submitForm = async (status) => {
|
||||
let formValid;
|
||||
@ -351,11 +401,11 @@ const submitForm = async (status) => {
|
||||
form.value.status = status;
|
||||
const fieldFormValid = await fieldFormRef.value.validateForm();
|
||||
const directionsFormValid = await directionsFormRef.value.validateForm();
|
||||
const cityFormValid = await cityFormRef.value.validateForm();
|
||||
// const cityFormValid = await cityFormRef.value.validateForm();
|
||||
if (formValid && fieldFormValid && directionsFormValid && cityFormValid) {
|
||||
if (route.query.id) {
|
||||
await updateTechnologyDemand(form.value);
|
||||
ElMessage.success("修改企业需求成功");
|
||||
ElMessage.success(t("admin.common.EditSuccess"));
|
||||
} else {
|
||||
await insertTechnologyDemand(form.value);
|
||||
ElMessage.success(t("admin.common.AddSuccess"));
|
||||
|
@ -55,9 +55,9 @@
|
||||
:to="{ path: './release', query: { id: row.id } }"
|
||||
v-if="queryParams.status == 3"
|
||||
>
|
||||
<el-button size="small" type="text" icon="Edit">{{
|
||||
t("admin.common.edit")
|
||||
}}</el-button>
|
||||
<el-button size="small" type="text" icon="Edit"
|
||||
>{{ t("admin.common.edit") }}
|
||||
</el-button>
|
||||
</router-link>
|
||||
|
||||
<el-button
|
||||
@ -186,7 +186,7 @@ const releaseCancel = (id) => {
|
||||
.confirm('确认要取消发布id为"' + id + '"的产品吗?')
|
||||
.then(async () => {
|
||||
await updateEnterpriseProduct({ id, status: 3 });
|
||||
ElMessage.success("取消发布成功");
|
||||
ElMessage.success(t("tips.cancelReleaseSuccess"));
|
||||
getList();
|
||||
})
|
||||
.catch((err) => {
|
||||
|
@ -12,7 +12,7 @@
|
||||
>{{ t("admin.form.saveDraft") }}
|
||||
</el-button>
|
||||
<el-button type="primary" @click="submitForm(1)"
|
||||
>{{ t("admin.common.submit") }}审核
|
||||
>{{ t("admin.common.submitAudit") }}
|
||||
</el-button>
|
||||
</div>
|
||||
</el-card>
|
||||
@ -28,7 +28,7 @@ import {
|
||||
insertEnterpriseProduct,
|
||||
updateEnterpriseProduct,
|
||||
} from "@/api/admin/enterprise/product";
|
||||
import { reactive, toRefs } from "vue";
|
||||
import { reactive, ref, toRefs } from "vue";
|
||||
import { updateCount } from "@/api/admin/count";
|
||||
import { useI18n } from "vue-i18n";
|
||||
|
||||
|
@ -29,7 +29,7 @@
|
||||
{{ t("admin.common.lab") }}
|
||||
</el-radio-button>
|
||||
<el-radio-button v-if="route.path != '/demand/results'" label="7"
|
||||
>技术需求
|
||||
>{{ t("routes.common.technicalDemand") }}
|
||||
</el-radio-button>
|
||||
</el-radio-group>
|
||||
|
||||
|
@ -10,24 +10,25 @@
|
||||
<!-- <div class="text-right">续期</div> -->
|
||||
<div v-if="vipData.vipType == 1">
|
||||
<div>VIP</div>
|
||||
<div>升级SVIP</div>
|
||||
<div>{{ t("home.upgradeSVIP") }}</div>
|
||||
</div>
|
||||
<div v-else-if="!vipData.vipType">普通会员</div>
|
||||
<div v-else-if="!vipData.vipType">{{ t("home.ordinaryMember") }}</div>
|
||||
</div>
|
||||
<div
|
||||
class="text-right"
|
||||
style="margin-top: 50px"
|
||||
v-if="vipData.vipType == 1 || vipData.vipType == 2"
|
||||
>
|
||||
{{ vipData.vipType == 1 ? "VIP" : "SVIP" }}到期时间:{{
|
||||
vipData.expireTime
|
||||
}}
|
||||
{{ vipData.vipType == 1 ? "VIP" : "SVIP"
|
||||
}}{{ t("home.expirationTime") }}:{{ vipData.expireTime }}
|
||||
</div>
|
||||
</div>
|
||||
<span class="pointer" style="font-size: 14px" @click="vipBenefits">
|
||||
查看会员权益
|
||||
{{ t("home.viewMembershipRights") }}
|
||||
</span>
|
||||
<p class="text-center pointer" v-if="!vipData.vipType">开通VIP</p>
|
||||
<p class="text-center pointer" v-if="!vipData.vipType">
|
||||
{{ t("home.openVIP") }}
|
||||
</p>
|
||||
</div>
|
||||
<!--
|
||||
<div class="card-panel surplus-currency">
|
||||
|
@ -254,7 +254,7 @@
|
||||
</el-row> -->
|
||||
<el-row v-if="modelValue.mode == 1">
|
||||
<el-col :span="24">
|
||||
<el-form-item label="成果图片:" prop="image">
|
||||
<el-form-item :label="t('admin.form.achievementPicture')" prop="image">
|
||||
<ImageUpload
|
||||
v-model="modelValue.image"
|
||||
:isShowTip="false"
|
||||
@ -343,7 +343,16 @@ const data = reactive({
|
||||
},
|
||||
],
|
||||
leadStandard: [
|
||||
{ required: true, message: "请选择领先情况", trigger: "change" },
|
||||
{
|
||||
required: true,
|
||||
/*"请选择领先情况"*/
|
||||
message: computed(() =>
|
||||
t("admin.form.pleaseSelect", {
|
||||
type: t("admin.form.leadership"),
|
||||
})
|
||||
),
|
||||
trigger: "change",
|
||||
},
|
||||
],
|
||||
description: [
|
||||
{
|
||||
@ -361,7 +370,8 @@ const data = reactive({
|
||||
image: [
|
||||
{
|
||||
required: true,
|
||||
message: "请上传成果图片",
|
||||
// message: "请上传成果图片",
|
||||
message: computed(() => t("tips.pleaseUploadFile")),
|
||||
trigger: ["change", "blur"],
|
||||
},
|
||||
],
|
||||
|
@ -297,7 +297,7 @@ async function submitForm() {
|
||||
}
|
||||
|
||||
function addCheck() {
|
||||
if (!checkInput.value.trim().length) return ElMessage.error("请输入");
|
||||
if (!checkInput.value.trim().length) return ElMessage.error(t("input.input"));
|
||||
const flag = checkList.some((item) => {
|
||||
return item.name.trim() == checkInput.value.trim();
|
||||
});
|
||||
|
@ -48,11 +48,11 @@
|
||||
size="small"
|
||||
@click="handleQuery"
|
||||
>
|
||||
{{ t("admin.common.search") }}</el-button
|
||||
>
|
||||
{{ t("admin.common.search") }}
|
||||
</el-button>
|
||||
<el-button icon="Refresh" size="small" @click="resetQuery">
|
||||
{{ t("admin.common.reset") }}</el-button
|
||||
>
|
||||
{{ t("admin.common.reset") }}
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
@ -98,8 +98,8 @@
|
||||
type="text"
|
||||
icon="el-icon-plus"
|
||||
@click="handleBind(scope.row.id)"
|
||||
>认领</el-button
|
||||
>
|
||||
>{{ t("admin.table.claim") }}
|
||||
</el-button>
|
||||
<!-- <el-button
|
||||
v-else
|
||||
size="small"
|
||||
@ -123,31 +123,14 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import {
|
||||
addRole,
|
||||
changeRoleStatus,
|
||||
dataScope,
|
||||
delRole,
|
||||
getRole,
|
||||
listRole,
|
||||
updateRole,
|
||||
} from "@/api/system/role";
|
||||
import {
|
||||
getNoBindPatentList,
|
||||
bindPatent,
|
||||
} from "../../../../api/admin/expert/technology";
|
||||
import { getInfo } from "../../../../api/admin/expert/account";
|
||||
import {
|
||||
roleMenuTreeselect,
|
||||
treeselect as menuTreeselect,
|
||||
} from "@/api/system/menu";
|
||||
import {
|
||||
treeselect as deptTreeselect,
|
||||
roleDeptTreeselect,
|
||||
} from "@/api/system/dept";
|
||||
import { delRole } from "@/api/system/role";
|
||||
import { bindPatent, getNoBindPatentList } from "@/api/admin/expert/technology";
|
||||
import { getInfo } from "@/api/admin/expert/account";
|
||||
import { useRouter } from "vue-router";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { useI18n } from "vue-i18n";
|
||||
import { getCurrentInstance, reactive, ref, toRefs } from "vue";
|
||||
|
||||
const { t } = useI18n();
|
||||
const router = useRouter();
|
||||
const { proxy } = getCurrentInstance();
|
||||
@ -198,16 +181,19 @@ const getList = async () => {
|
||||
// }
|
||||
// );
|
||||
};
|
||||
|
||||
/** 搜索按钮操作 */
|
||||
function handleQuery() {
|
||||
queryParams.value.pageNum = 1;
|
||||
getList();
|
||||
}
|
||||
|
||||
/** 重置按钮操作 */
|
||||
function resetQuery() {
|
||||
proxy.resetForm("queryRef");
|
||||
handleQuery();
|
||||
}
|
||||
|
||||
/** 删除按钮操作 */
|
||||
function handleDelete(row) {
|
||||
proxy.$modal
|
||||
@ -227,6 +213,7 @@ function handleDelete(row) {
|
||||
})
|
||||
.catch(() => {});
|
||||
}
|
||||
|
||||
function handleBind(id) {
|
||||
getInfo()
|
||||
.then((resp) => {
|
||||
@ -238,7 +225,7 @@ function handleBind(id) {
|
||||
expertId: casExpert.id,
|
||||
}).then(() => {
|
||||
getList();
|
||||
ElMessage.success("认领专利成功");
|
||||
ElMessage.success(t("tips.claimPatentSuccess"));
|
||||
});
|
||||
});
|
||||
// expertPatentBind({ id: this.queryParams.id, patent_ids: [id] }).then(
|
||||
@ -248,6 +235,7 @@ function handleBind(id) {
|
||||
// }
|
||||
// );
|
||||
}
|
||||
|
||||
function handleUnbind(id) {
|
||||
// expertPatentUnbind({ id: this.queryParams.id, patent_ids: [id] }).then(
|
||||
// (res) => {
|
||||
|
@ -196,15 +196,15 @@
|
||||
<script setup>
|
||||
import InputBoxAdd from "@/views/components/InputBoxAdd";
|
||||
import {
|
||||
paperList,
|
||||
insertCasPaper,
|
||||
deleteCasPaper,
|
||||
insertCasPaper,
|
||||
paperList,
|
||||
updateCasPaper,
|
||||
} from "@/api/admin/expert/technology";
|
||||
import dayjs from "dayjs";
|
||||
import { cloneDeep } from "lodash";
|
||||
import { useRouter } from "vue-router";
|
||||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
import { ElMessage } from "element-plus";
|
||||
import modal from "@/plugins/modal";
|
||||
import { useI18n } from "vue-i18n";
|
||||
import { computed } from "vue";
|
||||
@ -350,7 +350,9 @@ function reset() {
|
||||
function handleAdd() {
|
||||
reset();
|
||||
showEditDialog.value = true;
|
||||
title.value = "添加论文";
|
||||
title.value = t("admin.form.add", {
|
||||
type: t("admin.common.paper"),
|
||||
});
|
||||
}
|
||||
|
||||
/** 修改数据 */
|
||||
@ -359,7 +361,9 @@ function handleUpdate(row) {
|
||||
form.value = cloneDeep(row);
|
||||
form.value.keywords = [...form.value.keyword?.split(",")];
|
||||
showEditDialog.value = true;
|
||||
title.value = "修改论文";
|
||||
title.value = t("admin.form.edit", {
|
||||
type: t("admin.common.paper"),
|
||||
});
|
||||
}
|
||||
|
||||
/** 提交按钮 */
|
||||
|
@ -270,11 +270,13 @@
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-form-item label="专利状态:" prop="status">
|
||||
<el-form-item :label="t('webSearch.patentStatus')" prop="status">
|
||||
<el-radio-group v-model="form.status">
|
||||
<el-radio label="1">授权</el-radio>
|
||||
<el-radio label="2">实审</el-radio>
|
||||
<el-radio label="3">公开</el-radio>
|
||||
<el-radio label="1"><!--授权-->{{ t("dict.authorized") }}</el-radio>
|
||||
<el-radio label="2"
|
||||
><!--实审-->{{ t("dict.substantiveExamination") }}
|
||||
</el-radio>
|
||||
<el-radio label="3"><!--公开-->{{ t("dict.public") }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('admin.form.summary')" prop="description">
|
||||
@ -461,12 +463,26 @@ const data = reactive({
|
||||
},
|
||||
],
|
||||
ipcCode: [
|
||||
{ required: true, message: "IPC分类号不能为空", trigger: "blur" },
|
||||
{
|
||||
required: true,
|
||||
/*"IPC分类号不能为空"*/
|
||||
message: computed(() =>
|
||||
t("admin.validation.required", {
|
||||
type: t("webSearch.ipc"),
|
||||
})
|
||||
),
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
status: [
|
||||
{
|
||||
required: true,
|
||||
message: "请选择专利状态",
|
||||
// message: "请选择专利状态",
|
||||
message: computed(() =>
|
||||
t("admin.validation.pleaseSelect", {
|
||||
type: t("webSearch.patentStatus"),
|
||||
})
|
||||
),
|
||||
trigger: "change",
|
||||
},
|
||||
],
|
||||
|
@ -147,7 +147,12 @@
|
||||
:underline="false"
|
||||
style="font-size: 12px; vertical-align: baseline"
|
||||
type="primary"
|
||||
@click="saveAs(xlsl, '成果导入模板.xlsx')"
|
||||
@click="
|
||||
saveAs(
|
||||
xlsl,
|
||||
`${t('admin.common.achievementImportTemplate')}.xlsx`
|
||||
)
|
||||
"
|
||||
>{{ t("tips.downloadTemplate") }}
|
||||
</el-link>
|
||||
</div>
|
||||
@ -157,8 +162,8 @@
|
||||
:underline="false"
|
||||
style="font-size: 12px; vertical-align: baseline"
|
||||
type="primary"
|
||||
@click="saveAs(importTip, '成果导入说明(必读).txt')"
|
||||
>下载
|
||||
@click="saveAs(importTip, `${t('tips.importInstructions')}.txt`)"
|
||||
><!--下载-->{{ t("common.download") }}
|
||||
</el-link>
|
||||
</div>
|
||||
</template>
|
||||
@ -307,7 +312,7 @@ const handleFileSuccess = (response, file, fileList) => {
|
||||
"<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
|
||||
response.msg +
|
||||
"</div>",
|
||||
"导入结果",
|
||||
t("tips.importResult"),
|
||||
{ dangerouslyUseHTMLString: true }
|
||||
);
|
||||
getList();
|
||||
@ -315,7 +320,7 @@ const handleFileSuccess = (response, file, fileList) => {
|
||||
|
||||
/** 下载模板操作 */
|
||||
const importTemplate = () => {
|
||||
saveAs(xlsl, "成果导入模板.xlsx");
|
||||
saveAs(xlsl, `${t("admin.common.achievementImportTemplate")}.xlsx`);
|
||||
};
|
||||
|
||||
/** 提交上传文件 */
|
||||
|
@ -133,7 +133,7 @@
|
||||
size="small"
|
||||
type="text"
|
||||
@click="submitBind(row.id)"
|
||||
>关联
|
||||
><!--关联-->{{ t("admin.table.relation") }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
@ -277,6 +277,7 @@ import {
|
||||
} from "@/api/admin/laboratory/expert";
|
||||
import Pagination from "@/components/Pagination/index.vue";
|
||||
import { useI18n } from "vue-i18n";
|
||||
import dayjs from "dayjs";
|
||||
|
||||
const router = useRouter();
|
||||
const { t } = useI18n();
|
||||
|
@ -221,7 +221,7 @@ const data = reactive({
|
||||
const { queryParams, formData, rules } = toRefs(data);
|
||||
const route = useRoute();
|
||||
const labelWidth = 140;
|
||||
const checkList = reactive([
|
||||
/*const checkList = reactive([
|
||||
{
|
||||
id: 1,
|
||||
name: "成果推广",
|
||||
@ -239,7 +239,7 @@ const checkList = reactive([
|
||||
name: "上市辅导",
|
||||
},
|
||||
]);
|
||||
const checkInput = ref("");
|
||||
const checkInput = ref("");*/
|
||||
|
||||
/*function addCheck() {
|
||||
if (!checkInput.value.trim().length) return ElMessage.error("请输入");
|
||||
|
@ -147,7 +147,12 @@
|
||||
:underline="false"
|
||||
style="font-size: 12px; vertical-align: baseline"
|
||||
type="primary"
|
||||
@click="saveAs(xlsl, '成果导入模板.xlsx')"
|
||||
@click="
|
||||
saveAs(
|
||||
xlsl,
|
||||
`${t('admin.common.achievementImportTemplate')}.xlsx`
|
||||
)
|
||||
"
|
||||
>{{ t("tips.downloadTemplate") }}
|
||||
</el-link>
|
||||
</div>
|
||||
@ -157,8 +162,9 @@
|
||||
:underline="false"
|
||||
style="font-size: 12px; vertical-align: baseline"
|
||||
type="primary"
|
||||
@click="saveAs(importTip, '成果导入说明(必读).txt')"
|
||||
>下载
|
||||
@click="saveAs(importTip, `${t('tips.importInstructions')}.txt`)"
|
||||
><!--下载-->
|
||||
{{ t("common.download") }}
|
||||
</el-link>
|
||||
</div>
|
||||
</template>
|
||||
@ -178,7 +184,6 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import dayjs from "dayjs";
|
||||
import { useRoute, useRouter } from "vue-router";
|
||||
import { reactive, ref, toRefs } from "vue";
|
||||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
@ -192,6 +197,7 @@ import xlsl from "@/assets/achievement_import_template.xlsx?url";
|
||||
import importTip from "@/assets/achievement_import_description.txt?url";
|
||||
import { saveAs } from "file-saver";
|
||||
import { useI18n } from "vue-i18n";
|
||||
import dayjs from "dayjs";
|
||||
|
||||
const { t } = useI18n();
|
||||
const router = useRouter();
|
||||
@ -302,7 +308,7 @@ const handleFileSuccess = (response, file, fileList) => {
|
||||
"<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
|
||||
response.msg +
|
||||
"</div>",
|
||||
"导入结果",
|
||||
t("tips.importResult"),
|
||||
{ dangerouslyUseHTMLString: true }
|
||||
);
|
||||
getList();
|
||||
|
@ -168,6 +168,7 @@ import { reactive, ref, toRefs } from "vue";
|
||||
import InputBoxAdd from "@/views/components/InputBoxAdd/index.vue";
|
||||
import { deleteBindExpert, expertList } from "@/api/admin/research/expert";
|
||||
import { useI18n } from "vue-i18n";
|
||||
import dayjs from "dayjs";
|
||||
|
||||
const { t } = useI18n();
|
||||
const router = useRouter();
|
||||
@ -235,7 +236,7 @@ function handleDeleteBind(id) {
|
||||
})
|
||||
.then(() => {
|
||||
getList();
|
||||
ElMessage.success("取消关联成功");
|
||||
ElMessage.success(t("tips.cancelAssociationSuccess"));
|
||||
})
|
||||
.catch((err) => {
|
||||
console.log(err);
|
||||
|
@ -5,14 +5,14 @@
|
||||
<el-col :span="12">
|
||||
<el-row :gutter="12" justify="center">
|
||||
<el-col :span="1.5">
|
||||
<el-button @click="cancel">{{
|
||||
t("admin.common.cancel")
|
||||
}}</el-button>
|
||||
<el-button @click="cancel"
|
||||
>{{ t("admin.common.cancel") }}
|
||||
</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button type="primary" @click="submit">{{
|
||||
t("admin.common.submit")
|
||||
}}</el-button>
|
||||
<el-button type="primary" @click="submit"
|
||||
>{{ t("admin.common.submit") }}
|
||||
</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-col>
|
||||
@ -30,6 +30,7 @@ import tab from "@/plugins/tab";
|
||||
import LaboratoryForm from "@/views/components/LaboratoryForm";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { useI18n } from "vue-i18n";
|
||||
|
||||
const { t } = useI18n();
|
||||
const data = reactive({
|
||||
form: {},
|
||||
@ -43,7 +44,7 @@ const submit = () => {
|
||||
if (valid) {
|
||||
form.value.researchDirection = form.value.researchs.join(",");
|
||||
laboratoryEdit(form.value).then((resp) => {
|
||||
ElMessage.success("修改实验室成功");
|
||||
ElMessage.success(t("admin.common.editSuccess"));
|
||||
cancel();
|
||||
});
|
||||
}
|
||||
|
@ -101,7 +101,7 @@
|
||||
>{{ t("admin.common.edit") }}
|
||||
</el-button>
|
||||
<el-button size="small" type="text" @click="handleCancelBind(row)"
|
||||
>解绑
|
||||
>{{ t("admin.table.unbind") }}
|
||||
<template #icon>
|
||||
<svg-icon icon-class="broken_link" />
|
||||
</template>
|
||||
@ -126,7 +126,10 @@
|
||||
:rules="rules"
|
||||
label-width="100px"
|
||||
>
|
||||
<el-form-item label="设备名称:" prop="name">
|
||||
<el-form-item
|
||||
:label="t('admin.form.name', { type: t('admin.common.equipment') })"
|
||||
prop="name"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.name"
|
||||
:placeholder="
|
||||
@ -145,7 +148,11 @@
|
||||
<el-form-item :label="t('admin.form.buyDate')" prop="buyDate">
|
||||
<el-date-picker
|
||||
v-model="form.buyDate"
|
||||
placeholder="请选择购买时间"
|
||||
:placeholder="
|
||||
t('admin.form.pleaseSelect', {
|
||||
type: t('admin.form.purchaseTime'),
|
||||
})
|
||||
"
|
||||
type="date"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
></el-date-picker>
|
||||
@ -191,7 +198,7 @@
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { reactive, ref, toRefs } from "vue";
|
||||
import { computed, reactive, ref, toRefs } from "vue";
|
||||
import { useRouter } from "vue-router";
|
||||
import { ElMessage } from "element-plus";
|
||||
import modal from "@/plugins/modal";
|
||||
@ -204,10 +211,10 @@ import {
|
||||
laboratoryEdit,
|
||||
laboratoryList,
|
||||
} from "@/api/admin/research/laboratory";
|
||||
import dayjs from "dayjs";
|
||||
import SvgIcon from "@/components/SvgIcon/index.vue";
|
||||
|
||||
import { useI18n } from "vue-i18n";
|
||||
import dayjs from "dayjs";
|
||||
|
||||
const { t } = useI18n();
|
||||
const router = useRouter();
|
||||
@ -227,13 +234,53 @@ const data = reactive({
|
||||
name: undefined,
|
||||
},
|
||||
rules: {
|
||||
name: [{ required: true, message: "设备名称不能为空", trigger: "blur" }],
|
||||
model: [{ required: true, message: "型号不能为空", trigger: "blur" }],
|
||||
param: [{ required: true, message: "成果参数不能为空", trigger: "blur" }],
|
||||
name: [
|
||||
{
|
||||
required: true,
|
||||
/*"设备名称不能为空"*/
|
||||
message: computed(() =>
|
||||
t("admin.form.placeholder", {
|
||||
type: t("admin.form.name", {
|
||||
type: t("admin.common.equipment"),
|
||||
}),
|
||||
})
|
||||
),
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
model: [
|
||||
{
|
||||
required: true,
|
||||
/*"型号不能为空"*/
|
||||
message: computed(() =>
|
||||
t("admin.form.placeholder", {
|
||||
type: t("admin.form.model"),
|
||||
})
|
||||
),
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
param: [
|
||||
{
|
||||
required: true,
|
||||
/*"成果参数不能为空*/
|
||||
message: computed(() =>
|
||||
t("admin.form.placeholder", {
|
||||
type: t("admin.form.achievementParameter"),
|
||||
})
|
||||
),
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
buyDate: [
|
||||
{
|
||||
required: true,
|
||||
message: "请选择购买时间",
|
||||
/* "请选择购买时间"*/
|
||||
message: computed(() =>
|
||||
t("admin.form.pleaseSelect", {
|
||||
type: t("admin.form.purchaseTime"),
|
||||
})
|
||||
),
|
||||
trigger: ["blur", "change"],
|
||||
},
|
||||
],
|
||||
@ -336,13 +383,13 @@ function submitForm() {
|
||||
|
||||
const handleCancelBind = (row) => {
|
||||
modal
|
||||
.confirm(`是否确认解绑实验室 : ${row.name}`, "解绑实验室")
|
||||
.confirm(`${t("home.unbindLab")} - ${row.name}`)
|
||||
.then(() => {
|
||||
return delBindLaboratory(row.id);
|
||||
})
|
||||
.then(() => {
|
||||
getList();
|
||||
ElMessage.success("解绑实验室成功");
|
||||
ElMessage.success(t("tips.unbindLabSuccess"));
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -118,7 +118,12 @@
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('admin.form.publication')" prop="ext">
|
||||
<el-input v-model="form.ext" placeholder="请输入刊物" />
|
||||
<el-input
|
||||
v-model="form.ext"
|
||||
:placeholder="
|
||||
t('admin.form.placeholder', { type: t('admin.form.publication') })
|
||||
"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="t('admin.form.author')" prop="author">
|
||||
<el-input
|
||||
@ -149,7 +154,7 @@
|
||||
<el-form-item :label="t('admin.form.summary')">
|
||||
<el-input
|
||||
v-model="form.remark"
|
||||
placeholder="请输入内容"
|
||||
:placeholder="t('admin.validation.pleaseEnterContent')"
|
||||
type="textarea"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
|
@ -125,7 +125,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";
|
||||
@ -192,7 +192,7 @@ function handleDelete(id) {
|
||||
.confirm(
|
||||
t("admin.common.confirmAction", {
|
||||
action: t("admin.common.delete"),
|
||||
id: id,
|
||||
number: id,
|
||||
type: t("admin.common.researchProject"),
|
||||
})
|
||||
)
|
||||
|
@ -130,7 +130,6 @@
|
||||
<script setup>
|
||||
import CityOptions from "@/views/components/CityOptions/index.vue";
|
||||
import { computed, reactive, ref, toRefs } from "vue";
|
||||
import editor from "@/components/WangEditor/index.vue";
|
||||
import { ElMessage } from "element-plus";
|
||||
import { useRoute } from "vue-router";
|
||||
import tab from "@/plugins/tab";
|
||||
@ -203,46 +202,59 @@ const data = reactive({
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
userPhone: [{ required: true, message: "手机号不能为空", trigger: "blur" }],
|
||||
userPhone: [
|
||||
{
|
||||
required: true,
|
||||
/*"手机号不能为空"*/
|
||||
message: computed(() =>
|
||||
t("admin.validation.required", { type: t("admin.form.mobile") })
|
||||
),
|
||||
trigger: "blur",
|
||||
},
|
||||
],
|
||||
},
|
||||
});
|
||||
|
||||
const { queryParams, formData, rules } = toRefs(data);
|
||||
const route = useRoute();
|
||||
const labelWidth = 140;
|
||||
const checkList = reactive([
|
||||
{
|
||||
id: 1,
|
||||
name: "成果推广",
|
||||
},
|
||||
{
|
||||
id: 2,
|
||||
name: "关键成果解决",
|
||||
},
|
||||
{
|
||||
id: 3,
|
||||
name: "对接专家院士",
|
||||
},
|
||||
{
|
||||
id: 4,
|
||||
name: "上市辅导",
|
||||
},
|
||||
]);
|
||||
const checkInput = ref("");
|
||||
// const checkList = reactive([
|
||||
// {
|
||||
// id: 1,
|
||||
// name: "成果推广",
|
||||
// i18n: computed(() => t("dict.achievementPromotion")),
|
||||
// },
|
||||
// {
|
||||
// id: 2,
|
||||
// name: "关键成果解决",
|
||||
// i18n: computed(() => t("dict.keyAchievementSolution")),
|
||||
// },
|
||||
// {
|
||||
// id: 3,
|
||||
// name: "对接专家院士",
|
||||
// i18n: computed(() => t("dict.expertDocking")),
|
||||
// },
|
||||
// {
|
||||
// id: 4,
|
||||
// name: "上市辅导",
|
||||
// i18n: computed(() => t("dict.listingGuidance")),
|
||||
// },
|
||||
// ]);
|
||||
// const checkInput = ref("");
|
||||
|
||||
function addCheck() {
|
||||
if (!checkInput.value.trim().length) return ElMessage.error("请输入");
|
||||
const flag = checkList.some((item) => {
|
||||
return item.name.trim() === checkInput.value.trim();
|
||||
});
|
||||
if (!flag) {
|
||||
checkList.push({
|
||||
id: checkList.length + 1,
|
||||
name: checkInput.value,
|
||||
});
|
||||
checkInput.value = "";
|
||||
}
|
||||
}
|
||||
// function addCheck() {
|
||||
// if (!checkInput.value.trim().length) return ElMessage.error("请输入");
|
||||
// const flag = checkList.some((item) => {
|
||||
// return item.name.trim() === checkInput.value.trim();
|
||||
// });
|
||||
// if (!flag) {
|
||||
// checkList.push({
|
||||
// id: checkList.length + 1,
|
||||
// name: checkInput.value,
|
||||
// });
|
||||
// checkInput.value = "";
|
||||
// }
|
||||
// }
|
||||
|
||||
const cancel = () => {
|
||||
tab.closeOpenPage({
|
||||
|
Reference in New Issue
Block a user