bug fix and performance improvements

This commit is contained in:
quantulr
2023-07-31 15:40:23 +08:00
parent 0933d20717
commit 0655aa1fa5
46 changed files with 587 additions and 209 deletions

View File

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

View File

@ -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: "Главная",

View File

@ -36,6 +36,9 @@ const common = {
submitAudit: "Отправить на проверку",
item: "этот пункт",
success: "{action} успешно",
demandCategory: "Категория спроса",
// 成果导入模板
achievementImportTemplate: "Шаблон импорта достижений",
};
export default common;

View File

@ -36,6 +36,9 @@ const common = {
submitAudit: "提交审核",
item: "该项",
success: "{action}成功",
demandCategory: "需求类别",
// 成果导入模板
achievementImportTemplate: "成果导入模板",
};
export default common;

View File

@ -103,5 +103,15 @@ const form = {
productionDirection: "Производственное направление",
// 需求提交人手机号
demandSubmitterPhone: "Телефон отправителя потребностей",
// 成果需求预算
achievementDemandBudget: "Бюджет потребностей достижений",
// 技术需求预算
technicalDemandBudget: "Бюджет технических потребностей",
// 购买时间
purchaseTime: "Время покупки",
// 领先情况
leadership: "Лидерство",
// 成果图片
achievementPicture: "Изображение достижений",
};
export default form;

View File

@ -101,6 +101,16 @@ const form = {
productionDirection: "生产方向",
// 需求提交人手机号
demandSubmitterPhone: "需求提交人手机号",
// 成果需求预算
achievementDemandBudget: "成果需求预算",
// 技术需求预算
technicalDemandBudget: "技术需求预算",
// 购买时间
purchaseTime: "购买时间",
// 领先情况
leadership: "领先情况",
// 成果图片
achievementPicture: "成果图片",
};
export default form;

View File

@ -60,6 +60,10 @@ const table = {
createTime: "Время создания",
// 需求提交人
demandSubmitter: "Податель требования",
// 解绑
unbind: "Отвязать",
// 承接需求
undertakeDemand: "Принять требование",
};
export default table;

View File

@ -60,5 +60,9 @@ const table = {
createTime: "创建时间",
// 需求提交人
demandSubmitter: "需求提交人",
// 解绑
unbind: "解绑",
// 承接需求
undertakeDemand: "承接需求",
};
export default table;

View File

@ -28,5 +28,13 @@ const common = {
requestTimeout: "Системный интерфейсный запрос превысил время ожидания",
// 结束
finish: "Завершить",
download: "Скачать",
// 浏览
browse: "Просмотреть",
// 确定注销并退出系统吗
areYouSureYouWantToLogOutAndExitTheSystem:
"Вы уверены, что хотите выйти из системы?",
// 提示
prompt: "Подсказка",
};
export default common;

View File

@ -27,6 +27,13 @@ export const common = {
requestTimeout: "系统接口请求超时",
// 结束
finish: "结束",
download: "下载",
// 浏览
browse: "浏览",
// 确定注销并退出系统吗
areYouSureYouWantToLogOutAndExitTheSystem: "确定注销并退出系统吗?",
// 提示
prompt: "提示",
};
export default common;

View File

@ -16,6 +16,16 @@ const dict = {
processed: "Обработано",
undertakingUnit: "Исполнительная единица",
participatingUnit: "Участвующая единица",
// 授权 实审 公开
authorized: "Авторизовано",
substantiveExamination: "Существенный анализ",
public: "Публичный",
// 专利状态
patentStatus: "Статус патента",
achievementPromotion: "Продвижение достижений",
keyAchievementSolution: "Ключевое решение достижений",
dockingExpertsAcademicians: "Док-ин экспертов и академиков",
listingGuidance: "Руководство по листингу",
};
export default dict;

View File

@ -16,6 +16,17 @@ const dict = {
processed: "已处理",
undertakingUnit: "承担单位",
participatingUnit: "参与单位",
// 授权 实审 公开
authorized: "已授权",
substantiveExamination: "实审",
public: "公开",
// 专利状态
patentStatus: "专利状态",
achievementPromotion: "成果推广",
keyAchievementSolution: "重点成果解决方案",
dockingExpertsAcademicians: "对接专家院士",
listingGuidance: "上市指导",
};
export default dict;

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

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

View File

@ -9,6 +9,20 @@ const tips = {
reasonDescription: "Описание причины незавершенного проекта",
browseEnterpriseInformation: "Просмотр информации о предприятии",
moveToDraftBox: "Переместить в черновик",
// 取消关联成功 取消发布成功 认领专利成功
cancelAssociationSuccess: "Отмена связи прошла успешно",
cancelReleaseSuccess: "Отмена публикации прошла успешно",
claimPatentSuccess: "Патент успешно принят",
// 解绑实验室成功
unbindLabSuccess: "Успешно отвязана лаборатория",
// 导入结果
importResult: "Результат импорта",
// 面议
faceToFace: "По договоренности",
// 更新企业信息成功
updateEnterpriseInformationSuccess:
"Информация о предприятии успешно обновлена",
};
export default tips;

View File

@ -9,6 +9,19 @@ const tips = {
reasonDescription: "未结题原因描述",
browseEnterpriseInformation: "浏览企业信息",
moveToDraftBox: "移到草稿箱",
// 取消关联成功 取消发布成功 认领专利成功
cancelAssociationSuccess: "取消关联成功",
cancelReleaseSuccess: "取消发布成功",
claimPatentSuccess: "认领专利成功",
// 解绑实验室成功
unbindLabSuccess: "解绑实验室成功",
// 导入结果
importResult: "导入结果",
// 面议
faceToFace: "面议",
// 更新企业信息成功
updateEnterpriseInformationSuccess: "更新企业信息成功",
};
export default tips;

View File

@ -108,6 +108,8 @@ const webSearch = {
"Пожалуйста, введите содержание технических требований и подробные технические показатели",
// 查看匹配结果
viewMatchingResults: "Просмотр результатов сопоставления",
// 专利状态
patentStatus: "Статус патента",
};
export default webSearch;

View File

@ -108,5 +108,7 @@ const webSearch = {
"请输入技术需求内容和详细的技术指标",
// 查看匹配结果
viewMatchingResults: "查看匹配结果",
// 专利状态
patentStatus: "专利状态",
};
export default webSearch;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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"),
});
}
/** 提交按钮 */

View File

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

View File

@ -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`);
};
/** 提交上传文件 */

View File

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

View File

@ -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("请输入");

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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