个人会员中心+注册+bug
Showing
24 changed files
with
581 additions
and
83 deletions
| ... | @@ -1714,6 +1714,14 @@ export function unbindUser() { | ... | @@ -1714,6 +1714,14 @@ export function unbindUser() { |
| 1714 | }) | 1714 | }) |
| 1715 | } | 1715 | } |
| 1716 | 1716 | ||
| 1717 | // 电子会员证下载 | ||
| 1718 | export function downStuCertSingle(pId) { | ||
| 1719 | return request({ | ||
| 1720 | url: `/person/info/downStuCertSingle/${pId}`, | ||
| 1721 | method: 'post' | ||
| 1722 | }) | ||
| 1723 | } | ||
| 1724 | |||
| 1717 | /** | 1725 | /** |
| 1718 | * 订单列表 | 1726 | * 订单列表 |
| 1719 | * @param params | 1727 | * @param params |
| ... | @@ -2028,3 +2036,45 @@ export function memBerAuditList(params) { | ... | @@ -2028,3 +2036,45 @@ export function memBerAuditList(params) { |
| 2028 | params: params | 2036 | params: params |
| 2029 | }) | 2037 | }) |
| 2030 | } | 2038 | } |
| 2039 | |||
| 2040 | /** | ||
| 2041 | * 结算审核列表 | ||
| 2042 | * @param params | ||
| 2043 | * @returns {*} | ||
| 2044 | */ | ||
| 2045 | export function settlementList(params) { | ||
| 2046 | return request({ | ||
| 2047 | url: '/exam/paymentSubmit/list', | ||
| 2048 | method: 'get', | ||
| 2049 | params: params | ||
| 2050 | }) | ||
| 2051 | } | ||
| 2052 | |||
| 2053 | /** | ||
| 2054 | * 结算审核(通过/拒绝) | ||
| 2055 | * @param data { ids, type, reason } | ||
| 2056 | * @returns {*} | ||
| 2057 | */ | ||
| 2058 | export function settlementAudit(data) { | ||
| 2059 | return request({ | ||
| 2060 | url: `/exam/paymentSubmit/audit/${data.ids}`, | ||
| 2061 | method: 'post', | ||
| 2062 | params: { | ||
| 2063 | type: data.type, | ||
| 2064 | reason: data.reason | ||
| 2065 | } | ||
| 2066 | }) | ||
| 2067 | } | ||
| 2068 | |||
| 2069 | /** | ||
| 2070 | * 结算详情列表(根据结算单ID获取关联的缴费单) | ||
| 2071 | * @param params { payIds, pageNum, pageSize } | ||
| 2072 | * @returns {*} | ||
| 2073 | */ | ||
| 2074 | export function settlementDetailList(params) { | ||
| 2075 | return request({ | ||
| 2076 | url: '/exam/payment/list', | ||
| 2077 | method: 'get', | ||
| 2078 | params: params | ||
| 2079 | }) | ||
| 2080 | } | ... | ... |
| ... | @@ -120,7 +120,8 @@ function requestPaymentCredential(encodedData) { | ... | @@ -120,7 +120,8 @@ function requestPaymentCredential(encodedData) { |
| 120 | header: { | 120 | header: { |
| 121 | 'Content-Type': 'application/x-www-form-urlencoded' | 121 | 'Content-Type': 'application/x-www-form-urlencoded' |
| 122 | }, | 122 | }, |
| 123 | data: encodedData | 123 | data: encodedData, |
| 124 | timeout: 60000 // 60秒超时,与业务请求保持一致 | ||
| 124 | }) | 125 | }) |
| 125 | } | 126 | } |
| 126 | 127 | ... | ... |
| ... | @@ -60,10 +60,13 @@ function handleTokenExpire() { | ... | @@ -60,10 +60,13 @@ function handleTokenExpire() { |
| 60 | 60 | ||
| 61 | // 显示错误提示 | 61 | // 显示错误提示 |
| 62 | function showError(msg) { | 62 | function showError(msg) { |
| 63 | console.log('showError called:', msg) | ||
| 64 | // 先隐藏可能存在的 loading,确保 Toast 能显示 | ||
| 65 | uni.hideLoading() | ||
| 63 | uni.showToast({ | 66 | uni.showToast({ |
| 64 | title: msg || '请求失败', | 67 | title: msg || '请求失败', |
| 65 | icon: 'none', | 68 | icon: 'none', |
| 66 | duration: 2000 | 69 | duration: 3000 |
| 67 | }) | 70 | }) |
| 68 | } | 71 | } |
| 69 | 72 | ||
| ... | @@ -119,9 +122,16 @@ const request = function (req) { | ... | @@ -119,9 +122,16 @@ const request = function (req) { |
| 119 | return | 122 | return |
| 120 | } | 123 | } |
| 121 | 124 | ||
| 122 | // 其他业务错误 | 125 | // 业务错误(code != 200 且非 Token 过期)- 统一显示错误提示 |
| 123 | showError(data.msg || '请求失败') | 126 | const errorMsg = data.msg || '操作失败' |
| 124 | reject(new Error(data.msg || '请求失败')) | 127 | showError(errorMsg) |
| 128 | |||
| 129 | // code == 500 时仅显示提示,不抛出异常,避免页面 catch 覆盖错误信息 | ||
| 130 | if (data.code == 500) { | ||
| 131 | return | ||
| 132 | } | ||
| 133 | |||
| 134 | reject(new Error(errorMsg)) | ||
| 125 | 135 | ||
| 126 | }).catch(error => { | 136 | }).catch(error => { |
| 127 | console.error('请求失败:', error) | 137 | console.error('请求失败:', error) |
| ... | @@ -139,9 +149,12 @@ const request = function (req) { | ... | @@ -139,9 +149,12 @@ const request = function (req) { |
| 139 | 149 | ||
| 140 | reject(error) | 150 | reject(error) |
| 141 | }).finally(() => { | 151 | }).finally(() => { |
| 152 | // 延迟隐藏 loading,确保错误提示能显示 | ||
| 153 | setTimeout(() => { | ||
| 142 | if (req.showLoading != false) { | 154 | if (req.showLoading != false) { |
| 143 | hideLoading() | 155 | hideLoading() |
| 144 | } | 156 | } |
| 157 | }, 100) | ||
| 145 | }) | 158 | }) |
| 146 | }) | 159 | }) |
| 147 | } | 160 | } | ... | ... |
| ... | @@ -13,15 +13,15 @@ | ... | @@ -13,15 +13,15 @@ |
| 13 | <view class="vipData mt30" style="flex-wrap: wrap;padding: 20rpx;"> | 13 | <view class="vipData mt30" style="flex-wrap: wrap;padding: 20rpx;"> |
| 14 | <view class="w50"> | 14 | <view class="w50"> |
| 15 | 年限合计: | 15 | 年限合计: |
| 16 | <text>{{ form?.renewYear }}个</text> | 16 | <text>{{ form?.renewYear }}年</text> |
| 17 | </view> | 17 | </view> |
| 18 | <view class="w50"> | 18 | <view class="w50"> |
| 19 | 费用合计: | 19 | 费用合计: |
| 20 | <text>{{ form?.allPrice }}个</text> | 20 | <text>{{ form?.allPrice }}元</text> |
| 21 | </view> | 21 | </view> |
| 22 | <view class="w50"> | 22 | <view class="w50"> |
| 23 | 政策优惠: | 23 | 政策优惠: |
| 24 | <text>{{ form?.discount }}年</text> | 24 | <text>{{ form?.discount }}元</text> |
| 25 | </view> | 25 | </view> |
| 26 | <view class="w50"> | 26 | <view class="w50"> |
| 27 | 付款费用: | 27 | 付款费用: | ... | ... |
| ... | @@ -117,7 +117,7 @@ | ... | @@ -117,7 +117,7 @@ |
| 117 | </view> | 117 | </view> |
| 118 | <view class="level-item"> | 118 | <view class="level-item"> |
| 119 | <text class="level-label">考试级别</text> | 119 | <text class="level-label">考试级别</text> |
| 120 | <view class="select-wrapper" @click="changeLevelfather(n)"> | 120 | <view class="select-wrapper exam-level-select" @click="changeLevelfather(n)"> |
| 121 | <uni-data-select v-model="n.levelNew" :clear="false" :localdata="levelArr" @change="changeLevel"/> | 121 | <uni-data-select v-model="n.levelNew" :clear="false" :localdata="levelArr" @change="changeLevel"/> |
| 122 | </view> | 122 | </view> |
| 123 | </view> | 123 | </view> |
| ... | @@ -427,7 +427,10 @@ function getChosedStudentList() { | ... | @@ -427,7 +427,10 @@ function getChosedStudentList() { |
| 427 | d.levelRecommend = '9' | 427 | d.levelRecommend = '9' |
| 428 | } | 428 | } |
| 429 | 429 | ||
| 430 | if (!d.levelNew) { | 430 | // 原级别是一级时,levelNew 默认为空,不使用推荐值 |
| 431 | if (d.levelOld === '1') { | ||
| 432 | d.levelNew = '' | ||
| 433 | } else if (!d.levelNew) { | ||
| 431 | d.levelNew = d.levelRecommend | 434 | d.levelNew = d.levelRecommend |
| 432 | } | 435 | } |
| 433 | 436 | ||
| ... | @@ -475,10 +478,21 @@ function szToHz(num) { | ... | @@ -475,10 +478,21 @@ function szToHz(num) { |
| 475 | 478 | ||
| 476 | let nowRow | 479 | let nowRow |
| 477 | 480 | ||
| 478 | function changeLevelfather(row) { | 481 | function changeLevelfather(row, flag = 0) { |
| 479 | nowRow = row | 482 | const data = _.map(infoList.value, (d) => { |
| 480 | api.jiDropDownBox({ | 483 | return { |
| 481 | perId: row.perId | 484 | id: d.id, |
| 485 | levelNew: d.levelNew, | ||
| 486 | // score: d.score, | ||
| 487 | isPass: d.isPass | ||
| 488 | } | ||
| 489 | }) | ||
| 490 | api.editLevel({ | ||
| 491 | examId: form.value.examId, | ||
| 492 | personInfo: JSON.stringify(data), | ||
| 493 | transcript: form.value.transcript, | ||
| 494 | // perId: row.perId, | ||
| 495 | status: flag | ||
| 482 | }).then(res => { | 496 | }).then(res => { |
| 483 | levelArr.value = res.data | 497 | levelArr.value = res.data |
| 484 | for (let l of levelArr.value) { | 498 | for (let l of levelArr.value) { |
| ... | @@ -489,36 +503,43 @@ function changeLevelfather(row) { | ... | @@ -489,36 +503,43 @@ function changeLevelfather(row) { |
| 489 | } | 503 | } |
| 490 | 504 | ||
| 491 | function changeLevel(e) { | 505 | function changeLevel(e) { |
| 492 | if (e == nowRow.levelOld) { | 506 | // 切换考试级别时弹出确认框 |
| 493 | uni.showToast({title: '考试级别重复,请重新选择!', icon: 'none'}) | ||
| 494 | nowRow.levelNew = nowRow.levelRecommend | ||
| 495 | return | ||
| 496 | } | ||
| 497 | if (e !== nowRow.levelRecommend) { | ||
| 498 | uni.showModal({ | 507 | uni.showModal({ |
| 499 | title: '提示', | 508 | title: '提示', |
| 500 | content: `建议考试级别为 "${szToHz(nowRow.levelRecommend)}级" ,确定要修改为${szToHz(e)}级吗?`, | 509 | content: '请仔细核实本次等级申报是否正确!', |
| 501 | success: function (res) { | 510 | success: function (res) { |
| 502 | if (res.confirm) { | 511 | if (res.confirm) { |
| 512 | // 保存当前行数据 | ||
| 513 | const data = _.map(infoList.value, (d) => { | ||
| 514 | return { | ||
| 515 | id: d.id, | ||
| 516 | levelNew: d.levelNew, | ||
| 517 | isPass: d.isPass | ||
| 518 | } | ||
| 519 | }) | ||
| 520 | api.editLevel({ | ||
| 521 | examId: form.value.examId, | ||
| 522 | personInfo: JSON.stringify(data), | ||
| 523 | transcript: form.value.transcript, | ||
| 524 | status: 0 | ||
| 525 | }).then(() => { | ||
| 526 | // 保存成功后更新统计 | ||
| 503 | getTablePersonInfo() | 527 | getTablePersonInfo() |
| 528 | }) | ||
| 504 | } else { | 529 | } else { |
| 505 | nowRow.levelNew = nowRow.levelRecommend | 530 | // 取消时恢复为推荐级别 |
| 531 | nowRow.levelNew = nowRow.levelRecommend != 0 ? nowRow.levelRecommend : '' | ||
| 506 | } | 532 | } |
| 507 | }, | 533 | }, |
| 508 | fail: function (res) { | 534 | fail: function (res) { |
| 509 | nowRow.levelNew = nowRow.levelRecommend | 535 | nowRow.levelNew = nowRow.levelRecommend != 0 ? nowRow.levelRecommend : '' |
| 510 | } | 536 | } |
| 511 | }) | 537 | }) |
| 512 | } | ||
| 513 | } | 538 | } |
| 514 | 539 | ||
| 515 | function submitForm2(flag) { | 540 | function submitForm2(flag) { |
| 516 | // 循环校验考试级别 | 541 | // 循环校验考试级别是否选择(考试级别重复可以提交) |
| 517 | for (let item of infoList.value) { | 542 | for (let item of infoList.value) { |
| 518 | if (item.levelNew == item.levelOld) { | ||
| 519 | uni.showToast({title: `${item.realName}考试级别重复,请重新选择!`, icon: 'none'}) | ||
| 520 | return | ||
| 521 | } | ||
| 522 | if (!item.levelNew) { | 543 | if (!item.levelNew) { |
| 523 | uni.showToast({title: `${item.realName}请选择考试级别!`, icon: 'none'}) | 544 | uni.showToast({title: `${item.realName}请选择考试级别!`, icon: 'none'}) |
| 524 | return | 545 | return |
| ... | @@ -536,16 +557,11 @@ function submitForm2(flag) { | ... | @@ -536,16 +557,11 @@ function submitForm2(flag) { |
| 536 | content: `请确认人员照片是否已更新?`, | 557 | content: `请确认人员照片是否已更新?`, |
| 537 | success: function (res) { | 558 | success: function (res) { |
| 538 | if (res.confirm) { | 559 | if (res.confirm) { |
| 539 | // saveStep2(flag).then(() => { | 560 | saveStep2(flag).then(() => { |
| 540 | // uni.showToast({title: '提交成功', icon: 'none'}) | ||
| 541 | // uni.navigateTo({ | ||
| 542 | // url: `/level/paymentDetail?examId=${form.value.examId}` | ||
| 543 | // }) | ||
| 544 | // }) | ||
| 545 | |||
| 546 | uni.navigateTo({ | 561 | uni.navigateTo({ |
| 547 | url: `/level/paymentDetail?examId=${form.value.examId}` | 562 | url: `/level/paymentDetail?examId=${form.value.examId}` |
| 548 | }) | 563 | }) |
| 564 | }) | ||
| 549 | } | 565 | } |
| 550 | } | 566 | } |
| 551 | }) | 567 | }) |
| ... | @@ -866,7 +882,15 @@ function handleDelete(row) { | ... | @@ -866,7 +882,15 @@ function handleDelete(row) { |
| 866 | } | 882 | } |
| 867 | 883 | ||
| 868 | .select-wrapper { | 884 | .select-wrapper { |
| 869 | width: 120rpx; | 885 | width: 160rpx; |
| 886 | position: relative; | ||
| 887 | z-index: 99; | ||
| 888 | } | ||
| 889 | |||
| 890 | .exam-level-select { | ||
| 891 | position: relative; | ||
| 892 | z-index: 999; | ||
| 893 | margin-bottom: 300rpx; | ||
| 870 | } | 894 | } |
| 871 | } | 895 | } |
| 872 | } | 896 | } | ... | ... |
| ... | @@ -23,9 +23,10 @@ | ... | @@ -23,9 +23,10 @@ |
| 23 | <view class="date">注册地:{{n.memName||'-'}}</view> | 23 | <view class="date">注册地:{{n.memName||'-'}}</view> |
| 24 | </view> | 24 | </view> |
| 25 | <view class="status"> | 25 | <view class="status"> |
| 26 | <text v-if="isChosen(n)" class="text-gray">已选</text> | 26 | <text v-if="isChosen(n)" class="text-chosen">已选</text> |
| 27 | <!-- <text v-else-if="n.canChoose != 1" class="text-gray">不可选</text> --> | 27 | <!-- <text v-else-if="n.canChoose != 1" class="text-gray">不可选</text> --> |
| 28 | <text v-if="n.canChoose == 1" class="text-primary" @click="handleChoose(n)">选择</text> | 28 | <text v-else-if="n.canChoose == 1" class="text-primary" @click="handleChoose(n)">选择</text> |
| 29 | <text v-else class="text-gray">不可选</text> | ||
| 29 | </view> | 30 | </view> |
| 30 | </view> | 31 | </view> |
| 31 | </view> | 32 | </view> |
| ... | @@ -146,6 +147,15 @@ | ... | @@ -146,6 +147,15 @@ |
| 146 | } | 147 | } |
| 147 | 148 | ||
| 148 | function handleChoose(row) { | 149 | function handleChoose(row) { |
| 150 | // 校验是否已被其他位置选中 | ||
| 151 | if (isChosen(row)) { | ||
| 152 | uni.showToast({ | ||
| 153 | title: '该考官已被选中,不能重复选择', | ||
| 154 | icon: 'none' | ||
| 155 | }) | ||
| 156 | return | ||
| 157 | } | ||
| 158 | |||
| 149 | if (row.canChoose != 1) { | 159 | if (row.canChoose != 1) { |
| 150 | uni.showToast({ | 160 | uni.showToast({ |
| 151 | title: '该考官资质已过期!', | 161 | title: '该考官资质已过期!', |
| ... | @@ -215,7 +225,7 @@ | ... | @@ -215,7 +225,7 @@ |
| 215 | success: (res) => { | 225 | success: (res) => { |
| 216 | if (res.confirm) { | 226 | if (res.confirm) { |
| 217 | uni.showLoading({ title: '添加中' }) | 227 | uni.showLoading({ title: '添加中' }) |
| 218 | api.selfAdd(app.globalData.memberInfo.memId, row.perId).then(() => { | 228 | api.selfAdd(row.perId).then(() => { |
| 219 | uni.hideLoading() | 229 | uni.hideLoading() |
| 220 | uni.showToast({ title: '添加成功', icon: 'success' }) | 230 | uni.showToast({ title: '添加成功', icon: 'success' }) |
| 221 | addPopup.value.close() | 231 | addPopup.value.close() |
| ... | @@ -317,6 +327,11 @@ | ... | @@ -317,6 +327,11 @@ |
| 317 | color: #999; | 327 | color: #999; |
| 318 | } | 328 | } |
| 319 | 329 | ||
| 330 | .text-chosen { | ||
| 331 | color: #AD181F; | ||
| 332 | font-weight: bold; | ||
| 333 | } | ||
| 334 | |||
| 320 | .text-danger { | 335 | .text-danger { |
| 321 | color: #dd524d; | 336 | color: #dd524d; |
| 322 | } | 337 | } | ... | ... |
level/settlementAudit.vue
0 → 100644
This diff is collapsed.
Click to expand it.
level/settlementView.vue
0 → 100644
This diff is collapsed.
Click to expand it.
| ... | @@ -63,7 +63,7 @@ | ... | @@ -63,7 +63,7 @@ |
| 63 | <button class="btn-red" @click="login">登录</button> | 63 | <button class="btn-red" @click="login">登录</button> |
| 64 | </view> | 64 | </view> |
| 65 | <view class="center-item"> | 65 | <view class="center-item"> |
| 66 | <text class="text-red" @click="goRegister">没有账号,去注册</text> | 66 | <button class="btn-red btn-register" @click="goRegister">没有账号,去注册</button> |
| 67 | </view> | 67 | </view> |
| 68 | </view> | 68 | </view> |
| 69 | <view class="wNumber"> | 69 | <view class="wNumber"> |
| ... | @@ -84,6 +84,25 @@ | ... | @@ -84,6 +84,25 @@ |
| 84 | <image v-else src="@/static/login/xz2@2x.png"></image> | 84 | <image v-else src="@/static/login/xz2@2x.png"></image> |
| 85 | <view>登录即代表您同意<text>《用户协议》</text><text>《隐私策略》</text></view> --> | 85 | <view>登录即代表您同意<text>《用户协议》</text><text>《隐私策略》</text></view> --> |
| 86 | </view> | 86 | </view> |
| 87 | |||
| 88 | <!-- 注册提示弹框 --> | ||
| 89 | <uni-popup ref="registerPopup" type="center" :mask-click="false"> | ||
| 90 | <view class="register-popup"> | ||
| 91 | <view class="popup-title">注册提示</view> | ||
| 92 | <view class="popup-content"> | ||
| 93 | <view class="popup-text">请准备以下材料,以便顺利完成注册</view> | ||
| 94 | <view class="popup-list"> | ||
| 95 | <text>1. 单位营业执照(清晰照片)</text> | ||
| 96 | <text>2. 法人身份证正反面照片(清晰照片)</text> | ||
| 97 | <text>3. 单位营业执照(清晰照片)</text> | ||
| 98 | </view> | ||
| 99 | </view> | ||
| 100 | <view class="popup-btns"> | ||
| 101 | <view class="popup-btn cancel" @click="closeRegisterPopup">取消</view> | ||
| 102 | <view class="popup-btn confirm" @click="confirmRegister">确定</view> | ||
| 103 | </view> | ||
| 104 | </view> | ||
| 105 | </uni-popup> | ||
| 87 | </view> | 106 | </view> |
| 88 | </template> | 107 | </template> |
| 89 | 108 | ||
| ... | @@ -107,6 +126,7 @@ const agree = ref(false) | ... | @@ -107,6 +126,7 @@ const agree = ref(false) |
| 107 | const isRember = ref(true) | 126 | const isRember = ref(true) |
| 108 | const loading = ref(false) | 127 | const loading = ref(false) |
| 109 | const codeUrl = ref(null) | 128 | const codeUrl = ref(null) |
| 129 | const registerPopup = ref(null) | ||
| 110 | const inputstyle = ref({ | 130 | const inputstyle = ref({ |
| 111 | borderColor: 'transparent', | 131 | borderColor: 'transparent', |
| 112 | fontSize: '30rpx' | 132 | fontSize: '30rpx' |
| ... | @@ -226,9 +246,17 @@ function login() { | ... | @@ -226,9 +246,17 @@ function login() { |
| 226 | } | 246 | } |
| 227 | 247 | ||
| 228 | function goRegister() { | 248 | function goRegister() { |
| 229 | const path = '/login/register' | 249 | registerPopup.value.open() |
| 250 | } | ||
| 251 | |||
| 252 | function closeRegisterPopup() { | ||
| 253 | registerPopup.value.close() | ||
| 254 | } | ||
| 255 | |||
| 256 | function confirmRegister() { | ||
| 257 | registerPopup.value.close() | ||
| 230 | uni.navigateTo({ | 258 | uni.navigateTo({ |
| 231 | url: path | 259 | url: '/login/register' |
| 232 | }) | 260 | }) |
| 233 | } | 261 | } |
| 234 | 262 | ||
| ... | @@ -517,4 +545,78 @@ function call(num) { | ... | @@ -517,4 +545,78 @@ function call(num) { |
| 517 | margin-right: 20rpx; | 545 | margin-right: 20rpx; |
| 518 | } | 546 | } |
| 519 | } | 547 | } |
| 548 | |||
| 549 | /* 注册按钮 */ | ||
| 550 | .btn-register { | ||
| 551 | border-radius: 40rpx; | ||
| 552 | width: 600rpx; | ||
| 553 | line-height: 80rpx; | ||
| 554 | font-size: 36rpx; | ||
| 555 | background: #fff; | ||
| 556 | color: #AD181F; | ||
| 557 | border: 1rpx solid #AD181F; | ||
| 558 | margin: 0; | ||
| 559 | } | ||
| 560 | |||
| 561 | /* 注册提示弹框 */ | ||
| 562 | .register-popup { | ||
| 563 | width: 600rpx; | ||
| 564 | background: #ffffff; | ||
| 565 | border-radius: 24rpx; | ||
| 566 | overflow: hidden; | ||
| 567 | } | ||
| 568 | |||
| 569 | .popup-title { | ||
| 570 | font-size: 32rpx; | ||
| 571 | font-weight: 500; | ||
| 572 | color: #333; | ||
| 573 | text-align: center; | ||
| 574 | padding: 40rpx 30rpx 20rpx; | ||
| 575 | } | ||
| 576 | |||
| 577 | .popup-content { | ||
| 578 | padding: 20rpx 30rpx 40rpx; | ||
| 579 | } | ||
| 580 | |||
| 581 | .popup-text { | ||
| 582 | font-size: 28rpx; | ||
| 583 | color: #333; | ||
| 584 | margin-bottom: 20rpx; | ||
| 585 | } | ||
| 586 | |||
| 587 | .popup-list { | ||
| 588 | display: flex; | ||
| 589 | flex-direction: column; | ||
| 590 | gap: 16rpx; | ||
| 591 | padding-left: 10rpx; | ||
| 592 | } | ||
| 593 | |||
| 594 | .popup-list text { | ||
| 595 | font-size: 26rpx; | ||
| 596 | color: #666; | ||
| 597 | line-height: 1.5; | ||
| 598 | } | ||
| 599 | |||
| 600 | .popup-btns { | ||
| 601 | display: flex; | ||
| 602 | border-top: 1rpx solid #eee; | ||
| 603 | } | ||
| 604 | |||
| 605 | .popup-btn { | ||
| 606 | flex: 1; | ||
| 607 | height: 100rpx; | ||
| 608 | line-height: 100rpx; | ||
| 609 | text-align: center; | ||
| 610 | font-size: 30rpx; | ||
| 611 | } | ||
| 612 | |||
| 613 | .popup-btn.cancel { | ||
| 614 | color: #666; | ||
| 615 | border-right: 1rpx solid #eee; | ||
| 616 | } | ||
| 617 | |||
| 618 | .popup-btn.confirm { | ||
| 619 | color: #AD181F; | ||
| 620 | font-weight: 500; | ||
| 621 | } | ||
| 520 | </style> | 622 | </style> | ... | ... |
| ... | @@ -12,19 +12,19 @@ | ... | @@ -12,19 +12,19 @@ |
| 12 | <form> | 12 | <form> |
| 13 | <view class="round-input-item"> | 13 | <view class="round-input-item"> |
| 14 | <image class="icon" :src="config.baseUrl_api+'/fs/static/login/tag01@2x.png'"></image> | 14 | <image class="icon" :src="config.baseUrl_api+'/fs/static/login/tag01@2x.png'"></image> |
| 15 | <uni-easyinput :styles="inputstyle" v-model="registerForm.telNo" placeholder="请输入手机号" /> | 15 | <uni-easyinput :styles="inputstyle" v-model="registerForm.telNo" placeholder="请输入手机号" @blur="validateTelNo" /> |
| 16 | </view> | 16 | </view> |
| 17 | <view class="round-input-item"> | 17 | <view class="round-input-item"> |
| 18 | <image class="icon" :src="config.baseUrl_api+'/fs/static/login/tag02@2x.png'"></image> | 18 | <image class="icon" :src="config.baseUrl_api+'/fs/static/login/tag02@2x.png'"></image> |
| 19 | <uni-easyinput :styles="inputstyle" v-model="registerForm.password" placeholder="密码" type="password"/> | 19 | <uni-easyinput :styles="inputstyle" v-model="registerForm.password" placeholder="密码" type="password" @blur="validatePassword" /> |
| 20 | </view> | 20 | </view> |
| 21 | <view class="round-input-item"> | 21 | <view class="round-input-item"> |
| 22 | <image class="icon" :src="config.baseUrl_api+'/fs/static/login/tag03@2x.png'"></image> | 22 | <image class="icon" :src="config.baseUrl_api+'/fs/static/login/tag03@2x.png'"></image> |
| 23 | <uni-easyinput :styles="inputstyle" v-model="registerForm.password2" placeholder="确认密码" type="password"/> | 23 | <uni-easyinput :styles="inputstyle" v-model="registerForm.password2" placeholder="确认密码" type="password" @blur="validatePassword2" /> |
| 24 | </view> | 24 | </view> |
| 25 | <view class="round-input-item"> | 25 | <view class="round-input-item"> |
| 26 | <image class="icon" :src="config.baseUrl_api+'/fs/static/login/tag03@2x.png'"></image> | 26 | <image class="icon" :src="config.baseUrl_api+'/fs/static/login/tag03@2x.png'"></image> |
| 27 | <uni-easyinput :styles="inputstyle" placeholder="图形验证码" v-model="registerForm.captcha" /> | 27 | <uni-easyinput :styles="inputstyle" placeholder="图形验证码" v-model="registerForm.captcha" @blur="validateCaptcha" /> |
| 28 | <image :src="codeUrl" @click="getCode" /> | 28 | <image :src="codeUrl" @click="getCode" /> |
| 29 | </view> | 29 | </view> |
| 30 | <view class="round-input-item"> | 30 | <view class="round-input-item"> |
| ... | @@ -138,12 +138,20 @@ function register() { | ... | @@ -138,12 +138,20 @@ function register() { |
| 138 | 138 | ||
| 139 | groupMemberRegister(registerForm.value) | 139 | groupMemberRegister(registerForm.value) |
| 140 | .then((res) => { | 140 | .then((res) => { |
| 141 | uni.showToast({ | 141 | uni.showModal({ |
| 142 | title: `恭喜你,您的账号 ${registerForm.value.telNo} 注册成功!`, | 142 | title: '提示', |
| 143 | icon: 'none' | 143 | content: `恭喜你,您的账号 ${registerForm.value.telNo} 注册成功!`, |
| 144 | }) | 144 | confirmText: '去登录', |
| 145 | cancelText: '取消', | ||
| 146 | success: (res) => { | ||
| 147 | if (res.confirm) { | ||
| 145 | registerForm.value = {} | 148 | registerForm.value = {} |
| 146 | setTimeout(goLogin, 2000) | 149 | goLogin() |
| 150 | } else { | ||
| 151 | // 取消,保持当前页面 | ||
| 152 | } | ||
| 153 | } | ||
| 154 | }) | ||
| 147 | }) | 155 | }) |
| 148 | } | 156 | } |
| 149 | 157 | ||
| ... | @@ -160,6 +168,58 @@ function validPassword(pwd) { | ... | @@ -160,6 +168,58 @@ function validPassword(pwd) { |
| 160 | return (lowerRegex.test(pwd) && upperRegex.test(pwd) && digitRegex.test(pwd) && symbolRegex.test(pwd) && specific.test(pwd)) | 168 | return (lowerRegex.test(pwd) && upperRegex.test(pwd) && digitRegex.test(pwd) && symbolRegex.test(pwd) && specific.test(pwd)) |
| 161 | } | 169 | } |
| 162 | 170 | ||
| 171 | // 手机号校验 | ||
| 172 | function validateTelNo() { | ||
| 173 | const telNo = registerForm.value.telNo | ||
| 174 | if (!telNo) { | ||
| 175 | uni.showToast({ title: '手机号不能为空', icon: 'none' }) | ||
| 176 | return false | ||
| 177 | } | ||
| 178 | if (!/^1[3-9]\d{9}$/.test(telNo)) { | ||
| 179 | uni.showToast({ title: '手机号格式不正确', icon: 'none' }) | ||
| 180 | return false | ||
| 181 | } | ||
| 182 | return true | ||
| 183 | } | ||
| 184 | |||
| 185 | // 密码校验 | ||
| 186 | function validatePassword() { | ||
| 187 | const password = registerForm.value.password | ||
| 188 | if (!password) { | ||
| 189 | uni.showToast({ title: '密码不能为空', icon: 'none' }) | ||
| 190 | return false | ||
| 191 | } | ||
| 192 | if (!validPassword(password)) { | ||
| 193 | uni.showToast({ title: '密码必须为8~18位大小写字母、数字和特殊符号组合', icon: 'none', duration: 3000 }) | ||
| 194 | return false | ||
| 195 | } | ||
| 196 | return true | ||
| 197 | } | ||
| 198 | |||
| 199 | // 确认密码校验 | ||
| 200 | function validatePassword2() { | ||
| 201 | const password2 = registerForm.value.password2 | ||
| 202 | if (!password2) { | ||
| 203 | uni.showToast({ title: '确认密码不能为空', icon: 'none' }) | ||
| 204 | return false | ||
| 205 | } | ||
| 206 | if (registerForm.value.password && password2 !== registerForm.value.password) { | ||
| 207 | uni.showToast({ title: '两次密码不一致', icon: 'none' }) | ||
| 208 | return false | ||
| 209 | } | ||
| 210 | return true | ||
| 211 | } | ||
| 212 | |||
| 213 | // 图形验证码校验 | ||
| 214 | function validateCaptcha() { | ||
| 215 | const captcha = registerForm.value.captcha | ||
| 216 | if (!captcha) { | ||
| 217 | uni.showToast({ title: '图形验证码不能为空', icon: 'none' }) | ||
| 218 | return false | ||
| 219 | } | ||
| 220 | return true | ||
| 221 | } | ||
| 222 | |||
| 163 | function goLogin() { | 223 | function goLogin() { |
| 164 | let path = '/login/loginC'; | 224 | let path = '/login/loginC'; |
| 165 | uni.navigateTo({ | 225 | uni.navigateTo({ | ... | ... |
| ... | @@ -51,7 +51,7 @@ | ... | @@ -51,7 +51,7 @@ |
| 51 | </uni-list-item> | 51 | </uni-list-item> |
| 52 | <uni-list-item v-if="form.menCode" :rightText="form.menCode" title="会员编号"/> | 52 | <uni-list-item v-if="form.menCode" :rightText="form.menCode" title="会员编号"/> |
| 53 | <uni-list-item :rightText="form.name" title="机构名称"/> | 53 | <uni-list-item :rightText="form.name" title="机构名称"/> |
| 54 | <uni-list-item title="所属省份"> | 54 | <!-- <uni-list-item title="所属省份"> |
| 55 | <template v-slot:footer> | 55 | <template v-slot:footer> |
| 56 | <view class="frrr"> | 56 | <view class="frrr"> |
| 57 | <uni-data-picker v-model="form.belongProvinceId" :clear-icon="false" :localdata="options" | 57 | <uni-data-picker v-model="form.belongProvinceId" :clear-icon="false" :localdata="options" |
| ... | @@ -59,7 +59,7 @@ | ... | @@ -59,7 +59,7 @@ |
| 59 | </uni-data-picker> | 59 | </uni-data-picker> |
| 60 | </view> | 60 | </view> |
| 61 | </template> | 61 | </template> |
| 62 | </uni-list-item> | 62 | </uni-list-item> --> |
| 63 | <uni-list-item | 63 | <uni-list-item |
| 64 | v-if="authenticationStatusa != 1&&authenticationStatusa != 0&&authenticationStatusa != 3&&newResult||form.associateId&&form.associateId>0||activeStatus==1" | 64 | v-if="authenticationStatusa != 1&&authenticationStatusa != 0&&authenticationStatusa != 3&&newResult||form.associateId&&form.associateId>0||activeStatus==1" |
| 65 | :rightText="form.creditCode" | 65 | :rightText="form.creditCode" |
| ... | @@ -96,7 +96,8 @@ | ... | @@ -96,7 +96,8 @@ |
| 96 | </view> | 96 | </view> |
| 97 | </template> | 97 | </template> |
| 98 | </uni-list-item> | 98 | </uni-list-item> |
| 99 | 99 | <uni-list-item :rightText="form.companyName||'--'" title="营业执照名称"/> | |
| 100 | <uni-list-item :rightText="form.creditCode||'--'" title="社会信用代码"/> | ||
| 100 | <uni-list-item clickable title="营业执照"> | 101 | <uni-list-item clickable title="营业执照"> |
| 101 | <template v-slot:footer> | 102 | <template v-slot:footer> |
| 102 | <view v-if="form.businessLicenseArr&&form.businessLicenseArr?.length>0" class="frrr" | 103 | <view v-if="form.businessLicenseArr&&form.businessLicenseArr?.length>0" class="frrr" | ... | ... |
| ... | @@ -96,13 +96,21 @@ async function getList() { | ... | @@ -96,13 +96,21 @@ async function getList() { |
| 96 | return uni.showToast({title: '请输入考官编号', icon: 'none'}) | 96 | return uni.showToast({title: '请输入考官编号', icon: 'none'}) |
| 97 | 97 | ||
| 98 | loading.value = true | 98 | loading.value = true |
| 99 | try { | ||
| 99 | const res = await api.getCoachList(queryParams.value) | 100 | const res = await api.getCoachList(queryParams.value) |
| 100 | infoList.value = res.rows | 101 | infoList.value = res.rows || [] |
| 101 | total.value = res.total | 102 | total.value = res.total || 0 |
| 103 | } catch (err) { | ||
| 104 | console.error('获取考官列表失败:', err) | ||
| 105 | infoList.value = [] | ||
| 106 | total.value = 0 | ||
| 107 | } finally { | ||
| 102 | loading.value = false | 108 | loading.value = false |
| 109 | } | ||
| 103 | 110 | ||
| 111 | // 空数组提示 | ||
| 104 | if (infoList.value.length === 0) { | 112 | if (infoList.value.length === 0) { |
| 105 | uni.showToast({title: '请核实考官编号、有效期及归属地!', icon: 'none'}) | 113 | uni.showToast({title: '请核实考官编号、有效期及归属地', icon: 'none', duration: 2000}) |
| 106 | } | 114 | } |
| 107 | } | 115 | } |
| 108 | 116 | ||
| ... | @@ -163,7 +171,8 @@ async function confirmAddExpireExaminer() { | ... | @@ -163,7 +171,8 @@ async function confirmAddExpireExaminer() { |
| 163 | uni.navigateBack({delta: 1}) | 171 | uni.navigateBack({delta: 1}) |
| 164 | } catch (err) { | 172 | } catch (err) { |
| 165 | console.log(err) | 173 | console.log(err) |
| 166 | uni.showToast({title: '添加失败', icon: 'none'}) | 174 | const errMsg = err?.data?.msg || err?.msg || '添加失败' |
| 175 | uni.showToast({title: errMsg, icon: 'none', duration: 3000}) | ||
| 167 | } finally { | 176 | } finally { |
| 168 | expirePopup.value.close() | 177 | expirePopup.value.close() |
| 169 | currentExpireItem.value = null | 178 | currentExpireItem.value = null | ... | ... |
| ... | @@ -18,10 +18,10 @@ | ... | @@ -18,10 +18,10 @@ |
| 18 | <uni-forms-item label="机构名称" required> | 18 | <uni-forms-item label="机构名称" required> |
| 19 | <uni-easyinput v-model="form.name" :disabled="type" placeholder="机构名称" /></uni-forms-item> | 19 | <uni-easyinput v-model="form.name" :disabled="type" placeholder="机构名称" /></uni-forms-item> |
| 20 | 20 | ||
| 21 | <uni-forms-item label="所属省份" required> | 21 | <!-- <uni-forms-item label="所属省份" required> |
| 22 | <uni-data-select :clear="false" :disabled="type&&(belongProvinceId||belongProvinceId==0)" | 22 | <uni-data-select :clear="false" :disabled="type&&(belongProvinceId||belongProvinceId==0)" |
| 23 | v-model="form.belongProvinceId" :localdata="regionsList"></uni-data-select> | 23 | v-model="form.belongProvinceId" :localdata="regionsList"></uni-data-select> |
| 24 | </uni-forms-item> | 24 | </uni-forms-item> --> |
| 25 | <uni-forms-item label="社会信用代码" required> | 25 | <uni-forms-item label="社会信用代码" required> |
| 26 | <uni-easyinput v-model="form.creditCode" :disabled="type&&!!creditCode&&newResult" /> | 26 | <uni-easyinput v-model="form.creditCode" :disabled="type&&!!creditCode&&newResult" /> |
| 27 | </uni-forms-item> | 27 | </uni-forms-item> |
| ... | @@ -43,13 +43,11 @@ | ... | @@ -43,13 +43,11 @@ |
| 43 | <uni-forms-item label="法人证件号" required> | 43 | <uni-forms-item label="法人证件号" required> |
| 44 | <uni-easyinput v-model="form.legalIdcCode" /> | 44 | <uni-easyinput v-model="form.legalIdcCode" /> |
| 45 | </uni-forms-item> | 45 | </uni-forms-item> |
| 46 | <uni-forms-item label="营业执照名称" required> | ||
| 47 | <uni-easyinput v-model="form.companyName" /> | ||
| 48 | </uni-forms-item> | ||
| 49 | 46 | ||
| 50 | <uni-forms-item v-if="form.deptType==6&&activeStatus!= 0" label="是否申请考点" required> | 47 | |
| 48 | <!-- <uni-forms-item v-if="form.deptType==6&&activeStatus!= 0" label="是否申请考点" required> | ||
| 51 | <uni-data-checkbox v-model="form.applyPoints" :localdata="yesno" /> | 49 | <uni-data-checkbox v-model="form.applyPoints" :localdata="yesno" /> |
| 52 | </uni-forms-item> | 50 | </uni-forms-item> --> |
| 53 | 51 | ||
| 54 | <uni-forms-item label="法人身份证" required> | 52 | <uni-forms-item label="法人身份证" required> |
| 55 | <view class="imgArea"> | 53 | <view class="imgArea"> |
| ... | @@ -63,11 +61,17 @@ | ... | @@ -63,11 +61,17 @@ |
| 63 | </uni-file-picker> | 61 | </uni-file-picker> |
| 64 | </view> | 62 | </view> |
| 65 | </uni-forms-item> | 63 | </uni-forms-item> |
| 64 | <uni-forms-item label="营业执照名称" required> | ||
| 65 | <uni-easyinput v-model="form.companyName" /> | ||
| 66 | </uni-forms-item> | ||
| 66 | <uni-forms-item label="营业执照" required> | 67 | <uni-forms-item label="营业执照" required> |
| 67 | <uni-file-picker limit="1" v-model="businessLicenseArr" file-extname="png,jpg,jpeg,pdf" | 68 | <uni-file-picker limit="1" v-model="businessLicenseArr" file-extname="png,jpg,jpeg,pdf" |
| 68 | file-mediatype="all" @select="selectFile" @delete="delSupplementFile"></uni-file-picker> | 69 | file-mediatype="all" @select="selectFile" @delete="delSupplementFile"></uni-file-picker> |
| 69 | |||
| 70 | </uni-forms-item> | 70 | </uni-forms-item> |
| 71 | <!-- <uni-forms-item label="社会信用代码" required> | ||
| 72 | <uni-file-picker limit="1" v-model="businessLicenseArr" file-extname="png,jpg,jpeg,pdf" | ||
| 73 | file-mediatype="all" @select="selectFile" @delete="delSupplementFile"></uni-file-picker> | ||
| 74 | </uni-forms-item> --> | ||
| 71 | <uni-forms-item label="机构照片" required> | 75 | <uni-forms-item label="机构照片" required> |
| 72 | <uni-file-picker v-model="picArrR" limit="3" mode="grid" file-mediatype="image" | 76 | <uni-file-picker v-model="picArrR" limit="3" mode="grid" file-mediatype="image" |
| 73 | @select="upPicArr" @delete="delpicArr"> | 77 | @select="upPicArr" @delete="delpicArr"> | ... | ... |
| ... | @@ -240,6 +240,13 @@ | ... | @@ -240,6 +240,13 @@ |
| 240 | "navigationBarTitleText": "我的订单", | 240 | "navigationBarTitleText": "我的订单", |
| 241 | "enablePullDownRefresh": false | 241 | "enablePullDownRefresh": false |
| 242 | } | 242 | } |
| 243 | }, | ||
| 244 | { | ||
| 245 | "path": "certPreview", | ||
| 246 | "style": { | ||
| 247 | "navigationBarTitleText": "电子会员证", | ||
| 248 | "enablePullDownRefresh": false | ||
| 249 | } | ||
| 243 | } | 250 | } |
| 244 | ] | 251 | ] |
| 245 | }, | 252 | }, |
| ... | @@ -876,6 +883,20 @@ | ... | @@ -876,6 +883,20 @@ |
| 876 | "navigationBarTitleText": "考生信息", | 883 | "navigationBarTitleText": "考生信息", |
| 877 | "enablePullDownRefresh": false | 884 | "enablePullDownRefresh": false |
| 878 | } | 885 | } |
| 886 | }, | ||
| 887 | { | ||
| 888 | "path": "settlementAudit", | ||
| 889 | "style": { | ||
| 890 | "navigationBarTitleText": "结算审核", | ||
| 891 | "enablePullDownRefresh": false | ||
| 892 | } | ||
| 893 | }, | ||
| 894 | { | ||
| 895 | "path": "settlementView", | ||
| 896 | "style": { | ||
| 897 | "navigationBarTitleText": "结算详情", | ||
| 898 | "enablePullDownRefresh": false | ||
| 899 | } | ||
| 879 | } | 900 | } |
| 880 | ] | 901 | ] |
| 881 | }, { | 902 | }, { | ... | ... |
| ... | @@ -239,18 +239,23 @@ | ... | @@ -239,18 +239,23 @@ |
| 239 | <image :src="config.baseUrl_api+'/fs/static/icon/2.png'"/> | 239 | <image :src="config.baseUrl_api+'/fs/static/icon/2.png'"/> |
| 240 | 考试审核 | 240 | 考试审核 |
| 241 | </view> | 241 | </view> |
| 242 | <view @click="goPath('/level/ztx/cert?type=1')"> | ||
| 243 | <image :src="config.baseUrl_api+'/fs/static/icon/18.png'"/> | ||
| 244 | 证书发布 | ||
| 245 | </view> | ||
| 246 | <view @click="goPath('/level/ztx/mail')"> | 242 | <view @click="goPath('/level/ztx/mail')"> |
| 247 | <image :src="config.baseUrl_api+'/fs/static/icon/3.png'"/> | 243 | <image :src="config.baseUrl_api+'/fs/static/icon/3.png'"/> |
| 248 | 证书邮寄 | 244 | 证书邮寄 |
| 249 | </view> | 245 | </view> |
| 246 | <view @click="goPath('/level/ztx/cert?type=1')"> | ||
| 247 | <image :src="config.baseUrl_api+'/fs/static/icon/18.png'"/> | ||
| 248 | 证书发布 | ||
| 249 | </view> | ||
| 250 | <view @click="goPath('/personalVip/changeLevelAudit')"> | 250 | <view @click="goPath('/personalVip/changeLevelAudit')"> |
| 251 | <image :src="config.baseUrl_api+'/fs/static/icon/26.png'"/> | 251 | <image :src="config.baseUrl_api+'/fs/static/icon/26.png'"/> |
| 252 | 变更审核 | 252 | 变更审核 |
| 253 | </view> | 253 | </view> |
| 254 | <view @click="goPath('/level/settlementAudit')"> | ||
| 255 | <image :src="config.baseUrl_api+'/fs/static/icon/10.png'"/> | ||
| 256 | 结算审核 | ||
| 257 | </view> | ||
| 258 | |||
| 254 | <view @click="goPath('/personalVip/order?type=2')"> | 259 | <view @click="goPath('/personalVip/order?type=2')"> |
| 255 | <image :src="config.baseUrl_api+'/fs/static/icon/6.png'"/> | 260 | <image :src="config.baseUrl_api+'/fs/static/icon/6.png'"/> |
| 256 | 订单列表 | 261 | 订单列表 | ... | ... |
| ... | @@ -284,7 +284,7 @@ | ... | @@ -284,7 +284,7 @@ |
| 284 | getDetail() | 284 | getDetail() |
| 285 | getRegionsList() | 285 | getRegionsList() |
| 286 | 286 | ||
| 287 | getMyMemberCertUnitFeeApi() | 287 | // getMyMemberCertUnitFeeApi() |
| 288 | canUseDiscountApi() | 288 | canUseDiscountApi() |
| 289 | getZtxDiscountPolicyApi() | 289 | getZtxDiscountPolicyApi() |
| 290 | getMyStatusAPI() | 290 | getMyStatusAPI() | ... | ... |
| ... | @@ -176,7 +176,7 @@ | ... | @@ -176,7 +176,7 @@ |
| 176 | // 审核 | 176 | // 审核 |
| 177 | function goApproval(item) { | 177 | function goApproval(item) { |
| 178 | uni.navigateTo({ | 178 | uni.navigateTo({ |
| 179 | url: `/pages/rank/scoreAudit?ids=${item.examId}&pageType=2` | 179 | url: `/pages/rank/scoreAudit?ids=${item.examId}&pageType=1` |
| 180 | }) | 180 | }) |
| 181 | } | 181 | } |
| 182 | </script> | 182 | </script> | ... | ... |
| ... | @@ -87,12 +87,16 @@ | ... | @@ -87,12 +87,16 @@ |
| 87 | delete params.reason | 87 | delete params.reason |
| 88 | } | 88 | } |
| 89 | 89 | ||
| 90 | |||
| 90 | try { | 91 | try { |
| 91 | // 根据 pageType 自动切换接口 | 92 | // 根据 pageType 1 审核考试 2 审核成绩 3 结算审核 |
| 92 | if (pageType.value == '1') { | 93 | if (pageType.value == '1') { |
| 93 | await api.auditDuanExam(params); | 94 | await api.auditDuanExam(params); |
| 94 | } else if (pageType.value == '2') { | 95 | } else if (pageType.value == '2') { |
| 95 | await api.auditDuanScore(params); | 96 | await api.auditDuanScore(params); |
| 97 | } else if (pageType.value == '3') { | ||
| 98 | params.type = '1' // 结算审核固定 type = 1 | ||
| 99 | await api.settlementAudit(params); | ||
| 96 | } else { | 100 | } else { |
| 97 | uni.showToast({ title: '页面类型错误', icon: 'none' }); | 101 | uni.showToast({ title: '页面类型错误', icon: 'none' }); |
| 98 | submitting.value = false; | 102 | submitting.value = false; | ... | ... |
| ... | @@ -51,6 +51,14 @@ | ... | @@ -51,6 +51,14 @@ |
| 51 | <uni-easyinput :styles="inputstyle" :placeholderStyle="placeholderStyle" | 51 | <uni-easyinput :styles="inputstyle" :placeholderStyle="placeholderStyle" |
| 52 | v-model="baseFormData.phone" placeholder="请输入联系方式" /> | 52 | v-model="baseFormData.phone" placeholder="请输入联系方式" /> |
| 53 | </uni-forms-item> | 53 | </uni-forms-item> |
| 54 | <uni-forms-item label="会员编号" name="perCode" v-if="baseFormData.perCode"> | ||
| 55 | <uni-easyinput :styles="inputstyle" :placeholderStyle="placeholderStyle" | ||
| 56 | v-model="baseFormData.perCode" placeholder="请输入会员编号" /> | ||
| 57 | </uni-forms-item> | ||
| 58 | <uni-forms-item label="会员有效期" name="validityDate" v-if="baseFormData.validityDate"> | ||
| 59 | <uni-easyinput :styles="inputstyle" :placeholderStyle="placeholderStyle" | ||
| 60 | v-model="baseFormData.validityDate" placeholder="请输入会员有效期" /> | ||
| 61 | </uni-forms-item> | ||
| 54 | 62 | ||
| 55 | 63 | ||
| 56 | <!-- <uni-forms-item label="所在地区"> | 64 | <!-- <uni-forms-item label="所在地区"> |
| ... | @@ -148,6 +156,8 @@ | ... | @@ -148,6 +156,8 @@ |
| 148 | sex: '', | 156 | sex: '', |
| 149 | idcType: '0', | 157 | idcType: '0', |
| 150 | perType: '1', // (1:个人会员;2:教练;3:考官;4:裁判;5:临时会员;) | 158 | perType: '1', // (1:个人会员;2:教练;3:考官;4:裁判;5:临时会员;) |
| 159 | perCode:'', | ||
| 160 | validityDate:'' | ||
| 151 | }) | 161 | }) |
| 152 | const items = ref(['身份证添加', '证件照录入']) | 162 | const items = ref(['身份证添加', '证件照录入']) |
| 153 | const idcTypeList = ref([{ | 163 | const idcTypeList = ref([{ |
| ... | @@ -199,7 +209,7 @@ | ... | @@ -199,7 +209,7 @@ |
| 199 | height: '316rpx' | 209 | height: '316rpx' |
| 200 | }); | 210 | }); |
| 201 | 211 | ||
| 202 | onLoad((option) => { | 212 | onLoad(async (option) => { |
| 203 | if (option.tab == '1') { | 213 | if (option.tab == '1') { |
| 204 | current.value = 1 | 214 | current.value = 1 |
| 205 | baseFormData.value.sourceFlag = 1 | 215 | baseFormData.value.sourceFlag = 1 |
| ... | @@ -210,8 +220,11 @@ | ... | @@ -210,8 +220,11 @@ |
| 210 | disabledName.value = true | 220 | disabledName.value = true |
| 211 | } | 221 | } |
| 212 | } | 222 | } |
| 213 | // console.log(current.value,option.tab) | 223 | // 如果传入了 perId,预填会员信息 |
| 214 | // getRegionsList() | 224 | if (option.perId) { |
| 225 | perId.value = option.perId | ||
| 226 | await fetchMemberInfo(option.perId) | ||
| 227 | } | ||
| 215 | }) | 228 | }) |
| 216 | 229 | ||
| 217 | onMounted(() => { | 230 | onMounted(() => { |
| ... | @@ -227,6 +240,40 @@ | ... | @@ -227,6 +240,40 @@ |
| 227 | }) | 240 | }) |
| 228 | } | 241 | } |
| 229 | 242 | ||
| 243 | // 根据 perId 获取会员信息预填表单 | ||
| 244 | async function fetchMemberInfo(id) { | ||
| 245 | if (!id) return | ||
| 246 | uni.showLoading({ title: '加载中...' }) | ||
| 247 | try { | ||
| 248 | const res = await api.getInfo(id) | ||
| 249 | const data = res.data || {} | ||
| 250 | baseFormData.value.name = data.name || '' | ||
| 251 | baseFormData.value.idcCode = data.idcCode || '' | ||
| 252 | baseFormData.value.idcType = data.idcType || '0' | ||
| 253 | baseFormData.value.sex = data.sex || '' | ||
| 254 | baseFormData.value.birth = data.birth || '' | ||
| 255 | baseFormData.value.phone = data.phone || '' | ||
| 256 | baseFormData.value.perCode = data.perCode || '' | ||
| 257 | baseFormData.value.validityDate = data.validityDate ? data.validityDate.slice(0, 10) : '' | ||
| 258 | // 照片处理 | ||
| 259 | if (data.photo2) { | ||
| 260 | const photoUrl = data.photo2.indexOf('http') === -1 ? config.baseUrl_api + data.photo2 : data.photo2 | ||
| 261 | photoArr.value = { | ||
| 262 | url: photoUrl, | ||
| 263 | name: '头像', | ||
| 264 | extname: 'jpg' | ||
| 265 | } | ||
| 266 | baseFormData.value.photo = data.photo | ||
| 267 | baseFormData.value.photo2 = data.photo2 | ||
| 268 | } | ||
| 269 | disabledName.value = true | ||
| 270 | } catch (e) { | ||
| 271 | console.error('获取会员信息失败', e) | ||
| 272 | } finally { | ||
| 273 | uni.hideLoading() | ||
| 274 | } | ||
| 275 | } | ||
| 276 | |||
| 230 | function onClickItem(e) { | 277 | function onClickItem(e) { |
| 231 | if (current.value != e.currentIndex) { | 278 | if (current.value != e.currentIndex) { |
| 232 | current.value = e.currentIndex | 279 | current.value = e.currentIndex |
| ... | @@ -277,6 +324,8 @@ | ... | @@ -277,6 +324,8 @@ |
| 277 | baseFormData.value.idcCode = res.data.code | 324 | baseFormData.value.idcCode = res.data.code |
| 278 | baseFormData.value.name = res.data.name | 325 | baseFormData.value.name = res.data.name |
| 279 | baseFormData.value.uuid = res.data.uuid | 326 | baseFormData.value.uuid = res.data.uuid |
| 327 | baseFormData.value.perCode = res.data.perCode ||'' | ||
| 328 | baseFormData.value.validityDate = res.data.validityDate?.slice(0,10) //去掉时分秒 | ||
| 280 | // baseFormData.value.cityId = res.data.cityId | 329 | // baseFormData.value.cityId = res.data.cityId |
| 281 | // baseFormData.value.address = res.data.address | 330 | // baseFormData.value.address = res.data.address |
| 282 | } else { | 331 | } else { |
| ... | @@ -363,6 +412,8 @@ | ... | @@ -363,6 +412,8 @@ |
| 363 | baseFormData.value.birth = res.data.birth | 412 | baseFormData.value.birth = res.data.birth |
| 364 | baseFormData.value.name = res.data.name | 413 | baseFormData.value.name = res.data.name |
| 365 | baseFormData.value.phone = res.data.phone | 414 | baseFormData.value.phone = res.data.phone |
| 415 | baseFormData.value.perCode = res.data.perCode ||'' | ||
| 416 | baseFormData.value.validityDate = res.data.validityDate?.slice(0,10) //去掉时分秒 | ||
| 366 | // baseFormData.value.cityId = res.data.cityId | 417 | // baseFormData.value.cityId = res.data.cityId |
| 367 | // baseFormData.value.address = res.data.address | 418 | // baseFormData.value.address = res.data.address |
| 368 | if (res.data.photo) { | 419 | if (res.data.photo) { | ... | ... |
personal/certPreview.vue
0 → 100644
| 1 | <template> | ||
| 2 | <view class="preview-container"> | ||
| 3 | <view class="loading-tip" v-if="loading">加载中...</view> | ||
| 4 | <view class="error-tip" v-else-if="showError">{{ errorMsg }}</view> | ||
| 5 | |||
| 6 | <view class="download-btn" @click="openDocument"> | ||
| 7 | <text>查看会员证</text> | ||
| 8 | </view> | ||
| 9 | </view> | ||
| 10 | </template> | ||
| 11 | |||
| 12 | <script setup> | ||
| 13 | import { ref } from "vue"; | ||
| 14 | import { onLoad } from "@dcloudio/uni-app"; | ||
| 15 | import config from "@/config.js"; | ||
| 16 | |||
| 17 | const pdfUrl = ref(""); | ||
| 18 | const loading = ref(true); | ||
| 19 | const showError = ref(false); | ||
| 20 | const errorMsg = ref(""); | ||
| 21 | const tempFilePath = ref(""); | ||
| 22 | |||
| 23 | onLoad(async (option) => { | ||
| 24 | if (option.url) { | ||
| 25 | pdfUrl.value = config.baseUrl_api + decodeURIComponent(option.url); | ||
| 26 | await downloadPdf(); | ||
| 27 | } | ||
| 28 | }); | ||
| 29 | |||
| 30 | const downloadPdf = () => { | ||
| 31 | return new Promise((resolve) => { | ||
| 32 | uni.showLoading({ title: "加载中..." }); | ||
| 33 | uni.downloadFile({ | ||
| 34 | url: pdfUrl.value, | ||
| 35 | success: (res) => { | ||
| 36 | uni.hideLoading(); | ||
| 37 | if (res.statusCode === 200) { | ||
| 38 | tempFilePath.value = res.tempFilePath; | ||
| 39 | loading.value = false; | ||
| 40 | // 自动打开文档 | ||
| 41 | openDocument(); | ||
| 42 | } else { | ||
| 43 | showError.value = true; | ||
| 44 | errorMsg.value = "下载失败"; | ||
| 45 | } | ||
| 46 | resolve(); | ||
| 47 | }, | ||
| 48 | fail: () => { | ||
| 49 | uni.hideLoading(); | ||
| 50 | showError.value = true; | ||
| 51 | errorMsg.value = "下载失败"; | ||
| 52 | resolve(); | ||
| 53 | } | ||
| 54 | }); | ||
| 55 | }); | ||
| 56 | }; | ||
| 57 | |||
| 58 | const openDocument = () => { | ||
| 59 | if (!tempFilePath.value) { | ||
| 60 | uni.showToast({ title: "文件未准备好", icon: "none" }); | ||
| 61 | return; | ||
| 62 | } | ||
| 63 | uni.openDocument({ | ||
| 64 | filePath: tempFilePath.value, | ||
| 65 | fileType: "pdf", | ||
| 66 | showMenu: true, | ||
| 67 | success: () => { | ||
| 68 | console.log("打开文档成功"); | ||
| 69 | }, | ||
| 70 | fail: () => { | ||
| 71 | uni.showToast({ title: "打开失败,请在右上角菜单中下载", icon: "none" }); | ||
| 72 | } | ||
| 73 | }); | ||
| 74 | }; | ||
| 75 | </script> | ||
| 76 | |||
| 77 | <style lang="scss" scoped> | ||
| 78 | .preview-container { | ||
| 79 | min-height: 100vh; | ||
| 80 | background: #f5f5f5; | ||
| 81 | position: relative; | ||
| 82 | } | ||
| 83 | |||
| 84 | .loading-tip { | ||
| 85 | position: absolute; | ||
| 86 | top: 50%; | ||
| 87 | left: 50%; | ||
| 88 | transform: translate(-50%, -50%); | ||
| 89 | font-size: 28rpx; | ||
| 90 | color: #666; | ||
| 91 | } | ||
| 92 | |||
| 93 | .error-tip { | ||
| 94 | position: absolute; | ||
| 95 | top: 50%; | ||
| 96 | left: 50%; | ||
| 97 | transform: translate(-50%, -50%); | ||
| 98 | font-size: 28rpx; | ||
| 99 | color: #C40F18; | ||
| 100 | } | ||
| 101 | |||
| 102 | .download-btn { | ||
| 103 | position: fixed; | ||
| 104 | bottom: 50rpx; | ||
| 105 | left: 50%; | ||
| 106 | transform: translateX(-50%); | ||
| 107 | background: #C40F18; | ||
| 108 | color: #fff; | ||
| 109 | padding: 24rpx 60rpx; | ||
| 110 | border-radius: 40rpx; | ||
| 111 | font-size: 28rpx; | ||
| 112 | z-index: 100; | ||
| 113 | } | ||
| 114 | </style> |
This diff is collapsed.
Click to expand it.
| ... | @@ -76,6 +76,8 @@ | ... | @@ -76,6 +76,8 @@ |
| 76 | 76 | ||
| 77 | <script setup> | 77 | <script setup> |
| 78 | import { ref, onMounted } from 'vue'; | 78 | import { ref, onMounted } from 'vue'; |
| 79 | import { onLoad } from '@dcloudio/uni-app'; | ||
| 80 | |||
| 79 | import { useUserStore } from '../store/modules/user'; | 81 | import { useUserStore } from '../store/modules/user'; |
| 80 | import { getAssoPers } from '@/common/api.js'; | 82 | import { getAssoPers } from '@/common/api.js'; |
| 81 | import { getPersonTecDetails } from '@/common/api.js'; | 83 | import { getPersonTecDetails } from '@/common/api.js'; |
| ... | @@ -90,12 +92,22 @@ | ... | @@ -90,12 +92,22 @@ |
| 90 | // 变更记录相关 | 92 | // 变更记录相关 |
| 91 | const changeRecordPopup = ref(null); | 93 | const changeRecordPopup = ref(null); |
| 92 | const currentChangeRecord = ref(null); | 94 | const currentChangeRecord = ref(null); |
| 95 | const pageType = ref(''); | ||
| 93 | 96 | ||
| 94 | // 返回上一页 | 97 | // 返回上一页 |
| 95 | const goBack = () => { | 98 | const goBack = () => { |
| 96 | uni.navigateBack(); | 99 | uni.navigateBack(); |
| 97 | }; | 100 | }; |
| 98 | 101 | onLoad((option) => { | |
| 102 | if (option.type) { | ||
| 103 | pageType.value = option.type; | ||
| 104 | if (pageType.value == '0') { | ||
| 105 | uni.setNavigationBarTitle({ title: '级位记录' }) | ||
| 106 | } else if (pageType.value == '1') { | ||
| 107 | uni.setNavigationBarTitle({ title: '段位记录' }) | ||
| 108 | } | ||
| 109 | } | ||
| 110 | }); | ||
| 99 | // 显示变更记录 | 111 | // 显示变更记录 |
| 100 | const showChangeRecord = (item) => { | 112 | const showChangeRecord = (item) => { |
| 101 | // remark已经在getLevelRecords中解析过了,直接使用 | 113 | // remark已经在getLevelRecords中解析过了,直接使用 |
| ... | @@ -116,7 +128,7 @@ | ... | @@ -116,7 +128,7 @@ |
| 116 | const getLevelRecords = async () => { | 128 | const getLevelRecords = async () => { |
| 117 | loading.value = true; | 129 | loading.value = true; |
| 118 | try { | 130 | try { |
| 119 | const res = await getPersonTecDetails(0, perId.value); // 0表示级位 | 131 | const res = await getPersonTecDetails(pageType.value, perId.value); // 0表示级位 |
| 120 | levelRecords.value = res.data || []; | 132 | levelRecords.value = res.data || []; |
| 121 | // 处理数据 | 133 | // 处理数据 |
| 122 | levelRecords.value.forEach(item => { | 134 | levelRecords.value.forEach(item => { | ... | ... |
| ... | @@ -51,6 +51,14 @@ | ... | @@ -51,6 +51,14 @@ |
| 51 | <uni-easyinput :styles="inputstyle" :placeholderStyle="placeholderStyle" | 51 | <uni-easyinput :styles="inputstyle" :placeholderStyle="placeholderStyle" |
| 52 | v-model="baseFormData.phone" placeholder="请输入联系方式" /> | 52 | v-model="baseFormData.phone" placeholder="请输入联系方式" /> |
| 53 | </uni-forms-item> | 53 | </uni-forms-item> |
| 54 | <uni-forms-item label="会员编号" name="perCode" v-if="baseFormData.perCode"> | ||
| 55 | <uni-easyinput :styles="inputstyle" :placeholderStyle="placeholderStyle" | ||
| 56 | v-model="baseFormData.perCode" placeholder="请输入会员编号" /> | ||
| 57 | </uni-forms-item> | ||
| 58 | <uni-forms-item label="会员有效期" name="validityDate" v-if="baseFormData.validityDate"> | ||
| 59 | <uni-easyinput :styles="inputstyle" :placeholderStyle="placeholderStyle" | ||
| 60 | v-model="baseFormData.validityDate" placeholder="请输入会员有效期" /> | ||
| 61 | </uni-forms-item> | ||
| 54 | 62 | ||
| 55 | 63 | ||
| 56 | <uni-forms-item label="所在地区"> | 64 | <uni-forms-item label="所在地区"> |
| ... | @@ -142,6 +150,8 @@ | ... | @@ -142,6 +150,8 @@ |
| 142 | sex: '', | 150 | sex: '', |
| 143 | idcType: '0', | 151 | idcType: '0', |
| 144 | perType: '1', // (1:个人会员;2:教练;3:考官;4:裁判;5:临时会员;) | 152 | perType: '1', // (1:个人会员;2:教练;3:考官;4:裁判;5:临时会员;) |
| 153 | perCode:'', | ||
| 154 | validityDate:'' | ||
| 145 | }) | 155 | }) |
| 146 | const items = ref(['身份证添加', '证件照录入']) | 156 | const items = ref(['身份证添加', '证件照录入']) |
| 147 | const idcTypeList = ref([{ | 157 | const idcTypeList = ref([{ |
| ... | @@ -356,6 +366,8 @@ | ... | @@ -356,6 +366,8 @@ |
| 356 | baseFormData.value.phone = res.data.phone | 366 | baseFormData.value.phone = res.data.phone |
| 357 | baseFormData.value.cityId = res.data.cityId | 367 | baseFormData.value.cityId = res.data.cityId |
| 358 | baseFormData.value.address = res.data.address | 368 | baseFormData.value.address = res.data.address |
| 369 | baseFormData.value.perCode = res.data.perCode ||'' | ||
| 370 | baseFormData.value.validityDate = res.data.validityDate?.slice(0,10) //去掉时分秒 | ||
| 359 | if (res.data.photo) { | 371 | if (res.data.photo) { |
| 360 | console.log(res.data.photo) | 372 | console.log(res.data.photo) |
| 361 | if (res.data.photo.indexOf('http') == -1) { | 373 | if (res.data.photo.indexOf('http') == -1) { | ... | ... |
| ... | @@ -51,15 +51,15 @@ | ... | @@ -51,15 +51,15 @@ |
| 51 | <view class="stats-row"> | 51 | <view class="stats-row"> |
| 52 | <view class="stat-item"> | 52 | <view class="stat-item"> |
| 53 | <text class="stat-label">人数合计</text> | 53 | <text class="stat-label">人数合计</text> |
| 54 | <text class="stat-value">{{ item.allCount || 0 }}</text> | 54 | <text class="stat-value">{{ item.allCount || '/' }}</text> |
| 55 | </view> | 55 | </view> |
| 56 | <view class="stat-item"> | 56 | <view class="stat-item"> |
| 57 | <text class="stat-label">新会员合计</text> | 57 | <text class="stat-label">新会员合计</text> |
| 58 | <text class="stat-value">{{ item.newCount || 0 }}</text> | 58 | <text class="stat-value">{{ item.newCount || '/' }}</text> |
| 59 | </view> | 59 | </view> |
| 60 | <view class="stat-item"> | 60 | <view class="stat-item"> |
| 61 | <text class="stat-label">年限合计</text> | 61 | <text class="stat-label">年限合计</text> |
| 62 | <text class="stat-value">{{ item.yearCount || 0 }}</text> | 62 | <text class="stat-value">{{ item.yearCount || '/' }}</text> |
| 63 | </view> | 63 | </view> |
| 64 | </view> | 64 | </view> |
| 65 | 65 | ||
| ... | @@ -493,7 +493,7 @@ onUnmounted(() => { | ... | @@ -493,7 +493,7 @@ onUnmounted(() => { |
| 493 | } | 493 | } |
| 494 | .stat-value { | 494 | .stat-value { |
| 495 | font-size:32rpx; | 495 | font-size:32rpx; |
| 496 | font-weight:700; | 496 | // font-weight:700; |
| 497 | color:#333; | 497 | color:#333; |
| 498 | } | 498 | } |
| 499 | } | 499 | } | ... | ... |
-
Please register or sign in to post a comment