|
@@ -1,38 +1,86 @@
|
|
|
<template>
|
|
<template>
|
|
|
<div class="home">
|
|
<div class="home">
|
|
|
<div class="search-wrap">
|
|
<div class="search-wrap">
|
|
|
- <van-search placeholder="请输入仪器名称" v-model="state.queryForm.instName" :clearabled="true"
|
|
|
|
|
- style="padding: 0;flex: 1;margin-right: 10px;"></van-search>
|
|
|
|
|
- <van-button type="primary" style="width: 60px" shape="circle" size="small" @click="onSearch">
|
|
|
|
|
|
|
+ <van-search
|
|
|
|
|
+ placeholder="请输入仪器名称"
|
|
|
|
|
+ v-model="state.queryForm.instName"
|
|
|
|
|
+ :clearabled="true"
|
|
|
|
|
+ style="padding: 0; flex: 1; margin-right: 10px"
|
|
|
|
|
+ ></van-search>
|
|
|
|
|
+ <van-button
|
|
|
|
|
+ type="primary"
|
|
|
|
|
+ style="width: 60px"
|
|
|
|
|
+ shape="circle"
|
|
|
|
|
+ size="small"
|
|
|
|
|
+ @click="onSearch"
|
|
|
|
|
+ >
|
|
|
搜索
|
|
搜索
|
|
|
</van-button>
|
|
</van-button>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="inst-list">
|
|
<div class="inst-list">
|
|
|
- <van-empty v-if="state.instList.length == 0" image="search" description="暂无数据"></van-empty>
|
|
|
|
|
|
|
+ <van-empty
|
|
|
|
|
+ v-if="state.instList.length == 0"
|
|
|
|
|
+ image="search"
|
|
|
|
|
+ description="暂无数据"
|
|
|
|
|
+ ></van-empty>
|
|
|
<div class="inst-wrap">
|
|
<div class="inst-wrap">
|
|
|
- <van-list v-model:loading="state.loading" :finished="state.finished" finished-text="没有更多了" @load="onLoad">
|
|
|
|
|
- <div class="inst-item mb40" v-for="(v, index) in state.instList" :key="index">
|
|
|
|
|
|
|
+ <van-list
|
|
|
|
|
+ v-model:loading="state.loading"
|
|
|
|
|
+ :finished="state.finished"
|
|
|
|
|
+ finished-text="没有更多了"
|
|
|
|
|
+ @load="onLoad"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div
|
|
|
|
|
+ class="inst-item mb40"
|
|
|
|
|
+ v-for="(v, index) in state.instList"
|
|
|
|
|
+ :key="index"
|
|
|
|
|
+ >
|
|
|
<div class="inst-info mt4 mb4">
|
|
<div class="inst-info mt4 mb4">
|
|
|
- <div class="i-left" @click="openDetail(v)">
|
|
|
|
|
|
|
+ <div
|
|
|
|
|
+ class="i-left"
|
|
|
|
|
+ @click="openDetail(v)"
|
|
|
|
|
+ >
|
|
|
<!-- <img :showLoading="true" :src="v.instPicture" width="100px" height="100%" /> -->
|
|
<!-- <img :showLoading="true" :src="v.instPicture" width="100px" height="100%" /> -->
|
|
|
- <van-image width="100px" height="100px" :src="getImageUrl(v.instPicture)" />
|
|
|
|
|
|
|
+ <van-image
|
|
|
|
|
+ width="100px"
|
|
|
|
|
+ height="100px"
|
|
|
|
|
+ :src="getImageUrl(v.instPicture)"
|
|
|
|
|
+ />
|
|
|
</div>
|
|
</div>
|
|
|
<div class="i-right ml10">
|
|
<div class="i-right ml10">
|
|
|
- <div class="h100 flex flex-top flex-column flex-between" @click="openDetail(v)">
|
|
|
|
|
|
|
+ <div
|
|
|
|
|
+ class="h100 flex flex-top flex-column flex-between"
|
|
|
|
|
+ @click="openDetail(v)"
|
|
|
|
|
+ >
|
|
|
<!-- <van-button @click="openAppoint(v)">预约</van-button> -->
|
|
<!-- <van-button @click="openAppoint(v)">预约</van-button> -->
|
|
|
<div class="flex flex-top mb4 ml2">
|
|
<div class="flex flex-top mb4 ml2">
|
|
|
<div class="detailTxt name">{{ v.instName }}(编号{{ v.instCode }})</div>
|
|
<div class="detailTxt name">{{ v.instName }}(编号{{ v.instCode }})</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="flex flex-top mb4 ml2">
|
|
<div class="flex flex-top mb4 ml2">
|
|
|
<div class="detailTxt name">{{ v.instNameEn }}</div>
|
|
<div class="detailTxt name">{{ v.instNameEn }}</div>
|
|
|
|
|
+ <van-tag
|
|
|
|
|
+ v-if="v.instStatus == '10' && v.isAppointment == '10'"
|
|
|
|
|
+ type="primary"
|
|
|
|
|
+ class="status-tag ml6"
|
|
|
|
|
+ >
|
|
|
|
|
+ 可预约
|
|
|
|
|
+ </van-tag>
|
|
|
</div>
|
|
</div>
|
|
|
<footer>
|
|
<footer>
|
|
|
<div class="flex flex-top mb4 mt-auto">
|
|
<div class="flex flex-top mb4 mt-auto">
|
|
|
- <img class="i-r-icon" src="../../assets/img/user.png" v-if="v.instHeadName" />
|
|
|
|
|
|
|
+ <img
|
|
|
|
|
+ class="i-r-icon"
|
|
|
|
|
+ src="../../assets/img/user.png"
|
|
|
|
|
+ v-if="v.instHeadName"
|
|
|
|
|
+ />
|
|
|
<div class="detailTxt">{{ v.instHeadName }}</div>
|
|
<div class="detailTxt">{{ v.instHeadName }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="flex flex-top">
|
|
<div class="flex flex-top">
|
|
|
- <img class="i-r-icon" src="../../assets/img/address.png" v-if="v.placeAddress" />
|
|
|
|
|
|
|
+ <img
|
|
|
|
|
+ class="i-r-icon"
|
|
|
|
|
+ src="../../assets/img/address.png"
|
|
|
|
|
+ v-if="v.placeAddress"
|
|
|
|
|
+ />
|
|
|
<div class="detailTxt">{{ v.placeAddress + setLaboratoryName(v.laboratoryName) }}</div>
|
|
<div class="detailTxt">{{ v.placeAddress + setLaboratoryName(v.laboratoryName) }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
</footer>
|
|
</footer>
|
|
@@ -43,25 +91,51 @@
|
|
|
</van-list>
|
|
</van-list>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <van-tabbar route :placeholder="true">
|
|
|
|
|
- <van-tabbar-item replace to="/home" icon="wap-home-o">
|
|
|
|
|
|
|
+ <van-tabbar
|
|
|
|
|
+ route
|
|
|
|
|
+ :placeholder="true"
|
|
|
|
|
+ >
|
|
|
|
|
+ <van-tabbar-item
|
|
|
|
|
+ replace
|
|
|
|
|
+ to="/home"
|
|
|
|
|
+ icon="wap-home-o"
|
|
|
|
|
+ >
|
|
|
首页
|
|
首页
|
|
|
</van-tabbar-item>
|
|
</van-tabbar-item>
|
|
|
- <van-tabbar-item replace to="/instr-follow" icon="star">
|
|
|
|
|
|
|
+ <van-tabbar-item
|
|
|
|
|
+ replace
|
|
|
|
|
+ to="/instr-follow"
|
|
|
|
|
+ icon="star"
|
|
|
|
|
+ >
|
|
|
收藏仪器
|
|
收藏仪器
|
|
|
</van-tabbar-item>
|
|
</van-tabbar-item>
|
|
|
- <van-tabbar-item replace to="/instr-list" icon="printer">
|
|
|
|
|
|
|
+ <van-tabbar-item
|
|
|
|
|
+ replace
|
|
|
|
|
+ to="/instr-list"
|
|
|
|
|
+ icon="printer"
|
|
|
|
|
+ >
|
|
|
全部仪器
|
|
全部仪器
|
|
|
</van-tabbar-item>
|
|
</van-tabbar-item>
|
|
|
- <van-tabbar-item replace to="/instr-appoint-record" icon="label">
|
|
|
|
|
|
|
+ <van-tabbar-item
|
|
|
|
|
+ replace
|
|
|
|
|
+ to="/instr-appoint-record"
|
|
|
|
|
+ icon="label"
|
|
|
|
|
+ >
|
|
|
我的预约
|
|
我的预约
|
|
|
</van-tabbar-item>
|
|
</van-tabbar-item>
|
|
|
</van-tabbar>
|
|
</van-tabbar>
|
|
|
<!-- 仪器详情 -->
|
|
<!-- 仪器详情 -->
|
|
|
- <van-popup v-model:show="state.popupShow" round :closeable="true">
|
|
|
|
|
|
|
+ <van-popup
|
|
|
|
|
+ v-model:show="state.popupShow"
|
|
|
|
|
+ round
|
|
|
|
|
+ :closeable="true"
|
|
|
|
|
+ >
|
|
|
<div class="detail-box">
|
|
<div class="detail-box">
|
|
|
<div class="instNameTxt">{{ state.instDetail.instName }}</div>
|
|
<div class="instNameTxt">{{ state.instDetail.instName }}</div>
|
|
|
- <div v-if="state.instDetail.instName" class="dc-content">
|
|
|
|
|
|
|
+ <div
|
|
|
|
|
+ v-if="state.instDetail.instName"
|
|
|
|
|
+ class="dc-content"
|
|
|
|
|
+ >
|
|
|
<div class="flex">
|
|
<div class="flex">
|
|
|
<div class="label-item">仪器型号:</div>
|
|
<div class="label-item">仪器型号:</div>
|
|
|
<div class="detailTxt">{{ state.instDetail.instNameEn }}</div>
|
|
<div class="detailTxt">{{ state.instDetail.instNameEn }}</div>
|
|
@@ -98,20 +172,49 @@
|
|
|
<div class="detailTxt">{{ state.instDetail.instSpecParam }}</div>
|
|
<div class="detailTxt">{{ state.instDetail.instSpecParam }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="mb10">
|
|
<div class="mb10">
|
|
|
- <div class="detailTxt" text="主要功能及特色" customStyle="margin-bottom:10px" align="center" size="15" bold></div>
|
|
|
|
|
- <div class="detailTxt" :text="state.instDetail.instFunctFeat" size="14"></div>
|
|
|
|
|
|
|
+ <div
|
|
|
|
|
+ class="detailTxt"
|
|
|
|
|
+ text="主要功能及特色"
|
|
|
|
|
+ customStyle="margin-bottom:10px"
|
|
|
|
|
+ align="center"
|
|
|
|
|
+ size="15"
|
|
|
|
|
+ bold
|
|
|
|
|
+ ></div>
|
|
|
|
|
+ <div
|
|
|
|
|
+ class="detailTxt"
|
|
|
|
|
+ :text="state.instDetail.instFunctFeat"
|
|
|
|
|
+ size="14"
|
|
|
|
|
+ ></div>
|
|
|
</div>
|
|
</div>
|
|
|
<div class="mb10">
|
|
<div class="mb10">
|
|
|
- <div class="detailTxt" text="主要附件及配置" customStyle="margin-bottom:10px" align="center" size="15" bold></div>
|
|
|
|
|
- <div class="detailTxt" :text="state.instDetail.instAttConfig" size="14"></div>
|
|
|
|
|
|
|
+ <div
|
|
|
|
|
+ class="detailTxt"
|
|
|
|
|
+ text="主要附件及配置"
|
|
|
|
|
+ customStyle="margin-bottom:10px"
|
|
|
|
|
+ align="center"
|
|
|
|
|
+ size="15"
|
|
|
|
|
+ bold
|
|
|
|
|
+ ></div>
|
|
|
|
|
+ <div
|
|
|
|
|
+ class="detailTxt"
|
|
|
|
|
+ :text="state.instDetail.instAttConfig"
|
|
|
|
|
+ size="14"
|
|
|
|
|
+ ></div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</van-popup>
|
|
</van-popup>
|
|
|
<!-- 实验室 -->
|
|
<!-- 实验室 -->
|
|
|
- <van-popup v-model:show="state.showLab" position="bottom">
|
|
|
|
|
- <van-picker :columns="state.laboratoryColumns" :columns-field-names="{ text: 'name', value: 'id' }"
|
|
|
|
|
- @confirm="pickLab" @cancel="state.showLab = false" />
|
|
|
|
|
|
|
+ <van-popup
|
|
|
|
|
+ v-model:show="state.showLab"
|
|
|
|
|
+ position="bottom"
|
|
|
|
|
+ >
|
|
|
|
|
+ <van-picker
|
|
|
|
|
+ :columns="state.laboratoryColumns"
|
|
|
|
|
+ :columns-field-names="{ text: 'name', value: 'id' }"
|
|
|
|
|
+ @confirm="pickLab"
|
|
|
|
|
+ @cancel="state.showLab = false"
|
|
|
|
|
+ />
|
|
|
</van-popup>
|
|
</van-popup>
|
|
|
<!-- <van-picker :show="showLab" :columns="laboratoryColumns" keyName="name" @cancel="showLab = false" @confirm="pickLab"></van-picker> -->
|
|
<!-- <van-picker :show="showLab" :columns="laboratoryColumns" keyName="name" @cancel="showLab = false" @confirm="pickLab"></van-picker> -->
|
|
|
<!-- <shutDown ref="shutDownRef"></shutDown> -->
|
|
<!-- <shutDown ref="shutDownRef"></shutDown> -->
|
|
@@ -119,363 +222,390 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts" setup>
|
|
<script lang="ts" setup>
|
|
|
-import to from 'await-to-js'
|
|
|
|
|
-import { onMounted, reactive } from 'vue'
|
|
|
|
|
-import { useRouter } from 'vue-router'
|
|
|
|
|
-import { useInstrApi } from '/@/api/instr'
|
|
|
|
|
-import { useBlackApi } from '/@/api/blacklist'
|
|
|
|
|
-import { usePositionApi } from '/@/api/instr/position'
|
|
|
|
|
-import { showNotify } from 'vant'
|
|
|
|
|
-import { getImageUrl } from '/@/utils/url'
|
|
|
|
|
-const props = defineProps({
|
|
|
|
|
- following: {
|
|
|
|
|
- type: String,
|
|
|
|
|
- default: '20',
|
|
|
|
|
- },
|
|
|
|
|
-})
|
|
|
|
|
-const router = useRouter()
|
|
|
|
|
-const instApi = useInstrApi()
|
|
|
|
|
-const blacklistApi = useBlackApi()
|
|
|
|
|
-const positionApi = usePositionApi()
|
|
|
|
|
-
|
|
|
|
|
-const state = reactive({
|
|
|
|
|
- showLab: false,
|
|
|
|
|
- laboratoryColumns: [],
|
|
|
|
|
- instStatus: {
|
|
|
|
|
- 10: '正常',
|
|
|
|
|
- 20: '故障',
|
|
|
|
|
- 30: '报废',
|
|
|
|
|
- },
|
|
|
|
|
- instList: [],
|
|
|
|
|
- current: 1,
|
|
|
|
|
- queryForm: {
|
|
|
|
|
- laboratoryId: 0,
|
|
|
|
|
- laboratoryName: '',
|
|
|
|
|
- pageNum: 1,
|
|
|
|
|
- pageSize: 10,
|
|
|
|
|
- instName: '',
|
|
|
|
|
- },
|
|
|
|
|
- popupShow: false,
|
|
|
|
|
- instDetail: {} as any,
|
|
|
|
|
- total: 0,
|
|
|
|
|
- detailsLoading: false, //详情加载
|
|
|
|
|
- loading: false,
|
|
|
|
|
- finished: false,
|
|
|
|
|
-})
|
|
|
|
|
-const setLaboratoryName = (name) => {
|
|
|
|
|
- return name ? `(${name})` : ''
|
|
|
|
|
-}
|
|
|
|
|
-const getPosition = () => {
|
|
|
|
|
- Promise.all([positionApi.getLaboratoryList({ noPage: true })]).then(([lab]) => {
|
|
|
|
|
- const instr_is_concat_lab = JSON.parse(localStorage.getItem('instr_is_concat_lab') || '{}')
|
|
|
|
|
- if (instr_is_concat_lab == '10') {
|
|
|
|
|
- const list = lab?.data?.list.map((item) => ({ id: item.id, name: item.labName })) || []
|
|
|
|
|
- state.laboratoryColumns = list
|
|
|
|
|
- } else {
|
|
|
|
|
- state.laboratoryColumns = lab?.data.list
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ import to from 'await-to-js'
|
|
|
|
|
+ import { onMounted, reactive } from 'vue'
|
|
|
|
|
+ import { useRouter } from 'vue-router'
|
|
|
|
|
+ import { useInstrApi } from '/@/api/instr'
|
|
|
|
|
+ import { useBlackApi } from '/@/api/blacklist'
|
|
|
|
|
+ import { usePositionApi } from '/@/api/instr/position'
|
|
|
|
|
+ import { showNotify } from 'vant'
|
|
|
|
|
+ import { getImageUrl } from '/@/utils/url'
|
|
|
|
|
+ const props = defineProps({
|
|
|
|
|
+ following: {
|
|
|
|
|
+ type: String,
|
|
|
|
|
+ default: '20',
|
|
|
|
|
+ },
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
-const openSelectLaboratory = () => {
|
|
|
|
|
- state.showLab = true
|
|
|
|
|
-}
|
|
|
|
|
-const pickLab = ({ selectedOptions }: { selectedOptions: any[] }) => {
|
|
|
|
|
- state.showLab = false
|
|
|
|
|
- state.queryForm.laboratoryId = selectedOptions[selectedOptions.length - 1].id
|
|
|
|
|
- state.queryForm.laboratoryName = selectedOptions[selectedOptions.length - 1].name
|
|
|
|
|
-}
|
|
|
|
|
-// 打开设备预约
|
|
|
|
|
-const openAppoint = async (v) => {
|
|
|
|
|
- // 验证是否拉入了黑名单
|
|
|
|
|
- const [err, res]: ToResponse = await to(blacklistApi.checkInBlacklist())
|
|
|
|
|
- if (err) return
|
|
|
|
|
- if (res.data) {
|
|
|
|
|
- return showNotify({ type: 'danger', message: '您已被拉入黑名单,无法预约,请联系管理员' })
|
|
|
|
|
- }
|
|
|
|
|
- router.push(`/inst/appoint?id=${v.id}&name=${v.instName}`)
|
|
|
|
|
-}
|
|
|
|
|
-// 设备详情
|
|
|
|
|
-const openDetail = (v) => {
|
|
|
|
|
- router.push({
|
|
|
|
|
- path: '/instr-detail',
|
|
|
|
|
- query: {
|
|
|
|
|
- id: v.id,
|
|
|
|
|
|
|
+ const router = useRouter()
|
|
|
|
|
+ const instApi = useInstrApi()
|
|
|
|
|
+ const blacklistApi = useBlackApi()
|
|
|
|
|
+ const positionApi = usePositionApi()
|
|
|
|
|
+
|
|
|
|
|
+ const state = reactive({
|
|
|
|
|
+ showLab: false,
|
|
|
|
|
+ laboratoryColumns: [],
|
|
|
|
|
+ instStatus: {
|
|
|
|
|
+ 10: '正常',
|
|
|
|
|
+ 20: '故障',
|
|
|
|
|
+ 30: '报废',
|
|
|
},
|
|
},
|
|
|
|
|
+ instList: [],
|
|
|
|
|
+ current: 1,
|
|
|
|
|
+ queryForm: {
|
|
|
|
|
+ laboratoryId: 0,
|
|
|
|
|
+ laboratoryName: '',
|
|
|
|
|
+ pageNum: 1,
|
|
|
|
|
+ pageSize: 10,
|
|
|
|
|
+ instName: '',
|
|
|
|
|
+ },
|
|
|
|
|
+ popupShow: false,
|
|
|
|
|
+ instDetail: {} as any,
|
|
|
|
|
+ total: 0,
|
|
|
|
|
+ detailsLoading: false, //详情加载
|
|
|
|
|
+ loading: false,
|
|
|
|
|
+ finished: false,
|
|
|
})
|
|
})
|
|
|
- // state.popupShow = true
|
|
|
|
|
- // getDetail(v.id)
|
|
|
|
|
-}
|
|
|
|
|
-const onLoad = () => {
|
|
|
|
|
- state.queryForm.pageNum++
|
|
|
|
|
- getInstList()
|
|
|
|
|
-}
|
|
|
|
|
-// 查询列表
|
|
|
|
|
-const getInstList = async () => {
|
|
|
|
|
- state.loading = true
|
|
|
|
|
- const params = JSON.parse(JSON.stringify(state.queryForm))
|
|
|
|
|
- params.following = props.following
|
|
|
|
|
- params.instStatus = "10"
|
|
|
|
|
- const [err, res]: ToResponse = await to(instApi.getList(params))
|
|
|
|
|
- state.loading = false
|
|
|
|
|
- if (err) return
|
|
|
|
|
- if (res?.code === 200) {
|
|
|
|
|
- state.instList =
|
|
|
|
|
- state.queryForm.pageNum == 1 ? [...(res?.data?.list || [])] : [...state.instList, ...(res?.data?.list || [])]
|
|
|
|
|
- state.total = res?.data?.total
|
|
|
|
|
- if (state.queryForm.pageNum * state.queryForm.pageSize >= res.data.total) {
|
|
|
|
|
- state.finished = true
|
|
|
|
|
|
|
+ const setLaboratoryName = (name) => {
|
|
|
|
|
+ return name ? `(${name})` : ''
|
|
|
|
|
+ }
|
|
|
|
|
+ const getPosition = () => {
|
|
|
|
|
+ Promise.all([positionApi.getLaboratoryList({ noPage: true })]).then(([lab]) => {
|
|
|
|
|
+ const instr_is_concat_lab = JSON.parse(localStorage.getItem('instr_is_concat_lab') || '{}')
|
|
|
|
|
+ if (instr_is_concat_lab == '10') {
|
|
|
|
|
+ const list = lab?.data?.list.map((item) => ({ id: item.id, name: item.labName })) || []
|
|
|
|
|
+ state.laboratoryColumns = list
|
|
|
|
|
+ } else {
|
|
|
|
|
+ state.laboratoryColumns = lab?.data.list
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ const openSelectLaboratory = () => {
|
|
|
|
|
+ state.showLab = true
|
|
|
|
|
+ }
|
|
|
|
|
+ const pickLab = ({ selectedOptions }: { selectedOptions: any[] }) => {
|
|
|
|
|
+ state.showLab = false
|
|
|
|
|
+ state.queryForm.laboratoryId = selectedOptions[selectedOptions.length - 1].id
|
|
|
|
|
+ state.queryForm.laboratoryName = selectedOptions[selectedOptions.length - 1].name
|
|
|
|
|
+ }
|
|
|
|
|
+ // 打开设备预约
|
|
|
|
|
+ const openAppoint = async (v) => {
|
|
|
|
|
+ // 验证是否拉入了黑名单
|
|
|
|
|
+ const [err, res]: ToResponse = await to(blacklistApi.checkInBlacklist())
|
|
|
|
|
+ if (err) return
|
|
|
|
|
+ if (res.data) {
|
|
|
|
|
+ return showNotify({ type: 'danger', message: '您已被拉入黑名单,无法预约,请联系管理员' })
|
|
|
}
|
|
}
|
|
|
|
|
+ router.push(`/inst/appoint?id=${v.id}&name=${v.instName}`)
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
-const onSearch = () => {
|
|
|
|
|
- state.queryForm.pageNum = 1
|
|
|
|
|
- getInstList()
|
|
|
|
|
-}
|
|
|
|
|
-// 获取仪器详情
|
|
|
|
|
-const getDetail = async (id) => {
|
|
|
|
|
- state.detailsLoading = true
|
|
|
|
|
- const [err, res]: ToResponse = await to(instApi.getDetail({ id }))
|
|
|
|
|
- state.detailsLoading = false
|
|
|
|
|
- if (err) return
|
|
|
|
|
- if (res?.code === 200) {
|
|
|
|
|
- state.instDetail = res.data
|
|
|
|
|
|
|
+ // 设备详情
|
|
|
|
|
+ const openDetail = (v) => {
|
|
|
|
|
+ router.push({
|
|
|
|
|
+ path: '/instr-detail',
|
|
|
|
|
+ query: {
|
|
|
|
|
+ id: v.id,
|
|
|
|
|
+ },
|
|
|
|
|
+ })
|
|
|
|
|
+ // state.popupShow = true
|
|
|
|
|
+ // getDetail(v.id)
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
-// 关注/取关
|
|
|
|
|
-const handleFollowInst = async (row) => {
|
|
|
|
|
- const [err] = row.following
|
|
|
|
|
- ? await to(instApi.unfollow({ ids: [row.id] }))
|
|
|
|
|
- : await to(instApi.follow({ ids: [row.id] }))
|
|
|
|
|
- if (err) return
|
|
|
|
|
- showNotify({ type: 'success', message: !row.following ? '收藏成功' : '已取消收藏' })
|
|
|
|
|
- state.instList.forEach((item, index) => {
|
|
|
|
|
- if (item.id == row.id) {
|
|
|
|
|
- // 关注之前的关注状态
|
|
|
|
|
- if (item.following) {
|
|
|
|
|
- state.queryForm.pageNum = 1
|
|
|
|
|
- getInstList()
|
|
|
|
|
- } else {
|
|
|
|
|
- item.following = true
|
|
|
|
|
- const obj = item
|
|
|
|
|
- state.instList.splice(index, 1)
|
|
|
|
|
- state.instList.unshift(obj)
|
|
|
|
|
|
|
+ const onLoad = () => {
|
|
|
|
|
+ state.queryForm.pageNum++
|
|
|
|
|
+ getInstList()
|
|
|
|
|
+ }
|
|
|
|
|
+ // 查询列表
|
|
|
|
|
+ const getInstList = async () => {
|
|
|
|
|
+ state.loading = true
|
|
|
|
|
+ const params = JSON.parse(JSON.stringify(state.queryForm))
|
|
|
|
|
+ params.following = props.following
|
|
|
|
|
+ params.instStatus = '10'
|
|
|
|
|
+ const [err, res]: ToResponse = await to(instApi.getList(params))
|
|
|
|
|
+ state.loading = false
|
|
|
|
|
+ if (err) return
|
|
|
|
|
+ if (res?.code === 200) {
|
|
|
|
|
+ state.instList =
|
|
|
|
|
+ state.queryForm.pageNum == 1 ? [...(res?.data?.list || [])] : [...state.instList, ...(res?.data?.list || [])]
|
|
|
|
|
+ state.total = res?.data?.total
|
|
|
|
|
+ if (state.queryForm.pageNum * state.queryForm.pageSize >= res.data.total) {
|
|
|
|
|
+ state.finished = true
|
|
|
}
|
|
}
|
|
|
- return
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+ }
|
|
|
|
|
+ const onSearch = () => {
|
|
|
|
|
+ state.queryForm.pageNum = 1
|
|
|
|
|
+ getInstList()
|
|
|
|
|
+ }
|
|
|
|
|
+ // 获取仪器详情
|
|
|
|
|
+ const getDetail = async (id) => {
|
|
|
|
|
+ state.detailsLoading = true
|
|
|
|
|
+ const [err, res]: ToResponse = await to(instApi.getDetail({ id }))
|
|
|
|
|
+ state.detailsLoading = false
|
|
|
|
|
+ if (err) return
|
|
|
|
|
+ if (res?.code === 200) {
|
|
|
|
|
+ state.instDetail = res.data
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ // 关注/取关
|
|
|
|
|
+ const handleFollowInst = async (row) => {
|
|
|
|
|
+ const [err] = row.following
|
|
|
|
|
+ ? await to(instApi.unfollow({ ids: [row.id] }))
|
|
|
|
|
+ : await to(instApi.follow({ ids: [row.id] }))
|
|
|
|
|
+ if (err) return
|
|
|
|
|
+ showNotify({ type: 'success', message: !row.following ? '收藏成功' : '已取消收藏' })
|
|
|
|
|
+ state.instList.forEach((item, index) => {
|
|
|
|
|
+ if (item.id == row.id) {
|
|
|
|
|
+ // 关注之前的关注状态
|
|
|
|
|
+ if (item.following) {
|
|
|
|
|
+ state.queryForm.pageNum = 1
|
|
|
|
|
+ getInstList()
|
|
|
|
|
+ } else {
|
|
|
|
|
+ item.following = true
|
|
|
|
|
+ const obj = item
|
|
|
|
|
+ state.instList.splice(index, 1)
|
|
|
|
|
+ state.instList.unshift(obj)
|
|
|
|
|
+ }
|
|
|
|
|
+ return
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ }
|
|
|
|
|
+ // const onEnroll = (row: any) => {
|
|
|
|
|
+ // router.push({
|
|
|
|
|
+ // path: '/training/enroll',
|
|
|
|
|
+ // query: {
|
|
|
|
|
+ // id: row.id
|
|
|
|
|
+ // }
|
|
|
|
|
+ // })
|
|
|
|
|
+ // }
|
|
|
|
|
+ onMounted(() => {
|
|
|
|
|
+ getPosition()
|
|
|
|
|
+ state.queryForm.pageNum = 1
|
|
|
|
|
+ getInstList()
|
|
|
})
|
|
})
|
|
|
-}
|
|
|
|
|
-// const onEnroll = (row: any) => {
|
|
|
|
|
-// router.push({
|
|
|
|
|
-// path: '/training/enroll',
|
|
|
|
|
-// query: {
|
|
|
|
|
-// id: row.id
|
|
|
|
|
-// }
|
|
|
|
|
-// })
|
|
|
|
|
-// }
|
|
|
|
|
-onMounted(() => {
|
|
|
|
|
- getPosition()
|
|
|
|
|
- state.queryForm.pageNum = 1
|
|
|
|
|
- getInstList()
|
|
|
|
|
-})
|
|
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
<style lang="scss" scoped>
|
|
|
-* {
|
|
|
|
|
- box-sizing: border-box;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.home {
|
|
|
|
|
- height: 100%;
|
|
|
|
|
- overflow: hidden;
|
|
|
|
|
- display: flex;
|
|
|
|
|
- flex-direction: column;
|
|
|
|
|
-
|
|
|
|
|
- .search-wrap {
|
|
|
|
|
- height: 40px;
|
|
|
|
|
- display: flex;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- justify-content: space-around;
|
|
|
|
|
- padding: 0 15px;
|
|
|
|
|
- margin: 10px 0 0;
|
|
|
|
|
|
|
+ * {
|
|
|
|
|
+ box-sizing: border-box;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- .inst-list {
|
|
|
|
|
- flex: 1;
|
|
|
|
|
- height: 0;
|
|
|
|
|
- background-color: #f7f8fa;
|
|
|
|
|
|
|
+ .home {
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
|
|
|
- // padding-bottom: 20px;
|
|
|
|
|
- // padding: 0 15px;
|
|
|
|
|
- // height: calc(100% - 60px);
|
|
|
|
|
- .inst-wrap {
|
|
|
|
|
- height: 100%;
|
|
|
|
|
- overflow: auto;
|
|
|
|
|
- padding: 10px 10px 0 10px;
|
|
|
|
|
- // padding: 10px 10px 0 10px;
|
|
|
|
|
|
|
+ .search-wrap {
|
|
|
|
|
+ height: 40px;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: space-around;
|
|
|
|
|
+ padding: 0 15px;
|
|
|
|
|
+ margin: 10px 0 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- .inst-item {
|
|
|
|
|
- background-color: #fff;
|
|
|
|
|
- padding: 8px;
|
|
|
|
|
- box-shadow: -2px 0px 9px rgba(0, 0, 0, 0.12);
|
|
|
|
|
- margin-bottom: 14px;
|
|
|
|
|
- border-radius: 6px;
|
|
|
|
|
-
|
|
|
|
|
- .follow-icon {
|
|
|
|
|
- width: 24px;
|
|
|
|
|
- height: 24px;
|
|
|
|
|
|
|
+ .inst-list {
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ height: 0;
|
|
|
|
|
+ background-color: #f7f8fa;
|
|
|
|
|
+
|
|
|
|
|
+ // padding-bottom: 20px;
|
|
|
|
|
+ // padding: 0 15px;
|
|
|
|
|
+ // height: calc(100% - 60px);
|
|
|
|
|
+ .inst-wrap {
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ overflow: auto;
|
|
|
|
|
+ padding: 10px 10px 0 10px;
|
|
|
|
|
+ // padding: 10px 10px 0 10px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- .inst-info {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ .inst-item {
|
|
|
|
|
+ background-color: #fff;
|
|
|
|
|
+ padding: 8px;
|
|
|
|
|
+ box-shadow: -2px 0px 9px rgba(0, 0, 0, 0.12);
|
|
|
|
|
+ margin-bottom: 14px;
|
|
|
|
|
+ border-radius: 6px;
|
|
|
|
|
|
|
|
- .i-right {
|
|
|
|
|
- flex: 1;
|
|
|
|
|
- font-size: 14px;
|
|
|
|
|
|
|
+ .follow-icon {
|
|
|
|
|
+ width: 24px;
|
|
|
|
|
+ height: 24px;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- .i-r-icon {
|
|
|
|
|
- width: 15px;
|
|
|
|
|
- height: 15px;
|
|
|
|
|
- margin-right: 10px;
|
|
|
|
|
|
|
+ .inst-info {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ width: 100%;
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- .detail-box {
|
|
|
|
|
- height: 80vh;
|
|
|
|
|
- background: #fff;
|
|
|
|
|
- border-radius: 10px;
|
|
|
|
|
- padding: 15px;
|
|
|
|
|
|
|
+ .i-right {
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ min-width: 0; // 允许内部内容收缩,配合省略号
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
|
|
|
- .dc-content {
|
|
|
|
|
- width: 100%;
|
|
|
|
|
- height: calc(100% - 30px);
|
|
|
|
|
- overflow: auto;
|
|
|
|
|
|
|
+ .flex {
|
|
|
|
|
+ min-width: 0; // 避免子元素撑破容器
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- .label-item {
|
|
|
|
|
- width: 90px;
|
|
|
|
|
- font-size: 14px;
|
|
|
|
|
- padding: 6px;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ footer {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ min-width: 0;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ gap: 4px;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- .detailTxt {
|
|
|
|
|
- flex: 1;
|
|
|
|
|
|
|
+ .i-r-icon {
|
|
|
|
|
+ width: 15px;
|
|
|
|
|
+ height: 15px;
|
|
|
|
|
+ margin-right: 10px;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
- }
|
|
|
|
|
|
|
|
|
|
- .filter-popup {
|
|
|
|
|
- background: rgba(0, 0, 0, 0.8);
|
|
|
|
|
- position: fixed;
|
|
|
|
|
- width: 100%;
|
|
|
|
|
- height: 100%;
|
|
|
|
|
- left: 0;
|
|
|
|
|
- z-index: 1;
|
|
|
|
|
- top: 50px;
|
|
|
|
|
-
|
|
|
|
|
- .filter-wrap {
|
|
|
|
|
- width: 100%;
|
|
|
|
|
- padding: 10px;
|
|
|
|
|
- background: #ffffff;
|
|
|
|
|
|
|
+ .detail-box {
|
|
|
|
|
+ height: 80vh;
|
|
|
|
|
+ background: #fff;
|
|
|
|
|
+ border-radius: 10px;
|
|
|
|
|
+ padding: 15px;
|
|
|
|
|
|
|
|
- .filter-item {
|
|
|
|
|
- padding-bottom: 14px;
|
|
|
|
|
|
|
+ .dc-content {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: calc(100% - 30px);
|
|
|
|
|
+ overflow: auto;
|
|
|
|
|
|
|
|
- .tit {
|
|
|
|
|
|
|
+ .label-item {
|
|
|
|
|
+ width: 90px;
|
|
|
font-size: 14px;
|
|
font-size: 14px;
|
|
|
- color: #323232;
|
|
|
|
|
- font-weight: bold;
|
|
|
|
|
- padding-bottom: 10px;
|
|
|
|
|
|
|
+ padding: 6px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- .menu-list {
|
|
|
|
|
- display: flex;
|
|
|
|
|
- flex-wrap: wrap;
|
|
|
|
|
-
|
|
|
|
|
- .menu-item {
|
|
|
|
|
- margin-right: 20px;
|
|
|
|
|
- margin-bottom: 10px;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ .detailTxt {
|
|
|
|
|
+ flex: 1;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- .btn-box {
|
|
|
|
|
|
|
+ .filter-popup {
|
|
|
|
|
+ background: rgba(0, 0, 0, 0.8);
|
|
|
|
|
+ position: fixed;
|
|
|
width: 100%;
|
|
width: 100%;
|
|
|
- height: 40px;
|
|
|
|
|
- padding: 10px;
|
|
|
|
|
- background: #ffffff;
|
|
|
|
|
- display: flex;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- justify-content: space-between;
|
|
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ z-index: 1;
|
|
|
|
|
+ top: 50px;
|
|
|
|
|
+
|
|
|
|
|
+ .filter-wrap {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ padding: 10px;
|
|
|
|
|
+ background: #ffffff;
|
|
|
|
|
+
|
|
|
|
|
+ .filter-item {
|
|
|
|
|
+ padding-bottom: 14px;
|
|
|
|
|
+
|
|
|
|
|
+ .tit {
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ color: #323232;
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+ padding-bottom: 10px;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- >div {
|
|
|
|
|
- width: 160px;
|
|
|
|
|
- height: 32px;
|
|
|
|
|
- border-radius: 20px;
|
|
|
|
|
- border: solid 1px #ec652b;
|
|
|
|
|
- align-items: center;
|
|
|
|
|
- justify-content: center;
|
|
|
|
|
- text-align: center;
|
|
|
|
|
- line-height: 32px;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ .menu-list {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
|
|
|
|
- .reset {
|
|
|
|
|
- color: #ec652b;
|
|
|
|
|
|
|
+ .menu-item {
|
|
|
|
|
+ margin-right: 20px;
|
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- .submit {
|
|
|
|
|
- color: #fff;
|
|
|
|
|
- background-color: #ec652b;
|
|
|
|
|
|
|
+ .btn-box {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 40px;
|
|
|
|
|
+ padding: 10px;
|
|
|
|
|
+ background: #ffffff;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+
|
|
|
|
|
+ > div {
|
|
|
|
|
+ width: 160px;
|
|
|
|
|
+ height: 32px;
|
|
|
|
|
+ border-radius: 20px;
|
|
|
|
|
+ border: solid 1px #ec652b;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ line-height: 32px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .reset {
|
|
|
|
|
+ color: #ec652b;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .submit {
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ background-color: #ec652b;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
|
|
|
|
|
-.instNameTxt {
|
|
|
|
|
- margin-bottom: 10px;
|
|
|
|
|
- font-size: 16px;
|
|
|
|
|
- font-weight: bold;
|
|
|
|
|
- text-align: center;
|
|
|
|
|
-}
|
|
|
|
|
|
|
+ .instNameTxt {
|
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .detailTxt {
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ color: #333333;
|
|
|
|
|
+ display: block;
|
|
|
|
|
+ max-width: 100%;
|
|
|
|
|
+ flex: 1 1 auto;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ text-overflow: ellipsis;
|
|
|
|
|
+ white-space: nowrap;
|
|
|
|
|
+
|
|
|
|
|
+ &.name {
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
-.detailTxt {
|
|
|
|
|
- font-size: 12px;
|
|
|
|
|
- color: #333333;
|
|
|
|
|
|
|
+ .status-tag {
|
|
|
|
|
+ flex: 0 0 auto;
|
|
|
|
|
+ margin-left: 6px;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- &.name {
|
|
|
|
|
|
|
+ .labelTit {
|
|
|
|
|
+ margin-bottom: 10px;
|
|
|
|
|
+ text-align: center;
|
|
|
|
|
+ font-size: 15px;
|
|
|
font-weight: bold;
|
|
font-weight: bold;
|
|
|
- font-size: 16px;
|
|
|
|
|
}
|
|
}
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.labelTit {
|
|
|
|
|
- margin-bottom: 10px;
|
|
|
|
|
- text-align: center;
|
|
|
|
|
- font-size: 15px;
|
|
|
|
|
- font-weight: bold;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.primary-color {
|
|
|
|
|
- color: #3c9cff;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.warning-color {
|
|
|
|
|
- color: #ff976a;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.danger-color {
|
|
|
|
|
- color: #ee0a24;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.instr-status-btn {
|
|
|
|
|
- font-weight: bold;
|
|
|
|
|
- font-size: 14px;
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
-.mt-auto {
|
|
|
|
|
- margin-top: auto;
|
|
|
|
|
-}
|
|
|
|
|
|
|
+
|
|
|
|
|
+ .primary-color {
|
|
|
|
|
+ color: #3c9cff;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .warning-color {
|
|
|
|
|
+ color: #ff976a;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .danger-color {
|
|
|
|
|
+ color: #ee0a24;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .instr-status-btn {
|
|
|
|
|
+ font-weight: bold;
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .mt-auto {
|
|
|
|
|
+ margin-top: auto;
|
|
|
|
|
+ }
|
|
|
</style>
|
|
</style>
|