Merge remote-tracking branch 'origin/feature_教代会代表证' into release_20260831
This commit is contained in:
+21
@@ -128,6 +128,27 @@ public class GuildHallMeetingController {
|
||||
return Result.success(results);
|
||||
}
|
||||
|
||||
@At
|
||||
@SaCheckPermission("h5.guildHall.metting")
|
||||
@ApiOperation("H5会议详情")
|
||||
public Result selectDetail(String meetingId) {
|
||||
if (StrUtil.isBlank(meetingId)) {
|
||||
return Result.error("缺少会议参数");
|
||||
}
|
||||
GuildHallMeeting meeting = dao.fetch(GuildHallMeeting.class, meetingId);
|
||||
if (meeting == null || DateUtil.compare(DateUtil.date(), meeting.getEndTime()) > 0) {
|
||||
return Result.error("会议不存在或已结束");
|
||||
}
|
||||
if (meeting.getGroupId() != null
|
||||
&& !activityBasicScopeService.isUserInGroup(meeting.getGroupId(), SecurityUtil.getUserId())) {
|
||||
return Result.error("无权查看该会议");
|
||||
}
|
||||
NutMap meetingMap = Lang.obj2nutmap(meeting);
|
||||
GuildHall hall = dao.fetch(GuildHall.class, meeting.getHallId());
|
||||
meetingMap.put("address", hall == null ? null : hall.getAddress());
|
||||
return Result.success(meetingMap);
|
||||
}
|
||||
|
||||
@At
|
||||
@SaCheckPermission("h5.guildHall.metting")
|
||||
@ApiOperation("H5进行中会议分页")
|
||||
|
||||
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 1010 KiB After Width: | Height: | Size: 462 KiB |
File diff suppressed because one or more lines are too long
+137
-13
@@ -18,12 +18,6 @@ layout("/layouts/platform_h5.html"){
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.delegate-read-page .van-nav-bar__title {
|
||||
color: #1f2937;
|
||||
font-size: 16px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.delegate-read-page .van-nav-bar .van-icon,
|
||||
.delegate-read-page .van-nav-bar__text {
|
||||
color: #397fbd;
|
||||
@@ -179,6 +173,87 @@ layout("/layouts/platform_h5.html"){
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.delegate-read-page-skeleton {
|
||||
padding: 12px 12px 86px;
|
||||
}
|
||||
|
||||
.delegate-read-skeleton__block {
|
||||
background: linear-gradient(90deg, #f2f3f5 25%, #e6e7e9 37%, #f2f3f5 63%);
|
||||
background-size: 400% 100%;
|
||||
animation: delegate-read-skeleton-loading 1.4s ease infinite;
|
||||
}
|
||||
|
||||
.delegate-read-skeleton__hero {
|
||||
height: 134px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.delegate-read-skeleton__search {
|
||||
height: 40px;
|
||||
margin-top: 10px;
|
||||
border-radius: 9px;
|
||||
}
|
||||
|
||||
.delegate-read-skeleton__filter {
|
||||
height: 44px;
|
||||
margin: 10px 0;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
.delegate-read-skeleton__item {
|
||||
margin-bottom: 10px;
|
||||
padding: 12px;
|
||||
box-sizing: border-box;
|
||||
border-radius: 9px;
|
||||
background-color: #fff;
|
||||
box-shadow: 0 3px 12px rgba(43, 73, 112, .06);
|
||||
}
|
||||
|
||||
.delegate-read-skeleton__item .van-skeleton {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.delegate-read-skeleton__item .van-skeleton__avatar {
|
||||
width: 58px;
|
||||
height: 58px;
|
||||
}
|
||||
|
||||
.delegate-read-skeleton__item .van-skeleton__content {
|
||||
padding-top: 2px;
|
||||
}
|
||||
|
||||
.delegate-read-skeleton__item .van-skeleton__title {
|
||||
width: 34%;
|
||||
}
|
||||
|
||||
.delegate-read-skeleton__actions {
|
||||
position: fixed;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: 1000;
|
||||
display: flex;
|
||||
gap: 10px;
|
||||
padding: 10px 12px calc(10px + env(safe-area-inset-bottom));
|
||||
background-color: #fff;
|
||||
border-top: 1px solid #edf1f6;
|
||||
}
|
||||
|
||||
.delegate-read-skeleton__action {
|
||||
height: 44px;
|
||||
flex: 1;
|
||||
border-radius: 9px;
|
||||
}
|
||||
|
||||
@keyframes delegate-read-skeleton-loading {
|
||||
0% {
|
||||
background-position: 100% 50%;
|
||||
}
|
||||
100% {
|
||||
background-position: 0 50%;
|
||||
}
|
||||
}
|
||||
|
||||
.delegate-read-list .table-list-container .table-list-item {
|
||||
margin-bottom: 10px;
|
||||
padding: 12px;
|
||||
@@ -368,7 +443,20 @@ layout("/layouts/platform_h5.html"){
|
||||
<div class="delegate-read-page">
|
||||
<van-nav-bar title="代表阅览" left-text="返回" left-arrow @click-left="historyBack" placeholder fixed></van-nav-bar>
|
||||
|
||||
<div class="delegate-read-content">
|
||||
<div v-if="pageSkeletonLoading" class="delegate-read-page-skeleton">
|
||||
<div class="delegate-read-skeleton__hero delegate-read-skeleton__block"></div>
|
||||
<div class="delegate-read-skeleton__search delegate-read-skeleton__block"></div>
|
||||
<div class="delegate-read-skeleton__filter delegate-read-skeleton__block"></div>
|
||||
<div v-for="item in 5" :key="item" class="delegate-read-skeleton__item">
|
||||
<van-skeleton title avatar avatar-shape="round" :row="3" row-width="100%" animated></van-skeleton>
|
||||
</div>
|
||||
<div class="delegate-read-skeleton__actions">
|
||||
<div class="delegate-read-skeleton__action delegate-read-skeleton__block"></div>
|
||||
<div class="delegate-read-skeleton__action delegate-read-skeleton__block"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-show="!pageSkeletonLoading" class="delegate-read-content">
|
||||
<section class="delegate-read-hero">
|
||||
<img class="delegate-read-hero__image" src="/assets/mobile/img/democratic/teachercongress/delegate-read-hero.png" alt="代表阅览插画">
|
||||
<div class="delegate-read-hero__copy">
|
||||
@@ -415,11 +503,13 @@ layout("/layouts/platform_h5.html"){
|
||||
<div class="delegate-read-list">
|
||||
<table-list api="/platform/teacherCongress/delegate/read/pageData" :page_form.sync="pageForm"
|
||||
:class="{'is-empty': pageForm.totalCount === 0}" json
|
||||
:show_loading_overlay="!pageSkeletonLoading"
|
||||
@ready="onReady"
|
||||
@loading-change="onListLoadingChange"
|
||||
ref="tableListRef"
|
||||
title="userName">
|
||||
<template #empty>
|
||||
<div class="delegate-read-empty">
|
||||
<div v-if="!listLoading" class="delegate-read-empty">
|
||||
<img src="/assets/mobile/img/democratic/teachercongress/delegate-read-empty.png" alt="暂无代表信息插画">
|
||||
<div class="delegate-read-empty__title">暂无代表信息</div>
|
||||
<div class="delegate-read-empty__hint">当前筛选条件下暂时没有可阅览的代表</div>
|
||||
@@ -452,7 +542,7 @@ layout("/layouts/platform_h5.html"){
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="delegate-read-actions">
|
||||
<div v-show="!pageSkeletonLoading" class="delegate-read-actions">
|
||||
<van-button class="delegate-read-action is-excel" size="medium" @click="exportXlsx">
|
||||
<i class="fa fa-file-excel-o"></i> 导出Excel
|
||||
</van-button>
|
||||
@@ -484,11 +574,35 @@ layout("/layouts/platform_h5.html"){
|
||||
roleOptions: [],
|
||||
|
||||
moreOptions: [],
|
||||
filterOpened: false
|
||||
filterOpened: false,
|
||||
pageSkeletonLoading: true,
|
||||
initialPendingCount: 0,
|
||||
initialListLoadingTracked: false,
|
||||
listLoading: false
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
historyBack,
|
||||
beginInitialLoad() {
|
||||
this.initialPendingCount++
|
||||
},
|
||||
endInitialLoad() {
|
||||
this.initialPendingCount = Math.max(0, this.initialPendingCount - 1)
|
||||
if (this.initialPendingCount === 0) {
|
||||
this.pageSkeletonLoading = false
|
||||
}
|
||||
},
|
||||
onListLoadingChange({loading, initial}) {
|
||||
this.listLoading = loading
|
||||
if (!initial || !this.pageSkeletonLoading) return
|
||||
if (loading && !this.initialListLoadingTracked) {
|
||||
this.initialListLoadingTracked = true
|
||||
this.beginInitialLoad()
|
||||
} else if (!loading && this.initialListLoadingTracked) {
|
||||
this.initialListLoadingTracked = false
|
||||
this.endInitialLoad()
|
||||
}
|
||||
},
|
||||
setFilterOpened(value) {
|
||||
this.$set(this, "filterOpened", value)
|
||||
},
|
||||
@@ -522,16 +636,21 @@ layout("/layouts/platform_h5.html"){
|
||||
this.doSearch()
|
||||
},
|
||||
listSession() {
|
||||
this.$axios.post("/platform/proposal/common/listSession").then((res) => {
|
||||
this.beginInitialLoad()
|
||||
return this.$axios.post("/platform/proposal/common/listSession").then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.sessionOptions = res.data.map((v) => ({text: v.fullName, value: v.id}))
|
||||
this.pageForm.sessionId = res.data[0].id
|
||||
this.sessionChange()
|
||||
}
|
||||
}).finally(() => {
|
||||
this.endInitialLoad()
|
||||
})
|
||||
},
|
||||
listDelegation() {
|
||||
this.$axios.post("/platform/proposal/common/listDelegation", {sessionId: this.pageForm.sessionId}).then((res) => {
|
||||
const isInitialLoad = this.pageSkeletonLoading
|
||||
if (isInitialLoad) this.beginInitialLoad()
|
||||
return this.$axios.post("/platform/proposal/common/listDelegation", {sessionId: this.pageForm.sessionId}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.delegationOptions = [
|
||||
{
|
||||
@@ -540,16 +659,21 @@ layout("/layouts/platform_h5.html"){
|
||||
}
|
||||
].concat(res.data.map((v) => ({...v, text: v.name, value: v.id})))
|
||||
}
|
||||
}).finally(() => {
|
||||
if (isInitialLoad) this.endInitialLoad()
|
||||
})
|
||||
},
|
||||
listRole() {
|
||||
this.$axios.post("/platform/teacherCongress/common/listDelegateRole").then((res) => {
|
||||
this.beginInitialLoad()
|
||||
return this.$axios.post("/platform/teacherCongress/common/listDelegateRole").then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.moreOptions.push({
|
||||
title: "代表身份",
|
||||
options: res.data.map((v) => ({...v, text: v.name}))
|
||||
})
|
||||
}
|
||||
}).finally(() => {
|
||||
this.endInitialLoad()
|
||||
})
|
||||
},
|
||||
doSearch() {
|
||||
|
||||
+364
-394
File diff suppressed because it is too large
Load Diff
+77
-11
@@ -18,15 +18,9 @@ layout("/layouts/platform_h5.html"){
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#app .van-nav-bar__title {
|
||||
color: #17233d;
|
||||
font-size: 17px;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
#app .van-nav-bar__text,
|
||||
#app .van-nav-bar .van-icon {
|
||||
color: #1677ff;
|
||||
color: #397fbd;
|
||||
}
|
||||
|
||||
.meeting-list-page {
|
||||
@@ -452,13 +446,82 @@ layout("/layouts/platform_h5.html"){
|
||||
font-size: 12px;
|
||||
line-height: 18px;
|
||||
}
|
||||
|
||||
.meeting-list-skeleton {
|
||||
height: calc(100vh - 46px);
|
||||
padding: 12px;
|
||||
overflow: hidden;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.meeting-list-skeleton__block {
|
||||
background: linear-gradient(90deg, #f2f3f5 25%, #e6e7e9 37%, #f2f3f5 63%);
|
||||
background-size: 400% 100%;
|
||||
animation: meeting-list-skeleton-loading 1.4s ease infinite;
|
||||
}
|
||||
|
||||
.meeting-list-skeleton__hero {
|
||||
height: 132px;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.meeting-list-skeleton__search {
|
||||
height: 40px;
|
||||
margin: 10px 0;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.meeting-list-skeleton__card {
|
||||
height: 214px;
|
||||
margin: 0 4px 12px;
|
||||
padding: 18px 16px;
|
||||
border-radius: 8px;
|
||||
background-color: #fff;
|
||||
box-shadow: 0 2px 12px rgba(0, 0, 0, .04);
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.meeting-list-skeleton__card .van-skeleton {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.meeting-list-skeleton__card .van-skeleton__title {
|
||||
width: 48%;
|
||||
}
|
||||
|
||||
.meeting-list-skeleton__card .van-skeleton__row:nth-child(2) {
|
||||
height: 86px;
|
||||
margin-top: 14px;
|
||||
}
|
||||
|
||||
.meeting-list-skeleton__card .van-skeleton__row:nth-child(3) {
|
||||
height: 54px;
|
||||
margin-top: 13px;
|
||||
}
|
||||
|
||||
@keyframes meeting-list-skeleton-loading {
|
||||
0% {
|
||||
background-position: 100% 50%;
|
||||
}
|
||||
100% {
|
||||
background-position: 0 50%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
<div id="app" v-cloak>
|
||||
<van-nav-bar title="会议列表" left-text="返回" left-arrow
|
||||
@click-left="historyBack" placeholder fixed></van-nav-bar>
|
||||
|
||||
<div class="meeting-list-page">
|
||||
<div v-if="initialSkeletonLoading" class="meeting-list-skeleton">
|
||||
<div class="meeting-list-skeleton__hero meeting-list-skeleton__block"></div>
|
||||
<div class="meeting-list-skeleton__search meeting-list-skeleton__block"></div>
|
||||
<div v-for="item in 3" :key="item" class="meeting-list-skeleton__card">
|
||||
<van-skeleton title :row="2" animated></van-skeleton>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-show="!initialSkeletonLoading" class="meeting-list-page">
|
||||
<section class="meeting-list-hero">
|
||||
<img class="meeting-list-hero__image"
|
||||
src="/assets/mobile/img/democratic/teachercongress/meeting-list-hero.png" alt="会议选座插画">
|
||||
@@ -537,7 +600,8 @@ layout("/layouts/platform_h5.html"){
|
||||
finished: false,
|
||||
pageNumber: 1,
|
||||
pageSize: 10,
|
||||
totalCount: 0
|
||||
totalCount: 0,
|
||||
initialSkeletonLoading: true
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
@@ -546,7 +610,8 @@ layout("/layouts/platform_h5.html"){
|
||||
methods: {
|
||||
historyBack,
|
||||
loadMeetings(reset) {
|
||||
const loading = createListLoading()
|
||||
const isInitialLoad = this.initialSkeletonLoading
|
||||
const loading = isInitialLoad ? null : createListLoading()
|
||||
if (reset) {
|
||||
this.pageNumber = 1
|
||||
this.totalCount = 0
|
||||
@@ -574,7 +639,8 @@ layout("/layouts/platform_h5.html"){
|
||||
}).always(() => {
|
||||
this.listLoading = false
|
||||
this.refreshing = false
|
||||
loading.clear()
|
||||
if (isInitialLoad) this.initialSkeletonLoading = false
|
||||
if (loading) loading.clear()
|
||||
})
|
||||
},
|
||||
onLoad() {
|
||||
|
||||
Reference in New Issue
Block a user