23436998 by lttnew

道馆

1 parent 843f28df
...@@ -2,7 +2,8 @@ ...@@ -2,7 +2,8 @@
2 "permissions": { 2 "permissions": {
3 "allow": [ 3 "allow": [
4 "Bash(ls D:/ltt/ztx_wx_gzt/views/*/index.vue)", 4 "Bash(ls D:/ltt/ztx_wx_gzt/views/*/index.vue)",
5 "WebFetch(domain:minimax-algeng-chat-tts.oss-cn-wulanchabu.aliyuncs.com)" 5 "WebFetch(domain:minimax-algeng-chat-tts.oss-cn-wulanchabu.aliyuncs.com)",
6 "Bash(node -c pages/index/perfect.vue)"
6 ] 7 ]
7 } 8 }
8 } 9 }
......
...@@ -1537,6 +1537,16 @@ export function checkBusinessLicense(data) { ...@@ -1537,6 +1537,16 @@ export function checkBusinessLicense(data) {
1537 }) 1537 })
1538 } 1538 }
1539 1539
1540 // 校验社会信用代码是否已存在
1541 export function creditCodeExist(code) {
1542 return request({
1543 url: `/member/info/creditCodeExist`,
1544 params: {
1545 creditCode: code
1546 }
1547 })
1548 }
1549
1540 // 生成单位订单renewYear 1550 // 生成单位订单renewYear
1541 export function certifiedNew(renewYear) { 1551 export function certifiedNew(renewYear) {
1542 return request({ 1552 return request({
...@@ -1689,6 +1699,15 @@ export function getMyRecentExam() { ...@@ -1689,6 +1699,15 @@ export function getMyRecentExam() {
1689 }) 1699 })
1690 } 1700 }
1691 1701
1702 // 考点申请列表
1703 export function examPointApplyList(params) {
1704 return request({
1705 url: '/member/examPointApply/list',
1706 method: 'get',
1707 params
1708 })
1709 }
1710
1692 1711
1693 // 获取订单详情 1712 // 获取订单详情
1694 export function getOrderInfo(orderId) { 1713 export function getOrderInfo(orderId) {
...@@ -2078,3 +2097,12 @@ export function settlementDetailList(params) { ...@@ -2078,3 +2097,12 @@ export function settlementDetailList(params) {
2078 params: params 2097 params: params
2079 }) 2098 })
2080 } 2099 }
2100
2101 // 会员审核记录列表
2102 export function memberAuditList(params) {
2103 return request({
2104 url: '/system/input/list',
2105 method: 'get',
2106 params: params
2107 })
2108 }
......
1 <template>
2 <view class="custom-modal" v-if="show">
3 <view class="modal-mask" @click="onMaskClick"></view>
4 <view class="modal-content">
5 <view class="modal-header" v-if="title">
6 <text class="modal-title">{{ title }}</text>
7 </view>
8 <view class="modal-body">
9 <rich-text v-if="isHtml" :nodes="content"></rich-text>
10 <text v-else class="modal-text">{{ content }}</text>
11 </view>
12 <view class="modal-footer">
13 <button class="btn-cancel" @click="onCancel" v-if="showCancel">{{ cancelText }}</button>
14 <button class="btn-confirm" @click="onConfirm" v-if="showConfirm">{{ confirmText }}</button>
15 </view>
16 </view>
17 </view>
18 </template>
19
20 <script setup>
21 import { ref } from 'vue'
22
23 const props = defineProps({
24 title: {
25 type: String,
26 default: ''
27 },
28 content: {
29 type: String,
30 default: ''
31 },
32 isHtml: {
33 type: Boolean,
34 default: false
35 },
36 showCancel: {
37 type: Boolean,
38 default: true
39 },
40 showConfirm: {
41 type: Boolean,
42 default: true
43 },
44 cancelText: {
45 type: String,
46 default: '取消'
47 },
48 confirmText: {
49 type: String,
50 default: '确定'
51 },
52 maskCloseable: {
53 type: Boolean,
54 default: true
55 }
56 })
57
58 const emit = defineEmits(['cancel', 'confirm'])
59
60 const show = ref(false)
61
62 function onCancel() {
63 show.value = false
64 emit('cancel')
65 }
66
67 function onConfirm() {
68 show.value = false
69 emit('confirm')
70 }
71
72 function onMaskClick() {
73 if (props.maskCloseable) {
74 show.value = false
75 }
76 }
77
78 // 对外暴露的方法
79 function open() {
80 show.value = true
81 }
82
83 function close() {
84 show.value = false
85 }
86
87 defineExpose({ open, close })
88 </script>
89
90 <style lang="scss" scoped>
91 .custom-modal {
92 position: fixed;
93 top: 0;
94 left: 0;
95 right: 0;
96 bottom: 0;
97 z-index: 9999;
98 display: flex;
99 align-items: center;
100 justify-content: center;
101 }
102
103 .modal-mask {
104 position: absolute;
105 top: 0;
106 left: 0;
107 right: 0;
108 bottom: 0;
109 background: rgba(0, 0, 0, 0.5);
110 }
111
112 .modal-content {
113 position: relative;
114 width: 600rpx;
115 max-width: 85%;
116 background: #fff;
117 border-radius: 24rpx;
118 overflow: hidden;
119 animation: modalIn 0.2s ease;
120 }
121
122 @keyframes modalIn {
123 from {
124 opacity: 0;
125 transform: scale(0.9);
126 }
127 to {
128 opacity: 1;
129 transform: scale(1);
130 }
131 }
132
133 .modal-header {
134 padding: 32rpx 30rpx 0;
135 text-align: center;
136 }
137
138 .modal-title {
139 font-size: 32rpx;
140 font-weight: 600;
141 color: #333;
142 }
143
144 .modal-body {
145 padding: 30rpx;
146 max-height: 60vh;
147 overflow-y: auto;
148 }
149
150 .modal-text {
151 font-size: 28rpx;
152 color: #666;
153 line-height: 1.6;
154 text-align: center;
155 white-space: pre-wrap;
156 word-break: break-word;
157 }
158
159 .modal-footer {
160 display: flex;
161 padding: 0 30rpx 30rpx;
162 gap: 24rpx;
163 justify-content: center;
164 }
165
166 .btn-cancel,
167 .btn-confirm {
168 flex: 1;
169 height: 80rpx;
170 line-height: 80rpx;
171 font-size: 30rpx;
172 border-radius: 40rpx;
173 margin: 0;
174 padding: 0;
175 border: none;
176 }
177
178 .btn-cancel {
179 background: #fff;
180 color: #AD181F;
181 border: 2rpx solid #AD181F;
182 }
183
184 .btn-confirm {
185 background: #AD181F;
186 color: #fff;
187 }
188 </style>
1 <template> 1 <template>
2 <view> 2 <view>
3 <!-- 自定义弹窗 -->
4 <custom-modal ref="customModalRef" :title="modalConfig.title" :content="modalConfig.content" :showCancel="modalConfig.showCancel" :cancelText="modalConfig.cancelText" :confirmText="modalConfig.confirmText" @confirm="onModalConfirm" />
5
3 <!-- 顶部添加考官按钮 --> 6 <!-- 顶部添加考官按钮 -->
4 <view class="add-btn-box"> 7 <view class="add-btn-box">
5 <button class="btn-red-kx mini" @click="openAddExaminer"> 8 <button class="btn-red-kx mini" @click="openAddExaminer">
...@@ -13,20 +16,22 @@ ...@@ -13,20 +16,22 @@
13 <view class="item" v-for="(n,index) in list" :key="index"> 16 <view class="item" v-for="(n,index) in list" :key="index">
14 <view class="item-content"> 17 <view class="item-content">
15 <view class="name-row"> 18 <view class="name-row">
16 <view class="name">{{n.perName}}</view> 19 <view class="name">{{n.perName}} <text class="expired-text" v-if="n.canChoose != 1">已过期</text></view>
17 <view class="expired-tag" v-if="n.canChoose != 1"> 20 <!-- <view class="expired-tag" v-if="n.canChoose != 1">
18 <text class="expired-text">已过期</text> 21 <text class="text">已过期</text>
19 </view> 22 </view> -->
20 </view> 23 </view>
21 <view class="date">会员号:{{n.perCode||'-'}}</view> 24 <view class="date">会员号:{{n.perCode||'-'}}</view>
22 <view class="date">有效日期:{{ formatDate(n.roleInfo && n.roleInfo.validTime ? n.roleInfo.validTime : '-') }}</view> 25 <view class="date">有效日期:{{ formatDate(n.roleInfo && n.roleInfo.validTime ? n.roleInfo.validTime : '-') }}</view>
23 <view class="date">注册地:{{n.memName||'-'}}</view> 26 <view class="date">注册地:{{n.memName||'-'}}</view>
24 </view> 27 </view>
25 <view class="status"> 28 <view class="status">
26 <text v-if="isChosen(n)" class="text-chosen">已选</text> 29 <text v-if="pageType == 1" class="text-danger" @click="handleDelete(n)">删除</text>
27 <!-- <text v-else-if="n.canChoose != 1" class="text-gray">不可选</text> --> 30 <template v-else>
28 <text v-else-if="n.canChoose == 1" class="text-primary" @click="handleChoose(n)">选择</text> 31 <text v-if="isChosen(n)" class="text-chosen">已选</text>
29 <text v-else class="text-gray">不可选</text> 32 <text v-else-if="n.canChoose == 1" class="text-primary" @click="handleChoose(n)">选择</text>
33 <text v-else class="text-gray">不可选</text>
34 </template>
30 </view> 35 </view>
31 </view> 36 </view>
32 </view> 37 </view>
...@@ -79,12 +84,10 @@ ...@@ -79,12 +84,10 @@
79 <script setup> 84 <script setup>
80 import * as api from '@/common/api.js' 85 import * as api from '@/common/api.js'
81 import config from '@/config.js' 86 import config from '@/config.js'
82 import { 87 import { ref } from 'vue'
83 ref 88 import { onLoad } from '@dcloudio/uni-app'
84 } from 'vue' 89 import customModal from '@/components/custom-modal.vue'
85 import { 90
86 onLoad
87 } from '@dcloudio/uni-app'
88 const app = getApp(); 91 const app = getApp();
89 const list = ref([]) 92 const list = ref([])
90 const loading = ref(false) 93 const loading = ref(false)
...@@ -92,6 +95,8 @@ ...@@ -92,6 +95,8 @@
92 let ec = null 95 let ec = null
93 96
94 const addPopup = ref(null) 97 const addPopup = ref(null)
98 const customModalRef = ref(null)
99 const modalConfig = ref({})
95 const addForm = ref({ 100 const addForm = ref({
96 type: 1, 101 type: 1,
97 name: '', 102 name: '',
...@@ -99,10 +104,16 @@ ...@@ -99,10 +104,16 @@
99 }) 104 })
100 const searchResult = ref(null) 105 const searchResult = ref(null)
101 const searchNoData = ref(false) 106 const searchNoData = ref(false)
102 107 const pageType = ref('')
103 onLoad((option) => { 108 onLoad((option) => {
104 chosen = JSON.parse(decodeURIComponent(option.chosen || '[]')) 109 if(option.pageType ){
105 ec = option.ec 110 pageType.value = option.pageType || ''
111 }else{
112 chosen = JSON.parse(decodeURIComponent(option.chosen || '[]'))
113 ec = option.ec
114 }
115
116 console.log('pageType.value',pageType.value)
106 getList() 117 getList()
107 }) 118 })
108 119
...@@ -176,6 +187,52 @@ ...@@ -176,6 +187,52 @@
176 uni.navigateBack({ delta: 1 }) 187 uni.navigateBack({ delta: 1 })
177 } 188 }
178 189
190 // 删除考官
191 let pendingDeleteRow = null
192 let modalAction = '' // 'delete' or 'add'
193
194 function handleDelete(row) {
195 pendingDeleteRow = row
196 modalAction = 'delete'
197 modalConfig.value = {
198 title: '提示',
199 content: `确定删除 "${row.perName}" 吗?`,
200 showCancel: true,
201 cancelText: '取消',
202 confirmText: '确定'
203 }
204 customModalRef.value.open()
205 }
206
207 function onModalConfirm() {
208 if (modalAction === 'delete' && pendingDeleteRow) {
209 uni.showLoading({ title: '删除中' })
210 api.examinerDel(pendingDeleteRow.id).then(() => {
211 uni.hideLoading()
212 uni.showToast({ title: '删除成功', icon: 'success' })
213 getList()
214 }).catch(() => {
215 uni.hideLoading()
216 uni.showToast({ title: '删除失败', icon: 'error' })
217 })
218 pendingDeleteRow = null
219 modalAction = ''
220 } else if (modalAction === 'add' && pendingAddRow) {
221 uni.showLoading({ title: '添加中' })
222 api.selfAdd(pendingAddRow.perId).then(() => {
223 uni.hideLoading()
224 uni.showToast({ title: '添加成功', icon: 'success' })
225 addPopup.value.close()
226 getList()
227 }).catch(() => {
228 uni.hideLoading()
229 uni.showToast({ title: '添加失败', icon: 'error' })
230 })
231 pendingAddRow = null
232 modalAction = ''
233 }
234 }
235
179 // 打开添加考官弹窗 236 // 打开添加考官弹窗
180 function openAddExaminer() { 237 function openAddExaminer() {
181 addForm.value.name = '' 238 addForm.value.name = ''
...@@ -218,26 +275,18 @@ ...@@ -218,26 +275,18 @@
218 } 275 }
219 276
220 // 执行添加考官 277 // 执行添加考官
278 let pendingAddRow = null
221 function doAddExaminer(row) { 279 function doAddExaminer(row) {
222 uni.showModal({ 280 pendingAddRow = row
281 modalAction = 'add'
282 modalConfig.value = {
223 title: '提示', 283 title: '提示',
224 content: `确定添加 "${row.name}" 为考官吗?`, 284 content: `确定添加 "${row.perName}" 为考官吗?`,
225 success: (res) => { 285 showCancel: true,
226 if (res.confirm) { 286 cancelText: '取消',
227 uni.showLoading({ title: '添加中' }) 287 confirmText: '确定'
228 api.selfAdd(row.perId).then(() => { 288 }
229 uni.hideLoading() 289 customModalRef.value.open()
230 uni.showToast({ title: '添加成功', icon: 'success' })
231 addPopup.value.close()
232 // 刷新列表
233 getList()
234 }).catch(() => {
235 uni.hideLoading()
236 uni.showToast({ title: '添加失败', icon: 'error' })
237 })
238 }
239 }
240 })
241 } 290 }
242 </script> 291 </script>
243 292
...@@ -333,7 +382,11 @@ ...@@ -333,7 +382,11 @@
333 } 382 }
334 383
335 .text-danger { 384 .text-danger {
336 color: #dd524d; 385 border-radius: 30rpx;
386 background: linear-gradient(135deg, #fff1f0, #ffe5e5);
387 color: #e8341d;
388 font-size: 22rpx;
389 border: 1rpx solid rgba(232, 52, 29, 0.3);
337 } 390 }
338 391
339 .popBody { 392 .popBody {
......
...@@ -88,14 +88,18 @@ ...@@ -88,14 +88,18 @@
88 <!-- 注册提示弹框 --> 88 <!-- 注册提示弹框 -->
89 <uni-popup ref="registerPopup" type="center" :mask-click="false"> 89 <uni-popup ref="registerPopup" type="center" :mask-click="false">
90 <view class="register-popup"> 90 <view class="register-popup">
91 <view class="popup-title">注册提示</view> 91 <view class="popup-title">系统提示</view>
92 <view class="popup-content"> 92 <view class="popup-content">
93 <view class="popup-text">请准备以下材料,以便顺利完成注册</view> 93 <view class="popup-text">尊敬的用户,您好!</view>
94 <view class="popup-list"> 94 <view class="popup-text">在开始注册团体会员前,请您提前准备好以下材料,以便顺利完成申请:</view>
95 <text>1. 单位营业执照(清晰照片)</text> 95 <view class="popup-item">1. 单位营业执照</view>
96 <text>2. 法人身份证正反面照片(清晰照片)</text> 96 <view class="popup-desc">请提供清晰的营业执照原件照片或扫描件(加盖公章更佳)</view>
97 <text>3. 单位营业执照(清晰照片)</text> 97 <view class="popup-item">2. 法人身份证正反面照片</view>
98 </view> 98 <view class="popup-desc">请分别上传身份证正面及反面清晰照片</view>
99 <view class="popup-desc">确保信息完整、无遮挡、无模糊</view>
100 <view class="popup-item">3. 机构照片</view>
101 <view class="popup-desc">请提供体现单位实际经营或办公环境的照片1-2张</view>
102 <view class="popup-desc">如门头、办公场所、活动场地等(能展示机构真实存在即可)</view>
99 </view> 103 </view>
100 <view class="popup-btns"> 104 <view class="popup-btns">
101 <view class="popup-btn cancel" @click="closeRegisterPopup">取消</view> 105 <view class="popup-btn cancel" @click="closeRegisterPopup">取消</view>
...@@ -108,10 +112,12 @@ ...@@ -108,10 +112,12 @@
108 112
109 <script setup> 113 <script setup>
110 import { 114 import {
111 onLoad 115 onLoad,
116 onReady
112 } from '@dcloudio/uni-app'; 117 } from '@dcloudio/uni-app';
113 import { 118 import {
114 ref 119 ref,
120 nextTick
115 } from 'vue' 121 } from 'vue'
116 import config from '@/config.js' 122 import config from '@/config.js'
117 import { 123 import {
...@@ -152,7 +158,7 @@ const app = getApp() ...@@ -152,7 +158,7 @@ const app = getApp()
152 158
153 onLoad(() => { 159 onLoad(() => {
154 getCode() 160 getCode()
155 161
156 if (uni.showShareMenu) { 162 if (uni.showShareMenu) {
157 uni.showShareMenu({ 163 uni.showShareMenu({
158 withShareTicket: true, 164 withShareTicket: true,
...@@ -161,6 +167,10 @@ onLoad(() => { ...@@ -161,6 +167,10 @@ onLoad(() => {
161 } 167 }
162 }) 168 })
163 169
170 onReady(() => {
171 console.log('registerPopup ready:', registerPopup.value)
172 })
173
164 function goBack() { 174 function goBack() {
165 uni.navigateBack() 175 uni.navigateBack()
166 } 176 }
...@@ -246,7 +256,11 @@ function login() { ...@@ -246,7 +256,11 @@ function login() {
246 } 256 }
247 257
248 function goRegister() { 258 function goRegister() {
249 registerPopup.value.open() 259 nextTick(() => {
260 if (registerPopup.value) {
261 registerPopup.value.open()
262 }
263 })
250 } 264 }
251 265
252 function closeRegisterPopup() { 266 function closeRegisterPopup() {
...@@ -560,28 +574,47 @@ function call(num) { ...@@ -560,28 +574,47 @@ function call(num) {
560 574
561 /* 注册提示弹框 */ 575 /* 注册提示弹框 */
562 .register-popup { 576 .register-popup {
563 width: 600rpx; 577 width: 700rpx;
564 background: #ffffff; 578 background: #ffffff;
565 border-radius: 24rpx; 579 border-radius: 24rpx;
566 overflow: hidden; 580 overflow: hidden;
567 } 581 }
568 582
569 .popup-title { 583 .popup-title {
570 font-size: 32rpx; 584 // display: inline-block;
571 font-weight: 500; 585 // background: #AD181F;
572 color: #333; 586 color: #333;
587 font-size: 28rpx;
588 font-weight: 600;
589 margin: 30rpx auto 20rpx;
573 text-align: center; 590 text-align: center;
574 padding: 40rpx 30rpx 20rpx;
575 } 591 }
576 592
577 .popup-content { 593 .popup-content {
578 padding: 20rpx 30rpx 40rpx; 594 padding: 0 30rpx 30rpx;
579 } 595 }
580 596
581 .popup-text { 597 .popup-text {
598 font-size: 26rpx;
599 color: #666;
600 margin-bottom: 16rpx;
601 line-height: 1.6;
602 }
603
604 .popup-item {
582 font-size: 28rpx; 605 font-size: 28rpx;
583 color: #333; 606 color: #333;
584 margin-bottom: 20rpx; 607 font-weight: 600;
608 margin-top: 24rpx;
609 margin-bottom: 10rpx;
610 }
611
612 .popup-desc {
613 font-size: 24rpx;
614 color: #888;
615 padding-left: 16rpx;
616 line-height: 1.5;
617 margin-bottom: 8rpx;
585 } 618 }
586 619
587 .popup-list { 620 .popup-list {
...@@ -599,24 +632,27 @@ function call(num) { ...@@ -599,24 +632,27 @@ function call(num) {
599 632
600 .popup-btns { 633 .popup-btns {
601 display: flex; 634 display: flex;
602 border-top: 1rpx solid #eee; 635 padding: 0 30rpx 30rpx;
636 gap: 24rpx;
603 } 637 }
604 638
605 .popup-btn { 639 .popup-btn {
606 flex: 1; 640 flex: 1;
607 height: 100rpx; 641 height: 80rpx;
608 line-height: 100rpx; 642 line-height: 80rpx;
609 text-align: center; 643 text-align: center;
610 font-size: 30rpx; 644 font-size: 30rpx;
645 border-radius: 40rpx;
611 } 646 }
612 647
613 .popup-btn.cancel { 648 .popup-btn.cancel {
614 color: #666; 649 background: #fff;
615 border-right: 1rpx solid #eee; 650 color: #AD181F;
651 border: 2rpx solid #AD181F;
616 } 652 }
617 653
618 .popup-btn.confirm { 654 .popup-btn.confirm {
619 color: #AD181F; 655 background: #AD181F;
620 font-weight: 500; 656 color: #fff;
621 } 657 }
622 </style> 658 </style>
......
...@@ -59,6 +59,20 @@ ...@@ -59,6 +59,20 @@
59 </view> 59 </view>
60 </view> 60 </view>
61 </view> 61 </view>
62
63 <!-- 自定义弹框 -->
64 <customModal
65 ref="customModalRef"
66 :title="modalConfig.title"
67 :content="modalConfig.content"
68 :isHtml="modalConfig.isHtml"
69 :showCancel="modalConfig.showCancel"
70 :showConfirm="modalConfig.showConfirm"
71 :cancelText="modalConfig.cancelText"
72 :confirmText="modalConfig.confirmText"
73 @confirm="onModalConfirm"
74 @cancel="onModalCancel"
75 ></customModal>
62 </template> 76 </template>
63 77
64 <script setup> 78 <script setup>
...@@ -72,6 +86,7 @@ import { ...@@ -72,6 +86,7 @@ import {
72 groupMemberRegister 86 groupMemberRegister
73 } from '@/common/login.js' 87 } from '@/common/login.js'
74 import config from '@/config.js' 88 import config from '@/config.js'
89 import customModal from '@/components/custom-modal.vue'
75 const agree = ref(false) 90 const agree = ref(false)
76 const codeUrl = ref(null) 91 const codeUrl = ref(null)
77 const registerForm = ref({ 92 const registerForm = ref({
...@@ -86,6 +101,46 @@ const countDown = ref({ ...@@ -86,6 +101,46 @@ const countDown = ref({
86 start: false, 101 start: false,
87 second: 60 102 second: 60
88 }) 103 })
104
105 // 自定义弹框
106 const customModalRef = ref(null)
107 const modalConfig = ref({
108 title: '',
109 content: '',
110 isHtml: false,
111 showCancel: true,
112 showConfirm: true,
113 cancelText: '取消',
114 confirmText: '确定'
115 })
116
117 function onModalConfirm() {
118 if (modalConfig.value.onConfirm) {
119 modalConfig.value.onConfirm()
120 }
121 }
122
123 function onModalCancel() {
124 if (modalConfig.value.onCancel) {
125 modalConfig.value.onCancel()
126 }
127 }
128
129 function showModal(options) {
130 modalConfig.value = {
131 title: options.title || '',
132 content: options.content || '',
133 isHtml: options.isHtml || false,
134 showCancel: options.showCancel !== false,
135 showConfirm: options.showConfirm !== false,
136 cancelText: options.cancelText || '取消',
137 confirmText: options.confirmText || '确定',
138 onConfirm: options.onConfirm,
139 onCancel: options.onCancel
140 }
141 customModalRef.value?.open()
142 }
143
89 const inputstyle = ref({ 144 const inputstyle = ref({
90 borderColor: 'transparent', 145 borderColor: 'transparent',
91 fontSize: '30rpx' 146 fontSize: '30rpx'
...@@ -138,18 +193,14 @@ function register() { ...@@ -138,18 +193,14 @@ function register() {
138 193
139 groupMemberRegister(registerForm.value) 194 groupMemberRegister(registerForm.value)
140 .then((res) => { 195 .then((res) => {
141 uni.showModal({ 196 showModal({
142 title: '提示', 197 title: '提示',
143 content: `恭喜你,您的账号 ${registerForm.value.telNo} 注册成功!`, 198 content: `恭喜你,您的账号 ${registerForm.value.telNo} 注册成功!`,
144 confirmText: '去登录',
145 cancelText: '取消', 199 cancelText: '取消',
146 success: (res) => { 200 confirmText: '去登录',
147 if (res.confirm) { 201 onConfirm: () => {
148 registerForm.value = {} 202 registerForm.value = {}
149 goLogin() 203 goLogin()
150 } else {
151 // 取消,保持当前页面
152 }
153 } 204 }
154 }) 205 })
155 }) 206 })
......
...@@ -23,18 +23,19 @@ ...@@ -23,18 +23,19 @@
23 style="margin: 0 20rpx 0 0;" @click="payTheFees">激活 23 style="margin: 0 20rpx 0 0;" @click="payTheFees">激活
24 </button> 24 </button>
25 <view v-else> 25 <view v-else>
26 <button v-if="form.deptType==6" 26 <!-- :disabled="auditStatus==1||auditStatus==2||form.isPoints==0" class="btn-red" -->
27 :disabled="auditStatus==1||auditStatus==2||form.isPoints==0" class="btn-red" 27 <!-- <button v-if="form.deptType==6"
28
28 size="mini" 29 size="mini"
29 style="margin: 0 20rpx 0 0;" 30 style="margin: 0 20rpx 0 0;"
30 @click="showApplyDialog">考点申请 31 @click="showApplyDialog">考点申请
31 </button> 32 </button> -->
32 <button v-if="form.deptType==6" 33 <!-- <button v-if="form.deptType==6"
33 class="btn-red-kx" 34 class="btn-red-kx"
34 size="mini" 35 size="mini"
35 style="margin: 0 20rpx 0 0;" 36 style="margin: 0 20rpx 0 0;"
36 @click="auditEditFN(2)">考点详情 37 @click="auditEditFN(2)">考点详情
37 </button> 38 </button> -->
38 <button :disabled="btn" class="btn-red" size="mini" style="margin: 0 20rpx 0 0;" 39 <button :disabled="btn" class="btn-red" size="mini" style="margin: 0 20rpx 0 0;"
39 @click="payTheFees">去缴费 40 @click="payTheFees">去缴费
40 </button> 41 </button>
......
1 <template> 1 <template>
2 <view class="container"> 2 <view class="container">
3 <!-- 自定义弹窗 -->
4 <custom-modal ref="customModalRef" :title="modalConfig.title" :content="modalConfig.content" :showCancel="modalConfig.showCancel" :cancelText="modalConfig.cancelText" :confirmText="modalConfig.confirmText" @confirm="onModalConfirm" />
5
3 <!-- 考官选择类型 --> 6 <!-- 考官选择类型 -->
4 <view class="radio-section"> 7 <view class="radio-section">
5 <radio-group class="radio-group" @change="onSelfSelectChange"> 8 <radio-group class="radio-group" @change="onSelfSelectChange">
...@@ -13,20 +16,24 @@ ...@@ -13,20 +16,24 @@
13 </label> 16 </label>
14 </radio-group> 17 </radio-group>
15 </view> 18 </view>
19
20 <!-- 温馨提示 -->
21 <view v-if="form.selfSelect == '1'" class="tip-box">
22 <text class="tip-text">温馨提示: 您可以自行录入考官信息,如果暂时没有合适的考官,也可以选择由省跆协指派(支持多选)进行考点申报,同时请尽快完成考点考官的认证。</text>
23 </view>
24
25 <!-- 省跆协指派提示 -->
26 <view v-if="form.selfSelect == '0'" class="tip-box">
27 <text class="tip-text">温馨提示:关于考官指派,请联系{{ shenForm.baseName || '' }},联系电话:{{ shenForm.phone || '' }}</text>
28 </view>
29
16 <view class="section"> 30 <view class="section">
17 <!-- 自行录入考官区域 --> 31 <!-- 自行录入考官区域 -->
18 <view v-if="form.selfSelect==0" class="section examiner-section"> 32 <view v-if="form.selfSelect == '1'" class="section examiner-section">
19 <view class="modal-title">温馨提示</view>
20 <view class="modal-content"> 关于考官指派,请联系{{ shenForm.baseName }},联系电话:{{ shenForm.phone }}
21 </view>
22 </view>
23
24 <!-- 温馨提示 -->
25 <view v-if="showExamine" class="section examiner-section">
26 <button class="add-btn" @click="handelAddExamine">+ 添加考官</button> 33 <button class="add-btn" @click="handelAddExamine">+ 添加考官</button>
27 </view> 34 </view>
28 35
29 <view v-if="showExamine" class="examiner-list"> 36 <view v-if="form.selfSelect == '1'" class="examiner-list">
30 <view v-for="(item, index) in list" :key="item.id" class="examiner-item"> 37 <view v-for="(item, index) in list" :key="item.id" class="examiner-item">
31 <view class="info"> 38 <view class="info">
32 <text class="name">{{ item.perName }} {{ item.perCode }}</text> 39 <text class="name">{{ item.perName }} {{ item.perCode }}</text>
...@@ -41,62 +48,15 @@ ...@@ -41,62 +48,15 @@
41 <view class="submit-area"> 48 <view class="submit-area">
42 <button class="submit-btn" @click="handelSubmit">确定提交</button> 49 <button class="submit-btn" @click="handelSubmit">确定提交</button>
43 </view> 50 </view>
44
45 <!-- 自定义考点申请弹窗(替换原uni.showModal) -->
46 <uni-popup ref="applyPopup" background-color="rgba(0,0,0,0.5)" type="center">
47 <view class="custom-modal">
48 <view class="modal-title">考点申请</view>
49 <view class="modal-btns">
50 <button class="btn-cancel" @click="closeApplyPopup()">暂不申请</button>
51 <button class="btn-confirm" @click="confirmApply()">立即申请</button>
52 </view>
53 <view class="modal-tip">友情提示:非考点无法申请级位考试</view>
54 </view>
55 </uni-popup>
56
57 <!-- 自定义删除确认弹窗 -->
58 <uni-popup ref="delPopup" background-color="rgba(0,0,0,0.5)" type="center">
59 <view class="custom-modal">
60 <view class="modal-title">提示</view>
61 <view class="modal-content">确定删除该考官吗?</view>
62 <view class="modal-btns">
63 <button class="btn-cancel" @click="closeDelPopup()">取消</button>
64 <button class="btn-confirm" @click="confirmDel()">确定</button>
65 </view>
66 </view>
67 </uni-popup>
68
69 <!-- 自定义省跆协指派提示弹窗 -->
70 <uni-popup ref="assignPopup" background-color="rgba(0,0,0,0.5)" type="center">
71 <view class="custom-modal">
72 <view class="modal-title">温馨提示</view>
73 <view class="modal-content"> 关于考官指派,请联系{{ shenForm.baseName }},联系电话:{{ shenForm.phone }}
74 </view>
75 <view class="modal-btns">
76 <button class="btn-confirm single-btn" @click="closeAssignPopup()">我知道了</button>
77 </view>
78 </view>
79 </uni-popup>
80
81 <!-- 自定义提交成功弹窗 -->
82 <uni-popup ref="successPopup" background-color="rgba(0,0,0,0.5)" type="center">
83 <view class="custom-modal">
84 <view class="modal-title">成功</view>
85 <view class="modal-content">提交成功,请等待审核</view>
86 <view class="modal-btns">
87 <button class="btn-confirm single-btn" @click="confirmSuccess()">确定</button>
88 </view>
89 </view>
90 </uni-popup>
91 </view> 51 </view>
92 </template> 52 </template>
93 53
94 <script setup> 54 <script setup>
95 import {ref,} from 'vue' 55 import {ref} from 'vue'
96 import {onLoad, onShow} from '@dcloudio/uni-app' 56 import {onLoad, onShow} from '@dcloudio/uni-app'
97 import * as api from '@/common/api.js' 57 import * as api from '@/common/api.js'
98 import {getShenMemberInfo} from "@/common/api.js"; 58 import customModal from '@/components/custom-modal.vue'
99 59 const app = getApp();
100 const form = ref({ 60 const form = ref({
101 selfSelect: '1' // 1:自行录入 0:省跆协指派 61 selfSelect: '1' // 1:自行录入 0:省跆协指派
102 }) 62 })
...@@ -106,28 +66,33 @@ const list = ref([]) ...@@ -106,28 +66,33 @@ const list = ref([])
106 const memId = ref(null) 66 const memId = ref(null)
107 const shenForm = ref({}) 67 const shenForm = ref({})
108 68
109 // 弹窗引用 69 // 自定义弹窗
110 const applyPopup = ref(null) 70 const customModalRef = ref(null)
111 const delPopup = ref(null) 71 const modalConfig = ref({
112 const assignPopup = ref(null) 72 title: '',
113 const successPopup = ref(null) 73 content: '',
114 let currentDelItem = ref(null) 74 showCancel: true,
75 cancelText: '取消',
76 confirmText: '确定'
77 })
78 let modalAction = '' // 'del', 'success', 'assign', 'apply'
79 let pendingDelItem = null
115 80
116 onLoad((option) => { 81 onLoad((option) => {
117 memId.value = option.memId 82 // memId.value = app.globalData.memberInfo.memId
118 getExaminer() 83 getExaminer()
119 }) 84 })
120 85
121 onShow(() => { 86 onShow(() => {
122 if (memId.value) { 87 // if (memId.value) {
123 getExaminer() 88 getExaminer()
124 } 89 // }
125 getShenMemberInfoFn() 90 getShenMemberInfoFn()
126 }) 91 })
127 92
128 async function getExaminer() { 93 async function getExaminer() {
129 loading.value = true 94 loading.value = true
130 const res = await api.listApi({memId: memId.value}) 95 const res = await api.listApi({memId: app.globalData.memberInfo.memId})
131 list.value = res.rows 96 list.value = res.rows
132 loading.value = false 97 loading.value = false
133 } 98 }
...@@ -139,20 +104,16 @@ async function getShenMemberInfoFn() { ...@@ -139,20 +104,16 @@ async function getShenMemberInfoFn() {
139 104
140 // 删除考官:打开自定义弹窗 105 // 删除考官:打开自定义弹窗
141 function handleDel(row) { 106 function handleDel(row) {
142 currentDelItem.value = row 107 pendingDelItem = row
143 delPopup.value.open() 108 modalAction = 'del'
144 } 109 modalConfig.value = {
145 110 title: '提示',
146 // 确认删除 111 content: '确定删除该考官吗?',
147 async function confirmDel() { 112 showCancel: true,
148 await api.examinerDel(currentDelItem.value.id) 113 cancelText: '取消',
149 uni.showToast({title: '删除成功', icon: 'success'}) 114 confirmText: '确定'
150 await getExaminer() 115 }
151 closeDelPopup() 116 customModalRef.value.open()
152 }
153
154 function closeDelPopup() {
155 delPopup.value.close()
156 } 117 }
157 118
158 // 切换考官类型:打开自定义提示弹窗 119 // 切换考官类型:打开自定义提示弹窗
...@@ -160,14 +121,17 @@ function onSelfSelectChange(e) { ...@@ -160,14 +121,17 @@ function onSelfSelectChange(e) {
160 form.value.selfSelect = e.detail.value 121 form.value.selfSelect = e.detail.value
161 showExamine.value = e.detail.value == '1' 122 showExamine.value = e.detail.value == '1'
162 if (e.detail.value == '0') { 123 if (e.detail.value == '0') {
163 assignPopup.value.open() 124 modalAction = 'assign'
125 modalConfig.value = {
126 title: '温馨提示',
127 content: `关于考官指派,请联系${shenForm.value.baseName || ''},联系电话:${shenForm.value.phone || ''}`,
128 showCancel: false,
129 confirmText: '我知道了'
130 }
131 customModalRef.value.open()
164 } 132 }
165 } 133 }
166 134
167 function closeAssignPopup() {
168 assignPopup.value.close()
169 }
170
171 function handelAddExamine() { 135 function handelAddExamine() {
172 const chosenStr = JSON.stringify(list.value) 136 const chosenStr = JSON.stringify(list.value)
173 uni.navigateTo({ 137 uni.navigateTo({
...@@ -175,7 +139,7 @@ function handelAddExamine() { ...@@ -175,7 +139,7 @@ function handelAddExamine() {
175 }) 139 })
176 } 140 }
177 141
178 // 提交申请:打开自定义成功弹窗 142 // 提交申请
179 async function handelSubmit() { 143 async function handelSubmit() {
180 if (!form.value.selfSelect) { 144 if (!form.value.selfSelect) {
181 return uni.showToast({title: '请选择考官类型', icon: 'none'}) 145 return uni.showToast({title: '请选择考官类型', icon: 'none'})
...@@ -183,27 +147,47 @@ async function handelSubmit() { ...@@ -183,27 +147,47 @@ async function handelSubmit() {
183 if (form.value.selfSelect == '1' && list.value.length == 0) { 147 if (form.value.selfSelect == '1' && list.value.length == 0) {
184 return uni.showToast({title: '请添加考官', icon: 'none'}) 148 return uni.showToast({title: '请添加考官', icon: 'none'})
185 } 149 }
186
187 try {
188 await api.commitExamPointApply(form.value)
189 successPopup.value.open()
190 } catch (err) {
191 uni.showToast({title: err.data.msg, icon: 'none'})
192 }
193 }
194 150
195 function confirmSuccess() { 151 modalAction = 'success'
196 successPopup.value.close() 152 modalConfig.value = {
197 uni.navigateBack() 153 title: '提示',
198 } 154 content: '友情提示:非考点无法申请级位考试,是否确认提交申请?',
199 155 showCancel: true,
200 // 考点申请弹窗(如需调用可在合适位置打开) 156 cancelText: '暂不申请',
201 function openApplyPopup() { 157 confirmText: '确认提交'
202 applyPopup.value.open() 158 }
203 } 159 customModalRef.value.open()
204 160 }
205 function closeApplyPopup() { 161
206 applyPopup.value.close() 162 // 弹窗确认回调
163 async function onModalConfirm() {
164 if (modalAction === 'del' && pendingDelItem) {
165 try {
166 await api.examinerDel(pendingDelItem.id)
167 uni.showToast({title: '删除成功', icon: 'success'})
168 await getExaminer()
169 } catch (e) {
170 uni.showToast({title: '删除失败', icon: 'error'})
171 }
172 pendingDelItem = null
173 } else if (modalAction === 'success') {
174 try {
175 await api.commitExamPointApply(form.value)
176 modalAction = 'submitSuccess'
177 modalConfig.value = {
178 title: '成功',
179 content: '提交成功,请等待审核',
180 showCancel: false,
181 confirmText: '确定'
182 }
183 customModalRef.value.open()
184 } catch (err) {
185 uni.showToast({title: err.data?.msg || '提交失败', icon: 'none'})
186 }
187 } else if (modalAction === 'submitSuccess') {
188 uni.navigateBack()
189 }
190 modalAction = ''
207 } 191 }
208 192
209 function confirmApply() { 193 function confirmApply() {
...@@ -231,6 +215,19 @@ function confirmApply() { ...@@ -231,6 +215,19 @@ function confirmApply() {
231 border-radius: 0; 215 border-radius: 0;
232 } 216 }
233 217
218 /* 提示框 */
219 .tip-box {
220 background: #fff7e6;
221 padding: 20rpx 30rpx;
222 margin-bottom: 10rpx;
223 }
224
225 .tip-text {
226 font-size: 24rpx;
227 color: #fa8c16;
228 line-height: 1.6;
229 }
230
234 .radio-group { 231 .radio-group {
235 display: flex; 232 display: flex;
236 align-items: center; 233 align-items: center;
......
1 <template>
2 <view class="exam-point-list">
3 <!-- 顶部申请按钮 -->
4 <view class="apply-btn-box">
5 <button class="apply-btn" :disabled="memberInfo.isPoints==0||memberInfo.auditStatus==2" @click="goApply">申请考点</button>
6 </view>
7
8 <!-- 列表 -->
9 <view class="list-content">
10 <view v-if="list.length === 0 && !loading" class="empty-tip">
11 <text>暂无申请记录</text>
12 </view>
13
14 <view
15 v-for="(item, index) in list"
16 :key="index"
17 class="list-item"
18 :class="{ 'success-row': item.shenAuditStatus == 2 }"
19 >
20 <view class="item-row">
21 <text class="item-label">审核协会</text>
22 <text class="item-value">{{ item.auditDeptName || '-' }}</text>
23 </view>
24 <view class="item-row">
25 <text class="item-label">审核日期</text>
26 <text class="item-value">{{ formatDate(item.auditTime) }}</text>
27 </view>
28 <view class="item-row">
29 <text class="item-label">审核状态</text>
30 <text class="item-status" :class="getStatusClass(item.auditResult)">
31 {{ item.auditResult == 0 ? '审核未通过' : '审核通过' }}
32 </text>
33 </view>
34 <view class="item-row">
35 <text class="item-label">理由</text>
36 <text class="item-value">{{ item.auditMsg ? item.auditMsg : '/' }}</text>
37 </view>
38 </view>
39
40 <view v-if="loading" class="loading-tip">
41 <text>加载中...</text>
42 </view>
43
44 <view v-if="noMore && list.length > 0" class="no-more-tip">
45 <text>没有更多了</text>
46 </view>
47 </view>
48 </view>
49 </template>
50
51 <script setup>
52 import { ref } from 'vue'
53 import { onLoad, onReachBottom } from '@dcloudio/uni-app'
54 import { getMyRecent } from '@/common/api'
55 const app = getApp()
56 const list = ref([])
57 const loading = ref(false)
58 const noMore = ref(false)
59 const pageNum = ref(1)
60 const pageSize = ref(10)
61 const memberInfo = app.globalData.memberInfo
62 onLoad(() => {
63 loadData()
64 })
65
66 function loadData() {
67 if (loading.value) return
68 loading.value = true
69
70 getMyRecent().then(res => {
71 if (res.data && res.data.auditLogs) {
72 try {
73 list.value = JSON.parse(res.data.auditLogs)
74 } catch (e) {
75 list.value = []
76 }
77 } else {
78 list.value = []
79 }
80 }).finally(() => {
81 loading.value = false
82 })
83 }
84
85 onReachBottom(() => {
86 if (!noMore.value) {
87 pageNum.value++
88 loadData()
89 }
90 })
91
92 function goApply() {
93 uni.navigateTo({
94 url: '/pages/index/notice-examPointApply'
95 })
96 }
97
98
99 function getStatusClass(status) {
100 return {
101 'status-1': status == 0,
102 'status-2': status == 1,
103 'status-3': status == 3
104 }
105 }
106
107 function formatDate(dateStr) {
108 if (!dateStr) return '-'
109 const date = new Date(dateStr)
110 const year = date.getFullYear()
111 const month = String(date.getMonth() + 1).padStart(2, '0')
112 const day = String(date.getDate()).padStart(2, '0')
113 return `${year}-${month}-${day}`
114 }
115 </script>
116
117 <style lang="scss" scoped>
118 .exam-point-list {
119 min-height: 100vh;
120 background: #f5f5f5;
121 }
122
123 .apply-btn-box {
124 padding: 20rpx 30rpx;
125 }
126
127 .apply-btn {
128 width: 100%;
129 height: 80rpx;
130 line-height: 80rpx;
131 background: #C4121B;
132 color: #fff;
133 font-size: 28rpx;
134 border-radius: 44rpx;
135 border: none;
136
137 &::after {
138 border: none;
139 }
140
141 &[disabled] {
142 background: #f3d4d5 !important;
143 color: #b7b5b5 !important;
144 border: 2rpx solid #e0e0e0 !important;
145 opacity: 1;
146 }
147 }
148 .list-content {
149 padding: 0 20rpx 20rpx;
150 }
151
152 .empty-tip,
153 .loading-tip,
154 .no-more-tip {
155 text-align: center;
156 padding: 60rpx 0;
157 color: #999;
158 font-size: 26rpx;
159 }
160
161 .list-item {
162 background: #fff;
163 border-radius: 16rpx;
164 padding: 24rpx;
165 margin-bottom: 20rpx;
166 }
167
168 .list-item.success-row {
169 border-left: 6rpx solid #19be6b;
170 }
171
172 .item-row {
173 display: flex;
174 margin-bottom: 16rpx;
175
176 &:last-child {
177 margin-bottom: 0;
178 }
179 }
180
181 .item-label {
182 width: 140rpx;
183 font-size: 26rpx;
184 color: #999;
185 }
186
187 .item-value {
188 flex: 1;
189 font-size: 26rpx;
190 color: #333;
191 }
192
193 .item-status {
194 font-size: 26rpx;
195 padding: 4rpx 16rpx;
196 border-radius: 20rpx;
197 }
198
199 .status-1 {
200 background: #fff7e6;
201 color: #fa8c16;
202 }
203
204 .status-2 {
205 background: #e6fff7;
206 color: #52c41a;
207 }
208
209 .status-3 {
210 background: #fff1f0;
211 color: #ff4d4f;
212 }
213 </style>
...@@ -237,16 +237,13 @@ const cancelModalContent = ref(''); ...@@ -237,16 +237,13 @@ const cancelModalContent = ref('');
237 const currentOrder = ref(null); 237 const currentOrder = ref(null);
238 238
239 // 页面挂载初始化 239 // 页面挂载初始化
240 onMounted(() => { 240 onLoad((option) => {
241 // 获取app实例和deptType 241 // 获取app实例和deptType
242 const app = getApp(); 242 const app = getApp();
243 console.log('onMounted - app:', app);
244 console.log('onMounted - app.globalData:', app.globalData);
245 deptType.value = Number(app.globalData?.deptType || 0); 243 deptType.value = Number(app.globalData?.deptType || 0);
246 console.log('onMounted - deptType.value:', deptType.value, typeof deptType.value);
247 const firstType = tabs.value[0]?.type ?? '0'; 244 const firstType = tabs.value[0]?.type ?? '0';
248 currentTab.value = firstType; 245 currentTab.value = option.type || firstType;
249 queryParams.type = firstType; 246 queryParams.type = option.type ||firstType;
250 initData(); 247 initData();
251 }); 248 });
252 249
...@@ -290,7 +287,7 @@ const getStatusText = (status) => { ...@@ -290,7 +287,7 @@ const getStatusText = (status) => {
290 1: '缴费成功', 287 1: '缴费成功',
291 2: '订单取消' 288 2: '订单取消'
292 }; 289 };
293 return map[status] || '未知状态'; 290 return map[status] || '';
294 }; 291 };
295 292
296 // 审核状态文本映射 293 // 审核状态文本映射
...@@ -301,7 +298,7 @@ const getAuditStatusText = (status) => { ...@@ -301,7 +298,7 @@ const getAuditStatusText = (status) => {
301 2: '审核通过', 298 2: '审核通过',
302 3: '审核拒绝' 299 3: '审核拒绝'
303 }; 300 };
304 return map[status] || '未知状态'; 301 return map[status] || '';
305 }; 302 };
306 303
307 // 数据请求核心方法 304 // 数据请求核心方法
......
...@@ -6,8 +6,8 @@ ...@@ -6,8 +6,8 @@
6 <uni-forms-item label="所属协会" required> 6 <uni-forms-item label="所属协会" required>
7 <view style="width: 60vw;overflow:auto;"> 7 <view style="width: 60vw;overflow:auto;">
8 <uni-data-picker v-model="form.parentId" :localdata="tree" 8 <uni-data-picker v-model="form.parentId" :localdata="tree"
9 :readonly="type&&parentId!=-1&&parentId!=0" :clear-icon="false" 9 :readonly="type&&parentId!=-1&&parentId!=0" :clear-icon="false" placeholder="请选择协会"
10 :map="{text:'label',value:'id'}" popup-title="请选择" @change="changCase"> 10 :map="{text:'label',value:'id'}" popup-title="" @change="changCase">
11 </uni-data-picker> 11 </uni-data-picker>
12 </view> 12 </view>
13 </uni-forms-item> 13 </uni-forms-item>
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
32 <uni-easyinput v-model="form.siteTel" /> 32 <uni-easyinput v-model="form.siteTel" />
33 </uni-forms-item> 33 </uni-forms-item>
34 <uni-forms-item label="认证地址" required> 34 <uni-forms-item label="认证地址" required>
35 <uni-data-picker v-model="form.coordinates1" @change="changeCoordinates1" 35 <uni-data-picker v-model="form.coordinates1" @change="changeCoordinates1" placeholder="请选择认证地址"
36 :localdata="regionsList"></uni-data-picker> 36 :localdata="regionsList"></uni-data-picker>
37 </uni-forms-item> 37 </uni-forms-item>
38 <uni-forms-item label="详细地址" required> 38 <uni-forms-item label="详细地址" required>
...@@ -792,7 +792,7 @@ ...@@ -792,7 +792,7 @@
792 } 792 }
793 793
794 :deep(.input-value) { 794 :deep(.input-value) {
795 padding: 0 5px; 795 padding: 0 5rpx;
796 } 796 }
797 797
798 .picker-view { 798 .picker-view {
......
...@@ -45,21 +45,29 @@ const recordList = ref([]) ...@@ -45,21 +45,29 @@ const recordList = ref([])
45 45
46 onLoad(async (option) => { 46 onLoad(async (option) => {
47 console.log(option) 47 console.log(option)
48 if (option.type == 1) await getMyRecentFN() 48 if (!option.type || option.type == 1) await getMyRecentFN()
49 if (option.type == 2) await getMyRecentExamFn() 49 if (option.type == 2) await getMyRecentExamFn()
50 }) 50 })
51 51
52 async function getMyRecentFN() { 52 async function getMyRecentFN() {
53 const [err, res] = await to(api.getMyRecent()) 53 const [err, res] = await to(api.getMyRecent())
54 if (!err && res.data && res.data.auditLogs) { 54 if (!err && res.data && res.data.auditLogs) {
55 recordList.value = JSON.parse(res.data.auditLogs) 55 try {
56 recordList.value = JSON.parse(res.data.auditLogs) || []
57 } catch (e) {
58 recordList.value = []
59 }
56 } 60 }
57 } 61 }
58 62
59 async function getMyRecentExamFn() { 63 async function getMyRecentExamFn() {
60 const [err, res] = await to(api.getMyRecentExam()) 64 const [err, res] = await to(api.getMyRecentExam())
61 if (!err && res.data && res.data.auditLogs) { 65 if (!err && res.data && res.data.auditLogs) {
62 recordList.value = JSON.parse(res.data.auditLogs) 66 try {
67 recordList.value = JSON.parse(res.data.auditLogs) || []
68 } catch (e) {
69 recordList.value = []
70 }
63 } 71 }
64 } 72 }
65 </script> 73 </script>
......
...@@ -47,6 +47,7 @@ ...@@ -47,6 +47,7 @@
47 47
48 </view> 48 </view>
49 49
50 <!-- 道馆 -->
50 <view v-if="userType=='4'" class="girdBox"> 51 <view v-if="userType=='4'" class="girdBox">
51 <view @click="goPath('/personalVip/mobilize')"> 52 <view @click="goPath('/personalVip/mobilize')">
52 <uni-badge :text="numData.personTransferCount" class="potag"/> 53 <uni-badge :text="numData.personTransferCount" class="potag"/>
...@@ -63,6 +64,87 @@ ...@@ -63,6 +64,87 @@
63 级位变更 64 级位变更
64 </view> 65 </view>
65 </view> 66 </view>
67 <view v-if="userType=='4'" class="girdFather">
68 <view class="ttt">个人会员</view>
69 <view class="girdBox">
70 <view @click="goPath('/personalVip/addVip')">
71 <uni-badge :text="numData.personTransferCount" class="potag"/>
72 <image :src="config.baseUrl_api+'/fs/static/icon/2.png'"/>
73 添加会员
74 </view>
75 <view @click="goPath('/personalVip/list')">
76 <image :src="config.baseUrl_api+'/fs/static/icon/25.png'"/>
77 会员列表
78 </view>
79 <view @click="goPath('/personalVip/mobilize')">
80 <image :src="config.baseUrl_api+'/fs/static/icon/28.png'"/>
81 会员调动
82 </view>
83 <view @click="goPath('/personalVip/payment')">
84 <image :src="config.baseUrl_api+'/fs/static/icon/28.png'"/>
85 会员缴费
86 </view>
87 <view @click="goPath('/personal/memberAuditRecord')">
88 <image :src="config.baseUrl_api+'/fs/static/icon/28.png'"/>
89 会员审核记录
90 </view>
91 <view @click="goPath('/myCenter/order?type=0')">
92 <image :src="config.baseUrl_api+'/fs/static/icon/28.png'"/>
93 订单列表
94 </view>
95 </view>
96 <view class="ttt">单位会员</view>
97 <view class="girdBox">
98 <view @click="goPath('/myCenter/auth')">
99 <uni-badge :text="numData.memberJiaofeiCount" class="potag"/>
100 <image :src="config.baseUrl_api+'/fs/static/icon/4.png'"/>
101 会员认证
102 </view>
103
104 <view @click="goPath('/myCenter/reviewList')">
105 <image :src="config.baseUrl_api+'/fs/static/icon/27.png'"/>
106 认证详情
107 </view>
108 <view @click="goPath('/myCenter/examPointApplyList')">
109 <image :src="config.baseUrl_api+'/fs/static/icon/17.png'"/>
110 考点申请
111 </view>
112 <view @click="goPath('/myCenter/order?type=1')">
113 <image :src="config.baseUrl_api+'/fs/static/icon/9.png'"/>
114 订单列表
115 </view>
116 </view>
117 <view class="ttt">级位管理</view>
118 <view class="girdBox">
119
120 <view @click="goPath('/level/apply')">
121 <image :src="config.baseUrl_api+'/fs/static/icon/3.png'"/>
122 考试申请
123 </view>
124
125 <view @click="goPath('/level/ztx/mail')">
126 <image :src="config.baseUrl_api+'/fs/static/icon/25.png'"/>
127 证书邮寄
128 </view>
129 <view @click="goPath('/level/ztx/costSettlement')">
130 <image :src="config.baseUrl_api+'/fs/static/icon/10.png'"/>
131 证书下载
132 </view>
133 <view @click="goPath('/personalVip/changeLevel')">
134 <image :src="config.baseUrl_api+'/fs/static/icon/26.png'"/>
135 级位变更
136 </view>
137 <view @click="goPath('/level/chooseExaminer?pageType=1')">
138 <image :src="config.baseUrl_api+'/fs/static/icon/10.png'"/>
139 考官库
140 </view>
141 <view @click="goPath('/myCenter/order?type=2')">
142 <image :src="config.baseUrl_api+'/fs/static/icon/10.png'"/>
143 订单列表
144 </view>
145 </view>
146
147 </view>
66 <view v-if="userType=='3'" class="girdBox"> 148 <view v-if="userType=='3'" class="girdBox">
67 <view @click="goPath('/group/apply/applyList')"> 149 <view @click="goPath('/group/apply/applyList')">
68 <uni-badge :text="numData.memberJiaofeiCount" class="potag"/> 150 <uni-badge :text="numData.memberJiaofeiCount" class="potag"/>
......
1 <template>
2 <view class="notice-page">
3 <view class="notice-content">
4
5 <view class="notice-body">
6 <view class="section">中国跆拳道协会团体会员入会申请免责声明</view>
7 <view class="section ">
8 <view class="section-text">尊敬的申请单位:</view>
9 <view class="section-text mt20">为确保中国跆拳道协会(以下简称"中国跆协")会员管理工作的规范性与严肃性,保障贵单位合法权益,请在提交入会申请材料并缴纳会费前,仔细阅读本声明。贵单位一旦勾选"同意",即视为已理解并自愿接受以下条款的约束。</view>
10 </view>
11
12 <view class="section">
13 <view class="section-title">一、信息真实性承诺</view>
14 <view class="section-item">1. 贵单位保证在入会申请过程中提交的全部材料(包括但不限于营业执照、法人身份证明、场所证明及从业人员资质证明等)均真实、准确、完整、有效。</view>
15 <view class="section-item">2. 若贵单位提交虚假、伪造、变造或失效的材料,由此产生的一切法律责任及后果由贵单位自行承担;中国跆协有权无条件取消会员资格,且已缴纳会费不予退还。</view>
16 </view>
17
18 <view class="section">
19 <view class="section-title">二、主体合法性承诺</view>
20 <view class="section-item">1. 贵单位保证系依法登记注册并合法存续的法人或非法人组织,具备申请成为中国跆协团体会员的法定资格。</view>
21 <view class="section-item">2. 贵单位的经营活动及业务范围符合国家法律法规及跆拳道行业管理规范,不存在被吊销、注销、列入经营异常名录或严重违法失信名单等情形。</view>
22 </view>
23
24 <view class="section">
25 <view class="section-title">三、授权与程序合规性承诺</view>
26 <view class="section-item">1. 贵单位确认本次入会申请已经通过内部合法决策程序(如股东会、理事会决议或法定代表人决定),系单位真实意愿。</view>
27 <view class="section-item">2. 贵单位指定办理入会手续的人员已获得充分授权,其在线勾选同意本声明的行为具有法律效力。</view>
28 </view>
29
30 <view class="section">
31 <view class="section-title">四、遵守协会规章承诺</view>
32 <view class="section-item">1. 贵单位承诺入会后严格遵守《中国跆拳道协会章程》《中国跆拳道协会会员管理办法》及中国跆协发布的其他规章制度。</view>
33 <view class="section-item">2. 贵单位知晓并接受:违反上述规章的,中国跆协有权依据规定给予警告、限期整改、暂停会员资格直至取消会员资格的处罚。</view>
34 </view>
35
36 <view class="section">
37 <view class="section-title">五、信息变更告知义务</view>
38 <view class="section-item">1. 贵单位承诺在会员资格存续期间,如单位名称、法定代表人、联系方式、经营状态等信息发生变更,将在变更之日起15个工作日内通过会员系统更新信息或书面告知中国跆协。</view>
39 <view class="section-item">2. 因未及时告知导致无法接收协会通知、证书发放错误或其他损失的,由贵单位自行承担责任。</view>
40 </view>
41
42 <view class="section">
43 <view class="section-title">六、免责条款</view>
44 <view class="section-item">1. 因贵单位提供信息不实、不完整或未及时更新信息,导致中国跆协或第三方遭受损失的,贵单位应承担全部赔偿责任。</view>
45 <view class="section-item">2. 因不可抗力(包括但不限于自然灾害、政府行为、政策法律法规变更、网络攻击或系统故障)导致贵单位申请信息丢失、泄露或申请流程中断的,中国跆协不承担责任,但应在条件允许时提供必要协助。</view>
46 </view>
47 </view>
48 </view>
49 </view>
50 </template>
51
52 <script setup>
53 function goBack() {
54 uni.navigateBack()
55 }
56 </script>
57
58 <style lang="scss" scoped>
59 .notice-page {
60 min-height: 100vh;
61 background: #f5f5f5;
62 display: flex;
63 flex-direction: column;
64 }
65
66 .notice-content {
67 flex: 1;
68 padding: 30rpx;
69 overflow-y: auto;
70 }
71
72 .notice-header {
73 padding: 40rpx 0;
74 text-align: center;
75 }
76
77 .notice-title {
78 font-size: 36rpx;
79 font-weight: 600;
80 color: #333;
81 }
82
83 .notice-body {
84 background: #fff;
85 border-radius: 16rpx;
86 padding: 40rpx;
87 }
88
89 .section {
90 margin-bottom: 40rpx;
91
92 &:last-child {
93 margin-bottom: 0;
94 }
95
96
97 }
98
99 .section-title {
100 font-size: 30rpx;
101 font-weight: 600;
102 color: #333;
103 margin-bottom: 20rpx;
104 line-height: 1.5;
105 }
106
107 .section-text {
108 font-size: 28rpx;
109 color: #666;
110 line-height: 1.8;
111 text-align: justify;
112
113 &.mt20 {
114 margin-top: 20rpx;
115 }
116 }
117
118 .section-item {
119 font-size: 28rpx;
120 color: #666;
121 line-height: 1.8;
122 margin-bottom: 12rpx;
123 text-align: justify;
124
125 &:last-child {
126 margin-bottom: 0;
127 }
128 }
129
130 .notice-footer {
131 padding: 30rpx;
132 background: #fff;
133 box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
134 }
135
136
137 </style>
1 <template>
2 <view class="notice-page">
3 <view class="notice-content">
4 <view class="notice-body">
5 <!-- <view class="title">考点申请须知</view> -->
6 <view class="subtitle">中国跆拳道协会考点申请须知</view>
7
8 <view class="paragraph">
9 欢迎贵单位申请成为中国跆拳道协会(以下简称中国跆协)考点。请确保本次申请系自愿行为,且已充分了解并愿意遵守本须知的全部内容。
10 </view>
11
12 <view class="section">
13 <view class="section-title">一、基本要求</view>
14 <view class="section-item">1. 申请单位须为中国跆协有效团体会员。</view>
15 <view class="section-item">2. 具体申请条件(人员资质、场地设施等)请以中国跆协官网公布的最新要求为准。</view>
16 </view>
17
18 <view class="section">
19 <view class="section-title">二、考点主要职责</view>
20 <view class="section-item">1. 按规定组织考试,接受协会统一安排。</view>
21 <view class="section-item">2. 严格执行收费标准,不得违规收费。</view>
22 <view class="section-item">3. 按时完成成绩上传及证书办理。</view>
23 </view>
24
25 <view class="section">
26 <view class="section-title">三、禁止事项</view>
27 <view class="section-item">- 严禁跨区域组织考试</view>
28 <view class="section-item">- 严禁为非会员单位办理证书</view>
29 <view class="section-item">- 严禁买卖或伪造证书</view>
30 <view class="section-item">- 严禁擅自颁发证书</view>
31 </view>
32
33 <view class="section">
34 <view class="section-title">四、违规处理</view>
35 <view class="section-item">视情节给予警告、暂停考点资格、取消考点资格、取消会员资格等处理;情节严重者列入行业黑名单。</view>
36 </view>
37
38 <view class="section">
39 <view class="section-title">五、其他</view>
40 <view class="section-item">本须知依据中国跆协相关规定制定,解释权归中国跆拳道协会所有。具体申请条件及材料清单,请登录中国跆拳道协会官网查询。</view>
41 </view>
42 </view>
43 </view>
44
45 <view class="notice-footer">
46 <button class="back-btn" @click="goBack">上一步</button>
47 <button class="agree-btn" @click="goApply">下一步</button>
48 </view>
49 </view>
50 </template>
51
52 <script setup>
53 function goApply() {
54 uni.navigateTo({
55 url: '/myCenter/examPointApply'
56 })
57 }
58 function goBack() {
59 uni.navigateBack({
60 delta: 1
61 })
62 }
63 </script>
64
65 <style lang="scss" scoped>
66 .notice-page {
67 min-height: 100vh;
68 background: #f5f5f5;
69 display: flex;
70 flex-direction: column;
71 }
72
73 .notice-content {
74 flex: 1;
75 padding: 30rpx;
76 overflow-y: auto;
77 }
78
79 .notice-body {
80 background: #fff;
81 border-radius: 16rpx;
82 padding: 40rpx;
83 }
84
85 .title {
86 font-size: 36rpx;
87 font-weight: 600;
88 color: #333;
89 text-align: center;
90 margin-bottom: 30rpx;
91 }
92
93 .subtitle {
94 font-size: 28rpx;
95 color: #666;
96 margin-bottom: 30rpx;
97 }
98
99 .paragraph {
100 font-size: 28rpx;
101 color: #666;
102 line-height: 1.8;
103 margin-bottom: 30rpx;
104 }
105
106 .section {
107 margin-bottom: 30rpx;
108 }
109
110 .section-title {
111 font-size: 30rpx;
112 font-weight: 600;
113 color: #333;
114 margin-bottom: 16rpx;
115 }
116
117 .section-item {
118 font-size: 26rpx;
119 color: #666;
120 line-height: 1.8;
121 margin-bottom: 8rpx;
122 text-align: justify;
123 }
124
125 .notice-footer {
126 padding: 30rpx;
127 background: #fff;
128 box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
129 display: flex;
130 justify-content: space-between;
131 }
132 .back-btn{
133 width: 48%;
134 height: 88rpx;
135 line-height: 88rpx;
136 background: #fff;
137 color: #C4121B;
138 font-size: 32rpx;
139 border-radius: 44rpx;
140 border: 1rpx solid #C4121B;
141 }
142 .agree-btn {
143 width: 48%;
144 height: 88rpx;
145 line-height: 88rpx;
146 background: #C4121B;
147 color: #fff;
148 font-size: 32rpx;
149 border-radius: 44rpx;
150 border: none;
151
152 &::after {
153 border: none;
154 }
155 }
156 </style>
1 <template>
2 <view class="notice-page">
3 <view class="notice-content">
4 <view class="notice-body">
5 <view class="section">中国跆拳道协会团体会员入会须知</view>
6 <view class="section ">
7 <view class="section-text">欢迎您申请成为中国跆拳道协会(以下简称中国跆协)团体会员。贵单位的入会申请应经过内部决策程序(如理事会决议或法定代表人决定),确认为自愿行为。请您在提交申请前,务必仔细阅读本入会须知,并确保申请材料真实、完整。</view>
8 </view>
9
10 <view class="section">
11 <view class="section-title">一、团体会员分类</view>
12 <view class="section-text">根据中国跆协相关规定,团体会员共分三类:区域性一级团体会员、区域性二级团体会员、专业性团体会员。</view>
13 </view>
14
15 <view class="section">
16 <view class="section-title">二、入会条件</view>
17 <view class="section-text">申请成为中国跆协团体会员,须具备以下条件:</view>
18 <view class="section-item">1. 承认章程:承认并拥护《中国跆拳道协会章程》及协会各项规章制度、决议。</view>
19 <view class="section-item">2. 合法资质:必须是经当地工商、民政或教育/体育行政部门登记注册,具有独立法人资格或能够独立承担民事责任的合法机构。</view>
20 <view class="section-item">3. 组织健全:具有比较完善的章程、组织管理机构、固定的活动场所及相应的从业人员。</view>
21 <view class="section-item">4. 运营规范:在区域内具有一定影响力,能够行使会员权利,履行会员义务,支持中国跆拳道事业的发展。</view>
22 </view>
23
24 <view class="section">
25 <view class="section-title">三、入会程序</view>
26 <view class="section-text">团体会员入会实行"逐级审批、属地管理"原则:</view>
27 <view class="section-item">1. 提交申请:向所属行政区域的上一级中国跆协团体会员提交入会申请书及相关资质材料。</view>
28 <view class="section-item sub">专业性团体会员(如道馆、俱乐部):通常向所在地的"区域性二级团体会员"(市级协会)提交申请。</view>
29 <view class="section-item sub">区域性二级团体会员:向所在地的"区域性一级团体会员"(省级协会)提交申请。</view>
30 <view class="section-item sub">无上级协会的:如当地暂无相应级别团体会员,可直接向中国跆拳道协会或上一级协会提交申请。</view>
31 <view class="section-item">2. 审核批准:由受理申请的团体会员进行资格审查和实地考察,并报中国跆协备案。</view>
32 <view class="section-item">3. 缴纳会费:审核通过后,按年度标准缴纳会费。</view>
33 <view class="section-item">4. 颁发证书:由中国跆协或授权的团体会员颁发统一制作的"团体会员证书"。</view>
34 </view>
35
36 <view class="section">
37 <view class="section-title">四、会费标准</view>
38 <view class="section-text">团体会员须按年度缴纳会费。具体标准依据《中国跆拳道协会会员会费标准》执行(注:具体金额请以中国跆协官方最新文件为准)。</view>
39 </view>
40
41 <view class="section">
42 <view class="section-title">五、会员权利</view>
43 <view class="section-text">团体会员享有《中国跆拳道协会会员管理办法》规定的以下主要权利:</view>
44 <view class="section-item">1. 本团体的选举权、被选举权和表决权。</view>
45 <view class="section-item">2. 组织辖区内跆拳道活动的管理权(仅限区域性团体会员)。</view>
46 <view class="section-item">3. 参加中国跆协举办的赛事、培训、交流活动的优先权。</view>
47 <view class="section-item">4. 获得中国跆协在业务指导、教练员裁判员委派、级段位考试等方面的服务优先权。</view>
48 <view class="section-item">5. 对协会工作的批评建议权和监督权。</view>
49 </view>
50
51 <view class="section">
52 <view class="section-title">六、会员义务</view>
53 <view class="section-text">团体会员应履行以下主要义务:</view>
54 <view class="section-item">1. 遵守章程,执行协会决议,维护协会合法权益。</view>
55 <view class="section-item">2. 完成协会交办的工作,如组织参赛、数据统计、行业调研等。</view>
56 <view class="section-item">3. 按时足额缴纳会费。</view>
57 <view class="section-item">4. 定期向上级协会上报年度工作计划和总结。</view>
58 <view class="section-item">5. 积极宣传和推广跆拳道运动。</view>
59 </view>
60
61 <view class="section">
62 <view class="section-title">七、退会与违规处理</view>
63 <view class="section-item">1. 自动退会:团体会员如果一年不交纳会费或不参加本团体活动的,视为自动退会。退会后须交回会员证书。</view>
64 <view class="section-item">2. 违规处罚:会员行为若违反《会员管理办法》,如出现严重违规经营、损害协会声誉、拖欠应缴款项等行为,协会视情节轻重给予警告、限期整改、暂停会员资格直至取消会员资格的处罚。</view>
65 </view>
66
67 <view class="section">
68 <view class="section-title">八、其他</view>
69 <view class="section-item">1. 本须知内容依据《中国跆拳道协会章程》及《中国跆拳道协会会员管理办法(暂行)》制定。</view>
70 <view class="section-item">2. 团体会员在开展活动时,须严格遵守国家安全生产法律法规,落实赛事活动安全责任。</view>
71 <view class="section-item">3. 如有疑问,请咨询所在地的中国跆协区域性团体会员(省/市跆拳道协会)或登录中国跆拳道协会官网查询。</view>
72 </view>
73 </view>
74 </view>
75 </view>
76 </template>
77
78 <script setup>
79 function goBack() {
80 uni.navigateBack()
81 }
82 </script>
83
84 <style lang="scss" scoped>
85 .notice-page {
86 min-height: 100vh;
87 background: #f5f5f5;
88 display: flex;
89 flex-direction: column;
90 }
91
92 .notice-content {
93 flex: 1;
94 padding: 30rpx;
95 overflow-y: auto;
96 }
97
98 .notice-header {
99 padding: 40rpx 0;
100 text-align: center;
101 }
102
103 .notice-title {
104 font-size: 36rpx;
105 font-weight: 600;
106 color: #333;
107 }
108
109 .notice-body {
110 background: #fff;
111 border-radius: 16rpx;
112 padding: 40rpx;
113 }
114
115 .section {
116 margin-bottom: 40rpx;
117
118 &:last-child {
119 margin-bottom: 0;
120 }
121
122 }
123
124 .section-title {
125 font-size: 30rpx;
126 font-weight: 600;
127 color: #333;
128 margin-bottom: 20rpx;
129 line-height: 1.5;
130 }
131
132 .section-text {
133 font-size: 28rpx;
134 color: #666;
135 line-height: 1.8;
136 text-align: justify;
137 margin-bottom: 16rpx;
138 }
139
140 .section-item {
141 font-size: 28rpx;
142 color: #666;
143 line-height: 1.8;
144 margin-bottom: 12rpx;
145 text-align: justify;
146 padding-left: 0;
147
148 &.sub {
149 padding-left: 40rpx;
150 color: #888;
151 font-size: 26rpx;
152 }
153
154 &:last-child {
155 margin-bottom: 0;
156 }
157 }
158
159 .notice-footer {
160 padding: 30rpx;
161 background: #fff;
162 box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
163 }
164
165
166 </style>
1 <template>
2 <view class="notice-page">
3 <view class="notice-content">
4 <view class="notice-body">
5 <view class="section">
6 <view class="section-title">尊敬的用户:</view>
7 <view class="section-text">欢迎您注册中国跆拳道协会会员管理系统。</view>
8 </view>
9
10 <view class="section">
11 <view class="section-title">一、注册信息</view>
12 <view class="section-text">根据系统要求及提示,在网上填写必要的个人用户或单位用户相关有效信息即可注册成功。</view>
13 </view>
14
15 <view class="section">
16 <view class="section-title">二、用户权限</view>
17 <view class="section-item">1)信息注册成功仅代表您同意将本人或本单位信息纳入到本系统内,并非中国跆拳道协会会员。</view>
18 <view class="section-item">2)注册用户如需办理相关业务需向所属单位或向上级协会提交缴费及入会申请,会员信息在有效期内方可使用相关功能。</view>
19 </view>
20
21 <view class="section">
22 <view class="section-title">三、责任</view>
23 <view class="section-item">1)用户须遵守国家法律法规。</view>
24 <view class="section-item">2)用户须按要求填写准确的个人及单位资料,如用户提供的资料包含有不正确的信息,本系统保留结束用户使用相关服务的权利。</view>
25 <view class="section-item">3)中国跆拳道协会承诺保守用户信息等秘密。</view>
26 </view>
27
28 <view class="section">
29 <view class="section-title">四、解释权说明</view>
30 <view class="section-text">以上内容最终解释权归中国跆拳道协会所有。</view>
31 </view>
32 </view>
33 </view>
34 </view>
35 </template>
36
37 <script setup>
38 function goBack() {
39 uni.navigateBack()
40 }
41 </script>
42
43 <style lang="scss" scoped>
44 .notice-page {
45 min-height: 100vh;
46 background: #f5f5f5;
47 display: flex;
48 flex-direction: column;
49 }
50
51 .notice-content {
52 flex: 1;
53 padding: 30rpx;
54 overflow-y: auto;
55 }
56
57 .notice-header {
58 padding: 40rpx 0;
59 text-align: center;
60 }
61
62 .notice-title {
63 font-size: 36rpx;
64 font-weight: 600;
65 color: #333;
66 }
67
68 .notice-body {
69 background: #fff;
70 border-radius: 16rpx;
71 padding: 40rpx;
72 }
73
74 .section {
75 margin-bottom: 40rpx;
76
77 &:last-child {
78 margin-bottom: 0;
79 }
80 }
81
82 .section-title {
83 font-size: 30rpx;
84 font-weight: 600;
85 color: #333;
86 margin-bottom: 20rpx;
87 line-height: 1.5;
88 }
89
90 .section-text {
91 font-size: 28rpx;
92 color: #666;
93 line-height: 1.8;
94 text-align: justify;
95 }
96
97 .section-item {
98 font-size: 28rpx;
99 color: #666;
100 line-height: 1.8;
101 margin-bottom: 12rpx;
102 text-align: justify;
103 padding-left: 0;
104
105 &:last-child {
106 margin-bottom: 0;
107 }
108 }
109
110 .notice-footer {
111 padding: 30rpx;
112 background: #fff;
113 box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.05);
114 }
115
116 </style>
1 <template>
2 <view class="member-audit-record">
3 <!-- Tab切换 -->
4 <view class="tab-bar">
5 <view
6 v-for="tab in tabs"
7 :key="tab.value"
8 class="tab-item"
9 :class="{ active: currentTab === tab.value }"
10 @click="onTabChange(tab.value)"
11 >
12 {{ tab.label }}
13 </view>
14 </view>
15
16 <!-- 列表 -->
17 <view class="list-content">
18 <view v-if="list.length === 0 && !loading" class="empty-tip">
19 <text>暂无数据</text>
20 </view>
21
22 <view
23 v-for="(item, index) in list"
24 :key="index"
25 class="list-item"
26 :class="{ 'success-row': item.approveStatus == 2 }"
27 >
28 <view class="item-header">
29 <text class="item-name">{{ item.name }}</text>
30 <text class="item-status" :class="getStatusClass(item.approveStatus)">
31 {{ getStatusText(item.approveStatus) }}
32 </text>
33 </view>
34
35 <view class="item-row">
36 <text class="item-label">证件类型</text>
37 <text class="item-value">{{ getIdcTypeText(item.idcType) }}</text>
38 </view>
39
40 <view class="item-row">
41 <text class="item-label">证件号</text>
42 <text class="item-value">{{ item.idcCode || '-' }}</text>
43 </view>
44
45 <view class="item-row">
46 <text class="item-label">提交单位</text>
47 <text class="item-value">{{ item.memName || '-' }}</text>
48 </view>
49
50 <view class="item-row">
51 <text class="item-label">提交时间</text>
52 <text class="item-value">{{ formatDate(item.commitTime) }}</text>
53 </view>
54
55 <view class="item-row">
56 <text class="item-label">审核时间</text>
57 <text class="item-value">{{ formatDate(item.approveTime) }}</text>
58 </view>
59
60 <view v-if="item.msg" class="item-row">
61 <text class="item-label">备注</text>
62 <text class="item-value">{{ item.msg }}</text>
63 </view>
64
65 <view v-if="item.fileUrl" class="item-row">
66 <text class="item-label">附件</text>
67 <image
68 class="item-image"
69 :src="fillImgUrl(item.fileUrl)"
70 mode="aspectFill"
71 @click="previewImage(item.fileUrl)"
72 ></image>
73 </view>
74 </view>
75
76 <view v-if="loading" class="loading-tip">
77 <text>加载中...</text>
78 </view>
79
80 <view v-if="noMore && list.length > 0" class="no-more-tip">
81 <text>没有更多了</text>
82 </view>
83 </view>
84 </view>
85 </template>
86
87 <script setup>
88 import { ref } from 'vue'
89 import { onLoad, onReachBottom } from '@dcloudio/uni-app'
90 import { memberAuditList } from '@/common/api'
91 import config from '@/config'
92
93 const tabs = [
94 { label: '全部', value: '' },
95 { label: '审核中', value: '1' },
96 { label: '审核通过', value: '2' },
97 { label: '审核拒绝', value: '3' }
98 ]
99
100 const currentTab = ref('')
101 const list = ref([])
102 const loading = ref(false)
103 const noMore = ref(false)
104 const pageNum = ref(1)
105 const pageSize = ref(10)
106
107 function onTabChange(value) {
108 currentTab.value = value
109 list.value = []
110 pageNum.value = 1
111 noMore.value = false
112 loadData()
113 }
114
115 function loadData() {
116 if (loading.value) return
117 loading.value = true
118
119 memberAuditList({
120 pageNum: pageNum.value,
121 pageSize: pageSize.value,
122 approveStatus: currentTab.value
123 }).then(res => {
124 if (res.rows) {
125 if (pageNum.value === 1) {
126 list.value = res.rows
127 } else {
128 list.value = [...list.value, ...res.rows]
129 }
130
131 if (res.rows.length < pageSize.value) {
132 noMore.value = true
133 }
134 } else {
135 if (pageNum.value === 1) {
136 list.value = []
137 }
138 noMore.value = true
139 }
140 }).finally(() => {
141 loading.value = false
142 })
143 }
144
145 // 上划加载
146 onReachBottom(() => {
147 if (!noMore.value) {
148 pageNum.value++
149 loadData()
150 }
151 })
152
153 onLoad(() => {
154 loadData()
155 })
156
157 function getStatusText(status) {
158 const map = { 1: '审核中', 2: '审核通过', 3: '审核拒绝' }
159 return map[status] || '-'
160 }
161
162 function getStatusClass(status) {
163 return {
164 'status-1': status == 1,
165 'status-2': status == 2,
166 'status-3': status == 3
167 }
168 }
169
170 function getIdcTypeText(type) {
171 const map = {
172 1: '身份证',
173 2: '护照',
174 3: '军官证',
175 4: '港澳通行证',
176 5: '台湾通行证'
177 }
178 return map[type] || '-'
179 }
180
181 function formatDate(dateStr) {
182 if (!dateStr) return '-'
183 const date = new Date(dateStr)
184 const year = date.getFullYear()
185 const month = String(date.getMonth() + 1).padStart(2, '0')
186 const day = String(date.getDate()).padStart(2, '0')
187 return `${year}-${month}-${day}`
188 }
189
190 function fillImgUrl(url) {
191 if (!url) return ''
192 if (url.startsWith('http')) return url
193 return config.baseUrl + url
194 }
195
196 function previewImage(url) {
197 uni.previewImage({
198 urls: [fillImgUrl(url)],
199 current: fillImgUrl(url)
200 })
201 }
202 </script>
203
204 <style lang="scss" scoped>
205 .member-audit-record {
206 min-height: 100vh;
207 background: #f5f5f5;
208 }
209
210 .tab-bar {
211 display: flex;
212 background: #fff;
213 padding: 0 20rpx;
214 border-bottom: 1rpx solid #eee;
215 }
216
217 .tab-item {
218 flex: 1;
219 height: 88rpx;
220 line-height: 88rpx;
221 text-align: center;
222 font-size: 28rpx;
223 color: #666;
224 position: relative;
225 }
226
227 .tab-item.active {
228 color: #e64329;
229 font-weight: 600;
230 }
231
232 .tab-item.active::after {
233 content: '';
234 position: absolute;
235 bottom: 0;
236 left: 50%;
237 transform: translateX(-50%);
238 width: 48rpx;
239 height: 4rpx;
240 background: #e64329;
241 border-radius: 2rpx;
242 }
243
244 .list-content {
245 padding: 20rpx;
246 }
247
248 .empty-tip,
249 .loading-tip,
250 .no-more-tip {
251 text-align: center;
252 padding: 60rpx 0;
253 color: #999;
254 font-size: 26rpx;
255 }
256
257 .list-item {
258 background: #fff;
259 border-radius: 16rpx;
260 padding: 24rpx;
261 margin-bottom: 20rpx;
262 }
263
264 .list-item.success-row {
265 border-left: 6rpx solid #19be6b;
266 }
267
268 .item-header {
269 display: flex;
270 justify-content: space-between;
271 align-items: center;
272 margin-bottom: 20rpx;
273 padding-bottom: 20rpx;
274 border-bottom: 1rpx solid #f0f0f0;
275 }
276
277 .item-name {
278 font-size: 32rpx;
279 font-weight: 600;
280 color: #333;
281 }
282
283 .item-status {
284 font-size: 26rpx;
285 padding: 4rpx 16rpx;
286 border-radius: 20rpx;
287 }
288
289 .status-1 {
290 background: #fff7e6;
291 color: #fa8c16;
292 }
293
294 .status-2 {
295 background: #e6fff7;
296 color: #52c41a;
297 }
298
299 .status-3 {
300 background: #fff1f0;
301 color: #ff4d4f;
302 }
303
304 .item-row {
305 display: flex;
306 margin-bottom: 16rpx;
307 }
308
309 .item-label {
310 width: 140rpx;
311 font-size: 26rpx;
312 color: #999;
313 }
314
315 .item-value {
316 flex: 1;
317 font-size: 26rpx;
318 color: #333;
319 word-break: break-all;
320 }
321
322 .item-image {
323 width: 120rpx;
324 height: 120rpx;
325 border-radius: 8rpx;
326 margin-top: 8rpx;
327 }
328 </style>
...@@ -186,7 +186,7 @@ const getStatusText = (status) => { ...@@ -186,7 +186,7 @@ const getStatusText = (status) => {
186 1: '缴费成功', 186 1: '缴费成功',
187 2: '订单取消' 187 2: '订单取消'
188 }; 188 };
189 return map[status] || '未知状态'; 189 return map[status] || '';
190 }; 190 };
191 191
192 // 数据请求核心方法 192 // 数据请求核心方法
......
...@@ -291,7 +291,7 @@ function getStatusText(status) { ...@@ -291,7 +291,7 @@ function getStatusText(status) {
291 3: '审核拒绝', 291 3: '审核拒绝',
292 9: '缴费中' 292 9: '缴费中'
293 } 293 }
294 return statusMap[status] || '未知状态' 294 return statusMap[status] || ''
295 } 295 }
296 296
297 function getStatusClass(status) { 297 function getStatusClass(status) {
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!