首页地图

This commit is contained in:
cxc
2022-10-01 09:12:01 +08:00
parent 25ed1387a7
commit e8fb69f0e3
56 changed files with 4910 additions and 941 deletions

View File

@ -51,7 +51,7 @@
</template>
<script setup name="BasicInfo">
import { getInfo } from "@/api/login";
import { insertClientUser, updateEnterprise } from "@/api/enterprise";
import { insertClientUser, updateEnterprise } from "@/api/admin/enterprise";
// import { expert } from "@/api/identity/index";
import EnterpriseForm from "@/views/components/EnterpriseForm";
import { ElMessage } from "element-plus";

View File

@ -1 +1,353 @@
<template></template>
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryRef"
:inline="true"
v-show="showSearch"
label-width="68px"
>
<el-form-item label="订单号" prop="orderNumber">
<el-input
v-model="queryParams.orderNumber"
placeholder="请输入订单号"
clearable
size="small"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="创建时间">
<el-date-picker
v-model="dateRange"
size="small"
style="width: 240px"
value-format="YYYY-MM-DD"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="Search"
size="small"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="Refresh" size="small" @click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="text">
<b style="color: #000">总订单金额¥2044</b>
</el-button>
</el-col>
<right-toolbar
v-model:showSearch="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="dataList">
<el-table-column label="订单号" align="center" prop="orderNumber" />
<el-table-column label="订单类型" align="center" prop="orderType">
<template #default="{ row }">
{{ orderTypeDic[row.orderType] }}
</template>
</el-table-column>
<el-table-column label="金额" align="center" prop="amount" />
<el-table-column label="数量" align="center" prop="total" />
<!-- <el-table-column label="申请状态" align="center" prop="status">
</el-table-column> -->
<el-table-column
label="充值时间"
align="center"
prop="payTime"
width="180"
>
<template #default="{ row }">
<span>{{ parseTime(row.payTime) }}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template #default="{ row }">
<el-button
size="small"
type="text"
icon="Edit"
@click="handleUpdate(row.id)"
>发票申请</el-button
>
<el-button
size="small"
type="text"
icon="Delete"
@click="handleDelete(row.id)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改岗位对话框 -->
<el-dialog
:title="title"
v-model="showEditDialog"
width="500px"
append-to-body
>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="公司名称:" prop="companyName">
<el-input v-model="form.companyName" placeholder="请输入公司名称" />
</el-form-item>
<el-form-item label="公司税号:" prop="taxNumber">
<el-input v-model="form.taxNumber" placeholder="请输入公司税号" />
</el-form-item>
<!-- <el-form-item label="开户行:" prop="bank" v-if="form.orderType == 2">
<el-input v-model="form.bank" placeholder="请输入开户行" />
</el-form-item> -->
<!-- <el-form-item
label="开户行账号:"
prop="bankAccount"
v-if="form.orderType == 2"
>
<el-input v-model="form.bankAccount" placeholder="请输入开户行账号" />
</el-form-item>
<el-form-item
label="开户行电话:"
prop="bankPhone"
v-if="form.orderType == 2"
>
<el-input v-model="form.bankPhone" placeholder="请输入开户行电话" />
</el-form-item> -->
<el-form-item label="电子邮箱:" prop="email">
<el-input v-model="form.email" placeholder="请输入电子邮箱" />
</el-form-item>
<el-form-item label="联系电话:" prop="phone">
<el-input v-model="form.phone" placeholder="请输入联系电话" />
</el-form-item>
<el-form-item label="地址:" prop="address">
<el-input
v-model="form.address"
type="textarea"
placeholder="请输入地址"
/>
</el-form-item>
<!-- <div style="margin-bottom: 22px" v-if="form.orderType == 2">
<b>邮寄信息</b>
</div>
<el-form-item
label="联系人:"
prop="username"
v-if="form.orderType == 2"
>
<el-input v-model="form.username" placeholder="请输入联系人" />
</el-form-item>
<el-form-item
label="联系人电话:"
prop="userPhone"
v-if="form.orderType == 2"
>
<el-input v-model="form.userPhone" placeholder="请输入联系人电话" />
</el-form-item>
<el-form-item
label="邮寄地址:"
prop="userAddress"
v-if="form.orderType == 2"
>
<el-input
v-model="form.userAddress"
type="textarea"
placeholder="请输入地址"
/>
</el-form-item> -->
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Post">
import {
casDealLogList,
casDealLogDetail,
updateCasDealLog,
deleteCasDealLog,
} from "@/api/admin/enterprise";
import { ElMessage, ElMessageBox } from "element-plus";
import { reactive } from "vue";
const dataList = ref([]);
const showEditDialog = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const ids = ref([]);
const single = ref(true);
const multiple = ref(true);
const total = ref(0);
const title = ref("");
const dateRange = ref([]);
const orderTypeDic = reactive({
1: "创新币充值",
2: "活动报名",
});
const queryRef = ref();
const formRef = ref();
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
},
rules: {
name: [{ required: true, message: "公司名称不能为空", trigger: "blur" }],
dutyParagraph: [
{ 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, message: "电子邮箱不能为空", trigger: "blur" }],
phone: [{ required: true, message: "联系电话不能为空", trigger: "blur" }],
address: [{ required: true, message: "地址不能为空", trigger: "blur" }],
username: [{ required: true, message: "联系人不能为空", trigger: "blur" }],
userPhone: [
{ required: true, message: "联系人电话不能为空", trigger: "blur" },
],
userAddress: [
{ required: true, message: "邮寄地址不能为空", trigger: "blur" },
],
},
});
const { queryParams, form, rules } = toRefs(data);
/** 查询列表 */
const getList = async () => {
loading.value = true;
const resp = await casDealLogList(queryParams.value);
dataList.value = resp.rows;
total.value = resp.total;
loading.value = false;
};
/** 取消按钮 */
function cancel() {
showEditDialog.value = false;
reset();
}
/** 表单重置 */
function reset() {
form.value = {
// id: undefined,
// type: "1",
// name: undefined,
// dutyParagraph: undefined,
// bank: undefined,
// bankAccount: undefined,
// bankPhone: undefined,
// email: undefined,
// phone: undefined,
// address: undefined,
// username: undefined,
// userPhone: undefined,
// userAddress: undefined,
};
if (formRef.value) {
formRef.value.resetFields();
}
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
function resetQuery() {
dateRange.value = [];
if (queryRef.value) {
queryRef.value.resetFields();
}
handleQuery();
}
/** 多选框选中数据 */
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.postId);
single.value = selection.length != 1;
multiple.value = !selection.length;
}
/** 新增按钮操作 */
function handleAdd() {
reset();
showEditDialog.value = true;
title.value = "";
}
/** 修改按钮操作 */
const handleUpdate = async (id) => {
reset();
const resp = await casDealLogDetail(id);
form.value = resp.data;
showEditDialog.value = true;
title.value = "发票申请";
};
/** 提交按钮 */
const submitForm = async () => {
await formRef.value.validate();
if (form.value.id) {
await updateCasDealLog(form.value);
ElMessage.success("申请成功");
showEditDialog.value = false;
getList();
} else {
}
};
/** 删除按钮操作 */
const handleDelete = (id) => {
const orderIds = id || ids.value;
ElMessageBox.confirm('是否确认删除订单号为"' + orderIds + '"的数据项?').then(
async () => {
await deleteCasDealLog(id);
getList();
ElMessage.success("删除成功");
}
);
};
/** 导出按钮操作 */
// function handleExport() {
// proxy.download(
// "system/post/export",
// {
// ...queryParams.value,
// },
// `post_${new Date().getTime()}.xlsx`
// );
// }
getList();
</script>

View File

@ -0,0 +1,102 @@
<template>
<div class="app-container">
<div class="container">
<h1 class="title">会员服务内容</h1>
<div class="compare-plan">
<div
class="service-content"
v-for="(item, index) in serviceContent"
:key="index"
:style="`background:${index == 0 ? '#f2f2f2' : '#fff'}`"
>
{{ item }}
</div>
<div
class="ordinary-member"
v-for="(item, index) in ordinaryMember"
:key="index"
:style="`background:${index == 0 ? '#f2f2f2' : '#fff'}`"
>
<span v-if="index == 0">
{{ item }}
</span>
<el-icon v-else>
<Select v-if="item" />
<CloseBold v-else />
</el-icon>
</div>
<div
class="vip-member"
v-for="(item, index) in vipMember"
:key="index"
:style="`background:${index == 0 ? '#f2f2f2' : '#fff'}`"
>
<span v-if="index == 0">
{{ item }}
</span>
<el-icon v-else>
<Select v-if="item" />
<CloseBold v-else />
</el-icon>
</div>
<div
class="advance-vip-member"
v-for="(item, index) in advanceVipMember"
:key="index"
:style="`background:${index == 0 ? '#f2f2f2' : '#fff'}`"
>
<span v-if="index == 0">
{{ item }}
</span>
<el-icon v-else>
<Select v-if="item" />
<CloseBold v-else />
</el-icon>
</div>
</div>
</div>
</div>
</template>
<script setup name="JoinMembership">
const serviceContent = ref([
"服务内容",
"任意检索",
"创新科技资源自动匹配推送功能",
"上市公司及优质客户的企业需求优先推送",
"一般企业的需求匹配推送",
]);
const ordinaryMember = ref(["普通会员", true, false, false, false]);
const vipMember = ref(["VIP会员服务(2999/年)", true, true, false, true]);
const advanceVipMember = ref([
"高级VIP会员服务(3999/年)",
true,
true,
true,
true,
]);
</script>
<style lang="scss" scoped>
.container {
width: 80%;
margin: 0 auto;
.title {
text-align: center;
font-weight: 700;
}
.compare-plan {
display: grid;
grid-template-rows: 100px repeat(4, 30px);
grid-auto-flow: column;
column-gap: 20px;
row-gap: 12px;
> div {
border: 1px solid #797979;
display: flex;
justify-content: center;
align-items: center;
// height: 60px;
// background-color: salmon;
}
}
}
</style>

View File

@ -83,7 +83,7 @@
</template>
<script setup>
import { activitysList } from "@/api/enterprise";
import { activitysList } from "@/api/admin/enterprise";
const dataList = ref([]);
const loading = ref(true);
@ -91,7 +91,6 @@ const showSearch = ref(true);
const total = ref(0);
const queryRef = ref();
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,

View File

@ -109,7 +109,7 @@
</div>
</template>
<script setup>
import { insertDemand } from "@/api/enterprise";
import { insertDemand } from "@/api/admin/enterprise";
import CityOptions from "@/views/components/CityOptions";
import { ElMessage } from "element-plus";
import { onActivated } from "vue";

View File

@ -170,7 +170,7 @@
</template>
<script setup>
// import { expert } from "@/api/identity/index";
import { insertTechnologyDemand } from "@/api/enterprise";
import { insertTechnologyDemand } from "@/api/admin/enterprise";
import CityOptions from "@/views/components/CityOptions";
import FieldOptions from "@/views/components/FieldOptions";
import InputBoxAdd from "@/views/components/InputBoxAdd";

View File

@ -83,7 +83,7 @@
</template>
<script setup>
import { demandList } from "@/api/enterprise";
import { demandList } from "@/api/admin/enterprise";
import { onActivated } from "vue";
import { useRouter } from "vue-router";

View File

@ -97,7 +97,7 @@
</template>
<script setup name="technologyDemand">
import { technologyDemandList } from "@/api/enterprise";
import { technologyDemandList } from "@/api/admin/enterprise";
import { ElMessage, ElMessageBox } from "element-plus";
import { useRouter } from "vue-router";

View File

@ -92,7 +92,7 @@
</template>
<script setup name="Product">
import { getEnterpriseProduct } from "@/api/enterprise";
import { getEnterpriseProduct } from "@/api/admin/enterprise";
import { ElMessage, ElMessageBox } from "element-plus";
import { useRouter } from "vue-router";

View File

@ -18,7 +18,7 @@
import ReleaseForm from "@/views/components/ReleaseForm";
import { ElMessage } from "element-plus";
import { useRoute, useRouter } from "vue-router";
import { getProductById, insertEnterpriseProduct } from "@/api/enterprise";
import { getProductById, insertEnterpriseProduct } from "@/api/admin/enterprise";
import { reactive, toRefs } from "vue";
const route = useRoute();
const router = useRouter();

View File

@ -0,0 +1,115 @@
<template>
<div class="app-container">
<el-card shadow="always" style="width: 55%; margin: 0 auto">
<p><b>基本资料</b></p>
<el-form
ref="postRef"
:model="PersonalInfoForm"
:rules="rules"
label-width="100px"
>
<el-form-item label="姓名:" prop="nickName">
<el-input
v-model="PersonalInfoForm.nickName"
placeholder="请输入姓名"
/>
</el-form-item>
<el-form-item label="手机:" prop="phone">
<el-input
v-model="PersonalInfoForm.phone"
placeholder="请输入手机号"
/>
</el-form-item>
<el-form-item label="邮箱:" prop="email">
<el-input v-model="PersonalInfoForm.email" placeholder="请输入邮箱" />
</el-form-item>
<el-form-item label="职务:" prop="email">
<el-input v-model="PersonalInfoForm.email" placeholder="请输入职务" />
</el-form-item>
<el-form-item label="固定电话:" prop="phone">
<el-input
v-model="PersonalInfoForm.phone"
placeholder="请输入固定电话"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm">提交</el-button>
</el-form-item>
</el-form>
<p><b>专家资料</b></p>
<ExpertForm
v-model="form"
:isAdd="false"
:labelWidth="labelWidth"
ref="expertForm"
/>
<div :style="{ marginLeft: labelWidth + 'px' }">
<el-button type="primary" @click="submitForm">提交</el-button>
</div>
</el-card>
</div>
</template>
<script setup>
// import { expert } from "@/api/identity/index";
import { getInfo } from "@/api/login";
import ExpertForm from "@/views/components/ExpertForm";
const data = reactive({
PersonalInfoForm: {},
queryParams: {
pageNum: 1,
pageSize: 10,
postCode: undefined,
},
rules: {
name: [{ required: true, message: "公司名称不能为空", trigger: "blur" }],
dutyParagraph: [
{ 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, message: "电子邮箱不能为空", trigger: "blur" }],
phone: [{ required: true, message: "联系电话不能为空", trigger: "blur" }],
address: [{ required: true, message: "地址不能为空", trigger: "blur" }],
username: [{ required: true, message: "联系人不能为空", trigger: "blur" }],
userPhone: [
{ required: true, message: "联系人电话不能为空", trigger: "blur" },
],
userAddress: [
{ required: true, message: "邮寄地址不能为空", trigger: "blur" },
],
},
});
const { queryParams, PersonalInfoForm, rules } = toRefs(data);
const { proxy } = getCurrentInstance();
const labelWidth = 140;
// 获取基础信息用于回显
const getBasicInfo = async () => {
const { data } = await getInfo();
PersonalInfoForm.value = data.user ?? {};
// enterpriseInfoForm.value = data.enterprise ?? {};
};
getBasicInfo();
const form = reactive({
laboratory_id: undefined, // 所属实验室
gender: 1,
});
function submitForm(status) {
if (proxy.$refs.expertForm.submitForm()) {
expert(form).then((res) => {
proxy.$modal.msgSuccess("新增成功");
proxy.$router.go(-1);
});
} else {
console.log("校验未通过");
}
}
</script>

