工作台入库
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