f05cc2b8 by lttnew

开票

1 parent 8a216ef1
...@@ -2106,3 +2106,38 @@ export function memberAuditList(params) { ...@@ -2106,3 +2106,38 @@ export function memberAuditList(params) {
2106 params: params 2106 params: params
2107 }) 2107 })
2108 } 2108 }
2109
2110 // 不再显示考点弹框
2111 export function noDisplay(data) {
2112 return request({
2113 url: '/system/user/noDisplay',
2114 method: 'put',
2115 params: data
2116 })
2117 }
2118
2119 // 修改手机号
2120 export function editPhone(data) {
2121 return request({
2122 url: '/system/user/editPhone',
2123 method: 'post',
2124 params: data
2125 })
2126 }
2127
2128 // 图形验证码
2129 export function getCodeImg() {
2130 return request({
2131 url: '/captchaImage',
2132 method: 'get'
2133 })
2134 }
2135
2136 // 短信验证码
2137 export function getSmsCode(data) {
2138 return request({
2139 url: '/captchaSmsWithCaptchaImageForMiniApp',
2140 method: 'post',
2141 params: data
2142 })
2143 }
......
...@@ -106,11 +106,12 @@ function getInfo() { ...@@ -106,11 +106,12 @@ function getInfo() {
106 const userStore = useUserStore() 106 const userStore = useUserStore()
107 const app = getApp() 107 const app = getApp()
108 const user = res.data.user 108 const user = res.data.user
109 109
110 uni.setStorageSync('userName', user.userName) 110 uni.setStorageSync('userName', user.userName)
111 uni.removeStorageSync('webUserName') 111 uni.removeStorageSync('webUserName')
112 userStore.setUser(user) 112 userStore.setUser(user)
113 113
114 app.globalData.userInfo = user
114 app.globalData.deptType = user.dept.deptType 115 app.globalData.deptType = user.dept.deptType
115 app.globalData.genFlag = user.dept.genFlag 116 app.globalData.genFlag = user.dept.genFlag
116 app.globalData.changePassFlag = user.changePassFlag 117 app.globalData.changePassFlag = user.changePassFlag
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
2 <view class="exam-point-list"> 2 <view class="exam-point-list">
3 <!-- 顶部申请按钮 --> 3 <!-- 顶部申请按钮 -->
4 <view class="apply-btn-box"> 4 <view class="apply-btn-box">
5 <button class="apply-btn" :disabled="memberInfo.isPoints==0&&formInfo.auditStatus==2" @click="goApply">申请考点</button> 5 <button class="apply-btn" :disabled="memberInfo.isPoints==0||formInfo.auditStatus==2||formInfo.auditStatus==1" @click="goApply">申请考点</button>
6 </view> 6 </view>
7 7
8 <!-- 列表 --> 8 <!-- 列表 -->
...@@ -51,7 +51,7 @@ ...@@ -51,7 +51,7 @@
51 <script setup> 51 <script setup>
52 import { ref } from 'vue' 52 import { ref } from 'vue'
53 import { onLoad, onReachBottom } from '@dcloudio/uni-app' 53 import { onLoad, onReachBottom } from '@dcloudio/uni-app'
54 import { getMyRecent } from '@/common/api' 54 import { getMyRecentExam } from '@/common/api'
55 const app = getApp() 55 const app = getApp()
56 const list = ref([]) 56 const list = ref([])
57 const loading = ref(false) 57 const loading = ref(false)
...@@ -68,7 +68,7 @@ function loadData() { ...@@ -68,7 +68,7 @@ function loadData() {
68 if (loading.value) return 68 if (loading.value) return
69 loading.value = true 69 loading.value = true
70 70
71 getMyRecent().then(res => { 71 getMyRecentExam().then(res => {
72 formInfo.value = res.data 72 formInfo.value = res.data
73 if (res.data && res.data.auditLogs) { 73 if (res.data && res.data.auditLogs) {
74 try { 74 try {
...@@ -101,7 +101,7 @@ function goApply() { ...@@ -101,7 +101,7 @@ function goApply() {
101 function getStatusClass(status) { 101 function getStatusClass(status) {
102 return { 102 return {
103 'status-1': status == 0, 103 'status-1': status == 0,
104 'status-2': status == 1, 104 'status-2': status == 9,
105 'status-3': status == 3 105 'status-3': status == 3
106 } 106 }
107 } 107 }
......
...@@ -84,7 +84,7 @@ ...@@ -84,7 +84,7 @@
84 <!-- 级位/段位考试(仅人数合计) --> 84 <!-- 级位/段位考试(仅人数合计) -->
85 <view v-if="currentTab === '2' || currentTab === '3' || currentTab === '4'" class="single-info"> 85 <view v-if="currentTab === '2' || currentTab === '3' || currentTab === '4'" class="single-info">
86 <view class="label">人数合计</view> 86 <view class="label">人数合计</view>
87 <view class="value">{{ item.content.allPersonCount || 0 }}</view> 87 <view class="value">{{ item.content.personCount || 0 }}</view>
88 </view> 88 </view>
89 <view class="line" v-if="currentTab === '2' || currentTab === '3' || currentTab === '4'"></view> 89 <view class="line" v-if="currentTab === '2' || currentTab === '3' || currentTab === '4'"></view>
90 <view class="single-info"> 90 <view class="single-info">
...@@ -111,10 +111,14 @@ ...@@ -111,10 +111,14 @@
111 <view class="btn-group"> 111 <view class="btn-group">
112 <!-- 已缴费:申请开票/已开票(需要审核通过才能开票) --> 112 <!-- 已缴费:申请开票/已开票(需要审核通过才能开票) -->
113 <template v-if="item.payStatus == 1 && item.invoiceStatus != 1&& item.auditStatus == 2"> 113 <template v-if="item.payStatus == 1 && item.invoiceStatus != 1&& item.auditStatus == 2">
114 <button class="btn btn-invoice" @click="makeInvoiceFN(item)" :disabled="item.invoiceStatus === 1"> 114 <button class="btn btn-view-invoice" @click="makeInvoiceFN(item)" :disabled="item.invoiceStatus === 1">
115 开票 115 开票
116 </button> 116 </button>
117 </template> 117 </template>
118 <!-- 已开票:查看发票 -->
119 <template v-if="item.invoiceStatus == 1">
120 <button class="btn btn-invoice" @click.stop="viewInvoice(item)">查看发票</button>
121 </template>
118 <!-- 未缴费:去缴费 + 取消订单 --> 122 <!-- 未缴费:去缴费 + 取消订单 -->
119 <!-- <template v-if="item.payStatus == 0"> 123 <!-- <template v-if="item.payStatus == 0">
120 <button class="btn btn-cancel" @click="handleCancel(item)">取消订单</button> 124 <button class="btn btn-cancel" @click="handleCancel(item)">取消订单</button>
...@@ -136,6 +140,40 @@ ...@@ -136,6 +140,40 @@
136 </view> 140 </view>
137 </scroll-view> 141 </scroll-view>
138 142
143 <!-- 发票查看弹窗 -->
144 <view v-if="showInvoicePopup" class="invoice-popup-mask" @click="closeInvoicePopup">
145 <view class="invoice-popup-content" @click.stop>
146 <view class="invoice-popup-header">
147 <text class="invoice-popup-title">发票信息</text>
148 <view class="invoice-popup-close" @click="closeInvoicePopup"></view>
149 </view>
150 <view class="invoice-popup-body">
151
152
153 <view class="invoice-info-list">
154 <view class="invoice-info-row">
155 <view class="invoice-info-label">发票类型</view>
156 <view class="invoice-type-badge" :class="{ 'vat-type': invoiceData.invoiceType == 2 }">
157 {{ invoiceData.invoiceType == 1 ? '普通发票' : '增值税专用发票' }}
158 </view>
159 </view>
160 <view class="invoice-info-row">
161 <text class="invoice-info-label">发票抬头</text>
162 <text class="invoice-info-value">{{ invoiceData.invoiceBuyerName || '—' }}</text>
163 </view>
164 <view class="invoice-info-row" v-if="invoiceData.invoiceBuyerTaxno">
165 <text class="invoice-info-label">纳税人识别号</text>
166 <text class="invoice-info-value">{{ invoiceData.invoiceBuyerTaxno }}</text>
167 </view>
168 <view class="invoice-info-row">
169 <text class="invoice-info-label">接收邮箱</text>
170 <text class="invoice-info-value">{{ invoiceData.invoicePushPhone || '—' }}</text>
171 </view>
172 </view>
173 </view>
174 </view>
175 </view>
176
139 <!-- 自定义删除确认弹窗 --> 177 <!-- 自定义删除确认弹窗 -->
140 <view v-if="showDelPopup" class="popup-mask" @touchmove.stop.prevent @click.stop="closeDelPopup"> 178 <view v-if="showDelPopup" class="popup-mask" @touchmove.stop.prevent @click.stop="closeDelPopup">
141 <view class="custom-modal" @click.stop> 179 <view class="custom-modal" @click.stop>
...@@ -228,6 +266,8 @@ const queryParams = reactive({ ...@@ -228,6 +266,8 @@ const queryParams = reactive({
228 const showDelPopup = ref(false); 266 const showDelPopup = ref(false);
229 const showCancelPopup = ref(false); 267 const showCancelPopup = ref(false);
230 const isPopupOpen = ref(false); 268 const isPopupOpen = ref(false);
269 const showInvoicePopup = ref(false);
270 const invoiceData = ref({});
231 271
232 // 弹窗内容 272 // 弹窗内容
233 const delModalContent = ref(''); 273 const delModalContent = ref('');
...@@ -397,6 +437,24 @@ const makeInvoiceFN = (item) => { ...@@ -397,6 +437,24 @@ const makeInvoiceFN = (item) => {
397 }); 437 });
398 }; 438 };
399 439
440 // 查看发票
441 const viewInvoice = (item) => {
442 invoiceData.value = {
443 invoiceType: item.invoiceType || 1,
444 invoiceBuyerName: item.invoiceTitle || item.invoiceBuyerName || '—',
445 invoiceBuyerTaxno: item.invoiceTaxno || item.invoiceBuyerTaxno || '',
446 invoicePushPhone: item.invoiceEmail || item.invoicePushPhone || '—'
447 };
448 showInvoicePopup.value = true;
449 isPopupOpen.value = true;
450 };
451
452 // 关闭发票弹窗
453 const closeInvoicePopup = () => {
454 showInvoicePopup.value = false;
455 isPopupOpen.value = false;
456 };
457
400 // 取消订单 458 // 取消订单
401 const handleCancel = (item) => { 459 const handleCancel = (item) => {
402 currentOrder.value = item; 460 currentOrder.value = item;
...@@ -492,6 +550,8 @@ const closeCancelPopup = () => { ...@@ -492,6 +550,8 @@ const closeCancelPopup = () => {
492 padding: 20rpx; 550 padding: 20rpx;
493 box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04); 551 box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
494 border-radius: 12rpx; 552 border-radius: 12rpx;
553 display: flex;
554 flex-direction: column;
495 // border-top: 6rpx solid transparent; 555 // border-top: 6rpx solid transparent;
496 // background-clip: padding-box, border-box; 556 // background-clip: padding-box, border-box;
497 // background-origin: padding-box, border-box; 557 // background-origin: padding-box, border-box;
...@@ -667,27 +727,29 @@ const closeCancelPopup = () => { ...@@ -667,27 +727,29 @@ const closeCancelPopup = () => {
667 // 按钮组 727 // 按钮组
668 .btn-group { 728 .btn-group {
669 display: flex; 729 display: flex;
670 justify-content: flex-end; 730 justify-content: flex-end;
671 align-items: center; 731 align-items: center;
672 gap: 16rpx; 732 gap: 16rpx;
673 width: 100%; 733 width: 100%;
674 734 margin-top: 20rpx;
735
675 .btn { 736 .btn {
676 padding: 12rpx 32rpx; 737 // 固定宽度,所有按钮一样大
738 width: 160rpx;
739 height: 70rpx;
740 line-height: 70rpx;
741 padding: 0;
677 border-radius: 40rpx; 742 border-radius: 40rpx;
678 font-size: 24rpx; 743 font-size: 24rpx;
679 line-height: 1.5;
680 white-space: nowrap; 744 white-space: nowrap;
681 display: inline-block;
682 margin: 0;
683 border: none; 745 border: none;
684 width: 80px;
685 background: transparent; 746 background: transparent;
686 747 text-align: center;
687 &::after { 748 margin: 0;
749 &::after {
688 border: none; 750 border: none;
751 display: none; // 关键:隐藏伪元素
689 } 752 }
690
691 &.btn-delete { 753 &.btn-delete {
692 background: #fff; 754 background: #fff;
693 color: #e4393c; 755 color: #e4393c;
...@@ -699,6 +761,12 @@ const closeCancelPopup = () => { ...@@ -699,6 +761,12 @@ const closeCancelPopup = () => {
699 color: #e4393c; 761 color: #e4393c;
700 border: 1rpx solid #e4393c; 762 border: 1rpx solid #e4393c;
701 } 763 }
764
765 &.btn-view-invoice {
766 background: linear-gradient(90deg, #FF755A, #F51722);
767 color: #fff;
768 border: none;
769 }
702 770
703 &.btn-cancel { 771 &.btn-cancel {
704 background: #fff; 772 background: #fff;
...@@ -720,7 +788,6 @@ const closeCancelPopup = () => { ...@@ -720,7 +788,6 @@ const closeCancelPopup = () => {
720 } 788 }
721 789
722 790
723
724 // 加载/无更多提示 791 // 加载/无更多提示
725 .loading-tip, .no-more { 792 .loading-tip, .no-more {
726 text-align: center; 793 text-align: center;
...@@ -814,4 +881,97 @@ const closeCancelPopup = () => { ...@@ -814,4 +881,97 @@ const closeCancelPopup = () => {
814 color: #e8341d; 881 color: #e8341d;
815 letter-spacing: 1rpx; 882 letter-spacing: 1rpx;
816 } 883 }
884
885 // 发票弹窗样式
886 .invoice-popup-mask {
887 position: fixed;
888 top: 0;
889 left: 0;
890 right: 0;
891 bottom: 0;
892 background-color: rgba(0, 0, 0, 0.5);
893 display: flex;
894 align-items: center;
895 justify-content: center;
896 z-index: 999;
897 }
898
899 .invoice-popup-content {
900 width: 600rpx;
901 background: #fff;
902 border-radius: 20rpx;
903 overflow: hidden;
904 box-shadow: 0 10rpx 30rpx rgba(0, 0, 0, 0.2);
905 }
906
907 .invoice-popup-header {
908 display: flex;
909 justify-content: space-between;
910 align-items: center;
911 padding: 30rpx;
912 background: linear-gradient(135deg, #AD181F 0%, #E4393C 100%);
913
914 .invoice-popup-title {
915 font-size: 32rpx;
916 font-weight: 600;
917 color: #fff;
918 }
919
920 .invoice-popup-close {
921 width: 44rpx;
922 height: 44rpx;
923 display: flex;
924 align-items: center;
925 justify-content: center;
926 font-size: 28rpx;
927 color: rgba(255, 255, 255, 0.8);
928 }
929 }
930
931 .invoice-popup-body {
932 padding: 30rpx;
933 }
934
935 .invoice-type-badge {
936 display: inline-flex;
937 align-items: center;
938 padding: 8rpx 24rpx;
939 background: linear-gradient(135deg, #FF755A 0%, #F51722 100%);
940 color: #fff;
941 border-radius: 30rpx;
942 font-size: 24rpx;
943 font-weight: 500;
944
945 &.vat-type {
946 background: linear-gradient(135deg, #6aaaf2 0%, #178cd7 100%);
947 }
948 }
949
950 .invoice-info-list {
951 .invoice-info-row {
952 display: flex;
953 justify-content: space-between;
954 align-items: flex-start;
955 padding: 24rpx 0;
956 border-bottom: 1rpx dashed #eee;
957
958 &:last-child {
959 border-bottom: none;
960 }
961
962 .invoice-info-label {
963 font-size: 26rpx;
964 color: #999;
965 flex-shrink: 0;
966 }
967
968 .invoice-info-value {
969 font-size: 26rpx;
970 color: #333;
971 text-align: right;
972 word-break: break-all;
973 max-width: 340rpx;
974 }
975 }
976 }
817 </style> 977 </style>
...\ No newline at end of file ...\ No newline at end of file
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
7 <view class="loginOutIcon2" @click="goPath('/myCenter/index')"> 7 <view class="loginOutIcon2" @click="goPath('/myCenter/index')">
8 <image :src="config.loginImage_api + '/fs/static/dg/icon01@3x.png'" class="switch-icon"></image> 8 <image :src="config.loginImage_api + '/fs/static/dg/icon01@3x.png'" class="switch-icon"></image>
9 </view> 9 </view>
10 <view class="welcome1" @click="goPath('/myCenter/index')"> 10 <view class="welcome1 mt30" @click="goPath('/myCenter/index')">
11 <view class="flex f-a-c"> 11 <view class="flex f-a-c">
12 <!-- <view> --> 12 <!-- <view> -->
13 <text class="title-border"></text> 13 <text class="title-border"></text>
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
16 <!-- <image :src="config.loginImage_api + '/fs/static/dg/icon013@x.png'" class="switch-icon"></image> --> 16 <!-- <image :src="config.loginImage_api + '/fs/static/dg/icon013@x.png'" class="switch-icon"></image> -->
17 </view> 17 </view>
18 <view class="sub-title"> 18 <view class="sub-title">
19 <view class="mt10">会员名称&nbsp;&nbsp;会员所属道馆</view> 19 <view class="mt10">您好!{{ memberInfo.name }}</view>
20 <view class="mt10">欢迎使用中跆协会员管理系统!</view> 20 <view class="mt10">欢迎使用中跆协会员管理系统!</view>
21 </view> 21 </view>
22 </view> 22 </view>
...@@ -488,6 +488,58 @@ ...@@ -488,6 +488,58 @@
488 </view> 488 </view>
489 </uni-section> 489 </uni-section>
490 </view> 490 </view>
491
492 <!-- 绑定手机号弹框 -->
493 <uni-popup ref="bindingPhonePopup" type="center" :mask-click="false">
494 <view class="dialog-wrapper">
495 <view class="dialog-close" @click="closeBindingPhoneDialog"></view>
496 <view class="dialog-icon">
497 <uni-icons type="phone" size="48" color="#AD181F"></uni-icons>
498 </view>
499 <view class="dialog-title">绑定手机号</view>
500 <view class="dialog-content">
501 <view class="form-item">
502 <input class="form-input" v-model="bindingForm.phone" placeholder="请输入手机号" maxlength="11" type="number" />
503 </view>
504 <view class="form-item captcha-row">
505 <input class="form-input captcha-input" v-model="bindingForm.captcha" placeholder="图形验证码" maxlength="4" />
506 <image class="captcha-img" :src="captchaUrl" @click="refreshCaptcha" mode="aspectFit"></image>
507 </view>
508 <view class="form-item captcha-row">
509 <input class="form-input sms-input" v-model="bindingForm.code" placeholder="短信验证码" maxlength="6" type="number" />
510 <button class="sms-btn" :disabled="smsCountdown > 0" @click="sendSmsCode">
511 {{ smsCountdown > 0 ? smsCountdown + 's' : '获取验证码' }}
512 </button>
513 </view>
514 </view>
515 <view class="dialog-footer">
516 <button class="dialog-btn cancel" @click="closeBindingPhoneDialog">取消</button>
517 <button class="dialog-btn confirm" @click="submitBindingPhone">确定</button>
518 </view>
519 </view>
520 </uni-popup>
521
522 <!-- 申请成为考点弹框 -->
523 <uni-popup ref="examPointPopup" type="center" :mask-click="false">
524 <view class="dialog-wrapper exam-dialog">
525 <view class="dialog-close" @click="closeExamPointDialog"></view>
526 <view class="dialog-icon success-icon">
527 <uni-icons type="checkmark" size="48" color="#29c490"></uni-icons>
528 </view>
529 <view class="dialog-title">申请成为考点</view>
530 <view class="dialog-message">
531 <text>恭喜您成为中国跆拳道协会团体会员!</text>
532 <text>根据协会考点管理办法,需成为考点单位才能进行考级业务的办理。</text>
533 </view>
534 <view class="dialog-footer">
535 <button class="dialog-btn cancel" @click="closeExamPointDialog">取消</button>
536 <button class="dialog-btn confirm" @click="goExamPointApply">去申请</button>
537 </view>
538 <view class="no-display">
539 <text @click="handleNoDisplay">不再显示</text>
540 </view>
541 </view>
542 </uni-popup>
491 </view> 543 </view>
492 </template> 544 </template>
493 545
...@@ -531,6 +583,21 @@ const newsList = ref([]) ...@@ -531,6 +583,21 @@ const newsList = ref([])
531 const isInit = ref(false) 583 const isInit = ref(false)
532 const isBlack = ref(0) 584 const isBlack = ref(0)
533 585
586 // 绑定手机号弹框相关
587 const bindingPhonePopup = ref(null)
588 const bindingForm = ref({
589 phone: '',
590 captcha: '',
591 code: '',
592 uuid: ''
593 })
594 const captchaUrl = ref('')
595 const smsCountdown = ref(0)
596 let smsTimer = null
597
598 // 申请考点弹框相关
599 const examPointPopup = ref(null)
600
534 onShow(() => { 601 onShow(() => {
535 if (app.globalData.isLogin) { 602 if (app.globalData.isLogin) {
536 init() 603 init()
...@@ -722,8 +789,8 @@ function init() { ...@@ -722,8 +789,8 @@ function init() {
722 } 789 }
723 }) 790 })
724 } 791 }
725 792
726 793 checkDialogs()
727 uni.hideLoading(); 794 uni.hideLoading();
728 }) 795 })
729 796
...@@ -752,6 +819,116 @@ function goNewsDetail(n) { ...@@ -752,6 +819,116 @@ function goNewsDetail(n) {
752 url: `/pages/index/newsDetail?noteId=${n.noteId}` 819 url: `/pages/index/newsDetail?noteId=${n.noteId}`
753 }); 820 });
754 } 821 }
822
823 // 绑定手机号弹框方法
824 function refreshCaptcha() {
825 bindingForm.value.uuid = 'uuid-' + Date.now()
826 captchaUrl.value = config.baseUrl_api + '/captchaImage?uuid=' + bindingForm.value.uuid + '&t=' + Date.now()
827 }
828
829 function sendSmsCode() {
830 const phone = bindingForm.value.phone
831 const strTemp = /^1[2|3|4|5|6|7|8|9][0-9]{9}$/
832 if (!phone) {
833 uni.showToast({ title: '请输入手机号', icon: 'none' })
834 return
835 }
836 if (!strTemp.test(phone)) {
837 uni.showToast({ title: '请输入正确的手机号', icon: 'none' })
838 return
839 }
840 if (!bindingForm.value.captcha) {
841 uni.showToast({ title: '请输入图形验证码', icon: 'none' })
842 return
843 }
844 api.getSmsCode({
845 uuid: bindingForm.value.uuid,
846 telNo: phone,
847 captcha: bindingForm.value.captcha
848 }).then(res => {
849 uni.showToast({ title: '发送成功', icon: 'success' })
850 smsCountdown.value = 60
851 smsTimer = setInterval(() => {
852 smsCountdown.value--
853 if (smsCountdown.value <= 0) {
854 clearInterval(smsTimer)
855 smsTimer = null
856 }
857 }, 1000)
858 }).catch(() => {
859 refreshCaptcha()
860 })
861 }
862
863 function closeBindingPhoneDialog() {
864 bindingPhonePopup.value.close()
865 }
866
867 async function submitBindingPhone() {
868 const { phone, captcha, code, uuid } = bindingForm.value
869 if (!phone) {
870 uni.showToast({ title: '请输入手机号', icon: 'none' })
871 return
872 }
873 if (!captcha) {
874 uni.showToast({ title: '请输入图形验证码', icon: 'none' })
875 return
876 }
877 if (!code) {
878 uni.showToast({ title: '请输入短信验证码', icon: 'none' })
879 return
880 }
881 try {
882 await api.editPhone({ phone, captcha, code, uuid })
883 uni.showToast({ title: '修改成功', icon: 'success' })
884 closeBindingPhoneDialog()
885 setTimeout(() => {
886 uni.reLaunch({ url: '/pages/index/home' })
887 }, 1500)
888 } catch (e) {
889 // 错误已由 request.js 处理
890 }
891 }
892
893 // 申请考点弹框方法
894 function closeExamPointDialog() {
895 examPointPopup.value.close()
896 }
897
898 function goExamPointApply() {
899 closeExamPointDialog()
900 uni.navigateTo({ url: '/myCenter/examPointApplyList' })
901 }
902
903 async function handleNoDisplay() {
904 await api.noDisplay()
905 closeExamPointDialog()
906 }
907
908 // 检查弹框显示条件
909 function checkDialogs() {
910 const user = app.globalData.userInfo || {}
911 const memberInfoData = app.globalData.memberInfo || {}
912
913 // 绑定手机号条件: changePassFlag='1' && activeStatus=1 && authenticationStatus=2 && phonenumber为空 && checkFlag=1
914 if (app.globalData.changePassFlag === '1' &&
915 memberInfoData.activeStatus == 1 &&
916 app.globalData.authenticationStatus == 2 &&
917 !user.phonenumber &&
918 user.checkFlag == 1) {
919 refreshCaptcha()
920 bindingPhonePopup.value.open()
921 }
922
923 // 申请考点条件: activeStatus=1 && authenticationStatus=2 && hintFlag=1 && deptType=6 && isPoints=1
924 if (memberInfoData.activeStatus == 1 &&
925 app.globalData.authenticationStatus == 2 &&
926 user.hintFlag == 1 &&
927 app.globalData.deptType == 6 &&
928 memberInfoData.isPoints == 1) {
929 examPointPopup.value.open()
930 }
931 }
755 </script> 932 </script>
756 <style lang="scss" scoped> 933 <style lang="scss" scoped>
757 :deep(.uni-section) { 934 :deep(.uni-section) {
...@@ -1021,3 +1198,154 @@ function goNewsDetail(n) { ...@@ -1021,3 +1198,154 @@ function goNewsDetail(n) {
1021 } 1198 }
1022 </style> 1199 </style>
1023 1200
1201 <style lang="scss" scoped>
1202 /* 弹框样式 */
1203 .dialog-wrapper {
1204 width: 600rpx;
1205 background: linear-gradient(135deg, #fff 0%, #f8f9fc 100%);
1206 border-radius: 24rpx;
1207 padding: 48rpx 40rpx 40rpx;
1208 position: relative;
1209 box-sizing: border-box;
1210 }
1211
1212 .dialog-close {
1213 position: absolute;
1214 top: 20rpx;
1215 right: 24rpx;
1216 font-size: 32rpx;
1217 color: #999;
1218 z-index: 10;
1219 }
1220
1221 .dialog-icon {
1222 text-align: center;
1223 margin-bottom: 24rpx;
1224 }
1225
1226 .dialog-title {
1227 font-size: 40rpx;
1228 font-weight: 600;
1229 color: #303133;
1230 text-align: center;
1231 margin-bottom: 24rpx;
1232 }
1233
1234 .dialog-content {
1235 padding: 0 10rpx;
1236 margin-bottom: 32rpx;
1237 }
1238
1239 .form-item {
1240 margin-bottom: 24rpx;
1241 }
1242
1243 .form-input {
1244 height: 80rpx;
1245 background: #f5f7fa;
1246 border-radius: 16rpx;
1247 padding: 0 24rpx;
1248 font-size: 28rpx;
1249 width: 100%;
1250 box-sizing: border-box;
1251 }
1252
1253 .captcha-row {
1254 display: flex;
1255 align-items: center;
1256 gap: 16rpx;
1257 }
1258
1259 .captcha-input {
1260 flex: 1;
1261 }
1262
1263 .captcha-img {
1264 width: 180rpx;
1265 height: 72rpx;
1266 border-radius: 12rpx;
1267 background: #f5f7fa;
1268 }
1269
1270 .sms-input {
1271 flex: 1;
1272 }
1273
1274 .sms-btn {
1275 width: 200rpx;
1276 height: 72rpx;
1277 line-height: 72rpx;
1278 background: #AD181F;
1279 color: #fff;
1280 font-size: 24rpx;
1281 border-radius: 16rpx;
1282 padding: 0;
1283 margin: 0;
1284 &::after {
1285 border: none;
1286 }
1287 }
1288
1289 .sms-btn[disabled] {
1290 background: #c0c4cc;
1291 color: #fff;
1292 }
1293
1294 .dialog-footer {
1295 display: flex;
1296 justify-content: center;
1297 gap: 40rpx;
1298 }
1299
1300 .dialog-btn {
1301 width: 220rpx;
1302 height: 80rpx;
1303 line-height: 80rpx;
1304 border-radius: 40rpx;
1305 font-size: 28rpx;
1306 font-weight: 500;
1307 padding: 0;
1308 margin: 0;
1309 &::after {
1310 border: none;
1311 }
1312 }
1313
1314 .dialog-btn.cancel {
1315 background: #f5f7fa;
1316 color: #606266;
1317 border: 1rpx solid #dcdfe6;
1318 }
1319
1320 .dialog-btn.confirm {
1321 background: #AD181F;
1322 color: #fff;
1323 box-shadow: 0 4rpx 16rpx rgba(21, 97, 203, 0.3);
1324 }
1325
1326 /* 考点弹框样式 */
1327 .exam-dialog {
1328 .dialog-message {
1329 font-size: 28rpx;
1330 color: #606266;
1331 line-height: 1.8;
1332 text-align: left;
1333 margin-bottom: 40rpx;
1334 display: flex;
1335 flex-direction: column;
1336 gap: 12rpx;
1337 }
1338 }
1339
1340 .no-display {
1341 text-align: right;
1342 margin-top: 24rpx;
1343 font-size: 24rpx;
1344 color: #909399;
1345 }
1346
1347 .success-icon {
1348 color: #29c490;
1349 }
1350 </style>
1351
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!