View File

@ -0,0 +1,139 @@
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryRef"
v-show="showSearch"
:inline="true"
>
<el-form-item label="活动名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入活动名称"
clearable
size="small"
style="width: 240px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="活动状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="请选择"
size="small"
>
<el-option label="显示" value="1"></el-option>
<el-option label="隐藏" value="2"></el-option>
<!-- <el-option label="已结束" value="3"></el-option> -->
</el-select>
</el-form-item>
<el-form-item>
<el-button
size="small"
type="primary"
icon="Search"
@click="handleQuery"
>搜索</el-button
>
<el-button size="small" icon="Refresh" @click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form>
<!-- 表格数据 -->
<el-table v-loading="loading" :data="dataList">
<el-table-column label="数据编号" prop="id" />
<el-table-column
label="活动名称"
prop="title"
:show-overflow-tooltip="true"
/>
<el-table-column
label="活动报名截止时间"
align="center"
prop="createTime"
>
<template #default="{ row }">
<span>{{ parseTime(row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="活动开始时间" align="center" prop="createTime">
<template #default="{ row }">
<span>{{ parseTime(row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="活动结束时间" align="center" prop="createTime">
<template #default="{ row }">
<span>{{ parseTime(row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="活动报名时间" align="center" prop="createTime">
<template #default="{ row }">
<span>{{ parseTime(row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column label="状态" align="center" prop="status">
<template #default="{ row }">
<el-tag type="success" v-if="row.status == 1">显示</el-tag>
<el-tag type="danger" v-else-if="row.status == 2">隐藏</el-tag>
<el-tag type="info" v-else>未知</el-tag>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
</template>
<script setup>
import { activitysList } from "@/api/admin/expert";
const dataList = ref([]);
const loading = ref(true);
const showSearch = ref(true);
const total = ref(0);
const queryRef = ref();
const data = reactive({
queryParams: {
pageNum: 1,
pageSize: 10,
title: undefined,
status: undefined,
},
});
const { queryParams } = toRefs(data);
/** 查询数据列表 */
const getList = async () => {
loading.value = true;
const resp = await activitysList(queryParams.value);
dataList.value = resp.rows;
total.value = resp.total;
loading.value = false;
};
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
function resetQuery() {
if (queryRef.value) {
queryRef.value.resetFields();
handleQuery();
}
}
getList();
</script>

View File

@ -0,0 +1,136 @@
<template>
<div :class="className" :style="{ height: height, width: width }" />
</template>
<script>
import echarts from "echarts";
// require("echarts/theme/macarons"); // echarts theme
// import resize from "./mixins/resize";
export default {
// mixins: [resize],
props: {
className: {
type: String,
default: "chart",
},
width: {
type: String,
default: "100%",
},
height: {
type: String,
default: "350px",
},
autoResize: {
type: Boolean,
default: true,
},
chartData: {
type: Object,
// required: true,
},
},
data() {
return {
chart: null,
};
},
watch: {
chartData: {
deep: true,
handler(val) {
this.setOptions(val);
},
},
},
mounted() {
this.$nextTick(() => {
this.initChart();
});
},
beforeDestroy() {
if (!this.chart) {
return;
}
this.chart.dispose();
this.chart = null;
},
methods: {
initChart() {
this.chart = echarts.init(this.$el, "macarons");
this.setOptions(this.chartData);
},
setOptions({ expectedData, actualData, keys, arr } = {}) {
this.chart.setOption({
tooltip: {},
xAxis: [
{
type: "category",
boundaryGap: false,
data: [
"2021-01",
"2021-02",
"2021-03",
"2021-04",
"2021-05",
"2021-06",
"2021-07",
"2021-08",
"2021-09",
"2021-10",
"2021-11",
"2021-12",
],
axisPointer: {
type: "shadow",
},
},
],
yAxis: [
{
type: "value",
min: 0,
axisLabel: {
formatter: "{value}",
},
splitLine: {
show: false, //不显示网格线
},
splitArea: {
show: false, //不显示网格区域
},
},
],
grid: {
containLabel: true,
width: "99%",
left: 0,
top: 30,
bottom: 0,
},
series: [
{
name: "",
type: "line",
data: [
2.0, 2.2, 3.3, 4.5, 6.3, 10.2, 20.3, 23.4, 23.0, 16.5, 12.0, 6.2,
],
areaStyle: {
color: "#dbeefc",
},
itemStyle: {
normal: {
color: "rgba(73, 169,238, 1)",
},
},
// symbol: "none",
// smooth: true,
// showSymbol: false,
},
],
});
},
},
};
</script>

View File

@ -0,0 +1,308 @@
<template>
<el-form
ref="formRef"
:model="modelValue"
:rules="rules"
:label-width="labelWidth + 'px'"
>
<!-- <el-row class="mb20">
<el-radio-group v-model="modelValue.mode">
<el-radio-button :label="1">{{
`免费成果${modelValue.id ? "修改" : "发布"}`
}}</el-radio-button>
<el-radio-button :label="2">{{
`付费成果${modelValue.id ? "修改" : "发布"}`
}}</el-radio-button>
</el-radio-group>
</el-row> -->
<div class="form_title" v-if="showTitle">基本信息</div>
<el-alert
v-if="modelValue.mode == 2"
style="margin-bottom: 20px"
title="1创新币=1元"
type="warning"
show-icon
:closable="false"
></el-alert>
<el-row v-if="modelValue.mode == 2">
<el-col :span="12">
<el-form-item label="视频定价:">
<el-input v-model="modelValue.price" placeholder="请输入创新币个数">
<template #append>创新币</template>
</el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="免费观看时长:">
<el-input
v-model="modelValue.duration"
placeholder="默认视频的1/3时长"
>
<template #append>min</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="modelValue.mode == 2">
<el-col :span="24">
<el-form-item label="视频文件:">
<FileUpload
v-model="modelValue.image"
:limit="1"
:fileType="['mp4']"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="成果名称:" prop="title">
<el-input
v-model="modelValue.title"
placeholder="请输入成果名称"
></el-input>
</el-form-item>
</el-col>
</el-row>
<FieldOptions
v-model="modelValue"
:labelWidth="labelWidth"
ref="fieldFormRef"
/>
<InputBoxAdd
:labelWidth="labelWidth"
v-model="modelValue"
title="应用客户"
placeholder="请输入应用客户"
fieldKey="customers"
ref="customersFormRef"
/>
<el-row>
<el-col :span="24">
<el-form-item label="成果成熟度:" prop="maturity">
<el-select
v-model="modelValue.maturity"
clearable
placeholder="请选择成果成熟度"
>
<el-option
v-for="item in maturityOptions"
:key="item.key"
:label="item.value"
:value="item.key"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="成果领先性:" prop="leadStandard">
<el-select
v-model="modelValue.leadStandard"
clearable
placeholder="请选择成果领先性"
>
<el-option
v-for="item in leadOptions"
:key="item.key"
:label="item.value"
:value="item.key"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="合作模式:">
<el-select
v-model="modelValue.cooperationMode"
clearable
placeholder="请选择合作模式"
>
<el-option
v-for="item in cooperationOptions"
:key="item.key"
:label="item.value"
:value="item.key"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<InputBoxAdd
v-if="modelValue.mode == 2"
:labelWidth="labelWidth"
v-model="modelValue"
title="应用场景"
placeholder="请输入应用场景"
fieldKey="kws"
ref="directionsFormRef"
/>
<InputBoxAdd
:labelWidth="labelWidth"
v-model="modelValue"
title="关键词"
placeholder="请输入关键词"
fieldKey="keywords"
ref="keywordsFormRef"
/>
<el-row>
<el-col :span="24">
<el-form-item label="成果简介:" prop="description">
<el-input
v-model="modelValue.description"
type="textarea"
:autosize="{ minRows: 2, maxRows: 8 }"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="成果来源:">
<!-- <Editor v-model="modelValue.comeFrom" :minHeight="150" /> -->
<wangEditor
v-model="modelValue.comeFrom"
width="100%"
min-height="150px"
></wangEditor>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="modelValue.mode == 1">
<el-col :span="24">
<el-form-item label="成果图片:" prop="image">
<ImageUpload
v-model="modelValue.image"
:isShowTip="false"
:limit="1"
/>
</el-form-item>
</el-col>
</el-row>
<p>
<b>图片材料上传</b>
</p>
<el-row>
<el-col :span="24">
<el-form-item label="成熟度证明材料:">
<FileUpload
v-model="modelValue.file"
:limit="1"
:fileType="['doc', 'xls', 'ppt', 'txt', 'pdf', 'jpg']"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</template>
<script setup>
import CityOptions from "@/views/components/CityOptions";
import FieldOptions from "@/views/components/FieldOptions";
import InputBoxAdd from "@/views/components/InputBoxAdd";
import {
leadOptions,
cooperationOptions,
maturityOptions,
} from "@/utils/parameter";
import { reactive, toRefs } from "vue";
const props = defineProps({
modelValue: Object,
isAdd: {
type: Boolean,
default: true,
},
showTitle: {
type: Boolean,
default: false,
},
labelWidth: {
type: Number,
default: 120,
},
});
const { modelValue, isAdd, showTitle, labelWidth } = toRefs(props);
const data = reactive({
rules: {
title: [{ required: true, message: "请输入", trigger: "blur" }],
maturity: [{ required: true, message: "请选择", trigger: "change" }],
leadStandard: [{ required: true, message: "请选择", trigger: "change" }],
description: [{ required: true, message: "请输入", trigger: "blur" }],
image: [{ required: true, message: "请上传", trigger: ["change", "blur"] }],
},
});
const { rules } = toRefs(data);
// import { researchSelect, laboratorySelect } from "@/api/identity/index";
const formRef = ref();
const fieldFormRef = ref();
const customersFormRef = ref();
const directionsFormRef = ref();
const keywordsFormRef = ref();
const validateForm = async () => {
let formValid;
try {
formValid = await formRef.value.validate();
} catch (error) {
formValid = false;
}
const fieldFormValid = await fieldFormRef.value.validateForm(); // 城市选择表单验证
const customersValid = await customersFormRef.value.validateForm(); // 领域选择表单验证
// const directionsFormRef = await customersFormRef.value.validateForm(); // 领域选择表单验证
const keywordsFormRef = await customersFormRef.value.validateForm(); // 领域选择表单验证
return (
formValid &&
fieldFormValid &&
customersValid &&
// directionsFormRef &&
keywordsFormRef
);
};
defineExpose({
validateForm,
});
// const submitForm = () => {
// let flag = false;
// this.$refs["formRef"].validate((valid) => {
// const fieldForm = this.$refs.fieldForm.submitForm();
// const customerForm = this.$refs.customerForm.submitForm();
// const keywordsForm = this.$refs.keywordsForm.submitForm();
// if (valid && fieldForm && customerForm && keywordsForm) {
// flag = !flag;
// }
// });
// return flag;
// };
</script>
<style lang="scss" scoped>
.form_title {
font-weight: 700;
margin-bottom: 30px;
}
// 上传图片框限制
// ::v-deep .el-upload--picture-card {
// width: 120px;
// height: 120px;
// line-height: 120px;
// }
.el-select,
.el-date-editor {
display: block;
width: 100%;
}
</style>

View File

@ -0,0 +1,351 @@
<template>
<div class="app-container">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
size="small"
@click="handleAdd"
>新增</el-button
>
</el-col>
</el-row>
<!-- 表格数据 -->
<el-table v-loading="loading" :data="dataList">
<el-table-column label="数据编号" prop="id" width="150" />
<el-table-column
label="合作企业名称"
align="center"
prop="name"
show-overflow-tooltip
width="200"
/>
<el-table-column label="关联论文" align="center" prop="paper_title">
<template #default="scope">
<div v-for="(item, index) in scope.row.paper_title" :key="index">
<div class="ellipsis" v-if="index <= 2">{{ item }}</div>
</div>
</template>
</el-table-column>
<el-table-column label="关联专利" align="center" prop="patent_title">
<template #default="scope">
<div v-for="(item, index) in scope.row.patent_title" :key="index">
<div class="ellipsis text-left" v-if="index <= 2">{{ item }}</div>
</div>
</template>
</el-table-column>
<el-table-column label="创建日期" align="center" prop="created_at">
<template #default="scope">
<span>{{
dayjs(scope.row.created_at).format("YYYY-MM-DD HH:mm:ss")
}}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template #default="scope">
<el-button
size="small"
type="text"
icon="Edit"
@click="handleUpdate(scope.row)"
>修改</el-button
>
<el-button
size="small"
type="text"
icon="Delete"
@click="handleDelete(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改数据配置对话框 -->
<el-dialog
:title="title"
v-model="open"
width="500px"
:close-on-click-modal="false"
append-to-body
>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="企业名称:" prop="name">
<el-input v-model="form.name" placeholder="请输入企业名称" />
</el-form-item>
<el-form-item label="关联论文:" prop="papers">
<el-select
ref="selectDom"
style="width: 100%"
v-model="form.papers"
value-key="id"
multiple
filterable
remote
reserve-keyword
:remote-method="paperMethod"
:loading="paperSelectLoading"
placeholder="请选择关联论文"
>
<el-option
style="max-width: 360px"
v-for="item in paperOptions"
:key="item.id"
:label="item.title"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="关联专利:" prop="patents">
<el-select
style="width: 100%"
v-model="form.patents"
value-key="id"
multiple
filterable
remote
reserve-keyword
:remote-method="patentMethod"
:loading="patentSelectLoading"
placeholder="请选择关联专利"
>
<el-option
style="max-width: 360px"
v-for="item in patentOptions"
:key="item.id"
:label="item.title"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup name="Already">
// import {
// enterprise,
// enterpriseAdd,
// enterpriseDelete,
// enterpriseEdit,
// } from "@/api/admin/expert/demand";
// 专利,论文
// import { patentSelect, paperSelect } from "@/api/admin/expert/technology";
import dayjs from "dayjs";
import { ElMessage, ElMessageBox } from "element-plus";
// const router = useRouter();
// const { proxy } = getCurrentInstance();
const dataList = ref([]);
const open = ref(false);
const loading = ref(true);
// const showSearch = ref(true);
const total = ref(0);
const title = ref("");
const data = reactive({
form: {},
queryParams: {
page_num: 1,
page_size: 10,
mode: 1,
},
rules: {
name: [{ required: true, message: "企业名称不能为空", trigger: "blur" }],
papers: [
{
type: "array",
required: true,
message: "关联论文不能为空",
trigger: ["blur", "change"],
},
],
patents: [
{
type: "array",
required: true,
message: "关联专利不能为空",
trigger: ["blur", "change"],
},
],
},
});
const { queryParams, form, rules } = toRefs(data);
// 论文
const paperOptions = ref([]);
const paperSelectLoading = ref(false);
const formRef = ref();
const paperMethod = (title) => {
if (title) {
paperSelectLoading.value = true;
paperSelect({ title }).then((res) => {
paperSelectLoading.value = false;
paperOptions.value = res.data;
});
} else {
paperOptions.value = [];
}
};
// 专利
const patentOptions = ref([]);
const patentSelectLoading = ref(false);
const patentMethod = (title) => {
if (title) {
patentSelectLoading.value = true;
patentSelect({ title }).then((res) => {
patentSelectLoading.value = false;
patentOptions.value = res.data;
});
} else {
patentOptions.value = [];
}
};
/** 查询数据列表 */
function getList() {
loading.value = true;
// enterprise(queryParams.value).then((response) => {
// response.data.data.map((item) => {
// item.paper_title = item.paper_title.split("&&");
// item.patent_title = item.patent_title.split("&&");
// });
// dataList.value = response.data.data;
// total.value = response.data.count;
// loading.value = false;
// });
loading.value = false;
}
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
// function resetQuery() {
// // if()
// // proxy.resetForm("queryRef");
// handleQuery();
// }
/** 删除按钮操作 */
function handleDelete(id) {
ElMessageBox.confirm('是否确认删除数据编号为"' + id + '"的数据项?')
.then(function () {
return enterpriseDelete({ id: id });
})
.then(() => {
getList();
ElMessage.success("删除成功");
})
.catch(() => {});
}
/** 重置新增的表单以及其他数据 */
function reset() {
form.value = {
id: undefined,
name: undefined,
mode: 1,
papers: [],
patents: [],
};
if (formRef.value) {
formRef.value.resetFields();
}
}
/** 添加数据 */
function handleAdd() {
reset();
open.value = true;
title.value = "添加数据";
}
/** 修改数据 */
function handleUpdate(row) {
// reset();
let formData = Object.assign({}, row);
let papers = [];
let patents = [];
formData.papers.map((item, index) => {
papers.push({
id: item,
title: formData.paper_title[index],
});
});
formData.patents.map((item, index) => {
patents.push({
id: item,
title: formData.patent_title[index],
});
});
paperOptions.value = formData.papers = papers;
patentOptions.value = formData.patents = patents;
form.value = formData;
open.value = true;
title.value = "修改数据";
nextTick(() => {
// console.log(proxy.$refs["selectDom"]); // .cachedOptions
});
}
/** 提交按钮 */
function submitForm() {
formRef.value.validate((valid) => {
if (valid) {
let formData = Object.assign({}, form.value);
let papers = [];
let patents = [];
formData.papers.map((item) => {
papers.push(item.id);
});
formData.patents.map((item) => {
patents.push(item.id);
});
formData.papers = papers;
formData.patents = patents;
if (form.value.id != undefined) {
enterpriseEdit(formData).then((response) => {
ElMessage.success("修改成功");
open.value = false;
getList();
});
} else {
enterpriseAdd(formData).then((response) => {
ElMessage.success("新增成功");
open.value = false;
getList();
});
}
}
});
}
/** 取消按钮 */
function cancel() {
open.value = false;
reset();
}
getList();
</script>

View File

@ -0,0 +1,206 @@
<template>
<div class="app-container">
<el-card shadow="always" style="width: 55%; margin: 0 auto">
<el-form
ref="formRef"
:model="formData"
:rules="rules"
:label-width="labelWidth + 'px'"
>
<p><b>基本信息</b></p>
<el-row>
<el-col :span="24">
<el-form-item label="需求名称:" prop="title">
<el-input v-model="formData.title"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="需求类别:">
<el-checkbox-group v-model="formData.kinds">
<el-checkbox
v-for="item in checkList"
:key="item.id"
:label="item.name"
>{{ item.name }}</el-checkbox
>
<!-- <el-checkbox label="0" @change="handleCheck">其他</el-checkbox> -->
</el-checkbox-group>
<el-row :gutter="20">
<el-col :span="20">
<el-input
v-model="checkInput"
placeholder="请输入需求类别"
></el-input>
</el-col>
<el-col :span="4">
<el-button type="primary" @click="addCheck">添加</el-button>
</el-col>
</el-row>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="需求描述:" prop="description">
<!-- <Editor v-model="formData.description" :minHeight="150" /> -->
<wangEditor
v-model="formData.description"
width="100%"
min-height="150px"
></wangEditor>
</el-form-item>
</el-col>
</el-row>
<CityOptions
v-model="formData"
:labelWidth="labelWidth"
ref="cityFormRef"
/>
<el-row>
<el-col :span="12">
<el-form-item label="需求联系人:" prop="name">
<el-input
v-model="formData.name"
placeholder="请输入需求联系人"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="联系人手机号:" prop="mobile">
<el-input
v-model="formData.mobile"
placeholder="请输入联系人手机号"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="需求提交人:" prop="commitUserName">
<el-input
v-model="formData.commitUserName"
placeholder="自动获取"
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="手机号:" prop="commitPhone">
<el-input
v-model="formData.commitPhone"
placeholder="自动获取"
></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div :style="{ marginLeft: labelWidth + 'px' }">
<el-button @click="router.go(-1)">取消</el-button>
<el-button type="primary" @click="submitForm">提交</el-button>
</div>
</el-card>
</div>
</template>
<script setup>
// import { expert } from "@/api/identity/index";
import { insertDemand } from "@/api/admin/expert/demand";
import CityOptions from "@/views/components/CityOptions";
import { ElMessage } from "element-plus";
import { useRoute, useRouter } from "vue-router";
const data = reactive({
formData: {
check: [],
},
queryParams: {
pageNum: 1,
pageSize: 10,
// postCode: undefined,
},
rules: {
title: [{ required: true, message: "需求名称不能为空", trigger: "blur" }],
description: [
{ required: true, message: "需求描述不能为空", trigger: "blur" },
],
bankAccount: [
{ required: true, message: "需求联系人不能为空", trigger: "blur" },
],
bankPhone: [
{ required: true, message: "联系人手机号不能为空", trigger: "blur" },
],
username: [
{ required: true, message: "需求提交人不能为空", trigger: "blur" },
],
userPhone: [{ required: true, message: "手机号不能为空", trigger: "blur" }],
},
});
const { queryParams, formData, rules } = toRefs(data);
const { proxy } = getCurrentInstance();
const route = useRoute();
const router = useRouter();
const cityFormRef = ref();
const formRef = ref();
if (route.query.id) {
}
const labelWidth = 140;
// const isContainOther = ref(false);
const checkList = reactive([
{
id: 1,
name: "成果推广",
},
{
id: 2,
name: "关键成果解决",
},
{
id: 3,
name: "对接专家院士",
},
{
id: 4,
name: "上市辅导",
},
]);
const checkInput = ref("");
function submitForm() {
formRef.value.validate(async (valid) => {
const cityFormValid = cityFormRef.value.validateForm(); // 城市
if (valid && cityFormValid) {
console.log(formData.value);
if (formData.value.id) {
// updatePost(form.value).then((response) => {
// proxy.$modal.msgSuccess("修改成功");
// proxy.$router.go(-1);
// });
} else {
await insertDemand(formData.value);
ElMessage.success("新增成功");
router.back();
}
}
});
}
function addCheck() {
if (!checkInput.value.trim().length) return proxy.$modal.msgError("请输入");
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 = "";
}
}
</script>

View File

@ -0,0 +1,172 @@
<template>
<div class="app-container">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<router-link to="./release">
<el-button type="primary" size="small">发布需求</el-button>
</router-link>
</el-col>
<right-toolbar
v-model:showSearch="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<el-radio-group
v-model="queryParams.status"
size="small"
@change="handleQuery"
>
<el-radio-button :label="1">待受理</el-radio-button>
<el-radio-button :label="2">已受理</el-radio-button>
<el-radio-button :label="3">已结束</el-radio-button>
</el-radio-group>
<el-table v-loading="loading" :data="dataList" style="margin-top: 20px">
<el-table-column label="需求名称" align="center" prop="title" />
<el-table-column label="需求类别" align="center" prop="kind" />
<el-table-column label="状态" align="center" prop="status" />
<el-table-column label="联系人" align="center" prop="name" />
<el-table-column label="手机号" align="center" prop="mobile" />
<el-table-column
label="发布时间"
align="center"
prop="createTime"
width="180"
>
<template #default="{ row }">
<span>{{ parseTime(row.createTime) }}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template #default="scope">
<el-button
v-if="queryParams.type == 3"
size="small"
type="text"
icon="Delete"
@click="handleDelete(scope.row.id)"
>删除</el-button
>
<el-button
v-if="queryParams.type == 1"
size="small"
type="text"
icon="Close"
@click="handleDelete(scope.row.id)"
>取消发布</el-button
>
<el-button
v-if="queryParams.type != 3"
size="small"
type="text"
icon="View"
@click="handleEdit(scope.row.id)"
>查看</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
</template>
<script setup>
import { demandList } from "@/api/admin/expert/demand";
import { onActivated } from "vue";
import { useRouter } from "vue-router";
const { proxy } = getCurrentInstance();
const router = useRouter();
const dataList = ref([]);
const loading = ref(true);
const showSearch = ref(true);
const total = ref(0);
const dateRange = ref([]);
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
status: 1,
},
rules: {
name: [{ required: true, message: "公司名称不能为空", trigger: "blur" }],
dutyParagraph: [
{ 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, message: "电子邮箱不能为空", trigger: "blur" }],
phone: [{ required: true, message: "联系电话不能为空", trigger: "blur" }],
address: [{ required: true, message: "地址不能为空", trigger: "blur" }],
username: [{ required: true, message: "联系人不能为空", trigger: "blur" }],
userPhone: [
{ required: true, message: "联系人电话不能为空", trigger: "blur" },
],
userAddress: [
{ required: true, message: "邮寄地址不能为空", trigger: "blur" },
],
},
});
const { queryParams, form, rules } = toRefs(data);
/** 查询列表 */
const getList = async () => {
loading.value = true;
const resp = await demandList(queryParams.value);
dataList.value = resp.rows;
total.value = resp.total;
loading.value = false;
};
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
function resetQuery() {
dateRange.value = [];
proxy.resetForm("queryRef");
handleQuery();
}
/** 删除按钮操作 */
function handleDelete(id) {
proxy.$modal
.confirm('是否确认删除订单号为"' + id + '"的数据项?')
.then(function () {
return demandDelete(postIds);
})
.then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
})
.catch(() => {});
}
function handleEdit(id) {
router.push({ path: "./release", query: { id } });
}
getList();
onActivated(() => {
getList();
});
</script>

View File

@ -0,0 +1,290 @@
<template>
<div class="app-container">
<!-- <el-form
:model="queryParams"
ref="queryRef"
v-show="showSearch"
:inline="true"
@submit.prevent
>
<el-form-item label="企业名称" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入企业名称"
clearable
size="small"
style="width: 240px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" size="small" @click="handleQuery"
>搜索</el-button
>
<el-button icon="Refresh" size="small" @click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form> -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
size="small"
@click="handleAdd"
>新增</el-button
>
</el-col>
<!-- <right-toolbar
v-model:showSearch="showSearch"
@queryTable="getList"
></right-toolbar> -->
</el-row>
<!-- 表格数据 -->
<el-table v-loading="loading" :data="dataList">
<el-table-column label="数据编号" prop="id" />
<el-table-column
label="企业名称"
prop="enterpriseName"
:show-overflow-tooltip="true"
/>
<el-table-column
label="所在地"
prop="address"
:show-overflow-tooltip="true"
/>
<!-- province--city--district -->
<el-table-column label="所属领域" prop="territory" />
<el-table-column label="联系人" prop="contactUser" />
<el-table-column label="联系电话" prop="contactPhone" />
<!-- <el-table-column label="创建日期" align="center" prop="created_at">
<template #default="{ row }">
<span>{{ dayjs(row.created_at).format("YYYY-MM-DD HH:mm:ss") }}</span>
</template>
</el-table-column> -->
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template #default="{ row }">
<el-button
size="small"
type="text"
icon="Edit"
@click="handleUpdate(row)"
>修改</el-button
>
<el-button
size="small"
type="text"
icon="Delete"
@click="handleDelete(row.id)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改数据配置对话框 -->
<el-dialog
:title="title"
v-model="showEditDialog"
width="750px"
append-to-body
>
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="企业名称:" prop="enterpriseName">
<el-input
v-model="form.enterpriseName"
placeholder="请输入企业名称"
/>
</el-form-item>
<el-form-item label="联系人:">
<el-input v-model="form.contactUser" placeholder="请输入专家姓名" />
</el-form-item>
<el-form-item label="联系电话:">
<el-input v-model="form.contactPhone" placeholder="默认专家电话" />
</el-form-item>
<div class="hide_required">
<CityOptions v-model="form" :labelWidth="100" :is_required="false" />
</div>
<div class="hide_required">
<FieldSingle v-model="form" :labelWidth="100" :is_required="false" />
</div>
<el-form-item label="合作内容:" prop="content">
<el-input
v-model="form.content"
type="textarea"
:autosize="{ minRows: 4, maxRows: 6 }"
placeholder="请输入想要合作的需求"
></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import CityOptions from "@/views/components/CityOptions";
import FieldSingle from "@/views/components/FieldSingle";
import {
expertWantEnterpriseList,
updateExpertWantEnterprise,
insertExpertWantEnterprise,
deleteExpertWantEnterpriseByIds,
} from "@/api/admin/expert/demand";
import dayjs from "dayjs";
import { useRouter } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
import { cloneDeep } from "lodash-unified";
const router = useRouter();
const { proxy } = getCurrentInstance();
const dataList = ref([]);
const showEditDialog = ref(false);
const loading = ref(true);
// const showSearch = ref(true);
const total = ref(0);
const title = ref("");
const formRef = ref();
// const formData = reactive({
// industrys: [],
// });
const data = reactive({
form: {
industrys: [],
},
queryParams: {
pageNum: 1,
pageSize: 10,
// mode: 2,
},
rules: {
enterpriseName: [
{ required: true, message: "企业名称不能为空", trigger: "blur" },
],
content: [{ required: true, message: "合作内容不能为空", trigger: "blur" }],
},
});
const { queryParams, form, rules } = toRefs(data);
/** 查询数据列表 */
const getList = async () => {
loading.value = true;
const resp = await expertWantEnterpriseList(queryParams.value);
dataList.value = resp.rows;
total.value = resp.total;
loading.value = false;
};
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
// function resetQuery() {
// proxy.resetForm("queryRef");
// handleQuery();
// }
/** 删除按钮操作 */
function handleDelete(id) {
ElMessageBox.confirm(`是否确认删除数据编号为"${id}"的数据项?`).then(
async () => {
await deleteExpertWantEnterpriseByIds({ ids: [id] });
getList();
ElMessage.success("删除成功");
}
);
}
/** 重置新增的表单以及其他数据 */
function reset() {
form.value = {
// id: undefined,
// name: undefined,
// contact: undefined,
// contact_mobile: undefined,
industrys: [],
// mode: 2,
// content: undefined,
};
if (formRef.value) {
formRef.value.resetFields();
}
}
/** 添加数据 */
function handleAdd() {
reset();
showEditDialog.value = true;
title.value = "添加数据";
}
/** 修改数据 */
function handleUpdate(row) {
reset();
form.value = cloneDeep(row);
form.value.industrys =
form.value.industrys?.split(",").filter((el) => el != "") ?? [];
showEditDialog.value = true;
title.value = "修改数据";
}
/** 提交按钮 */
function submitForm() {
formRef.value.validate(async (valid) => {
form.value.territory = form.value.industrys.join(",");
if (valid) {
if (form.value.id) {
await updateExpertWantEnterprise(form.value);
ElMessage.success("修改成功");
showEditDialog.value = false;
getList();
} else {
await insertExpertWantEnterprise(form.value);
ElMessage.success("修改成功");
showEditDialog.value = false;
getList();
}
}
});
}
/** 取消按钮 */
function cancel() {
showEditDialog.value = false;
reset();
}
getList();
</script>
<style lang="scss" scoped>
.hide_required {
::v-deep .el-form-item__label {
&::before {
display: none;
}
}
}
</style>

View File

@ -0,0 +1,172 @@
<template>
<div class="app-container">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<router-link to="./release">
<el-button type="primary" size="small">发布成果</el-button>
</router-link>
</el-col>
</el-row>
<el-radio-group
v-model="queryParams.status"
size="small"
@change="handleQuery"
>
<el-radio-button :label="1">已发布</el-radio-button>
<el-radio-button :label="0">待审核</el-radio-button>
<el-radio-button :label="2">已驳回</el-radio-button>
<el-radio-button :label="3">草稿箱</el-radio-button>
</el-radio-group>
<el-table v-loading="loading" :data="dataList" style="margin-top: 20px">
<el-table-column label="数据编号" prop="id" />
<el-table-column label="成果名称" prop="title" />
<el-table-column label="成果领域" prop="industryStr" />
<el-table-column label="浏览量" prop="visitCount" />
<el-table-column label="发布时间" prop="createTime" width="180">
<template #default="{ row }">
<span>
{{ dayjs(row.createTime).format("YYYY-MM-DD HH:mm:ss") }}</span
>
</template>
</el-table-column>
<el-table-column label="操作" class-name="small-padding fixed-width">
<template #default="{ row }">
<router-link
:to="{ path: './release', query: { id: row.id } }"
v-if="queryParams.status == 3"
>
<el-button size="small" type="text" icon="Edit">编辑</el-button>
</router-link>
<el-button
v-if="queryParams.status == 1"
size="small"
type="text"
icon="Download"
@click="handleShelf(row)"
>{{ row.shelfStatus == 1 ? "下架" : "上架" }}</el-button
>
<el-button
v-if="queryParams.status != 0"
size="small"
type="text"
icon="Delete"
@click="handleDelete(row.id)"
>删除</el-button
>
<el-button
v-if="queryParams.status == 1"
size="small"
type="text"
icon="View"
@click="handleResults(row.id)"
>查看匹配结果</el-button
>
<el-button
v-if="queryParams.status == 0"
size="small"
type="text"
icon="Close"
@click="handleCancelPublish(row.id)"
>取消发布</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</div>
</template>
<script setup name="Achievement">
import {
expertAchievementList,
deleteAchievementByIds,
} from "@/api/admin/expert/achievement";
import dayjs from "dayjs";
import { ElMessage, ElMessageBox } from "element-plus";
import { update } from "lodash-unified";
import { useRouter } from "vue-router";
import { updateExpertAchievement } from "@/api/admin/expert/achievement";
const router = useRouter();
const dataList = ref([]);
const loading = ref(true);
const total = ref(0);
const data = reactive({
queryParams: {
pageNum: 1,
pageSize: 10,
status: 1,
},
});
const { queryParams } = toRefs(data);
/** 查询列表 */
const getList = async () => {
loading.value = true;
const resp = await expertAchievementList(queryParams.value);
dataList.value = resp.rows;
total.value = resp.total;
loading.value = false;
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
// function resetQuery() {
// if (queryRef.value) {
// queryRef.value.resetFields();
// }
// handleQuery();
// }
/** 删除按钮操作 */
const handleDelete = (id) => {
ElMessageBox.confirm('是否确认删除数据编号为"' + id + '"的成果项?').then(
async () => {
await deleteAchievementByIds({ ids: [id] });
getList();
ElMessage.success("删除成功");
}
);
};
// 上架和下架
function handleShelf(row) {
let text = row.shelfStatus == 2 ? "上架" : "下架";
ElMessageBox.confirm('确认要"' + text + '""' + row.id + '"的成果吗?').then(
async () => {
const shelfStatus = row.shelfStatus == 1 ? 2 : 1;
await updateExpertAchievement({ id: row.id, shelfStatus });
getList();
ElMessage.success(text + "成功");
}
);
}
// 取消发布
const handleCancelPublish = (id) => {
ElMessageBox.confirm(`确认要取消发布编号为"${id}"的成果吗?`).then(
async () => {
await updateExpertAchievement({ id, status: "3" });
ElMessage.success("取消发布成功");
getList();
}
);
// queryParams.value.status = "3";
// handleQuery();
};
function handleResults(id) {
router.push({ path: "./results" });
}
getList();
</script>

View File

@ -0,0 +1,286 @@
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryRef"
v-show="showSearch"
:inline="true"
@submit.prevent
>
<el-form-item label="论文题目" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入论文题目"
clearable
size="small"
style="width: 240px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="Search"
size="small"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="Refresh" size="small" @click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
size="small"
@click="handleAdd"
>新增</el-button
>
</el-col>
<right-toolbar
v-model:showSearch="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<!-- 表格数据 -->
<el-table v-loading="loading" :data="dataList">
<el-table-column label="数据编号" prop="id" />
<el-table-column
label="论文题目"
prop="title"
:show-overflow-tooltip="true"
/>
<el-table-column label="刊物" prop="ext" :show-overflow-tooltip="true" />
<el-table-column label="作者" prop="author" />
<el-table-column label="关键词" align="center" prop="keyword" />
<el-table-column label="出版日期" align="center">
<template #default="{ row }">
<span>{{
dayjs(row.publishTime).format("YYYY-MM-DD HH:mm:ss")
}}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template #default="{ row }">
<el-button
size="small"
type="text"
icon="Edit"
@click="handleUpdate(row)"
>修改</el-button
>
<el-button
size="small"
type="text"
icon="Delete"
@click="handleDelete(row.id)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改数据配置对话框 -->
<el-dialog
:title="title"
v-model="showEditDialog"
width="800px"
append-to-body
>
<el-form ref="paperRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="论文题目:" prop="title">
<el-input v-model="form.title" placeholder="请输入论文题目" />
</el-form-item>
<el-form-item label="引用格式:" prop="ext">
<el-input v-model="form.ext" placeholder="请输入引用格式" />
</el-form-item>
<el-form-item label="作者:" prop="author">
<el-input v-model="form.author" placeholder="多人员请用 , 隔开" />
</el-form-item>
<el-form-item label="出版日期:" prop="publishTime">
<el-date-picker
v-model="form.publishTime"
type="date"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择出版日期"
></el-date-picker>
</el-form-item>
<InputBoxAdd
:labelWidth="100"
v-model="form"
title="关键词"
placeholder="应用场景关键词+技术产品关键词"
fieldKey="keywords"
ref="keywordsFormRef"
/>
<el-form-item label="摘要:">
<el-input
v-model="form.remark"
type="textarea"
placeholder="请输入内容"
></el-input>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import InputBoxAdd from "@/views/components/InputBoxAdd";
import {
paperList,
insertCasPaper,
deleteCasPaper,
updateCasPaper,
} from "@/api/admin/expert";
import dayjs from "dayjs";
import { cloneDeep } from "lodash";
import { useRouter } from "vue-router";
import { ElMessage, ElMessageBox } from "element-plus";
const router = useRouter();
const dataList = ref([]);
const showEditDialog = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const total = ref(0);
const title = ref("");
const paperRef = ref();
const queryRef = ref();
const keywordsFormRef = ref();
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
// title: undefined,
},
rules: {
title: [{ required: true, message: "论文题目不能为空", trigger: "blur" }],
ext: [{ required: true, message: "刊物不能为空", trigger: "blur" }],
author: [{ required: true, message: "作者不能为空", trigger: "blur" }],
publishTime: [
{
required: true,
message: "请选择出版日期",
trigger: ["blur", "change"],
},
],
},
});
const { queryParams, form, rules } = toRefs(data);
/** 查询数据列表 */
const getList = async () => {
loading.value = true;
const resp = await paperList(queryParams.value);
dataList.value = resp.rows;
total.value = resp.total;
loading.value = false;
};
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
function resetQuery() {
if (queryRef.value) {
queryRef.value.resetFields();
}
handleQuery();
}
/** 删除按钮操作 */
function handleDelete(id) {
ElMessageBox.confirm('是否确认删除数据编号为"' + id + '"的数据项?').then(
async () => {
await deleteCasPaper(id);
getList();
ElMessage.success("删除成功");
}
);
}
/** 重置新增的表单以及其他数据 */
function reset() {
form.value = {
// id: undefined,
// title: undefined,
// ext: undefined,
// author: undefined,
// publish_at: undefined,
// keywords: [],
// remark: undefined,
};
if (paperRef.value) {
paperRef.value.resetFields();
}
}
/** 添加数据 */
function handleAdd() {
reset();
showEditDialog.value = true;
title.value = "添加论文";
}
/** 修改数据 */
function handleUpdate(row) {
// form.value = JSON.parse(JSON.stringify(row));
form.value = cloneDeep(row);
form.value.keywords = [...form.value.keyword?.split(",")];
showEditDialog.value = true;
title.value = "修改论文";
}
/** 提交按钮 */
function submitForm() {
paperRef.value.validate(async (valid) => {
const keywordsValid = keywordsFormRef.value.validateForm();
if (valid && keywordsValid) {
form.value.keyword = form.value.keywords.join(",");
if (form.value.id) {
await updateCasPaper(form.value);
ElMessage.success("修改成功");
showEditDialog.value = false;
getList();
} else {
await insertCasPaper(form.value);
ElMessage.success("新增成功");
showEditDialog.value = false;
getList();
}
} else {
console.log("校验未通过");
}
});
}
/** 取消按钮 */
function cancel() {
showEditDialog.value = false;
reset();
}
getList();
</script>

View File

@ -0,0 +1,385 @@
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryRef"
v-show="showSearch"
:inline="true"
@submit.prevent
>
<el-form-item label="专利名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入专利名称"
clearable
size="small"
style="width: 240px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<!-- <el-form-item label="申请人" prop="apply_name">
<el-input
v-model="queryParams.apply_name"
placeholder="请输入申请人"
clearable
size="small"
style="width: 240px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item label="发明人" prop="inventor">
<el-input
v-model="queryParams.inventor"
placeholder="请输入发明人"
clearable
size="small"
style="width: 240px"
@keyup.enter="handleQuery"
/>
</el-form-item> -->
<el-form-item>
<el-button type="primary" icon="Search" size="mini" @click="handleQuery"
>搜索</el-button
>
<el-button icon="Refresh" size="mini" @click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
size="mini"
@click="handleAdd"
>新增</el-button
>
</el-col>
<!-- 无接口 暂时注释 -->
<!-- <el-col :span="1.5">
<router-link to="./claimPatent">
<el-button type="primary" plain icon="Plus" size="mini"
>认领</el-button
>
</router-link>
</el-col> -->
<right-toolbar
v-model:showSearch="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<!-- 表格数据 -->
<el-table v-loading="loading" :data="dataList">
<el-table-column label="数据编号" prop="id" />
<el-table-column
label="专利名称"
prop="title"
:show-overflow-tooltip="true"
/>
<el-table-column
label="申请号"
prop="apply_code"
:show-overflow-tooltip="true"
/>
<el-table-column label="发明人" prop="inventor" />
<el-table-column label="申请(专利权)人" prop="apply_name" />
<el-table-column label="申请日期" align="center" prop="apply_at">
<template #default="scope">
<span>{{ dayjs(scope.row.apply_at).format("YYYY-MM-DD") }}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template #default="scope">
<el-button
size="mini"
type="text"
icon="Edit"
@click="handleUpdate(scope.row.id)"
>修改</el-button
>
<el-button
size="mini"
type="text"
icon="Delete"
@click="handleDelete(scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改数据配置对话框 -->
<el-dialog :title="title" v-model="open" width="800px" append-to-body>
<el-form ref="patentRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="申请人:" prop="apply_name">
<el-input
v-model="form.apply_name"
placeholder="请输入申请(专利权)人(多个请以 , 分割)"
/>
</el-form-item>
<el-form-item label="申请人地址:" prop="apply_address">
<el-input
v-model="form.apply_address"
placeholder="请输入申请人地址"
/>
</el-form-item>
<el-form-item label="发明人:" prop="inventor">
<el-input
v-model="form.inventor"
placeholder="请输入发明人(多个请以 , 分割)"
/>
</el-form-item>
<el-form-item label="专利名称:" prop="title">
<el-input v-model="form.title" placeholder="请输入专利名称" />
</el-form-item>
<el-form-item label="申请号:" prop="apply_code">
<el-input v-model="form.apply_code" placeholder="请输入申请号" />
</el-form-item>
<el-form-item label="公开号:" prop="open_code">
<el-input v-model="form.open_code" placeholder="请输入公开号" />
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="申请日期:" prop="apply_at">
<el-date-picker
style="width: 100%"
v-model="form.apply_at"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择申请日期"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="公开日:" prop="open_at">
<el-date-picker
style="width: 100%"
v-model="form.open_at"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择公开日"
></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="专利类型:" prop="kind">
<el-select
v-model="form.kind"
clearable
placeholder="请选择"
style="width: 100%"
>
<el-option
v-for="item in patentOptions"
:key="item.key"
:label="item.value"
:value="item.key"
>
</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="IPC分类号:" prop="ipc_code">
<el-input v-model="form.ipc_code" placeholder="请输入IPC分类号" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="摘要:" prop="description">
<el-input
v-model="form.description"
placeholder="请输入摘要"
type="textarea"
:autosize="{ minRows: 4, maxRows: 8 }"
/>
</el-form-item>
<el-form-item label="主权项:" prop="principal_claim">
<el-input
v-model="form.principal_claim"
placeholder="请输入主权项"
type="textarea"
:autosize="{ minRows: 4, maxRows: 8 }"
/>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
// import {
// expertPatent,
// patentAdd,
// patentDetail,
// patentEdit,
// patentDelete,
// } from "@/api/admin/expert/technology";
import dayjs from "dayjs";
import { useRouter } from "vue-router";
const router = useRouter();
const { proxy } = getCurrentInstance();
const dataList = ref([]);
const open = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const total = ref(0);
const title = ref("");
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
page_size: 10,
inventor: undefined,
},
rules: {
apply_name: [
{ required: true, message: "申请人不能为空", trigger: "blur" },
],
apply_address: [
{ required: true, message: "申请人地址不能为空", trigger: "blur" },
],
open_code: [{ required: true, message: "公开号不能为空", trigger: "blur" }],
open_at: [{ required: true, message: "公开日不能为空", trigger: "blur" }],
inventor: [{ required: true, message: "发明人不能为空", trigger: "blur" }],
title: [{ required: true, message: "专利名称不能为空", trigger: "blur" }],
apply_code: [
{ required: true, message: "申请号不能为空", trigger: "blur" },
],
apply_at: [
{ required: true, message: "申请日期不能为空", trigger: "blur" },
],
kind: [{ required: true, message: "请选择专利类型", trigger: "change" }],
ipc_code: [
{ required: true, message: "IPC分类号不能为空", trigger: "blur" },
],
description: [{ required: true, message: "摘要不能为空", trigger: "blur" }],
principal_claim: [
{ required: true, message: "主权项不能为空", trigger: "blur" },
],
},
});
const { queryParams, form, rules } = toRefs(data);
/** 查询数据列表 */
const getList = async () => {
loading.value = true;
expertPatent(queryParams.value).then((response) => {
dataList.value = response.data.data;
total.value = response.data.count;
loading.value = false;
});
};
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.value.pageNum = 1;
getList();
};
/** 重置按钮操作 */
function resetQuery() {
proxy.resetForm("queryRef");
handleQuery();
}
/** 删除按钮操作 */
function handleDelete(row) {
proxy.$modal
.confirm('是否确认删除数据编号为"' + row.id + '"的专利项?')
.then(function () {
return patentDelete({ id: row.id });
})
.then(() => {
getList();
proxy.$modal.msgSuccess("删除成功");
})
.catch(() => {});
}
/** 重置新增的表单以及其他数据 */
function reset() {
form.value = {
id: undefined,
apply_name: undefined,
apply_address: undefined,
inventor: undefined,
title: undefined,
apply_code: undefined,
open_code: undefined,
open_at: undefined,
apply_at: undefined,
kind: undefined,
ipc_code: undefined,
description: undefined,
principal_claim: undefined,
};
proxy.resetForm("patentRef");
}
/** 添加数据 */
const handleAdd = () => {
reset();
open.value = true;
title.value = "添加数据";
};
/** 修改数据 */
const handleUpdate = (id) => {
reset();
patentDetail({ id }).then((res) => {
form.value = res.data;
open.value = true;
title.value = "修改数据";
});
};
/** 提交按钮 */
function submitForm() {
proxy.$refs["patentRef"].validate((valid) => {
if (valid) {
if (form.value.id != undefined) {
patentEdit(form.value).then((response) => {
proxy.$modal.msgSuccess("修改成功");
open.value = false;
getList();
});
} else {
patentAdd(form.value).then((response) => {
proxy.$modal.msgSuccess("新增成功");
open.value = false;
getList();
});
}
}
});
}
/** 取消按钮 */
function cancel() {
open.value = false;
reset();
}
// getList();
</script>

