feat():水库详情开发

master
李神峰 2026-04-16 15:54:02 +08:00
parent 6ce3900702
commit c8a6ae71e1
28 changed files with 3459 additions and 7 deletions

View File

@ -2,7 +2,7 @@
"name" : "赤壁水利", "name" : "赤壁水利",
"appid" : "__UNI__1AC9CFD", "appid" : "__UNI__1AC9CFD",
"description" : "", "description" : "",
"versionName" : "1.0.0", "versionName" : "1.0.2",
"versionCode" : 1, "versionCode" : 1,
"transformPx" : false, "transformPx" : false,
"app-plus" : { "app-plus" : {

View File

@ -2,7 +2,14 @@
"easycom": { "easycom": {
"^u-(.*)": "@/uni_modules/uview-ui/components/u-$1/u-$1.vue" "^u-(.*)": "@/uni_modules/uview-ui/components/u-$1/u-$1.vue"
}, },
"pages": [{ "pages": [
{
"path": "pages/simpleResviror/index",
"style": {
"navigationBarTitleText": ""
}
},
{
"path": "pages/login/login", "path": "pages/login/login",
"style": { "style": {
"navigationBarTitleText": "" "navigationBarTitleText": ""

View File

@ -179,7 +179,7 @@ export default function DrpOption(data=[],wrz,grz) {
lineStyle: { lineStyle: {
type: "dashed" type: "dashed"
}, },
data: data.map(o => grz), data: data.map(o => Number(grz)),
symbol: 'none' // 设置标记点为'none',即去掉圆点 symbol: 'none' // 设置标记点为'none',即去掉圆点
}, },
{ {
@ -189,7 +189,7 @@ export default function DrpOption(data=[],wrz,grz) {
type: 'line', type: 'line',
color: "#F59A23", color: "#F59A23",
barWidth: '60%', barWidth: '60%',
data: data.map(o => wrz), data: data.map(o => Number(wrz)),
lineStyle: { lineStyle: {
type: "dashed" type: "dashed"
}, },
@ -199,7 +199,7 @@ export default function DrpOption(data=[],wrz,grz) {
name: '降雨量', name: '降雨量',
type: 'bar', type: 'bar',
barWidth: '60%', barWidth: '60%',
data: data.map(o => o.drp).reverse(), data: data.map(o => Number(o.drp)).reverse(),
itemStyle: { itemStyle: {
color: "#007AFD", color: "#007AFD",
}, },
@ -231,7 +231,7 @@ export default function DrpOption(data=[],wrz,grz) {
label: { label: {
show: false, show: false,
}, },
data: data.map(o => o.tq), data: data.map(o => Number(o.tq)),
} }
] ]
} }

View File

@ -26,7 +26,7 @@
</view> </view>
<view class="jcsj-content"> <view class="jcsj-content">
<view class="jcsj-charts" v-if="selactOne == 0"> <view class="jcsj-charts" v-if="selactOne == 0">
<qiun-data-charts :chartData="chartData.chartData" :echartsApp="true" :eopts="chartData.eopts" /> <qiun-data-charts type="line" :chartData="chartData.chartData" :echartsApp="true" :eopts="chartData.eopts" />
</view> </view>
<view style="margin-top: 20px;" v-if="selactOne == 1"> <view style="margin-top: 20px;" v-if="selactOne == 1">
<JcsjTable :tableData="tableData" /> <JcsjTable :tableData="tableData" />

View File

@ -0,0 +1,57 @@
<template>
<view class="aqjc-box">
<view class="aqjc-tabs">
<u-tabs
:list="list"
@click="tabsClick"
:scrollable="false"
:activeStyle="{
color: '#34a4fe',
}"
></u-tabs>
</view>
<view class="aqjc-content">
<Wyjc v-if = "status == 0" :tableData="wyTable"/>
<Syjc v-if="status == 1" :tableData="syTable"/>
<Sljc v-if="status == 2" :tableData="slTable" />
</view>
</view>
</template>
<script>
import Sljc from './sljc.vue';
import Syjc from './syjc.vue';
import Wyjc from './wyjc.vue';
export default {
components: {
Wyjc,
Syjc,
Sljc
},
data() {
return {
list: [{ name: '位移监测' }, { name: '渗压监测' }, { name: '渗流监测' }],
status: 0,
wyTable: [],
syTable: [],
slTable:[]
}
},
methods: {
tabsClick(e) {
this.status = e?.index;
}
}
}
</script>
<style lang="scss" scoped>
.aqjc-box{
padding: 5px;
.aqjc-tabs{
width: 100%;
background-color: #dff0f8;
}
.gcgk{
padding: 5px;
}
}
</style>

View File

@ -0,0 +1,169 @@
<template>
<view>
<view class="search-bar">
<view class="time-ranger">
<uni-datetime-picker type="daterange" v-model="tm" @change="handleRanger" :clear-icon="false"
rangeSeparator="至"></uni-datetime-picker>
</view>
</view>
<!-- 表格容器 - 统一滚动 -->
<div class="table-container">
<!-- 表头 -->
<div class="tableHead">
<div class="td fixed-col">序号</div>
<div class="td fixed-col">监测点</div>
<div class="td fixed-col time-col">监测时间</div>
<!-- 动态列 -->
<div v-for="(col, index) in dynamicColumns" :key="index" class="td dynamic-col">
{{ col.name }}(L/s)
</div>
</div>
<!-- 表体 -->
<div class="tableBody">
<div v-for="(item, index) in tableData" :key="index" class="tableRow">
<div class="td fixed-col">{{ index+1 }}</div>
<div class="td fixed-col">{{ item.pointName }}</div>
<div class="td fixed-col time-col">{{ item.monitorTime }}</div>
<!-- 动态列数据 -->
<div v-for="(col, colIndex) in dynamicColumns" :key="colIndex" class="td dynamic-col">
{{ item[col.field] || '--' }}
</div>
</div>
<div :style="{ height: '80px' }"></div>
</div>
</div>
</view>
</template>
<script>
import moment from "moment"
const stm = moment().subtract(3, 'days').format("YYYY-MM-DD");
const etm = moment().format("YYYY-MM-DD");
export default {
// props: {
// tableData: {
// type: Array,
// default: () => []
// }
// },
data() {
return {
tm: [stm, etm],
//
// [
// { name: 'we-01', field: 'we01', unit: 'L/s' },
// { name: 'we-02', field: 'we02', unit: 'L/s' },
// { name: 'we-03', field: 'we03', unit: 'L/s' }
// ]
dynamicColumns: [],
tableData:Array(30).fill(0).map(item => ( {pointName:123,monitorTime:'04-16 13:31',we01:1,we02:2,we:3}))
}
},
created() {
//
this.fetchColumnConfig()
},
methods: {
handleRanger(e) {
this.tm = [...e]
//
this.fetchData()
},
//
fetchColumnConfig() {
//
// 使
// uni.$http.get('/api/columns').then(res => {
// this.dynamicColumns = res.data
// })
//
this.dynamicColumns = [
{ name: 'we-01', field: 'we01', unit: 'L/s' },
{ name: 'we-02', field: 'we02', unit: 'L/s' },
{ name: 'we-03', field: 'we03', unit: 'L/s' },
{ name: 'we-04', field: 'we04', unit: 'L/s' }
]
},
//
fetchData() {
// 使
// uni.$http.get('/api/data', { params: { startTime: this.tm[0], endTime: this.tm[1] }})
}
}
}
</script>
<style lang="scss" scoped>
.search-bar {
display: flex;
margin: 5px 0;
align-items: center;
}
.time-ranger {
flex: 1;
}
/* 表格容器 - 统一横向滚动 */
.table-container {
width: 100%;
overflow-x: auto;
overflow-y: hidden;
}
.tableHead {
width: max-content;
min-width: 100%;
margin-top: 5px;
height: 50px;
background-color: #e4f2fe;
display: flex;
color: #208FEE;
}
.tableBody {
width: max-content;
min-width: 100%;
height: calc(80vh - 130px);
overflow-y: auto;
}
.tableRow {
width: max-content;
min-width: 100%;
height: 46px;
display: flex;
border-bottom: 1px solid #eee;
background-color: #ffffff;
}
.td {
text-align: center;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
flex-shrink: 0;
}
/* 固定列样式 */
.fixed-col {
width: 80px;
}
.time-col {
width: 100px;
}
/* 动态列样式 */
.dynamic-col {
width: 100px;
}
</style>

View File

@ -0,0 +1,155 @@
<template>
<view>
<view class="search-bar">
<view class="time-ranger">
<uni-datetime-picker type="daterange" v-model="tm" @change="handleRanger"
:clear-icon="false" rangeSeparator="至"></uni-datetime-picker>
</view>
<view class="select-bar">
<uni-data-select v-model="value" :localdata="list" @change="change" :clear="false">
</uni-data-select>
</view>
</view>
<!-- 表格容器 - 统一滚动 -->
<div class="table-container">
<div class="tableHead">
<div class="td fixed-col">序号</div>
<div class="td fixed-col">监测点</div>
<div class="td fixed-col time-col">监测时间</div>
<!-- 动态列 -->
<div v-for="(col, index) in dynamicColumns" :key="index" class="td dynamic-col">
{{ col.name }}(m)
</div>
</div>
<div class="tableBody">
<div v-for="(item, index) in tableData" :key="index" class="tableRow">
<div class="td fixed-col">{{ index+1 }}</div>
<div class="td fixed-col">{{ item.pointName }}</div>
<div class="td fixed-col time-col">{{ item.monitorTime }}</div>
<!-- 动态列数据 -->
<div v-for="(col, colIndex) in dynamicColumns" :key="colIndex" class="td dynamic-col">
{{ item[col.field] || '--' }}
</div>
</div>
<div :style="{ height: '80px' }">
</div>
</div>
</div>
</view>
</template>
<script>
import moment from "moment"
const stm = moment().subtract(3, 'days').format("YYYY-MM-DD");
const etm = moment().format("YYYY-MM-DD");
export default {
// props:{
// tableData:{
// type:Array,
// default:[],
// }
// },
data() {
return {
tm: [stm, etm],
list: [],
value: "",
dynamicColumns: [],
tableData: [
{pointName:123,monitorTime:'04-16 13:31',we01:1,we02:2,we:3},
{pointName:123,monitorTime:'04-16 13:31',we01:1,we02:2,we:3},
{pointName:123,monitorTime:'04-16 13:31',we01:1,we02:2,we:3},
{pointName:123,monitorTime:'04-16 13:31',we01:1,we02:2,we:3},
{pointName:123,monitorTime:'04-16 13:31',we01:1,we02:2,we:3},
],
dynamicColumns : [
{ name: 'we-01', field: 'we01', unit: 'L/s' },
{ name: 'we-02', field: 'we02', unit: 'L/s' },
{ name: 'we-03', field: 'we03', unit: 'L/s' },
{ name: 'we-04', field: 'we04', unit: 'L/s' }
]
}
},
methods: {
handleRanger(e) {
this.tm = [...e]
},
change(e) {
this.value = e;
}
}
}
</script>
<style lang="scss" scoped>
.search-bar {
display: flex;
margin: 5px 0;
align-items: center;
}
.time-ranger {
flex: 1;
}
.select-bar {
width: 30%;
margin-left: 1%;
}
/* 表格容器 - 统一横向滚动 */
.table-container {
width: 100%;
overflow-x: auto;
overflow-y: hidden;
}
.tableHead {
width: max-content;
min-width: 100%;
margin-top: 5px;
height: 50px;
background-color: #e4f2fe;
display: flex;
color: #208FEE;
}
.tableBody {
width: max-content;
min-width: 100%;
height: calc(80vh - 130px);
overflow-y: auto;
}
.tableRow {
width: max-content;
min-width: 100%;
height: 46px;
display: flex;
border-bottom: 1px solid #eee;
background-color: #ffffff;
}
.td {
text-align: center;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
flex-shrink: 0;
}
/* 固定列样式 */
.fixed-col {
width: 80px;
}
.time-col {
width: 100px;
}
/* 动态列样式 */
.dynamic-col {
width: 100px;
}
</style>

View File

@ -0,0 +1,131 @@
<template>
<view>
<view class="search-bar">
<view class="time-ranger">
<uni-datetime-picker type="daterange" v-model="tm" @change="handleRanger" :clear-icon="false"
rangeSeparator="至"></uni-datetime-picker>
</view>
<view class="select-bar">
<uni-data-select v-model="value" :localdata="list" @change="change" :clear="false">
</uni-data-select>
</view>
</view>
<div class="tableHead">
<div class="td t1">监测点</div>
<div class="td t2">监测时间</div>
<div class="td t3">x方向(mm)</div>
<div class="td t4">y方向(mm)</div>
<div class="td t5">z方向(mm)</div>
</div>
<div class="tableBody">
<div v-for="(item, index) in tableData" class="tableRow">
<div class="td t1">{{ }}</div>
<div class="td t2">{{ item.tm ? item.tm.slice(5, 16) : "" }}</div>
<div class="td t3">{{}}</div>
<div class="td t4">{{}}</div>
<div class="td t5">{{}}</div>
</div>
<div :style="{ height: '80px' }">
</div>
</div>
</view>
</template>
<script>
import moment from "moment"
const stm = moment().subtract(3, 'days').format("YYYY-MM-DD");
const etm = moment().format("YYYY-MM-DD");
export default {
props: {
tableData: {
type: Array,
default: [],
}
},
data() {
return {
tm: [stm, etm],
list: [],
value: "",
}
},
methods: {
handleRanger(e) {
this.tm = [...e]
},
change(e) {
this.value = e;
}
}
}
</script>
<style lang="scss" scoped>
.search-bar {
display: flex;
margin: 5px 0;
align-items: center;
}
.time-ranger {
flex: 1;
}
.select-bar {
width: 30%;
margin-left: 1%;
}
.tableHead {
width: 100%;
margin-top: 5px;
height: 50px;
background-color: #e4f2fe;
display: flex;
color: #208FEE;
}
.tableBody {
width: 100%;
height: calc(60vh - 214px);
// background-color: #f7f7f7; //#ffffff;
overflow-y: scroll;
}
.tableRow {
width: 100%;
height: 46px;
display: flex;
border-bottom: 1px solid #eee;
background-color: #ffffff;
}
.td {
text-align: center;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
}
.t1 {
width: 20%;
}
.t2 {
width: 20%;
}
.t3 {
width: 20%;
}
.t4 {
width: 20%;
}
.t5 {
width: 20%;
}
</style>

View File

@ -0,0 +1,158 @@
<template>
<view class="resviror-detail-box">
<u-status-bar></u-status-bar>
<view class="nav-bar">
<u-icon name="arrow-left" color="#000" size="20" @click="backTo" style="margin-left:10px"></u-icon>
<view class="title">
{{ stnm }}
<!-- <text style="font-size:12px;margin-left:5px">{{sta}}({{rain}})</text> -->
</view>
</view>
<view class="tab-bar">
<uni-swiper-dot :info="Array(2).fill(0)" :current="current" field="content" :dotsStyles="dotsStyles">
<swiper class="swiper-box" style="height: 30px;" @change="change">
<swiper-item>
<view style="display: flex;justify-content: space-between;">
<view class="jcsj" @click="activeOne = 0" :class="{ 'active': activeOne == 0 }">
雨水情信息
</view>
<!-- style="margin: 0 25px;" -->
<view class="tjsj" @click="activeOne = 1" :class="{ 'active': activeOne == 1 }">
视频监控
</view>
<!-- style="margin: 0 25px 0 0;" -->
<view class="spjk" @click="activeOne = 2" :class="{ 'active': activeOne == 2 }" >
基本信息
</view>
<view class="zbyq" @click="activeOne = 3" :class="{ 'active': activeOne == 3 }">
安全监测
</view>
</view>
</swiper-item>
<swiper-item>
<view style="display: flex; margin-left: 10px;">
<view class="zrtx" @click="activeOne = 4" :class="{ 'active': activeOne == 4 }">
责任体系
</view>
</view>
</swiper-item>
</swiper>
</uni-swiper-dot>
</view>
<view class="resviror-detail-content">
<Ysqxx v-if="activeOne == 0"/>
<Spjk stcd="3061" v-else-if="activeOne == 1" />
<Aqjc v-else-if="activeOne == 3"/>
<Jbxx v-else-if="activeOne == 2" />
<Zrtx resCode="42282650003" v-else-if="activeOne == 4" />
</view>
</view>
</template>
<script>
import Ysqxx from './ysqxx'
import Spjk from "./spjk/spjk.vue"
import Zrtx from "./zrtx/zrtx.vue"
import Jbxx from './jbxx'
import Aqjc from './aqjc'
export default {
data() {
return {
activeOne: 0,
stcd: '',
stnm: '',
wrz: '',
grz: '',
calFloodLev: '',
desFloodLev: '',
flLowLimLev: '',
afsltdz: '',
resCode: '',
current: 0,
dotsStyles: {
bottom: 0,
selectedBackgroundColor: "#d9001b"
}
}
},
components: {
Spjk,
Zrtx,
Ysqxx,
Jbxx,
Aqjc
},
methods: {
backTo() {
uni.navigateBack({ delta: 1 })
},
change(e) {
console.log(e.detail.current);
this.current = e.detail.current;
}
},
onLoad(option) {
this.stcd = option.stcd;
this.stnm = option.stnm;
this.grz = option.grz;
this.wrz = option.wrz;
this.afsltdz = option.afsltdz;
this.calFloodLev = option.calFloodLev;
this.flLowLimLev = option.flLowLimLev;
this.desFloodLev = option.desFloodLev;
this.resCode = option.resCode;
}
}
</script>
<style lang="scss" scoped>
.resviror-detail-box {
height: 100vh;
overflow: hidden;
position: relative;
.nav-bar {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 44px;
// margin-top: 30px;
// padding-top: 20px;
// padding-bottom: 10px;
border-bottom: 1px solid #dfdfdf;
// box-shadow: 0 5px 10px -8px #dfdfdf inset;
}
.title {
flex: 1;
text-align: center;
margin-right: 18px;
font-size: 18px;
}
.tab-bar {
// width: 100%;
display: flex;
justify-content: space-between;
padding: 5px 30px;
border-bottom: 1px solid #dfdfdf;
// overflow-x: auto;
}
.active {
color: #39a6ff;
}
.resviror-detail-content {
/* 最大高度比如占视口80%),内容超出才显示滚动条 */
height: 85vh;
/* 纵向滚动auto=超出显示scroll=始终显示 */
overflow-y: auto;
overflow-x: hidden;
/* 可选:如果元素是行内元素,需转为块级/行内块级 */
display: block;
}
}
</style>

View File

@ -0,0 +1,52 @@
<template>
<view class="jbxx-box">
<view class="jbxx-tabs">
<u-tabs
:list="list"
@click="tabsClick"
:scrollable="false"
:activeStyle="{
color: '#34a4fe',
}"
></u-tabs>
</view>
<view class="jbxx-content">
<Jbzz v-if = "status == 0" />
<view v-if="status == 1" class="gcgk">西</view>
<Krqx v-if="status == 2" stcd="3040" />
</view>
</view>
</template>
<script>
import Jbzz from './jbzz'
import Krqx from './krqx'
export default {
components: {
Jbzz,
Krqx
},
data() {
return {
list: [{ name: '基本资料' }, { name: '工程概况' }, { name: '库容曲线' }],
status:0
}
},
methods: {
tabsClick(e) {
this.status = e?.index;
}
}
}
</script>
<style lang="scss" scoped>
.jbxx-box{
padding: 5px;
.jbxx-tabs{
width: 100%;
background-color: #dff0f8;
}
.gcgk{
padding: 5px;
}
}
</style>

View File

@ -0,0 +1,161 @@
<template>
<view class="jbzz-box">
<!-- 行政区划 -->
<view class="region-section">
<text class="region-label">行政区划</text>
<text class="region-value">湖北省咸宁市赤壁市官塘镇</text>
</view>
<view class="project-des">
<view v-for="(item, index) in infoList" :key="index" class="info-item">
<view class="info-content">
<view class="circle-dot"></view>
<view class="label-name">
<text class="label-text">{{ item.label }}</text>
<text class="value-text">{{ item.value }}{{ item.unit }}</text>
</view>
</view>
</view>
</view>
</view>
</template>
<script>
const gmObj = {
"1": "大 (1)型",
"2": "大 (2)型",
"3": "中型",
"4": "小 (1)型",
"5": "小 (2)型",
"9": "其他",
}
export default {
data() {
return {
//
fieldConfig: [
{ label: '坝顶高程', field: 'bdgc', unit: 'm' },
{ label: '工程规模', field: 'engScal', unit: '' },
{ label: '校核洪水位', field: 'jyhsw', unit: 'm' },
{ label: '总库容', field: 'zkr', unit: '万m³' },
{ label: '设计洪水位', field: 'sjhsw', unit: 'm' },
{ label: '防洪库容', field: 'fhkr', unit: '万m³' },
{ label: '防洪高水位', field: 'fhgsw', unit: 'm' },
{ label: '兴利库容', field: 'xlkr', unit: '万m³' },
{ label: '正常蓄水位', field: 'zcxsw', unit: 'm' },
{ label: '调洪库容', field: 'thkr', unit: '万m³' },
{ label: '汛限水位', field: 'xxsw', unit: 'm' },
{ label: '集雨面积', field: 'jymj', unit: 'km²' },
{ label: '控制运行水位', field: 'kzyxsw', unit: 'm' },
{ label: '死水位', field: 'ssw', unit: 'm' },
{ label: '死库容', field: 'skr', unit: '万m³' }
],
//
apiData: {
bdgc: '80',
engScal: "2",
jyhsw: '78.44',
zkr: '1531',
sjhsw: '77.45',
fhkr: '359',
fhgsw: '76',
xlkr: null,
zcxsw: '76',
thkr: null,
xxsw: '75.3',
jymj: '2.1',
kzyxsw: '',
ssw: '',
skr: ''
}
}
},
computed: {
//
infoList() {
return this.fieldConfig.map(config => {
const value = config.field != 'engScal' ? this.apiData[config.field] : gmObj[this.apiData[config.field]];
return {
label: config.label,
value: value || '--',
unit: value ? config.unit : ''
}
})
}
}
}
</script>
<style lang="scss" scoped>
.jbzz-box {
padding: 20rpx;
background-color: #fff;
}
.region-section {
display: flex;
align-items: center;
margin-bottom: 12rpx;
}
.region-label {
font-size: 28rpx;
color: #999;
}
.region-value {
font-size: 28rpx;
color: #333;
font-weight: 500;
}
.project-des {
display: flex;
flex-wrap: wrap;
border: 1px solid #f2f2f2;
background-color: #ffffff;
padding: 0 10px;
max-height: calc(100vh - 210px);
overflow: auto;
}
.info-item {
width: 50%;
}
.info-content {
display: flex;
align-items: center;
margin: 15px 0;
}
.circle-dot {
width: 10px;
height: 10px;
border-radius: 50%;
background-color: #409eff;
margin-left: 10px;
flex-shrink: 0;
}
.label-name {
display: flex;
flex-direction: column;
align-items: center;
flex: 1;
}
.label-text {
opacity: 0.5;
text-align: center;
font-size: 26rpx;
margin-bottom: 8rpx;
}
.value-text {
font-size: 30rpx;
color: #333;
font-weight: 500;
}
</style>

View File

@ -0,0 +1,80 @@
import {GetInterval} from "../../../utils/tool"
export default function DrpOption(data) {
const maxVal = Math.ceil(Math.max(...data.map(obj => obj.rz)))
const minVal = Math.floor(Math.min(...data.map(obj => obj.rz)))
const maxValX = Math.max(...data.map(obj => obj.w))
const minValX = Math.min(...data.map(obj => obj.w))
let arr = []
data.forEach(item=>{
arr.push([item.w,item.rz])
})
let eopts = {
tooltip: {
trigger: 'axis',
},
grid: [
{
top: "12%",
left: "12%",
right: "18%",
bottom: "8%"
},
],
xAxis: [
{
name: "库容(万m³)",
nameGap: 5,
type: 'value',
min:Math.floor(minValX / 5) *5,
max:Math.ceil(maxValX / 5) *5,
interval:GetInterval(minValX,maxValX),
data: data.map(o => o.w),
splitLine: {
show: false
},
}
],
yAxis: [
{
type: 'value',
name: "库水位(m)",
minInterval:1,
splitLine: {
show: true,
lineStyle: {
color: '#07a6ff',
width: 0.25,
type: 'dotted'
}
},
axisLabel: {
color: '#333',
fontSize: 12,
},
axisLine: {
show: true
},
axisTick: {
show: true,
},
min: minVal,
max: maxVal
}
],
};
let chartData = {
series: [
{
type: 'line',
color: "#007AFD",
data: arr,
smooth: true
},
]
};
return {
eopts,
chartData
}
}

View File

@ -0,0 +1,81 @@
<template>
<view>
<view v-if="tableData.length != 0">
<view style="height: 250px">
<qiun-data-charts
:chartData="chartData.chartData"
:echartsApp="true"
:eopts="chartData.eopts"
/>
</view>
<view style="margin-top: 20px">
<Table :tableData="tableData" />
</view>
</view>
<view
style="
height: calc(100vh - 160px);
display: flex;
align-items: center;
justify-content: center;
background-color: #fff;
margin-top: 10px;
"
v-else
>
<image src="../../../../static//empty.png" mode=""></image>
</view>
</view>
</template>
<script>
import drpOptions from "./chartOptions.js";
import Table from "./jcsjTable.vue";
export default {
props: {
stcd: String,
default:""
},
components: {
Table,
},
data() {
return {
show: false,
chartData: {},
tableData: [],
};
},
methods: {
async getKrData() {
uni.showLoading({
title: "加载中...",
mask: true,
});
try {
const { data } = await uni.$http.get("/gunshiApp/xfflood/reservoir/water/zvarl?stcd="+this.stcd);
if (data.code == 200) {
this.tableData = [...data.data];
}
} catch (error) {
uni.$showMsg();
}
},
},
watch: {
tableData(n, o) {
if (n.length > 0) {
uni.hideLoading();
this.chartData = {
...drpOptions(n),
};
this.show = true;
}
},
},
mounted() {
this.getKrData();
},
};
</script>
<style lang="scss">
</style>

View File

@ -0,0 +1,77 @@
<template>
<view>
<div class="tableHead">
<div class="td t1">序号</div>
<div class="td t2">库水位(m)</div>
<div class="td t3">库容(万m³)</div>
</div>
<div class="tableBody">
<div v-for="(item, index) in tableData" class="tableRow">
<div class="td t1">{{ index + 1 }}</div>
<div class="td t2">{{ item.rz ? item.rz : "" }}</div>
<div class="td t3">{{ item.w}}</div>
</div>
<div :style="{ height: '80px' }">
</div>
</div>
</view>
</template>
<script>
import moment from "moment"
export default {
props:{
tableData:{
type:Array,
default:[],
}
},
}
</script>
<style lang="scss" scoped>
.tableHead {
width: 100%;
margin-top: 5px;
height: 50px;
background-color: #e4f2fe;
display: flex;
color: #208FEE;
}
.tableBody {
width: 100%;
height: calc(60vh - 200px);
// background-color: #f7f7f7; //#ffffff;
overflow-y: scroll;
}
.tableRow {
width: 100%;
height: 46px;
display: flex;
border-bottom: 1px solid #eee;
background-color: #ffffff;
}
.td {
text-align: center;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
}
.t1 {
width: 25%;
}
.t2 {
width: 50%;
}
.t3 {
width: 25%;
}
</style>

View File

@ -0,0 +1,127 @@
<template>
<view class="spjk-box">
<view class="select-bar">
<text style="margin-right: 10px;">监测点</text>
<uni-data-select
v-model="value"
:localdata="list"
@change="change"
:clear="false"
>
</uni-data-select>
</view>
<view class="video-box" >
<iframe :src="webURL" :class="{'normal': show == 0,'active': show == 1}" frameborder="0" ref="videoFrame" :allowfullscreen="true"></iframe>
</view>
</view>
</template>
<script>
export default {
props:{
stcd:String,
default:''
},
data() {
return {
value: 1,
list:[],
webURL:'',
show: 0,
showPop:false
}
},
methods: {
receiveRenderData(e){
//
console.log("3333",e.data)
this.show = e.data
},
async getList(){
try{
const {data} = await uni.$http.get(
`/gunshiApp/xfflood/stbprp/cctv/listByStcd/${this.stcd}`)
if(data.code == 200){
let newData = data.data.map(item => ({...item,value:item.camId,text:item.name}))
this.list = [...newData];
this.value = newData[0].value
this.getVideoSrc(newData[0].camId)
}
}catch(e){
uni.$showMsg()
}
},
async getVideoSrc(id){
try{
const {data} = await uni.$http.get(
`/gunshiApp/xfflood/xfCctvB/preview/${id}`)
if(data.code == 200){
this.webURL="./static/h5Player/webplayer.html?cameraIndexCode="+id+"&cameraUrl="+data.data
}
}catch(e){
uni.$showMsg()
}
},
change(e) {
console.log("e:", e);
this.getVideoSrc(e)
this.showPop = false;
},
},
mounted() {
this.getList()
},
}
</script>
<script module="renderModal" lang="renderjs">
export default {
data() {
return {
dom: '',
}
},
mounted() {
this.dom = document.getElementById('iframe')
// iframe
window.addEventListener('message', (e)=> {
var data = e.data;
this.emitData(data)
});
},
methods: {
emitData(e) {
this.$ownerInstance.callMethod('receiveRenderData',e)
},
},
}
</script>
<style lang="scss" scoped>
.spjk-box{
.select-bar{
display: flex;
align-items: center;
margin: 10px 15px;
}
.video-box{
.normal{
position: absolute;
// width: 370px;
// height: 300px;
top: 170px;
left: 0;
width: 100vw;
height: 100vh;
}
.active{
position: absolute;
width: 100vw;
height: 100vh;
top: -30px;
left: 0;
}
}
}
</style>

View File

@ -0,0 +1,195 @@
<template>
<view class="" style="padding: 5px;">
<txjc />
<view class="update-time">
<text style="color: #bfbfbf;">行政区划:</text>
<text>{{ info.adnm }}</text>
</view>
<view class="update-time">
<text style="color: #bfbfbf;">更新时间:</text>
<text>{{ info.tm }}</text>
</view>
<view class="sk-info">
<view class="sk-first-row">
<view class="first-item">
<text>{{ info.rz }}</text>
<text>水位</text>
</view>
<view class="first-item">
<text>{{ info.nowCap }}万m³</text>
<text>蓄水量</text>
</view>
<view class="first-line"></view>
<image style="width: 20px; height: 20px;" src="../../../static/images/first.jpg"></image>
</view>
<view class="sk-first-row">
<view class="first-item">
<text>{{ info.crestElev }}</text>
<text>坝顶高程</text>
</view>
<view class="first-item">
<text>{{ info.flLowLimLev }}万m³</text>
<text>正常水位</text>
</view>
<view class="first-item">
<text>{{ info.totCap }}万m³</text>
<text>总库容</text>
</view>
</view>
<view class="sk-second-row">
<view class="first-item">
<text>{{ rainInfo.today || '-' }}毫米</text>
<text>今日降雨</text>
</view>
<view class="first-item">
<text>{{ rainInfo.yesterdayDrp }}毫米</text>
<text>昨日降雨</text>
</view>
<view class="first-line" style="margin-right:17px"></view>
<image style="width: 20px; height: 20px;" src="../../../static/images/second.jpg"></image>
</view>
<view class="sk-thirst-row">
<view class=" sk-thirst-item" v-for="(item, index) in stationList" :key="index">
<!-- 站名支持自动换行 -->
<view class="sk-thirst-name">{{ item.name }}:</view>
<view style="margin: 0 20rpx;">123</view>
<view>时间:</view>
<view class="sk-thirst-time">{{ item.time }}</view>
</view>
</view>
</view>
<view class="real-water">
<!-- 实时水位 -->
<h4>实时水位</h4>
<sssw/>
</view>
<view class="real-water">
<h4>实时雨量</h4>
<ssyl/>
</view>
</view>
</template>
<script>
import txjc from './txjc.vue';
import sssw from './sssw.vue'
import ssyl from './ssyl.vue'
export default {
components: {
txjc,
sssw,
ssyl
},
data() {
return {
rainInfo: {
today: 0,
yesterdayDrp: 0
},
info: {
tm: '2026-04-13 15:09',
rz: '72.65',
nowCap: 790,
crestElev: '76',
flLowLimLev: '76',
totCap: 300,
adnm: '咸宁市'
},
stationList: [
{ name: "塘沽(东)站", time: "12:21(高平潮)", height: 199 },
{ name: "临港工业区站", time: "12:19(高平潮)", height: 198 },
{ name: "大神堂站 站名特别特别特别长长长长长长", time: "12:18(高平潮)", height: 197 },
{ name: "大港站", time: "12:15(高平潮)", height: 195 },
{ name: "南港工业区站", time: "12:10(高平潮)", height: 192 }
]
}
},
}
</script>
<style lang="scss" scoped>
.update-time {
display: flex;
// justify-content: space-between;
column-gap: 10px;
align-items: center;
padding: 5px 5px;
// border-bottom: 1px solid #dfdfdf;
}
.sk-info {
display: flex;
flex-direction: column;
padding: 2px 5px;
margin: 5px 0;
.sk-first-row,
.sk-second-row {
display: flex;
padding: 5px 10px;
align-items: center;
justify-content: space-around;
background-color: #f2fafc;
.first-line {
width: 3px;
height: 20px;
background-color: #c6eae6;
}
.first-item {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
}
.sk-second-row {
margin: 5px 0;
background-color: #f2f8ff;
padding: 5px 10px;
}
.sk-thirst-row {
background-color: #f2fafc;
padding: 5px 10px;
.sk-thirst-item {
display: flex;
align-items: center;
padding: 18rpx 0;
font-size: 28rpx;
}
/* 站名:自动换行、左边固定宽度 */
.sk-thirst-name {
width: 230rpx;
line-height: 1.2;
color: #333;
word-break: break-all;
/* 自动换行 */
white-space: pre-wrap;
}
/* 潮时:中间 */
.sk-thirst-time {
flex: 1;
text-align: center;
color: #666;
}
/* 潮高:右边 */
.sk-thirst-height {
width: 120rpx;
text-align: right;
color: #007aff;
font-weight: 500;
}
}
}
.real-water{
padding: 2px 5px;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,78 @@
<template>
<view class="sssw-box">
<view class="time-ranger">
<uni-datetime-picker
type="datetimerange"
v-model="tm"
@change="handleRanger"
@open="onPickerOpen"
hide-second
:clear-icon="false"
rangeSeparator="至"
></uni-datetime-picker>
<view class="select-bar">
<uni-data-select v-model="value" :localdata="list" @change="change" :clear="false">
</uni-data-select>
</view>
</view>
<view class="realWater-content">
<qiun-data-charts canvasId="myChart" type="line" :chartData="chartData.chartData" :echartsApp="true" :eopts="chartData.eopts" />
</view>
</view>
</template>
<script>
import moment from "moment"
import waterOptions from './swOption'
const stm = moment().subtract(1, 'days').set({minute: 0, second: 0}).format("YYYY-MM-DD HH:00:00");
const etm = moment().set({minute: 0, second: 0}).format("YYYY-MM-DD HH:00:00");
export default {
props:{
stcd:String,
resCode:String,
},
data() {
return {
tm:[stm,etm],
list:[],
value: "",
chartData: waterOptions(),
chartOpts: {
tooltip: {
show: true
},
},
}
},
methods: {
onPickerOpen() {
this.chartOpts.tooltip.show = false
},
handleRanger(e){
this.tm = [...e]
},
change(e) {
this.value = e;
this.chartOpts.tooltip.show = false
}
},
mounted() {
}
}
</script>
<style lang="scss" scoped>
.sssw-box {
.time-ranger {
margin: 10px 0;
}
.select-bar{
margin: 10px 0;
}
.realWater-content{
height: 320px;
}
}
</style>

View File

@ -0,0 +1,133 @@
<template>
<view class="sssw-box">
<view class="time-ranger">
<uni-datetime-picker type="datetimerange" v-model="tm" @change="handleRanger" @open="onPickerOpen" hide-second
:clear-icon="false" rangeSeparator="至"></uni-datetime-picker>
<view class="select-bar">
<uni-data-select v-model="value" :localdata="list" @change="change" :clear="false">
</uni-data-select>
</view>
</view>
<view class="realWater-content">
<qiun-data-charts canvasId="myChart1" type="line" :chartData="chartData.chartData" :echartsApp="true"
:eopts="chartData.eopts" />
</view>
<div class="tableHead">
<div class="td t1">序号</div>
<div class="td t2">时间</div>
<div class="td t3">实时雨量(mm)</div>
</div>
<div class="tableBody">
<div v-for="(item, index) in yllist" class="tableRow">
<div class="td t1">{{ index + 1 }}</div>
<div class="td t2">{{ item.tm ? item.tm.slice(0,16) : "" }}</div>
<div class="td t3">{{ item.drp === null ? '-' : item.drp }}</div>
</div>
<div :style="{ height: '80px' }">
</div>
</div>
</view>
</template>
<script>
import moment from "moment"
import waterOptions from './ylOption'
import { sw } from './mock'
const stm = moment().subtract(1, 'days').set({ minute: 0, second: 0 }).format("YYYY-MM-DD HH:00:00");
const etm = moment().set({ minute: 0, second: 0 }).format("YYYY-MM-DD HH:00:00");
export default {
props: {
stcd: String,
resCode: String,
},
data() {
return {
tm: [stm, etm],
list: [],
value: "",
chartData: waterOptions(),
yllist: sw,
chartOpts: {
tooltip: {
show: true
},
},
}
},
methods: {
onPickerOpen() {
this.chartOpts.tooltip.show = false
},
handleRanger(e) {
this.tm = [...e]
},
change(e) {
this.value = e;
this.chartOpts.tooltip.show = false
}
},
mounted() {
}
}
</script>
<style lang="scss" scoped>
.sssw-box {
.time-ranger {
margin: 10px 0;
}
.select-bar {
margin: 10px 0;
}
.realWater-content {
height: 320px;
}
.tableHead {
width: 100%;
margin-top: 5px;
height: 50px;
background-color: #e4f2fe;
display: flex;
color: #208FEE;
}
.tableBody {
width: 100%;
height: calc(100vh - 214px);
background-color: #f7f7f7; //#ffffff;
overflow-y: scroll;
}
.tableRow {
width: 100%;
height: 46px;
display: flex;
border-bottom: 1px solid #eee;
background-color: #ffffff;
}
.td {
text-align: center;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
}
.t1 {
width: 25%;
}
.t2 {
width: 50%;
}
.t3 {
width: 25%;
}
}
</style>

View File

@ -0,0 +1,193 @@
import echarts from 'echarts/lib/echarts';
import { sw } from './mock'
export default function DrpOption(
data = sw,
afsltdz,
flLowLimLev = 840.3,
desFloodLev = 843.23,
calFloodLev = 844.12) {
const maxVal = Math.max(...data.map(obj => obj.drp))
const maxSw = Math.ceil(Math.max(...data.map(obj => obj.rz)))
const minSw = Math.floor(Math.min(...data.map(obj => obj.rz)))
const maxKr = Math.max(...data.map(obj => obj.w))
const minKr = Math.min(...data.map(obj => obj.w))
console.log('desFloodLev', desFloodLev);
let eopts = {
tooltip: {
trigger: 'axis',
appendToBody: false,
className: 'echarts-tooltip'
},
grid: {
top: "15%",
left: "10%",
right: "10%",
bottom: "15%"
},
legend: {
show: true,
data: ["校核水位", '设计水位', '汛限水位', '水位', '库容'],
left: 'center',
top: 0,
itemWidth: 10,
padding: 0
},
xAxis: [
{
type: 'category',
data: data.map(o => o.tm.substr("2020-".length, 11)),
inverse: true,
splitLine: {
show: false
},
axisLabel: {
color: '#333',
fontSize: 12,
formatter: val => val.substr('2020-'.length, 11)
},
axisLine: {
lineStyle: {
color: '#07a6ff',
width: 0.5
}
},
axisTick: {
show: false
}
}
],
yAxis: [
{
type: 'value',
position: 'left',
name: '水位(m)',
splitLine: {
show: true,
lineStyle: {
color: '#07a6ff',
width: 0.25,
type: 'dotted'
}
},
axisLabel: {
color: '#333',
fontSize: 10
},
axisLine: {
show: true,
lineStyle: {
color: '#07a6ff',
width: 0.5
}
},
axisTick: {
show: true
},
min: minSw,
max: maxSw
},
{
type: 'value',
position: 'right',
name: '库容(万m³)',
splitLine: {
show: false
},
axisLabel: {
color: '#333',
fontSize: 10
},
axisLine: {
show: true,
lineStyle: {
color: '#07a6ff',
width: 0.5
}
},
axisTick: {
show: true
},
min: minKr,
max: maxKr
}
],
}
let chartData = {
series: [
{
yAxisIndex: 0,
name: '校核水位',
type: 'line',
color: '#D9001B',
lineStyle: {
type: 'dashed'
},
data: data.map(o => calFloodLev),
symbol: 'none',
showSymbol: false,
label: {
show: false
},
},
{
yAxisIndex: 0,
name: '设计水位',
type: 'line',
color: '#F59A23',
data: data.map(o => desFloodLev),
lineStyle: {
type: 'dashed'
},
symbol: 'none',
showSymbol: false,
label: {
show: false
},
},
{
yAxisIndex: 0,
name: '汛限水位',
type: 'line',
color: '#FDDC9F',
data: data.map(o => flLowLimLev),
lineStyle: {
type: 'dashed'
},
symbol: 'none',
showSymbol: false,
label: {
show: false
},
},
{
yAxisIndex: 0,
name: '水位',
type: 'line',
symbol: 'none',
showSymbol: false,
color: '#0AE0B5',
label: {
show: false
},
data: data.map(o => o.rz ? o.rz.toFixed(2) : null)
},
{
yAxisIndex: 1,
name: '库容',
type: 'line',
color: '#007AFD',
symbol: 'none',
showSymbol: false,
label: {
show: false
},
data: data.map(o => o.w)
}
],
}
return {
eopts,
chartData
}
}

View File

@ -0,0 +1,92 @@
<template>
<view class="image-preview-container">
<!-- 核心swiper 轮播容器实现左右滑动 -->
<swiper
class="swiper-box"
:current="currentIndex"
@change="onSwiperChange"
:indicator-dots="false"
>
<!-- 遍历图片数组生成每一张轮播项 -->
<swiper-item v-for="(item, index) in imageList" :key="index">
<image
class="preview-image"
:src="item"
mode="aspectFill"
@load="onImageLoad"
></image>
</swiper-item>
</swiper>
<!-- 自定义左上角页码指示器1/2 样式 -->
<view class="page-indicator">
{{ currentIndex + 1 }} / {{ imageList.length }}
</view>
</view>
</template>
<script>
export default {
name: "ImageSwiper",
data() {
return {
// /
imageList: [
"/static/images/first.jpg", // 1/2
"/static/images/my.png" //
],
currentIndex: 0, // 0
swiperHeight: 0 // swiper
};
},
methods: {
// swiper
onSwiperChange(e) {
this.currentIndex = e.detail.current;
},
// swiper
onImageLoad(e) {
const { width, height } = e.detail;
//
const systemInfo = uni.getSystemInfoSync();
const screenWidth = systemInfo.windowWidth;
const ratio = height / width;
this.swiperHeight = screenWidth * ratio;
}
}
};
</script>
<style scoped>
.image-preview-container {
position: relative; /* 让页码绝对定位生效 */
width: 100%;
}
.swiper-box {
width: 100%;
/* 固定高度写法(如果不需要自适应,直接写死高度) */
/* height: 750rpx; */
/* 自适应高度写法(根据图片高度自动适配) */
height: v-bind(swiperHeight + 'px');
background-color: #000; /* 图片背景黑底,更美观 */
}
.preview-image {
width: 100%;
height: 100%;
}
/* 左上角页码样式,完全匹配你截图的效果 */
.page-indicator {
position: absolute;
top: 20rpx;
left: 20rpx;
padding: 8rpx 16rpx;
background-color: rgba(0, 0, 0, 0.5); /* 半透明黑底 */
color: #fff;
font-size: 28rpx;
border-radius: 8rpx;
z-index: 999; /* 层级最高,不被图片遮挡 */
}
</style>

View File

@ -0,0 +1,99 @@
import echarts from 'echarts/lib/echarts';
import { sw } from './mock'
export default function DrpOption(data = sw) {
const maxVal = Math.max(...data.map(obj => obj.drp))
let eopts = {
tooltip: {
trigger: 'axis',
},
grid: {
top: "15%",
left: "10%",
right: "10%",
bottom: "15%"
},
legend: {
show: true,
data: ['降雨量'],
left: 'center',
top: 0,
itemWidth: 10,
padding: 0
},
xAxis: [
{
type: 'category',
data: data.map(o => o.tm.substr("2020-".length, 11)),
inverse: true,
splitLine: {
show: false
},
axisLabel: {
color: '#333',
fontSize: 12,
formatter: val => val.substr('2020-'.length, 11)
},
axisLine: {
lineStyle: {
color: '#07a6ff',
width: 0.5
}
},
axisTick: {
show: false
}
}
],
yAxis: [
{
type: 'value',
position: 'left',
name: '降雨量(mm)',
splitLine: {
show: true,
lineStyle: {
color: '#07a6ff',
width: 0.25,
type: 'dotted'
}
},
axisLabel: {
color: '#333',
fontSize: 10
},
axisLine: {
show: true,
lineStyle: {
color: '#07a6ff',
width: 0.5
}
},
axisTick: {
show: true
},
min: 0,
max: maxVal
},
],
}
let chartData = {
series: [
{
name: '降雨量',
type: 'bar',
barWidth: '60%',
data: data.map(o => o.drp).reverse(),
itemStyle: {
color: '#007AFD'
},
label: {
show: false
}
},
],
}
return {
eopts,
chartData
}
}

View File

@ -0,0 +1,161 @@
<template>
<view class="zrtx-box">
<view class="title" style="text-align: center; font-size: 20px; font-weight: bold;">
{{ dic }}
</view>
<view class="table_cur">
<table style="width:100%;display:block">
<tr>
<th style="width: 50px;">
姓名
</th>
<th style="width: 130px">单位</th>
<th style="width: 80px;">
职务
</th>
<th style="width: 100px;">
联系方式
</th>
</tr>
<tr>
<td style="width: 50px; white-space: nowrap;">{{ info.personName }}</td>
<td style="width: 130px; white-space: pre-wrap; line-height: 1.5;">{{ info.orgName }}</td>
<td style="width: 80px; white-space: nowrap;">{{ info.position }}</td>
<td style="width: 100px;color: #62bafa; white-space: nowrap;" @click="show = true">{{ info.tel }}</td>
</tr>
</table>
</view>
<u-action-sheet :actions="list" :title="title" :show="show" :description="info.tel" @select="selectClick"
:closeOnClickOverlay="true" :closeOnClickAction="true"></u-action-sheet>
</view>
</template>
<script>
import { repDict } from "../../utils/dicType.js"
export default {
props: {
info: Object,
default: {}
},
data() {
return {
show: false,
title: "",
list: [
{
name: '呼叫'
},
{
name: '复制'
},
{
name: '取消'
},
],
}
},
computed: {
dic() {
return repDict(this.info.repType)
}
},
methods: {
selectClick(obj) {
if (obj.name == "呼叫") {
uni.makePhoneCall({
phoneNumber: this.info.tel,
});
this.show = false
} else if (obj.name == "复制") {
uni.setClipboardData({
data: this.info.tel,
showToast: true
})
this.show = false
}
// else if(obj.name == ""){
// uni.addPhoneContact({
// lastName: this.info.personName.substr(0,1),
// firstName: this.info.personName.substr(1),
// mobilePhoneNumber: this.info.tel,
// success: function () {
// uni.$showMsg("")
// },
// fail: function () {
// console.log('fail');
// }
// });
// }
else {
this.show = false
}
}
}
}
</script>
<style lang="scss" scoped>
.zrtx-box {
border: 1px solid #c1f2ce;
border-radius: 2px;
padding: 10px 10px 5px 10px;
background-color: #ebfbef;
margin-bottom: 10px;
.table_div {
height: 100%;
max-width: calc(100% - 0px);
max-height: calc(100vh);
flex: 1;
padding-top: 0px;
overflow-x: scroll;
}
/*table样式*/
.table_cur {
margin-top: 20px;
width: 100%;
empty-cells: show;
border-collapse: collapse;
font-size: 14px;
}
.scroll-table {
height: calc(100vh - 125px);
overflow-y: auto;
width: '100%'
}
.table_cur tr {
display: flex;
align-items: center;
min-height: 65rpx;
}
.table_cur th {
height: 65rpx;
font-size: 14px;
// font-weight: bold;
font-weight: 100;
padding: 0px 10px;
box-sizing: border-box;
white-space: nowrap;
text-align: center !important;
}
.table_cur td {
min-height: 65rpx;
height: auto;
// border-bottom: 1px solid #d8ddeb;
font-size: 14px;
color: #2f4056;
padding: 10px;
box-sizing: border-box;
text-align: center !important;
vertical-align: middle;
word-break: break-all;
}
}
</style>

View File

@ -0,0 +1,55 @@
<template>
<view class="scroll-table">
<view v-for="(item,index) in list" :key="index" >
<Card :info="item" />
</view>
<view style="height:50px"></view>
</view>
</template>
<script>
import Card from "./card.vue"
export default {
props:{
resCode:String,
default:''
},
components:{
Card
},
data() {
return {
list:[]
}
},
methods: {
async getData(){
try{
const {data} = await uni.$http.post(
"/gunshiApp/xfflood/reservoir/water/safe/person",
{
resCode:this.resCode
})
console.log("data",data);
if(data.code == 200){
this.list = [...data.data];
}
}catch(e){
uni.$showMsg();
}
},
},
mounted() {
this.getData()
}
}
</script>
<style lang="scss" scoped>
.scroll-table{
height: calc(100vh - 100px);
overflow-y: auto;
width:100%;
}
</style>

View File

@ -51,6 +51,19 @@ export function restm (e) {
} }
return index return index
} }
export const GetInterval=(min,max,step=10)=>{
const distance = Math.ceil(max) - Math.floor(min)
console.log(distance);
let s = (distance / step);
console.log(s);
if (s > 5){
s = Math.ceil(s / 5) *5;
return s;
}else{
return Math.ceil(s)
}
}
export const adnmZhen = adcd => { export const adnmZhen = adcd => {
if (!adcd || !nameMap) { if (!adcd || !nameMap) {
return undefined return undefined

BIN
static/empty.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.3 KiB

BIN
static/images/first.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 887 B

BIN
static/images/second.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB