bug fix and performance improvements

This commit is contained in:
2023-07-19 10:29:12 +08:00
parent 4789db178f
commit 0c439a32e1
14 changed files with 461 additions and 327 deletions

View File

@ -3,26 +3,26 @@
* @type {[{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string}]} * @type {[{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string}]}
*/ */
export const serviceDemandStatusDict = [ export const serviceDemandStatusDict = [
{ {
value: "0", value: "0",
label: "待受理", label: "待受理",
elTagType: "primary", elTagType: "primary",
}, },
{ {
value: "1", value: "1",
label: "已受理", label: "已受理",
elTagType: "success", elTagType: "success",
}, },
{ {
value: "2", value: "2",
label: "已驳回", label: "已驳回",
elTagType: "danger", elTagType: "danger",
}, },
{ {
value: "4", value: "4",
label: "已结束", label: "已结束",
elTagType: "warning", elTagType: "warning",
}, },
]; ];
/** /**
@ -30,112 +30,111 @@ export const serviceDemandStatusDict = [
* @type {[{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string}]} * @type {[{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string},{label: string, value: string, elTagType: string}]}
*/ */
export const technologyDemandStatusDict = [ export const technologyDemandStatusDict = [
{ {
value: "0", value: "0",
label: "待受理", label: "待受理",
elTagType: "primary", elTagType: "primary",
}, },
{ {
value: "1", value: "1",
label: "已发布", label: "已发布",
elTagType: "success", elTagType: "success",
}, },
{ {
value: "2", value: "2",
label: "已驳回", label: "已驳回",
elTagType: "danger", elTagType: "danger",
}, },
{ {
value: "3", value: "3",
label: "草稿箱", label: "草稿箱",
elTagType: "primary", elTagType: "primary",
}, },
{ {
value: "4", value: "4",
label: "已结束", label: "已结束",
elTagType: "warning", elTagType: "warning",
}, },
]; ];
// 1->专利|2->成果|3->服务需求|4->专家|5->科研项目|6->论文 // 1->专利|2->成果|3->服务需求|4->专家|5->科研项目|6->论文
export const seeLogTypeDict = [ export const seeLogTypeDict = [
{ {
value: "1", value: "1",
label: "专利", label: "专利",
elTagType: "primary", elTagType: "primary",
}, },
{ {
value: "2", value: "2",
label: "成果", label: "成果",
elTagType: "success", elTagType: "success",
}, },
{ {
value: "3", value: "3",
label: "服务需求", label: "服务需求",
elTagType: "danger", elTagType: "danger",
}, },
{ {
value: "4", value: "4",
label: "专家", label: "专家",
elTagType: "warning", elTagType: "warning",
}, },
{ {
value: "5", value: "5",
label: "科研项目", label: "科研项目",
elTagType: "warning", elTagType: "warning",
}, },
{ {
value: "6", value: "6",
label: "论文", label: "论文",
elTagType: "warning", elTagType: "warning",
}, },
]; ];
// 订单类型(1创新币充值2活动报名) // 订单类型(1创新币充值2活动报名)
export const orderTypeDict = [ export const orderTypeDict = [
{ {
value: "1", value: "1",
label: "创新币充值", label: "创新币充值",
elTagType: "primary", elTagType: "primary",
}, },
{ {
value: "2", value: "2",
label: "活动报名", label: "活动报名",
elTagType: "success", elTagType: "success",
}, },
]; ];
// 发票申请状态(0->未申请1->已申请2->已处理) // 发票申请状态(0->未申请1->已申请2->已处理)
export const invoiceStatusDict = [ export const invoiceStatusDict = [
{ {
value: "0", value: "0",
label: "未申请", label: "未申请",
elTagType: "warning", elTagType: "warning",
}, },
{ {
value: "1", value: "1",
label: "已申请", label: "已申请",
elTagType: "primary", elTagType: "primary",
}, },
{ {
value: "2", value: "2",
label: "已处理", label: "已处理",
elTagType: "success", elTagType: "success",
}, },
]; ];
// 课题角色1承担单位2参与单位 // 课题角色1承担单位2参与单位
export const subjectRoleDict = [ export const subjectRoleDict = [
{ {
value: "1", value: "1",
label: "承担单位", label: "承担单位",
elTagType: "primary", elTagType: "primary",
} },
, {
{ value: "2",
value: "2", label: "参与单位",
label: "参与单位", elTagType: "success",
elTagType: "success", },
} ];
];

View File

