This commit is contained in:
yanran200730
2022-01-10 13:54:15 +08:00
9 changed files with 717 additions and 268 deletions

View File

@@ -0,0 +1,197 @@
<template>
<div class="AppEpidemicSituation">
<div class="header">
<img src="./components/img/header.png" alt="" />
<div class="content-info">
<div class="title">
<h2>实时数据统计</h2>
<div>截止2021-01-19</div>
</div>
<div class="tab-content">
<div class="tab-item">
<h2 class="color-5AAD6A">30446</h2>
<p>返乡人数</p>
</div>
<div class="tab-item">
<h2 class="color-4185F5">304</h2>
<p>今日新增返乡</p>
</div>
<div class="tab-item">
<h2 class="color-CD413A">3</h2>
<p>今日返乡异常</p>
</div>
<div class="tab-item">
<h2 class="color-5AAD6A">30446</h2>
<p>健康上报人数</p>
</div>
<div class="tab-item">
<h2 class="color-4185F5">46</h2>
<p>今日上报人数</p>
</div>
<div class="tab-item">
<h2 class="color-CD413A">0</h2>
<p>今日上报异常</p>
</div>
</div>
</div>
</div>
<div class="banner">
<img src="./components/img/fxry.png" alt="" class="mar-r18" />
<img src="./components/img/jkjc.png" alt="" @click="toHealth" />
</div>
<div class="echart-content">
<div class="title">返乡数据统计</div>
<div class="echart"></div>
<div class="type-text"><span class="tips bg-32C5FF"></span>新增返乡人数 <span class="tips bg-FFAA44"></span>新增异常人数</div>
</div>
</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
name: 'AppEpidemicSituation',
appName: '疫情防控',
data() {
return {}
},
computed: { ...mapState(['user']) },
onShow() {},
methods: {
toHealth(){
uni.navigateTo({
url:`./Health`
})
}
},
}
</script>
<style lang="scss" scoped>
.AppEpidemicSituation {
.header {
position: relative;
img {
width: 100%;
height: 504px;
}
.content-info {
width: calc(100% - 60px);
background: #fff;
box-shadow: 0px 4px 20px 0px rgba(0, 0, 0, 0.12);
border-radius: 8px;
position: absolute;
top: 368px;
left: 30px;
z-index: 99;
margin-bottom: 32px;
.title {
display: flex;
justify-content: space-between;
padding: 32px 32px 32px 48px;
h2 {
font-size: 36px;
font-family: PingFang-SC-Heavy, PingFang-SC;
font-weight: 800;
color: #333;
line-height: 50px;
}
div {
font-size: 26px;
font-family: PingFangSC-Regular, PingFang SC;
color: #999;
line-height: 36px;
}
}
.tab-content {
padding-bottom: 20px;
.tab-item {
display: inline-block;
width: 33%;
text-align: center;
margin-bottom: 32px;
h2 {
font-size: 52px;
font-family: DINAlternate-Bold, DINAlternate;
font-weight: bold;
line-height: 60px;
margin-bottom: 10px;
letter-spacing: -4px;
}
p {
font-size: 28px;
font-family: PingFangSC-Regular, PingFang SC;
color: #999;
line-height: 40px;
}
.color-5AAD6A {
color: #5aad6a;
}
.color-4185F5 {
color: #4185f5;
}
.color-CD413A {
color: #cd413a;
}
}
}
}
}
.banner {
width: 100%;
padding: 0 26px;
box-sizing: border-box;
margin: 306px 0 32px 0;
img {
width: calc(50% - 18px);
height: 136px;
}
.mar-r18 {
margin-right: 18px;
}
}
.echart-content {
width: 100%;
background-color: #fff;
padding: 0 32px 38px;
box-sizing: border-box;
.title {
font-size: 32px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333;
line-height: 96px;
margin-bottom: 16px;
}
.echart {
width: 100%;
height: 464px;
background: #f9f9f9;
border-radius: 8px;
margin-bottom: 32px;
}
.type-text {
font-size: 28px;
font-family: PingFangSC-Regular, PingFang SC;
color: #666;
line-height: 40px;
text-align: center;
.tips {
display: inline-block;
width: 16px;
height: 16px;
border-radius: 2px;
margin-right: 20px;
}
.bg-32C5FF {
background: #32c5ff;
}
.bg-FFAA44 {
background: #ffaa44;
margin-left: 80px;
}
}
}
}
</style>