View File

@ -0,0 +1,63 @@
<template>
<div class="app-container">
<el-card shadow="always" style="width: 55%; margin: 0 auto">
<ReleaseForm
v-model="form"
:isAdd="false"
:labelWidth="labelWidth"
ref="releaseFormRef"
/>
<div :style="{ marginLeft: labelWidth + 'px' }">
<el-button type="primary" @click="submitForm(`3`)">保存草稿</el-button>
<el-button type="primary" @click="submitForm(`0`)">提交审核</el-button>
</div>
</el-card>
</div>
</template>
<script setup name="ReleaseAchievement">
import {
insertAchievement,
expertAchievementInfo,
updateExpertAchievement,
} from "@/api/admin/expert/achievement";
import { ElMessage } from "element-plus";
import { reactive, toRefs } from "vue";
import { useRoute, useRouter } from "vue-router";
import ReleaseForm from "../components/ReleaseForm";
const labelWidth = 140;
const data = reactive({
form: { mode: 1 },
});
const { form } = toRefs(data);
const route = useRoute();
const router = useRouter();
const releaseFormRef = ref();
const { id } = route.query;
if (id) {
expertAchievementInfo({ id }).then((resp) => {
form.value = resp.data;
form.value.keywords =
form.value.keyword?.split(",").filter((el) => el !== "") ?? [];
form.value.customers =
form.value.customer?.split(",").filter((el) => el !== "") ?? [];
});
}
const submitForm = async (status) => {
if (await releaseFormRef.value.validateForm()) {
if (id) {
await updateExpertAchievement({ ...form.value, status });
ElMessage.success("修改成果成功");
router.back();
} else {
await insertAchievement({ ...form.value, status });
ElMessage.success("新增成果成功");
router.back();
}
} else {
console.log("校验未通过");
}
};
</script>