@ -7,14 +7,14 @@
@toggleClick="toggleSideBar" @toggleClick="toggleSideBar"
/> />
<breadcrumb <breadcrumb
v-if="!settingsStore.topNav"
id="breadcrumb-container" id="breadcrumb-container"
class="breadcrumb-container" class="breadcrumb-container"
v-if="!settingsStore.topNav"
/> />
<top-nav <top-nav
v-if="settingsStore.topNav"
id="topmenu-container" id="topmenu-container"
class="topmenu-container" class="topmenu-container"
v-if="settingsStore.topNav"
/> />
<div class="right-menu"> <div class="right-menu">
@ -37,13 +37,15 @@
</template> </template>
<div class="avatar-container"> <div class="avatar-container">
<el-dropdown <el-dropdown
@command="handleCommand"
class="right-menu-item hover-effect" class="right-menu-item hover-effect"
trigger="click" trigger="click"
@command="handleCommand"
> >
<div class="avatar-wrapper"> <div class="avatar-wrapper">
<img :src="userStore.avatar" class="user-avatar" /> <img :src="userStore.avatar" class="user-avatar" />
<el-icon><caret-bottom /></el-icon> <el-icon>
<caret-bottom />
</el-icon>
</div> </div>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
@ -51,12 +53,15 @@
<el-dropdown-item>个人中心</el-dropdown-item> <el-dropdown-item>个人中心</el-dropdown-item>
</router-link> --> </router-link> -->
<router-link to="/identity/index"> <router-link to="/identity/index">
<el-dropdown-item> 切换系统 </el-dropdown-item> <el-dropdown-item> 切换系统</el-dropdown-item>
</router-link> </router-link>
<el-dropdown-item command="setAvatar">
<span> 修改头像 </span>
</el-dropdown-item>
<el-dropdown-item command="setLayout"> <el-dropdown-item command="setLayout">
<span>布局设置</span> <span>布局设置</span>
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item divided command="logout"> <el-dropdown-item command="logout" divided>
<span>退出登录</span> <span>退出登录</span>
</el-dropdown-item> </el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
@ -64,10 +69,12 @@
</el-dropdown> </el-dropdown>
</div> </div>
</div> </div>
<user-avatar ref="avatarRef" />
</div> </div>
</template> </template>
<script setup> <script setup>
import UserAvatar from "@/views/system/user/profile/userAvatar.vue";
import { ElMessageBox } from "element-plus"; import { ElMessageBox } from "element-plus";
import Breadcrumb from "@/components/Breadcrumb"; import Breadcrumb from "@/components/Breadcrumb";
import TopNav from "@/components/TopNav"; import TopNav from "@/components/TopNav";
@ -75,8 +82,6 @@ import Hamburger from "@/components/Hamburger";
import Screenfull from "@/components/Screenfull"; import Screenfull from "@/components/Screenfull";
import SizeSelect from "@/components/SizeSelect"; import SizeSelect from "@/components/SizeSelect";
import HeaderSearch from "@/components/HeaderSearch"; import HeaderSearch from "@/components/HeaderSearch";
import RuoYiGit from "@/components/RuoYi/Git";
import RuoYiDoc from "@/components/RuoYi/Doc";
import useAppStore from "@/store/modules/app"; import useAppStore from "@/store/modules/app";
import useUserStore from "@/store/modules/user"; import useUserStore from "@/store/modules/user";
import useSettingsStore from "@/store/modules/settings"; import useSettingsStore from "@/store/modules/settings";
@ -84,6 +89,7 @@ import useSettingsStore from "@/store/modules/settings";
const appStore = useAppStore(); const appStore = useAppStore();
const userStore = useUserStore(); const userStore = useUserStore();
const settingsStore = useSettingsStore(); const settingsStore = useSettingsStore();
const avatarRef = ref(null);
function toggleSideBar() { function toggleSideBar() {
appStore.toggleSideBar(); appStore.toggleSideBar();
@ -97,6 +103,9 @@ function handleCommand(command) {
case "logout": case "logout":
logout(); logout();
break; break;
case "setAvatar":
avatarRef.value.editCropper();
break;
default: default:
break; break;
} }
@ -117,6 +126,7 @@ function logout() {
} }
const emits = defineEmits(["setLayout"]); const emits = defineEmits(["setLayout"]);
function setLayout() { function setLayout() {
emits("setLayout"); emits("setLayout");
} }
@ -210,4 +220,8 @@ function setLayout() {
} }
} }
} }
:deep(.user-info-head) {
visibility: hidden;
}
</style> </style>

View File

