This commit is contained in:
quantulr
2024-05-30 17:27:57 +08:00
parent 4e2e93bb81
commit 05a8bf0940
35 changed files with 2083 additions and 1912 deletions

View File

@ -48,11 +48,11 @@
"devDependencies": {
"@vitejs/plugin-vue": "2.3.3",
"@vue/compiler-sfc": "3.2.36",
"autoprefixer": "^10.4.14",
"postcss": "^8.4.26",
"autoprefixer": "^10.4.19",
"postcss": "^8.4.38",
"prettier": "^2.8.8",
"sass": "1.52.1",
"tailwindcss": "^3.3.3",
"tailwindcss": "^3.4.3",
"unplugin-auto-import": "0.8.5",
"vite": "2.9.16",
"vite-plugin-compression": "0.5.1",

6
postcss.config.js Normal file
View File

@ -0,0 +1,6 @@
module.exports = {
plugins: {
tailwindcss: {},
autoprefixer: {},
},
}

View File

@ -6,7 +6,11 @@ export const listNews = (params) =>
method: "GET",
params,
});
export const listCategory = () =>
request({
url: "/app/news/category",
method: "GET",
});
export const getNewsInfo = (id) =>
request({
url: `/app/news/${id}`,

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 145 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@ -5,6 +5,7 @@
@import "./sidebar.scss";
@import "./btn.scss";
@import "./ruoyi.scss";
@import "./tailwindcss";
body {
height: 100%;
@ -12,8 +13,7 @@ body {
-moz-osx-font-smoothing: grayscale;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
font-family:
Helvetica Neue,
font-family: Helvetica Neue,
Helvetica,
PingFang SC,
Hiragino Sans GB,
@ -211,16 +211,19 @@ aside {
width: 1000px;
margin: 0 auto;
}
.conter1400 {
width: 1400px;
margin: 0 auto;
}
// 1行文本省略号
.ellipsis {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
// 2行文本省略号
.text_hidden {
overflow: hidden;
@ -229,24 +232,30 @@ aside {
-webkit-box-orient: vertical;
word-break: break-all;
}
.x_btns {
font-size: 16px !important;
color: #fff !important;
border-radius: 0 !important;
background-color: #0054ff !important;
}
.x16 {
font-size: 16px !important;
}
.x_fff {
color: #fff !important;
}
.x_blue {
color: #0054ff !important;
}
.x_border_blue {
border: 1px solid #0054ff !important;
}
.x_bg_blue {
background-color: #0054ff !important;
}

View File

@ -0,0 +1,23 @@
.h-screen {
height: 100vh;
}
.flex {
display: flex;
}
.flex-col {
flex-direction: column;
}
.flex-1 {
flex: 1;
}
.items-center {
align-items: center;
}
.justify-center {
justify-content: center;
}

View File

@ -106,10 +106,10 @@ export const seeLogTypeDict = [
export const orderTypeDict = [
{
value: "1",
label: "创新币充值",
label: "技术交易",
i18n: "coinRecharge",
elTagType: "primary",
zh: "创新币充值",
zh: "技术交易",
ru: "Пополнение монеты инноваций",
},
{

View File

@ -118,5 +118,14 @@ const form = {
productField: "Область продукта",
// 成熟度证明材料
maturityProofMaterial: "Материалы подтверждения зрелости",
achievementIntroduction:`Презентация продукта:
● Рыночный спрос: Описание рыночного спроса или проблемы, решаемой данной технологической разработкой.
● Описание продукта: Краткое описание продукта, сравнение с конкурентами, область применения.
Технические параметры:
● Основная технология: Подробное описание основных принципов и технологий разработки.
● Технические параметры: Предоставление ключевых технических параметров и показателей производительности.
Сценарии применения:
● Практическое применение: Описание случаев практического применения данной технологической разработки.
● Потенциальные клиенты: Описание других типов целевых клиентов и их наименований.`
};
export default form;

View File

@ -116,6 +116,15 @@ const form = {
productField: "产品领域",
// 成熟度证明材料
maturityProofMaterial: "成熟度证明材料",
achievementIntroduction:`产品介绍:
●市场需求:描述该科技成果解决的市场需求或问题。
●产品描述:产品简介,竞品对比,适用范围。
技术参数:
●核心技术:详细介绍科技成果的核心原理和技术。
●技术参数:提供关键的技术参数和性能指标。
应用场景:
●实际应用:描述该科技成果在实际中的应用案例。
●潜在客户:描述产品其他重点客户类型及客户名称。`
};
export default form;

View File

@ -9,7 +9,7 @@ const dict = {
expert: "专家",
researchProject: "科研项目",
paper: "论文",
coinRecharge: "创新币充值",
coinRecharge: "技术交易",
activityRegistration: "活动报名",
notApplied: "未申请",
applied: "已申请",

View File

@ -0,0 +1,3 @@
@tailwind base;
@tailwind components;
@tailwind utilities;

View File

@ -1,12 +1,14 @@
import { createApp } from "vue";
// import "@/index.css";
import Cookies from "js-cookie";
import ElementPlus from "element-plus";
import locale from "element-plus/lib/locale/lang/zh-cn"; // 中文语言
import "@/assets/styles/index.scss"; // global css
import "@/index.css";
// import {createI18n} from "vue-i18n";
// import {messages} from '@/i18n'

View File

@ -1,4 +1,4 @@
import { createRouter, createWebHistory } from "vue-router";
import {createRouter, createWebHistory} from "vue-router";
/* Layout */
import Layout from "@/layout";
import basicInfo from "../views/admin/enterprise/account/basicInfo.vue";
@ -25,7 +25,7 @@ import i18n from "@/i18n";
activeMenu: '/system/user' // 当路由设置了该属性,则会高亮相对应的侧边栏。
}
*/
const { t } = i18n.global;
const {t} = i18n.global;
// 公共路由
export const constantRoutes = [
{
@ -251,37 +251,37 @@ export const constantRoutes = [
path: "index",
component: () => import("@/views/identity/index"),
name: "index",
meta: { title: "身份选择" },
meta: {title: "身份选择"},
},
{
path: "enterprise",
component: () => import("@/views/identity/enterprise"),
name: "enterprise",
meta: { title: "企业入驻" },
meta: {title: "企业入驻"},
},
{
path: "expert",
component: () => import("@/views/identity/expert"),
name: "expert",
meta: { title: "专家入驻" },
meta: {title: "专家入驻"},
},
{
path: "research",
component: () => import("@/views/identity/research"),
name: "research",
meta: { title: "研究机构入驻" },
meta: {title: "研究机构入驻"},
},
{
path: "laboratory",
component: () => import("@/views/identity/laboratory"),
name: "laboratory",
meta: { title: "实验室入驻" },
meta: {title: "实验室入驻"},
},
{
path: "agent",
component: () => import("@/views/identity/agent"),
name: "agent",
meta: { title: "科技经纪人入驻" },
meta: {title: "科技经纪人入驻"},
},
],
}, //TODO:
@ -309,7 +309,7 @@ export const constantRoutes = [
path: "profile",
component: () => import("@/views/system/user/profile/index"),
name: "Profile",
meta: { title: "个人中心", icon: "user" },
meta: {title: "个人中心", icon: "user"},
},
],
},
@ -831,28 +831,16 @@ export const laboratoryRoutes = [
redirect: "/admin/research/patent",
children: [
{
path: "patent",
path: "expert",
component: () =>
import("@/views/admin/laboratory/research/patent/index.vue"),
name: "Patent",
import("@/views/admin/laboratory/research/expert/index.vue"),
name: "Expert",
meta: {
title: "专列表",
title: "专列表",
icon: "list",
i18nStr: "routes.lab.patentList",
i18nStr: "routes.lab.expertList",
},
},
// {
// path: "achievement",
// component: () =>
// import("@/views/admin/laboratory/research/achievement/index.vue"),
// name: "Achievement",
// meta: {
// title: "成果列表",
// icon: "list",
// i18nStr: "routes.lab.achievementList",
// },
// },
{
}, {
path: "expert-achievement",
component: () =>
import("@/views/admin/laboratory/research/achievement/index.vue"),
@ -874,6 +862,68 @@ export const laboratoryRoutes = [
},
name: "LabAchievement",
},
{
path: "laboratory-equipment",
component: () =>
import(
"@/views/admin/laboratory/research/laboratory-equipment/index.vue"
),
name: "LaboratoryEquipment",
meta: {
title: "实验设备",
icon: "list",
i18nStr: "routes.lab.experimentalEquipment",
},
},
{
path: "paper",
component: () =>
import("@/views/admin/laboratory/research/paper/index.vue"),
name: "Paper",
meta: {
title: "论文列表",
icon: "list",
i18nStr: "routes.lab.paperList",
},
},
{
path: "research-project",
component: () =>
import(
"@/views/admin/laboratory/research/research-project/index.vue"
),
name: "ResearchProject",
meta: {
title: "科研项目列表",
icon: "list",
i18nStr: "routes.lab.researchProjectList",
},
},
{
path: "patent",
component: () =>
import("@/views/admin/laboratory/research/patent/index.vue"),
name: "Patent",
meta: {
title: "专利列表",
icon: "list",
i18nStr: "routes.lab.patentList",
},
},
// {
// path: "achievement",
// component: () =>
// import("@/views/admin/laboratory/research/achievement/index.vue"),
// name: "Achievement",
// meta: {
// title: "成果列表",
// icon: "list",
// i18nStr: "routes.lab.achievementList",
// },
// },
{
path: "release",
component: () =>
@ -909,41 +959,8 @@ export const laboratoryRoutes = [
i18nStr: "routes.lab.viewDemand",
},
},
{
path: "expert",
component: () =>
import("@/views/admin/laboratory/research/expert/index.vue"),
name: "Expert",
meta: {
title: "专家列表",
icon: "list",
i18nStr: "routes.lab.expertList",
},
},
{
path: "research-project",
component: () =>
import(
"@/views/admin/laboratory/research/research-project/index.vue"
),
name: "ResearchProject",
meta: {
title: "科研项目列表",
icon: "list",
i18nStr: "routes.lab.researchProjectList",
},
},
{
path: "paper",
component: () =>
import("@/views/admin/laboratory/research/paper/index.vue"),
name: "Paper",
meta: {
title: "论文列表",
icon: "list",
i18nStr: "routes.lab.paperList",
},
},
{
path: "paper/unit-info",
component: () =>
@ -956,19 +973,7 @@ export const laboratoryRoutes = [
i18nStr: "routes.lab.viewUnitInformation",
},
},
{
path: "laboratory-equipment",
component: () =>
import(
"@/views/admin/laboratory/research/laboratory-equipment/index.vue"
),
name: "LaboratoryEquipment",
meta: {
title: "实验设备",
icon: "list",
i18nStr: "routes.lab.experimentalEquipment",
},
},
],
},
];
@ -1351,7 +1356,7 @@ const router = createRouter({
if (savedPosition) {
return savedPosition;
} else {
return { top: 0 };
return {top: 0};
}
},
});

View File

@ -1,5 +1,5 @@
import { login, logout, getInfo } from "@/api/login";
import { getToken, setToken, removeToken } from "@/utils/auth";
import {login, logout, getInfo} from "@/api/login";
import {getToken, setToken, removeToken} from "@/utils/auth";
// import defAva from "@/assets/images/profile.jpg";
import defAva from "@/assets/logo/avatar.png";
@ -14,6 +14,7 @@ const useUserStore = defineStore("user", {
userId: "",
nickName: "",
enterprise: {},
vip: null
}),
actions: {
// 登录
@ -41,6 +42,7 @@ const useUserStore = defineStore("user", {
.then((res) => {
const user = res.data.user;
const enterprise = res.data.enterprise;
const vip = res.data.vip;
const userId = user.userId;
const avatar =
/* user.avatar == "" || user.avatar == null
@ -59,6 +61,7 @@ const useUserStore = defineStore("user", {
this.userId = userId;
this.nickName = user.nickName;
this.enterprise = enterprise;
this.vip = vip;
resolve(res);
})
.catch((error) => {

View File

@ -55,8 +55,8 @@
</div>
</div>
<div class="contact">
{{ t("webContact.phone") }}<a href="tel:18156053255">18156053255</a>
({{ t("webSearch.wechat") }})
{{ t("webSearch.contactInformation") }}<a href="tel:(+86)18156053255">(+86)18156053255, zkxh2024@qq.com</a>
<!-- ({{ t("webSearch.wechat") }})-->
</div>
</div>
</div>

View File

@ -102,7 +102,7 @@
{{ t("admin.common.delete") }}
</el-button>
<el-button
v-if="queryParams.status == 1"
v-if="queryParams.status == 1 && vip && vip.vipType != '0'"
size="small"
type="text"
icon="View"
@ -156,6 +156,8 @@ import modal from "@/plugins/modal";
import { useRouter } from "vue-router";
import { useI18n } from "vue-i18n";
import { getCurrentInstance, reactive, ref, toRefs } from "vue";
import useUserStore from "../../../../store/modules/user";
import {storeToRefs} from "pinia";
const { t } = useI18n();
const { proxy } = getCurrentInstance();
@ -175,6 +177,9 @@ const data = reactive({
const { queryParams, form, rules } = toRefs(data);
const userStore = useUserStore()
const {vip} = storeToRefs(userStore)
/** 查询列表 */
const getList = async () => {
loading.value = true;

View File

@ -30,7 +30,7 @@
</el-radio-group>
<el-table v-loading="loading" :data="dataList" style="margin-top: 20px">
<el-table-column :label="t('admin.common.dataNumber')" prop="id" />
<el-table-column :label="t('admin.common.dataNumber')" prop="id"/>
<el-table-column
:label="t('admin.form.name', { type: t('admin.form.product') })"
prop="title"
@ -85,7 +85,7 @@
{{ t("admin.common.delete") }}
</el-button>
<el-button
v-if="queryParams.status == 1"
v-if="queryParams.status == 1 && vip && vip.vipType != '0'"
size="small"
type="text"
icon="View"
@ -136,19 +136,22 @@ import {
getEnterpriseProduct,
updateEnterpriseProduct,
} from "@/api/admin/enterprise/product";
import { ElMessage } from "element-plus";
import {ElMessage} from "element-plus";
import modal from "@/plugins/modal";
import { onActivated, reactive, ref, toRefs } from "vue";
import { useRouter } from "vue-router";
import { useI18n } from "vue-i18n";
import {onActivated, reactive, ref, toRefs} from "vue";
import {useRouter} from "vue-router";
import {useI18n} from "vue-i18n";
import useUserStore from "../../../../store/modules/user";
import {storeToRefs} from "pinia";
const { t } = useI18n();
const {t} = useI18n();
const router = useRouter();
const dataList = ref([]);
const loading = ref(true);
const showSearch = ref(true);
const total = ref(0);
const userStore = useUserStore()
const {vip} = storeToRefs(userStore)
const data = reactive({
queryParams: {
pageNum: 1,
@ -157,7 +160,7 @@ const data = reactive({
},
});
const { queryParams } = toRefs(data);
const {queryParams} = toRefs(data);
/** 查询列表 */
const getList = async () => {
@ -206,7 +209,7 @@ const releaseCancel = (id) => {
}),
)
.then(async () => {
await updateEnterpriseProduct({ id, status: 3 });
await updateEnterpriseProduct({id, status: 3});
ElMessage.success(t("tips.cancelReleaseSuccess"));
getList();
})
@ -229,16 +232,17 @@ const handleShelf = (row) => {
)
.then(function () {
let status = row.shelfStatus == 1 ? 2 : 1;
return updateEnterpriseProduct({ id: row.id, shelfStatus: status });
return updateEnterpriseProduct({id: row.id, shelfStatus: status});
})
.then(() => {
getList();
ElMessage.success(t("admin.common.success", { action: text }));
ElMessage.success(t("admin.common.success", {action: text}));
})
.catch(() => {});
.catch(() => {
});
};
const handleResults = (row) => {
router.push({ path: "./results", query: { keyword: row.title } });
router.push({path: "./results", query: {keyword: row.title}});
};
const handleDetails = (id) => {
router.push({
@ -249,7 +253,7 @@ const handleDetails = (id) => {
});
};
const checkEnterpriseInfo = (id) => {
router.push({ path: "./business" });
router.push({path: "./business"});
};
onActivated(() => {

View File

@ -240,8 +240,9 @@
>
<el-input
v-model="modelValue.description"
:autosize="{ minRows: 6, maxRows: 8 }"
:autosize="{ minRows: 10 }"
type="textarea"
:placeholder="t('admin.form.achievementIntroduction')"
/>
</el-form-item>
</el-col>
@ -293,10 +294,10 @@ import {
leadOptions,
maturityOptions,
} from "@/utils/parameter";
import { computed, reactive, ref, toRefs } from "vue";
import { useI18n } from "vue-i18n";
import {computed, reactive, ref, toRefs} from "vue";
import {useI18n} from "vue-i18n";
const { t, locale } = useI18n();
const {t, locale} = useI18n();
const props = defineProps({
modelValue: Object,
isAdd: {
@ -312,7 +313,7 @@ const props = defineProps({
default: 120,
},
});
const { modelValue, isAdd, showTitle, labelWidth } = toRefs(props);
const {modelValue, isAdd, showTitle, labelWidth} = toRefs(props);
const data = reactive({
rules: {
title: [
@ -343,7 +344,7 @@ const data = reactive({
{
required: true,
message: computed(() =>
t("admin.form.placeholder", { type: t("admin.form.country") }),
t("admin.form.placeholder", {type: t("admin.form.country")}),
),
trigger: "blur",
},
@ -385,14 +386,14 @@ const data = reactive({
{
required: true,
message: computed(() =>
t("admin.form.placeholder", { type: t("webSearch.unit") }),
t("admin.form.placeholder", {type: t("webSearch.unit")}),
),
trigger: "blur",
},
],
},
});
const { rules } = toRefs(data);
const {rules} = toRefs(data);
// import { researchSelect, laboratorySelect } from "@/api/identity/index";
const formRef = ref();
const fieldFormRef = ref();

View File

@ -48,25 +48,8 @@
</el-col>
</el-row>
<!-- <el-row>
<el-col :span="12">
<el-form-item :label="t('webSearch.unit')" prop="researchId">
<el-select
v-model="modelValue.researchId"
filterable
:placeholder="t('admin.form.pleaseSelect')"
@change="setLaboratory"
>
<el-option
v-for="item in researchOptions"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<!--
<el-col :span="12">
<el-form-item label="所属实验室:">
<el-select
@ -152,7 +135,29 @@
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item :label="t('webSearch.unit')" prop="workplace">
<el-input v-model="modelValue.workplace" :placeholder="t('admin.form.placeholder', {
name: t('webSearch.unit'),
})"/>
<!-- <el-select-->
<!-- v-model="modelValue.researchId"-->
<!-- filterable-->
<!-- :placeholder="t('admin.form.pleaseSelect')"-->
<!-- @change="setLaboratory"-->
<!-- >-->
<!-- <el-option-->
<!-- v-for="item in researchOptions"-->
<!-- :key="item.id"-->
<!-- :label="item.name"-->
<!-- :value="item.id"-->
<!-- >-->
<!-- </el-option>-->
<!-- </el-select>-->
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item :label="t('admin.form.position')" prop="job">
@ -240,11 +245,11 @@
<script name="ExpertForm" setup>
import FieldOptions from "@/views/components/FieldOptions";
import InputBoxAdd from "@/views/components/InputBoxAdd";
import { countryOptions, educationOptions } from "@/utils/parameter";
import { useI18n } from "vue-i18n";
import { computed, onActivated, reactive, ref, toRefs } from "vue";
import {countryOptions, educationOptions} from "@/utils/parameter";
import {useI18n} from "vue-i18n";
import {computed, onActivated, reactive, ref, toRefs} from "vue";
const { t, locale } = useI18n();
const {t, locale} = useI18n();
const props = defineProps({
modelValue: Object,
@ -261,7 +266,7 @@ const props = defineProps({
default: 120,
},
});
const { modelValue, isAdd, showTitle, labelWidth } = toRefs(props);
const {modelValue, isAdd, showTitle, labelWidth} = toRefs(props);
const data = reactive({
rules: {
product: [
@ -373,7 +378,7 @@ const data = reactive({
{
required: true,
message: computed(() =>
t("admin.validation.required", { type: t("admin.form.workingTime") }),
t("admin.validation.required", {type: t("admin.form.workingTime")}),
),
trigger: ["change", "blur"],
},
@ -392,10 +397,17 @@ const data = reactive({
trigger: ["change", "blur"],
},
],
workplace: [
{
required: true,
message: computed(() => t("admin.form.placeholder")),
trigger: ["blur"],
}
]
},
});
const { rules } = toRefs(data);
const {rules} = toRefs(data);
const researchOptions = ref([]);
const options = ref([]);
const formRef = ref();
@ -403,7 +415,8 @@ const cityFormRef = ref();
const fieldFormRef = ref();
const keywordsFormRef = ref();
const researchsFormRef = ref();
const setLaboratory = () => {};
const setLaboratory = () => {
};
const validateForm = async () => {
let formValid;
try {

View File

@ -202,6 +202,15 @@
>
<el-input
type="textarea"
placeholder="产品介绍:&#13;
&nbsp●市场需求描述该科技成果解决的市场需求或问题。&#13;
&nbsp●产品描述产品简介竞品对比适用范围。&#13;
技术参数:&#13;
&nbsp●核心技术详细介绍科技成果的核心原理和技术。&#13;
&nbsp●技术参数提供关键的技术参数和性能指标。&#13;
应用场景:&#13;
&nbsp●实际应用描述该科技成果在实际中的应用案例。&#13;
&nbsp●潜在客户描述产品其他重点客户类型及客户名称。"
v-model="modelValue.introduce"
:autosize="{ minRows: 6, maxRows: 8 }"
></el-input>
@ -211,7 +220,7 @@
<el-row>
<el-col :span="12">
<el-form-item :label="t('admin.form.productPicture')" prop="image">
<ImageUpload v-model="modelValue.image" :limit="1" />
<ImageUpload v-model="modelValue.image" :limit="1"/>
</el-form-item>
</el-col>
</el-row>
@ -240,11 +249,11 @@ import {
leadOptions,
maturityOptions,
} from "@/utils/parameter";
import { computed, reactive, toRefs } from "vue"; // import VideoUpload from "@/components/VideoUpload";
import {computed, reactive, toRefs} from "vue"; // import VideoUpload from "@/components/VideoUpload";
// import { researchSelect, laboratorySelect } from "@/api/identity/index";
import { useI18n } from "vue-i18n";
import {useI18n} from "vue-i18n";
const { t, locale } = useI18n();
const {t, locale} = useI18n();
const props = defineProps({
modelValue: Object,
isAdd: {
@ -260,7 +269,7 @@ const props = defineProps({
default: 120,
},
});
const { modelValue, isAdd, showTitle, labelWidth } = toRefs(props);
const {modelValue, isAdd, showTitle, labelWidth} = toRefs(props);
const data = reactive({
rules: {
@ -362,7 +371,7 @@ const data = reactive({
{
required: true,
message: computed(() =>
t("admin.validation.required", { type: t("admin.form.workingTime") }),
t("admin.validation.required", {type: t("admin.form.workingTime")}),
),
trigger: ["change", "blur"],
},
@ -397,7 +406,7 @@ const data = reactive({
],
},
});
const { rules } = toRefs(data);
const {rules} = toRefs(data);
const formRef = ref(null);
const fieldFormRef = ref(null);
const customerFormRef = ref(null);

View File

@ -1,5 +1,5 @@
<template>
<div v-if="identityList.length" class="app-container">
<div v-if="identityList.length" class="app-container h-screen flex flex-col">
<el-row>
<el-col :span="2">
<el-button
@ -23,14 +23,13 @@
></el-alert>
</el-col>
</el-row>
<el-card shadow="always">
<el-card v-if="false" shadow="always">
<el-row :gutter="20" justify="center">
<!-- v-show="item.id <= 2"-->
<el-col
v-for="item in identityList"
:key="item.id"
:span="4"
@click="handleStatus(item)"
>
<el-card style="text-align: center; height: 100%">
<el-image
@ -39,7 +38,7 @@
style="height: 100px"
></el-image>
<h3>
{{ t("admin.identity.entrance.settleIn", { type: item.title }) }}
{{ t("admin.identity.entrance.settleIn", {type: item.title}) }}
</h3>
<p v-if="item.status === '0'">
{{
@ -62,7 +61,7 @@
</p>
</div>
<div v-else-if="item.status === '4'">
<el-link type="primary">
<el-link type="primary" @click="handleStatus(item)">
<!-- 申请-->
{{ t("admin.identity.entrance.apply") }}
</el-link>
@ -71,47 +70,86 @@
</el-col>
</el-row>
</el-card>
<el-card class="mt20" shadow="always">
<div class="flex-1 flex justify-center flex-col">
<el-card shadow="always">
<el-row :gutter="20" justify="center">
<!-- v-show="item.id <= 2"-->
<el-col v-for="item in identityList" :key="item.id" :span="4">
<el-col v-for="(item,idx) in identityList" :key="item.id" :span="4">
<el-card style="text-align: center; height: 100%">
<el-image
fit="cover"
src="https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg"
:src="iconList[idx]"
style="height: 100px"
></el-image>
<h3>
{{ t("admin.identity.entrance.backstage", { type: item.title }) }}
{{ t("admin.identity.entrance.backstage", {type: item.title}) }}
</h3>
<p v-if="item.status === '1'">
<p v-if="item.status === '0'">
{{
// 审核中
t("admin.identity.entrance.underReview")
}}
</p>
<p v-else-if="item.status === '1'">
<!-- <p> -->
<el-link type="primary" @click="handlePage(item)">
<el-link type="danger" class="!text-red-500" @click="handlePage(item,$event)">
<!-- 进入-->
{{ t("admin.identity.entrance.enter") }}
</el-link>
</p>
<div v-else-if="item.status === '2'">
<p class="text-danger">
<!-- 审核拒绝-->
{{ t("admin.identity.entrance.rejected") }}
</p>
<p
class="text-navy"
style="cursor: pointer"
@click.stop="reason(item)"
>
<!-- 查看拒绝原因-->
{{ t("admin.identity.entrance.viewReasonsForRejection") }}
</p>
</div>
<div v-else-if="item.status === '4'">
<el-link type="primary" @click="handleStatus(item)">
<!-- 申请-->
{{ t("admin.identity.entrance.apply") }}
</el-link>
</div>
</el-card>
</el-col>
</el-row>
</el-card>
</div>
</div>
</template>
<script setup>
// import store from "@/store";
import { identity } from "@/api/identity";
import { useRouter } from "vue-router";
import {identity} from "@/api/identity";
import {useRouter} from "vue-router";
import usePermissionStore from "@/store/modules/permission";
import useUserStore from "@/store/modules/user";
import { ElMessageBox } from "element-plus";
import { ArrowLeftBold } from "@element-plus/icons-vue";
import { computed, onMounted, reactive, ref } from "vue";
import { useI18n } from "vue-i18n";
import {ElMessageBox} from "element-plus";
import {ArrowLeftBold} from "@element-plus/icons-vue";
import {computed, onMounted, reactive, ref} from "vue";
import {useI18n} from "vue-i18n";
import enterpriseIcon from '@/assets/icons/identity/企业.jpg'
import expertIcon from '@/assets/icons/identity/专家.png'
import labIcon from '@/assets/icons/identity/实验室.jpg'
import researchIcon from '@/assets/icons/identity/科研机构.jpg'
import agentIcon from '@/assets/icons/identity/经纪人.jpg'
const router = useRouter();
const { t } = useI18n();
const {t} = useI18n();
const userStore = useUserStore();
const iconList = [
enterpriseIcon,
expertIcon,
labIcon,
researchIcon,
agentIcon
]
const identityList = ref([]);
const identityDict = reactive({
1: computed(() => t("admin.identity.entrance.company")),
@ -161,19 +199,19 @@ function handleStatus(item) {
if (item.status === "4" || item.status === "2") {
if (item.id === 1) {
// 企业
router.push({ path: "/identity/enterprise" });
router.push({path: "/identity/enterprise"});
} else if (item.id === 2) {
// 专家
router.push({ path: "/identity/expert" });
router.push({path: "/identity/expert"});
} else if (item.id === 3) {
// 实验室
router.push({ path: "/identity/laboratory" });
router.push({path: "/identity/laboratory"});
} else if (item.id === 4) {
// 研究机构
router.push({ path: "/identity/research" });
router.push({path: "/identity/research"});
} else if (item.id === 5) {
// 科技经纪人
router.push({ path: "/identity/agent" });
router.push({path: "/identity/agent"});
}
} else if (item.status === 1) {
alert("您已入驻,请进入后台");
@ -181,23 +219,24 @@ function handleStatus(item) {
}
}
const handlePage = async (item) => {
const handlePage = async (item, ev) => {
ev.stopPropagation()
let routeData = "";
if (item.id === 1) {
// 企业
routeData = router.resolve({ path: "/admin" });
routeData = router.resolve({path: "/admin"});
} else if (item.id === 2) {
// 专家
routeData = router.resolve({ path: "/admin" });
routeData = router.resolve({path: "/admin"});
} else if (item.id === 3) {
// 研究机构
routeData = router.resolve({ path: "/admin" });
routeData = router.resolve({path: "/admin"});
} else if (item.id === 4) {
// 实验室
routeData = router.resolve({ path: "/admin" });
routeData = router.resolve({path: "/admin"});
} else if (item.id === 5) {
// 科技经纪人
routeData = router.resolve({ path: "/admin" });
routeData = router.resolve({path: "/admin"});
}
// return window.open(routeData.href, "_blank");
// TODO ...... 切换身份待处理
@ -215,3 +254,4 @@ const handlePage = async (item) => {
// });
};
</script>

View File

@ -381,7 +381,7 @@ function config(params) {
const publicActivity = async () => {
// const { data } = await config({ key: "mobile" });
const data = {
mobile: { name: t("activity.contactInformation"), value: "18156053255" },
mobile: { name: t("activity.contactInformation"), value: "(+86)18156053255, zkxh2024@qq.com" },
};
mobile.value = data.mobile.value;
dialogVisible.value = true;

View File

@ -1,15 +1,15 @@
<script setup>
import { reactive, ref, toRefs } from "vue";
import { listNews } from "@/api/website/home/news";
import {reactive, ref, toRefs} from "vue";
import {listCategory, listNews} from "@/api/website/home/news";
import Pagination from "@/components/Pagination/index.vue";
import { useI18n } from "vue-i18n";
import {useI18n} from "vue-i18n";
import dayjs from "dayjs";
const { t, locale } = useI18n();
const {t, locale} = useI18n();
const file_base_url = `${import.meta.env.VITE_APP_BASE_API}/file`;
const total = ref(0);
const categoryList = ref([])
const newsList = ref([]);
const data = reactive({
latestNews: {},
queryParams: {
@ -19,7 +19,7 @@ const data = reactive({
},
});
const { queryParams, latestNews } = toRefs(data);
const {queryParams, latestNews} = toRefs(data);
const getList = () => {
listNews(queryParams.value).then((resp) => {
newsList.value = resp.rows;
@ -27,8 +27,14 @@ const getList = () => {
});
};
const getCategoryList = () => {
listCategory().then((resp) => {
categoryList.value = resp.data;
});
}
const getLatestNews = () => {
listNews({ pageNum: 1, pageSize: 1 }).then((resp) => {
listNews({pageNum: 1, pageSize: 1}).then((resp) => {
if (resp.total) {
latestNews.value = resp.rows[0];
}
@ -41,12 +47,13 @@ const handleTabChange = (tab) => {
getList();
};
getList();
getCategoryList()
</script>
<template>
<div class="news-container" style="height: 100%">
<div class="left">
<img class="cover-image" :src="`${file_base_url}${latestNews?.cover}`" />
<img class="cover-image" :src="`${file_base_url}${latestNews?.cover}`"/>
<p class="title">{{ latestNews?.title }}</p>
</div>
<div class="right">
@ -54,9 +61,14 @@ getList();
@tab-change="handleTabChange"
v-model="queryParams.classification"
>
<el-tab-pane name="0" :label="t('home.news')"></el-tab-pane>
<el-tab-pane name="1" :label="t('home.policyAnalyzing')"></el-tab-pane>
<el-tab-pane name="2" :label="t('home.announcement')"></el-tab-pane>
<el-tab-pane v-for="item in categoryList" :name="item.id" :label="locale === 'zh'
? item.categoryName
: locale === 'ru'
? item.categoryNameRu
: ''"></el-tab-pane>
<!-- <el-tab-pane name="0" :label="t('home.news')"></el-tab-pane>-->
<!-- <el-tab-pane name="1" :label="t('home.policyAnalyzing')"></el-tab-pane>-->
<!-- <el-tab-pane name="2" :label="t('home.announcement')"></el-tab-pane>-->
</el-tabs>
<ul class="news-list">
<li class="news-item" v-for="news in newsList" :key="news.id">

View File

@ -20,11 +20,11 @@
>{{ state.data[descriptionField] }}
</el-tag>
</div>
<div class="text-right">
<el-button class="x_btns">
{{ t("innovation.buyService") }}
</el-button>
</div>
<!-- <div class="text-right">-->
<!-- <el-button class="x_btns">-->
<!-- {{ t("innovation.buyService") }}-->
<!-- </el-button>-->
<!-- </div>-->
</div>
<div class="_info">
<div class="_l">

View File

@ -49,8 +49,8 @@
<span>{{ t("webSearch.zhongkeyunPlatform") }}</span>
</div>
<div class="line">
{{ t("webSearch.contactInformation") }}({{ t("webSearch.wechat") }})
<span>18156053255</span>
{{ t("webSearch.contactInformation") }}<!--({{ t("webSearch.wechat") }})-->
<span>(+86)18156053255, zkxh2024@qq.com</span>
</div>
</div>
<div>

View File

@ -8,7 +8,7 @@
>
<p>如需对接请联系我们</p>
<p>联系人中科云平台</p>
<p>联系电话18156053255微信同号</p>
<p>{{ t("webSearch.contactInformation") }}(+86)18156053255, zkxh2024@qq.com</p>
<template #footer>
<el-button type="primary" @click="closeDialog">
{{ t("common.close") }}</el-button

View File

@ -32,12 +32,12 @@
</div>
<div class="line">
<!-- 联系方式-->
{{ t("webSearch.contactInformation") }}
(
<!-- 微信同号-->
{{ t("webSearch.wechat") }}
)
<span>18156053255</span>
{{ t("webSearch.contactInformation") }}
<!-- (-->
<!-- &lt;!&ndash; 微信同号&ndash;&gt;-->
<!-- {{ t("webSearch.wechat") }}-->
<!-- )-->
<span>(+86)18156053255, zkxh2024@qq.com</span>
</div>
</div>
<div>

View File

@ -60,9 +60,9 @@
</div>
<div class="line">
<!-- 联系方式-->
{{ t("webSearch.contactInformation") }}
({{ t("webSearch.wechat") }})
<span>18156053255</span>
{{ t("webSearch.contactInformation") }}
<!-- ({{ t("webSearch.wechat") }})-->
<span>(+86)18156053255, zkxh2024@qq.com</span>
</div>
</div>
<div class="keywords" style="flex: 1">

12
tailwind.config.js Normal file
View File

@ -0,0 +1,12 @@
/** @type {import('tailwindcss').Config} */
module.exports = {
content: [
"./index.html",
"./src/**/*.{vue,js,ts,jsx,tsx}",
],
theme: {
extend: {},
},
plugins: [],
}

View File

@ -1,11 +1,11 @@
import { defineConfig, loadEnv } from "vite";
import {defineConfig, loadEnv} from "vite";
import path from "path";
import createVitePlugins from "./vite/plugins";
// https://vitejs.dev/config/
export default defineConfig(({ mode, command }) => {
export default defineConfig(({mode, command}) => {
const env = loadEnv(mode, process.cwd());
const { VITE_APP_ENV } = env;
const {VITE_APP_ENV} = env;
return {
// 部署生产环境和开发环境下的URL。
// 默认情况下vite 会假设你的应用是被部署在一个域名的根路径上
@ -32,7 +32,7 @@ export default defineConfig(({ mode, command }) => {
// https://cn.vitejs.dev/config/#server-proxy
"/dev-api": {
// target: "http://101.34.131.16:1618",
// target: "http://129.211.170.150/api",
// target: "http://129.211.170.150:82/api",
target: "http://127.0.0.1:1619",
// target: 'http://172.18.3.127:1618',
changeOrigin: true,
@ -54,6 +54,8 @@ export default defineConfig(({ mode, command }) => {
},
},
},
require("tailwindcss"),
require("autoprefixer"),
],
},
},