View File

@ -0,0 +1,353 @@
<template>
<div class="app-container">
<el-form
:model="queryParams"
ref="queryRef"
v-show="showSearch"
:inline="true"
@submit.prevent
>
<el-form-item label="科研项目名称" prop="title">
<el-input
v-model="queryParams.title"
placeholder="请输入科研项目名称"
clearable
size="small"
style="width: 240px"
@keyup.enter="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button
type="primary"
icon="Search"
size="small"
@click="handleQuery"
>搜索</el-button
>
<el-button icon="Refresh" size="small" @click="resetQuery"
>重置</el-button
>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="Plus"
size="small"
@click="handleAdd"
>新增</el-button
>
</el-col>
<right-toolbar
v-model:showSearch="showSearch"
@queryTable="getList"
></right-toolbar>
</el-row>
<!-- 表格数据 -->
<el-table v-loading="loading" :data="dataList">
<el-table-column label="数据编号" prop="id" />
<el-table-column
label="科研项目名称"
prop="title"
:show-overflow-tooltip="true"
/>
<el-table-column label="类型" prop="kind" />
<el-table-column label="课题角色" prop="role">
<template #default="scope">
<div v-if="scope.row.role == 1">承担单位</div>
<div v-else-if="scope.row.role == 2">参与单位</div>
</template>
</el-table-column>
<el-table-column label="课题负责人" prop="director" />
<el-table-column label="发布日期" align="center" prop="created_at">
<template #default="scope">
<span>{{
dayjs(scope.row.created_at).format("YYYY-MM-DD HH:mm:ss")
}}</span>
</template>
</el-table-column>
<el-table-column
label="操作"
align="center"
class-name="small-padding fixed-width"
>
<template #default="{ row }">
<el-button
size="small"
type="text"
icon="Download"
@click="handleShelf(row)"
>下架</el-button
>
<el-button
size="small"
type="text"
icon="Edit"
@click="handleUpdate(row)"
>修改</el-button
>
<el-button
size="small"
type="text"
icon="Delete"
@click="handleDelete(row.id)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改数据配置对话框 -->
<el-dialog
:title="title"
v-model="showEditDialog"
width="720px"
append-to-body
>
<el-form
ref="researchRef"
:model="form"
:rules="rules"
label-width="120px"
>
<el-form-item label="科研项目名称:" prop="title">
<el-input v-model="form.title" placeholder="请输入科研项目名称" />
</el-form-item>
<el-form-item label="课题角色:" prop="role">
<el-radio v-model="form.role" label="1">承担单位</el-radio>
<el-radio v-model="form.role" label="2">参与单位</el-radio>
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="资助经费:" prop="amount">
<el-input
v-model="form.amount"
oninput="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3').replace(/^\./g, '')"
placeholder="请输入资助经费"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="资助来源:" prop="source">
<el-input v-model="form.source" placeholder="请输入资助来源" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="开始日期:" prop="beginTime">
<el-date-picker
v-model="form.beginTime"
type="date"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择开始日期"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="结束日期:" prop="finishTime">
<el-date-picker
v-model="form.finishTime"
type="date"
value-format="YYYY-MM-DD HH:mm:ss"
placeholder="请选择结束日期"
></el-date-picker>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="项目类型:" prop="kind">
<el-input v-model="form.kind" placeholder="请输入项目类型" />
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="课题负责人:" prop="director">
<el-input
v-model="form.director"
placeholder="请输入课题负责人"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import {
technologyProjectList,
insertTechnologyProject,
deleteTechnologyProjectByIds,
updateTechnologyProject,
} from "@/api/admin/expert/research";
import dayjs from "dayjs";
import { ElMessage, ElMessageBox } from "element-plus";
import { cloneDeep } from "lodash-unified";
import { useRouter } from "vue-router";
const router = useRouter();
const dataList = ref([]);
const showEditDialog = ref(false);
const loading = ref(true);
const showSearch = ref(true);
const total = ref(0);
const title = ref("");
const researchRef = ref();
const queryRef = ref();
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10,
},
rules: {
title: [
{ required: true, message: "科研项目名称不能为空", trigger: "blur" },
],
amount: [{ required: true, message: "资助经费不能为空", trigger: "blur" }],
source: [{ required: true, message: "资助来源不能为空", trigger: "blur" }],
beginTime: [
{
required: true,
message: "请选择开始日期",
trigger: ["blur", "change"],
},
],
finishTime: [
{
required: true,
message: "请选择结束日期",
trigger: ["blur", "change"],
},
],
kind: [{ required: true, message: "项目类型不能为空", trigger: "blur" }],
director: [
{ required: true, message: "课题负责人不能为空", trigger: "blur" },
],
},
});
const { queryParams, form, rules } = toRefs(data);
/** 查询数据列表 */
const getList = async () => {
loading.value = true;
const resp = await technologyProjectList(queryParams.value);
dataList.value = resp.rows;
total.value = resp.total;
loading.value = false;
};
/** 搜索按钮操作 */
function handleQuery() {
queryParams.value.pageNum = 1;
getList();
}
/** 重置按钮操作 */
function resetQuery() {
// proxy.resetForm("queryRef");
if (queryRef.value) {
queryRef.value.resetFields();
}
handleQuery();
}
function handleShelf(row) {
let text = row.shelf_status == 2 ? "上架" : "下架";
ElMessageBox.confirm(`确认要${text}"${row.id}"的数据吗?`)
.then(function () {
let status = row.shelf_status == 1 ? 2 : 1;
return projectShelf({ id: row.id, status });
})
.then(() => {
getList();
ElMessage.success(text + "成功");
})
.catch(() => {});
}
/** 删除按钮操作 */
function handleDelete(id) {
ElMessageBox.confirm(`是否确认删除数据编号为"${id}"的数据项?`).then(
async () => {
await deleteTechnologyProjectByIds({ ids: [id] });
getList();
ElMessage.success("删除成功");
}
);
}
/** 重置新增的表单以及其他数据 */
function reset() {
form.value = {
// id: undefined,
// title: undefined,
// role: 1,
// amount: undefined,
// source: undefined,
// beginTime: undefined,
// finishTime: undefined,
// kind: undefined,
// director: undefined,
};
if (researchRef.value) {
researchRef.value.resetFields();
}
}
/** 添加数据 */
function handleAdd() {
reset();
showEditDialog.value = true;
title.value = "添加数据";
}
/** 修改数据 */
function handleUpdate(row) {
reset();
form.value = cloneDeep(row);
showEditDialog.value = true;
title.value = "修改数据";
}
/** 提交按钮 */
function submitForm() {
researchRef.value.validate(async (valid) => {
if (valid) {
form.value.amount = form.value.amount - 0;
if (form.value.id) {
await updateTechnologyProject(form.value);
ElMessage.success("修改成功");
showEditDialog.value = false;
getList();
} else {
await insertTechnologyProject(form.value);
ElMessage.success("新增成功");
showEditDialog.value = false;
getList();
}
}
});
}
/** 取消按钮 */
function cancel() {
showEditDialog.value = false;
reset();
}
getList();
</script>