@ -783,6 +783,7 @@ export const researchRoutes = [
component: () => component: () =>
import("@/views/admin/research/research/service-demand/index.vue"), import("@/views/admin/research/research/service-demand/index.vue"),
name: "ServiceDemand", name: "ServiceDemand",
hidden: true,
meta: { title: "服务需求列表", icon: "list" }, meta: { title: "服务需求列表", icon: "list" },
}, },
{ {

View File

@ -1,5 +1,5 @@
<script setup> <script setup>
import {reactive, ref, toRefs} from "vue"; import { reactive, ref, toRefs } from "vue";
const data = reactive({ const data = reactive({
queryParams: { queryParams: {
@ -7,7 +7,7 @@ const data = reactive({
pageSize: 10, pageSize: 10,
}, },
}); });
const {queryParams} = toRefs(data); const { queryParams } = toRefs(data);
const tableData = ref([]); const tableData = ref([]);
const queryRef = ref(null); const queryRef = ref(null);
@ -15,8 +15,7 @@ const queryRef = ref(null);
* 删除指定行 * 删除指定行
* @param row * @param row
*/ */
const deleteRecord = (row) => { const deleteRecord = (row) => {};
};
// 重置查询条件 resetQuery // 重置查询条件 resetQuery
const resetQuery = () => { const resetQuery = () => {
@ -34,12 +33,12 @@ const handleQuery = () => {
<!-- 时间段查询--> <!-- 时间段查询-->
<el-form-item label="时间段"> <el-form-item label="时间段">
<el-date-picker <el-date-picker
v-model="queryParams.timeRange" v-model="queryParams.timeRange"
end-placeholder="结束日期" end-placeholder="结束日期"
range-separator="" range-separator=""
start-placeholder="开始日期" start-placeholder="开始日期"
type="datetimerange" type="datetimerange"
value-format="YYYY-MM-dd" value-format="YYYY-MM-dd"
></el-date-picker> ></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -50,8 +49,8 @@ const handleQuery = () => {
<!-- el-radio-group 状态切换, 已审批和待审批 --> <!-- el-radio-group 状态切换, 已审批和待审批 -->
<el-radio-group v-model="queryParams.status" size="small" style="width: 100%"> <el-radio-group v-model="queryParams.status" size="small" style="width: 100%">
<el-radio label="已审批" value="1"/> <el-radio label="已审批" value="1" />
<el-radio label="待审批" value="2"/> <el-radio label="待审批" value="2" />
</el-radio-group> </el-radio-group>
<!-- 用h2 展示提现金额,加粗字体--> <!-- 用h2 展示提现金额,加粗字体-->
<h2 style="font-weight: bold">提现金额 : {{ 312312 }}¥</h2> <h2 style="font-weight: bold">提现金额 : {{ 312312 }}¥</h2>
@ -59,22 +58,22 @@ const handleQuery = () => {
<!--提现记录表格 element-plus --> <!--提现记录表格 element-plus -->
<el-table :data="tableData" class="withdraw-table"> <el-table :data="tableData" class="withdraw-table">
<el-table-column <el-table-column
label="提现金额" label="提现金额"
prop="amount" prop="amount"
width="150" width="150"
></el-table-column> ></el-table-column>
<el-table-column label="提现类型" prop="type" width="150"></el-table-column> <el-table-column label="提现类型" prop="type" width="150"></el-table-column>
<el-table-column <el-table-column
label="提现状态" label="提现状态"
prop="status" prop="status"
width="150" width="150"
></el-table-column> ></el-table-column>
<el-table-column label="提现时间" prop="time" width="150"></el-table-column> <el-table-column label="提现时间" prop="time" width="150"></el-table-column>
<el-table-column label="操作" prop="action" width="150"> <el-table-column label="操作" prop="action" width="150">
<template #default="{ row }"> <template #default="{ row }">
<!--删除--> <!--删除-->
<el-button size="small" type="text" @click="deleteRecord(row)" <el-button size="small" type="text" @click="deleteRecord(row)"
>删除 >删除
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>

View File

@ -12,10 +12,7 @@ const active = ref(0); /*active step index*/
const updateStatusList = ref([]); /*update status list*/ const updateStatusList = ref([]); /*update status list*/
const route = useRoute(); const route = useRoute();
const router = useRouter(); const router = useRouter();
const cooperationMemoUrl = ref(""); // 合作备忘录
const technicalSolutionUrl = ref(""); // 客户确认技术解决方案
const contractUrl = ref(""); // 签署服务合同(合同额)
const conclusionUrl = ref(""); // 结题
//未结题原因描述 //未结题原因描述
const reason = ref(""); const reason = ref("");
@ -56,7 +53,6 @@ const getUpdateStatus = async (demandId) => {
const reverseIndex = updateStatusList.value.findLastIndex( const reverseIndex = updateStatusList.value.findLastIndex(
(item) => item.status === "1" (item) => item.status === "1"
); );
console.log(updateStatusList.value.length, reverseIndex);
active.value = reverseIndex === -1 ? 0 : reverseIndex; active.value = reverseIndex === -1 ? 0 : reverseIndex;
}; };
@ -76,13 +72,35 @@ const close = () => {
router.go(-1); router.go(-1);
}; };
const submit = () => { const submit = () => {
console.log(updateStatusList.value[active.value]); // 当前步骤的表单
const form = updateStatusList.value[active.value];
console.log(active.value);
console.log(form);
// 当active.value !== 4 时, files 字段不能为空
// 当 active.value ===2 或 3 时remark 字段不能为空
if (active.value !== 4 && !form.files) {
ElMessage.error("请上传文件");
return;
}
if ((active.value === 2 || active.value === 3) && !form.remark) {
ElMessage.error("请填写金额");
return;
}
if (active.value === 4 && !form.remark) {
ElMessage.error("请填写未结题原因");
return;
}
updateDemandProcess({ updateDemandProcess({
...updateStatusList.value[active.value], ...updateStatusList.value[active.value],
status: "1", status: "1",
}) })
.then((resp) => { .then((resp) => {
ElMessage.success("操作成功"); ElMessage.success("操作成功");
// if (active.value <= 3) {
// active.value += 1;
// }
}) })
.catch(() => {}) .catch(() => {})
.finally(() => { .finally(() => {
@ -178,8 +196,39 @@ if (route.query.id) {
" "
type="primary" type="primary"
@click="submit" @click="submit"
>提交 >保存当前步骤
</el-button> </el-button>
<template v-if="updateStatusList[active]?.status === '1'">
<el-button
v-if="active <= 1"
@click="
() => {
active += 1;
}
"
>
下一步
</el-button>
<el-button
v-if="active === 2"
@click="
() => {
active = 3;
}
"
>结题
</el-button>
<el-button
v-if="active === 2"
@click="
() => {
active = 4;
}
"
>未结题
</el-button>
</template>
</div> </div>
</div> </div>
</div> </div>

View File

@ -31,9 +31,9 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<el-row :gutter="10" class="mb8"> <el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">--> <!-- <el-col :span="1.5">-->
<!-- <el-button icon="plus" size="small" type="primary">新增</el-button>--> <!-- <el-button icon="plus" size="small" type="primary">新增</el-button>-->
<!-- </el-col>--> <!-- </el-col>-->
<right-toolbar <right-toolbar
v-model:showSearch="showSearch" v-model:showSearch="showSearch"
@queryTable="getList" @queryTable="getList"

View File

@ -1,32 +1,32 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form <el-form
v-show="showSearch" v-show="showSearch"
ref="queryRef" ref="queryRef"
:inline="true" :inline="true"
:model="queryParams" :model="queryParams"
@submit.prevent @submit.prevent
> >
<el-form-item label="专利名称" prop="patentName"> <el-form-item label="专利名称" prop="patentName">
<el-input <el-input
v-model="queryParams.patentName" v-model="queryParams.patentName"
clearable clearable
placeholder="请输入专利名称" placeholder="请输入专利名称"
size="small" size="small"
style="width: 240px" style="width: 240px"
@keyup.enter="handleQuery" @keyup.enter="handleQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<el-button <el-button
icon="Search" icon="Search"
size="small" size="small"
type="primary" type="primary"
@click="handleQuery" @click="handleQuery"
>搜索 >搜索
</el-button> </el-button>
<el-button icon="Refresh" size="small" @click="resetQuery" <el-button icon="Refresh" size="small" @click="resetQuery"
>重置 >重置
</el-button> </el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -52,35 +52,35 @@
<!-- </router-link>--> <!-- </router-link>-->
<!-- </el-col>--> <!-- </el-col>-->
<right-toolbar <right-toolbar
v-model:showSearch="showSearch" v-model:showSearch="showSearch"
@queryTable="getList" @queryTable="getList"
></right-toolbar> ></right-toolbar>
</el-row> </el-row>
<!-- 表格数据 --> <!-- 表格数据 -->
<el-table v-loading="loading" :data="dataList"> <el-table v-loading="loading" :data="dataList">
<el-table-column label="数据编号" prop="id"/> <el-table-column label="数据编号" prop="id" />
<el-table-column <el-table-column
:show-overflow-tooltip="true" :show-overflow-tooltip="true"
label="专利名称" label="专利名称"
prop="title" prop="title"
/> />
<el-table-column <el-table-column
:show-overflow-tooltip="true" :show-overflow-tooltip="true"
label="申请号" label="申请号"
prop="applyCode" prop="applyCode"
/> />
<el-table-column label="发明人" prop="inventor"/> <el-table-column label="发明人" prop="inventor" />
<el-table-column label="申请(专利权)人" prop="applyName"/> <el-table-column label="申请(专利权)人" prop="applyName" />
<el-table-column align="center" label="申请日期" prop="applyAt"> <el-table-column align="center" label="申请日期" prop="applyAt">
<template #default="{ row }"> <template #default="{ row }">
<span>{{ dayjs(row.applyAt).format("YYYY-MM-DD") }}</span> <span>{{ dayjs(row.applyAt).format("YYYY-MM-DD") }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
align="center" align="center"
class-name="small-padding fixed-width" class-name="small-padding fixed-width"
label="操作" label="操作"
> >
<template #default="{ row }"> <template #default="{ row }">
<!-- <el-button--> <!-- <el-button-->
@ -92,22 +92,22 @@
<!-- </el-button--> <!-- </el-button-->
<!-- >--> <!-- >-->
<el-button <el-button
icon="Delete" icon="Delete"
size="small" size="small"
type="text" type="text"
@click="handleDelete(row.id)" @click="handleDelete(row.id)"
>删除 >删除
</el-button> </el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination <pagination
v-show="total > 0" v-show="total > 0"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.pageSize"
v-model:page="queryParams.pageNum" v-model:page="queryParams.pageNum"
:total="total" :total="total"
@pagination="getList" @pagination="getList"
/> />
<!-- &lt;!&ndash; 添加或修改数据配置对话框 &ndash;&gt;--> <!-- &lt;!&ndash; 添加或修改数据配置对话框 &ndash;&gt;-->
@ -229,13 +229,13 @@ import {
labPatentList, labPatentList,
} from "@/api/admin/laboratory/patent"; } from "@/api/admin/laboratory/patent";
import dayjs from "dayjs"; import dayjs from "dayjs";
import {ElMessage, ElMessageBox} from "element-plus"; import { ElMessage, ElMessageBox } from "element-plus";
import {useRouter} from "vue-router"; import { useRouter } from "vue-router";
import {getCurrentInstance, reactive, ref, toRefs} from "vue"; import { getCurrentInstance, reactive, ref, toRefs } from "vue";
const router = useRouter(); const router = useRouter();
const {proxy} = getCurrentInstance(); const { proxy } = getCurrentInstance();
const dataList = ref([]); const dataList = ref([]);
const open = ref(false); const open = ref(false);
@ -248,7 +248,7 @@ const data = reactive({
queryParams: { queryParams: {
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
patentName: undefined patentName: undefined,
}, },
// form: {}, // form: {},
// rules: { // rules: {
@ -280,7 +280,7 @@ const data = reactive({
// }, // },
}); });
const {queryParams} = toRefs(data); const { queryParams } = toRefs(data);
const queryRef = ref(); const queryRef = ref();
// const patentRef = ref(); // const patentRef = ref();
@ -290,14 +290,14 @@ const queryRef = ref();
const getList = async () => { const getList = async () => {
loading.value = true; loading.value = true;
labPatentList(queryParams.value) labPatentList(queryParams.value)
.then((resp) => { .then((resp) => {
dataList.value = resp.rows; dataList.value = resp.rows;
total.value = resp.total; total.value = resp.total;
loading.value = false; loading.value = false;
}) })
.catch(() => { .catch(() => {
loading.value = false; loading.value = false;
}); });
}; };
/** 搜索按钮操作 */ /** 搜索按钮操作 */
@ -315,16 +315,16 @@ function resetQuery() {
/** 删除按钮操作 */ /** 删除按钮操作 */
function handleDelete(id) { function handleDelete(id) {
ElMessageBox.confirm('是否确认删除数据编号为"' + id + '"的专利项?') ElMessageBox.confirm('是否确认删除数据编号为"' + id + '"的专利项?')
.then(function () { .then(function () {
return deleteLabPatentByIds(id); return deleteLabPatentByIds(id);
}) })
.then(() => { .then(() => {
getList(); getList();
ElMessage.success("删除成功"); ElMessage.success("删除成功");
}) })
.catch((err) => { .catch((err) => {
console.log(err); console.log(err);
}); });
} }
/** 重置新增的表单以及其他数据 */ /** 重置新增的表单以及其他数据 */

View File

@ -46,10 +46,10 @@
prop="title" prop="title"
/> />
<el-table-column :show-overflow-tooltip="true" label="类型" prop="kind" /> <el-table-column :show-overflow-tooltip="true" label="类型" prop="kind" />
<!-- <el-table-column label="所属专家" prop="inventor" />--> <!-- <el-table-column label="所属专家" prop="inventor" />-->
<el-table-column label="课题角色" > <el-table-column label="课题角色">
<template #default="{ row }"> <template #default="{ row }">
{{ subjectRoleDict.find(item => item.value === row.role)?.label}} {{ subjectRoleDict.find((item) => item.value === row.role)?.label }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="课题负责人" prop="director" /> <el-table-column label="课题负责人" prop="director" />
@ -64,13 +64,13 @@
label="操作" label="操作"
> >
<template #default="{ row }"> <template #default="{ row }">
<!-- <el-button--> <!-- <el-button-->
<!-- icon="download"--> <!-- icon="download"-->
<!-- size="small"--> <!-- size="small"-->
<!-- type="text"--> <!-- type="text"-->
<!-- @click="handleTakeOff(row.id)"--> <!-- @click="handleTakeOff(row.id)"-->
<!-- >下架--> <!-- >下架-->
<!-- </el-button>--> <!-- </el-button>-->
<el-button <el-button
icon="Delete" icon="Delete"
size="small" size="small"
@ -101,7 +101,7 @@ import {
deleteTechnologyProject, deleteTechnologyProject,
technologyProjectList, technologyProjectList,
} from "@/api/admin/laboratory/research-project"; } from "@/api/admin/laboratory/research-project";
import {subjectRoleDict} from "../../../../../constant/dict"; import { subjectRoleDict } from "../../../../../constant/dict";
const router = useRouter(); const router = useRouter();

View File

@ -53,7 +53,7 @@ getList();
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form ref="queryRef" class="mb8" :model="queryParams" inline> <el-form ref="queryRef" :model="queryParams" class="mb8" inline>
<!-- 企业名称--> <!-- 企业名称-->
<el-form-item label="企业名称" prop="name"> <el-form-item label="企业名称" prop="name">
<el-input <el-input
@ -79,8 +79,6 @@ getList();
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="名称" prop="typeName"></el-table-column> <el-table-column label="名称" prop="typeName"></el-table-column>
<el-table-column label="联系人" prop="nickname"></el-table-column>
<el-table-column label="手机" prop="phone"></el-table-column>
<el-table-column label="浏览次数" prop="seeCount"></el-table-column> <el-table-column label="浏览次数" prop="seeCount"></el-table-column>
<el-table-column label="浏览时间" prop="updateTime"></el-table-column> <el-table-column label="浏览时间" prop="updateTime"></el-table-column>
</el-table> </el-table>

View File

@ -39,17 +39,25 @@
<!-- 表格数据 --> <!-- 表格数据 -->
<el-table v-loading="loading" :data="dataList"> <el-table v-loading="loading" :data="dataList">
<el-table-column align="center" label="数据编号" prop="id" /> <el-table-column align="center" label="数据编号" prop="id" />
<el-table-column align="center" <el-table-column
:show-overflow-tooltip="true" align="center"
:show-overflow-tooltip="true"
label="科研项目名称" label="科研项目名称"
prop="title" prop="title"
/> />
<el-table-column align="center" :show-overflow-tooltip="true" label="类型" prop="kind" /> <el-table-column
<!-- <el-table-column label="所属专家" prop="inventor" />--> align="center"
<el-table-column align="center" label="课题角色" > :show-overflow-tooltip="true"
label="类型"
prop="kind"
/>
<!-- <el-table-column label="所属专家" prop="inventor" />-->
<el-table-column align="center" label="课题角色">
<template #default="{ row }"> <template #default="{ row }">
<span>{{ subjectRoleDict.find(item => item.value === row.role)?.label }}</span> <span>{{
subjectRoleDict.find((item) => item.value === row.role)?.label
}}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" label="课题负责人" prop="director" /> <el-table-column align="center" label="课题负责人" prop="director" />
@ -64,13 +72,13 @@
label="操作" label="操作"
> >
<template #default="{ row }"> <template #default="{ row }">
<!-- <el-button--> <!-- <el-button-->
<!-- icon="download"--> <!-- icon="download"-->
<!-- size="small"--> <!-- size="small"-->
<!-- type="text"--> <!-- type="text"-->
<!-- @click="handleTakeOff(row.id)"--> <!-- @click="handleTakeOff(row.id)"-->
<!-- >下架--> <!-- >下架-->
<!-- </el-button>--> <!-- </el-button>-->
<el-button <el-button
icon="Delete" icon="Delete"
size="small" size="small"
@ -101,7 +109,7 @@ import {
deleteTechnologyProject, deleteTechnologyProject,
technologyProjectList, technologyProjectList,
} from "@/api/admin/research/research-project"; } from "@/api/admin/research/research-project";
import {subjectRoleDict} from "@/constant/dict"; import { subjectRoleDict } from "@/constant/dict";
const router = useRouter(); const router = useRouter();

View File

@ -16,7 +16,8 @@
</el-col> </el-col>
</el-row> </el-row>
<el-row v-if="isAdd"> <!--FIXME:-->
<el-row v-if="isAdd && false">
<el-col :span="24"> <el-col :span="24">
<el-form-item label="组织机构代码:" prop="code"> <el-form-item label="组织机构代码:" prop="code">
<el-row justify="space-between" type="flex"> <el-row justify="space-between" type="flex">
@ -88,6 +89,56 @@
placeholder="请输入研究方向" placeholder="请输入研究方向"
title="研究方向" title="研究方向"
/> />
<el-row>
<el-col :span="24">
<el-form-item label="主要技术应用场景" prop="primaryTechnology">
<el-input
v-model="modelValue.primaryTechnology"
:autosize="{ minRows: 4 }"
placeholder="请输入主要技术应用场景"
type="textarea"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="科研项目" prop="researchProject">
<el-input
v-model="modelValue.researchProject"
:autosize="{ minRows: 4 }"
placeholder="请输入科研项目"
type="textarea"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="代表性科技成果" prop="achievement">
<el-input
v-model="modelValue.achievement"
:autosize="{ minRows: 4 }"
placeholder="请输入代表性科技成果"
type="textarea"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item :label="t('webContact.phone')" prop="phone">
<el-input
v-model="modelValue.phone"
:maxlength="11"
oninput="value = value.replace(/\D+/, '')"
placeholder="请输入联系电话"
></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row> <el-row>
<el-col :span="24"> <el-col :span="24">
<el-form-item label="实验室简介" prop="introduction"> <el-form-item label="实验室简介" prop="introduction">

View File

@ -1,30 +1,30 @@
<template> <template>
<div class="user-info-head" @click="editCropper()"> <div class="user-info-head" @click="editCropper()">
<img :src="options.img" title="点击上传头像" class="img-circle img-lg" /> <img :src="options.img" class="img-circle img-lg" title="点击上传头像" />
</div> </div>
<el-dialog <el-dialog
:title="title"
v-model="open" v-model="open"
width="800px" :title="title"
append-to-body append-to-body
@opened="modalOpened" width="800px"
@close="closeDialog" @close="closeDialog"
@opened="modalOpened"
> >
<el-row> <el-row>
<el-col :xs="24" :md="12" :style="{ height: '350px' }"> <el-col :md="12" :style="{ height: '350px' }" :xs="24">
<vue-cropper <vue-cropper
v-if="visible"
ref="cropper" ref="cropper"
:autoCrop="options.autoCrop"
:autoCropHeight="options.autoCropHeight"
:autoCropWidth="options.autoCropWidth"
:fixedBox="options.fixedBox"
:img="options.img" :img="options.img"
:info="true" :info="true"
:autoCrop="options.autoCrop"
:autoCropWidth="options.autoCropWidth"
:autoCropHeight="options.autoCropHeight"
:fixedBox="options.fixedBox"
@realTime="realTime" @realTime="realTime"
v-if="visible"
/> />
</el-col> </el-col>
<el-col :xs="24" :md="12" :style="{ height: '350px' }"> <el-col :md="12" :style="{ height: '350px' }" :xs="24">
<div class="avatar-upload-preview"> <div class="avatar-upload-preview">
<img :src="options.previews.url" :style="options.previews.img" /> <img :src="options.previews.url" :style="options.previews.img" />
</div> </div>
@ -34,14 +34,16 @@
<el-row> <el-row>
<el-col :lg="2" :md="2"> <el-col :lg="2" :md="2">
<el-upload <el-upload
action="#" :before-upload="beforeUpload"
:http-request="requestUpload" :http-request="requestUpload"
:show-file-list="false" :show-file-list="false"
:before-upload="beforeUpload" action="#"
> >
<el-button> <el-button>
选择 选择
<el-icon class="el-icon--right"><Upload /></el-icon> <el-icon class="el-icon--right">
<Upload />
</el-icon>
</el-button> </el-button>
</el-upload> </el-upload>
</el-col> </el-col>
@ -91,25 +93,31 @@ const options = reactive({
function editCropper() { function editCropper() {
open.value = true; open.value = true;
} }
/** 打开弹出层结束时的回调 */ /** 打开弹出层结束时的回调 */
function modalOpened() { function modalOpened() {
visible.value = true; visible.value = true;
} }
/** 覆盖默认上传行为 */ /** 覆盖默认上传行为 */
function requestUpload() {} function requestUpload() {}
/** 向左旋转 */ /** 向左旋转 */
function rotateLeft() { function rotateLeft() {
proxy.$refs.cropper.rotateLeft(); proxy.$refs.cropper.rotateLeft();
} }
/** 向右旋转 */ /** 向右旋转 */
function rotateRight() { function rotateRight() {
proxy.$refs.cropper.rotateRight(); proxy.$refs.cropper.rotateRight();
} }
/** 图片缩放 */ /** 图片缩放 */
function changeScale(num) { function changeScale(num) {
num = num || 1; num = num || 1;
proxy.$refs.cropper.changeScale(num); proxy.$refs.cropper.changeScale(num);
} }
/** 上传预处理 */ /** 上传预处理 */
function beforeUpload(file) { function beforeUpload(file) {
if (file.type.indexOf("image/") == -1) { if (file.type.indexOf("image/") == -1) {
@ -124,6 +132,7 @@ function beforeUpload(file) {
}; };
} }
} }
/** 上传图片 */ /** 上传图片 */
function uploadImg() { function uploadImg() {
proxy.$refs.cropper.getCropBlob((data) => { proxy.$refs.cropper.getCropBlob((data) => {
@ -138,15 +147,21 @@ function uploadImg() {
}); });
}); });
} }
/** 实时预览 */ /** 实时预览 */
function realTime(data) { function realTime(data) {
options.previews = data; options.previews = data;
} }
/** 关闭窗口 */ /** 关闭窗口 */
function closeDialog() { function closeDialog() {
options.img = userStore.avatar; options.img = userStore.avatar;
options.visible = false; options.visible = false;
} }
defineExpose({
editCropper,
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@ -388,7 +388,7 @@ function loadMap(mapName, data) {
], ],
// color: '#fff', // color: '#fff',
textStyle: { textStyle: {
color: "#333333", color: "#fff",
}, },
visibility: "off", visibility: "off",
}, },
@ -454,6 +454,7 @@ function loadMap(mapName, data) {
width: 100%; width: 100%;
height: 100%; height: 100%;
position: relative; position: relative;
background: linear-gradient(0deg, #010101, #041744);
.tit { .tit {
position: absolute; position: absolute;
top: 75px; top: 75px;
@ -462,13 +463,13 @@ function loadMap(mapName, data) {
font-size: 36px; font-size: 36px;
font-family: Source Han Sans CN; font-family: Source Han Sans CN;
font-weight: 300; font-weight: 300;
color: #333333; color: #ffffff;
} }
} }
.map { .map {
width: 100%; width: 100%;
height: 100%; height: 100%;
// background-image: url(./img/lightEffect.png); background-image: url(./img/lightEffect.png);
background-size: 644px 272px; background-size: 644px 272px;
background-repeat: no-repeat; background-repeat: no-repeat;
background-position: center top; background-position: center top;
@ -511,18 +512,18 @@ function loadMap(mapName, data) {
min-width: 200px; min-width: 200px;
max-height: 256px; max-height: 256px;
// overflow: hidden; // overflow: hidden;
border: 1px solid #dcdcdc; border: 1px solid #0054ff;
color: #666666; color: rgba(161, 192, 255, 1);
& > div { & > div {
display: flex; display: flex;
} }
.head { .head {
border-bottom: 1px solid #dcdcdc; border-bottom: 1px solid #0054ff;
color: #333333; color: #ffffff;
} }
.a { .a {
flex: 1; flex: 1;
border-right: 1px solid #dcdcdc; border-right: 1px solid #0054ff;
text-align: center; text-align: center;
line-height: 42px; line-height: 42px;
overflow: hidden; overflow: hidden;

View File

@ -2,27 +2,27 @@
<div v-loading="loading" class="small"> <div v-loading="loading" class="small">
<div class="_title"> <div class="_title">
<div <div
v-if="!state.banner" v-if="!state.banner"
style="height: 394px; background-color: #108de9" style="height: 394px; background-color: #108de9"
></div> ></div>
<div v-else style="height: 394px"> <div v-else style="height: 394px">
<img <img
:src="state.banner" :src="state.banner"
alt="banner" alt="banner"
style="width: 100%; height: 100%" style="width: 100%; height: 100%"
/> />
</div> </div>
<div <div
v-if="state.caseList.length" v-if="state.caseList.length"
:class="isFixed ? '_fixed' : ''" :class="isFixed ? '_fixed' : ''"
class="_li" class="_li"
> >
<ul class="conter1000"> <ul class="conter1000">
<li <li
v-for="(item, index) in state.caseList" v-for="(item, index) in state.caseList"
:key="item.id" :key="item.id"
:class="activeId == item.id ? '_active' : ''" :class="activeId == item.id ? '_active' : ''"
@click="setScrollTop(item.id, index)" @click="setScrollTop(item.id, index)"
> >
{{ item.title }} {{ item.title }}
</li> </li>
@ -32,22 +32,22 @@
</div> </div>
<div v-show="!isShowMore" class="box"> <div v-show="!isShowMore" class="box">
<div <div
v-for="(item, index) in state.caseList" v-for="(item, index) in state.caseList"
:key="index" :key="index"
:ref="setItemRef" :ref="setItemRef"
:data-id="item.id" :data-id="item.id"
class="_item" class="_item"
> >
<h3 class="_tit text-center" style="font-size: 24px; color: #333333"> <h3 class="_tit text-center" style="font-size: 24px; color: #333333">
{{ item.title }} {{ item.title }}
</h3> </h3>
<div class="_info conter1000"> <div class="_info conter1000">
<div v-if="isOddEvenNumber(index)" class="_r"> <div v-if="isOddEvenNumber(index)" class="_r">
<img :src="item.image" alt srcset/> <img :src="item.image" alt srcset />
</div> </div>
<div <div
:class="isOddEvenNumber(index) ? '_paddingl' : '_paddingr'" :class="isOddEvenNumber(index) ? '_paddingl' : '_paddingr'"
class="_l" class="_l"
> >
<h3 :class="isOddEvenNumber(index) ? 'text-right' : ''"> <h3 :class="isOddEvenNumber(index) ? 'text-right' : ''">
{{ item.title }} {{ item.title }}
@ -56,20 +56,20 @@
<p>{{ item.description }}</p> <p>{{ item.description }}</p>
</div> </div>
<div v-if="!isOddEvenNumber(index)" class="_r"> <div v-if="!isOddEvenNumber(index)" class="_r">
<img :src="item.image" alt srcset/> <img :src="item.image" alt srcset />
</div> </div>
</div> </div>
<div class="_list conter1400"> <div class="_list conter1400">
<ul> <ul>
<li <li
v-for="child in item.children.slice(0, 2)" v-for="child in item.children.slice(0, 2)"
:key="child.id" :key="child.id"
@click="handlePath(child.id)" @click="handlePath(child.id)"
> >
<el-image <el-image
:src="child.image" :src="child.image"
fit="cover" fit="cover"
style="width: 100%; height: 135px" style="width: 100%; height: 135px"
></el-image> ></el-image>
<div class="_head text_hidden">{{ child.title }}</div> <div class="_head text_hidden">{{ child.title }}</div>
<div class="_detail text_hidden">{{ child.description }}</div> <div class="_detail text_hidden">{{ child.description }}</div>
@ -77,35 +77,34 @@
</ul> </ul>
<div class="_liBtn text-right"> <div class="_liBtn text-right">
<el-button class="x_btns" @click="handleShowMore(item)" <el-button class="x_btns" @click="handleShowMore(item)"
>查看更多 >查看更多
</el-button </el-button>
>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<seeMore <seeMore
v-if="isShowMore" v-if="isShowMore"
v-model:isShowMore="isShowMore" v-model:isShowMore="isShowMore"
v-model:oneLevelTitle="oneLevelTitle" v-model:oneLevelTitle="oneLevelTitle"
:data="moreData" :data="moreData"
></seeMore> ></seeMore>
<webFooter></webFooter> <webFooter></webFooter>
</div> </div>
</template> </template>
<script setup> <script setup>
import {nextTick, onMounted, reactive} from "vue"; import { nextTick, onMounted, reactive } from "vue";
import seeMore from "./components/seeMore.vue"; import seeMore from "./components/seeMore.vue";
import webFooter from "@/components/webFooter/index.vue"; import webFooter from "@/components/webFooter/index.vue";
import {banner} from "@/api/website/home/index"; import { banner } from "@/api/website/home/index";
import {useRoute, useRouter} from "vue-router"; import { useRoute, useRouter } from "vue-router";
import {getCase} from "@/api/website/solution"; import { getCase } from "@/api/website/solution";
// import { getCategory } from "../../../api/website/solution"; // import { getCategory } from "../../../api/website/solution";
const router = useRouter(); const router = useRouter();
function handlePath(id) { function handlePath(id) {
let routeData = router.resolve({path: `/solution/detail/${id}/`}); let routeData = router.resolve({ path: `/solution/detail/${id}/` });
window.open(routeData.href, "_blank"); window.open(routeData.href, "_blank");
} }
@ -139,7 +138,6 @@ watch(route, () => {
initData(); initData();
}); });
onMounted(() => { onMounted(() => {
initData(); initData();
}); });
@ -151,20 +149,21 @@ async function initData() {
let mode = route.params.mode; let mode = route.params.mode;
// let key = keyDict[name]; // let key = keyDict[name];
mode && getCase({mode}).then((res) => { mode &&
state.caseList = res.data; getCase({ mode }).then((res) => {
initScroll(); state.caseList = res.data;
// loading.value = false; initScroll();
}); // loading.value = false;
});
loading.value = true; loading.value = true;
banner({locals: `解决方案>${name}`}) banner({ locals: `解决方案>${name}` })
.then((resp) => { .then((resp) => {
state.banner = resp.data[0].images; state.banner = resp.data[0].images;
loading.value = false; loading.value = false;
}) })
.catch(() => { .catch(() => {
loading.value = false; loading.value = false;
}); });
} }
function initScroll() { function initScroll() {
@ -190,15 +189,15 @@ function initScroll() {
function getScroll() { function getScroll() {
return { return {
left: left:
window.pageXOffset || window.pageXOffset ||
document.documentElement.scrollLeft || document.documentElement.scrollLeft ||
document.body.scrollLeft || document.body.scrollLeft ||
0, 0,
top: top:
window.pageYOffset || window.pageYOffset ||
document.documentElement.scrollTop || document.documentElement.scrollTop ||
document.body.scrollTop || document.body.scrollTop ||
0, 0,
}; };
} }