Files
dvcp_v2_webapp/project/xiushan/apps/AppConsole/AppConsole.vue
2023-03-02 11:17:19 +08:00

561 lines
12 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<section class="AppConsole">
<div class="top">
<div class="left">
<!-- <img :src="user.info.avatar"> -->
<div class="user">
<h2 class="mar-b10">您好{{ user.info.name }}欢迎回来</h2>
<p v-if="user.financeUser" v-text="financeInfo"/>
<span>上次登录时间{{ user.info.lastLoginTime }}</span>
</div>
</div>
<div class="right">
<div class="right-item" v-for="row in info" :key="row.name" @click="$router.push({name:row.menuId,query:{status:row.dictValue}})">
<div class="top">
<i v-if="row.countNumber>0"/>
<span v-text="row.name"/>
</div>
<h2 v-text="row.countNumber"/>
</div>
</div>
</div>
<div class="middle fill" v-if="!isFinanceUser">
<div class="left">
<div class="title">
<h2>群众留言</h2>
<div @click="$router.push({name:routeNames.AppMassMessage})">
<span>全部留言</span>
<img src="./assets/right.png">
</div>
</div>
<div class="list">
<div class="comment-item" v-for="(item, index) in comments" :key="index"
@click="$router.push({name:routeNames.AppMassMessage,query:{id:item.id}})">
<h3>{{ item.title }}</h3>
<div class="comment-item__bottom">
<span>{{ dict.getLabel('leaveMessageType', item.type) }}</span>
<i>{{ item.createTime }}</i>
</div>
</div>
<ai-empty class="w100" v-if="!comments.length"/>
</div>
</div>
<div class="right fill">
<div class="title">
<h2>政策动态</h2>
<div @click="$router.push({name:routeNames.AppNewsCenter})">
<span>全部动态</span>
<img src="./assets/right.png">
</div>
</div>
<div class="list">
<div class="dynamic-item" v-for="(item, index) in news" :key="index" @click="$router.push({
name: routeNames.AppNewsCenter,
query: {
id: item.id
},
hash: '#' + (item.type === '0' ? 'news' : 'video')
})">
<i></i>
<div class="dynamic-item__right">
<h3>{{ item.title }}</h3>
<p>{{ item.createTime }}</p>
</div>
</div>
<ai-empty class="w100" v-if="!news.length"></ai-empty>
</div>
</div>
</div>
<div class="bottom fill" v-else>
<div class="title">
<h2>需求抢单</h2>
<div @click="$router.push({name:routeNames.AppFinancingNeeds})">
<span>查看全部</span>
<img src="./assets/right.png">
</div>
</div>
<div class="list">
<div class="item" v-for="(item, index) in list" :key="index">
<div class="item-top">
<div class="item-top__left fill">
<h2 class="nowrap">{{ item.enterpriseName || item.name }}</h2>
<p>{{ item.areaName }}</p>
</div>
<img @click="$router.push({name:routeNames.AppFinancingNeeds,query:{id:item.id}})"
src="./assets/qd.png">
</div>
<div class="item-bottom">
<div class="item-bottom__item">
<span>需求金额</span>
<h3>{{ item.loanAmount }}</h3>
</div>
<div class="item-bottom__item">
<span>使用时长</span>
<h3 v-text="dict.getLabel('productRepaymentTimeline',item.hopeLifespan)"/>
</div>
</div>
</div>
<ai-empty class="pad-b48 w100" v-if="!list.length"/>
</div>
</div>
</section>
</template>
<script>
import {mapState} from "vuex";
export default {
name: "AppConsole",
label: "工作台",
props: {
instance: Function,
dict: Object,
permissions: Function
},
computed: {
...mapState(['user']),
isFinanceUser() {
return !!this.user?.financeUser?.id
},
financeInfo() {
let {organizationName, userRole} = this.user.financeUser
return [organizationName, this.dict.getLabel("financialOrganizationUserRole", userRole)].join(" | ")
},
routeNames() {
return {
AppMassMessage: "c66857ca597f49aab9c1aeb8a8e3e7c0",
AppNewsCenter: '6a56c8fdb09a437098f837a03a5fccb0',
AppFinancingNeeds: "27338cb83e77461dbd44356a6760df85",
}
}
},
data() {
return {
comments: [],
news: [],
list: [],
info: {}
}
},
created() {
this.dict.load('leaveMessageType', 'financialOrganizationUserRole', 'productRepaymentTimeline').then(() => {
this.getComments()
this.getNewsList()
this.getList()
this.getInfo()
})
},
methods: {
getComments() {
this.instance.post('/app/appleavemessage/list?current=1&size=10').then(res => {
if (res?.data) {
this.comments = res.data.records
}
})
},
getInfo() {
this.instance.post("/app/todo/queryToDoList").then(res => {
if (res?.data) {
this.info = res.data
}
})
},
getNewsList() {
this.instance.post('/app/appnews/list?current=1&size=10').then(res => {
if (res?.data) {
this.news = res.data.records
}
})
},
getList() {
this.instance.post('/app/appfinancingdemand/list?current=1&size=8', null, {
params: {status: 0}
}).then(res => {
if (res?.data) {
this.list = res.data.records
}
})
}
}
}
</script>
<style lang="scss" scoped>
.AppConsole {
height: 100%;
margin-bottom: 20px;
padding: 0 20px;
overflow-y: auto;
display: flex;
flex-direction: column;
background: #f3f6f9;
.w100 {
width: 100%;
}
.item-top__left {
width: 100%;
}
.nowrap {
width: 100%;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.title {
display: flex;
align-items: center;
justify-content: space-between;
height: 56px;
h2 {
color: #222222;
font-size: 16px;
font-weight: 600;
}
div {
display: flex;
align-items: center;
cursor: pointer;
&:hover {
opacity: 0.6;
}
span {
margin-right: 4px;
color: #999999;
font-size: 14px;
}
img {
width: 16px;
}
}
}
* {
box-sizing: border-box;
}
& > .top {
display: flex;
align-items: center;
justify-content: space-between;
height: 152px;
margin: 20px 0;
padding: 0 40px 0 16px;
background: #FFFFFF;
box-shadow: 0 4px 6px -2px rgba(15, 15, 21, 0.15);
border-radius: 2px;
.left {
display: flex;
img {
width: 64px;
height: 64px;
margin-right: 16px;
border-radius: 50%;
}
h2 {
font-size: 22px;
font-weight: 600;
color: #333333;
line-height: 30px;
}
span {
color: #666666;
font-size: 14px;
}
p {
margin: 0 0 8px;
color: #46669D;
font-size: 14px;
}
}
.right {
display: flex;
align-items: center;
.right-item {
margin-right: 64px;
text-align: right;
cursor: pointer;
&:last-child {
margin-right: 0;
}
h2 {
font-size: 32px;
color: #222;
}
.top {
display: flex;
align-items: center;
margin-bottom: 12px;
i {
width: 6px;
height: 6px;
margin-right: 8px;
border-radius: 50%;
background: #FA9D50;
}
span {
color: #666666;
font-size: 16px;
}
}
}
}
}
.middle {
display: flex;
margin-bottom: 20px;
.left {
width: 480px;
padding: 0 16px 16px;
overflow: hidden;
background: #FFFFFF;
box-shadow: 0 4px 6px -2px rgba(15, 15, 21, 0.15);
border-radius: 4px;
.comment-item {
padding: 16px 0;
border-bottom: 1px solid #EEEEEE;
&:first-child {
padding-top: 0;
}
&:last-child {
border: none;
}
h3 {
line-height: 1.2;
margin-bottom: 8px;
color: #333333;
font-size: 16px;
font-weight: normal;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
cursor: pointer;
&:hover {
color: #2266FF;
text-decoration: underline;
}
}
div {
display: flex;
align-items: center;
i {
color: #999999;
font-size: 14px;
font-style: normal;
}
span {
height: 20px;
margin-right: 8px;
padding: 0 8px;
color: #2266FF;
font-size: 12px;
background: #E8EFFF;
border-radius: 4px;
}
}
}
}
.list {
height: calc(100% - 56px);
overflow-y: auto;
}
.right {
margin-left: 20px;
padding: 0 16px 16px;
overflow: hidden;
background: #FFFFFF;
box-shadow: 0 4px 6px -2px rgba(15, 15, 21, 0.15);
border-radius: 4px;
.dynamic-item {
display: flex;
padding: 16px 0;
border-bottom: 1px solid #EEEEEE;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
&:first-child {
padding-top: 0;
}
&:last-child {
border: none;
}
i {
position: relative;
top: 8px;
width: 8px;
height: 8px;
margin-right: 8px;
border-radius: 50%;
border: 2px solid #2266FF;
}
.dynamic-item__right {
flex: 1;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
h3 {
color: #333;
font-size: 16px;
font-weight: 600;
margin-bottom: 8px;
cursor: pointer;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
&:hover {
color: #2266FF;
text-decoration: underline;
}
}
p {
color: #999999;
font-size: 14px;
}
}
}
}
}
.bottom {
margin-bottom: 20px;
padding: 0 16px 20px;
background: #FFFFFF;
box-shadow: 0 4px 6px -2px rgba(15, 15, 21, 0.15);
border-radius: 4px;
.list {
display: flex;
align-items: center;
flex-wrap: wrap;
}
.item {
width: 372px;
height: 132px;
margin-bottom: 16px;
margin-right: 16px;
background: #FFFFFF;
box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.02);
border-radius: 12px;
border: 1px solid #EEEEEE;
// &:nth-of-type(3n) {
// margin-right: 0;
// }
.item-bottom {
display: flex;
align-items: center;
height: 56px;
.item-bottom__item {
display: flex;
position: relative;
align-items: center;
justify-content: center;
flex: 1;
&:first-child::after {
position: absolute;
right: 0;
top: 50%;
z-index: 1;
width: 1px;
height: 24px;
background: #EEEEEE;
transform: translateY(-50%);
content: ' ';
}
span {
margin-right: 12px;
color: #999999;
font-size: 14px;
}
h3 {
color: #333333;
font-size: 16px;
font-weight: 600;
}
}
}
.item-top {
display: flex;
align-items: center;
justify-content: space-between;
height: 76px;
padding: 0 16px;
border-bottom: 1px solid #EEEEEE;
h2 {
margin-bottom: 8px;
color: #333333;
font-size: 17px;
font-weight: normal;
}
p {
color: #999999;
font-size: 14px;
}
img {
width: 60px;
height: 60px;
cursor: pointer;
&:hover {
opacity: 0.6;
}
}
}
}
}
}
</style>