no message
Showing
65 changed files
with
795 additions
and
1585 deletions
| ... | @@ -493,6 +493,36 @@ function getMergePaymentInfo(mergeId) { | ... | @@ -493,6 +493,36 @@ function getMergePaymentInfo(mergeId) { |
| 493 | } | 493 | } |
| 494 | }) | 494 | }) |
| 495 | } | 495 | } |
| 496 | // 一键下发 | ||
| 497 | function submitCert(data) { | ||
| 498 | return request({ | ||
| 499 | url: `/exam/payment/submitCerts/nesting`, | ||
| 500 | method: 'put', | ||
| 501 | params: data | ||
| 502 | }) | ||
| 503 | } | ||
| 504 | function getCertsLList(query) { | ||
| 505 | return request({ | ||
| 506 | url: '/exam/payment/certsList', | ||
| 507 | method: 'get', | ||
| 508 | params: query | ||
| 509 | }) | ||
| 510 | } | ||
| 511 | function getExamListByPayId(params) { | ||
| 512 | return request({ | ||
| 513 | url: `/exam/payment/examList/${params.payId}`, | ||
| 514 | method: 'get', | ||
| 515 | params: params | ||
| 516 | }) | ||
| 517 | } | ||
| 518 | function certStudentList(query) { | ||
| 519 | return request({ | ||
| 520 | url: '/exam/person/cert/studentList', | ||
| 521 | method: 'get', | ||
| 522 | params: query | ||
| 523 | }) | ||
| 524 | } | ||
| 525 | |||
| 496 | 526 | ||
| 497 | export { | 527 | export { |
| 498 | getMessage, | 528 | getMessage, |
| ... | @@ -539,5 +569,7 @@ export { | ... | @@ -539,5 +569,7 @@ export { |
| 539 | groupCommitPaymentVoucher,getFeeBillById, | 569 | groupCommitPaymentVoucher,getFeeBillById, |
| 540 | personalCommit, | 570 | personalCommit, |
| 541 | delPayment,editYear,addPersonPaymentGroup, | 571 | delPayment,editYear,addPersonPaymentGroup, |
| 542 | commitRenew,getVerityMergeList,doMergeFlows,getMergePaymentInfo | 572 | commitRenew,getVerityMergeList,doMergeFlows,getMergePaymentInfo, |
| 573 | submitCert,getCertsLList,getExamListByPayId, | ||
| 574 | certStudentList | ||
| 543 | } | 575 | } |
| ... | \ No newline at end of file | ... | \ No newline at end of file | ... | ... |
| ... | @@ -148,6 +148,15 @@ color: #7D8592;} | ... | @@ -148,6 +148,15 @@ color: #7D8592;} |
| 148 | } | 148 | } |
| 149 | .mt30{margin-top: 30rpx;} | 149 | .mt30{margin-top: 30rpx;} |
| 150 | .userlist { | 150 | .userlist { |
| 151 | .func{display: flex;justify-content: flex-end; | ||
| 152 | border-top: 1px dashed #e5e5e5;padding-top: 20rpx; | ||
| 153 | button{border: 1px solid #AD181F; | ||
| 154 | border-radius: 30rpx;height: 60rpx;line-height: 60rpx; | ||
| 155 | font-size: 30rpx;color: #AD181F;background: #fff; | ||
| 156 | margin: 0 0 0 30rpx;padding: 0 60rpx; | ||
| 157 | } | ||
| 158 | text{font-size: 30rpx;padding:30rpx 0 0;} | ||
| 159 | } | ||
| 151 | .colorful { | 160 | .colorful { |
| 152 | width: 100rpx; | 161 | width: 100rpx; |
| 153 | margin-right: 14rpx; | 162 | margin-right: 14rpx; | ... | ... |
| 1 | <template> | ||
| 2 | <view class="content"> | ||
| 3 | <swiper class="swiper" | ||
| 4 | :autoplay="autoplay" | ||
| 5 | :duration="duration"> | ||
| 6 | <swiper-item> | ||
| 7 | <view class="swiper-item"> | ||
| 8 | <view class="swiper-item-img"><image src="../../static/guide/title_01.png" mode="aspectFit"></image></view> | ||
| 9 | <view class="swiper-item-img"><image src="../../static/guide/icon_01.png" mode="aspectFit"></image></view> | ||
| 10 | </view> | ||
| 11 | <view class="jump-over" @tap="launchFlag()">{{jumpover}}</view> | ||
| 12 | </swiper-item> | ||
| 13 | <swiper-item> | ||
| 14 | <view class="swiper-item"> | ||
| 15 | <view class="swiper-item-img"><image src="../../static/guide/title_02.png" mode="aspectFit"></image></view> | ||
| 16 | <view class="swiper-item-img"><image src="../../static/guide/icon_02.png" mode="aspectFit"></image></view> | ||
| 17 | </view> | ||
| 18 | <view class="jump-over" @tap="launchFlag()">{{jumpover}}</view> | ||
| 19 | </swiper-item> | ||
| 20 | <swiper-item> | ||
| 21 | <view class="swiper-item"> | ||
| 22 | <view class="swiper-item-img"><image src="../../static/guide/title_03.png" mode="aspectFit"></image></view> | ||
| 23 | <view class="swiper-item-img"><image src="../../static/guide/icon_03.png" mode="aspectFit"></image></view> | ||
| 24 | </view> | ||
| 25 | <view class="jump-over" @tap="launchFlag()">{{jumpover}}</view> | ||
| 26 | </swiper-item> | ||
| 27 | <swiper-item> | ||
| 28 | <view class="swiper-item"> | ||
| 29 | <view class="swiper-item-img"><image src="../../static/guide/title_04.png" mode="aspectFit"></image></view> | ||
| 30 | <view class="swiper-item-img"><image src="../../static/guide/icon_04.png" mode="aspectFit"></image></view> | ||
| 31 | </view> | ||
| 32 | <view class="experience" @tap="launchFlag()">{{experience}}</view> | ||
| 33 | </swiper-item> | ||
| 34 | </swiper> | ||
| 35 | <view class="uniapp-img"><image src="../../static/guide/uniapp4@2x.png" mode="aspectFit"></image></view> | ||
| 36 | </view> | ||
| 37 | </template> | ||
| 38 | |||
| 39 | <script> | ||
| 40 | export default { | ||
| 41 | data() { | ||
| 42 | return { | ||
| 43 | background: ['color1', 'color2', 'color3'], | ||
| 44 | autoplay: false, | ||
| 45 | duration: 500, | ||
| 46 | jumpover: '跳过', | ||
| 47 | experience: '立即体验' | ||
| 48 | } | ||
| 49 | }, | ||
| 50 | methods: { | ||
| 51 | launchFlag: function(){ | ||
| 52 | /** | ||
| 53 | * 向本地存储中设置launchFlag的值,即启动标识; | ||
| 54 | */ | ||
| 55 | uni.setStorage({ | ||
| 56 | key: 'launchFlag', | ||
| 57 | data: true, | ||
| 58 | }); | ||
| 59 | uni.switchTab({ | ||
| 60 | url: '/pages/tabBar/component/component' | ||
| 61 | }); | ||
| 62 | |||
| 63 | } | ||
| 64 | } | ||
| 65 | } | ||
| 66 | </script> | ||
| 67 | <style> | ||
| 68 | page, | ||
| 69 | .content{ | ||
| 70 | width: 100%; | ||
| 71 | height: 100%; | ||
| 72 | background-size: 100% auto ; | ||
| 73 | padding: 0; | ||
| 74 | } | ||
| 75 | .swiper{ | ||
| 76 | width: 100%; | ||
| 77 | height: 80%; | ||
| 78 | background: #FFFFFF; | ||
| 79 | } | ||
| 80 | .swiper-item { | ||
| 81 | width: 100%; | ||
| 82 | height: 100%; | ||
| 83 | text-align: center; | ||
| 84 | position: relative; | ||
| 85 | display: flex; | ||
| 86 | /* justify-content: center; */ | ||
| 87 | align-items:flex-end; | ||
| 88 | flex-direction:column-reverse | ||
| 89 | } | ||
| 90 | .swiper-item-img{ | ||
| 91 | width: 100%; | ||
| 92 | height: auto; | ||
| 93 | margin: 0 auto; | ||
| 94 | } | ||
| 95 | .swiper-item-img image{ | ||
| 96 | width: 80%; | ||
| 97 | } | ||
| 98 | .uniapp-img{ | ||
| 99 | height: 20%; | ||
| 100 | background: #FFFFFF; | ||
| 101 | display: flex; | ||
| 102 | justify-content: center; | ||
| 103 | align-items:center; | ||
| 104 | overflow: hidden; | ||
| 105 | } | ||
| 106 | .uniapp-img image{ | ||
| 107 | width: 40%; | ||
| 108 | } | ||
| 109 | |||
| 110 | .jump-over,.experience{ | ||
| 111 | position: absolute; | ||
| 112 | height: 60upx; | ||
| 113 | line-height: 60upx; | ||
| 114 | padding: 0 40upx; | ||
| 115 | border-radius: 30upx; | ||
| 116 | font-size: 32upx; | ||
| 117 | color: #454343; | ||
| 118 | border: 1px solid #454343; | ||
| 119 | z-index: 999; | ||
| 120 | } | ||
| 121 | .jump-over{ | ||
| 122 | right: 45upx; | ||
| 123 | top: 125upx; | ||
| 124 | } | ||
| 125 | .experience{ | ||
| 126 | right: 50%; | ||
| 127 | margin-right: -105upx; | ||
| 128 | bottom: 0; | ||
| 129 | } | ||
| 130 | </style> |
| 1 | # 引导页 | ||
| 2 | |||
| 3 | ### 基于uni-app框架的swiper组件打开的时候启动。 | ||
| 4 | |||
| 5 | > 首次启动展示引导页,之后启动不再展示。那么就意味着,我们需要一个标识来确定,App是否已经启动过。 | ||
| 6 | |||
| 7 | > 我们可以在本地存储一个key来做为已经启动过App的标识。那么,我们在入口这里,就可以读取这个key,来决定是否展示引导页。 | ||
| 8 | |||
| 9 | > 因工作繁忙目前该程序金对安卓做了适配,IOS可根据环境自己适配。谢谢 | ||
| 10 | |||
| 11 | ## 目录结构 | ||
| 12 | * /pages/index/index.vue //入口页 | ||
| 13 | ### 存储key | ||
| 14 | * 向本地存储中设置launchFlag的值,即启动标识; | ||
| 15 | ### 获取key | ||
| 16 | * 向本地存储中设置launchFlag的值,即启动标识; | ||
| 17 | * 获取本地存储中launchFlag的值 | ||
| 18 | * 若存在,说明不是首次启动,直接进入首页; | ||
| 19 | * 若不存在,说明是首次启动,进入引导页; | ||
| 20 | |||
| 21 | ```html | ||
| 22 | <view class="main"> | ||
| 23 | <code-elf-guide v-if="guidePages"></code-elf-guide> | ||
| 24 | </view> | ||
| 25 | |||
| 26 | ``` | ||
| 27 | |||
| 28 | ```javascript | ||
| 29 | import codeElfGuide from '@/components/code-elf-guide/code-elf-guide.vue' | ||
| 30 | export default { | ||
| 31 | components: { | ||
| 32 | codeElfGuide | ||
| 33 | }, | ||
| 34 | data() { | ||
| 35 | return { | ||
| 36 | guidePages:true | ||
| 37 | } | ||
| 38 | }, | ||
| 39 | onLoad(){ | ||
| 40 | this.loadExecution() | ||
| 41 | }, | ||
| 42 | methods: { | ||
| 43 | loadExecution: function(){ | ||
| 44 | /** | ||
| 45 | * 获取本地存储中launchFlag的值 | ||
| 46 | * 若存在,说明不是首次启动,直接进入首页; | ||
| 47 | * 若不存在,说明是首次启动,进入引导页; | ||
| 48 | */ | ||
| 49 | try { | ||
| 50 | // 获取本地存储中launchFlag标识 | ||
| 51 | const value = uni.getStorageSync('launchFlag'); | ||
| 52 | if (value) { | ||
| 53 | // launchFlag=true直接跳转到首页 | ||
| 54 | uni.switchTab({ | ||
| 55 | url: '/pages/tabBar/component/component' | ||
| 56 | }); | ||
| 57 | } else { | ||
| 58 | // launchFlag!=true显示引导页 | ||
| 59 | this.guidePages = true | ||
| 60 | } | ||
| 61 | } catch(e) { | ||
| 62 | // error | ||
| 63 | uni.setStorage({ | ||
| 64 | key: 'launchFlag', | ||
| 65 | data: true, | ||
| 66 | success: function () { | ||
| 67 | console.log('error时存储launchFlag'); | ||
| 68 | } | ||
| 69 | }); | ||
| 70 | this.guidePages = true | ||
| 71 | } | ||
| 72 | } | ||
| 73 | } | ||
| 74 | } | ||
| 75 | ``` | ||
| 76 | ```css | ||
| 77 | page,.main{ | ||
| 78 | width: 100%; | ||
| 79 | height: 100%; | ||
| 80 | } | ||
| 81 | |||
| 82 | ``` | ||
| 83 | |||
| 84 | ### 首页清除key,进行测试 | ||
| 85 | * 清除本地存储中设置launchFlag的值,即启动标识; | ||
| 86 | * 两秒后重启APP,进行测试 | ||
| 87 | ```javascript | ||
| 88 | uni.showModal({ | ||
| 89 | title: '清除launchFlag值', | ||
| 90 | content: '确定要清除launchFlag值,进行重启测试?', | ||
| 91 | success: function (res) { | ||
| 92 | if (res.confirm) { | ||
| 93 | console.log('用户点击确定'); | ||
| 94 | // 清除缓存 | ||
| 95 | uni.clearStorage(); | ||
| 96 | uni.showToast({ | ||
| 97 | icon: 'none', | ||
| 98 | duration:3000, | ||
| 99 | title: '清除成功2秒后重启' | ||
| 100 | }); | ||
| 101 | // 两秒后重启 | ||
| 102 | setTimeout(function() { | ||
| 103 | uni.hideToast(); | ||
| 104 | plus.runtime.restart(); | ||
| 105 | }, 2000); | ||
| 106 | } else if (res.cancel) { | ||
| 107 | console.log('用户点击取消'); | ||
| 108 | } | ||
| 109 | } | ||
| 110 | }); | ||
| 111 | ``` | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| 1 | # 日历组件 lx-calendar可选择周与月支持左右滑动切换 | ||
| 2 | |||
| 3 | |||
| 4 | ``` | ||
| 5 | <template> | ||
| 6 | <view class="content"> | ||
| 7 | |||
| 8 | <lxCalendar @change="change"></lxCalendar> | ||
| 9 | </view> | ||
| 10 | </template> | ||
| 11 | |||
| 12 | <script> | ||
| 13 | import lxCalendar from '../../components/lx-calendar/lx-calendar.vue' | ||
| 14 | export default { | ||
| 15 | components:{ | ||
| 16 | lxCalendar, | ||
| 17 | }, | ||
| 18 | data() { | ||
| 19 | return { | ||
| 20 | title: 'Hello' | ||
| 21 | } | ||
| 22 | }, | ||
| 23 | |||
| 24 | onLoad() { | ||
| 25 | |||
| 26 | }, | ||
| 27 | methods: { | ||
| 28 | change(e){ | ||
| 29 | console.log(e); | ||
| 30 | } | ||
| 31 | |||
| 32 | } | ||
| 33 | } | ||
| 34 | </script> | ||
| 35 | ``` | ||
| 36 | |||
| 37 | |||
| 38 | 事件 | 说明 | ||
| 39 | ---|--- | ||
| 40 | change | 日期改变时执行 | ||
| 41 | |||
| 42 | 参数 | 类型 | 说明 | ||
| 43 | ---|---|--- | ||
| 44 | value | 字符串 | 选中的日期 | ||
| 45 | dot_lists | 数组 | 显示点的日期 | ||
| 46 | |||
| 47 | |||
| 48 | |||
| 49 | |||
| 50 |
This diff is collapsed.
Click to expand it.
| 1 | # slider-range | ||
| 2 | uni-app 滑块区间选择组件 | ||
| 3 | |||
| 4 | 可根据具体需求,修改、自定义其他内容。 | ||
| 5 | |||
| 6 | ## 属性说明 | ||
| 7 | |||
| 8 | |属性名|类型|默认值|说明| | ||
| 9 | | -- | -- | --|--| | ||
| 10 | | value | Array<Number, Number> | [0,100] |滑块已选中区间的值| | ||
| 11 | | min | Number| 0 | 滑块区间最小值 | | ||
| 12 | | max | Number | 100 | 滑块区间最大值 | | ||
| 13 | | step | Number | 1 | 拖动时的步长 | | ||
| 14 | | disabled | Boolean | false | 是否为禁用状态 | | ||
| 15 | | height | Number | 50 | 滑块容器高度 | | ||
| 16 | | barHeight | Number | 5 | 滑块进度条高度 | | ||
| 17 | | backgroundColor | String | #e9e9e9| 滑块进度条背景色| | ||
| 18 | | activeColor | String | #1aad19 | 已选中区间进度条颜色| | ||
| 19 | | blockSize | Number | 20 | 滑块大小 | | ||
| 20 | | blockColor | String | #fff | 滑块颜色 | | ||
| 21 | | decorationVisible | Boolean | false | 是否显示滑块内装饰元素| | ||
| 22 | | tipVisible | Boolean | true | 是否显示滑块值提示文本 | | ||
| 23 | | fomat| Function | | 滑块值提示文本格式化函数,**注意**:小程序中此属性必传,否则会报错,如果无需格式化,可以简单返回原始值: `format(val) { return val }`;H5中可以不传。| | ||
| 24 | |||
| 25 | |||
| 26 | ## 使用示例 | ||
| 27 | |||
| 28 | ```html | ||
| 29 | |||
| 30 | <slider-range | ||
| 31 | :value="rangeValue" | ||
| 32 | :min="rangeMin" | ||
| 33 | :max="rangMax" | ||
| 34 | :step="5" | ||
| 35 | :bar-height="3" | ||
| 36 | :block-size="26" | ||
| 37 | background-color="#EEEEF6" | ||
| 38 | active-color="#FF6B00" | ||
| 39 | :format="format" | ||
| 40 | :decorationVisible="true" | ||
| 41 | @change="handleRangeChange" | ||
| 42 | ></slider-range> | ||
| 43 | |||
| 44 | |||
| 45 | ``` | ||
| 46 | |||
| 47 | ```javascript | ||
| 48 | |||
| 49 | import SliderRange from '../components/slider-range/index.vue' | ||
| 50 | export default { | ||
| 51 | components: { | ||
| 52 | SliderRange | ||
| 53 | }, | ||
| 54 | data() { | ||
| 55 | return { | ||
| 56 | rangeMin: 5, | ||
| 57 | rangMax: 200, | ||
| 58 | rangeValue: [10, 50] | ||
| 59 | } | ||
| 60 | }, | ||
| 61 | methods: { | ||
| 62 | format(val) { | ||
| 63 | return val + '%' | ||
| 64 | }, | ||
| 65 | handleRangeChange(e) { | ||
| 66 | this.rangeValue = e | ||
| 67 | } | ||
| 68 | } | ||
| 69 | } | ||
| 70 | ``` | ||
| 71 | |||
| 72 | 效果图 | ||
| 73 | |||
| 74 |  |
| 1 | <template> | ||
| 2 | <view | ||
| 3 | class="slider-range" | ||
| 4 | :class="{ disabled: disabled }" | ||
| 5 | :style="{ paddingLeft: blockSize / 2 + 'px', paddingRight: blockSize / 2 + 'px' }" | ||
| 6 | > | ||
| 7 | <view class="slider-range-inner" :style="{ height: height + 'px' }"> | ||
| 8 | <view | ||
| 9 | class="slider-bar" | ||
| 10 | :style="{ | ||
| 11 | height: barHeight + 'px', | ||
| 12 | }" | ||
| 13 | > | ||
| 14 | <!-- 背景条 --> | ||
| 15 | <view | ||
| 16 | class="slider-bar-bg" | ||
| 17 | :style="{ | ||
| 18 | backgroundColor: backgroundColor, | ||
| 19 | }" | ||
| 20 | ></view> | ||
| 21 | |||
| 22 | <!-- 滑块实际区间 --> | ||
| 23 | <view | ||
| 24 | class="slider-bar-inner" | ||
| 25 | :style="{ | ||
| 26 | width: ((values[1] - values[0]) / (max - min)) * 100 + '%', | ||
| 27 | left: lowerHandlePosition + '%', | ||
| 28 | backgroundColor: activeColor, | ||
| 29 | }" | ||
| 30 | ></view> | ||
| 31 | </view> | ||
| 32 | |||
| 33 | <!-- 滑动块-左 --> | ||
| 34 | <view | ||
| 35 | class="slider-handle-block" | ||
| 36 | :class="{ decoration: decorationVisible }" | ||
| 37 | :style="{ | ||
| 38 | backgroundColor: blockColor, | ||
| 39 | width: blockSize + 'px', | ||
| 40 | height: blockSize + 'px', | ||
| 41 | left: lowerHandlePosition + '%', | ||
| 42 | }" | ||
| 43 | @touchstart="_onTouchStart" | ||
| 44 | @touchmove="_onBlockTouchMove" | ||
| 45 | @touchend="_onBlockTouchEnd" | ||
| 46 | data-tag="lowerBlock" | ||
| 47 | ></view> | ||
| 48 | |||
| 49 | <!-- 滑动块-右 --> | ||
| 50 | <view | ||
| 51 | class="slider-handle-block" | ||
| 52 | :class="{ decoration: decorationVisible }" | ||
| 53 | :style="{ | ||
| 54 | backgroundColor: blockColor, | ||
| 55 | width: blockSize + 'px', | ||
| 56 | height: blockSize + 'px', | ||
| 57 | left: higherHandlePosition + '%', | ||
| 58 | }" | ||
| 59 | @touchstart="_onTouchStart" | ||
| 60 | @touchmove="_onBlockTouchMove" | ||
| 61 | @touchend="_onBlockTouchEnd" | ||
| 62 | data-tag="higherBlock" | ||
| 63 | ></view> | ||
| 64 | |||
| 65 | <!-- 滑块值提示 --> | ||
| 66 | <view v-if="tipVisible" class="range-tip" :style="lowerTipStyle">{{ format(values[0]) }}</view> | ||
| 67 | <view v-if="tipVisible" class="range-tip" :style="higherTipStyle">{{ format(values[1]) }}</view> | ||
| 68 | </view> | ||
| 69 | </view> | ||
| 70 | </template> | ||
| 71 | <script> | ||
| 72 | export default { | ||
| 73 | components: {}, | ||
| 74 | props: { | ||
| 75 | //滑块区间当前取值 | ||
| 76 | value: { | ||
| 77 | type: Array, | ||
| 78 | default: function() { | ||
| 79 | return [0, 100] | ||
| 80 | }, | ||
| 81 | }, | ||
| 82 | //最小值 | ||
| 83 | min: { | ||
| 84 | type: Number, | ||
| 85 | default: 0, | ||
| 86 | }, | ||
| 87 | //最大值 | ||
| 88 | max: { | ||
| 89 | type: Number, | ||
| 90 | default: 100, | ||
| 91 | }, | ||
| 92 | step: { | ||
| 93 | type: Number, | ||
| 94 | default: 1, | ||
| 95 | }, | ||
| 96 | format: { | ||
| 97 | type: Function, | ||
| 98 | default: function(val) { | ||
| 99 | return val | ||
| 100 | }, | ||
| 101 | }, | ||
| 102 | disabled: { | ||
| 103 | type: Boolean, | ||
| 104 | default: false, | ||
| 105 | }, | ||
| 106 | //滑块容器高度 | ||
| 107 | height: { | ||
| 108 | height: Number, | ||
| 109 | default: 50, | ||
| 110 | }, | ||
| 111 | //区间进度条高度 | ||
| 112 | barHeight: { | ||
| 113 | type: Number, | ||
| 114 | default: 5, | ||
| 115 | }, | ||
| 116 | //背景条颜色 | ||
| 117 | backgroundColor: { | ||
| 118 | type: String, | ||
| 119 | default: '#e9e9e9', | ||
| 120 | }, | ||
| 121 | //已选择的颜色 | ||
| 122 | activeColor: { | ||
| 123 | type: String, | ||
| 124 | default: '#1aad19', | ||
| 125 | }, | ||
| 126 | //滑块大小 | ||
| 127 | blockSize: { | ||
| 128 | type: Number, | ||
| 129 | default: 20, | ||
| 130 | }, | ||
| 131 | blockColor: { | ||
| 132 | type: String, | ||
| 133 | default: '#fff', | ||
| 134 | }, | ||
| 135 | tipVisible: { | ||
| 136 | type: Boolean, | ||
| 137 | default: true, | ||
| 138 | }, | ||
| 139 | decorationVisible: { | ||
| 140 | type: Boolean, | ||
| 141 | default: false, | ||
| 142 | }, | ||
| 143 | }, | ||
| 144 | data() { | ||
| 145 | return { | ||
| 146 | values: [this.min, this.max], | ||
| 147 | startDragPos: 0, // 开始拖动时的坐标位置 | ||
| 148 | startVal: 0, //开始拖动时较小点的值 | ||
| 149 | } | ||
| 150 | }, | ||
| 151 | computed: { | ||
| 152 | // 较小点滑块的坐标 | ||
| 153 | lowerHandlePosition() { | ||
| 154 | return ((this.values[0] - this.min) / (this.max - this.min)) * 100 | ||
| 155 | }, | ||
| 156 | // 较大点滑块的坐标 | ||
| 157 | higherHandlePosition() { | ||
| 158 | return ((this.values[1] - this.min) / (this.max - this.min)) * 100 | ||
| 159 | }, | ||
| 160 | lowerTipStyle() { | ||
| 161 | if (this.lowerHandlePosition < 90) { | ||
| 162 | return `left: ${this.lowerHandlePosition}%;` | ||
| 163 | } | ||
| 164 | return `right: ${100 - this.lowerHandlePosition}%;transform: translate(50%, -100%);` | ||
| 165 | }, | ||
| 166 | higherTipStyle() { | ||
| 167 | if (this.higherHandlePosition < 90) { | ||
| 168 | return `left: ${this.higherHandlePosition}%;` | ||
| 169 | } | ||
| 170 | return `right: ${100 - this.higherHandlePosition}%;transform: translate(50%, -100%);` | ||
| 171 | }, | ||
| 172 | }, | ||
| 173 | created: function() {}, | ||
| 174 | onLoad: function(option) {}, | ||
| 175 | watch: { | ||
| 176 | //滑块当前值 | ||
| 177 | value: { | ||
| 178 | immediate: true, | ||
| 179 | handler(newVal, oldVal) { | ||
| 180 | if (this._isValuesValid(newVal) && (newVal[0] !== this.values[0] || newVal[1] !== this.values[1])) { | ||
| 181 | this._updateValue(newVal) | ||
| 182 | } | ||
| 183 | }, | ||
| 184 | }, | ||
| 185 | }, | ||
| 186 | methods: { | ||
| 187 | _updateValue(newVal) { | ||
| 188 | // 步长大于区间差,或者区间最大值和最小值相等情况 | ||
| 189 | if (this.step >= this.max - this.min) { | ||
| 190 | throw new RangeError('Invalid slider step or slider range') | ||
| 191 | } | ||
| 192 | |||
| 193 | let newValues = [] | ||
| 194 | if (Array.isArray(newVal)) { | ||
| 195 | newValues = [newVal[0], newVal[1]] | ||
| 196 | } | ||
| 197 | if (typeof newValues[0] !== 'number') { | ||
| 198 | newValues[0] = this.values[0] | ||
| 199 | } else { | ||
| 200 | newValues[0] = Math.round((newValues[0] - this.min) / this.step) * this.step + this.min | ||
| 201 | } | ||
| 202 | if (typeof newValues[1] !== 'number') { | ||
| 203 | newValues[1] = this.values[1] | ||
| 204 | } else { | ||
| 205 | newValues[1] = Math.round((newValues[1] - this.min) / this.step) * this.step + this.min | ||
| 206 | } | ||
| 207 | |||
| 208 | // 新值与原值相等,不做处理 | ||
| 209 | if (this.values[0] === newValues[0] && this.values[1] === newValues[1]) { | ||
| 210 | return | ||
| 211 | } | ||
| 212 | // 左侧滑块值小于最小值时,设置为最小值 | ||
| 213 | if (newValues[0] < this.min) { | ||
| 214 | newValues[0] = this.min | ||
| 215 | } | ||
| 216 | // 右侧滑块值大于最大值时,设置为最大值 | ||
| 217 | if (newValues[1] > this.max) { | ||
| 218 | newValues[1] = this.max | ||
| 219 | } | ||
| 220 | // 两个滑块重叠或左右交错,使两个滑块保持最小步长的间距 | ||
| 221 | if (newValues[0] >= newValues[1]) { | ||
| 222 | // 左侧未动,右侧滑块滑到左侧滑块之左 | ||
| 223 | if (newValues[0] === this.values[0]) { | ||
| 224 | newValues[1] = newValues[0] + this.step | ||
| 225 | } else { | ||
| 226 | // 右侧未动, 左侧滑块滑到右侧之右 | ||
| 227 | newValues[0] = newValues[1] - this.step | ||
| 228 | } | ||
| 229 | } | ||
| 230 | |||
| 231 | this.values = newValues | ||
| 232 | this.$emit('change', this.values) | ||
| 233 | }, | ||
| 234 | _onTouchStart: function(event) { | ||
| 235 | if (this.disabled) { | ||
| 236 | return | ||
| 237 | } | ||
| 238 | |||
| 239 | this.isDragging = true | ||
| 240 | let tag = event.target.dataset.tag | ||
| 241 | |||
| 242 | //兼容h5平台及某版本微信 | ||
| 243 | let e = event.changedTouches ? event.changedTouches[0] : event | ||
| 244 | this.startDragPos = e.pageX | ||
| 245 | |||
| 246 | this.startVal = tag === 'lowerBlock' ? this.values[0] : this.values[1] | ||
| 247 | }, | ||
| 248 | _onBlockTouchMove: function(e) { | ||
| 249 | if (this.disabled) { | ||
| 250 | return | ||
| 251 | } | ||
| 252 | this._onDrag(e) | ||
| 253 | }, | ||
| 254 | _onBlockTouchEnd: function(e) { | ||
| 255 | if (this.disabled) { | ||
| 256 | return | ||
| 257 | } | ||
| 258 | this.isDragging = false | ||
| 259 | this._onDrag(e) | ||
| 260 | }, | ||
| 261 | _onDrag(event) { | ||
| 262 | if (!this.isDragging) { | ||
| 263 | return | ||
| 264 | } | ||
| 265 | let view = uni | ||
| 266 | .createSelectorQuery() | ||
| 267 | .in(this) | ||
| 268 | .select('.slider-range-inner') | ||
| 269 | |||
| 270 | view | ||
| 271 | .boundingClientRect(data => { | ||
| 272 | let sliderWidth = data.width | ||
| 273 | const tag = event.target.dataset.tag | ||
| 274 | let e = event.changedTouches ? event.changedTouches[0] : event | ||
| 275 | let diff = ((e.pageX - this.startDragPos) / sliderWidth) * (this.max - this.min) | ||
| 276 | let nextVal = this.startVal + diff | ||
| 277 | |||
| 278 | if (tag === 'lowerBlock') { | ||
| 279 | this._updateValue([nextVal, null]) | ||
| 280 | } else { | ||
| 281 | this._updateValue([null, nextVal]) | ||
| 282 | } | ||
| 283 | }) | ||
| 284 | .exec() | ||
| 285 | }, | ||
| 286 | _isValuesValid: function(values) { | ||
| 287 | return Array.isArray(values) && values.length == 2 | ||
| 288 | }, | ||
| 289 | }, | ||
| 290 | } | ||
| 291 | </script> | ||
| 292 | |||
| 293 | <style scoped> | ||
| 294 | .slider-range { | ||
| 295 | position: relative; | ||
| 296 | padding-top: 40rpx; | ||
| 297 | } | ||
| 298 | |||
| 299 | .slider-range-inner { | ||
| 300 | position: relative; | ||
| 301 | width: 100%; | ||
| 302 | } | ||
| 303 | |||
| 304 | .slider-range.disabled .slider-bar-inner { | ||
| 305 | opacity: 0.35; | ||
| 306 | } | ||
| 307 | |||
| 308 | .slider-range.disabled .slider-handle-block { | ||
| 309 | cursor: not-allowed; | ||
| 310 | } | ||
| 311 | |||
| 312 | .slider-bar { | ||
| 313 | position: absolute; | ||
| 314 | top: 50%; | ||
| 315 | left: 0; | ||
| 316 | right: 0; | ||
| 317 | transform: translateY(-50%); | ||
| 318 | } | ||
| 319 | |||
| 320 | .slider-bar-bg { | ||
| 321 | position: absolute; | ||
| 322 | width: 100%; | ||
| 323 | height: 100%; | ||
| 324 | border-radius: 10000px; | ||
| 325 | z-index: 10; | ||
| 326 | } | ||
| 327 | |||
| 328 | .slider-bar-inner { | ||
| 329 | position: absolute; | ||
| 330 | width: 100%; | ||
| 331 | height: 100%; | ||
| 332 | border-radius: 10000px; | ||
| 333 | z-index: 11; | ||
| 334 | } | ||
| 335 | |||
| 336 | .slider-handle-block { | ||
| 337 | position: absolute; | ||
| 338 | top: 50%; | ||
| 339 | transform: translate(-50%, -50%); | ||
| 340 | border-radius: 50%; | ||
| 341 | box-shadow: 0 0 3px 2px rgba(227, 229, 241, 0.5); | ||
| 342 | z-index: 12; | ||
| 343 | } | ||
| 344 | |||
| 345 | .slider-handle-block.decoration::before { | ||
| 346 | position: absolute; | ||
| 347 | content: ''; | ||
| 348 | width: 6upx; | ||
| 349 | height: 24upx; | ||
| 350 | top: 50%; | ||
| 351 | left: 29%; | ||
| 352 | transform: translateY(-50%); | ||
| 353 | background: #eeedf2; | ||
| 354 | border-radius: 3upx; | ||
| 355 | z-index: 13; | ||
| 356 | } | ||
| 357 | |||
| 358 | .slider-handle-block.decoration::after { | ||
| 359 | position: absolute; | ||
| 360 | content: ''; | ||
| 361 | width: 6upx; | ||
| 362 | height: 24upx; | ||
| 363 | top: 50%; | ||
| 364 | right: 29%; | ||
| 365 | transform: translateY(-50%); | ||
| 366 | background: #eeedf2; | ||
| 367 | border-radius: 3upx; | ||
| 368 | z-index: 13; | ||
| 369 | } | ||
| 370 | |||
| 371 | .range-tip { | ||
| 372 | position: absolute; | ||
| 373 | top: 0; | ||
| 374 | font-size: 24upx; | ||
| 375 | color: #666; | ||
| 376 | transform: translate(-50%, -100%); | ||
| 377 | } | ||
| 378 | </style> |
| 1 | <template> | ||
| 2 | <view class="demo-slider-range"> | ||
| 3 | <view class="section-title">普通用法</view> | ||
| 4 | <view class="slider-item"> | ||
| 5 | <slider-range | ||
| 6 | :value="slider1.rangeValue" | ||
| 7 | :min="slider1.min" | ||
| 8 | :max="slider1.max" | ||
| 9 | :step="slider1.step" | ||
| 10 | :bar-height="barHeight" | ||
| 11 | :block-size="blockSize" | ||
| 12 | :background-color="backgroundColor" | ||
| 13 | :format="format1" | ||
| 14 | @change="handleRangeChange" | ||
| 15 | ></slider-range> | ||
| 16 | </view> | ||
| 17 | <view class="section-title">自定义</view> | ||
| 18 | <view class="slider-item"> | ||
| 19 | <slider-range | ||
| 20 | :value="slider2.rangeValue" | ||
| 21 | :min="slider2.min" | ||
| 22 | :max="slider2.max" | ||
| 23 | :step="slider2.step" | ||
| 24 | :bar-height="barHeight" | ||
| 25 | :block-size="blockSize" | ||
| 26 | :background-color="backgroundColor" | ||
| 27 | :active-color="slider2.activeColor" | ||
| 28 | :format="format2" | ||
| 29 | :decorationVisible="slider2.decorationVisible" | ||
| 30 | @change="handleRangeChange" | ||
| 31 | ></slider-range> | ||
| 32 | </view> | ||
| 33 | </view> | ||
| 34 | </template> | ||
| 35 | |||
| 36 | <script> | ||
| 37 | import SliderRange from '../../components/slider-range/index.vue' | ||
| 38 | export default { | ||
| 39 | components: { | ||
| 40 | SliderRange, | ||
| 41 | }, | ||
| 42 | data() { | ||
| 43 | return { | ||
| 44 | barHeight: 3, | ||
| 45 | blockSize: 26, | ||
| 46 | backgroundColor: '#EEEEF6', | ||
| 47 | slider1: { | ||
| 48 | min: 50, | ||
| 49 | max: 200, | ||
| 50 | step: 10, | ||
| 51 | rangeValue: [50, 150], | ||
| 52 | }, | ||
| 53 | slider2: { | ||
| 54 | rangeMin: 0, | ||
| 55 | rangMax: 100, | ||
| 56 | rangeValue: [8, 80], | ||
| 57 | step: 1, | ||
| 58 | activeColor: '#FF6B00', | ||
| 59 | decorationVisible: true, | ||
| 60 | }, | ||
| 61 | } | ||
| 62 | }, | ||
| 63 | methods: { | ||
| 64 | format1(val) { | ||
| 65 | return val | ||
| 66 | }, | ||
| 67 | format2(val) { | ||
| 68 | return `${val}%` | ||
| 69 | }, | ||
| 70 | handleRangeChange(e) { | ||
| 71 | this.rangeValue = e | ||
| 72 | }, | ||
| 73 | }, | ||
| 74 | } | ||
| 75 | </script> | ||
| 76 | <style> | ||
| 77 | .demo-slider-range { | ||
| 78 | background-color: #fff; | ||
| 79 | padding: 100rpx 40rpx 0; | ||
| 80 | } | ||
| 81 | |||
| 82 | .section-title { | ||
| 83 | padding: 0 0 20rpx; | ||
| 84 | color: #666; | ||
| 85 | } | ||
| 86 | |||
| 87 | .slider-item:not(:last-child) { | ||
| 88 | margin-bottom: 100rpx; | ||
| 89 | } | ||
| 90 | </style> |
| 1 | <template> | ||
| 2 | <view class="box"> | ||
| 3 | <view class="box1"> | ||
| 4 | <view class="title"> | ||
| 5 | <view class="title-left">{{ porps.title }}</view> | ||
| 6 | <view class="title-icon" @click="changFN"> | ||
| 7 | <uni-icons type="top" color="#95a1a6" v-if="show"></uni-icons> | ||
| 8 | <uni-icons type="bottom" color="#95a1a6" v-else></uni-icons> | ||
| 9 | </view> | ||
| 10 | </view> | ||
| 11 | <view class="conter-liner-cost"> | ||
| 12 | <view class="liner-left">{{ porps.text }} 合计:</view> | ||
| 13 | <view class="liner-right">{{ porps.cost }}元</view> | ||
| 14 | </view> | ||
| 15 | </view> | ||
| 16 | <view class="box2" v-show="show"><slot></slot></view> | ||
| 17 | </view> | ||
| 18 | </template> | ||
| 19 | |||
| 20 | <script setup> | ||
| 21 | import { ref } from 'vue'; | ||
| 22 | const porps = defineProps({ | ||
| 23 | title: String, | ||
| 24 | text: String, | ||
| 25 | cost: String | ||
| 26 | }); | ||
| 27 | const show = ref(false); | ||
| 28 | |||
| 29 | function changFN() { | ||
| 30 | show.value = !show.value; | ||
| 31 | } | ||
| 32 | </script> | ||
| 33 | |||
| 34 | <style lang="scss" scoped> | ||
| 35 | .box { | ||
| 36 | margin: 0; | ||
| 37 | padding: 0 25rpx; | ||
| 38 | .box1 { | ||
| 39 | margin-bottom: 23rpx; | ||
| 40 | margin-top: 35rpx; | ||
| 41 | .title { | ||
| 42 | display: flex; | ||
| 43 | justify-content: space-between; | ||
| 44 | margin-bottom: 10rpx; | ||
| 45 | |||
| 46 | .title-left { | ||
| 47 | font-size: 30rpx; | ||
| 48 | font-family: PingFang SC; | ||
| 49 | font-weight: 500; | ||
| 50 | color: #2b3133; | ||
| 51 | } | ||
| 52 | } | ||
| 53 | .conter-liner-cost { | ||
| 54 | display: flex; | ||
| 55 | .liner-left { | ||
| 56 | font-size: 28rpx; | ||
| 57 | font-family: PingFang SC; | ||
| 58 | font-weight: 400; | ||
| 59 | color: #7b7f83; | ||
| 60 | } | ||
| 61 | .liner-right { | ||
| 62 | font-size: 28rpx; | ||
| 63 | font-family: PingFang SC; | ||
| 64 | font-weight: 400; | ||
| 65 | color: #ff8124; | ||
| 66 | } | ||
| 67 | } | ||
| 68 | } | ||
| 69 | .box2 { | ||
| 70 | border-top: 1rpx solid #e6e6e6; | ||
| 71 | } | ||
| 72 | } | ||
| 73 | </style> |
This diff is collapsed.
Click to expand it.
| 1 | <template> | ||
| 2 | <view class=" conter-box"> | ||
| 3 | <view class="box" v-if="props.trainProjectsList.length != 0"> | ||
| 4 | <view class="text">培训科目</view> | ||
| 5 | <view class="box2"> | ||
| 6 | <checkbox-group> | ||
| 7 | <view class="box-check" v-for="item in props.trainProjectsList" :key="item.id"> | ||
| 8 | <view class=""> | ||
| 9 | <view class="title">{{ item.projectName }}</view> | ||
| 10 | <view class="content"> | ||
| 11 | {{ item.isNecessary == 1 ? '必选' : '非必选' }} 合计: | ||
| 12 | <view class="span">{{ item.cost }}元</view> | ||
| 13 | </view> | ||
| 14 | </view> | ||
| 15 | <view class="checkbox"> | ||
| 16 | <checkbox | ||
| 17 | :disabled="item.isNecessary == 1" | ||
| 18 | :value="item.id" | ||
| 19 | @click="checkTrain(item)" | ||
| 20 | :checked="item.check" | ||
| 21 | /> | ||
| 22 | </view> | ||
| 23 | </view> | ||
| 24 | </checkbox-group> | ||
| 25 | </view> | ||
| 26 | </view> | ||
| 27 | <view class="box" v-if="props.examProjectsList.length != 0"> | ||
| 28 | <view class="text">考试科目</view> | ||
| 29 | <view class="box2"> | ||
| 30 | <checkbox-group> | ||
| 31 | <view class="box-check" v-for="item in props.examProjectsList" :key="item.id"> | ||
| 32 | <view class=""> | ||
| 33 | <view class="title">{{ item.projectName }}</view> | ||
| 34 | <view class="content"> | ||
| 35 | {{ item.isNecessary == 1 ? '必选' : '非必选' }} 合计: | ||
| 36 | <view class="span">{{ item.cost }}元</view> | ||
| 37 | </view> | ||
| 38 | </view> | ||
| 39 | <view class="checkbox"> | ||
| 40 | <checkbox | ||
| 41 | :disabled="item.isNecessary == 1" | ||
| 42 | :value="item.id" | ||
| 43 | @click="checkTrain(item)" | ||
| 44 | :checked="item.check" | ||
| 45 | /> | ||
| 46 | </view> | ||
| 47 | </view> | ||
| 48 | </checkbox-group> | ||
| 49 | </view> | ||
| 50 | </view> | ||
| 51 | </view> | ||
| 52 | <view class="foot"> | ||
| 53 | <view class="button1" @click="upFN">上一步</view> | ||
| 54 | <view class="button" @click="nextFN">下一步</view> | ||
| 55 | </view> | ||
| 56 | <view class="nodata " v-if="props.examProjectsList.length == 0 && props.trainProjectsList.length == 0"> | ||
| 57 | 没有培训科目 | ||
| 58 | </view> | ||
| 59 | </template> | ||
| 60 | |||
| 61 | <script setup> | ||
| 62 | import { forEach } from 'lodash'; | ||
| 63 | import { ref, getCurrentInstance, reactive, toRefs } from 'vue'; | ||
| 64 | const props = defineProps({ | ||
| 65 | trainProjectsList: {}, | ||
| 66 | examProjectsList: {}, | ||
| 67 | hotelList: {}, | ||
| 68 | id: {} | ||
| 69 | }); | ||
| 70 | const data = reactive({ | ||
| 71 | projectIdsArray: [] | ||
| 72 | }); | ||
| 73 | |||
| 74 | const examIdsArry = ref([]); | ||
| 75 | const { projectIdsArray } = toRefs(data); | ||
| 76 | const emit = defineEmits(['nextFN']); | ||
| 77 | const checkbox1 = ref([0]); | ||
| 78 | |||
| 79 | function checkTrain(item) { | ||
| 80 | if (item.isNecessary == 1) { | ||
| 81 | item.check = true; | ||
| 82 | } else { | ||
| 83 | item.check = !item.check; | ||
| 84 | } | ||
| 85 | } | ||
| 86 | |||
| 87 | // 上一步 | ||
| 88 | function upFN() { | ||
| 89 | emit('nextFN', 0); | ||
| 90 | } | ||
| 91 | |||
| 92 | // 下一步 | ||
| 93 | function nextFN() { | ||
| 94 | let falg = true; | ||
| 95 | let arr1 = []; | ||
| 96 | let arr2 = []; | ||
| 97 | props.examProjectsList.forEach(item => { | ||
| 98 | if (item.check) { | ||
| 99 | arr1.push(item.id); | ||
| 100 | } | ||
| 101 | }); | ||
| 102 | props.trainProjectsList.forEach(item => { | ||
| 103 | if (item.check) { | ||
| 104 | arr2.push(item.id); | ||
| 105 | } | ||
| 106 | }); | ||
| 107 | let examList = JSON.parse(JSON.stringify(props.examProjectsList)); | ||
| 108 | let trainList = JSON.parse(JSON.stringify(props.trainProjectsList)); | ||
| 109 | examList.concat(trainList).forEach(item => { | ||
| 110 | if (item.isNecessary == 1 && item.check == false) { | ||
| 111 | falg = false; | ||
| 112 | } | ||
| 113 | }); | ||
| 114 | |||
| 115 | if (falg) { | ||
| 116 | examIdsArry.value = arr1; | ||
| 117 | projectIdsArray.value = arr2; | ||
| 118 | if (props.hotelList.length == 0) { | ||
| 119 | // 没有酒店直接报名 | ||
| 120 | // 页面跳转 | ||
| 121 | let path = `/pages/train/costBreakdown/costBreakdown?id=` + props.id; | ||
| 122 | wx.navigateTo({ | ||
| 123 | url: path | ||
| 124 | }); | ||
| 125 | } else { | ||
| 126 | emit('nextFN', 2, projectIdsArray.value, examIdsArry.value); | ||
| 127 | } | ||
| 128 | } else { | ||
| 129 | uni.showToast({ | ||
| 130 | title: '请选择必选科目!', | ||
| 131 | duration: 2000, | ||
| 132 | icon: 'error' | ||
| 133 | }); | ||
| 134 | return false; | ||
| 135 | } | ||
| 136 | } | ||
| 137 | </script> | ||
| 138 | |||
| 139 | <style scoped lang="scss"> | ||
| 140 | .nodata { | ||
| 141 | background: url(/static/nodata.png) no-repeat; | ||
| 142 | background-size: 100%; | ||
| 143 | width: 100%; | ||
| 144 | height: 835rpx; | ||
| 145 | color: #aaa59f; | ||
| 146 | font-size: 50rpx; | ||
| 147 | } | ||
| 148 | |||
| 149 | .conter-box { | ||
| 150 | padding-bottom: 100rpx; | ||
| 151 | } | ||
| 152 | |||
| 153 | .box { | ||
| 154 | padding: 34rpx 25rpx; | ||
| 155 | background-color: #f4f6fa; | ||
| 156 | padding-bottom: 0; | ||
| 157 | |||
| 158 | .box2 { | ||
| 159 | background-color: #fff; | ||
| 160 | border-radius: 15rpx; | ||
| 161 | margin-top: 20rpx; | ||
| 162 | } | ||
| 163 | |||
| 164 | .text { | ||
| 165 | height: 29px; | ||
| 166 | font-size: 30rpx; | ||
| 167 | font-family: PingFang SC; | ||
| 168 | font-weight: 500; | ||
| 169 | color: #000000; | ||
| 170 | line-height: 62rpx; | ||
| 171 | } | ||
| 172 | |||
| 173 | .box-check { | ||
| 174 | padding: 40rpx; | ||
| 175 | display: flex; | ||
| 176 | justify-content: space-between; | ||
| 177 | border-bottom: 1rpx solid #e6e6e6; | ||
| 178 | padding-bottom: 20rpx; | ||
| 179 | |||
| 180 | :deep(.checkbox__inner) { | ||
| 181 | background-color: #d9d9d9 !important; | ||
| 182 | border-color: #d9d9d9 !important; | ||
| 183 | border-radius: 50% !important; | ||
| 184 | width: 45rpx !important; | ||
| 185 | height: 45rpx !important; | ||
| 186 | line-height: 40rpx; | ||
| 187 | } | ||
| 188 | |||
| 189 | .text { | ||
| 190 | font-size: 12px; | ||
| 191 | color: #666; | ||
| 192 | margin-top: 5px; | ||
| 193 | } | ||
| 194 | |||
| 195 | .title { | ||
| 196 | font-size: 30rpx; | ||
| 197 | font-family: PingFang SC; | ||
| 198 | font-weight: 400; | ||
| 199 | color: #2b3133; | ||
| 200 | margin-bottom: 10rpx; | ||
| 201 | } | ||
| 202 | |||
| 203 | .content { | ||
| 204 | display: flex; | ||
| 205 | font-size: 30rpx; | ||
| 206 | font-family: PingFang SC; | ||
| 207 | font-weight: 400; | ||
| 208 | color: #2b3133; | ||
| 209 | |||
| 210 | .span { | ||
| 211 | color: #ff8124; | ||
| 212 | font-size: 28rpx; | ||
| 213 | font-family: PingFang SC; | ||
| 214 | font-weight: 400; | ||
| 215 | } | ||
| 216 | } | ||
| 217 | } | ||
| 218 | |||
| 219 | :deep(.checkbox__inner-icon) { | ||
| 220 | position: absolute !important; | ||
| 221 | top: 4px !important; | ||
| 222 | left: 7px !important; | ||
| 223 | color: #000 !important; | ||
| 224 | } | ||
| 225 | |||
| 226 | :deep(.uni-data-checklist .checklist-group .checklist-box) { | ||
| 227 | margin-right: 0; | ||
| 228 | } | ||
| 229 | } | ||
| 230 | |||
| 231 | .conter-button { | ||
| 232 | position: absolute; | ||
| 233 | left: 0; | ||
| 234 | bottom: 10rpx; | ||
| 235 | width: 100%; | ||
| 236 | display: flex; | ||
| 237 | justify-content: center; | ||
| 238 | |||
| 239 | .button { | ||
| 240 | height: 80rpx; | ||
| 241 | width: 500rpx; | ||
| 242 | text-align: center; | ||
| 243 | font-size: 32rpx; | ||
| 244 | font-family: PingFang SC; | ||
| 245 | font-weight: 500; | ||
| 246 | color: #ffffff; | ||
| 247 | line-height: 80rpx; | ||
| 248 | background: linear-gradient(270deg, #54e1b9, #00caa6); | ||
| 249 | border-radius: 40rpx; | ||
| 250 | } | ||
| 251 | } | ||
| 252 | |||
| 253 | .foot { | ||
| 254 | display: flex; | ||
| 255 | background-color: #ffffff; | ||
| 256 | padding: 20rpx 0; | ||
| 257 | position: absolute; | ||
| 258 | left: 0; | ||
| 259 | bottom: 0; | ||
| 260 | width: 100%; | ||
| 261 | |||
| 262 | .button { | ||
| 263 | margin: 0 auto; | ||
| 264 | height: 80rpx; | ||
| 265 | width: 300rpx; | ||
| 266 | text-align: center; | ||
| 267 | font-size: 32rpx; | ||
| 268 | font-family: PingFang SC; | ||
| 269 | font-weight: 500; | ||
| 270 | color: #ffffff; | ||
| 271 | line-height: 80rpx; | ||
| 272 | background: linear-gradient(270deg, #54e1b9, #00caa6); | ||
| 273 | border-radius: 40rpx; | ||
| 274 | } | ||
| 275 | |||
| 276 | .button1 { | ||
| 277 | margin: 0 auto; | ||
| 278 | height: 80rpx; | ||
| 279 | width: 300rpx; | ||
| 280 | text-align: center; | ||
| 281 | font-size: 32rpx; | ||
| 282 | font-family: PingFang SC; | ||
| 283 | font-weight: 500; | ||
| 284 | line-height: 80rpx; | ||
| 285 | background: #fff; | ||
| 286 | border-radius: 40rpx; | ||
| 287 | border: 1px solid #2ed981; | ||
| 288 | color: #2ed981; | ||
| 289 | } | ||
| 290 | } | ||
| 291 | </style> |
| 1 | <template> | ||
| 2 | <view class="box"> | ||
| 3 | <view class="liner" v-for="item in props.scheduleList" :key="item.id"> | ||
| 4 | <view class="timer"> | ||
| 5 | <uni-icons custom-prefix="iconfont" type="icon-ai253" color="#1ec886" size="20"></uni-icons> | ||
| 6 | {{ item.dayStr }} 10:00-12:00 | ||
| 7 | </view> | ||
| 8 | <view class="conetr">{{ item.event }}</view> | ||
| 9 | <view class="data"> | ||
| 10 | <uni-icons custom-prefix="iconfont" type="icon-loufangfangzi"></uni-icons> | ||
| 11 | {{ item.place }} | ||
| 12 | </view> | ||
| 13 | </view> | ||
| 14 | <view class="nodata" v-if="props?.scheduleList?.length == 0">你还没有日程安排</view> | ||
| 15 | </view> | ||
| 16 | </template> | ||
| 17 | |||
| 18 | <script setup> | ||
| 19 | import { ref, getCurrentInstance, reactive, toRefs } from 'vue'; | ||
| 20 | const props = defineProps({ | ||
| 21 | scheduleList: {} | ||
| 22 | }); | ||
| 23 | </script> | ||
| 24 | |||
| 25 | <style scoped lang="scss"> | ||
| 26 | .nodata { | ||
| 27 | background: url(/static/nodata.png) no-repeat; | ||
| 28 | background-size: 100%; | ||
| 29 | width: 100%; | ||
| 30 | height: 835rpx; | ||
| 31 | color: #aaa59f; | ||
| 32 | font-size: 50rpx; | ||
| 33 | } | ||
| 34 | |||
| 35 | .box { | ||
| 36 | padding-top: 25rpx; | ||
| 37 | |||
| 38 | .liner { | ||
| 39 | margin-bottom: 20rpx; | ||
| 40 | background-color: #fff; | ||
| 41 | border-radius: 15rpx; | ||
| 42 | padding: 20rpx; | ||
| 43 | } | ||
| 44 | |||
| 45 | .timer { | ||
| 46 | display: flex; | ||
| 47 | font-size: 28rpx; | ||
| 48 | font-family: PingFang SC; | ||
| 49 | font-weight: 400; | ||
| 50 | color: #1ec886; | ||
| 51 | } | ||
| 52 | |||
| 53 | .conetr { | ||
| 54 | font-size: 30rpx; | ||
| 55 | font-family: PingFang SC; | ||
| 56 | font-weight: 400; | ||
| 57 | color: #2b3133; | ||
| 58 | margin: 25rpx 0; | ||
| 59 | } | ||
| 60 | |||
| 61 | .data { | ||
| 62 | font-size: 28rpx; | ||
| 63 | font-family: PingFang SC; | ||
| 64 | font-weight: 400; | ||
| 65 | color: #7b7f83; | ||
| 66 | } | ||
| 67 | } | ||
| 68 | </style> |
components/train/ulist/ulist.vue
deleted
100644 → 0
| 1 | <template> | ||
| 2 | <view class="big-box"> | ||
| 3 | <view class="list-box"> | ||
| 4 | <view class="image"> | ||
| 5 | <image class="img" referrer="no-referrer|origin|unsafe-url" :src="porps.pic" mode="aspectFill"></image> | ||
| 6 | </view> | ||
| 7 | <view class="text"> | ||
| 8 | <view class="text-title">{{ porps.title }}</view> | ||
| 9 | <view class="text-card color" v-if="porps.card == '报名中'">{{ porps.card }}</view> | ||
| 10 | <view class="text-card color1" v-if="porps.card == '进行中'">{{ porps.card }}</view> | ||
| 11 | <view class="text-card color2" v-if="porps.card == '即将开始'">{{ porps.card }}</view> | ||
| 12 | <view class="text-card color3" v-if="porps.card == '已结束'">{{ porps.card }}</view> | ||
| 13 | <view class="text-card color4" v-if="porps.card == '培训未开始'">{{ porps.card }}</view> | ||
| 14 | <view class="text-card color4" v-if="porps.card == '报名未开始'">{{ porps.card }}</view> | ||
| 15 | <view class="text-timer ">报名截止:{{ porps.timer }}</view> | ||
| 16 | </view> | ||
| 17 | </view> | ||
| 18 | <view class="hr"></view> | ||
| 19 | </view> | ||
| 20 | </template> | ||
| 21 | |||
| 22 | <script setup> | ||
| 23 | const porps = defineProps({ | ||
| 24 | pic: { | ||
| 25 | type: String | ||
| 26 | }, | ||
| 27 | title: { | ||
| 28 | type: String | ||
| 29 | }, | ||
| 30 | card: { | ||
| 31 | type: String | ||
| 32 | }, | ||
| 33 | timer: { | ||
| 34 | type: String | ||
| 35 | } | ||
| 36 | }); | ||
| 37 | </script> | ||
| 38 | |||
| 39 | <style lang="scss"> | ||
| 40 | .big-box { | ||
| 41 | width: 100%; | ||
| 42 | padding: 25rpx 0; | ||
| 43 | |||
| 44 | .hr { | ||
| 45 | width: 100%; | ||
| 46 | border-bottom: 1rpx solid #e5e5e5; | ||
| 47 | padding-top: 25rpx; | ||
| 48 | } | ||
| 49 | |||
| 50 | .list-box { | ||
| 51 | width: 100%; | ||
| 52 | height: 180rpx; | ||
| 53 | display: flex; | ||
| 54 | |||
| 55 | .image { | ||
| 56 | width: 270rpx; | ||
| 57 | height: 180rpx; | ||
| 58 | padding-right: 25rpx; | ||
| 59 | |||
| 60 | .img { | ||
| 61 | width: 270rpx; | ||
| 62 | height: 180rpx; | ||
| 63 | border-radius: 15rpx; | ||
| 64 | } | ||
| 65 | } | ||
| 66 | |||
| 67 | .text { | ||
| 68 | margin-left: 20rpx; | ||
| 69 | |||
| 70 | .text-title { | ||
| 71 | text-align: left; | ||
| 72 | font-size: 30rpx; | ||
| 73 | font-family: PingFang SC; | ||
| 74 | font-weight: 400; | ||
| 75 | color: #000000; | ||
| 76 | } | ||
| 77 | |||
| 78 | .text-card { | ||
| 79 | font-size: 20rpx; | ||
| 80 | width: 110rpx; | ||
| 81 | height: 32rpx; | ||
| 82 | margin-top: 57rpx; | ||
| 83 | text-align: center; | ||
| 84 | font-family: PingFang SC; | ||
| 85 | font-weight: 400; | ||
| 86 | color: #ffffff; | ||
| 87 | border-radius: 16px 16px 16px 0px; | ||
| 88 | } | ||
| 89 | |||
| 90 | .color { | ||
| 91 | background: linear-gradient(270deg, #54e1b9, #00caa6); | ||
| 92 | } | ||
| 93 | |||
| 94 | .color1 { | ||
| 95 | background: linear-gradient(270deg, #be8efb, #a76df4); | ||
| 96 | } | ||
| 97 | |||
| 98 | .color2 { | ||
| 99 | background: linear-gradient(270deg, #fea449, #ffb95f); | ||
| 100 | } | ||
| 101 | |||
| 102 | .color3 { | ||
| 103 | background: linear-gradient(270deg, #d9d9d9, #bcbcbc); | ||
| 104 | } | ||
| 105 | |||
| 106 | .color4 { | ||
| 107 | background: linear-gradient(270deg, #40d8ee, #53a7f6); | ||
| 108 | } | ||
| 109 | |||
| 110 | .text-timer { | ||
| 111 | margin-top: 20rpx; | ||
| 112 | height: 23rpx; | ||
| 113 | font-size: 24rpx; | ||
| 114 | font-family: PingFang SC; | ||
| 115 | font-weight: 400; | ||
| 116 | color: #7b7f83; | ||
| 117 | } | ||
| 118 | } | ||
| 119 | } | ||
| 120 | } | ||
| 121 | </style> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
components/train/ulist/ulist1.vue
deleted
100644 → 0
| 1 | <template> | ||
| 2 | <view class="big-box"> | ||
| 3 | <view class="list-box"> | ||
| 4 | <view class="image"> | ||
| 5 | <image | ||
| 6 | class="img" | ||
| 7 | referrer="no-referrer|origin|unsafe-url" | ||
| 8 | :src="porps.item.cover" | ||
| 9 | mode="aspectFill" | ||
| 10 | ></image> | ||
| 11 | </view> | ||
| 12 | <view class="text"> | ||
| 13 | <view class="text-title">{{ porps.item.trainName }}</view> | ||
| 14 | <view class="text-card color1" v-if="porps.item.statusStr == '审核通过'"> | ||
| 15 | {{ porps.item.statusStr }} | ||
| 16 | </view> | ||
| 17 | <view class="text-card color2" v-if="porps.item.statusStr == '待审核'"> | ||
| 18 | {{ | ||
| 19 | porps.item.status == '0' && porps.item.payStatus == '0' | ||
| 20 | ? porps.item.payStatusStr | ||
| 21 | : porps.item.statusStr | ||
| 22 | }} | ||
| 23 | </view> | ||
| 24 | <view class="text-card color3" v-if="porps.item.statusStr == '报名失败'"> | ||
| 25 | {{ porps.item.statusStr }} | ||
| 26 | </view> | ||
| 27 | <view class="text-card color3" v-if="porps.item.statusStr == '审核拒绝'"> | ||
| 28 | {{ porps.item.statusStr }} | ||
| 29 | </view> | ||
| 30 | <view class="text-card color4" v-if="porps.item.statusStr == '待支付'">{{ porps.item.statusStr }}</view> | ||
| 31 | <view class="text-card color4" v-if="porps.item.statusStr == '待提交'">{{ porps.item.statusStr }}</view> | ||
| 32 | <view class="text-card color5" v-if="porps.item.statusStr == '已取消'">{{ porps.item.statusStr }}</view> | ||
| 33 | </view> | ||
| 34 | </view> | ||
| 35 | <view class="hr"></view> | ||
| 36 | </view> | ||
| 37 | </template> | ||
| 38 | |||
| 39 | <script setup> | ||
| 40 | const porps = defineProps({ | ||
| 41 | pic: { | ||
| 42 | type: String | ||
| 43 | }, | ||
| 44 | title: { | ||
| 45 | type: String | ||
| 46 | }, | ||
| 47 | card: { | ||
| 48 | type: String | ||
| 49 | }, | ||
| 50 | timer: { | ||
| 51 | type: String | ||
| 52 | }, | ||
| 53 | item: {} | ||
| 54 | }); | ||
| 55 | </script> | ||
| 56 | |||
| 57 | <style lang="scss"> | ||
| 58 | .big-box { | ||
| 59 | width: 100%; | ||
| 60 | padding: 25rpx 0; | ||
| 61 | |||
| 62 | .hr { | ||
| 63 | width: 100%; | ||
| 64 | border-bottom: 1rpx solid #e5e5e5; | ||
| 65 | padding-top: 25rpx; | ||
| 66 | } | ||
| 67 | |||
| 68 | .list-box { | ||
| 69 | width: 100%; | ||
| 70 | height: 180rpx; | ||
| 71 | display: flex; | ||
| 72 | |||
| 73 | .image { | ||
| 74 | width: 270rpx; | ||
| 75 | height: 180rpx; | ||
| 76 | padding-right: 25rpx; | ||
| 77 | |||
| 78 | .img { | ||
| 79 | width: 270rpx; | ||
| 80 | height: 180rpx; | ||
| 81 | border-radius: 15rpx; | ||
| 82 | } | ||
| 83 | } | ||
| 84 | |||
| 85 | .text { | ||
| 86 | margin-left: 20rpx; | ||
| 87 | |||
| 88 | .text-title { | ||
| 89 | text-align: left; | ||
| 90 | font-size: 30rpx; | ||
| 91 | font-family: PingFang SC; | ||
| 92 | font-weight: 400; | ||
| 93 | color: #000000; | ||
| 94 | } | ||
| 95 | |||
| 96 | .text-card { | ||
| 97 | font-size: 20rpx; | ||
| 98 | width: 94rpx; | ||
| 99 | height: 32rpx; | ||
| 100 | margin-top: 57rpx; | ||
| 101 | text-align: center; | ||
| 102 | font-family: PingFang SC; | ||
| 103 | font-weight: 400; | ||
| 104 | color: #ffffff; | ||
| 105 | border-radius: 16px 16px 16px 0px; | ||
| 106 | } | ||
| 107 | |||
| 108 | .color1 { | ||
| 109 | background: linear-gradient(270deg, #54e1b9, #00caa6); | ||
| 110 | } | ||
| 111 | |||
| 112 | .color2 { | ||
| 113 | background: linear-gradient(270deg, #be8efb, #a76df4); | ||
| 114 | } | ||
| 115 | |||
| 116 | .color3 { | ||
| 117 | background: linear-gradient(90deg, #f83841, #f76d74); | ||
| 118 | } | ||
| 119 | |||
| 120 | .color4 { | ||
| 121 | background: linear-gradient(90deg, #fea449, #ffb95f); | ||
| 122 | } | ||
| 123 | |||
| 124 | .color5 { | ||
| 125 | background: linear-gradient(270deg, #d9d9d9, #bcbcbc); | ||
| 126 | } | ||
| 127 | } | ||
| 128 | } | ||
| 129 | } | ||
| 130 | </style> |
| ... | @@ -181,6 +181,20 @@ | ... | @@ -181,6 +181,20 @@ |
| 181 | } | 181 | } |
| 182 | 182 | ||
| 183 | }, { | 183 | }, { |
| 184 | "path": "pages/level/ztx/approval", | ||
| 185 | "style": { | ||
| 186 | "navigationBarTitleText": "级位考试审批", | ||
| 187 | "enablePullDownRefresh": false | ||
| 188 | } | ||
| 189 | |||
| 190 | }, { | ||
| 191 | "path": "pages/level/ztx/cert", | ||
| 192 | "style": { | ||
| 193 | "navigationBarTitleText": "级位证书发布", | ||
| 194 | "enablePullDownRefresh": false | ||
| 195 | } | ||
| 196 | |||
| 197 | }, { | ||
| 184 | "path": "pages/rank/approval", | 198 | "path": "pages/rank/approval", |
| 185 | "style": { | 199 | "style": { |
| 186 | "navigationBarTitleText": "段位考试审批", | 200 | "navigationBarTitleText": "段位考试审批", |
| ... | @@ -422,6 +436,24 @@ | ... | @@ -422,6 +436,24 @@ |
| 422 | "enablePullDownRefresh": false | 436 | "enablePullDownRefresh": false |
| 423 | } | 437 | } |
| 424 | } | 438 | } |
| 439 | ,{ | ||
| 440 | "path" : "pages/level/ztx/examList", | ||
| 441 | "style" : | ||
| 442 | { | ||
| 443 | "navigationBarTitleText": "级位考试详情", | ||
| 444 | "enablePullDownRefresh": false | ||
| 445 | } | ||
| 446 | |||
| 447 | } | ||
| 448 | ,{ | ||
| 449 | "path" : "pages/level/ztx/studentList", | ||
| 450 | "style" : | ||
| 451 | { | ||
| 452 | "navigationBarTitleText": "考生列表", | ||
| 453 | "enablePullDownRefresh": false | ||
| 454 | } | ||
| 455 | |||
| 456 | } | ||
| 425 | ], | 457 | ], |
| 426 | "globalStyle": { | 458 | "globalStyle": { |
| 427 | "navigationStyle": "custom", | 459 | "navigationStyle": "custom", | ... | ... |
| ... | @@ -4,6 +4,12 @@ | ... | @@ -4,6 +4,12 @@ |
| 4 | <uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem" | 4 | <uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem" |
| 5 | styleType="text" activeColor="#AD181F"></uni-segmented-control> | 5 | styleType="text" activeColor="#AD181F"></uni-segmented-control> |
| 6 | <view class="appList"> | 6 | <view class="appList"> |
| 7 | <view class="vipData" v-if="userType == '1'" v-show="totalCost>0"> | ||
| 8 | <view>费用合计: | ||
| 9 | <text>¥{{ totalCost.toFixed(2) }}</text> | ||
| 10 | </view> | ||
| 11 | </view> | ||
| 12 | |||
| 7 | <view class="appItem" v-for="item in list"> | 13 | <view class="appItem" v-for="item in list"> |
| 8 | <view class="status" @click="goDetail(item)"> | 14 | <view class="status" @click="goDetail(item)"> |
| 9 | <text v-if="item.auditStatus == 0" class="text-primary">审核中</text> | 15 | <text v-if="item.auditStatus == 0" class="text-primary">审核中</text> |
| ... | @@ -36,25 +42,22 @@ | ... | @@ -36,25 +42,22 @@ |
| 36 | <view>{{item.content.renewYear}}</view> | 42 | <view>{{item.content.renewYear}}</view> |
| 37 | </view> | 43 | </view> |
| 38 | <view v-if="deptType == 1"> | 44 | <view v-if="deptType == 1"> |
| 39 | 团体会员/新会员 | 45 | 会员合计/新会员 |
| 40 | <view>{{item.content.allCount}}/{{item.content.newCount}}</view> | 46 | <view>{{item.content.allCount}}/<text class="text-danger">{{item.content.newCount}}</text></view> |
| 41 | </view> | 47 | </view> |
| 42 | <view v-if="deptType == 1"> | 48 | <view v-if="deptType == 1"> |
| 43 | 费用合计 | 49 | 费用合计 |
| 44 | <view> {{ (item?.content?.allFee*1).toFixed(2) }}</view> | 50 | <view> ¥{{ (item?.content?.allFee*1).toFixed(2) }}</view> |
| 45 | </view> | 51 | </view> |
| 46 | </view> | 52 | </view> |
| 47 | <view class="func" v-if="(userType == '3'||userType == '2') && item.auditStatus == 0"> | 53 | <view class="func" v-if="(userType == '3'||userType == '2') && item.auditStatus == 0"> |
| 48 | <button @click="audit(item.recordId,'0')">拒绝</button> | 54 | <button @click="audit(item.recordId,'0')">拒绝</button> |
| 49 | <button @click="audit(item.recordId,'1')">同意</button> | 55 | <button @click="audit(item.recordId,'1')">同意</button> |
| 50 | </view> | 56 | </view> |
| 51 | <view class="func" v-if="(deptType == 1&&item.ztxRes == 0)||((deptType == 2 || deptType == 3)&&item.shenRes == 0)"> | 57 | <view class="func" v-if="(userType == '1'&&item.auditStatus == 0)"> |
| 52 | <button @click="audit(item.recordId,'0')">拒绝</button> | 58 | <button @click="audit(item.recordId,'0')">拒绝</button> |
| 53 | <button @click="audit(item.recordId,'1')">同意</button> | 59 | <button @click="audit(item.recordId,'1')">同意</button> |
| 54 | </view> | 60 | </view> |
| 55 | <view class="func" v-if="(deptType == 6&&(item.status == 0 || item.status == 2))"> | ||
| 56 | <button>提交审核</button> | ||
| 57 | </view> | ||
| 58 | </view> | 61 | </view> |
| 59 | </view> | 62 | </view> |
| 60 | 63 | ||
| ... | @@ -90,6 +93,7 @@ | ... | @@ -90,6 +93,7 @@ |
| 90 | const total = ref(0) | 93 | const total = ref(0) |
| 91 | const deptType = ref('') | 94 | const deptType = ref('') |
| 92 | const userType = ref('') | 95 | const userType = ref('') |
| 96 | const totalCost = ref(0) | ||
| 93 | onLoad(() => { | 97 | onLoad(() => { |
| 94 | if (app.globalData.isLogin) { | 98 | if (app.globalData.isLogin) { |
| 95 | init() | 99 | init() |
| ... | @@ -126,12 +130,14 @@ | ... | @@ -126,12 +130,14 @@ |
| 126 | }else if( deptType.value==4||deptType.value==5){ | 130 | }else if( deptType.value==4||deptType.value==5){ |
| 127 | queryParams.value.noEmpty=1 | 131 | queryParams.value.noEmpty=1 |
| 128 | } | 132 | } |
| 133 | totalCost.value = 0 | ||
| 129 | api.getGroupList(queryParams.value).then(res => { | 134 | api.getGroupList(queryParams.value).then(res => { |
| 130 | uni.hideLoading() | 135 | uni.hideLoading() |
| 131 | list.value = res.rows | 136 | list.value = res.rows |
| 132 | list.value.forEach(item => { | 137 | list.value.forEach(item => { |
| 133 | item.content = JSON.parse(item.content) | 138 | item.content = JSON.parse(item.content) |
| 134 | // item.doc = JSON.parse(item.doc) | 139 | // item.doc = JSON.parse(item.doc) |
| 140 | totalCost.value = totalCost.value + (item.content.allFee * 1) | ||
| 135 | }) | 141 | }) |
| 136 | total.value = res.total | 142 | total.value = res.total |
| 137 | }) | 143 | }) |
| ... | @@ -194,7 +200,7 @@ | ... | @@ -194,7 +200,7 @@ |
| 194 | 200 | ||
| 195 | if(userType.value=='1'){ | 201 | if(userType.value=='1'){ |
| 196 | // 查看 | 202 | // 查看 |
| 197 | let path = `/pages/group/apply/applyDetail?rangeId=${item.id}&auditLog=${auditLog}&form=${form}` | 203 | let path = `/pages/group/apply/mergeUpDetail?form=${form}` |
| 198 | uni.navigateTo({ | 204 | uni.navigateTo({ |
| 199 | url: path | 205 | url: path |
| 200 | }); | 206 | }); | ... | ... |
| ... | @@ -40,21 +40,35 @@ | ... | @@ -40,21 +40,35 @@ |
| 40 | </view> | 40 | </view> |
| 41 | <view class="flexbox"> | 41 | <view class="flexbox"> |
| 42 | <view> | 42 | <view> |
| 43 | 单价 | 43 | <view> |
| 44 | <text>¥{{n.unitPrice}}</text> | 44 | 原有效期 |
| 45 | <text>{{n.validityTime?.slice(0,10)}}</text> | ||
| 46 | </view> | ||
| 47 | <view> | ||
| 48 | 提交日期 | ||
| 49 | <text>{{n.commitTime?.slice(0,10)}}</text> | ||
| 50 | </view> | ||
| 45 | </view> | 51 | </view> |
| 46 | <view> | 52 | <view> |
| 47 | 年限 | 53 | 年限 |
| 48 | <text>{{n.renewYear}}</text> | 54 | <text>{{n.renewYear}}</text> |
| 55 | <view v-if="deptType==1"> | ||
| 56 | 会员证 | ||
| 57 | <text v-if="form.content.sendJiaoFeiFlag==1" class="text-success">已下发</text> | ||
| 58 | <text v-else class="text-warning">未下发</text> | ||
| 59 | </view> | ||
| 49 | </view> | 60 | </view> |
| 50 | <view> | 61 | <view> |
| 51 | 总价 | 62 | 单价 |
| 63 | <text>¥{{n.unitPrice}}</text> | ||
| 64 | <view>总价 | ||
| 52 | <text>¥{{n.allFee}}</text> | 65 | <text>¥{{n.allFee}}</text> |
| 53 | </view> | 66 | </view> |
| 54 | </view> | 67 | </view> |
| 55 | </view> | 68 | </view> |
| 56 | </view> | 69 | </view> |
| 57 | </view> | 70 | </view> |
| 71 | </view> | ||
| 58 | 72 | ||
| 59 | </view> | 73 | </view> |
| 60 | 74 | ||
| ... | @@ -80,15 +94,15 @@ | ... | @@ -80,15 +94,15 @@ |
| 80 | </view> | 94 | </view> |
| 81 | </view> | 95 | </view> |
| 82 | 96 | ||
| 83 | <view class="fixedBottom" v-if="(deptType == 1)&&form.ztxRes == 0"> | 97 | <!-- <view class="fixedBottom" v-if="(deptType == 1)&&form.auditStatus == 0"> |
| 84 | <button class="btn-red-kx" @click="audit(form.id,'2')">拒绝</button> | 98 | <button class="btn-red-kx" @click="audit(form.id,'2')">拒绝</button> |
| 85 | <button class="btn-red" @click="audit(form.id,'1')">同意</button> | 99 | <button class="btn-red" @click="audit(form.id,'1')">同意</button> |
| 86 | </view> | 100 | </view> |
| 87 | 101 | ||
| 88 | <view class="fixedBottom" v-if="(deptType == 2 || deptType == 3)&&form.shenRes == 0"> | 102 | <view class="fixedBottom" v-if="(deptType == 2 || deptType == 3)&&form.auditStatus == 0"> |
| 89 | <button class="btn-red-kx" @click="audit(form.id,'2')">拒绝</button> | 103 | <button class="btn-red-kx" @click="audit(form.id,'2')">拒绝</button> |
| 90 | <button class="btn-red" @click="audit(form.id,'1')">同意</button> | 104 | <button class="btn-red" @click="audit(form.id,'1')">同意</button> |
| 91 | </view> | 105 | </view> --> |
| 92 | 106 | ||
| 93 | </view> | 107 | </view> |
| 94 | </template> | 108 | </template> | ... | ... |
| ... | @@ -15,7 +15,7 @@ | ... | @@ -15,7 +15,7 @@ |
| 15 | <view class="item" v-for="n in list"> | 15 | <view class="item" v-for="n in list"> |
| 16 | <view class="w100"> | 16 | <view class="w100"> |
| 17 | <view class="name">{{n.certName}}</view> | 17 | <view class="name">{{n.certName}}</view> |
| 18 | <view class="date" v-if="n.validityTime">{{n.validityTime?.silce(0,10)}}</view> | 18 | <view class="date" v-if="n.validityTime">{{n.validityTime?.slice(0,10)}}</view> |
| 19 | <view class="flexbox"> | 19 | <view class="flexbox"> |
| 20 | <view>单价 | 20 | <view>单价 |
| 21 | <text>¥{{ (n.unitPrice*1).toFixed(2) }}</text> | 21 | <text>¥{{ (n.unitPrice*1).toFixed(2) }}</text> | ... | ... |
| 1 | <template> | 1 | <template> |
| 2 | <view class="page"> | 2 | <view class="page"> |
| 3 | <view class="bgbg"> | 3 | <view class="bgbg"> |
| 4 | <view class="loginOutIcon" @click="loginOut"> | ||
| 5 | <image src="@/static/switch.png"></image> | ||
| 6 | </view> | ||
| 4 | <view class="welcome">您好! | 7 | <view class="welcome">您好! |
| 5 | {{memberInfo.name}} | 8 | {{memberInfo.name}} |
| 6 | <br />欢迎使用中跆协会员管理系统 | 9 | <br />欢迎使用中跆协会员管理系统 |
| ... | @@ -42,7 +45,7 @@ | ... | @@ -42,7 +45,7 @@ |
| 42 | <view v-if="userType=='4'" @click="goPath('/pages/level/apply')"> | 45 | <view v-if="userType=='4'" @click="goPath('/pages/level/apply')"> |
| 43 | <image />级位考试申请 | 46 | <image />级位考试申请 |
| 44 | </view> | 47 | </view> |
| 45 | <view v-if="userType!='4'" @click="goPath('/pages/level/approval')"> | 48 | <view v-if="userType!='4'&&userType!='1'" @click="goPath('/pages/level/approval')"> |
| 46 | <image />级位考试审核 | 49 | <image />级位考试审核 |
| 47 | </view> | 50 | </view> |
| 48 | <view v-if="userType=='2'" @click="goPath('/pages/level/apply')"> | 51 | <view v-if="userType=='2'" @click="goPath('/pages/level/apply')"> |
| ... | @@ -52,6 +55,12 @@ | ... | @@ -52,6 +55,12 @@ |
| 52 | 55 | ||
| 53 | </view> | 56 | </view> |
| 54 | <view v-if="userType=='1'" class="girdBox"> | 57 | <view v-if="userType=='1'" class="girdBox"> |
| 58 | <view @click="goPath('/pages/level/ztx/approval')"> | ||
| 59 | <image />级位考试审核 | ||
| 60 | </view> | ||
| 61 | <view @click="goPath('/pages/level/ztx/cert')"> | ||
| 62 | <image />级位证书发布 | ||
| 63 | </view> | ||
| 55 | <view @click="goPath('/pages/rank/approval')"> | 64 | <view @click="goPath('/pages/rank/approval')"> |
| 56 | <image />段位考试审核 | 65 | <image />段位考试审核 |
| 57 | </view> | 66 | </view> |
| ... | @@ -132,7 +141,9 @@ | ... | @@ -132,7 +141,9 @@ |
| 132 | proId = option.proId; | 141 | proId = option.proId; |
| 133 | } | 142 | } |
| 134 | }); | 143 | }); |
| 144 | function loginOut(){ | ||
| 135 | 145 | ||
| 146 | } | ||
| 136 | function goPath(path) { | 147 | function goPath(path) { |
| 137 | uni.navigateTo({ | 148 | uni.navigateTo({ |
| 138 | url: path | 149 | url: path |
| ... | @@ -282,6 +293,9 @@ | ... | @@ -282,6 +293,9 @@ |
| 282 | } | 293 | } |
| 283 | </script> | 294 | </script> |
| 284 | <style scope lang="scss"> | 295 | <style scope lang="scss"> |
| 296 | .loginOutIcon{ | ||
| 297 | image{} | ||
| 298 | } | ||
| 285 | .welcome { | 299 | .welcome { |
| 286 | padding: 55rpx; | 300 | padding: 55rpx; |
| 287 | line-height: 55rpx; | 301 | line-height: 55rpx; | ... | ... |
| ... | @@ -42,6 +42,9 @@ | ... | @@ -42,6 +42,9 @@ |
| 42 | <image mode="aspectFit" src="/static/nodata.png"></image> | 42 | <image mode="aspectFit" src="/static/nodata.png"></image> |
| 43 | <text>暂无数据</text> | 43 | <text>暂无数据</text> |
| 44 | </view> | 44 | </view> |
| 45 | <view v-if="userType=='2'" class="block-btn-box"> | ||
| 46 | <button @click="goMerge" class="btn-red-kx">前往合并 > </button> | ||
| 47 | </view> | ||
| 45 | </view> | 48 | </view> |
| 46 | </template> | 49 | </template> |
| 47 | 50 | ... | ... |
| ... | @@ -40,7 +40,7 @@ | ... | @@ -40,7 +40,7 @@ |
| 40 | 40 | ||
| 41 | <view class="nodata" v-if="infoList.length==0"> | 41 | <view class="nodata" v-if="infoList.length==0"> |
| 42 | <image mode="aspectFit" src="/static/nodata.png"></image> | 42 | <image mode="aspectFit" src="/static/nodata.png"></image> |
| 43 | <text>暂无数据</text> | 43 | <button class="btn-red" @click="gohome">回到首页</button> |
| 44 | </view> | 44 | </view> |
| 45 | </view> | 45 | </view> |
| 46 | </template> | 46 | </template> |
| ... | @@ -161,6 +161,12 @@ | ... | @@ -161,6 +161,12 @@ |
| 161 | }); | 161 | }); |
| 162 | 162 | ||
| 163 | } | 163 | } |
| 164 | function gohome(){ | ||
| 165 | let path = `/pages/index/index` | ||
| 166 | uni.reLaunch({ | ||
| 167 | url: path | ||
| 168 | }); | ||
| 169 | } | ||
| 164 | </script> | 170 | </script> |
| 165 | 171 | ||
| 166 | <style scoped> | 172 | <style scoped> | ... | ... |
pages/level/ztx/approval.vue
0 → 100644
| 1 | <template> | ||
| 2 | <view> | ||
| 3 | <uni-segmented-control class="whitebg" :current="current" :values="navs" @clickItem="onClickItem" | ||
| 4 | styleType="text" activeColor="#AD181F"></uni-segmented-control> | ||
| 5 | <view v-show="totalCost>0" class="vipData"> | ||
| 6 | <view>费用合计: | ||
| 7 | <text>{{ totalCost.toFixed(2) }}元</text> | ||
| 8 | </view> | ||
| 9 | </view> | ||
| 10 | |||
| 11 | <view class="appList"> | ||
| 12 | <view class="appItem" v-for="item in infoList"> | ||
| 13 | <view class="status" :class="{ | ||
| 14 | 'text-primary':item.status=='0', | ||
| 15 | 'text-success':item.status=='1', | ||
| 16 | 'text-danger':item.status=='2', | ||
| 17 | 'text-warning':item.status=='3' | ||
| 18 | }" @click="goDetail(item)"> | ||
| 19 | {{ item.statusStr }} | ||
| 20 | </view> | ||
| 21 | |||
| 22 | <view class="date" v-if="item.status!='0'&&item.submitTime">提交时间:{{item.submitTime}}</view> | ||
| 23 | <view class="name mt0" @click="goDetail(item)">{{item.mergeName}}</view> | ||
| 24 | <view class="pp esp">上报单位:{{item.memName}}</view> | ||
| 25 | <view class="flexbox" @click="goDetail(item)"> | ||
| 26 | <view> | ||
| 27 | 考试人数 | ||
| 28 | <view>{{item.totalNum}}</view> | ||
| 29 | </view> | ||
| 30 | |||
| 31 | <view> | ||
| 32 | 缴费状态 | ||
| 33 | <view> | ||
| 34 | <text :class="{ | ||
| 35 | 'text-success':item.examPayStatusStr=='已上传凭证', | ||
| 36 | 'text-danger':item.examPayStatusStr=='未上传凭证', | ||
| 37 | 'text-warning':item.examPayStatusStr=='已结算' | ||
| 38 | }">{{ item.examPayStatusStr||'--' }}</text> | ||
| 39 | </view> | ||
| 40 | </view> | ||
| 41 | <view> | ||
| 42 | 总金额 | ||
| 43 | <view>¥{{item.totalAmount}}</view> | ||
| 44 | </view> | ||
| 45 | </view> | ||
| 46 | <view class="func" v-if="item.status=='0'"> | ||
| 47 | <button @click="audit(item,'2')">拒绝</button> | ||
| 48 | <button @click="audit(item,'1')">同意</button> | ||
| 49 | </view> | ||
| 50 | </view> | ||
| 51 | </view> | ||
| 52 | |||
| 53 | <view class="nodata" v-if="infoList.length==0"> | ||
| 54 | <image mode="aspectFit" src="/static/nodata.png"></image> | ||
| 55 | <text>暂无数据</text> | ||
| 56 | </view> | ||
| 57 | </view> | ||
| 58 | </template> | ||
| 59 | |||
| 60 | <script setup> | ||
| 61 | import * as api from '@/common/api.js' | ||
| 62 | import config from '@/config.js' | ||
| 63 | import _ from 'lodash' | ||
| 64 | import { | ||
| 65 | onMounted, | ||
| 66 | ref | ||
| 67 | } from 'vue' | ||
| 68 | import { | ||
| 69 | onLoad, | ||
| 70 | onShow | ||
| 71 | } from '@dcloudio/uni-app' | ||
| 72 | const app = getApp(); | ||
| 73 | const queryParams = ref({ | ||
| 74 | // pageNum: 1, | ||
| 75 | // pageSize: 10 | ||
| 76 | status: '0', | ||
| 77 | type: '1' | ||
| 78 | }) | ||
| 79 | const navs = ref(['审核中', '审核通过', '审核拒绝', '审批撤回']) | ||
| 80 | const statusArr = ['审批中', '审批通过', '审批拒绝', '审批撤回'] | ||
| 81 | const current = ref() | ||
| 82 | const infoList = ref([]) | ||
| 83 | const total = ref(0) | ||
| 84 | const totalCost = ref(0) | ||
| 85 | const deptType = ref('') | ||
| 86 | const userType = ref('') | ||
| 87 | onLoad(() => { | ||
| 88 | |||
| 89 | }) | ||
| 90 | onShow(() => { | ||
| 91 | if (app.globalData.isLogin) { | ||
| 92 | init() | ||
| 93 | } else { | ||
| 94 | |||
| 95 | app.firstLoadCallback = () => { | ||
| 96 | init() | ||
| 97 | }; | ||
| 98 | } | ||
| 99 | }) | ||
| 100 | |||
| 101 | function init() { | ||
| 102 | deptType.value = app.globalData.deptType | ||
| 103 | userType.value = app.globalData.userType | ||
| 104 | getList() | ||
| 105 | } | ||
| 106 | |||
| 107 | |||
| 108 | function getList() { | ||
| 109 | uni.showLoading({ | ||
| 110 | title: '加载中' | ||
| 111 | }) | ||
| 112 | totalCost.value = 0 | ||
| 113 | api.getVerityMergeList(queryParams.value).then(response => { | ||
| 114 | uni.hideLoading() | ||
| 115 | const list = [] | ||
| 116 | _.each(response.rows, r => { | ||
| 117 | const item = JSON.parse(r.remark) | ||
| 118 | item.recordId = r.recordId | ||
| 119 | item.status = r.auditStatus | ||
| 120 | item.statusStr = statusArr[r.auditStatus] | ||
| 121 | item.isView = r.isView | ||
| 122 | item.payStatus = r.payStatus | ||
| 123 | item.examPayStatusStr = r.examPayStatusStr | ||
| 124 | item.sourceData = r | ||
| 125 | item.auditProcess = r.auditProcess | ||
| 126 | list.push(item) | ||
| 127 | |||
| 128 | totalCost.value += (item.totalAmount * 1) | ||
| 129 | }) | ||
| 130 | infoList.value = list | ||
| 131 | total.value = response.total | ||
| 132 | }) | ||
| 133 | } | ||
| 134 | |||
| 135 | function onClickItem(e) { | ||
| 136 | console.log(e) | ||
| 137 | uni.showLoading({ | ||
| 138 | title: '加载中' | ||
| 139 | }) | ||
| 140 | queryParams.value.status = e.currentIndex | ||
| 141 | getList() | ||
| 142 | } | ||
| 143 | |||
| 144 | function goDetail(item) { | ||
| 145 | const form = encodeURIComponent(JSON.stringify(item)) | ||
| 146 | // 查看 | ||
| 147 | let path = `/pages/level/mergeUpDetail?form=${form}&type=1` | ||
| 148 | uni.navigateTo({ | ||
| 149 | url: path | ||
| 150 | }); | ||
| 151 | |||
| 152 | } | ||
| 153 | |||
| 154 | function audit(item, flag) { | ||
| 155 | var obj = { | ||
| 156 | flag: flag, | ||
| 157 | reason: null, | ||
| 158 | id: item.recordId | ||
| 159 | } | ||
| 160 | |||
| 161 | if (flag == '2') { | ||
| 162 | // 拒绝 | ||
| 163 | // 弹出框填写理由 | ||
| 164 | uni.showModal({ | ||
| 165 | title: '请输入拒绝理由', | ||
| 166 | editable: true, | ||
| 167 | success: function(res) { | ||
| 168 | if (res.confirm) { | ||
| 169 | if (!res.content) { | ||
| 170 | uni.showToast({ | ||
| 171 | title: '请输入拒绝理由', | ||
| 172 | icon: 'none' | ||
| 173 | }) | ||
| 174 | } else { | ||
| 175 | obj.reason = res.content | ||
| 176 | doApproval(obj) | ||
| 177 | } | ||
| 178 | } | ||
| 179 | } | ||
| 180 | }) | ||
| 181 | } else if (flag == '1') { | ||
| 182 | // 二次确认 | ||
| 183 | uni.showModal({ | ||
| 184 | title: '提示', | ||
| 185 | content: `确定审批通过吗`, | ||
| 186 | success: function(res) { | ||
| 187 | if (res.confirm) { | ||
| 188 | doApproval(obj) | ||
| 189 | } | ||
| 190 | } | ||
| 191 | }) | ||
| 192 | } | ||
| 193 | } | ||
| 194 | |||
| 195 | function doApproval(obj) { | ||
| 196 | console.log(obj) | ||
| 197 | api.doMergeFlows(obj).then((res) => { | ||
| 198 | uni.showToast({ | ||
| 199 | title: '操作成功', | ||
| 200 | icon: 'none' | ||
| 201 | }) | ||
| 202 | getList() | ||
| 203 | }) | ||
| 204 | } | ||
| 205 | </script> | ||
| 206 | |||
| 207 | |||
| 208 | <style scoped lang="scss"> | ||
| 209 | .mt0 { | ||
| 210 | margin-top: 0 !important; | ||
| 211 | } | ||
| 212 | |||
| 213 | .appList .appItem .name { | ||
| 214 | width: 80%; | ||
| 215 | word-break: break-all; | ||
| 216 | } | ||
| 217 | </style> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
pages/level/ztx/cert.vue
0 → 100644
| 1 | <template> | ||
| 2 | <view> | ||
| 3 | <!-- 级位证书发布 --> | ||
| 4 | <view class="appList"> | ||
| 5 | <view class="appItem" v-for="item in infoList"> | ||
| 6 | <view class="status" @click="goDetail(item)"> | ||
| 7 | <text :class="{ | ||
| 8 | 'text-warning':item.certStatus=='0', | ||
| 9 | 'text-success':item.certStatus=='1' | ||
| 10 | }">{{ item.certStatusStr }}</text> | ||
| 11 | </view> | ||
| 12 | |||
| 13 | <view class="date">提交日期:{{item.submitTimeStr}}</view> | ||
| 14 | <view class="name mt0" @click="goDetail(item)">{{item.name}}</view> | ||
| 15 | <view class="pp esp" v-if="item.certTime">证书发送时间:{{item.certTimeStr}}</view> | ||
| 16 | <view class="flexbox" @click="goDetail(item)"> | ||
| 17 | <view> | ||
| 18 | 申请单位 | ||
| 19 | <view>{{item.memberName}}</view> | ||
| 20 | </view> | ||
| 21 | <view> | ||
| 22 | 已发证书 | ||
| 23 | <view>{{item.hasCerts}}</view> | ||
| 24 | </view> | ||
| 25 | <view> | ||
| 26 | 待发证书 | ||
| 27 | <view>{{item.noCerts}}</view> | ||
| 28 | </view> | ||
| 29 | </view> | ||
| 30 | <view class="func" v-if="item.certStatus != '2'"> | ||
| 31 | <button @click="send(item)">一键生成</button> | ||
| 32 | </view> | ||
| 33 | </view> | ||
| 34 | </view> | ||
| 35 | |||
| 36 | <view class="nodata" v-if="infoList.length==0"> | ||
| 37 | <image mode="aspectFit" src="/static/nodata.png"></image> | ||
| 38 | <text>暂无数据</text> | ||
| 39 | </view> | ||
| 40 | </view> | ||
| 41 | </template> | ||
| 42 | |||
| 43 | <script setup> | ||
| 44 | import * as api from '@/common/api.js' | ||
| 45 | import config from '@/config.js' | ||
| 46 | import _ from 'lodash' | ||
| 47 | import { | ||
| 48 | onMounted, | ||
| 49 | ref | ||
| 50 | } from 'vue' | ||
| 51 | import { | ||
| 52 | onLoad, | ||
| 53 | onShow | ||
| 54 | } from '@dcloudio/uni-app' | ||
| 55 | const app = getApp(); | ||
| 56 | const queryParams = ref({ | ||
| 57 | // pageNum: 1, | ||
| 58 | // pageSize: 10 | ||
| 59 | status: '0', | ||
| 60 | type: '1' | ||
| 61 | }) | ||
| 62 | const statusArr = ['审批中', '审批通过', '审批拒绝', '审批撤回'] | ||
| 63 | const current = ref() | ||
| 64 | const infoList = ref([]) | ||
| 65 | const total = ref(0) | ||
| 66 | const deptType = ref('') | ||
| 67 | const userType = ref('') | ||
| 68 | onLoad((option) => { | ||
| 69 | |||
| 70 | }) | ||
| 71 | onShow(() => { | ||
| 72 | if (app.globalData.isLogin) { | ||
| 73 | init() | ||
| 74 | } else { | ||
| 75 | |||
| 76 | app.firstLoadCallback = () => { | ||
| 77 | init() | ||
| 78 | }; | ||
| 79 | } | ||
| 80 | }) | ||
| 81 | |||
| 82 | function init() { | ||
| 83 | deptType.value = app.globalData.deptType | ||
| 84 | userType.value = app.globalData.userType | ||
| 85 | getList() | ||
| 86 | } | ||
| 87 | |||
| 88 | |||
| 89 | function getList() { | ||
| 90 | uni.showLoading({ | ||
| 91 | title: '加载中' | ||
| 92 | }) | ||
| 93 | api.getCertsLList(queryParams.value).then(res => { | ||
| 94 | infoList.value = res.rows | ||
| 95 | uni.hideLoading() | ||
| 96 | }) | ||
| 97 | } | ||
| 98 | |||
| 99 | function goDetail(item) { | ||
| 100 | // const form = encodeURIComponent(JSON.stringify(item)) | ||
| 101 | let path = `/pages/level/ztx/examList?type=1&payId=${item.payId}` | ||
| 102 | uni.navigateTo({ | ||
| 103 | url: path | ||
| 104 | }); | ||
| 105 | } | ||
| 106 | |||
| 107 | function send(row) { | ||
| 108 | uni.showModal({ | ||
| 109 | title: '提示', | ||
| 110 | content: `确定生成 ${row.name} 的证书吗`, | ||
| 111 | success: function(res) { | ||
| 112 | if (res.confirm) { | ||
| 113 | api.submitCert([{ | ||
| 114 | id: row.payId | ||
| 115 | }]).then(res => { | ||
| 116 | uni.showToast({ | ||
| 117 | title: `下发成功` | ||
| 118 | }) | ||
| 119 | getList() | ||
| 120 | }) | ||
| 121 | } | ||
| 122 | } | ||
| 123 | }) | ||
| 124 | } | ||
| 125 | </script> | ||
| 126 | |||
| 127 | |||
| 128 | <style scoped lang="scss"> | ||
| 129 | .mt0 { | ||
| 130 | margin-top: 0 !important; | ||
| 131 | } | ||
| 132 | |||
| 133 | .appList .appItem .name { | ||
| 134 | width: 80%; | ||
| 135 | word-break: break-all; | ||
| 136 | } | ||
| 137 | </style> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
pages/level/ztx/examList.vue
0 → 100644
| 1 | <template> | ||
| 2 | <view> | ||
| 3 | <!-- 级位证书发布 --> | ||
| 4 | <view class="appList"> | ||
| 5 | <view class="appItem" v-for="item in infoList"> | ||
| 6 | <view class="status" @click="goDetail(item)"> | ||
| 7 | <text :class="{ | ||
| 8 | 'text-warning':item.isCert=='0', | ||
| 9 | 'text-primary':item.isCert=='1', | ||
| 10 | 'text-success':item.isCert=='2' | ||
| 11 | }">{{ statusArr[item.isCert]}}</text> | ||
| 12 | </view> | ||
| 13 | |||
| 14 | <view class="date">申请日期: {{item.applyTime?.slice(0,10)}}</view> | ||
| 15 | <view class="name mt0" @click="goDetail(item)">{{item.name}}</view> | ||
| 16 | <view class="pp esp">考级考官:{{item.examinerNames}}</view> | ||
| 17 | <view class="flexbox" @click="goDetail(item)"> | ||
| 18 | <view> | ||
| 19 | 申请单位 | ||
| 20 | <view>{{item.memberName}}</view> | ||
| 21 | </view> | ||
| 22 | <view> | ||
| 23 | 已发/待发证书 | ||
| 24 | <view>{{item.hasCerts}}/<text class="text-danger">{{item.noCerts}}</text></view> | ||
| 25 | </view> | ||
| 26 | <view> | ||
| 27 | 考生数/通过数 | ||
| 28 | <view>{{item.totalNum}}/<text class="text-danger">{{item.pass}}</text></view> | ||
| 29 | </view> | ||
| 30 | </view> | ||
| 31 | <view class="func" v-if="item.certStatus != '2'"> | ||
| 32 | <button @click="send(item)">一键生成</button> | ||
| 33 | </view> | ||
| 34 | </view> | ||
| 35 | </view> | ||
| 36 | |||
| 37 | <view class="nodata" v-if="infoList.length==0"> | ||
| 38 | <image mode="aspectFit" src="/static/nodata.png"></image> | ||
| 39 | <text>暂无数据</text> | ||
| 40 | </view> | ||
| 41 | </view> | ||
| 42 | </template> | ||
| 43 | |||
| 44 | <script setup> | ||
| 45 | import * as api from '@/common/api.js' | ||
| 46 | import config from '@/config.js' | ||
| 47 | import _ from 'lodash' | ||
| 48 | import { | ||
| 49 | onMounted, | ||
| 50 | ref | ||
| 51 | } from 'vue' | ||
| 52 | import { | ||
| 53 | onLoad, | ||
| 54 | onShow | ||
| 55 | } from '@dcloudio/uni-app' | ||
| 56 | const app = getApp(); | ||
| 57 | const queryParams = ref({ | ||
| 58 | // pageNum: 1, | ||
| 59 | // pageSize: 10 | ||
| 60 | }) | ||
| 61 | const statusArr = ['未发放', '部分发放', '已发放'] | ||
| 62 | const current = ref() | ||
| 63 | const infoList = ref([]) | ||
| 64 | const total = ref(0) | ||
| 65 | const deptType = ref('') | ||
| 66 | const userType = ref('') | ||
| 67 | onLoad((option) => { | ||
| 68 | queryParams.value.payId = option.payId | ||
| 69 | queryParams.value.type = option.type | ||
| 70 | }) | ||
| 71 | onShow(() => { | ||
| 72 | if (app.globalData.isLogin) { | ||
| 73 | init() | ||
| 74 | } else { | ||
| 75 | |||
| 76 | app.firstLoadCallback = () => { | ||
| 77 | init() | ||
| 78 | }; | ||
| 79 | } | ||
| 80 | }) | ||
| 81 | |||
| 82 | function init() { | ||
| 83 | deptType.value = app.globalData.deptType | ||
| 84 | userType.value = app.globalData.userType | ||
| 85 | getList() | ||
| 86 | } | ||
| 87 | |||
| 88 | |||
| 89 | function getList() { | ||
| 90 | uni.showLoading({ | ||
| 91 | title: '加载中' | ||
| 92 | }) | ||
| 93 | api.getExamListByPayId(queryParams.value).then(res => { | ||
| 94 | infoList.value = res.rows | ||
| 95 | uni.hideLoading() | ||
| 96 | }) | ||
| 97 | } | ||
| 98 | |||
| 99 | function goDetail(item) { | ||
| 100 | // const form = encodeURIComponent(JSON.stringify(item)) | ||
| 101 | let path = `/pages/level/ztx/studentList?type=${queryParams.value.type}&examId=${item.examId}&payId=${queryParams.value.payId}` | ||
| 102 | uni.navigateTo({ | ||
| 103 | url: path | ||
| 104 | }); | ||
| 105 | } | ||
| 106 | |||
| 107 | function send(row) { | ||
| 108 | uni.showModal({ | ||
| 109 | title: '提示', | ||
| 110 | content: `确定生成 ${row.name} 的证书吗`, | ||
| 111 | success: function(res) { | ||
| 112 | if (res.confirm) { | ||
| 113 | api.submitCert([{ | ||
| 114 | id: row.payId | ||
| 115 | }]).then(res => { | ||
| 116 | uni.showToast({ | ||
| 117 | title: `下发成功` | ||
| 118 | }) | ||
| 119 | getList() | ||
| 120 | }) | ||
| 121 | } | ||
| 122 | } | ||
| 123 | }) | ||
| 124 | } | ||
| 125 | </script> | ||
| 126 | |||
| 127 | |||
| 128 | <style scoped lang="scss"> | ||
| 129 | .mt0 { | ||
| 130 | margin-top: 0 !important; | ||
| 131 | } | ||
| 132 | |||
| 133 | .appList .appItem .name { | ||
| 134 | width: 80%; | ||
| 135 | word-break: break-all; | ||
| 136 | } | ||
| 137 | </style> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
pages/level/ztx/studentList.vue
0 → 100644
| 1 | <template> | ||
| 2 | <view class="hasfixedbottom"> | ||
| 3 | <view class="searchbar"> | ||
| 4 | <uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search" | ||
| 5 | v-model="queryParams.name" placeholder="搜索姓名" @blur="getList()" @clear="getList()"> | ||
| 6 | </uni-easyinput> | ||
| 7 | </view> | ||
| 8 | <view class="indexboxre"> | ||
| 9 | <view class="userlist"> | ||
| 10 | <view class="item" v-for="n in list"> | ||
| 11 | <view class="w100"> | ||
| 12 | <view class="status"> | ||
| 13 | <text class="text-success" v-if="n.isCert == '1' ">已发送</text> | ||
| 14 | <text class="text-warning" v-else>未发送</text> | ||
| 15 | </view> | ||
| 16 | <view class="name">{{n.realName}}</view> | ||
| 17 | |||
| 18 | |||
| 19 | <view class="flexbox mtb30"> | ||
| 20 | <view>所属团体 | ||
| 21 | <text>{{n.memName}}</text> | ||
| 22 | </view> | ||
| 23 | <view>会员有效期 | ||
| 24 | <text>{{n.vaildityDate?.slice(0,10)}}</text> | ||
| 25 | </view> | ||
| 26 | <view>级位 | ||
| 27 | <text> | ||
| 28 | {{ szToHz(n.levelNew) }}级 | ||
| 29 | </text> | ||
| 30 | </view> | ||
| 31 | </view> | ||
| 32 | |||
| 33 | <div class="func"> | ||
| 34 | <button @click="sendCert(n)">{{ ['发送证书','更新证书'][n.isCert] }}</button> | ||
| 35 | </div> | ||
| 36 | </view> | ||
| 37 | </view> | ||
| 38 | </view> | ||
| 39 | |||
| 40 | </view> | ||
| 41 | |||
| 42 | </view> | ||
| 43 | </template> | ||
| 44 | |||
| 45 | <script setup> | ||
| 46 | import * as api from '@/common/api.js' | ||
| 47 | import config from '@/config.js' | ||
| 48 | import { | ||
| 49 | ref, | ||
| 50 | getCurrentInstance | ||
| 51 | } from 'vue' | ||
| 52 | import { | ||
| 53 | onLoad | ||
| 54 | } from '@dcloudio/uni-app' | ||
| 55 | const { | ||
| 56 | proxy | ||
| 57 | } = getCurrentInstance() | ||
| 58 | const app = getApp(); | ||
| 59 | const queryParams = ref({}) | ||
| 60 | const list = ref([]) | ||
| 61 | const total = ref(0) | ||
| 62 | const userType = ref('') | ||
| 63 | onLoad((option) => { | ||
| 64 | queryParams.value.examId = option.examId | ||
| 65 | queryParams.value.payId = option.payId | ||
| 66 | queryParams.value.type = option.type | ||
| 67 | getList() | ||
| 68 | }) | ||
| 69 | |||
| 70 | function getList() { | ||
| 71 | uni.showLoading({ | ||
| 72 | title: '加载中' | ||
| 73 | }) | ||
| 74 | api.certStudentList(queryParams.value).then(res => { | ||
| 75 | list.value = res.rows | ||
| 76 | uni.hideLoading() | ||
| 77 | }) | ||
| 78 | } | ||
| 79 | |||
| 80 | function szToHz(num) { | ||
| 81 | const hzArr = ['〇', '一', '二', '三', '四', '五', '六', '七', '八', '九', '十'] | ||
| 82 | return hzArr[parseInt(num)] | ||
| 83 | } | ||
| 84 | |||
| 85 | |||
| 86 | function sendCert(row) { | ||
| 87 | uni.showModal({ | ||
| 88 | title: '提示', | ||
| 89 | content: `确定下发 ${row.realName} 的证书吗`, | ||
| 90 | success: function(res) { | ||
| 91 | if (res.confirm) { | ||
| 92 | const params = [{ | ||
| 93 | id: queryParams.value.payId, | ||
| 94 | children: [{ | ||
| 95 | id: queryParams.value.examId, | ||
| 96 | children: [row.id] | ||
| 97 | }] | ||
| 98 | }] | ||
| 99 | |||
| 100 | api.submitCert(params).then(res => { | ||
| 101 | uni.showToast({ | ||
| 102 | title: `下发成功` | ||
| 103 | }) | ||
| 104 | getList() | ||
| 105 | }) | ||
| 106 | } | ||
| 107 | } | ||
| 108 | }) | ||
| 109 | } | ||
| 110 | |||
| 111 | |||
| 112 | function handleImport() { | ||
| 113 | var arr = [] | ||
| 114 | for (var n of list.value) { | ||
| 115 | if (n.checked) { | ||
| 116 | arr.push(n.perId) | ||
| 117 | } | ||
| 118 | } | ||
| 119 | if (arr.length == 0) { | ||
| 120 | uni.showToast({ | ||
| 121 | title: "请选择会员", | ||
| 122 | icon: "none" | ||
| 123 | }) | ||
| 124 | return | ||
| 125 | } | ||
| 126 | api.addPersonPaymentGroup({ | ||
| 127 | rangeId: queryParams.value.paymentRangeId, | ||
| 128 | personIdArray: arr.join(',') | ||
| 129 | }).then(res => { | ||
| 130 | let path = `/pages/personalVip/renew?rangeId=${res.data.rangeId}` | ||
| 131 | uni.redirectTo({ | ||
| 132 | url: path | ||
| 133 | }); | ||
| 134 | }) | ||
| 135 | } | ||
| 136 | </script> | ||
| 137 | |||
| 138 | <style scoped lang="scss"> | ||
| 139 | .indexboxre { | ||
| 140 | padding: 0 30rpx; | ||
| 141 | |||
| 142 | .tt { | ||
| 143 | font-size: 30rpx; | ||
| 144 | margin: 0 0 30rpx; | ||
| 145 | color: #4C5359; | ||
| 146 | } | ||
| 147 | |||
| 148 | position: relative; | ||
| 149 | height: calc(100vh - 280rpx); | ||
| 150 | overflow: auto; | ||
| 151 | } | ||
| 152 | |||
| 153 | .searchbar { | ||
| 154 | display: flex; | ||
| 155 | align-items: center; | ||
| 156 | padding: 25rpx; | ||
| 157 | box-sizing: border-box; | ||
| 158 | |||
| 159 | :deep(.uni-easyinput .uni-easyinput__content) { | ||
| 160 | border-radius: 35rpx; | ||
| 161 | border: none; | ||
| 162 | height: 70rpx; | ||
| 163 | } | ||
| 164 | |||
| 165 | :deep(.uni-easyinput__content-input) { | ||
| 166 | font-size: 26rpx; | ||
| 167 | } | ||
| 168 | } | ||
| 169 | </style> | ||
| ... | \ No newline at end of file | ... | \ No newline at end of file |
| ... | @@ -2,7 +2,7 @@ | ... | @@ -2,7 +2,7 @@ |
| 2 | <view class="hasfixedbottom"> | 2 | <view class="hasfixedbottom"> |
| 3 | <view class="searchbar"> | 3 | <view class="searchbar"> |
| 4 | <uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search" | 4 | <uni-easyinput placeholderStyle="font-size:30rpx" :input-border="false" prefixIcon="search" |
| 5 | v-model="queryParams.name" placeholder="搜索姓名或证件号码" @blur="getList()" @clear="getList()"> | 5 | v-model="queryParams.name" placeholder="搜索姓名" @blur="getList()" @clear="getList()"> |
| 6 | </uni-easyinput> | 6 | </uni-easyinput> |
| 7 | </view> | 7 | </view> |
| 8 | <view class="indexboxre"> | 8 | <view class="indexboxre"> | ... | ... |
static/btn01.png
0 → 100644
24.5 KB
static/btn02.png
0 → 100644
31.8 KB
static/btn03.png
0 → 100644
27.1 KB
static/btn04.png
0 → 100644
30.1 KB
static/btn05.png
0 → 100644
29.6 KB
static/btn06@2x.png
0 → 100644
30.4 KB
static/btn07@2x.png
0 → 100644
30 KB
static/cg_btn02.png
deleted
100644 → 0
1.52 KB
static/cg_btn03.png
deleted
100644 → 0
1.46 KB
static/cg_btn04.png
deleted
100644 → 0
1.8 KB
static/cg_btn06.png
deleted
100644 → 0
1023 Bytes
static/ditu@2x.png
deleted
100644 → 0
10.3 KB
static/done.png
deleted
100644 → 0
12 KB
static/icon01.png
deleted
100644 → 0
5.93 KB
static/icon02.png
deleted
100644 → 0
5.82 KB
static/icon03.png
deleted
100644 → 0
5.43 KB
| 1 | @font-face {font-family: "iconfont"; | ||
| 2 | src: url('iconfont.eot?t=1587304858380'); /* IE9 */ | ||
| 3 | src: url('iconfont.eot?t=1587304858380#iefix') format('embedded-opentype'), /* IE6-IE8 */ | ||
| 4 | url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAKYAAsAAAAABkQAAAJOAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCCcApQZAE2AiQDCAsGAAQgBYRtBzAbigXIrrApw69IkQJyuEPQxl76g4HoIYL6/dje+w8TiUTRZBoiHqpVEmRaIRRCYrpn8t//uczdiITNQB7LUyNSaIv5v7/lNAN0rMlIMv6eHwo3dzBnwGQPk3M8ZxtLDRi4CKu4hFtT9xqbz3M5vQl0IPMDneNqDtrDFk3qBXQvDqQA98IosjJJvGHsApfwmECtQTWVzdXtPRiWWasCcWu0A8O5tCyzWrVQWXMwixcVqtNTegeew+/Hn04Mk1QUrJaD8xUf5j/ZxeKxhE/IENDxChSYBzJxUlve0ycY16e23G8U7Ksx+FSWfkjs1S/YX2fV14N+qN6T5uq3WktwWxN1AL2jriQ6LvSLqs8PXI9IP2WWb82rj+Ho6f7KTwh8/vG/+MEqQLlFX3EFFQR3W5dz1tTif3VdBh/nNUyWm/WLguq9RIK/ofUcyLphBVNWtVpz0nGWtlq1KAnHW/2N9XSc2hyqR0SrDKQoVBsnMzuPCnUWUKnaCmrNWTtepw3rE7kGs64BQrNXJI3eUGjWIzP7iwqd/lGpOfpQ6yzaLqwzGWZ0g8kR8tE9ReNlqXLCMho17pA+jB3OGiF/QFyaHLYbrWJtjVLiObaUR7ojolBxluAqeI7iOMOcs5A8aQQiebfZVHVvanhZAqM2MOIQxIdcp5DhyaSUP1qMlj6/g2iHYg5u6aspDxBWMtOjtoZWD3LNkfbqu5dXSke0DiEUpLBMAq2CeSQWy6C8fl6IeERDMKKY62raw1RfR2N9V/J1x6CW5U1hzypUnjtpcGgAAA==') format('woff2'), | ||
| 5 | url('iconfont.woff?t=1587304858380') format('woff'), | ||
| 6 | url('iconfont.ttf?t=1587304858380') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */ | ||
| 7 | url('iconfont.svg?t=1587304858380#iconfont') format('svg'); /* iOS 4.1- */ | ||
| 8 | } | ||
| 9 | |||
| 10 | .iconfont { | ||
| 11 | font-family: "iconfont" !important; | ||
| 12 | font-size: 16px; | ||
| 13 | font-style: normal; | ||
| 14 | -webkit-font-smoothing: antialiased; | ||
| 15 | -moz-osx-font-smoothing: grayscale; | ||
| 16 | } | ||
| 17 | |||
| 18 | .icon-fanhui:before { | ||
| 19 | content: "\e65c"; | ||
| 20 | } | ||
| 21 |
No preview for this file type
| 1 | <?xml version="1.0" standalone="no"?> | ||
| 2 | <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > | ||
| 3 | <!-- | ||
| 4 | 2013-9-30: Created. | ||
| 5 | --> | ||
| 6 | <svg> | ||
| 7 | <metadata> | ||
| 8 | Created by iconfont | ||
| 9 | </metadata> | ||
| 10 | <defs> | ||
| 11 | |||
| 12 | <font id="iconfont" horiz-adv-x="1024" > | ||
| 13 | <font-face | ||
| 14 | font-family="iconfont" | ||
| 15 | font-weight="500" | ||
| 16 | font-stretch="normal" | ||
| 17 | units-per-em="1024" | ||
| 18 | ascent="896" | ||
| 19 | descent="-128" | ||
| 20 | /> | ||
| 21 | <missing-glyph /> | ||
| 22 | |||
| 23 | <glyph glyph-name="fanhui" unicode="" d="M349.184 382.976l435.2 432.64c13.824 13.824 13.824 39.424 0 53.76l-13.824 13.824c-13.824 13.824-39.424 13.824-53.76 0L239.616 410.624c-13.824-13.824-13.824-39.424 0-53.76l474.624-472.576c13.824-13.824 39.424-13.824 53.76 0l13.824 13.824c13.824 13.824 13.824 39.424 0 53.76l-432.64 431.104z" horiz-adv-x="1024" /> | ||
| 24 | |||
| 25 | |||
| 26 | |||
| 27 | |||
| 28 | </font> | ||
| 29 | </defs></svg> |
No preview for this file type
No preview for this file type
No preview for this file type
static/navigation.png
deleted
100644 → 0
2.11 KB
static/phone.png
deleted
100644 → 0
1.41 KB
static/switch.png
0 → 100644
473 Bytes
static/top_bg.png
0 → 100644
148 KB
static/user_icon01.png
deleted
100644 → 0
1.91 KB
static/user_icon02.png
deleted
100644 → 0
1.81 KB
static/user_icon03.png
deleted
100644 → 0
1.65 KB
static/user_icon04.png
deleted
100644 → 0
1.9 KB
static/user_icon06.png
deleted
100644 → 0
2.37 KB
static/user_icon07.png
deleted
100644 → 0
1.81 KB
static/v1.png
deleted
100644 → 0
28.2 KB
static/vip.png
deleted
100644 → 0
6.5 KB
static/xf_bg.png
deleted
100644 → 0
9.67 KB
static/zf01.png
deleted
100644 → 0
1.42 KB
static/zf02.png
deleted
100644 → 0
1.03 KB
static/zf03.png
deleted
100644 → 0
2.04 KB
-
Please register or sign in to post a comment