View File

@ -28,11 +28,11 @@
</el-col>
</el-row>
<el-row>
<!-- <el-row>
<el-col :span="12">
<el-form-item label="所属单位:" prop="research_id">
<el-form-item label="所属单位:" prop="researchId">
<el-select
v-model="modelValue.research_id"
v-model="modelValue.researchId"
filterable
placeholder="请选择"
@change="setLaboratory"
@ -50,7 +50,7 @@
<el-col :span="12">
<el-form-item label="所属实验室:">
<el-select
v-model="modelValue.laboratory_id"
v-model="modelValue.laboratoryId"
filterable
placeholder="请选择"
>
@ -64,7 +64,7 @@
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-row> -->
<CityOptions
v-model="modelValue"
@ -124,9 +124,9 @@
<el-row>
<el-col :span="12">
<el-form-item label="从业时间:" prop="work_at">
<el-form-item label="从业时间:" prop="workTime">
<el-date-picker
v-model="modelValue.work_at"
v-model="modelValue.workTime"
type="date"
value-format="YYYY-MM-DD"
placeholder="选择日期"
@ -216,8 +216,8 @@ const data = reactive({
trigger: "blur",
},
],
research_id: [{ required: true, message: "请选择", trigger: "change" }],
tenant_id: [
researchId: [{ required: true, message: "请选择", trigger: "change" }],
tenantId: [
{
required: true,
message: "请选择",
@ -229,7 +229,7 @@ const data = reactive({
major: [{ required: true, message: "请输入", trigger: "blur" }],
job: [{ required: true, message: "请输入", trigger: "blur" }],
title: [{ required: true, message: "请输入", trigger: "blur" }],
work_at: [
workTime: [
{
required: true,
message: "从业时间不能为空",
@ -261,7 +261,7 @@ const cityFormRef = ref();
const fieldFormRef = ref();
const keywordsFormRef = ref();
const researchsFormRef = ref();
const setLaboratory = () => {};
const validateForm = async () => {
let formValid;
try {
@ -272,7 +272,7 @@ const validateForm = async () => {
const cityFormValid = await cityFormRef.value.validateForm(); // 城市选择表单验证
const fieldFormValid = await fieldFormRef.value.validateForm(); // 领域选择表单验证
const keywordsFormValid = await keywordsFormRef.value.validateForm(); // 关键词表单验证
const researchsFormValid = await researchsFormRef.value.validateForm();
const researchsFormValid = await researchsFormRef.value.validateForm(); // 研究方向表单验证
return (
formValid &&
cityFormValid &&

View File

@ -64,8 +64,58 @@
</el-row>
</el-form>
</template>
<script>
import { industry } from "@/api/config";
<script setup>
import { listSysIndustry } from "@/api/config";
import { reactive, toRefs } from "vue";
const props = defineProps({
modelValue: Object,
labelWidth: {
type: Number,
default: 120,
},
});
const { modelValue, labelWidth } = toRefs(props);
const data = reactive({
rules: {
industrys: [
{
type: "array",
required: true,
message: "请选择",
trigger: "change",
},
],
},
});
const { rules } = toRefs(data);
const levelI = ref([]);
const levelII = ref([]);
const levelIII = ref([]);
// 获取领域树形列表
const getIndustryTreeData = async () => {
const { data } = await listSysIndustry();
levelI.value = data;
};
const levelIChange = async (item) => {
delete modelValue.value.industrys[1];
delete modelValue.value.industrys[2];
levelII.value = levelI.value.find((el) => {
return el.id === item;
}).children;
};
const levelIIChange = async (item) => {
delete modelValue.value.industrys[2];
levelIII.value = levelII.value.find((el) => el.id === item).children;
};
getIndustryTreeData();
</script>
<!-- <script>
// import { industry } from "@/api/config";
export default {
props: {
modelValue: Object,
@ -143,4 +193,4 @@ export default {
});
},
};
</script>
</script> -->

View File

@ -5,7 +5,7 @@
v-model="form"
:isAdd="false"
:labelWidth="labelWidth"
ref="expertForm"
ref="expertFormRef"
/>
<div :style="{ marginLeft: labelWidth + 'px' }">
<el-button @click="$router.go(-1)">取消</el-button>
@ -15,23 +15,25 @@
</div>
</template>
<script setup>
import { expert } from "@/api/identity/index";
import { insertCasExpert } from "@/api/identity/index";
import ExpertForm from "@/views/components/ExpertForm";
import { ElMessage } from "element-plus";
import { useRouter } from "vue-router";
const { proxy } = getCurrentInstance();
const router = useRouter();
const labelWidth = 140;
const form = reactive({
laboratory_id: undefined, // 所属实验室
gender: 1,
});
function submitForm(status) {
// if (proxy.$refs.expertForm.submitForm()) {
// expert(form).then((res) => {
// proxy.$modal.msgSuccess("新增成功");
// proxy.$router.go(-1);
// });
// } else {
// console.log("校验未通过");
// }
}
const expertFormRef = ref();
const submitForm = async (status) => {
if (await expertFormRef.value.validateForm()) {
form.area = form.district;
await insertCasExpert(form);
ElMessage.success("申请已提交");
router.back();
} else {
console.log("校验未通过");
}
};
</script>

View File

@ -5,6 +5,7 @@
<el-col
:span="4"
v-for="item in identityList.slice(0, 5)"
v-show="item.id <= 2"
:key="item.id"
@click="handleStatus(item)"
>
@ -26,9 +27,9 @@
查看拒绝原因
</p>
</div>
<!-- <div v-else-if="item.status == 4">
<div v-else-if="item.status == 4">
<el-link type="primary">申请</el-link>
</div> -->
</div>
</el-card>
</el-col>
</el-row>
@ -39,6 +40,7 @@
<el-col
:span="4"
v-for="item in identityList.slice(0, 5)"
v-show="item.id <= 2"
:key="item.id"
>
<el-card style="text-align: center; height: 100%">
@ -49,6 +51,7 @@
></el-image>
<h3>{{ `${item.title}后台` }}</h3>
<p v-if="item.status == 1">
<!-- <p> -->
<el-link type="primary" @click="handlePage(item)">进入</el-link>
</p>
</el-card>
@ -63,6 +66,7 @@ import { identity, settled, identitySwitch } from "@/api/identity/index";
import { useRouter } from "vue-router";
import usePermissionStore from "@/store/modules/permission";
import useUserStore from "@/store/modules/user";
import { ElMessageBox } from "element-plus";
const router = useRouter();
const permissionStore = usePermissionStore();
@ -109,11 +113,12 @@ function reason(item) {
alert("拒绝原因:\n" + item.remark);
}
function noClicking() {
return identityList.value.some((item) => item.status === 0);
return identityList.value.some((item) => item.status == 0);
}
// item.status -1>未入驻 0>审核中 1>通过 2拒绝
function handleStatus(item) {
if (noClicking()) return alert("你有已入住申请中");
console.log(item);
if (noClicking()) return ElMessageBox.alert("您已有入驻申请");
if (item.status === "4" || item.status === "2") {
if (item.id == 1) {
// 企业

View File

@ -0,0 +1,8 @@
<template>
关于我们
<WebFooter></WebFooter>
</template>
<script setup name="AboutUs">
import WebFooter from "../../../components/webFooter/index.vue";
// import WebFooter from "@/components/webFooter";
</script>

View File

@ -0,0 +1,7 @@
<template>
活动
<WebFooter></WebFooter>
</template>
<script setup name="Activity">
import WebFooter from "@/components/webFooter/index.vue";
</script>

View File

@ -1,222 +1,9 @@
<template>
<div
class="box"
style="background-size: cover; background-color: #fff"
:style="{ backgroundImage: state.banner ? `url(${state.banner})` : '' }"
>
<div>
<el-row>
<el-col :push="4" :sm="10" :md="12">
<div class="tab">
<div
v-for="(v, index) in state.tabList"
:class="{ active: state.tabIndex == index }"
@click="state.tabIndex = index"
>
{{ v }}
</div>
</div>
</el-col>
</el-row>
<div style="height: 16px"></div>
<el-row>
<el-col :push="4" :sm="10" :md="12">
<el-input v-model.trim="state.keyword" placeholder="请输入检索词">
<template #append>
<el-button class="x_btns" icon="Search" @click="handleQuery"
>搜索</el-button
>
</template>
</el-input>
</el-col>
<el-col :push="4" :sm="10" :md="8">
<div class="btnsWrap">
<el-button class="x_btns" @click="handleQuery">发布需求</el-button>
<el-button class="x_btns" @click="handleQuery"
>专家机构录入</el-button
>
</div>
</el-col>
</el-row>
<div style="height: 15vh"></div>
<el-row>
<el-col :push="3" :pull="3" :span="18">
<div class="numBox">
<div>
<div class="val">{{ state.data.expert_count }}</div>
<div class="des">专家数量</div>
</div>
<div>
<div class="val">
{{ state.data.patent_count + state.data.achievement_count }}
</div>
<div class="des">专利成果数量</div>
</div>
<div>
<div class="val">{{ state.data.demand_count }}</div>
<div class="des">需求数量</div>
</div>
<div>
<div class="val">{{ state.data.docking_count }}</div>
<div class="des">对接数量</div>
</div>
<div>
<div class="val">{{ state.data.company_count }}</div>
<div class="des">实验室数量</div>
</div>
</div>
</el-col>
</el-row>
<!-- <div class="icp-beian">
<el-link type="primary" href="https://beian.miit.gov.cn/"
>皖ICP备18001784号</el-link
>
</div> -->
</div>
<!-- <webFooter></webFooter> -->
</div>
<div class="box">首页1</div>
</template>
<script setup>
import { onMounted, reactive } from "vue";
import { banner } from "@/api/website/home/index";
const router = useRouter();
import request from "@/utils/request";
function indexData() {
return request({
url: "/v1/index",
method: "get",
});
}
function handleDetail(mode, keyword) {
let routeData = router.resolve({
path: `/searchList/${mode}`,
query: { keyword },
});
window.open(routeData.href, "_blank");
}
function handleQuery() {
console.log(state.keyword, state.tabIndex);
handleDetail(state.tabIndex, state.keyword);
}
const state = reactive({
keyword: "",
tabList: ["找企业", "找成果", "找实验室", "找专利", "找专家", "接需求"],
tabIndex: 0,
banner: "",
data: {
expert_count: 0,
company_count: 0,
patent_count: 0,
achievement_count: 0,
demand_count: 0,
docking_count: 0,
},
});
onMounted(() => {
banner("首页背景").then((res) => {
if (200 == res.code) {
state.banner = res.data.images;
}
});
indexData().then((res) => {
if (200 == res.code) {
state.data = res.data;
}
});
// console.log("onmunted");
});
</script>
<style lang="scss" scoped>
.x_btns {
font-size: 14px !important;
font-weight: 400;
}
.box {
height: 100%;
width: 100%;
display: flex;
display: -webkit-flex;
align-items: center;
justify-content: center;
& > div {
width: 100%;
}
}
.btnsWrap {
margin: 0 0 0 40px;
.el-button {
height: 36px;
padding: 10px 25px;
}
}
.numBox {
display: flex;
display: -webkit-flex;
& > div {
flex: 1;
height: 200px;
display: -webkit-flex;
align-items: center;
justify-content: center;
flex-direction: column;
}
.val {
font-size: 36px;
font-family: DIN;
font-weight: 400;
color: #333333;
margin-bottom: 10px;
}
.des {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #333333;
}
}
.tab {
width: 480px;
height: 42px;
overflow: hidden;
& > div {
width: 80px;
height: 42px;
line-height: 42px;
text-align: center;
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #333333;
float: left;
cursor: pointer;
user-select: none;
}
& > div.active {
font-size: 14px;
font-weight: 500;
color: #ffffff;
line-height: 38px;
background-image: url(./img/index1-bg1.png);
background-size: cover;
}
}
.wrap {
padding-left: 460px;
}
.search {
width: 720px;
}
.icp-beian {
width: 100vw;
text-align: center;
position: absolute;
bottom: 10px;
}
</style>

View File

@ -1,297 +1 @@
<template>
<div class="box">
<div style="position: absolute; top: 0; left: 50%">
<webReleaseActive
v-model:dialogVisible="dialogVisible"
></webReleaseActive>
</div>
<div class="wrap">
<div class="tit">
<div class="left">科技活动</div>
<div class="right">
<!-- @click="dialogVisible = true" -->
<!-- <div class="publish">发布活动</div> -->
<div class="more" @click="handlePage">更多</div>
</div>
</div>
<div class="content">
<div
class="item"
:class="index == 0 ? 'one' : ''"
v-for="(item, index) in state.list.slice(0, 1)"
:key="item.id"
@click="handleDetail(item.id)"
>
<img :src="item.image" style="width: 100%" />
<div class="des">
<div class="left">
<div>{{ item.title }}</div>
<div class="time">
活动时间{{ parseTime(item.begin_at) }} -
{{ parseTime(item.finish_at) }}
</div>
<div>{{ item.join_count }}人已观看</div>
</div>
<div class="right">{{ item.amount }}元报名</div>
</div>
</div>
<div
class="item"
v-for="item in state.list.slice(1)"
:key="item.id"
@click="handleDetail(item.id)"
>
<div class="img">
<img :src="item.image" />
</div>
<div class="dess">
<div class="txt">
{{ item.title }}
</div>
<div class="dess1">
<div class="time">
活动时间{{ parseTime(item.begin_at) }}
<!-- - {{ parseTime(item.finish_at) }} -->
</div>
<div>{{ item.join_count }}人已观看</div>
</div>
<div class="enroll">{{ item.amount }}元报名</div>
</div>
</div>
<!-- <div class="item">
<div class="img">
<img
src="https://t7.baidu.com/it/u=1820929524,3700012367&fm=193&f=GIF"
/>
</div>
<div class="dess">
<div class="txt">
助力工厂公辅系统数字化及节能提效助力工厂公辅系统数字化及节能提效
</div>
<div class="dess1">
<div class="time">活动时间2021-11-01 08:00</div>
<div>1988人已观看</div>
</div>
<div class="enroll">19.9元报名</div>
</div>
</div>
<div class="item">
<div class="img">
<img
src="https://t7.baidu.com/it/u=1820929524,3700012367&fm=193&f=GIF"
/>
</div>
<div class="dess">
<div class="txt">
助力工厂公辅系统数字化及节能提效助力工厂公辅系统数字化及节能提效
</div>
<div class="dess1">
<div class="time">活动时间2021-11-01 08:00</div>
<div>1988人已观看</div>
</div>
<div class="enroll">19.9元报名</div>
</div>
</div>
<div class="item">
<div class="img">
<img
src="https://t7.baidu.com/it/u=1820929524,3700012367&fm=193&f=GIF"
/>
</div>
<div class="dess">
<div class="txt">
助力工厂公辅系统数字化及节能提效助力工厂公辅系统数字化及节能提效
</div>
<div class="dess1">
<div class="time">活动时间2021-11-01 08:00</div>
<div>1988人已观看</div>
</div>
<div class="enroll end">已结束</div>
</div>
</div> -->
</div>
</div>
</div>
</template>
<script setup lang="ts">
import request from "@/utils/request";
import { defineComponent, onMounted, reactive } from "vue";
import webReleaseActive from "@/components/webReleaseActive/index.vue";
function activity() {
return request({
url: "/v1/activity",
method: "post",
data: {
status: 2,
page_num: 1,
page_size: 5,
},
});
}
const router = useRouter();
const dialogVisible = ref(false);
const state = reactive({
list: [],
total: 0,
});
function getList() {
activity().then((res) => {
if (200 == res.code) {
state.total = res.data.count;
state.list = res.data.data;
}
});
}
function handleDetail(id) {
let routeData = router.resolve({ path: `/activity/detail/${id}` });
window.open(routeData.href, "_blank");
}
function handlePage() {
router.push("/activity");
}
getList();
</script>
<style lang="scss" scoped>
.box {
height: 100%;
width: 100%;
display: flex;
display: -webkit-flex;
align-items: center;
justify-content: center;
div.wrap {
width: 1400px;
}
}
.tit {
overflow: hidden;
padding: 20px 0;
.left {
float: left;
font-size: 36px;
font-family: Source Han Sans CN;
font-weight: 300;
color: #333333;
}
.right {
float: right;
font-size: 20px;
font-family: Source Han Sans CN;
.publish {
display: inline-block;
font-weight: 500;
color: #0054ff;
margin-right: 20px;
cursor: pointer;
user-select: none;
}
.more {
display: inline-block;
font-weight: 400;
color: #333333;
cursor: pointer;
user-select: none;
}
}
}
.content {
width: 101%;
overflow: hidden;
.time {
display: inline-block;
padding: 2px 8px;
margin: 2px 0;
background: #0054ff;
border-radius: 10px;
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #ffffff;
}
.item {
position: relative;
float: left;
width: 24%;
margin: 0 1% 1% 0;
.dess {
overflow: hidden;
.txt {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.dess1 {
float: left;
}
.enroll {
margin-top: 10px;
float: right;
width: 90px;
height: 30px;
line-height: 30px;
background: #0054ff;
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #ffffff;
text-align: center;
&.end {
background: #b4b4b4;
}
}
}
img {
top: 0;
left: 0;
position: absolute;
width: 100%;
height: 100%;
}
.img {
position: relative;
width: 100%;
height: 0;
padding-bottom: 54%;
}
&.one {
width: 49%;
height: 0;
padding-bottom: 36.75%;
overflow: hidden;
.des {
position: absolute;
height: 94px;
width: 100%;
bottom: 0;
background: rgba(0, 0, 0, 0.2);
overflow: hidden;
.left {
float: left;
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #ffffff;
margin: 16px 0 0 18px;
}
.right {
margin: 27px 38px;
float: right;
width: 120px;
height: 40px;
line-height: 40px;
background: #0054ff;
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #ffffff;
text-align: center;
}
}
}
}
}
</style>
<template>首页2</template>

View File

@ -42,11 +42,18 @@
<script setup>
import { defineComponent, getCurrentInstance, onMounted, reactive } from "vue";
import echarts from "echarts";
import { getExpert } from "@/api/website/home/index";
// return;
// console.log(echarts);
import * as echarts from "echarts";
import * as ama from "echarts-extension-amap";
console.log(ama);
// import { AMap } from "echarts-extension-amap";
// import { echarts } from "echarts";
// import { getExpert } from "@/api/website/home/index";
const { proxy } = getCurrentInstance();
const loading = shallowRef(true);
// console.log(123);
let treeData = {
340000: {
code: "340000",
@ -116,6 +123,7 @@ let treeData = {
},
},
};
// let treeData = {};
const snapTree = shallowRef({});
function searchRegionData(code) {
@ -200,13 +208,229 @@ const state = reactive({
onMounted(() => {
// 数据接口
getExpert().then((res) => {
if (200 == res.code) {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
}
});
const res = {
code: 200,
message: "ok",
data: {
110000: {
code: "110000",
name: "北京市",
count: 3,
industry: {
"新能源与节能-批发业": 1,
"生物与新医药-医药生物技术-新型疫苗": 1,
电子信息: 1,
"电子信息-软件-基础信息": 1,
"科学研究和技术服务业-专业技术服务业": 1,
"科学研究和技术服务业-科技推广和应用服务业": 1,
"高技术服务-检验检测认证与标准服务": 1,
},
children: {
110100: {
code: "110100",
name: "市辖区",
count: 3,
industry: {
"新能源与节能-批发业": 1,
"生物与新医药-医药生物技术-新型疫苗": 1,
电子信息: 1,
"电子信息-软件-基础信息": 1,
"科学研究和技术服务业-专业技术服务业": 1,
"科学研究和技术服务业-科技推广和应用服务业": 1,
"高技术服务-检验检测认证与标准服务": 1,
},
children: {
110101: {
code: "110101",
name: "东城区",
count: 1,
industry: {
"新能源与节能-批发业": 1,
"生物与新医药-医药生物技术-新型疫苗": 1,
"电子信息-软件-基础信息": 1,
},
children: null,
},
110102: {
code: "110102",
name: "西城区",
count: 1,
industry: {
电子信息: 1,
"科学研究和技术服务业-专业技术服务业": 1,
"高技术服务-检验检测认证与标准服务": 1,
},
children: null,
},
110108: {
code: "110108",
name: "海淀区",
count: 1,
industry: { "科学研究和技术服务业-科技推广和应用服务业": 1 },
children: null,
},
},
},
},
},
120000: {
code: "120000",
name: "天津市",
count: 1,
industry: {
"电子信息-微电子技术-集成电路设计技术": 1,
"电子信息-软件-基础信息": 1,
"航空航天-航天技术": 1,
},
children: {
120100: {
code: "120100",
name: "市辖区",
count: 1,
industry: {
"电子信息-微电子技术-集成电路设计技术": 1,
"电子信息-软件-基础信息": 1,
"航空航天-航天技术": 1,
},
children: {
120101: {
code: "120101",
name: "和平区",
count: 1,
industry: {
"电子信息-微电子技术-集成电路设计技术": 1,
"电子信息-软件-基础信息": 1,
"航空航天-航天技术": 1,
},
children: null,
},
},
},
},
},
310000: {
code: "310000",
name: "上海市",
count: 1,
industry: { "新能源与节能-可再生清洁能源-太阳能": 1 },
children: {
310100: {
code: "310100",
name: "市辖区",
count: 1,
industry: { "新能源与节能-可再生清洁能源-太阳能": 1 },
children: {
310109: {
code: "310109",
name: "虹口区",
count: 1,
industry: { "新能源与节能-可再生清洁能源-太阳能": 1 },
children: null,
},
},
},
},
},
340000: {
code: "340000",
name: "安徽省",
count: 3,
industry: {
"新材料-金属材料-精品钢材制备技术": 1,
"生物与新医药-煤炭开采和洗选业": 2,
"生物与新医药-石油和天然气开采业": 3,
"电子信息-农业": 1,
"电子信息-农业-测试名称": 5,
"电子信息-林业": 1,
"电子信息-畜牧业": 1,
"电子信息-软件-基础信息": 3,
航空航天: 1,
},
children: {
340100: {
code: "340100",
name: "合肥市",
count: 1,
industry: {
"新材料-金属材料-精品钢材制备技术": 1,
"生物与新医药-煤炭开采和洗选业": 1,
"电子信息-农业": 1,
"电子信息-软件-基础信息": 3,
航空航天: 1,
},
children: {
340171: {
code: "340171",
name: "合肥高新技术产业开发区",
count: 1,
industry: {
"新材料-金属材料-精品钢材制备技术": 1,
"生物与新医药-煤炭开采和洗选业": 1,
"电子信息-农业": 1,
"电子信息-软件-基础信息": 3,
航空航天: 1,
},
children: null,
},
},
},
340200: {
code: "340200",
name: "芜湖市",
count: 1,
industry: {
"电子信息-农业-测试名称": 1,
"电子信息-林业": 1,
"电子信息-畜牧业": 1,
},
children: {
340208: {
code: "340208",
name: "三山区",
count: 1,
industry: {
"电子信息-农业-测试名称": 1,
"电子信息-林业": 1,
"电子信息-畜牧业": 1,
},
children: null,
},
},
},
340800: {
code: "340800",
name: "安庆市",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 1,
"生物与新医药-石油和天然气开采业": 3,
"电子信息-农业-测试名称": 4,
},
children: {
340826: {
code: "340826",
name: "宿松县",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 1,
"生物与新医药-石油和天然气开采业": 3,
"电子信息-农业-测试名称": 4,
},
children: null,
},
},
},
},
},
},
};
// getExpert().then((res) => {
// if (200 == res.code) {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
// }
// });
// let echartsDomList = document.querySelectorAll('.echartsDom');
// // 兼容echarts
// echartsDomList.forEach(element => {
@ -545,4 +769,4 @@ function loadMap(mapName, data) {
width: 90px;
}
}
</style>
</style>

View File

@ -43,7 +43,7 @@
<script setup>
import { defineComponent, getCurrentInstance, onMounted, reactive } from "vue";
import echarts from "echarts";
import { laboratory } from "@/api/website/home/index";
// import { laboratory } from "@/api/website/home/index";
const { proxy } = getCurrentInstance();
const loading = shallowRef(true);
@ -200,13 +200,14 @@ const state = reactive({
onMounted(() => {
// 数据接口
laboratory().then((res) => {
if (200 == res.code) {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
}
});
const res = { code: 200, message: "ok", data: {} };
// laboratory().then((res) => {
// if (200 == res.code) {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
// }
// });
// let echartsDomList = document.querySelectorAll('.echartsDom');
// // 兼容echarts
// echartsDomList.forEach(element => {
@ -543,4 +544,4 @@ function loadMap(mapName, data) {
width: 90px;
}
}
</style>
</style>

View File

@ -42,8 +42,8 @@
<script setup>
import { defineComponent, getCurrentInstance, onMounted, reactive } from "vue";
import echarts from "echarts";
import { achievement } from "@/api/website/home/index";
import * as echarts from "echarts";
// import { achievement } from "@/api/website/home/index";
const { proxy } = getCurrentInstance();
const loading = shallowRef(true);
@ -200,13 +200,112 @@ const state = reactive({
onMounted(() => {
// 数据接口
achievement().then((res) => {
if (200 == res.code) {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
}
});
const res = {
code: 200,
message: "ok",
data: {
220000: {
code: "220000",
name: "吉林省",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 12,
"电子信息-农业": 12,
航空航天: 12,
},
children: {
220700: {
code: "220700",
name: "松原市",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 12,
"电子信息-农业": 12,
航空航天: 12,
},
children: {
220771: {
code: "220771",
name: "吉林松原经济开发区",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 12,
"电子信息-农业": 12,
航空航天: 12,
},
children: null,
},
},
},
},
},
340000: {
code: "340000",
name: "安徽省",
count: 2,
industry: {
"生物与新医药-煤炭开采和洗选业": 48,
"电子信息-农业": 48,
航空航天: 48,
},
children: {
340100: {
code: "340100",
name: "合肥市",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 12,
"电子信息-农业": 12,
航空航天: 12,
},
children: {
340171: {
code: "340171",
name: "合肥高新技术产业开发区",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 12,
"电子信息-农业": 12,
航空航天: 12,
},
children: null,
},
},
},
340800: {
code: "340800",
name: "安庆市",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 36,
"电子信息-农业": 36,
航空航天: 36,
},
children: {
340826: {
code: "340826",
name: "宿松县",
count: 1,
industry: {
"生物与新医药-煤炭开采和洗选业": 36,
"电子信息-农业": 36,
航空航天: 36,
},
children: null,
},
},
},
},
},
},
};
// achievement().then((res) => {
// if (200 == res.code) {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
// }
// });
// let echartsDomList = document.querySelectorAll('.echartsDom');
// // 兼容echarts
// echartsDomList.forEach(element => {
@ -545,4 +644,4 @@ function loadMap(mapName, data) {
width: 90px;
}
}
</style>
</style>

View File

@ -42,8 +42,8 @@
<script setup>
import { defineComponent, getCurrentInstance, onMounted, reactive } from "vue";
import echarts from "echarts";
import { demand } from "@/api/website/home/index";
import * as echarts from "echarts";
// import { demand } from "@/api/website/home/index";
const { proxy } = getCurrentInstance();
const loading = shallowRef(true);
@ -200,13 +200,14 @@ const state = reactive({
onMounted(() => {
// 数据接口
demand().then((res) => {
if (200 == res.code) {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
}
});
const res = { code: 200, message: "ok", data: {} };
// demand().then((res) => {
// if (200 == res.code) {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
// }
// });
// let echartsDomList = document.querySelectorAll('.echartsDom');
// // 兼容echarts
// echartsDomList.forEach(element => {
@ -543,4 +544,4 @@ function loadMap(mapName, data) {
width: 90px;
}
}
</style>
</style>

View File

@ -42,8 +42,8 @@
<script setup>
import { defineComponent, getCurrentInstance, onMounted, reactive } from "vue";
import echarts from "echarts";
import { company } from "@/api/website/home/index";
import * as echarts from "echarts";
// import { company } from "@/api/website/home/index";
const { proxy } = getCurrentInstance();
const loading = shallowRef(true);
@ -200,13 +200,189 @@ const state = reactive({
onMounted(() => {
// 数据接口
company().then((res) => {
if (200 == res.code) {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
}
});
const res = {
code: 200,
message: "ok",
data: {
110000: {
code: "110000",
name: "北京市",
count: 1,
industry: { "新能源与节能-可再生清洁能源-风能": 1 },
children: {
110100: {
code: "110100",
name: "市辖区",
count: 1,
industry: { "新能源与节能-可再生清洁能源-风能": 1 },
children: {
110102: {
code: "110102",
name: "西城区",
count: 1,
industry: { "新能源与节能-可再生清洁能源-风能": 1 },
children: null,
},
},
},
},
},
130000: {
code: "130000",
name: "河北省",
count: 1,
industry: { 资源与环境: 1 },
children: {
130300: {
code: "130300",
name: "秦皇岛市",
count: 1,
industry: { 资源与环境: 1 },
children: {
130304: {
code: "130304",
name: "北戴河区",
count: 1,
industry: { 资源与环境: 1 },
children: null,
},
},
},
},
},
220000: {
code: "220000",
name: "吉林省",
count: 1,
industry: { "生物与新医药-煤炭开采和洗选业": 1 },
children: {
220700: {
code: "220700",
name: "松原市",
count: 1,
industry: { "生物与新医药-煤炭开采和洗选业": 1 },
children: {
220771: {
code: "220771",
name: "吉林松原经济开发区",
count: 1,
industry: { "生物与新医药-煤炭开采和洗选业": 1 },
children: null,
},
},
},
},
},
310000: {
code: "310000",
name: "上海市",
count: 1,
industry: { "电子信息-农业": 1, "电子信息-林业": 1 },
children: {
310100: {
code: "310100",
name: "市辖区",
count: 1,
industry: { "电子信息-农业": 1, "电子信息-林业": 1 },
children: {
310101: {
code: "310101",
name: "黄浦区",
count: 1,
industry: { "电子信息-农业": 1, "电子信息-林业": 1 },
children: null,
},
},
},
},
},
340000: {
code: "340000",
name: "安徽省",
count: 4,
industry: {
"生物与新医药-石油和天然气开采业": 1,
"电子信息-农业": 1,
"电子信息-农业-测试名称": 3,
"电子信息-微电子技术-集成电路封装技术": 1,
"电子信息-林业": 1,
资源与环境: 1,
},
children: {
340100: {
code: "340100",
name: "合肥市",
count: 3,
industry: {
"生物与新医药-石油和天然气开采业": 1,
"电子信息-农业-测试名称": 2,
"电子信息-微电子技术-集成电路封装技术": 1,
资源与环境: 1,
},
children: {
340104: {
code: "340104",
name: "蜀山区",
count: 1,
industry: { "电子信息-农业-测试名称": 1 },
children: null,
},
340111: {
code: "340111",
name: "包河区",
count: 1,
industry: {
"电子信息-微电子技术-集成电路封装技术": 1,
资源与环境: 1,
},
children: null,
},
340171: {
code: "340171",
name: "合肥高新技术产业开发区",
count: 1,
industry: {
"生物与新医药-石油和天然气开采业": 1,
"电子信息-农业-测试名称": 1,
},
children: null,
},
},
},
340800: {
code: "340800",
name: "安庆市",
count: 1,
industry: {
"电子信息-农业": 1,
"电子信息-农业-测试名称": 1,
"电子信息-林业": 1,
},
children: {
340826: {
code: "340826",
name: "宿松县",
count: 1,
industry: {
"电子信息-农业": 1,
"电子信息-农业-测试名称": 1,
"电子信息-林业": 1,
},
children: null,
},
},
},
},
},
},
};
// company().then((res) => {
// if (200 == res.code) {
treeData = res.data;
snapTree.value = res.data;
loading.value = false;
// }
// });
// let echartsDomList = document.querySelectorAll('.echartsDom');
// // 兼容echarts
// echartsDomList.forEach(element => {
@ -545,4 +721,4 @@ function loadMap(mapName, data) {
width: 90px;
}
}
</style>
</style>

View File

@ -1,133 +1 @@
<template>
<div class="box">
<div class="wrap">
<div>
<div class="tit">全国服务站点</div>
<div class="content">
<div>
<div
class="item"
v-for="(value, key, index) in state.platformInfo"
:key="index"
>
<div>{{ value.name }}</div>
<p v-for="item in value.children" :key="item.code">
<a :href="item.domain" target="_blank" v-if="item.domain">{{
item.name
}}</a>
</p>
</div>
</div>
</div>
<div class="more" v-if="state.platformInfo.length > 15">查看更多</div>
</div>
</div>
<webFooter style="width: 100%"></webFooter>
</div>
</template>
<script setup lang="ts">
import request from "@/utils/request";
import { onMounted, reactive } from "vue";
import webFooter from "@/components/webFooter/index.vue";
function platform() {
return request({
url: "/v1/sys/platform",
});
}
const state = reactive({
platformInfo: {},
});
function getInfo() {
platform().then((res) => {
console.log(res);
state.platformInfo = res.data;
});
}
getInfo();
</script>
<style lang="scss" scoped>
.box {
height: 100%;
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
.wrap {
width: 100%;
height: 100%;
background-image: url(./img/index8-bg1.png);
background-size: 100% 50%;
background-repeat: no-repeat;
background-position: center bottom;
& > div {
flex: 1;
height: 100%;
width: 1000px;
margin: 0 auto;
padding: 10px 0;
box-sizing: border-box;
display: flex;
display: -webkit-flex;
align-items: center;
justify-content: space-evenly;
flex-direction: column;
}
.tit {
text-align: center;
font-size: 30px;
font-family: Source Han Sans CN;
font-weight: 400;
color: #333333;
}
.content {
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 500;
color: #333333;
display: flex;
display: -webkit-flex;
justify-content: center;
align-items: center;
flex-direction: column;
& > div {
overflow: hidden;
flex: 1;
}
.item {
width: 66px;
float: left;
a {
color: #0054ff;
}
p {
font-size: 14px;
font-family: Source Han Sans CN;
font-weight: 500;
color: #666666;
}
}
}
.more {
width: 150px;
height: 46px;
line-height: 44px;
border: 1px solid #0054ff;
font-size: 16px;
font-family: Source Han Sans CN;
font-weight: 500;
color: #0054ff;
text-align: center;
user-select: none;
cursor: pointer;
&:hover {
opacity: 0.7;
}
}
}
}
</style>
<template></template>

View File

@ -1,26 +1,22 @@
<template>
<div v-loading="loading" class="fullPage" ref="fullPage">
<div class="fullPageContainer" ref="fullPageContainer">
<!-- <div
<div v-loading="loading" class="fullPage" ref="fullPageRef">
<div
class="fullPageContainer"
:data-index="state.fullpage.current"
ref="fullPageContainerRef"
@mousewheel="mouseWheelHandle"
>
<!-- @DOMMouseScroll="mouseWheelHandle" -->
<div
v-for="(item, $index) in state.boxList"
class="section"
:key="$index"
:style="`z-index: ${item.zIndex};`"
>
<component :is="item.comp"></component>
</div> -->
<!-- <div class="section"><index1></index1></div>
<div class="section"><index2 /></div>
<div class="section"><index3 /></div>
<div class="section"><index4 /></div>
<div class="section"><index5 /></div>
<div class="section"><index6 /></div>
<div class="section"><index7 /></div>
<div class="section"><index8 /></div>-->
</div>
</div>
</div>
<!-- <div class="home">
<transition-group
:enter-active-class="state.animate.in"
@ -40,88 +36,7 @@
</template>
<script setup lang="ts">
import { ref } from "vue";
const loading = ref<boolean>(true);
// let state = reactive({
// fullpage: {
// current: 1, // 当前的页面编号
// isScrolling: false, // 是否在滚动,是为了防止滚动多页,需要通过一个变量来控制是否滚动
// deltaY: 0, // 返回鼠标滚轮的垂直滚动量保存的鼠标滚动事件的deleteY,用来判断是往下还是往上滚
// },
// showBox: 0,
// boxList: [
// {
// comp: index1,
// zIndex: 1,
// title: "index1",
// },
// {
// comp: index2,
// zIndex: 1,
// title: "index2",
// },
// {
// comp: index3,
// zIndex: 1,
// title: "index3",
// },
// {
// comp: index4,
// zIndex: 1,
// title: "index4",
// },
// {
// comp: index5,
// zIndex: 1,
// title: "index5",
// },
// {
// comp: index6,
// zIndex: 1,
// title: "index6",
// },
// {
// comp: index7,
// zIndex: 1,
// title: "index7",
// },
// {
// comp: index8,
// zIndex: 1,
// title: "index8",
// },
// ],
// animate: {
// in: "animate__animated animate__fadeInDown",
// out: "animate__animated animate__fadeOutDown",
// },
// });
// const mouseWheelHandle = (event) => {
// // 监听鼠标监听
// // 添加冒泡阻止
// let evt = event || window.event;
// if (evt.stopPropagation) {
// evt.stopPropagation();
// } else {
// evt.returnValue = false;
// }
// if (state.fullpage.isScrolling) {
// // 判断是否可以滚动
// return false;
// }
// let e = event.originalEvent || event;
// state.fullpage.deltaY = e.deltaY || e.detail; // Firefox使用detail
// if (state.fullpage.deltaY > 0) {
// next();
// } else if (state.fullpage.deltaY < 0) {
// pre();
// }
// };
</script>
<!-- <script setup lang="ts">
import { reactive, onMounted, getCurrentInstance, ref } from "vue";
const { proxy } = getCurrentInstance();
import { reactive, onMounted, ref, shallowRef, onUnmounted } from "vue";
import index1 from "./comp/index1.vue";
import index2 from "./comp/index2.vue";
import index3 from "./comp/index3.vue";
@ -131,30 +46,44 @@ import index6 from "./comp/index6.vue";
import index7 from "./comp/index7.vue";
import index8 from "./comp/index8.vue";
const loading = ref(true);
const loading = ref<boolean>(true);
setTimeout(() => {
loading.value = false;
}, 1000);
onMounted(() => {});
function next() {
}, 500);
const fullPageRef = ref();
const fullPageContainerRef = ref();
onMounted(() => {
fullPageContainerRef.value.addEventListener(
"DOMMouseScroll",
mouseWheelHandle
);
});
// onUnmounted(() => {
// fullPageContainerRef.value.clearEventListener(
// "DOMMouseScroll",
// mouseWheelHandle
// );
// console.log("cleard");
// });
const next = () => {
// 往下切换
let len = 8; // 页面的个数
// TODO:
let len = 7; // 页面的个数
if (state.fullpage.current + 1 <= len) {
// 如果当前页面编号+1 小于总个数,则可以执行向下滑动
state.fullpage.current += 1; // 页面+1
move(state.fullpage.current); // 执行切换
}
}
function pre() {
};
const pre = () => {
// 往上切换
if (state.fullpage.current - 1 > 0) {
// 如果当前页面编号-1 大于0则可以执行向下滑动
state.fullpage.current -= 1; // 页面+1
move(state.fullpage.current); // 执行切换
}
}
function move(index) {
};
function move(index: number) {
state.fullpage.isScrolling = true; // 为了防止滚动多页,需要通过一个变量来控制是否滚动
directToMove(index); //执行滚动
setTimeout(() => {
@ -162,12 +91,12 @@ function move(index) {
state.fullpage.isScrolling = false;
}, 1010);
}
function directToMove(index) {
let height = proxy.$refs["fullPage"]["clientHeight"]; //获取屏幕的宽度
let scrollPage = proxy.$refs["fullPageContainer"]; // 获取执行tarnsform的元素
let scrollHeight; // 计算滚动的告诉,是往上滚还往下滚
function directToMove(index: number) {
let height = fullPageRef.value["clientHeight"]; //获取屏幕的宽度
// let scrollPage = proxy.$refs["fullPageContainer"]; // 获取执行tarnsform的元素
let scrollHeight: string; // 计算滚动的告诉,是往上滚还往下滚
scrollHeight = -(index - 1) * height + "px";
scrollPage.style.transform = `translateY(${scrollHeight})`;
fullPageContainerRef.value.style.transform = `translateY(${scrollHeight})`;
state.fullpage.current = index;
}
function mouseWheelHandle(event) {
@ -200,43 +129,43 @@ let state = reactive({
},
showBox: 0,
boxList: [
// {
// comp: shallowRef(index1),
// zIndex: 1,
// title: "index1",
// },
// {
// comp: shallowRef(index2),
// zIndex: 1,
// title: "index2",
// },
{
comp: index1,
zIndex: 1,
title: "index1",
},
{
comp: index2,
zIndex: 1,
title: "index2",
},
{
comp: index3,
comp: shallowRef(index3),
zIndex: 1,
title: "index3",
},
{
comp: index4,
comp: shallowRef(index4),
zIndex: 1,
title: "index4",
},
{
comp: index5,
comp: shallowRef(index5),
zIndex: 1,
title: "index5",
},
{
comp: index6,
comp: shallowRef(index6),
zIndex: 1,
title: "index6",
},
{
comp: index7,
comp: shallowRef(index7),
zIndex: 1,
title: "index7",
},
{
comp: index8,
comp: shallowRef(index8),
zIndex: 1,
title: "index8",
},
@ -246,7 +175,7 @@ let state = reactive({
out: "animate__animated animate__fadeOutDown",
},
});
</script> -->
</script>
<style lang="scss" scoped>
.fullPage {

View File

@ -0,0 +1,7 @@
<template>
创新服务
<WebFooter></WebFooter>
</template>
<script setup name="Innovate">
import WebFooter from "../../../components/webFooter/index.vue";
</script>

View File

@ -41,21 +41,23 @@
</el-input>
</el-form-item>
<el-form-item prop="captcha" v-if="loginForm.mode == 101">
<el-input
v-model="loginForm.captcha"
auto-complete="off"
placeholder="验证码"
style="width: 65%"
@keyup.enter="handleLogin"
>
<template #prefix>
<svg-icon
icon-class="validCode"
class="el-input__icon input-icon"
/>
</template>
</el-input>
<WebGetCode v-model:mobile="loginForm.username" />
<div class="captcha-row">
<el-input
v-model="loginForm.captcha"
auto-complete="off"
placeholder="验证码"
style="width: 65%; align-items: center"
@keyup.enter="handleLogin"
>
<template #prefix>
<svg-icon
icon-class="validCode"
class="el-input__icon input-icon"
/>
</template>
</el-input>
<WebGetCode v-model:mobile="loginForm.username" />
</div>
</el-form-item>
<el-form-item>
<el-checkbox v-model="loginForm.rememberMe">记住账号</el-checkbox>
@ -138,7 +140,7 @@ import { useRouter } from "vue-router";
const router = useRouter();
const userStore = useUserStore();
const { proxy } = getCurrentInstance();
// const { proxy } = getCurrentInstance();
const isLogin = ref(1);
@ -321,6 +323,13 @@ getCookie();
text-align: center;
color: #bfbfbf;
}
.captcha-row {
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
}
.login-code {
width: 30%;
height: 38px;

View File

@ -0,0 +1,6 @@
<template>
<WebFooter></WebFooter>
</template>
<script setup name="Solution">
import WebFooter from "@/components/webFooter/index.vue";
</script>