View File

@@ -0,0 +1,238 @@
<template>
<div class="Health">
<div class="top">
<div class="topCard">
<div class="left">
<span class="num1">274</span>
<span class="hint">上报人员</span>
</div>
<div class="line"></div>
</div>
<div class="topCard">
<div class="left">
<span class="num2">274</span>
<span class="hint">上报人员</span>
</div>
<div class="line"></div>
</div>
<div class="topCard">
<div class="left">
<span class="num3">274</span>
<span class="hint">上报人员</span>
</div>
<div class="line"></div>
</div>
<div class="topCard">
<div class="left">
<span class="num4">274</span>
<span class="hint">上报人员</span>
</div>
</div>
</div>
<div class="line1"></div>
<div class="middle">
<div class="left">
<AiAreaPicker v-model="areaId" all :areaId="user.areaId" @select="areaSelect" :name.sync="areaName" style="color: #666">
<u-icon name="map-fill" color="#3192F4" size="20px" style="vertical-align: text-bottom"></u-icon>
<span style="margin-left: 4px" v-if="areaName">{{ areaName }}</span>
<span v-else>请选择</span>
<u-icon name="arrow-down" color="#666" size="28" style="margin-left: 4px" />
</AiAreaPicker>
</div>
<u-search v-model="keyword" :clearabled="true" placeholder="请输入标题" :show-action="false" bg-color="#F5F5F5" search-icon-color="#999" color="#999" height="58" @search="handerSearch" @clear="handerClear"></u-search>
</div>
<div class="line2"></div>
<div class="bottom">
<u-tabs :list="tabList" :is-scroll="false" :current="currentTabs" height="96" bg-color="#fff" inactive-color="#333 " active-color="#135AB8 " @change="change"></u-tabs>
<div class="line3"></div>
<template>
<!-- v-if="data.length" -->
<div class="templates" v-for="(item, i) in 10" :key="i" @click="goDetail()">
<!-- <img :src="" alt="" v-if='item.avatar'/> -->
<img src="./components/img/user-img.png" alt="" />
<div class="rightCont">
<div class="rightContLeft">1</div>
<u-icon name="arrow-right" color=""></u-icon>
</div>
</div>
</template>
<!-- <AiEmpty description="暂无数据" class="emptyWrap" v-else></AiEmpty> -->
</div>
</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
name: 'Health',
components: {},
props: {},
data() {
return {
keyword: '',
areaId: '',
areaName: '',
current: 1,
size: 10,
tabList: [
{
name: '上报人员',
},
{
name: '异常人员',
},
],
currentTabs: 0,
data: [],
}
},
computed: {
...mapState(['user']),
},
watch: {},
onLoad() {
this.areaId = this.user.areaId
this.areaName = this.user.areaName
},
onShow() {},
methods: {
goDetail() {},
change(index) {
// this.data = []
this.areaId = this.user.areaId
this.keyword = ''
this.currentTabs = index
this.current = 1
// this.getList()
},
handerSearch(e) {
this.keyword = e
// this.current = 1
// this.getList()
},
handerClear() {
this.keyword = ''
// this.current = 1
// this.getList()
},
},
}
</script>
<style scoped lang="scss">
.Health {
height: 100%;
background: #fff;
.top {
display: flex;
padding: 48px 32px;
// background: #fff;
.topCard {
display: flex;
.left {
display: flex;
flex-direction: column;
align-items: center;
padding: 0 28px;
font-size: 52px;
font-weight: bold;
.num1 {
color: #2c51ce;
}
.num2 {
color: #5aad6a;
}
.num3 {
color: #f5a319;
}
.num4 {
color: #cd413a;
}
.hint {
font-size: 28px;
color: #999999;
margin-top: 8px;
}
}
.line {
width: 1px;
background: black;
margin: 14px 0px;
}
}
}
.line1 {
height: 4px;
background: #f5f5f5;
}
.middle {
display: flex;
align-items: center;
padding: 24px 32px;
.left {
width: 40%;
display: flex;
align-items: center;
img {
width: 48px;
height: 48px;
}
}
}
.line2 {
height: 8px;
background: #f5f5f5;
}
.bottom {
.line3 {
height: 4px;
background: #f5f5f5;
}
.templates {
display: flex;
align-items: center;
padding: 32px;
box-shadow: inset 0px -1px 0px 0px #dddddd;
img {
width: 128px;
height: 128px;
// border-radius: 50%;
// border: 1px solid #cccccc;
}
.rightCont {
margin-left: 32px;
}
}
}
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 161 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@@ -237,7 +237,7 @@ export default {
width: 100%;
.addresss {
.u-form-item__body {
::v-deep .u-form-item__body {
.u-form-item--right {
.u-form-item--right__content {
.u-form-item--right__content__slot {
@@ -252,6 +252,11 @@ export default {
}
}
}
.u-form-item--right__content__icon {
.u-icon {
margin-bottom: 8px !important;
}
}
}
}
}

View File

@@ -1,78 +1,81 @@
<template>
<div class="Detail" v-if="pageShow" :class="[isAnnouncer && data.status === '0' && data.type === '0' ? 'detail-active' : '']">
<div class="detail-top">
<div flex class="w-100">
<div class="avatar" v-text="data.avatar" />
<div flex class="column start fill">
<b class="color-333" v-text="data.createUserName" />
<span class="color-999" v-text="data.createTime" />
</div>
<div class="statusTag" :class="{ over: data.status > 0 }" v-text="data.status == 0 ? (data.type == 0 ? '征集中' : '投票中') : $dict.getLabel('discussStatus', data.status)" />
</div>
<div class="header-middle">
<div class="contsnts">
<u-parse :html="data.content"></u-parse>
</div>
</div>
<div class="img-list" v-if="data.images && data.images.length">
<img :src="item.url" alt="" v-for="(item, index) in data.images" :key="index" @click="previewImage(data.images, item.url)" />
</div>
</div>
<div v-if="data.type == 0" class="comments">
<span class="totalCount">
<span class="total" v-text="`全部评论(${commentCount})`" />
<span class="rightCount">
<u-icon name="clock" v-if="data.status === '0'"></u-icon>
<u-count-down v-if="data.status === '0'" :timestamp="timestamp" separator="zh" show-days show-hours show-minutes show-seconds></u-count-down>
<span style="color: #999" v-else>已截止</span>
</span>
</span>
<div v-for="op in data.messages" :key="op.id">
<div flex class="header">
<u-avatar :src="op.avatar" size="48" />
<div flex class="fill">
<b v-text="op.createUserName" />
<span class="tags">{{ data.createUserId === op.createUserId ? '话事人' : '居民' }}</span>
<div class="details">
<div class="detail-top">
<div flex class="w-100">
<div class="avatar" v-text="data.avatar" />
<div flex class="column start fill">
<b class="color-333" v-text="data.createUserName" />
<span class="color-999" v-text="data.createTime" />
</div>
<u-icon name="thumb-up" :label="op.suport" :color="op.isSuport ? 'red' : '#ccc'" @click="like(op.id)" />
<div class="statusTag" :class="{ over: data.status > 0 }" v-text="data.status == 0 ? (data.type == 0 ? '征集中' : '投票中') : $dict.getLabel('discussStatus', data.status)" />
</div>
<div class="content" v-text="op.content" @click="adddeleShow(op.id)" />
<div class="content color-999" v-text="op.createTime" />
</div>
<AiEmpty v-if="!data.messages.length"></AiEmpty>
</div>
<div v-else-if="data.type == 1" class="comments">
<span class="totalCount">
<span class="total">{{ data.voteType === '1' ? '投票清单(可多选)' : '投票清单' }}</span>
<span class="rightCount">
<u-icon name="clock" v-if="data.status === '0'"></u-icon>
<u-count-down v-if="data.status === '0'" :timestamp="timestamp" separator="zh" show-days show-hours show-minutes show-seconds></u-count-down>
<span style="color: #999" v-else>已截止</span>
</span>
</span>
<div class="comments-vote">
<div class="vote-item" v-for="(item, index) in data.voteList" :key="index">
<div class="left">
<span>{{ item.item }}</span>
<span>{{ item.content }}</span>
<div class="header-middle">
<div class="contsnts">
<u-parse :html="data.content"></u-parse>
</div>
<i>{{ item.count }}</i>
<em :style="{ width: item.percentage }"></em>
</div>
<div class="img-list" v-if="data.images && data.images.length">
<img :src="item.url" alt="" v-for="(item, index) in data.images" :key="index" @click="previewImage(data.images, item.url)" />
</div>
</div>
</div>
<div class="votePeople" v-if="data.type === '1'">
<div class="leftPeople">{{ data.voteCount }}人参与投票</div>
<div v-if="data.type == 0" class="comments">
<span class="totalCount">
<span class="total" v-text="`全部评论(${commentCount})`" />
<span class="rightCount">
<u-icon name="clock" v-if="data.status === '0'"></u-icon>
<u-count-down v-if="data.status === '0'" :timestamp="timestamp" separator="zh" show-days show-hours show-minutes show-seconds></u-count-down>
<span style="color: #999" v-else>已截止</span>
</span>
</span>
<div v-for="op in data.messages" :key="op.id">
<div flex class="header">
<u-avatar :src="op.avatar" size="48" />
<div flex class="fill">
<b v-text="op.createUserName" />
<span class="tags">{{ data.createUserId === op.createUserId ? '话事人' : '居民' }}</span>
</div>
<u-icon name="thumb-up" :label="op.suport" :color="op.isSuport ? 'red' : '#ccc'" @click="like(op.id)" />
</div>
<div class="right">
<span @click="toUserList">查看详情</span>
<u-icon name="arrow-right" color="#999"></u-icon>
<div class="content" v-text="op.content" @click="adddeleShow(op.id)" />
<div class="content color-999" v-text="op.createTime" />
</div>
<AiEmpty v-if="!data.messages.length"></AiEmpty>
</div>
<div v-else-if="data.type == 1" class="comments">
<span class="totalCount">
<span class="total">{{ data.voteType === '1' ? '投票清单(可多选)' : '投票清单' }}</span>
<span class="rightCount">
<u-icon name="clock" v-if="data.status === '0'"></u-icon>
<u-count-down v-if="data.status === '0'" :timestamp="timestamp" separator="zh" show-days show-hours show-minutes show-seconds></u-count-down>
<span style="color: #999" v-else>已截止</span>
</span>
</span>
<div class="comments-vote">
<div class="vote-item" v-for="(item, index) in data.voteList" :key="index">
<div class="left">
<span>{{ item.item }}</span>
<span>{{ item.content }}</span>
</div>
<i>{{ item.count }}</i>
<em :style="{ width: item.percentage }"></em>
</div>
</div>
</div>
<div class="votePeople" v-if="data.type === '1'">
<div class="leftPeople">{{ data.voteCount }}人参与投票</div>
<div class="right">
<span @click="toUserList">查看详情</span>
<u-icon name="arrow-right" color="#999"></u-icon>
</div>
</div>
</div>
@@ -94,9 +97,10 @@
</u-popup>
<u-popup v-model="deleShow" mode="bottom" class="popupdele">
<div class="hint">删除我的评论</div>
<div class="hint">删除评论</div>
<div class="dele" @click="modalShow = true">删除</div>
<div @click="deleShow = false">取消</div>
<div class="liness"></div>
<div class="cancel" @click="deleShow = false">取消</div>
</u-popup>
<u-modal v-model="modalShow" content="确定删除该留言" :mask-close-able="true" @confirm="confirmDelete"></u-modal>
@@ -329,6 +333,7 @@ export default {
.Detail {
padding-bottom: 40px;
background: #f6f7f9;
height: 100%;
.end-btn {
position: fixed;
@@ -348,214 +353,217 @@ export default {
padding-bottom: 132px;
}
.detail-top {
padding: 30px;
background: #fff;
border-bottom: 16px solid #f6f7f9;
.details {
// padding-bottom: 112px;
.detail-top {
padding: 30px;
background: #fff;
border-bottom: 16px solid #f6f7f9;
.avatar {
height: 64px;
width: 64px;
color: #fff;
background: $uni-color-primary;
border-radius: 50%;
font-size: 24px;
.avatar {
height: 64px;
width: 64px;
color: #fff;
background: $uni-color-primary;
border-radius: 50%;
font-size: 24px;
text-align: center;
line-height: 64px;
margin-right: 16px;
}
.color-999 {
color: #999999;
}
.color-333 {
color: #333;
}
.w-100 {
width: 100%;
}
.statusTag {
padding: 0 12px;
line-height: 30px;
border: 1px solid #2573ff;
color: #2573ff;
font-size: 22px;
&.over {
border-color: #666;
color: #666;
}
}
.header-middle {
padding: 32px 0 48px 0;
.contsnts {
font-size: 26px;
line-height: 1.5;
word-break: break-all;
}
img {
margin-top: 30px;
width: 686px;
height: 486px;
}
}
.img-list {
img {
width: calc(33vw - 6px - 24px);
height: calc(33vw - 6px - 24px);
margin: 0 12px 12px 0;
&:nth-of-type(3n) {
margin-right: 0;
}
}
.title {
width: 100%;
line-height: 112px;
background: #fff;
font-size: 32px;
font-family: PingFangSC-Regular, PingFang SC;
color: #999;
}
}
}
.tags {
width: 80px;
height: 34px;
line-height: 34px;
margin-left: 16px;
text-align: center;
line-height: 64px;
margin-right: 16px;
color: #fff;
font-size: 24px;
background: #1aaaff;
border-radius: 8px;
}
.color-999 {
color: #999999;
}
.color-333 {
color: #333;
}
.w-100 {
::v-deep uni-video {
width: 100%;
}
.statusTag {
padding: 0 12px;
line-height: 30px;
border: 1px solid #2573ff;
color: #2573ff;
font-size: 22px;
.comments {
padding: 0 32px 20px;
font-size: 28px;
background: #fff;
&.over {
border-color: #666;
color: #666;
}
}
.header-middle {
padding: 32px 0 48px 0;
.contsnts {
font-size: 26px;
line-height: 1.5;
word-break: break-all;
}
img {
margin-top: 30px;
width: 686px;
height: 486px;
}
}
.img-list {
img {
width: calc(33vw - 6px - 24px);
height: calc(33vw - 6px - 24px);
margin: 0 12px 12px 0;
&:nth-of-type(3n) {
margin-right: 0;
}
}
.title {
width: 100%;
line-height: 112px;
background: #fff;
font-size: 32px;
font-family: PingFangSC-Regular, PingFang SC;
color: #999;
}
}
}
.tags {
width: 80px;
height: 34px;
line-height: 34px;
margin-left: 16px;
text-align: center;
color: #fff;
font-size: 24px;
background: #1aaaff;
border-radius: 8px;
}
::v-deep uni-video {
width: 100%;
}
.comments {
padding: 0 32px 20px;
font-size: 28px;
background: #fff;
.vote-item {
display: flex;
position: relative;
align-items: center;
justify-content: space-between;
padding: 24px 32px;
margin-bottom: 16px;
background: #ffffff;
border-radius: 8px;
overflow: hidden;
border: 1px solid #95cbff;
.left {
.vote-item {
display: flex;
flex: 1;
line-height: 1.2;
margin-right: 20px;
position: relative;
align-items: center;
justify-content: space-between;
padding: 24px 32px;
margin-bottom: 16px;
background: #ffffff;
border-radius: 8px;
overflow: hidden;
border: 1px solid #95cbff;
.left {
display: flex;
flex: 1;
line-height: 1.2;
margin-right: 20px;
span {
word-break: break-word;
&:first-child {
flex-shrink: 1;
}
&:last-child {
flex: 1;
}
}
}
em {
position: absolute;
left: 0;
top: 0;
z-index: 0;
height: 100%;
background: #dce8f4;
}
span {
word-break: break-word;
flex-shrink: 1;
position: relative;
z-index: 1;
color: #5b84b3;
font-size: 28px;
}
&:first-child {
flex-shrink: 1;
}
&:last-child {
flex: 1;
}
i {
position: relative;
z-index: 1;
font-style: normal;
color: #5b84b3;
font-size: 28px;
}
}
em {
position: absolute;
left: 0;
top: 0;
z-index: 0;
height: 100%;
background: #dce8f4;
.totalCount {
display: flex;
justify-content: space-between;
.total {
display: block;
font-size: 30px;
height: 120px;
box-sizing: border-box;
padding-top: 44px;
}
.rightCount {
padding-top: 44px;
}
}
span {
flex-shrink: 1;
position: relative;
z-index: 1;
color: #5b84b3;
font-size: 28px;
.u-avatar {
margin-right: 24px;
}
i {
position: relative;
z-index: 1;
font-style: normal;
color: #5b84b3;
font-size: 28px;
.content {
color: #333;
margin-left: 72px;
margin-top: 10px;
&.color-999 {
color: #999999;
font-size: 24px;
margin-bottom: 48px;
}
}
}
.totalCount {
.votePeople {
display: flex;
align-items: center;
justify-content: space-between;
.total {
display: block;
font-size: 30px;
height: 120px;
box-sizing: border-box;
padding-top: 44px;
}
.rightCount {
padding-top: 44px;
}
}
.u-avatar {
margin-right: 24px;
}
.content {
color: #333;
margin-left: 72px;
margin-top: 10px;
&.color-999 {
color: #999999;
font-size: 24px;
margin-bottom: 48px;
}
}
}
.votePeople {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 16px;
height: 112px;
padding: 0 32px 0 52px;
background: #fff;
.leftPeople {
font-size: 28px;
color: #333;
}
.right {
span {
color: #2573ff;
margin-top: 16px;
height: 112px;
padding: 0 32px 0 52px;
background: #fff;
.leftPeople {
font-size: 28px;
color: #333;
}
.right {
span {
color: #2573ff;
font-size: 28px;
}
}
}
}
@@ -637,26 +645,28 @@ export default {
border-radius: 24px 24px 0px 0px;
text-align: center;
.hint {
padding-top: 40px;
padding: 40px 0 44px 0;
border-bottom: 1px solid #e7e8e9;
font-size: 24px;
color: #666666;
font-size: 24px;
color: #666666;
}
div {
padding: 10px 0;
color: #666666;
.dele {
padding: 24px 0 28px 0;
font-size: 32px;
color: #c25450;
}
.liness {
height: 12px;
background: #f6f7f8;
}
.cancel {
padding: 24px 0 62px 0;
font-size: 32px;
color: #333333;
}
}
}
// ::v-deep .u-drawer {
// .u-drawer-content {
// .u-drawer__scroll-view {
// .uni-scroll-view {
// // overflow: hidden;
// overflow: inherit !important;
// }
// }
// }
// }
}
</style>

View File

@@ -77,7 +77,6 @@ uni-page-body {
.datas {
display: flex;
padding: 20px 32px 0 32px;
.avatLeft {
@@ -94,7 +93,7 @@ uni-page-body {
}
.right {
border-bottom: 1px solid #ddd;
width: 100%;
width: calc(100% - 90px);
margin: 10px 0 0 16px;
padding-bottom: 32px;
.top {