Merge remote-tracking branch 'origin/feature_教代会代表证' into release_20260831

This commit is contained in:
2026-08-31 13:36:12 +08:00
6 changed files with 615 additions and 418 deletions
@@ -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进行中会议分页")
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
@@ -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() {
@@ -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() {