工作台入库
This commit is contained in:
505
packages/extra/AppConsole/AppConsole.vue
Normal file
505
packages/extra/AppConsole/AppConsole.vue
Normal file
@@ -0,0 +1,505 @@
|
||||
<template>
|
||||
<section class="AppConsole">
|
||||
<el-row type="flex" class="header-text">
|
||||
<el-row style="width: 392px" type="flex" align="middle">
|
||||
<i class="iconfont iconDate1"/>
|
||||
<span v-text="`今天是 ${$moment().format('YYYY年M月D日 dddd')}`"/>
|
||||
</el-row>
|
||||
<el-row type="flex" align="middle" class="notice fill">
|
||||
<el-button type="primary" icon="iconfont iconNotice">通知公告</el-button>
|
||||
<div class="notice-content nowarp-text fill">
|
||||
<el-carousel ref="noticeCarousel" height="32px" direction="vertical" indicator-position="none">
|
||||
<template v-if="noticeList.length">
|
||||
<el-carousel-item v-for="(notice,i) in noticeList" :key="i">
|
||||
<div style="text-align: left">{{ notice.title }}</div>
|
||||
</el-carousel-item>
|
||||
</template>
|
||||
<el-carousel-item v-else style="text-align: left">暂无通知</el-carousel-item>
|
||||
</el-carousel>
|
||||
</div>
|
||||
<el-button type="text" style="color:rgba(153,153,153,1)" @click="$router.push({name:'通知公告'})">更多</el-button>
|
||||
<el-button type="text" style="color:rgba(153,153,153,1);margin-left: 0;padding: 8px 0"
|
||||
icon="iconfont iconTriangle_Up" @click="$refs.noticeCarousel.prev()"></el-button>
|
||||
<el-button type="text" style="color:rgba(153,153,153,1);margin-left: 0;padding: 8px 8px 8px 0"
|
||||
icon="iconfont iconTriangle_Down" @click="$refs.noticeCarousel.next()"></el-button>
|
||||
</el-row>
|
||||
</el-row>
|
||||
<div class="main-console">
|
||||
<el-row type="flex">
|
||||
<!--用户信息卡片-->
|
||||
<div class="card-panel userinfo-panel">
|
||||
<el-row type="flex" class="top-panel" align="middle">
|
||||
<div class="avatar">
|
||||
<el-avatar :size="64" :src="user.info.avatar">
|
||||
{{ defaultAvatar }}
|
||||
</el-avatar>
|
||||
</div>
|
||||
<el-row type="flex" justify="space-between" align="middle">
|
||||
<div class="basic-info">
|
||||
{{ $moment().format("A") + "好," + user.info.name }}
|
||||
<br>{{ welcomeWord() }}
|
||||
</div>
|
||||
<el-button type="text" @click="$router.push({name:'个人中心'})">
|
||||
个人中心 <i class="iconfont iconArrow_Right"/></el-button>
|
||||
</el-row>
|
||||
</el-row>
|
||||
<div class="user-info-panel">
|
||||
<li>
|
||||
<div>所属单位</div>
|
||||
{{ user.info.unitName }}
|
||||
</li>
|
||||
<li>
|
||||
<div>当前职务</div>
|
||||
{{ user.info.position }}
|
||||
</li>
|
||||
<li>
|
||||
<div>所属党组织</div>
|
||||
{{ user.info.organizationName }}
|
||||
</li>
|
||||
<li>
|
||||
<div>上次登录</div>
|
||||
<span style="color: #2266ff">{{ user.info.lastLoginTime }}</span></li>
|
||||
</div>
|
||||
</div>
|
||||
<div class="fill mar-l20 topLeft">
|
||||
<el-row type="flex" justify="space-between">
|
||||
<div class="data-panel-area">
|
||||
<div class="card-panel data-panel" @click="$router.push({name:'待办事项'})">
|
||||
<div class="item-label">
|
||||
<svg class="icon" aria-hidden="true">
|
||||
<use xlink:href="#iconBacklog"></use>
|
||||
</svg>
|
||||
<div style="margin-left: 8px">待办事项</div>
|
||||
</div>
|
||||
<b style="font-size: 20px">{{ todoTotal }}</b>
|
||||
</div>
|
||||
</div>
|
||||
<div class="data-panel-area">
|
||||
<div class="card-panel data-panel" @click="$router.push({name:'消息中心'})">
|
||||
<div class="item-label">
|
||||
<svg class="icon" aria-hidden="true">
|
||||
<use xlink:href="#iconUnread_message"></use>
|
||||
</svg>
|
||||
<div style="margin-left: 8px">未读消息</div>
|
||||
</div>
|
||||
<b style="font-size: 20px">{{ msgTotal }}</b>
|
||||
</div>
|
||||
</div>
|
||||
<div class="data-panel-area">
|
||||
<div class="card-panel data-panel"
|
||||
@click="$router.push({name:'33',query:{listType: 1,meetingStatus: 1}})">
|
||||
<div class="item-label">
|
||||
<svg class="icon" aria-hidden="true">
|
||||
<use xlink:href="#iconAttend_The_Meeting"></use>
|
||||
</svg>
|
||||
<div style="margin-left: 8px">待参加会议</div>
|
||||
</div>
|
||||
<b style="font-size: 20px">{{ conferenceTotal }}</b>
|
||||
</div>
|
||||
</div>
|
||||
</el-row>
|
||||
<ai-card title="待办事项" class="mar-t20 fill">
|
||||
<template #content>
|
||||
<el-row type="flex">
|
||||
<el-col :span="3" class="todo-item" v-for="(todo,i) in todoList" :key="i"
|
||||
@click.native="$router.push({name:$dict.getLabel('todoFrom',todo.type),query:$dict.getLabel('todoParams',todo.type)})">
|
||||
<div style="width: 48px;margin: 8px auto 0">
|
||||
<el-badge type="warning" :value="todo.count">
|
||||
<svg class="icon" aria-hidden="true">
|
||||
<use :xlink:href="$dict.getLabel('todoIcon',todo.type)"></use>
|
||||
</svg>
|
||||
</el-badge>
|
||||
</div>
|
||||
<div class="item-label">{{ $dict.getLabel("todoFrom", todo.type) }}</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</template>
|
||||
</ai-card>
|
||||
</div>
|
||||
</el-row>
|
||||
<el-row type="flex" class="conference-and-message">
|
||||
<ai-card title="未读消息" class="fill">
|
||||
<template #right>
|
||||
<el-button type="text" @click="$router.push({name:'消息中心'})">消息中心<i class="iconfont iconArrow_Right"/></el-button>
|
||||
</template>
|
||||
<template #content>
|
||||
<div class="unread-message-list">
|
||||
<li v-for="(msg,i) in msgList" :key="i" class="nowarp-text">
|
||||
<div class="list-type"> </div>
|
||||
<div style="width: calc(100% - 16px)">
|
||||
<p class="nowarp-text">{{ msg.content }}</p>
|
||||
<span style="color: #26f" v-text="`[${msg.title}]`"/><span style="color:#999" v-text="msg.receiveTime"/>
|
||||
</div>
|
||||
</li>
|
||||
<ai-empty v-if="!msgList.length">暂无消息</ai-empty>
|
||||
</div>
|
||||
</template>
|
||||
</ai-card>
|
||||
<ai-card title="我的会议" class="fill">
|
||||
<template #right>
|
||||
<el-button type="text" @click="$router.push({name:'33'})">更多会议<i class="iconfont iconArrow_Right"/></el-button>
|
||||
</template>
|
||||
<template #content>
|
||||
<div class="conference-list">
|
||||
<li v-for="(item,i) in conferenceList" :key="i" @click="$router.push({name:'33',query:{listType: 1,meetingStatus: 1,confirmStatus:1}})">
|
||||
<div class="list-type"></div>
|
||||
<div>
|
||||
<span>{{ item.title }}</span><br>
|
||||
<span
|
||||
style="color:#999">{{
|
||||
[$moment(item.startTime).format("YYYY-MM-DD hh:mm"), item.address].join(" ")
|
||||
}}</span>
|
||||
</div>
|
||||
</li>
|
||||
</div>
|
||||
<ai-empty v-if="!conferenceList.length">暂无会议</ai-empty>
|
||||
</template>
|
||||
</ai-card>
|
||||
</el-row>
|
||||
</div>
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {mapState} from "vuex";
|
||||
|
||||
export default {
|
||||
name: "AppConsole",
|
||||
label: "工作台",
|
||||
computed: {
|
||||
...mapState(['user']),
|
||||
defaultAvatar() {
|
||||
return this.user.info.name?.slice(-2) || "游客"
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
todoList: [],
|
||||
todoTotal: 0,
|
||||
msgList: [],
|
||||
msgTotal: 0,
|
||||
conferenceList: [],
|
||||
conferenceTotal: 0,
|
||||
noticeList: []
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getTodoList() {
|
||||
this.$request.post("/message/systodolist/type-count").then(res => {
|
||||
this.todoList = res.data.list
|
||||
this.todoTotal = res.data.total
|
||||
})
|
||||
},
|
||||
getUnreadMessage() {
|
||||
this.$request.post("/message/appmessage/list", null, {
|
||||
params: {readStatus: 0}
|
||||
}).then(res => {
|
||||
this.msgList = res.data.records
|
||||
this.msgTotal = res.data.total
|
||||
})
|
||||
},
|
||||
getConferences() {
|
||||
this.$request.post("/app/appmeetinginfo/list", null, {
|
||||
params: {listType: 1, meetingStatus: 1}
|
||||
}).then(res => {
|
||||
this.conferenceList = res.data.records
|
||||
this.conferenceTotal = res.data.total
|
||||
})
|
||||
},
|
||||
getNotice() {
|
||||
this.$request.post("/app/appannouncement/list-latest", null, {
|
||||
params: {
|
||||
areaId: this.user.info.areaId,
|
||||
current: 1,
|
||||
size: 3
|
||||
}
|
||||
}).then(res => {
|
||||
this.noticeList = res.data.records
|
||||
})
|
||||
},
|
||||
welcomeWord() {
|
||||
let word = "", hour = this.$moment().hour()
|
||||
if (hour < 6) {
|
||||
word = "你来的似乎有点早~"
|
||||
} else if (hour < 9) {
|
||||
word = "又是愉快的一天!"
|
||||
} else if (hour < 12) {
|
||||
word = "好好工作!"
|
||||
} else if (hour < 14) {
|
||||
word = "养精蓄锐,以逸待劳!"
|
||||
} else if (hour < 17) {
|
||||
word = "欢迎回来!"
|
||||
} else if (hour < 19) {
|
||||
word = "要按时下班哦~"
|
||||
} else if (hour < 22) {
|
||||
word = "忙碌了一天,注意休息~"
|
||||
} else {
|
||||
word = "夜深了,该休息了~"
|
||||
}
|
||||
return word;
|
||||
}
|
||||
},
|
||||
create() {
|
||||
this.$dict.load("todoFrom", "todoIcon", "todoParams")
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.icon {
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
vertical-align: -0.15em;
|
||||
fill: currentColor;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.AppConsole {
|
||||
.header-text {
|
||||
font-weight: normal;
|
||||
color: #333333;
|
||||
padding: 0 calc(50% - 580px);
|
||||
background: #fff;
|
||||
|
||||
|
||||
span {
|
||||
font-size: 14px;
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.notice {
|
||||
margin: 8px auto;
|
||||
background: rgba(247, 247, 247, 1);
|
||||
border-radius: 2px;
|
||||
border: 1px solid rgba(221, 221, 221, 1);
|
||||
text-align: center;
|
||||
height: 32px;
|
||||
font-size: 14px;
|
||||
|
||||
.label {
|
||||
padding: 0 8px;
|
||||
min-width: 112px;
|
||||
color: white;
|
||||
background: rgba(34, 102, 255, 1);
|
||||
border-radius: 2px 0 0 2px;
|
||||
line-height: 32px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.notice-content {
|
||||
padding: 0 8px;
|
||||
color: rgba(51, 51, 51, 1);
|
||||
line-height: 32px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.topLeft {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.ai-card:last-of-type {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.main-console {
|
||||
height: calc(100% - 92px);
|
||||
padding: 20px 20px 24px;
|
||||
width: 1200px;
|
||||
margin: auto;
|
||||
|
||||
.userinfo-panel {
|
||||
min-width: 372px;
|
||||
|
||||
.top-panel {
|
||||
padding: 0 16px;
|
||||
background-image: url("./assets/bg_prolife.png");
|
||||
background-size: 100%;
|
||||
background-repeat: no-repeat;
|
||||
|
||||
::v-deep .avatar {
|
||||
padding: 8px;
|
||||
width: initial;
|
||||
height: initial;
|
||||
border-radius: 50%;
|
||||
border: 2px solid rgba(34, 102, 255, 0.5);
|
||||
background: white;
|
||||
font-size: 24px;
|
||||
box-sizing: border-box;
|
||||
margin-right: 8px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
||||
img {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.el-avatar:hover {
|
||||
animation: rotate 15s ease-in-out;
|
||||
}
|
||||
}
|
||||
|
||||
.basic-info {
|
||||
font-size: 16px;
|
||||
color: rgba(51, 51, 51, 1);
|
||||
line-height: 24px;
|
||||
margin: 36px 0;
|
||||
}
|
||||
|
||||
.el-row {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
|
||||
.el-button {
|
||||
color: #999;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.user-info-panel {
|
||||
padding: 24px;
|
||||
|
||||
li {
|
||||
font-size: 14px;
|
||||
line-height: 19px;
|
||||
margin-bottom: 8px;
|
||||
display: flex;
|
||||
|
||||
div {
|
||||
width: 94px;
|
||||
color: rgba(102, 102, 102, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.card-panel {
|
||||
background: rgba(255, 255, 255, 1);
|
||||
box-shadow: 0 16px 32px 0 rgba(0, 0, 0, 0.02);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.todo-item {
|
||||
background: rgba(243, 246, 249, 0);
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
|
||||
svg {
|
||||
height: 48px;
|
||||
width: 48px;
|
||||
}
|
||||
|
||||
.item-label {
|
||||
color: #333;
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
line-height: 32px
|
||||
}
|
||||
|
||||
&:hover {
|
||||
background: rgba(239, 246, 255, 1);
|
||||
}
|
||||
}
|
||||
|
||||
.data-panel-area:hover > .data-panel {
|
||||
transform: translateY(-2px);
|
||||
box-shadow: 0 16px 32px -16px rgba(36, 103, 255, 0.3);
|
||||
}
|
||||
|
||||
.data-panel {
|
||||
width: 224px;
|
||||
height: 80px;
|
||||
background: rgba(255, 255, 255, 1);
|
||||
border-radius: 4px;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 0 16px;
|
||||
line-height: 80px;
|
||||
cursor: pointer;
|
||||
|
||||
svg {
|
||||
margin: 29px 0;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.item-label {
|
||||
display: flex;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
b {
|
||||
font-size: 20px;
|
||||
color: rgba(51, 51, 51, 1);
|
||||
font-family: Arial, serif;
|
||||
}
|
||||
}
|
||||
|
||||
.conference-and-message {
|
||||
height: calc(100% - 296px);
|
||||
margin-top: 20px;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.unread-message-list {
|
||||
height: calc(100% - 48px);
|
||||
overflow-y: auto;
|
||||
overflow-x: hidden;
|
||||
|
||||
.list-type {
|
||||
width: 5px;
|
||||
height: 5px;
|
||||
border-radius: 50%;
|
||||
border: 3px solid #26f;
|
||||
margin: 4px 8px;
|
||||
}
|
||||
|
||||
li {
|
||||
display: flex;
|
||||
font-size: 14px;
|
||||
margin: 0 16px;
|
||||
padding: 15px 8px;
|
||||
line-height: 19px;
|
||||
|
||||
&:hover {
|
||||
background: rgba(239, 246, 255, 1);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.conference-list {
|
||||
height: calc(100% - 48px);
|
||||
overflow-y: auto;
|
||||
|
||||
.list-type {
|
||||
width: 2px;
|
||||
height: 40px;
|
||||
background: rgba(255, 136, 34, 1);
|
||||
border-radius: 2px;
|
||||
margin-right: 14px;
|
||||
}
|
||||
|
||||
li {
|
||||
display: flex;
|
||||
font-size: 14px;
|
||||
margin: 0 16px;
|
||||
padding: 15px 8px;
|
||||
line-height: 19px;
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
background: rgba(239, 246, 255, 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes rotate {
|
||||
to {
|
||||
transform: rotate(60turn);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
BIN
packages/extra/AppConsole/assets/bg_prolife.png
Normal file
BIN
packages/extra/AppConsole/assets/bg_prolife.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 94 KiB |
Reference in New Issue
Block a user