11
108
pageMy/apply/applications.vue
Normal file
@@ -0,0 +1,108 @@
|
||||
<template>
|
||||
<view class="application-body">
|
||||
<view class="application-content" v-if="applicatinList.length!=0">
|
||||
<view class="application-item" v-for="(item,index) in applicatinList" :key="index" @click="goApplyPage(item.type,item.content)">
|
||||
<view class="apply_boldText">{{item.type | type}}</view>
|
||||
<view class="apply_normalText">{{item.applTime}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="noData" v-else>暂无申请信息</view>
|
||||
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {getApplContentList} from '@/api/newIndex.js'
|
||||
import {mapGetters} from 'vuex'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
applicatinList:[],
|
||||
|
||||
}
|
||||
},
|
||||
computed:{
|
||||
...mapGetters(['authInfo','auth'])
|
||||
},
|
||||
onPullDownRefresh() {
|
||||
this.applicatinList=[];
|
||||
this.getList();
|
||||
},
|
||||
filters:{
|
||||
type(type){
|
||||
switch (type){
|
||||
case 1:
|
||||
return '法律咨询';
|
||||
break;
|
||||
case 2:
|
||||
return '技能提升';
|
||||
break;
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getList(){
|
||||
if(this.auth.realNameState){
|
||||
getApplContentList().then(res=>{
|
||||
this.applicatinList=res.data.data.records;
|
||||
uni.stopPullDownRefresh();
|
||||
})
|
||||
}
|
||||
else{
|
||||
this.applicatinList=[];
|
||||
uni.stopPullDownRefresh();
|
||||
}
|
||||
},
|
||||
goApplyPage(type,comment){
|
||||
var data=encodeURIComponent(comment)
|
||||
if(type==1){
|
||||
uni.navigateTo({
|
||||
url:`/pageMy/apply/rights?type=${type}&data=${data}`
|
||||
})
|
||||
}
|
||||
else if(type==2){
|
||||
uni.navigateTo({
|
||||
url:`/pageMy/my/resume/setWskill?type=${type}&data=${data}`
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
},
|
||||
onShow() {
|
||||
this.getList();
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.application-body{
|
||||
width: 690rpx;
|
||||
margin: 20rpx auto;
|
||||
|
||||
}
|
||||
.application-item{
|
||||
width: 100%;
|
||||
height: 120rpx;
|
||||
border-bottom:1px solid #eaeaea;
|
||||
padding: 40rpx 30rpx 0 0rpx;
|
||||
}
|
||||
.apply_boldText{
|
||||
font-size: 32rpx;
|
||||
font-weight: bold;
|
||||
color: #333333;
|
||||
line-height: 36rpx;
|
||||
margin-bottom: 14rpx;
|
||||
}
|
||||
.apply_normalText{
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
color: #CCCCCC;
|
||||
line-height: 36rpx;
|
||||
}
|
||||
.noData{
|
||||
text-align: center;
|
||||
height: 100px;
|
||||
line-height: 100px;
|
||||
}
|
||||
</style>
|
||||
138
pageMy/apply/rights.vue
Normal file
@@ -0,0 +1,138 @@
|
||||
<template>
|
||||
<view>
|
||||
<!-- <apply-template placeholder="请描述你遇到的法律问题" @submit="handel"></apply-template> -->
|
||||
<textarea :auto-height="true" style="padding: 20px;" v-model="inputValue" placeholder="请描述你遇到的法律问题" maxlength="200" placeholder-class="textClass"/>
|
||||
<view class="errTips" v-if="errShow && btnShow">抱歉,您输入的内容已超出字数限制</view>
|
||||
<view class="" v-if="btnShow">
|
||||
<view class="submitBtn" v-if="validate" @click="handleSubmit">提交</view>
|
||||
<view class="submitBtn" v-if="loading">提交中</view>
|
||||
<view class="submitBtn disabledBtn" v-if="!validate">提交</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import {
|
||||
labourUnionDetail
|
||||
|
||||
} from '@/api/federation.js'
|
||||
import {mapGetters} from 'vuex'
|
||||
import {showUniModal} from '@/untils/uniModal.js'
|
||||
import {submitApplication} from '@/api/newIndex.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
inputValue:'',
|
||||
validate:false,
|
||||
applyType:1,
|
||||
btnShow:true,
|
||||
pageTitle:'',
|
||||
placeholder:'',
|
||||
loading:false,
|
||||
errShow:false,
|
||||
submitType:1,//申请类型:1 法律咨询 2技能提升
|
||||
|
||||
}
|
||||
},
|
||||
onShow() {
|
||||
if (!this.$store.state.user.token){
|
||||
//modalTitle, content, whetherCancel, confirmText, pageUrl, cancelUrl
|
||||
showUniModal('提示','您还未登录,点击确认去登录',true,'确定','/pages/login/login','/pages/index/index')
|
||||
}else{
|
||||
if (!this.auth.realNameState) { //未实名需要提示
|
||||
showUniModal('提示', '检查到您还未实名认证,实名认证之后才可加入工会', true, '立即认证', '/pageMy/setUserBase/index','/pages/index/index')
|
||||
} else {
|
||||
labourUnionDetail(this.authInfo.idNumber).then(res => { //判断是否加入工会
|
||||
const data = res.data.data.records;
|
||||
if (data.length == 0) { //未查到数据,代表未加入工会
|
||||
showUniModal('提示', '加入工会后可使用此服务', true, '加入工会', '/pageMy/federation/forMembership/Notice','/pages/index/index')
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
inputValue(value) {
|
||||
if(value.length!=0){
|
||||
this.validate=true;
|
||||
}
|
||||
else{
|
||||
this.validate=false;
|
||||
}
|
||||
if(value.length>=200){
|
||||
this.errShow=true;
|
||||
}
|
||||
else{
|
||||
this.errShow=false;
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
onLoad(option) {
|
||||
this.applyType=option.type;
|
||||
|
||||
if(option.data && option.type){
|
||||
this.inputValue=decodeURIComponent(option.data);
|
||||
this.btnShow=false;
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleSubmit(){
|
||||
this.loading=true;
|
||||
uni.showLoading({
|
||||
title:'请求中'
|
||||
})
|
||||
let uid=this.authInfo.userId;
|
||||
let uname=this.authInfo.realName;
|
||||
let tel=this.authInfo.telphone;
|
||||
submitApplication(uid,uname,tel,this.submitType,this.inputValue).then(res=>{
|
||||
this.loading=false;
|
||||
uni.hideLoading()
|
||||
setTimeout(() => {
|
||||
uni.showToast({
|
||||
title: '提交成功',
|
||||
icon: 'none'
|
||||
});
|
||||
}, 1000)
|
||||
uni.switchTab({
|
||||
url:'/pages/index/index'
|
||||
})
|
||||
})
|
||||
},
|
||||
},
|
||||
computed:{
|
||||
...mapGetters(['authInfo','auth'])
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.textClass{
|
||||
color: #cccccc;
|
||||
}
|
||||
.submitBtn{
|
||||
width: 60%;
|
||||
height: 80rpx;
|
||||
line-height: 80rpx;
|
||||
border-radius: 10px;
|
||||
text-align: center;
|
||||
background-color: #1b66ff;
|
||||
color: #f1f1f1;
|
||||
position: absolute;
|
||||
bottom: 100px;
|
||||
left: 20%;
|
||||
}
|
||||
.disabledBtn{
|
||||
background-color: #7f7f7f;
|
||||
}
|
||||
.teset{
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
border: 1px solid;
|
||||
}
|
||||
.errTips{
|
||||
color: red;
|
||||
padding-left: 40rpx;
|
||||
}
|
||||
</style>
|
||||
59
pageMy/comment/comment.vue
Normal file
@@ -0,0 +1,59 @@
|
||||
<template>
|
||||
<view class="bodys">
|
||||
<block v-if="companyList.length>0" v-for="(item,index) in companyList" :key="item.id">
|
||||
<companyList :companyitem="item" :comment='true' :noApply="false"></companyList>
|
||||
<view class="baddd"></view>
|
||||
</block>
|
||||
<view v-if="companyList.length<=0">
|
||||
<image src="../../static/img/pic_nocom.svg" mode="" class="nothing"></image>
|
||||
<view class="nothingContnt">
|
||||
暂无评价信息
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import companyList from '@/components/companyList/companyList.vue';
|
||||
import testData from '@/common/textdata.js';
|
||||
import {myRate} from '@/api/rate.js';
|
||||
export default {
|
||||
components: { companyList },
|
||||
data() {
|
||||
return {
|
||||
companyList: []
|
||||
}
|
||||
},
|
||||
onShow: function() {
|
||||
myRate().then(res => {
|
||||
this.companyList = res.data.data.records;
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.nothingContnt{
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
margin-top: 30rpx;
|
||||
text-align: center;
|
||||
}
|
||||
.nothing{
|
||||
width: 400rpx;
|
||||
height: 200rpx;
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
margin-top: 50%;
|
||||
}
|
||||
.baddd{
|
||||
background: #f6f6f6;
|
||||
height: 20rpx;
|
||||
}
|
||||
.bodys{background-color: #fefefe;}
|
||||
page{background-color: #fff;}
|
||||
</style>
|
||||
232
pageMy/contract/index.vue
Normal file
@@ -0,0 +1,232 @@
|
||||
<template>
|
||||
<view>
|
||||
<view class="nothing" v-if="ContractList.length === 0">
|
||||
<image src="../../static/img/pic.svg" mode=""></image>
|
||||
<view class="nothingText">
|
||||
暂无合同信息
|
||||
</view>
|
||||
</view>
|
||||
<view class="contractBoxList" v-for="item in ContractList">
|
||||
<view>
|
||||
<view class="title">任务名称:{{item.servicesName}}</view>
|
||||
<view class="time" style="margin: 10px 0;font-weight:500;">合同编号:{{item.contractNo}}</view>
|
||||
<view class="time">合同有效期:{{item.stime | time}} 至 {{item.etime | time}}</view>
|
||||
</view>
|
||||
|
||||
<view class="lookBtn" @click="look(item)">
|
||||
查看合同
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
contractList,
|
||||
viewContract
|
||||
} from '@/api/auth.js'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
ContractList: [],
|
||||
maskShow: false,
|
||||
src: '',
|
||||
current: 1,
|
||||
size: 10,
|
||||
total: 0
|
||||
}
|
||||
},
|
||||
onLoad() {
|
||||
this.initContractList()
|
||||
},
|
||||
filters: {
|
||||
time(date) {
|
||||
var d = date.slice(0, 10)
|
||||
return d.replace(/\//g, "-")
|
||||
}
|
||||
},
|
||||
|
||||
/*页面滚动到底部 换页*/
|
||||
onReachBottom: function() {
|
||||
if (this.ContractList.length >= this.total) {
|
||||
uni.showToast({
|
||||
title: '到底了',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
this.initContractList()
|
||||
},
|
||||
/*下拉刷新*/
|
||||
onPullDownRefresh: function() {
|
||||
this.current = 1
|
||||
this.ContractList = []
|
||||
this.initContractList()
|
||||
},
|
||||
methods: {
|
||||
initContractList() {
|
||||
var params = {
|
||||
size: this.size,
|
||||
current: this.current
|
||||
}
|
||||
contractList(params).then(e => {
|
||||
this.current++
|
||||
this.ContractList = [...this.ContractList, ...e.data.data.records]
|
||||
this.total = e.data.data.total
|
||||
uni.stopPullDownRefresh();
|
||||
}).catch(err => {
|
||||
uni.stopPullDownRefresh();
|
||||
})
|
||||
},
|
||||
look(item) {
|
||||
/*预览合同图片改为预览PDF*/
|
||||
uni.showLoading({
|
||||
title:'请求中',
|
||||
})
|
||||
// #ifdef H5
|
||||
uni.hideLoading()
|
||||
window.open(item.contractSecondUrl);
|
||||
return;
|
||||
// #endif
|
||||
uni.downloadFile({
|
||||
url: item.contractSecondUrl,
|
||||
success: function(res) {
|
||||
var filePath = res.tempFilePath;
|
||||
uni.openDocument({
|
||||
filePath: filePath,
|
||||
success: function(res) {
|
||||
uni.hideLoading()
|
||||
},
|
||||
fail: function() {
|
||||
uni.showToast({
|
||||
title: '打开合同失败,请稍后重试',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
},
|
||||
|
||||
},
|
||||
computed: {
|
||||
imgSrc() {
|
||||
const obj = {
|
||||
'backgroundImage:': `url(${this.src})`,
|
||||
"backgroundColor": 'red'
|
||||
}
|
||||
return obj
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
a {
|
||||
text-decoration: none
|
||||
}
|
||||
|
||||
page {
|
||||
background: #F6F6F6;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.nothingText {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #666666;
|
||||
text-align: center;
|
||||
margin-top: 20rpx;
|
||||
}
|
||||
|
||||
.nothing image {
|
||||
width: 400rpx;
|
||||
height: 200rpx;
|
||||
display: block;
|
||||
padding-top: 50%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.nothing {
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
|
||||
background-color: #fefefe;
|
||||
}
|
||||
|
||||
.contractMask {
|
||||
background-color: #FFFFFF;
|
||||
margin: 30rpx;
|
||||
position: relative;
|
||||
border-radius: 4px;
|
||||
height: 96%;
|
||||
overflow: auto;
|
||||
|
||||
.close {
|
||||
width: 23px;
|
||||
height: 23px;
|
||||
color: #1B66FF;
|
||||
position: fixed;
|
||||
right: 60rpx;
|
||||
top: 60rpx;
|
||||
transform: rotate(45deg);
|
||||
font-size: 40px;
|
||||
}
|
||||
|
||||
.down {
|
||||
position: fixed;
|
||||
bottom: 30px;
|
||||
left: 14%;
|
||||
width: 545rpx;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
text-align: center;
|
||||
background: #1B66FF;
|
||||
font-size: 36rpx;
|
||||
font-weight: 400;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
}
|
||||
|
||||
.contractBoxList {
|
||||
padding: 30rpx 18rpx 26rpx 30rpx;
|
||||
margin-bottom: 20rpx;
|
||||
font-size: 14px;
|
||||
background-color: #FEFEFE;
|
||||
position: relative;
|
||||
|
||||
.title {
|
||||
height: 32rpx;
|
||||
font-size: 32rpx;
|
||||
font-weight: 500;
|
||||
color: #333333;
|
||||
line-height: 32rpx;
|
||||
|
||||
}
|
||||
|
||||
.time {
|
||||
height: 38rpx;
|
||||
font-size: 24rpx;
|
||||
font-weight: 400;
|
||||
color: #999999;
|
||||
line-height: 38rpx;
|
||||
}
|
||||
|
||||
.lookBtn {
|
||||
position: absolute;
|
||||
right: 18rpx;
|
||||
bottom: 34rpx;
|
||||
height: 33rpx;
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
color: #007AFF;
|
||||
line-height: 33rpx;
|
||||
|
||||
}
|
||||
}
|
||||
</style>
|
||||
85
pageMy/federation/forMembership/Notice.vue
Normal file
@@ -0,0 +1,85 @@
|
||||
<template>
|
||||
<view style="height: 100%;">
|
||||
|
||||
<view class="notice">
|
||||
<view class="body">
|
||||
<view>
|
||||
<view class="list" v-for="(item, index) in list" :key="index">
|
||||
{{item}}
|
||||
</view>
|
||||
</view>
|
||||
<view style="height:65rpx;"></view>
|
||||
<view class="nextBtn" @click="go('/pageMy/federation/forMembership/perfectXin')">下一步</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default{
|
||||
data(){
|
||||
return {
|
||||
list: [
|
||||
'1、选举权、被选举权和表决权。',
|
||||
'2、对工会工作监督提出意见和建议。',
|
||||
'3、对用人单位工作提出批评与建议。',
|
||||
'4、在合法权益受到侵犯时,要求工会给予保护。',
|
||||
'5、工会提供的法律服务、就业服务等优惠待遇。',
|
||||
'6、参加关于工会工作和会员关心问题的讨论。'
|
||||
]
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
go(url) {
|
||||
uni.navigateTo({
|
||||
url
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
page{
|
||||
height:100%;
|
||||
background-color: #2354fd;
|
||||
}
|
||||
.notice{
|
||||
width: 100%;
|
||||
height:100%;
|
||||
background: url('../../static/img/federation/notice.png') no-repeat;
|
||||
background-size: contain;
|
||||
margin-top: -50px;
|
||||
position: absolute;
|
||||
}
|
||||
.body{
|
||||
width: 590rpx;
|
||||
height: 711rpx;
|
||||
background: #FFFFFF;
|
||||
border-radius: 10rpx;
|
||||
z-index: 999;
|
||||
position: absolute;
|
||||
top: 534rpx;
|
||||
// bottom: 220rpx;
|
||||
left: 6%;
|
||||
padding: 38rpx;
|
||||
.list{
|
||||
font-size: 30rpx;
|
||||
font-weight: 400;
|
||||
color: #333333;
|
||||
line-height: 55rpx;
|
||||
}
|
||||
.nextBtn{
|
||||
margin: 45rpx 0 0 93rpx;
|
||||
width: 402rpx;
|
||||
height: 80rpx;
|
||||
background: #1B66FF;
|
||||
border-radius: 8rpx;
|
||||
font-size: 30rpx;
|
||||
font-weight: 400;
|
||||
color: #FFFFFF;
|
||||
line-height: 80rpx;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
115
pageMy/federation/forMembership/forBook.vue
Normal file
@@ -0,0 +1,115 @@
|
||||
<template>
|
||||
<view>
|
||||
<view class="bookBox">
|
||||
<view class="title">入会申请书</view>
|
||||
<view class="content">{{content}}</view>
|
||||
<view class="time people">申请人:</view>
|
||||
<view class="time">
|
||||
<view class="day">日期:</view>
|
||||
<view class="year"> 年 <view>月</view> 日</view>
|
||||
</view>
|
||||
</view>
|
||||
<view style="height: 49rpx;"></view>
|
||||
<view class="nextBtn" @click="submit">
|
||||
确定入会
|
||||
</view>
|
||||
|
||||
</view>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {contract} from '@/api/federation.js'
|
||||
export default{
|
||||
data(){
|
||||
return{
|
||||
password: false,
|
||||
maxlength: 6,
|
||||
content: '我自愿加入石家庄新业态职工工会联合会,遵守工会章程,执行工会决议,积极参加工会活动,为把我国建设成为富强、民主、文明的社会主义国家而努力奋斗。'
|
||||
}
|
||||
},
|
||||
|
||||
methods:{
|
||||
submit(){
|
||||
uni.showLoading({
|
||||
title:'请求中'
|
||||
})
|
||||
contract().then(e => {
|
||||
uni.hideLoading()
|
||||
uni.switchTab({
|
||||
url: '/pages/my/my'
|
||||
})
|
||||
})
|
||||
},
|
||||
go(url) {
|
||||
uni.navigateTo({
|
||||
url
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
page{
|
||||
background: #F6F6F6;
|
||||
}
|
||||
.bookBox{
|
||||
width: 630rpx;
|
||||
height: 691rpx;
|
||||
background: #FFFFFF;
|
||||
margin: 53rpx 30rpx;
|
||||
padding: 60rpx 30rpx 0 30rpx;
|
||||
position: relative;
|
||||
.title{
|
||||
font-size: 40rpx;
|
||||
font-weight: 500;
|
||||
color: #333333;
|
||||
line-height: 56rpx;
|
||||
text-align: center;
|
||||
margin-bottom: 47rpx;
|
||||
}
|
||||
.content{
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
color: #333333;
|
||||
line-height: 50rpx;
|
||||
text-indent:2em;
|
||||
}
|
||||
.people{
|
||||
position: absolute;
|
||||
bottom: 203rpx;
|
||||
right: 223rpx;
|
||||
}
|
||||
.time{
|
||||
font-size: 32rpx;
|
||||
font-weight: 500;
|
||||
color: #333333;
|
||||
line-height: 45rpx;
|
||||
.day{
|
||||
position: absolute;
|
||||
bottom: 128rpx;
|
||||
right: 255rpx;
|
||||
}
|
||||
.year{
|
||||
width: 192rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
position: absolute;
|
||||
bottom: 128rpx;
|
||||
right: 30rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
.nextBtn{
|
||||
margin: 50rpx 30rpx;
|
||||
height: 80rpx;
|
||||
background: #1B66FF;
|
||||
border-radius: 8rpx;
|
||||
font-size: 30rpx;
|
||||
font-weight: 400;
|
||||
color: #FFFFFF;
|
||||
line-height: 80rpx;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
101
pageMy/federation/forMembership/password.vue
Normal file
@@ -0,0 +1,101 @@
|
||||
<template>
|
||||
<view class="codeSealBox">
|
||||
<!-- #ifdef H5 || APP-PLUS -->
|
||||
<view class="closeCode" @click="closeShowCode" style="top: 124rpx;">+</view>
|
||||
<!-- #endif -->
|
||||
<!-- #ifdef MP-WEIXIN -->
|
||||
<view class="closeCode" @click="closeShowCode">+</view>
|
||||
<!-- #endif -->
|
||||
<view class="title">
|
||||
<view class="name">签名密码</view>
|
||||
<view class="tip">6位数字签名密码</view>
|
||||
</view>
|
||||
<view style="height: 36px;"></view>
|
||||
<valid-code ref="validCode" @finish="getInpCode" :maxlength="maxlength"></valid-code>
|
||||
<view style="height: 36px;"></view>
|
||||
<view class="forget" @click="forget">忘记密码?</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import validCode from '@/components/p-valid-code/p-valid-code.vue'
|
||||
import {contract} from '@/api/federation.js'
|
||||
export default {
|
||||
data () {
|
||||
return {
|
||||
maxlength: 6
|
||||
}
|
||||
},
|
||||
components: {validCode},
|
||||
methods:{
|
||||
closeShowCode () {
|
||||
uni.navigateBack()
|
||||
},
|
||||
getInpCode (e){
|
||||
var params = {
|
||||
password: e
|
||||
}
|
||||
uni.showLoading({
|
||||
title:'请求中'
|
||||
})
|
||||
contract(params).then(e => {
|
||||
uni.hideLoading()
|
||||
uni.switchTab({
|
||||
url: '/pages/my/my'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 忘记密码
|
||||
forget(){
|
||||
uni.navigateTo({
|
||||
url: `/pageMy/setUserBase/seal/forget?`
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.codeSealBox{
|
||||
padding: 285rpx 72rpx 0 72rpx;
|
||||
.closeCode{
|
||||
position: absolute;
|
||||
right: 30rpx;
|
||||
top: 120rpx;
|
||||
color: #1B66FF;
|
||||
transform: rotate(45deg);
|
||||
font-size: 40px;
|
||||
}
|
||||
.title{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.name{
|
||||
height: 46rpx;
|
||||
font-size: 46rpx;
|
||||
font-family: PingFangSC-Medium, PingFang SC;
|
||||
font-weight: 500;
|
||||
color: #333333;
|
||||
line-height: 46rpx;
|
||||
margin-right: 28rpx;
|
||||
}
|
||||
.tip{
|
||||
height: 38rpx;
|
||||
font-size: 28rpx;
|
||||
font-family: PingFangSC-Regular, PingFang SC;
|
||||
font-weight: 400;
|
||||
color: #999999;
|
||||
line-height: 38rpx;
|
||||
}
|
||||
.forget{
|
||||
height: 38rpx;
|
||||
font-size: 28rpx;
|
||||
font-family: PingFangSC-Regular, PingFang SC;
|
||||
font-weight: 400;
|
||||
color: #5AA0FA;
|
||||
line-height: 38rpx;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
}
|
||||
</style>
|
||||
170
pageMy/federation/forMembership/payment.vue
Normal file
@@ -0,0 +1,170 @@
|
||||
<template>
|
||||
<view class="">
|
||||
<view class="paymentList">
|
||||
<view class="title">支付方式</view>
|
||||
<view style="height: 45rpx;"></view>
|
||||
<view class="payment" :class="{'active': jianhangValue}" @click="jianhangchange">
|
||||
<view style="display: flex;align-items: center;">
|
||||
<image class="img" v-if="jianhangValue" src="../../static/img/federation/jiansheyinhanglan.png" ></image>
|
||||
<image class="img" v-else src="../../static/img/federation/jiansheyinhanghui.png"></image>
|
||||
<view class="name">建行卡号支付</view>
|
||||
<view class="price">手续费0.00元</view>
|
||||
</view>
|
||||
<checkbox :checked="jianhangValue" style="transform:scale(0.8)"/>
|
||||
</view>
|
||||
<view style="height: 45rpx;"></view>
|
||||
<view class="payment" :class="{'active': yinlianValue}" @click="yinlianchange">
|
||||
<view style="display: flex;align-items: center;">
|
||||
<image class="img" v-if="yinlianValue" src="../../static/img/federation/yilianlan.png" ></image>
|
||||
<image class="img" v-else src="../../static/img/federation/yinlianhui.png"></image>
|
||||
<view class="name">银联支付</view>
|
||||
<view class="price">手续费0.00元</view>
|
||||
</view>
|
||||
<checkbox :checked="yinlianValue" style="transform:scale(0.8)"/>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="paymentPrice">
|
||||
<view class="title">结算信息</view>
|
||||
<view class="bodyPrice">
|
||||
<view class="price"><view style="font-size: 46rpx;height: 20px;">¥</view>20.00</view>
|
||||
<view class="tip">应付费用</view>
|
||||
</view>
|
||||
<view class="bottomPrice">
|
||||
<view class="priceBox">
|
||||
<view>缴费金额</view>
|
||||
<view>¥ 20.00 元</view>
|
||||
</view>
|
||||
<view class="priceBox">
|
||||
<view>支付手续费</view>
|
||||
<view>¥ 0.00 元</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view class="nextBtn" @click="payment">
|
||||
确认支付
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default{
|
||||
data (){
|
||||
return {
|
||||
jianhangValue: false,
|
||||
yinlianValue: false,
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
jianhangchange (){
|
||||
this.yinlianValue = false
|
||||
this.jianhangValue = !this.jianhangValue
|
||||
},
|
||||
yinlianchange (){
|
||||
this.jianhangValue = false
|
||||
this.yinlianValue = !this.jianhangValue
|
||||
},
|
||||
payment (){
|
||||
console.log('支付')
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
page{
|
||||
background: #F6F6F6;;
|
||||
}
|
||||
.paymentPrice{
|
||||
width: 690rpx;
|
||||
height: 469rpx;
|
||||
background: #FFFFFF;
|
||||
margin: 0 30rpx;
|
||||
.title{
|
||||
font-size: 32rpx;
|
||||
font-weight: 500;
|
||||
color: #333333;
|
||||
padding: 30rpx 0 0 30rpx;
|
||||
}
|
||||
.bodyPrice{
|
||||
display: flex;
|
||||
flex-flow: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 205rpx;
|
||||
.price{
|
||||
font-size: 73rpx;
|
||||
font-weight: normal;
|
||||
color: #333333;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.tip{
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
.bottomPrice{
|
||||
border-top: 1px solid #E8E8E8;
|
||||
padding: 30rpx;
|
||||
font-size: 30rpx;
|
||||
font-weight: 400;
|
||||
color: #999999;
|
||||
.priceBox{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
line-height: 36px;
|
||||
}
|
||||
}
|
||||
}
|
||||
.paymentList{
|
||||
width: 630rpx;
|
||||
height: 319rpx;
|
||||
background: #FFFFFF;
|
||||
margin:30rpx;
|
||||
padding: 0 30rpx;
|
||||
.title{
|
||||
font-size: 32rpx;
|
||||
font-weight: 500;
|
||||
color: #333333;
|
||||
border-bottom: 1px solid #E8E8E8;
|
||||
padding: 15px 0 10px 0;
|
||||
}
|
||||
.payment{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
.img{
|
||||
width: 50rpx;height: 50rpx;
|
||||
}
|
||||
.name{
|
||||
font-size: 28rpx;
|
||||
font-weight: 500;
|
||||
color: #999999;
|
||||
width: 170rpx;
|
||||
margin: 0 20rpx;
|
||||
}
|
||||
.price{
|
||||
font-size: 22rpx;
|
||||
font-weight: 400;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
.active{
|
||||
color: #1B66FF !important;
|
||||
}
|
||||
}
|
||||
.nextBtn{
|
||||
margin: 50rpx 30rpx;
|
||||
height: 80rpx;
|
||||
background: #1B66FF;
|
||||
border-radius: 8rpx;
|
||||
font-size: 30rpx;
|
||||
font-weight: 400;
|
||||
color: #FFFFFF;
|
||||
line-height: 80rpx;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
264
pageMy/federation/forMembership/perfectXin.vue
Normal file
@@ -0,0 +1,264 @@
|
||||
<template>
|
||||
<view >
|
||||
<view class="vip">
|
||||
<view class="body">
|
||||
<view class="name">
|
||||
<view class="">
|
||||
姓名:{{authInfo.realName}}
|
||||
</view>
|
||||
<view class="Gender">
|
||||
性别:{{authInfo.sex | sex}}
|
||||
</view>
|
||||
</view>
|
||||
<view class="idcard">
|
||||
身份证号:{{authInfo.idNumber}}
|
||||
</view>
|
||||
<view class="">
|
||||
手机号码:{{authInfo.telphone}}
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="status" class="informationWrap">
|
||||
<view class="informationBox">
|
||||
<view class="title">民族</view>
|
||||
<view class="btn btnGray">
|
||||
<view style="margin-right:23rpx;">{{authInfo.nation}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="informationBox">
|
||||
<view class="title">政治面貌</view>
|
||||
<view class="btn btnGray">
|
||||
<view style="margin-right:23rpx;">{{authInfo.politics}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-else class="informationWrap">
|
||||
<picker @change="nationPickerChange" :value="nationIndex" :range="nation" range-key="name">
|
||||
<view class="informationBox">
|
||||
<view class="title">民族</view>
|
||||
<view class="btn">
|
||||
<view v-if="nationStatus" style="margin-right:23rpx;">{{nation[nationIndex].name}}</view>
|
||||
<view v-else style="margin-right:23rpx;">请选择</view>
|
||||
<image src="../../../static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
</view>
|
||||
</picker>
|
||||
<picker @change="politicsPickerChange" :value="politicsIndex" :range="politics" range-key="name">
|
||||
<view class="informationBox">
|
||||
<view class="title">政治面貌</view>
|
||||
<view class="btn">
|
||||
<view v-if="politicsStatus" style="margin-right:23rpx;">{{politics[politicsIndex].name}}</view>
|
||||
<view v-else style="margin-right:23rpx;">请选择</view>
|
||||
<image src="../../../static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
</view>
|
||||
</picker>
|
||||
</view>
|
||||
<view class="tips">
|
||||
注:确定后不可更改
|
||||
</view>
|
||||
|
||||
<view class="checkbox" :class="{'active': checkedValue}" @click="change">
|
||||
<img v-if="checkedValue" src="../../static/img/federation/checkOk.png" alt="" style="width: 30rpx;height:30rpx;margin-right:12rpx;">
|
||||
<view v-else class="checkBoxView"></view>
|
||||
我申请加入石家庄新业态职工工会联合会
|
||||
</view>
|
||||
|
||||
<view class="nextBtn" :class="{'nextBtnActive': checkedValue}" @click="submit">
|
||||
下一步
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import nationPolitics from '@/common/nationPolitics.js'
|
||||
import {setInfo} from '@/api/federation.js'
|
||||
import {
|
||||
mapGetters
|
||||
} from 'vuex'
|
||||
export default{
|
||||
data () {
|
||||
return {
|
||||
nation: nationPolitics.nation,
|
||||
politics: nationPolitics.politics,
|
||||
checkedValue: false,
|
||||
nationStatus: false,
|
||||
politicsStatus: false,
|
||||
status: false,
|
||||
nationIndex: 0,
|
||||
politicsIndex: 0,
|
||||
}
|
||||
},
|
||||
filters:{
|
||||
sex(number){
|
||||
if (number === 1) {
|
||||
return '男'
|
||||
} else
|
||||
if (number === 2) {
|
||||
return '女'
|
||||
}
|
||||
}
|
||||
},
|
||||
onShow() {
|
||||
var that = this
|
||||
this.$store.dispatch('refreshAuthState').then(e => {
|
||||
if(that.authInfo.nation && that.authInfo.politics) {
|
||||
that.status = true
|
||||
that.nationStatus = true
|
||||
that.politicsStatus = true
|
||||
that.checkedValue = true
|
||||
}
|
||||
})
|
||||
},
|
||||
methods:{
|
||||
submit(){
|
||||
if(!this.checkedValue) {
|
||||
uni.showToast({
|
||||
title: '请先勾选申请加入石家庄新业态职工工会联合会',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
if (!this.nationStatus || !this.politicsStatus) {
|
||||
uni.showToast({
|
||||
title: '请先填写完整信息',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
if(this.status) {
|
||||
this.go('/pageMy/federation/forMembership/forBook')
|
||||
return
|
||||
}
|
||||
var params = {
|
||||
nation: this.nation[this.nationIndex].name,
|
||||
politics: this.politics[this.politicsIndex].name
|
||||
}
|
||||
setInfo(params).then(res =>{
|
||||
this.go('/pageMy/federation/forMembership/forBook')
|
||||
})
|
||||
},
|
||||
nationPickerChange(e){
|
||||
this.nationStatus = true
|
||||
this.nationIndex = e.target.value
|
||||
},
|
||||
politicsPickerChange(e){
|
||||
this.politicsStatus = true
|
||||
this.politicsIndex = e.target.value
|
||||
},
|
||||
change(){
|
||||
this.checkedValue = !this.checkedValue
|
||||
},
|
||||
go(url) {
|
||||
uni.navigateTo({
|
||||
url
|
||||
})
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(['auth', 'authInfo'])
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.active{
|
||||
color: #333333 !important;
|
||||
}
|
||||
.nextBtnActive{
|
||||
opacity: 1 !important;
|
||||
}
|
||||
.nextBtn{
|
||||
margin: 50rpx 30rpx;
|
||||
height: 80rpx;
|
||||
background: #1B66FF;
|
||||
opacity: 0.5;
|
||||
border-radius: 8rpx;
|
||||
font-size: 30rpx;
|
||||
font-weight: 400;
|
||||
color: #FFFFFF;
|
||||
line-height: 80rpx;
|
||||
text-align: center;
|
||||
}
|
||||
.checkbox{
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
color: #999999;
|
||||
margin: 0 30rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.checkBoxView{
|
||||
width: 26rpx;
|
||||
height: 26rpx;
|
||||
border-radius: 50%;
|
||||
border: 2rpx solid #999999;
|
||||
margin-right:12rpx;
|
||||
}
|
||||
}
|
||||
.tips{
|
||||
font-size: 26rpx;
|
||||
font-weight: 400;
|
||||
color: #1B66FF;
|
||||
line-height: 46rpx;
|
||||
margin: 60rpx 0 20rpx 30rpx;
|
||||
}
|
||||
|
||||
.informationWrap{
|
||||
padding: 0 30rpx;
|
||||
.informationBox{
|
||||
height: 32rpx;
|
||||
background: #FEFEFE;
|
||||
padding: 64rpx 0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
border-bottom:1px solid #F2F2F2;
|
||||
.title{
|
||||
font-size: 32rpx;
|
||||
font-weight: 400;
|
||||
color: #333333;
|
||||
}
|
||||
.btn{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
color: #1B66FF;
|
||||
image {
|
||||
width: 19rpx;
|
||||
height: 32rpx;
|
||||
margin-top: 4rpx;
|
||||
}
|
||||
}
|
||||
.btnGray{
|
||||
color: #999999 !important;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.vip{
|
||||
height: 138px;
|
||||
margin: 20rpx;
|
||||
background: url('../../static/img/federation/icon.png') no-repeat;
|
||||
background-size: cover;
|
||||
font-size: 32rpx;
|
||||
font-weight: 400;
|
||||
color: #FFFFFF;
|
||||
.body{
|
||||
padding: 59rpx 49rpx;
|
||||
.name{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.Gender{
|
||||
margin-right: 30px;
|
||||
}
|
||||
.idcard{
|
||||
margin: 20rpx 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
</style>
|
||||
167
pageMy/federation/vip/information.vue
Normal file
@@ -0,0 +1,167 @@
|
||||
<template>
|
||||
<view class="informationWrap">
|
||||
<view class="informationBox">
|
||||
<view class="title">会员编号</view>
|
||||
<view class="content">{{labourUnion.no}}</view>
|
||||
</view>
|
||||
<view class="informationBox">
|
||||
<view class="title">入会日期</view>
|
||||
<view class="content">{{dateFormat(labourUnion.createTime)}}</view>
|
||||
</view>
|
||||
<view class="informationBox">
|
||||
<view class="title">入会申请书</view>
|
||||
<view class="lookbtn" @click="status(true)">
|
||||
<view>查看</view>
|
||||
<image src="../../../static/img/right.svg" mode="" style="width: 19rpx;height: 32rpx;margin-left: 20rpx;margin-top: 4rpx;"></image>
|
||||
</view>
|
||||
</view>
|
||||
<uniMask :maskShow="maskShow">
|
||||
<view class="informationMask">
|
||||
<view class="close" @click="status(false)">+</view>
|
||||
<view class="bookBox">
|
||||
<view class="title">入会申请书</view>
|
||||
<view class="content">{{content}}</view>
|
||||
<view class="time people">申请人:{{authInfo.realName}}</view>
|
||||
<view class="time dayYear">
|
||||
<view class="">日期:<i></i></view>
|
||||
<view class="">{{dateFormat(labourUnion.createTime, 'yyyy年MM月dd日')}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- <image :src="labourUnion.contractUrl" class="img"></image> -->
|
||||
</view>
|
||||
</uniMask>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
mapGetters
|
||||
} from 'vuex'
|
||||
import uniMask from '@/components/uni-mask/mask.vue'
|
||||
import {labourUnionInfo} from '@/api/federation.js'
|
||||
import {dateFormat} from '@/untils/format.js'
|
||||
export default{
|
||||
data(){
|
||||
return {
|
||||
maskShow: false,
|
||||
labourUnion: {},
|
||||
content: '我自愿加入石家庄新业态职工工会联合会,遵守工会章程,执行工会决议,积极参加工会活动,为把我国建设成为富强、民主、文明的社会主义国家而努力奋斗。'
|
||||
}
|
||||
},
|
||||
components:{uniMask},
|
||||
onLoad() {
|
||||
this.labourUnionInfoInit()
|
||||
},
|
||||
methods: {
|
||||
dateFormat,
|
||||
status(status){
|
||||
this.maskShow = status
|
||||
},
|
||||
labourUnionInfoInit(){
|
||||
labourUnionInfo().then(e=>{
|
||||
this.labourUnion = e.data.data
|
||||
})
|
||||
},
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(['authInfo'])
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.bookBox{
|
||||
height: 691rpx;
|
||||
background: #FFFFFF;
|
||||
margin: 53rpx 30rpx;
|
||||
padding: 60rpx 30rpx 0 30rpx;
|
||||
position: relative;
|
||||
.title{
|
||||
font-size: 40rpx;
|
||||
font-weight: 500;
|
||||
color: #333333;
|
||||
line-height: 56rpx;
|
||||
text-align: center;
|
||||
margin-bottom: 47rpx;
|
||||
}
|
||||
.content{
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
color: #333333;
|
||||
line-height: 50rpx;
|
||||
text-indent:2em;
|
||||
}
|
||||
.people{
|
||||
position: absolute;
|
||||
bottom: 203rpx;
|
||||
left: 250rpx;
|
||||
}
|
||||
.dayYear{
|
||||
position: absolute;
|
||||
bottom: 128rpx;
|
||||
left: 250rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
.time{
|
||||
font-size: 32rpx;
|
||||
font-weight: 500;
|
||||
color: #333333;
|
||||
line-height: 45rpx;
|
||||
}
|
||||
}
|
||||
.informationMask{
|
||||
width: 690rpx;
|
||||
// height: 750rpx;
|
||||
background: #FFFFFF;
|
||||
border-radius: 4rpx;
|
||||
margin: 0 auto;
|
||||
margin-top: 30%;
|
||||
position: relative;
|
||||
.close{
|
||||
width: 23px;
|
||||
height: 23px;
|
||||
color: #1B66FF;
|
||||
position: fixed;
|
||||
right: 60rpx;
|
||||
transform: rotate(45deg);
|
||||
font-size: 40px;
|
||||
z-index: 9999;
|
||||
}
|
||||
.img{
|
||||
width: 690rpx;
|
||||
height: 1040rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.informationWrap{
|
||||
padding: 0 30rpx;
|
||||
}
|
||||
.informationBox{
|
||||
height: 32rpx;
|
||||
background: #FEFEFE;
|
||||
padding: 64rpx 0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
border-bottom:1px solid #F2F2F2;
|
||||
}
|
||||
.title{
|
||||
height: 36rpx;
|
||||
font-size: 32rpx;
|
||||
font-weight: 400;
|
||||
color: #333333;
|
||||
}
|
||||
.content{
|
||||
height: 32rpx;
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
color: #999999;
|
||||
}
|
||||
.lookbtn{
|
||||
display: flex;
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
color: #1B66FF;
|
||||
}
|
||||
</style>
|
||||
18
pageMy/help/authentication.vue
Normal file
@@ -0,0 +1,18 @@
|
||||
<template>
|
||||
<view>
|
||||
<image class="img" src="../static/img/help/auth.jpg"></image>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
</script>
|
||||
|
||||
<style>
|
||||
page{
|
||||
background-color: #1B66FF;
|
||||
}
|
||||
.img{
|
||||
width: 100%;
|
||||
height: 1379rpx;
|
||||
}
|
||||
</style>
|
||||
51
pageMy/help/help.vue
Normal file
@@ -0,0 +1,51 @@
|
||||
<template>
|
||||
<view class="body">
|
||||
<view class="helpList" @click="go('./passWord')">
|
||||
如何修改密码?
|
||||
</view>
|
||||
<view class="helpList" @click="go('./phone')">
|
||||
如何修改手机号?
|
||||
</view>
|
||||
<view class="helpList" @click="go('./userInfo')">
|
||||
个人如何完善信息?
|
||||
</view>
|
||||
<view class="helpList" @click="go('./authentication')">
|
||||
实名认证时提示认证信息不匹配
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
go(url){
|
||||
uni.navigateTo({
|
||||
url
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.helpList{
|
||||
padding: 30rpx;
|
||||
padding-left: 0;
|
||||
border-bottom: 1rpx solid #ddd;
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 30rpx;
|
||||
color: #333333;
|
||||
padding: 30rpx 0;
|
||||
}
|
||||
.body{
|
||||
background-color: #fefefe;
|
||||
margin-top: 20rpx;
|
||||
padding-left: 30rpx;
|
||||
}
|
||||
page{background-color: #f6f6f6;}
|
||||
</style>
|
||||
18
pageMy/help/passWord.vue
Normal file
@@ -0,0 +1,18 @@
|
||||
<template>
|
||||
<view>
|
||||
<image class="img" src="../static/img/help/password.jpg"></image>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
</script>
|
||||
|
||||
<style>
|
||||
page{
|
||||
background-color: #1B66FF;
|
||||
}
|
||||
.img{
|
||||
width: 100%;
|
||||
height: 1960rpx;
|
||||
}
|
||||
</style>
|
||||
18
pageMy/help/phone.vue
Normal file
@@ -0,0 +1,18 @@
|
||||
<template>
|
||||
<view>
|
||||
<image class="img" src="../static/img/help/phone.jpg"></image>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
</script>
|
||||
|
||||
<style>
|
||||
page{
|
||||
background-color: #1B66FF;
|
||||
}
|
||||
.img{
|
||||
width: 100%;
|
||||
height: 1379rpx;
|
||||
}
|
||||
</style>
|
||||
32
pageMy/help/questions/questionDetail.vue
Normal file
@@ -0,0 +1,32 @@
|
||||
<template>
|
||||
<view class="question-detail" v-html="text">
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {questionDetail} from '@/api/newIndex.js'
|
||||
export default {
|
||||
onLoad(option) {
|
||||
if(option.id){
|
||||
questionDetail(option.id).then(res => {
|
||||
this.text=res.data.data.records[0].content
|
||||
})
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
text:''
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.question-detail{
|
||||
width: 690rpx;
|
||||
height: auto;
|
||||
margin: 0 auto;
|
||||
padding-top: 6rpx;
|
||||
overflow: auto;
|
||||
}
|
||||
</style>
|
||||
145
pageMy/help/questions/questions.vue
Normal file
@@ -0,0 +1,145 @@
|
||||
<template>
|
||||
<view class="question-body">
|
||||
<view class="nothing" v-if="questionList.length === 0">
|
||||
<image src="/static/img/pic.svg" mode=""></image>
|
||||
<view class="nothingText">
|
||||
暂无常见问题
|
||||
</view>
|
||||
</view>
|
||||
<view class="questionItem" v-for="(item,index) in questionList" :key="index" @click="goQuestionDetail(item.id)">
|
||||
<view class="questionTitle">
|
||||
{{item.title}}
|
||||
</view>
|
||||
<view class="">
|
||||
<image src="/static/img/right.svg" mode="" style="width: 19rpx;height: 32rpx;"></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {getQuestionList} from '@/api/newIndex.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
questionList:[],
|
||||
current: 1,
|
||||
size: 20,
|
||||
total: 0
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.initQuestionList()
|
||||
},
|
||||
methods: {
|
||||
/*页面滚动到底部 换页*/
|
||||
onReachBottom: function() {
|
||||
if (this.questionList.length >= this.total) {
|
||||
uni.showToast({
|
||||
title: '到底了',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
this.initQuestionList()
|
||||
},
|
||||
/*下拉刷新*/
|
||||
onPullDownRefresh: function() {
|
||||
this.current = 1
|
||||
this.questionList = []
|
||||
this.initQuestionList()
|
||||
},
|
||||
goQuestionDetail(data){
|
||||
|
||||
uni.navigateTo({
|
||||
url:`/pageMy/help/questions/questionDetail?id=${data}`
|
||||
})
|
||||
},
|
||||
initQuestionList(){
|
||||
uni.showLoading({
|
||||
title:'请求中'
|
||||
})
|
||||
getQuestionList(
|
||||
"",
|
||||
"",
|
||||
"",
|
||||
this.current,
|
||||
this.size
|
||||
).then(e=>{
|
||||
this.current++
|
||||
this.questionList = [...this.questionList, ...e.data.data.records]
|
||||
this.total = e.data.data.total
|
||||
uni.hideLoading()
|
||||
uni.stopPullDownRefresh();
|
||||
}).catch(err => {
|
||||
uni.hideLoading()
|
||||
uni.stopPullDownRefresh();
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.nothingText {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #666666;
|
||||
text-align: center;
|
||||
margin-top: 20rpx;
|
||||
}
|
||||
|
||||
.nothing image {
|
||||
width: 400rpx;
|
||||
height: 200rpx;
|
||||
display: block;
|
||||
padding-top: 50%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.nothing {
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
|
||||
background-color: #fefefe;
|
||||
}
|
||||
.questionItem{
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
height: 110rpx;
|
||||
line-height: 110rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.question-body{
|
||||
background-color: #fefefe;
|
||||
margin-top: 20rpx;
|
||||
padding:0 30rpx;
|
||||
}
|
||||
.questionTitle{
|
||||
color: #333333;
|
||||
}
|
||||
.questionContent{
|
||||
display: flex;
|
||||
justify-content: start;
|
||||
align-items: center;
|
||||
font-size: 26rpx;
|
||||
}
|
||||
.contentText{
|
||||
color: #7F7F7F;
|
||||
width: 600rpx;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
.toQuestionDetail{
|
||||
color: #02A7F0;
|
||||
cursor: pointer;
|
||||
width: 60rpx;
|
||||
text-align: center;
|
||||
|
||||
}
|
||||
page{background-color: #f6f6f6;}
|
||||
</style>
|
||||
18
pageMy/help/userInfo.vue
Normal file
@@ -0,0 +1,18 @@
|
||||
<template>
|
||||
<view>
|
||||
<image class="img" src="../static/img/help/userInfo.jpg"></image>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
</script>
|
||||
|
||||
<style>
|
||||
page{
|
||||
background-color: #1B66FF;
|
||||
}
|
||||
.img{
|
||||
width: 100%;
|
||||
height: 1379rpx;
|
||||
}
|
||||
</style>
|
||||
107
pageMy/my/changePassword.vue
Normal file
@@ -0,0 +1,107 @@
|
||||
<template>
|
||||
<view class="change-password-body">
|
||||
<view class="nothing" style="height: 200rpx;"></view>
|
||||
<jl-input type="text" v-model="oldPassword" placeholder="请输入旧密码" showPassword clearable></jl-input>
|
||||
<jl-input type="text" v-model="newPassword" placeholder="设置长度6至20位的密码" showPassword clearable></jl-input>
|
||||
<jl-input type="text" v-model="newPassword1" placeholder="请重新输入新密码" showPassword clearable></jl-input>
|
||||
<view class="btn" v-if='loading'>
|
||||
正在修改...
|
||||
</view>
|
||||
<view class="btn" v-else-if="validate" @click="submit">
|
||||
确认修改
|
||||
</view>
|
||||
<view class="btn nocheck" v-else>
|
||||
确认修改
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
changePassword
|
||||
} from '@/api/changePassword.js'
|
||||
import {
|
||||
password
|
||||
} from '@/untils/validate.js'
|
||||
import jlInput from '@/components/jl-input/main.vue'
|
||||
import md5 from 'js-md5'
|
||||
|
||||
const resendTime = 120
|
||||
export default {
|
||||
components: {
|
||||
jlInput
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
oldPassword: '',
|
||||
newPassword: '',
|
||||
newPassword1: ''
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
submit() {
|
||||
if(password(this.newPassword)) {
|
||||
uni.showToast({
|
||||
title: '请设置长度6至20位的密码',
|
||||
icon: 'none'
|
||||
});
|
||||
return
|
||||
}
|
||||
if (this.newPassword1 !== this.newPassword) {
|
||||
uni.showToast({
|
||||
title: '两次输入的新密码不一致',
|
||||
icon: 'none'
|
||||
});
|
||||
return
|
||||
}
|
||||
this.loading = true
|
||||
changePassword(md5(this.oldPassword), md5(this.newPassword), md5(this.newPassword1)).then(() => {
|
||||
uni.navigateBack();
|
||||
uni.showToast({
|
||||
title: '操作成功',
|
||||
icon: 'none'
|
||||
});
|
||||
}).catch(() => {
|
||||
this.loading = false
|
||||
})
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
validate() {
|
||||
return this.newPassword && this.oldPassword && this.newPassword1
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.phoneDel {
|
||||
margin-left: auto !important;
|
||||
}
|
||||
|
||||
.nocheck {
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.btn {
|
||||
margin: 0 auto;
|
||||
margin-top: 50rpx;
|
||||
background-color: #1B66FF;
|
||||
color: #fefefe;
|
||||
border-radius: 10rpx;
|
||||
text-align: center;
|
||||
font-size: 32rpx;
|
||||
height: 80rpx;
|
||||
line-height: 80rpx;
|
||||
}
|
||||
|
||||
page {
|
||||
background-color: #fefefe;
|
||||
}
|
||||
|
||||
.change-password-body{
|
||||
width: 80%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
</style>
|
||||
155
pageMy/my/changePhone.vue
Normal file
@@ -0,0 +1,155 @@
|
||||
<template>
|
||||
<view class="change-phone-body">
|
||||
<view class="nothing" style="height: 200rpx;"></view>
|
||||
<jl-input type="text" v-model="password" placeholder="请输入登录密码" showPassword clearable></jl-input>
|
||||
<jl-input type="number" v-model="phone" placeholder="请输入新手机号"></jl-input>
|
||||
<jl-input type="text" v-model="sms" placeholder="请输入验证码">
|
||||
<view v-if="isMobile(phone) && password" class="code" @click="getCode">{{ code }}</view>
|
||||
<view v-else class="code nocheck">{{ code }}</view>
|
||||
</jl-input>
|
||||
<view class="btn nocheck" v-if='loading'>
|
||||
正在变更...
|
||||
</view>
|
||||
<view class="btn" v-else-if='sms && isMobile(phone) && password' @click="submit">
|
||||
确认变更
|
||||
</view>
|
||||
<view class="btn nocheck" v-else>
|
||||
确认变更
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
changePhone,
|
||||
sendValidate
|
||||
} from '@/api/changePhone.js'
|
||||
import {
|
||||
isMobile
|
||||
} from '@/untils/validate.js'
|
||||
import jlInput from '@/components/jl-input/main.vue'
|
||||
import md5 from 'js-md5'
|
||||
|
||||
const resendTime = 120
|
||||
export default {
|
||||
components: {
|
||||
jlInput
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
pastype: 'text',
|
||||
code: '获取验证码',
|
||||
password: '',
|
||||
phone: '',
|
||||
sms: ''
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
changePasType: function() {
|
||||
var pastype = this.pastype;
|
||||
if (pastype == 'password') {
|
||||
this.pastype = 'text';
|
||||
} else {
|
||||
this.pastype = 'password'
|
||||
}
|
||||
},
|
||||
delpho: function(e) {
|
||||
this.phone = '';
|
||||
},
|
||||
delpas: function(e) {
|
||||
this.password = '';
|
||||
},
|
||||
setsms: function(e) {
|
||||
this.sms = e.detail.value
|
||||
},
|
||||
setpho: function(e) {
|
||||
this.phone = e.detail.value
|
||||
},
|
||||
setpas: function(e) {
|
||||
this.password = e.detail.value
|
||||
},
|
||||
getCode: function() {
|
||||
var code = this.code;
|
||||
if (code != '获取验证码' && code != '重新发送') {
|
||||
return;
|
||||
}
|
||||
this.code = '发送中...'
|
||||
sendValidate(this.phone, md5(this.password)).then(() => {
|
||||
let sendCode = setInterval(() => {
|
||||
if (code == '获取验证码' || code == '重新发送') {
|
||||
code = resendTime;
|
||||
}
|
||||
code--;
|
||||
var codes = '重新发送(' + code + 's)';
|
||||
this.code = codes;
|
||||
if (code <= 0) {
|
||||
code = '重新发送';
|
||||
this.code = code;
|
||||
clearInterval(sendCode);
|
||||
return;
|
||||
}
|
||||
}, 1000)
|
||||
}).catch(() => {
|
||||
this.code = '重新发送';
|
||||
})
|
||||
},
|
||||
isMobile,
|
||||
submit() {
|
||||
this.loading = true
|
||||
changePhone(this.phone, md5(this.password), this.sms).then(() => {
|
||||
this.loading = false
|
||||
this.$store.dispatch('LogOut').then(() => {
|
||||
this.$store.dispatch('clearAuthState')
|
||||
this.$store.dispatch('endRefreshNewsTimer')
|
||||
uni.reLaunch({
|
||||
url: '/pages/login/login'
|
||||
})
|
||||
})
|
||||
}).catch(() => {
|
||||
this.loading = false
|
||||
})
|
||||
}
|
||||
},
|
||||
computed: {}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.phoneDel {
|
||||
margin-left: auto !important;
|
||||
}
|
||||
|
||||
.nocheck {
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.btn {
|
||||
margin: 0 auto;
|
||||
margin-top: 50rpx;
|
||||
background-color: #1B66FF;
|
||||
color: #fefefe;
|
||||
border-radius: 10rpx;
|
||||
text-align: center;
|
||||
font-size: 32rpx;
|
||||
height: 80rpx;
|
||||
line-height: 80rpx;
|
||||
}
|
||||
|
||||
.code {
|
||||
margin-left: auto;
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #1b66ff;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
page {
|
||||
background-color: #fefefe;
|
||||
}
|
||||
|
||||
.change-phone-body {
|
||||
width: 80%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
</style>
|
||||
48
pageMy/my/resume/addInd.vue
Normal file
@@ -0,0 +1,48 @@
|
||||
<template>
|
||||
<select-template ref="select" title="请选择行业" slo="请选择行业,帮你定制个性化推荐任务信息" :list="skillLevel" @submit="goAdd"></select-template>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
getTrade
|
||||
} from '@/api/resume.js'
|
||||
import selectTemplate from './selectTemplate.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
selectTemplate
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
id: "",
|
||||
skillLevel: [],
|
||||
}
|
||||
},
|
||||
// 在test.vue页面接受参数
|
||||
onLoad: function({
|
||||
id
|
||||
}) {
|
||||
this.id = id
|
||||
},
|
||||
onShow: function() {
|
||||
this.getData()
|
||||
},
|
||||
mounted() {
|
||||
this.$refs.select.setActiveId(this.tradeId)
|
||||
},
|
||||
methods: {
|
||||
getData: function() {
|
||||
getTrade().then(res => {
|
||||
this.skillLevel = res.data.data
|
||||
})
|
||||
},
|
||||
goAdd(res) {
|
||||
uni.$emit('setInd', res)
|
||||
uni.navigateBack()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
297
pageMy/my/resume/addSkill.vue
Normal file
@@ -0,0 +1,297 @@
|
||||
<template>
|
||||
<view style="background-color: #fefefe;">
|
||||
<view class="titles">
|
||||
添加职业技能
|
||||
</view>
|
||||
<view class="slo">
|
||||
添加职业技能,获得个性化的职位推荐
|
||||
</view>
|
||||
<view class="jobcontent" @click="goAddind">
|
||||
<view class="jobinfo">
|
||||
<view class="jobAddress">
|
||||
我从事的行业
|
||||
</view>
|
||||
<view v-if="tradeName" class="jobText">{{tradeName}}</view>
|
||||
<view v-else class="jobText nochoose">请选择</view>
|
||||
</view>
|
||||
<image src="../../../static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
<view class="border"></view>
|
||||
<view class="jobcontent" @click="skill">
|
||||
<view class="jobinfo">
|
||||
<view class="jobAddress">
|
||||
我具备的技能
|
||||
</view>
|
||||
<view v-if="worktypesName" class="jobText">{{worktypesName}}</view>
|
||||
<view v-else class="jobText nochoose">请选择</view>
|
||||
</view>
|
||||
<image src="../../../static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
<view class="border"></view>
|
||||
<view class="jobcontent" @click="skillLevel">
|
||||
<view class="jobinfo">
|
||||
<view class="jobAddress">
|
||||
我的技能水平
|
||||
</view>
|
||||
<view v-if="skillsName" class="jobText">{{skillsName}}</view>
|
||||
<view v-else class="jobText nochoose">请选择</view>
|
||||
</view>
|
||||
<image src="../../../static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
<view class="border"></view>
|
||||
<view class="btn">
|
||||
<view v-if="skillsId " class="bottombtn" @click="submit">确定</view>
|
||||
<view v-else class="bottombtn disabledBtn">确定</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
addSkills
|
||||
} from '@/api/resume.js'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
tradeId: '',
|
||||
tradeName: '',
|
||||
worktypesId: '',
|
||||
worktypesName: '',
|
||||
skillsId: '',
|
||||
skillsName: '',
|
||||
}
|
||||
},
|
||||
onLoad(query) {
|
||||
uni.$off('setInd')
|
||||
uni.$on('setInd', ({
|
||||
id,
|
||||
name
|
||||
}) => {
|
||||
this.tradeId = id
|
||||
this.tradeName = name
|
||||
this.worktypesId = ''
|
||||
this.worktypesName = ''
|
||||
this.skillsId = ''
|
||||
this.skillsName = ''
|
||||
})
|
||||
uni.$off('setworkTypes')
|
||||
uni.$on('setworkTypes', ({
|
||||
id,
|
||||
name
|
||||
}) => {
|
||||
this.worktypesId = id
|
||||
this.worktypesName = name
|
||||
this.skillsId = ''
|
||||
this.skillsName = ''
|
||||
})
|
||||
uni.$off('setSkill')
|
||||
uni.$on('setSkill', ({
|
||||
id,
|
||||
name
|
||||
}) => {
|
||||
this.skillsId = id
|
||||
this.skillsName = name
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
goAddind: function() {
|
||||
uni.navigateTo({
|
||||
url: './addInd?id=' + this.tradeId
|
||||
})
|
||||
},
|
||||
skill: function() {
|
||||
if (this.tradeId) {
|
||||
uni.navigateTo({
|
||||
url: `./skill?id=${this.worktypesId}&tradeId=${this.tradeId}`
|
||||
})
|
||||
} else {
|
||||
uni.showToast({
|
||||
title: '请先选择从事的行业',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
},
|
||||
skillLevel: function() {
|
||||
if (!this.tradeId) {
|
||||
uni.showToast({
|
||||
title: '请先选择从事的行业',
|
||||
icon: 'none'
|
||||
});
|
||||
} else if (!this.worktypesId) {
|
||||
uni.showToast({
|
||||
title: '请先选择具备的技能',
|
||||
icon: 'none'
|
||||
});
|
||||
} else {
|
||||
uni.navigateTo({
|
||||
url: `./skillLevel?id=${this.skillsId}&worktypesId=${this.worktypesId}`
|
||||
})
|
||||
}
|
||||
},
|
||||
submit: function() {
|
||||
addSkills(this.tradeName, this.worktypesName, this.skillsName).then(res => {
|
||||
uni.navigateBack()
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.slo {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
|
||||
padding: 0 30rpx;
|
||||
padding-top: 10rpx;
|
||||
}
|
||||
|
||||
.titles {
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 36rpx;
|
||||
color: #333333;
|
||||
padding: 0 30rpx;
|
||||
padding-top: 30rpx;
|
||||
}
|
||||
|
||||
.border {
|
||||
margin-left: 30rpx;
|
||||
width: 720rpx;
|
||||
border-bottom: 2rpx solid #ddd;
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.jobText {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.nochoose {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
.jobAddress {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.jobcontent {
|
||||
padding: 30rpx;
|
||||
|
||||
background: #fefefe;
|
||||
display: flex;
|
||||
/* align-items: center; */
|
||||
align-items: flex-end;
|
||||
justify-content: space-between;
|
||||
line-height: 63rpx;
|
||||
}
|
||||
|
||||
.jobcontent image {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
margin-bottom: 5px;
|
||||
|
||||
}
|
||||
|
||||
.listBody {}
|
||||
|
||||
.list_text {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.list image {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.list {
|
||||
padding: 0 30rpx;
|
||||
height: 126rpx;
|
||||
background: #fefefe;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.title image {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
display: flex;
|
||||
padding: 10rpx 30rpx;
|
||||
background-color: #fefefe;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.userInfo {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 24rpx;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.name {
|
||||
margin-left: 20rpx;
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 36rpx;
|
||||
color: #333333;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
|
||||
.head image:last-child {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.head image {
|
||||
width: 100rpx;
|
||||
height: 100rpx;
|
||||
}
|
||||
|
||||
.head {
|
||||
padding: 30rpx;
|
||||
width: 690rpx;
|
||||
background-color: #fefefe;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.bottombtn {
|
||||
background-color: #1b66ff;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
border-radius: 10rpx;
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 32rpx;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
}
|
||||
|
||||
.btn {
|
||||
background-color: #fefefe;
|
||||
width: 690rpx;
|
||||
padding: 30rpx;
|
||||
padding-bottom: 80rpx;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.disabledBtn {
|
||||
background-color: #c8c9cc;
|
||||
}
|
||||
</style>
|
||||
299
pageMy/my/resume/index.vue
Normal file
@@ -0,0 +1,299 @@
|
||||
<template>
|
||||
<view style="background-color: #fff;">
|
||||
<view class="head" @click="goUserBase">
|
||||
<image v-if="userInfo.avatar" :src="userInfo.avatar" mode=""></image>
|
||||
<image v-else src="../../../static/img/head.svg" mode=""></image>
|
||||
|
||||
<view class="name">
|
||||
<view class="userName">
|
||||
{{auth.authInfo.realName}}
|
||||
</view>
|
||||
<view class="userInfo">
|
||||
个人基本信息
|
||||
</view>
|
||||
</view>
|
||||
<image src="../../../static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
|
||||
<view class="title">
|
||||
<view class="title_text">
|
||||
我的职业技能
|
||||
</view>
|
||||
<image v-if="mySkills.length<10" src="../../../static/img/add.gray.svg" mode="" @click="goAdd"></image>
|
||||
</view>
|
||||
|
||||
<view class="listBody">
|
||||
<m-slide-list @controller-reg="controller.reg" @controller-moving="controller.moving" @controller-opened="controller.opened"
|
||||
@controller-closed="controller.closed" @remove="removeSkills(item.id,index)" v-for="(item,index) in mySkills" :key="item.id"
|
||||
:button="buttonList">
|
||||
<view class="list">
|
||||
<view class="list_text">
|
||||
{{item.trade}}·{{item.worktypes}}·{{item.skills}}
|
||||
</view>
|
||||
</view>
|
||||
</m-slide-list>
|
||||
</view>
|
||||
<view class="jobcontent" @click="goSetCity">
|
||||
<view class="jobinfo">
|
||||
<view class="jobAddress">
|
||||
您想工作的地点
|
||||
</view>
|
||||
<view v-bind:class="['jobText',{nochoose: !myResume.cityId}]">
|
||||
{{myResume.cityId ? getCity(myResume.cityId) : '请选择'}}
|
||||
</view>
|
||||
</view>
|
||||
<image src="../../../static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
<view class="border"></view>
|
||||
<!--<view class="jobcontent" @click="goWantSkill">
|
||||
<view class="jobinfo">
|
||||
<view class="jobAddress">
|
||||
我想学习的技能(选填)
|
||||
</view>
|
||||
<view class="jobText" v-bind:class="myResume.learnSkill?'':'nochoose'">
|
||||
{{myResume.learnSkill?myResume.learnSkill:'请填写'}}
|
||||
</view>
|
||||
</view>
|
||||
<image src="../../../static/img/right.svg" mode=""></image>
|
||||
</view>-->
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
mapGetters
|
||||
} from 'vuex'
|
||||
import {
|
||||
mySkills,
|
||||
myResume,
|
||||
removeSkills,
|
||||
setCity,
|
||||
setLearn
|
||||
} from '@/api/resume.js';
|
||||
import mSlideList from '@/components/mark-slide-list/mark-slide-list.vue';
|
||||
import controller from '@/components/mark-slide-list/controller';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
mSlideList
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
controller: new controller(),
|
||||
myResume: {},
|
||||
mySkills: [],
|
||||
id: '',
|
||||
buttonList: [{
|
||||
title: '删除',
|
||||
background: '#ff3b32',
|
||||
clickName: 'remove'
|
||||
}]
|
||||
}
|
||||
},
|
||||
onShow() {
|
||||
this.getResume()
|
||||
this.getSkill()
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(['userInfo', 'auth'])
|
||||
},
|
||||
methods: {
|
||||
getResume() {
|
||||
myResume().then(res => {
|
||||
const data = res.data.data
|
||||
this.myResume = data
|
||||
if (data && data.id) {
|
||||
this.id = data.id
|
||||
}
|
||||
});
|
||||
},
|
||||
getSkill() {
|
||||
mySkills().then(res => {
|
||||
this.mySkills = res.data.data;
|
||||
})
|
||||
},
|
||||
goWantSkill: function() {
|
||||
uni.$off('getWantSkill')
|
||||
uni.$once('getWantSkill', (cb) => {
|
||||
cb(this.myResume.learnSkill)
|
||||
})
|
||||
uni.$off('setWantSkill')
|
||||
uni.$once('setWantSkill', ({
|
||||
skill,
|
||||
done
|
||||
}) => {
|
||||
setLearn(this.id, skill).then(res => {
|
||||
uni.navigateBack()
|
||||
}).catch(() => {
|
||||
done && done()
|
||||
})
|
||||
this.getResume()
|
||||
})
|
||||
uni.navigateTo({
|
||||
url: './setWskill?id=' + this.id
|
||||
})
|
||||
},
|
||||
goSetCity: function() {
|
||||
uni.$off('setCity')
|
||||
uni.$on('setCity', (id) => {
|
||||
setCity(this.id, id).then(res => {
|
||||
this.myResume.cityId = id
|
||||
this.getResume()
|
||||
})
|
||||
})
|
||||
uni.navigateTo({
|
||||
url: `/pages/setCity/setCity?maxLayer=2`
|
||||
})
|
||||
},
|
||||
goAdd: function() {
|
||||
uni.navigateTo({
|
||||
url: './addSkill'
|
||||
})
|
||||
},
|
||||
goUserBase: function() {
|
||||
uni.navigateTo({
|
||||
url: '../userBase'
|
||||
})
|
||||
},
|
||||
getCity: function(val) {
|
||||
if (val) {
|
||||
let areas = this.$store.getters.getAreaParents(val)
|
||||
if (areas.length) {
|
||||
return areas[0].label + '-' + areas[1].label
|
||||
}
|
||||
}
|
||||
},
|
||||
removeSkills: function(id, index) {
|
||||
removeSkills(id).then(res => {
|
||||
uni.showToast({
|
||||
title: '操作成功',
|
||||
icon: 'none'
|
||||
});
|
||||
this.mySkills.splice(index, 1)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.border {
|
||||
margin-left: 30rpx;
|
||||
width: 720rpx;
|
||||
border: 1rpx solid #f2f2f2;
|
||||
|
||||
/* height: 1rpx;
|
||||
background-color: #ddd; */
|
||||
}
|
||||
|
||||
.jobText {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.jobAddress {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.nochoose {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
.jobcontent {
|
||||
padding: 30rpx;
|
||||
background: #fff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
line-height: 63rpx;
|
||||
}
|
||||
|
||||
.jobcontent image {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
|
||||
.listBody {}
|
||||
|
||||
.list_text {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #666666;
|
||||
background: #ffffff;
|
||||
overflow-y: auto;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.list image {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.list {
|
||||
padding: 0 15px 0 30rpx;
|
||||
height: 126rpx;
|
||||
line-height: 126rpx;
|
||||
background: #fff;
|
||||
border-bottom: 1px solid #f2f2f2;
|
||||
}
|
||||
|
||||
.title image {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
display: flex;
|
||||
padding: 25rpx 30rpx;
|
||||
/* padding-top: 30rpx; */
|
||||
background-color: #fff;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
border: 1rpx solid #f2f2f2;
|
||||
}
|
||||
|
||||
.userInfo {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 24rpx;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.name {
|
||||
margin-left: 20rpx;
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 36rpx;
|
||||
color: #333333;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
|
||||
.head image:last-child {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.head image {
|
||||
width: 100rpx;
|
||||
height: 100rpx;
|
||||
}
|
||||
|
||||
page {
|
||||
background-color: #f6f6f6;
|
||||
}
|
||||
|
||||
.head {
|
||||
padding: 30rpx;
|
||||
width: 690rpx;
|
||||
background-color: #fff;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
</style>
|
||||
370
pageMy/my/resume/selectTemplate.vue
Normal file
@@ -0,0 +1,370 @@
|
||||
<template>
|
||||
<view class="select-template">
|
||||
<view class="select-template-head">
|
||||
<view class="titles">
|
||||
{{title}}
|
||||
</view>
|
||||
<view class="slo">
|
||||
{{slo}}
|
||||
</view>
|
||||
<view class="seach" v-if="search">
|
||||
<image class="seach-image" src="../../../static/img/search.svg" mode=""></image>
|
||||
<input type="text" v-model="inputValue" placeholder="请输入技能名称" placeholder-style="color:#ccc" />
|
||||
</view>
|
||||
<view class="borderbotom" v-if="search"></view>
|
||||
<view class="scroll-view" v-if="searchShow" :style="{top:height}">
|
||||
<ul class="search-result">
|
||||
<li class="search-result-list" v-for="(item,index) in searchResultList" :key="index" @click="handlerSelect(item)">
|
||||
<div class="search-result-list-title">
|
||||
<rich-text :nodes="getInf(item)"></rich-text>
|
||||
</div>
|
||||
</li>
|
||||
</ul>
|
||||
</view>
|
||||
</view>
|
||||
<view :style="{height}"></view>
|
||||
<view class="levelbody" v-if="!searchShow">
|
||||
<block v-for="(item,index) in list" :key="index">
|
||||
<view v-bind:class="['levellist', {checked:item[prop.key] === activeId}]" @click="chooseLev(item)">
|
||||
{{item[prop.name]}}
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
<view class="bottom"></view>
|
||||
<view class="btn">
|
||||
<view v-if="activeId" class="bottombtn" @click="submit">确定</view>
|
||||
<view v-else class="bottombtn disabledBtn">确定</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: {
|
||||
search: Boolean,
|
||||
title: String,
|
||||
slo: String,
|
||||
list: Array,
|
||||
prop: {
|
||||
type: Object,
|
||||
default () {
|
||||
return {
|
||||
name: 'name',
|
||||
key: 'id'
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
height: '0px',
|
||||
inputValue: '',
|
||||
activeName: '',
|
||||
activeId: '',
|
||||
searchShow: false,
|
||||
}
|
||||
},
|
||||
// 在test.vue页面接受参数
|
||||
onLoad: function({
|
||||
id
|
||||
}) {
|
||||
this.activeId = id
|
||||
},
|
||||
mounted() {
|
||||
uni.createSelectorQuery().in(this).select('.select-template-head').boundingClientRect().exec((node) => {
|
||||
this.height = node[0].height + 'px'
|
||||
});
|
||||
},
|
||||
computed: {
|
||||
searchResultList() {
|
||||
const prop = this.prop
|
||||
if (this.inputValue && this.searchShow) {
|
||||
return this.list.filter(item => {
|
||||
return item[prop.name].indexOf(this.inputValue) !== -1
|
||||
})
|
||||
} else {
|
||||
return undefined
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getInf(item) {
|
||||
const key = this.inputValue
|
||||
const str = item[this.prop.name]
|
||||
let replaceReg = new RegExp(key, 'g') // 匹配关键字正则
|
||||
let replaceString = "<span style='color: #1b66ff;'>" + key + "</span>" // 高亮替换
|
||||
return str.replace(replaceReg, replaceString);
|
||||
},
|
||||
setActiveId(id) {
|
||||
this.activeId = id
|
||||
},
|
||||
chooseLev(item) {
|
||||
const prop = this.prop
|
||||
this.activeId = item[prop.key]
|
||||
this.activeName = item[prop.name]
|
||||
},
|
||||
handlerSelect(item) {
|
||||
this.searchShow = false
|
||||
this.chooseLev(item)
|
||||
},
|
||||
submit() {
|
||||
this.$emit('submit', {
|
||||
id: this.activeId,
|
||||
name: this.activeName
|
||||
})
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
inputValue(val) {
|
||||
this.searchShow = !!val
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.select-template {
|
||||
background-color: #fefefe;
|
||||
}
|
||||
|
||||
.select-template-head {
|
||||
background-color: #fefefe;
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
/*搜索结果*/
|
||||
.scroll-view {
|
||||
width: 100%;
|
||||
flex: 1;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.search-result {
|
||||
background-color: #fff;
|
||||
padding: 0rpx;
|
||||
}
|
||||
|
||||
.search-result-list {
|
||||
font-weight: normal;
|
||||
text-align: left;
|
||||
border-bottom: 1rpx solid #f2f2f2;
|
||||
padding: 28rpx 30rpx;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.search-result-list-title {
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.highlight {
|
||||
color: #1b66ff;
|
||||
}
|
||||
|
||||
.borderbotom {
|
||||
width: 720rpx;
|
||||
margin-left: 30rpx;
|
||||
border-bottom: 2rpx solid #ddd;
|
||||
}
|
||||
|
||||
.seach-image {
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
margin-right: 15rpx;
|
||||
}
|
||||
|
||||
.seach {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
padding: 30rpx;
|
||||
|
||||
}
|
||||
|
||||
.levellist.checked {
|
||||
color: #1B66FF !important;
|
||||
border: 1rpx solid #1B66FF;
|
||||
background: rgba(77, 136, 255, 0.10) !important;
|
||||
}
|
||||
|
||||
.levellist {
|
||||
background: #f6f6f6;
|
||||
border: 1rpx solid #f6f6f6;
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #666666;
|
||||
text-align: center;
|
||||
margin-right: 15rpx;
|
||||
padding: 10rpx 15rpx;
|
||||
border-radius: 5rpx;
|
||||
margin: 0 30rpx;
|
||||
margin-top: 25rpx;
|
||||
}
|
||||
|
||||
.levelbody {
|
||||
padding: 30rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.bottom {
|
||||
height: 200rpx;
|
||||
}
|
||||
|
||||
.bottombtn {
|
||||
background-color: #1b66ff;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
border-radius: 10rpx;
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 32rpx;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
}
|
||||
|
||||
.disabledBtn {
|
||||
background-color: #c8c9cc;
|
||||
}
|
||||
|
||||
.btn {
|
||||
background-color: #fefefe;
|
||||
width: 690rpx;
|
||||
padding: 30rpx;
|
||||
padding-bottom: 80rpx;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.slo {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
|
||||
padding: 0 30rpx;
|
||||
padding-top: 10rpx;
|
||||
}
|
||||
|
||||
.titles {
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 40rpx;
|
||||
color: #333333;
|
||||
font-weight: bold;
|
||||
padding: 0 30rpx;
|
||||
padding-top: 30rpx;
|
||||
}
|
||||
|
||||
.border {
|
||||
margin-left: 30rpx;
|
||||
width: 720rpx;
|
||||
border-bottom: 2rpx solid #ddd;
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
.jobText {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.jobAddress {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.jobcontent {
|
||||
padding: 30rpx;
|
||||
|
||||
background: #fefefe;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
line-height: 63rpx;
|
||||
}
|
||||
|
||||
.jobcontent image {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
|
||||
}
|
||||
|
||||
.listBody {}
|
||||
|
||||
.list_text {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.list image {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.list {
|
||||
padding: 0 30rpx;
|
||||
height: 126rpx;
|
||||
background: #fefefe;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.title image {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
|
||||
.title {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
display: flex;
|
||||
padding: 10rpx 30rpx;
|
||||
background-color: #fefefe;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.userInfo {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 24rpx;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.name {
|
||||
margin-left: 20rpx;
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 36rpx;
|
||||
color: #333333;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
|
||||
.head image:last-child {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.head image {
|
||||
width: 100rpx;
|
||||
height: 100rpx;
|
||||
}
|
||||
|
||||
.head {
|
||||
padding: 30rpx;
|
||||
width: 690rpx;
|
||||
background-color: #fefefe;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
</style>
|
||||
133
pageMy/my/resume/setWskill.vue
Normal file
@@ -0,0 +1,133 @@
|
||||
<template>
|
||||
<view>
|
||||
<view class="noComment">
|
||||
<view class="textview">
|
||||
<textarea v-model.trim="skill" placeholder="请输入18字以内" placeholder-class="textClass" maxlength="18" />
|
||||
</view>
|
||||
<view class="btn" v-if="btnShow">
|
||||
<view class="bottombtn" @click="sendCom">确认</view>
|
||||
<!-- <view v-else class="bottombtn disabledBtn">确认</view> -->
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import{mySkills} from '@/api/resume.js';
|
||||
import {submitApplication} from '@/api/newIndex.js'
|
||||
import {mapGetters} from 'vuex'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
skill:'',
|
||||
submitType:2,//申请类型:1 法律咨询 2技能提升
|
||||
btnShow:true,
|
||||
}
|
||||
},
|
||||
onLoad(option) {
|
||||
if(option.data && option.type){
|
||||
this.skill=decodeURIComponent(option.data);
|
||||
this.btnShow=false;
|
||||
}
|
||||
},
|
||||
computed:{
|
||||
...mapGetters(['authInfo'])
|
||||
},
|
||||
methods: {
|
||||
settext:function(e){
|
||||
this.skill = e.detail.value;
|
||||
},
|
||||
getWantSkill(){
|
||||
mySkills().then(res=>{
|
||||
console.log(res,'skill')
|
||||
})
|
||||
},
|
||||
sendCom:function(){
|
||||
if(!this.skill){
|
||||
uni.showToast({
|
||||
icon:'none',
|
||||
title:'请输入想学习的技能',
|
||||
duration:3000
|
||||
})
|
||||
return;
|
||||
}
|
||||
uni.showLoading({
|
||||
title:'请求中'
|
||||
})
|
||||
let uid=this.authInfo.userId;
|
||||
let uname=this.authInfo.realName;
|
||||
let tel=this.authInfo.telphone;
|
||||
submitApplication(uid,uname,tel,this.submitType,this.skill).then(res=>{
|
||||
this.loading=false;
|
||||
uni.hideLoading()
|
||||
setTimeout(() => {
|
||||
uni.showToast({
|
||||
title: '提交成功',
|
||||
icon: 'none'
|
||||
});
|
||||
}, 1000)
|
||||
uni.switchTab({
|
||||
url:'/pages/index/index'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.bottombtn {
|
||||
background-color: #1b66ff;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
border-radius: 10rpx;
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 32rpx;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
}
|
||||
.disabledBtn {
|
||||
background-color: #c8c9cc;
|
||||
}
|
||||
.btn {
|
||||
background-color: #fefefe;
|
||||
width: 690rpx;
|
||||
padding: 30rpx;
|
||||
padding-bottom: 80rpx;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
.textview{
|
||||
padding: 20rpx;
|
||||
}
|
||||
textarea{
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #666;
|
||||
|
||||
}
|
||||
.textClass{
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #CCCCCC;
|
||||
}
|
||||
.start image:first-child{
|
||||
margin-left: 20rpx;
|
||||
}
|
||||
.start image{
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
.start{
|
||||
padding: 20rpx;
|
||||
border-bottom: 1rpx solid #f6f6f6;
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
page{background-color: #fefefe;}
|
||||
</style>
|
||||
51
pageMy/my/resume/skill.vue
Normal file
@@ -0,0 +1,51 @@
|
||||
<template>
|
||||
<select-template ref="select" title="请选择技能" slo="请选择最符合你能力的标签,标签会帮你定制个性化推荐任务信息" :list="skillLevel" search @submit="goAdd"></select-template>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
getWorktypes
|
||||
} from '@/api/resume.js'
|
||||
import selectTemplate from './selectTemplate.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
selectTemplate
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
skillLevel: [],
|
||||
tradeId: '',
|
||||
id: ''
|
||||
}
|
||||
},
|
||||
onLoad: function({
|
||||
id,
|
||||
tradeId
|
||||
}) {
|
||||
this.tradeId = tradeId
|
||||
},
|
||||
onShow: function() {
|
||||
this.getData()
|
||||
},
|
||||
mounted() {
|
||||
this.$refs.select.setActiveId(this.tradeId)
|
||||
},
|
||||
methods: {
|
||||
getData: function() {
|
||||
if (this.tradeId) {
|
||||
getWorktypes(this.tradeId).then(res => {
|
||||
this.skillLevel = res.data.data
|
||||
})
|
||||
}
|
||||
},
|
||||
goAdd(res) {
|
||||
uni.$emit('setworkTypes', res)
|
||||
uni.navigateBack()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
55
pageMy/my/resume/skillLevel.vue
Normal file
@@ -0,0 +1,55 @@
|
||||
<template>
|
||||
<select-template ref="select" title="请选择技能水平" slo="请选择最符合你能力的标签,标签会帮你定制个性化推荐任务信息" :list="skillLevel" @submit="goAdd"></select-template>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import testData from '@/common/textdata.js';
|
||||
import {
|
||||
getSkills
|
||||
} from '@/api/resume.js'
|
||||
import selectTemplate from './selectTemplate.vue'
|
||||
|
||||
export default {
|
||||
components: {
|
||||
selectTemplate
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
skillLevel: [],
|
||||
worktypesId: null,
|
||||
activeName: '',
|
||||
activeId: '',
|
||||
id: ''
|
||||
}
|
||||
},
|
||||
onLoad({
|
||||
id,
|
||||
worktypesId
|
||||
}) {
|
||||
this.id = id
|
||||
this.worktypesId = worktypesId
|
||||
},
|
||||
onShow: function() {
|
||||
this.getData()
|
||||
},
|
||||
mounted() {
|
||||
this.$refs.select.setActiveId(this.id)
|
||||
},
|
||||
methods: {
|
||||
getData: function() {
|
||||
if (this.worktypesId) {
|
||||
getSkills(this.worktypesId).then(res => {
|
||||
this.skillLevel = res.data.data
|
||||
})
|
||||
}
|
||||
},
|
||||
goAdd(res) {
|
||||
uni.$emit('setSkill', res)
|
||||
uni.navigateBack()
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
259
pageMy/my/sala.vue
Normal file
@@ -0,0 +1,259 @@
|
||||
<template>
|
||||
<view class="body">
|
||||
<!-- <v-tabs :tabs="['已发放','未发放']" height="45px" v-model="activeTab" color="#999" activeColor="#000" fontSize="36rx"
|
||||
activeFontSize="36rpx" @change='changeTab' /> -->
|
||||
<view class="list" v-for="item in data" :key="item.missionNo">
|
||||
<view class="list_head">
|
||||
<view class="list_head_left">
|
||||
{{item.title}}
|
||||
</view>
|
||||
<!--<view class="list_head_right">
|
||||
{{moneyFormat(item.wageReal)}}元
|
||||
</view>-->
|
||||
|
||||
<view class="list_head_right" v-if="item.payType === 1 || item.payType === 0">{{moneyComdify(item.wageReal)}}元</view>
|
||||
<view class="list_head_right" v-if="item.payType === 2">申报个税:<view class="price">{{moneyComdify(item.wageReal)}}元</view></view>
|
||||
</view>
|
||||
<view class="allName">
|
||||
{{item.companyName}}
|
||||
</view>
|
||||
<view class="timeBox" v-if="activeTab === 0">
|
||||
<view class="time">发放日期:{{dateFormat(item.accountTime,'yyyy年MM月dd日')}}</view>
|
||||
<view class="list_head_right" v-if="item.payType === 1">预扣个税:<view class="price">{{moneyComdify(item.tax)}}元</view></view>
|
||||
<view class="list_head_right" v-if="item.payType === 2">个税补发:<view class="price">{{moneyComdify(item.tax)}}元</view></view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="nothing" v-if="data.length === 0">
|
||||
<image src="../../static/img/pic.svg" mode=""></image>
|
||||
<view class="nothingText">
|
||||
暂无工资信息
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
getList,userOrderList
|
||||
} from '@/api/wage.js'
|
||||
import {
|
||||
mapGetters
|
||||
} from 'vuex'
|
||||
import {
|
||||
moneyFormat,
|
||||
moneyComdify,
|
||||
dateFormat
|
||||
} from '@/untils/format.js'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
tabs: ['已发放', '未发放'],
|
||||
dataDepository: [
|
||||
[],
|
||||
[]
|
||||
],
|
||||
page: [{
|
||||
current: 0,
|
||||
size: 20,
|
||||
maxPage: 1,
|
||||
loading: false,
|
||||
status: 1
|
||||
}, {
|
||||
current: 0,
|
||||
size: 20,
|
||||
maxPage: 1,
|
||||
loading: false,
|
||||
status: 0
|
||||
}],
|
||||
activeTab: 0,
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getData()
|
||||
},
|
||||
onReachBottom() {
|
||||
this.getData()
|
||||
},
|
||||
/*页面滚动到底部 换页*/
|
||||
onReachBottom: function() {
|
||||
const page = this.page[this.activeTab]
|
||||
const activeTab = this.activeTab
|
||||
const current = page.current + 1
|
||||
if (page.current <= Math.ceil(page.maxPage / page.size)) {
|
||||
this.getData();
|
||||
} else {
|
||||
uni.showToast({
|
||||
icon: "none",
|
||||
title: '已经是最后一页',
|
||||
})
|
||||
}
|
||||
},
|
||||
/*下拉刷新*/
|
||||
onPullDownRefresh:function(){
|
||||
const page = this.page[this.activeTab]
|
||||
page.current = 0
|
||||
this.dataDepository[this.activeTab] = []
|
||||
this.getData()
|
||||
|
||||
},
|
||||
methods: {
|
||||
changeTab: function(e) {
|
||||
this.activeTab = e;
|
||||
},
|
||||
getData() {
|
||||
const page = this.page[this.activeTab]
|
||||
const activeTab = this.activeTab
|
||||
const current = page.current + 1
|
||||
if (page.loading || current > page.maxPage) {
|
||||
return
|
||||
}
|
||||
page.loading = true
|
||||
/* getList(this.userInfo.user_id, current, page.size, page.status).then((resp) => {
|
||||
uni.stopPullDownRefresh();
|
||||
const data = resp.data.data
|
||||
this.$set(this.dataDepository, activeTab, this.dataDepository[activeTab].concat(data.records))
|
||||
page.maxPage = parseInt(data.total / data.size) + 1
|
||||
page.current = current
|
||||
page.loading = false
|
||||
}) */
|
||||
var params = {
|
||||
current: current,
|
||||
size: page.size
|
||||
}
|
||||
|
||||
userOrderList(params).then((resp) => {
|
||||
uni.stopPullDownRefresh();
|
||||
const data = resp.data.data
|
||||
this.$set(this.dataDepository, activeTab, this.dataDepository[activeTab].concat(data.records))
|
||||
page.maxPage = parseInt(data.total / data.size) + 1
|
||||
page.current = current
|
||||
page.loading = false
|
||||
})
|
||||
},
|
||||
refrush() {
|
||||
this.page = {
|
||||
current: 1,
|
||||
size: 20,
|
||||
maxPage: 1,
|
||||
}
|
||||
this.getData()
|
||||
},
|
||||
moneyComdify,
|
||||
moneyFormat,
|
||||
dateFormat
|
||||
},
|
||||
watch: {
|
||||
activeTab(val) {
|
||||
this.getData()
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(['userInfo']),
|
||||
data() {
|
||||
return this.dataDepository[this.activeTab]
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.nothingText {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #666666;
|
||||
text-align: center;
|
||||
margin-top: 20rpx;
|
||||
}
|
||||
|
||||
.nothing image {
|
||||
width: 400rpx;
|
||||
height: 200rpx;
|
||||
display: block;
|
||||
padding-top: 50%;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.nothing {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
|
||||
background-color: #fefefe;
|
||||
}
|
||||
|
||||
.timeBox {
|
||||
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
}
|
||||
.time{
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 24rpx;
|
||||
color: #6D6D6D;
|
||||
}
|
||||
|
||||
.allName {
|
||||
width: 280rpx;
|
||||
height: 76rpx;
|
||||
line-height: 76rpx;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
/*不换行*/
|
||||
text-overflow: ellipsis;
|
||||
/*超出部分文字以...显示*/
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.list_head_right {
|
||||
display: flex;
|
||||
font-size: 24rpx;
|
||||
font-weight: 500;
|
||||
color: #F46161;
|
||||
}
|
||||
|
||||
.price{
|
||||
width: 137rpx;text-align: right;
|
||||
}
|
||||
|
||||
.list_head_left {
|
||||
width: 347rpx;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
/*不换行*/
|
||||
text-overflow: ellipsis;
|
||||
/*超出部分文字以...显示*/
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.list_head {
|
||||
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
|
||||
}
|
||||
|
||||
.list {
|
||||
/* height: 132rpx; */
|
||||
/* line-height: 50rpx; */
|
||||
padding: 30rpx 30rpx 32rpx 30rpx;
|
||||
border-bottom: 20rpx solid #f6f6f6;
|
||||
background-color: #fefefe;
|
||||
}
|
||||
|
||||
.body {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
page {
|
||||
background-color: #f6f6f6;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
121
pageMy/my/set.vue
Normal file
@@ -0,0 +1,121 @@
|
||||
<template>
|
||||
<view>
|
||||
<view class="listBody">
|
||||
<view class="list">
|
||||
<view class="list_left">
|
||||
我的账号
|
||||
</view>
|
||||
<view class="list_right">
|
||||
{{userInfo.account}}
|
||||
</view>
|
||||
</view>
|
||||
<view class="list" @click="password">
|
||||
<view class="list_left">
|
||||
修改密码
|
||||
</view>
|
||||
<view class="list_right">
|
||||
<image src="../../static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="listBody">
|
||||
<view class="list" @click="agreement">
|
||||
<view class="list_left">
|
||||
服务及隐私协议
|
||||
</view>
|
||||
<view class="list_right">
|
||||
<image src="../../static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="btn" @click="logout">
|
||||
退出登录
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
mapGetters
|
||||
} from 'vuex'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
|
||||
}
|
||||
},
|
||||
onLoad() {},
|
||||
methods: {
|
||||
logout() {
|
||||
this.$store.dispatch('LogOut').then(() => {
|
||||
uni.reLaunch({
|
||||
url: '/pages/login/login'
|
||||
})
|
||||
this.$store.dispatch('clearAuthState')
|
||||
this.$store.dispatch('endRefreshNewsTimer')
|
||||
})
|
||||
},
|
||||
password(){
|
||||
uni.navigateTo({
|
||||
url: '/pageMy/my/changePassword'
|
||||
})
|
||||
},
|
||||
agreement() {
|
||||
uni.navigateTo({
|
||||
url: '/pages/user/agreement'
|
||||
})
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(['userInfo'])
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.btn {
|
||||
background-color: #fefefe;
|
||||
margin-top: 20rpx;
|
||||
padding: 20rpx 0;
|
||||
text-align: center;
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #F46161;
|
||||
}
|
||||
|
||||
.list_right image {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
|
||||
.list_right {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.list_left {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.list {
|
||||
padding: 20rpx;
|
||||
padding-left: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
border-bottom: 1rpx solid #ddd;
|
||||
}
|
||||
|
||||
.listBody {
|
||||
background-color: #fefefe;
|
||||
margin-top: 20rpx;
|
||||
padding-left: 20rpx;
|
||||
}
|
||||
|
||||
page {
|
||||
background-color: #f6f6f6;
|
||||
}
|
||||
</style>
|
||||
140
pageMy/my/userBase.vue
Normal file
@@ -0,0 +1,140 @@
|
||||
<template>
|
||||
<view class="centerNothing">
|
||||
<view class="userBase" v-if="auth.realNameState === true">
|
||||
<view class="userBaseList">
|
||||
<view class="user_left">
|
||||
姓名
|
||||
</view>
|
||||
<view class="user_Right">
|
||||
{{auth.authInfo.realName}}
|
||||
</view>
|
||||
</view>
|
||||
<view class="userBaseList">
|
||||
<view class="user_left">
|
||||
性别
|
||||
</view>
|
||||
<view class="user_Right">
|
||||
{{auth.authInfo.sex===1?'男':'女'}}
|
||||
</view>
|
||||
</view>
|
||||
<view class="userBaseList">
|
||||
<view class="user_left">
|
||||
出生年月
|
||||
</view>
|
||||
<view class="user_Right">
|
||||
{{birthday}}
|
||||
</view>
|
||||
</view>
|
||||
<view class="userBaseList">
|
||||
<view class="user_left">
|
||||
手机号
|
||||
</view>
|
||||
<view class="user_Right">
|
||||
{{auth.authInfo.telphone}}
|
||||
</view>
|
||||
</view>
|
||||
<view class="userBaseList">
|
||||
<view class="user_left">
|
||||
身份
|
||||
</view>
|
||||
<view class="user_Right">
|
||||
<block v-if="auth.laborState">农村劳动力</block>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 没有认证的情况 -->
|
||||
<view v-else>
|
||||
<image src="../../static/img/pic_noid.svg" mode="" class="nothing"></image>
|
||||
<view class="nothingText" @click="goSetUserBase">
|
||||
暂无信息,请先<text>填写认证信息</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
userInfo
|
||||
} from '@/api/resume.js';
|
||||
import {
|
||||
dateFormat
|
||||
} from "../../untils/format.js";
|
||||
import {
|
||||
mapGetters
|
||||
} from 'vuex'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
userInfo: {}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(['auth', 'authInfo']),
|
||||
birthday() {
|
||||
return dateFormat(new Date(this.authInfo.birthday.replace(/\-/g, "/").replace('T',' ')), "yyyy-MM");
|
||||
}
|
||||
},
|
||||
onShow() {},
|
||||
methods: {
|
||||
goSetUserBase: function() {
|
||||
uni.navigateTo({
|
||||
url: '../setUserBase/index'
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.nothingText text {
|
||||
color: #1B66FF;
|
||||
}
|
||||
|
||||
.nothingText {
|
||||
text-align: center;
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #666666;
|
||||
margin-top: 20rpx;
|
||||
}
|
||||
|
||||
.nothing {
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
width: 400rpx;
|
||||
height: 200rpx;
|
||||
margin-top: 50%;
|
||||
}
|
||||
|
||||
.user_Right {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.user_left {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.userBaseList {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
padding: 30rpx;
|
||||
padding-left: 0;
|
||||
border-bottom: 1rpx solid #dddddd;
|
||||
}
|
||||
|
||||
.userBase {
|
||||
background-color: #fefefe;
|
||||
padding-left: 30rpx;
|
||||
margin-top: 30rpx;
|
||||
}
|
||||
|
||||
page {
|
||||
background-color: #fff;
|
||||
}
|
||||
</style>
|
||||
96
pageMy/my/vip/bind.vue
Normal file
@@ -0,0 +1,96 @@
|
||||
<template>
|
||||
<view class="vip">
|
||||
<view class="vip-title">
|
||||
输入邀请码
|
||||
</view>
|
||||
<view class="vip-tip">通过客服获取由字母数字组成不少于10位的编码</view>
|
||||
<jl-form>
|
||||
<jl-form-item>
|
||||
<jl-input v-model="code" placeholder="请输入" clearable></jl-input>
|
||||
</jl-form-item>
|
||||
</jl-form>
|
||||
<view class="vip-btn">
|
||||
<jl-button inline type="primary" :disabled="valid" :loading="loading" @click="confirm">申请绑定</jl-button>
|
||||
</view>
|
||||
<view class="vip-bottom">
|
||||
未实名认证用户,请先进行实名认证。未完成实名认证,申请VIP会员无法成功。
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
bind
|
||||
} from "@/api/vip.js"
|
||||
import jlInput from "@/components/jl-input/main.vue"
|
||||
import {
|
||||
mapGetters
|
||||
} from "vuex"
|
||||
|
||||
export default {
|
||||
components: {
|
||||
jlInput
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
loading: false,
|
||||
code: ""
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
confirm() {
|
||||
this.loading = true
|
||||
this.$store.dispatch("bindVipCode", this.code).then(() => {
|
||||
this.loading = false
|
||||
}).catch(() => {
|
||||
this.loading = false
|
||||
})
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(["authInfo"]),
|
||||
valid() {
|
||||
return this.code.length < 10
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.vip {
|
||||
width: 80%;
|
||||
padding-top: 108rpx;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.vip-title {
|
||||
font-size: 46rpx;
|
||||
color: #333333;
|
||||
letter-spacing: 0;
|
||||
line-height: 46rpx;
|
||||
margin-bottom: 30rpx;
|
||||
}
|
||||
|
||||
.vip-tip {
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
line-height: 28rpx;
|
||||
margin-bottom: 43rpx;
|
||||
}
|
||||
|
||||
.vip-btn {
|
||||
padding-top: 50rpx;
|
||||
}
|
||||
|
||||
.vip-btn-invit .jl-button {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.vip-bottom {
|
||||
padding-top: 41rpx;
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 24rpx;
|
||||
color: #999999;
|
||||
line-height: 34rpx;
|
||||
}
|
||||
</style>
|
||||
33
pageMy/my/vip/index.vue
Normal file
@@ -0,0 +1,33 @@
|
||||
<template>
|
||||
<success v-if="isVip"></success>
|
||||
<bind v-else></bind>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import bind from "./bind.vue"
|
||||
import success from "./success.vue"
|
||||
import {
|
||||
mapGetters
|
||||
} from "vuex"
|
||||
|
||||
export default {
|
||||
components: {
|
||||
bind,
|
||||
success
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
state: ""
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(["isVip"])
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
page{
|
||||
height: 100%;
|
||||
}
|
||||
</style>
|
||||
74
pageMy/my/vip/success.vue
Normal file
@@ -0,0 +1,74 @@
|
||||
<template>
|
||||
<view class="vip-success">
|
||||
<view class="vip-success-body">
|
||||
<image class="vip-success-img" src="/static/img/noauth.svg"></image>
|
||||
<view class="vip-success-text">我的邀请码:{{vipCode}}</view>
|
||||
<jl-button class="vip-success-btn" @click="copy">复制</jl-button>
|
||||
</view>
|
||||
<view class="vip-success-footer">说明:邀请码用作企业自主注册时填写的邀请码</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
mapGetters
|
||||
} from "vuex"
|
||||
import uniCopy from '@/js_sdk/xb-copy/uni-copy.js'
|
||||
|
||||
export default {
|
||||
methods: {
|
||||
copy() {
|
||||
uniCopy({
|
||||
content: `企业登录链接:https://www.jlhrms.cn/manage/#/login\r\n企业邀请码:${this.vipCode}`,
|
||||
success: (res) => {
|
||||
uni.showToast({
|
||||
title: "复制成功",
|
||||
icon: 'none'
|
||||
})
|
||||
},
|
||||
})
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(["vipCode"])
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.vip-success {
|
||||
height: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.vip-success-body {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.vip-success-img {
|
||||
width: 337rpx;
|
||||
height: 188rpx;
|
||||
margin: 0 auto 43.2rpx auto;
|
||||
}
|
||||
|
||||
.vip-success-text {
|
||||
font-size: 28rpx;
|
||||
color: #666666;
|
||||
letter-spacing: 0;
|
||||
line-height: 32rpx;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.vip-success-footer {
|
||||
width: 100%;
|
||||
position: absolute;
|
||||
bottom: 128rpx;
|
||||
font-size: 24rpx;
|
||||
color: #999999;
|
||||
letter-spacing: 0;
|
||||
line-height: 24rpx;
|
||||
}
|
||||
</style>
|
||||
131
pageMy/myProject/list.vue
Normal file
@@ -0,0 +1,131 @@
|
||||
<template>
|
||||
<scroll-view v-if="show && data.length > 0" @scrolltolower="upLoad" scroll-y>
|
||||
<block v-for="(page, pIndex) in data" :key="pIndex">
|
||||
<block v-for="(item, index) in page" :key="index">
|
||||
<view class="probody">
|
||||
<company-list :companyitem="item" :noApply="false"></company-list>
|
||||
<view class="baddd"></view>
|
||||
<block v-if="mark">
|
||||
<image src="/static/img/tab.orange.svg" mode="" v-if="item.status === 1"></image>
|
||||
<image src="/static/img/tab.blue.svg" mode="" v-else-if="item.status === 2"></image>
|
||||
<image src="/static/img/tab.green.svg" mode="" v-else-if="item.status === 3"></image>
|
||||
<image src="/static/img/tab.gray.svg" mode="" v-else></image>
|
||||
</block>
|
||||
</view>
|
||||
</block>
|
||||
</block>
|
||||
</scroll-view>
|
||||
<view class="nothing" v-else-if="show">
|
||||
<image src="/static/img/pic_notask.svg" mode=""></image>
|
||||
<view class="nothingContnt">
|
||||
暂无任务信息
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import companyList from '@/components/companyList/companyList.vue';
|
||||
import {
|
||||
myMission
|
||||
} from '@/api/mission.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
companyList
|
||||
},
|
||||
props: {
|
||||
show: Boolean,
|
||||
mark: Boolean,
|
||||
status: Number
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
initialized: false,
|
||||
data: [],
|
||||
current: 1,
|
||||
size: 10,
|
||||
total: 0
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.init()
|
||||
},
|
||||
|
||||
methods: {
|
||||
init() {
|
||||
if (this.show && !this.initialized) {
|
||||
this.getData()
|
||||
this.initialized = true
|
||||
}
|
||||
},
|
||||
getData(point) {
|
||||
myMission(this.current, this.size, this.status).then(res => {
|
||||
if (this.current === 1) {
|
||||
this.data = [];
|
||||
}
|
||||
this.current += 1;
|
||||
this.total = res.data.data.total;
|
||||
if (res.data.data && res.data.data.records.length) {
|
||||
this.data.push(res.data.data.records);
|
||||
}
|
||||
})
|
||||
},
|
||||
upLoad() {
|
||||
if (this.current <= Math.ceil(this.total / this.size)) {
|
||||
this.getData();
|
||||
} else {
|
||||
uni.showToast({
|
||||
icon: "none",
|
||||
title: '已经是最后一页',
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
watch: {
|
||||
show(val) {
|
||||
this.init()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.probody image {
|
||||
width: 88rpx;
|
||||
height: 88rpx;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.probody {
|
||||
width: 100%;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.baddd {
|
||||
background: #f6f6f6;
|
||||
height: 20rpx;
|
||||
}
|
||||
|
||||
.nothing {
|
||||
height: 100%;
|
||||
padding-top: 50%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.nothing image {
|
||||
width: 400rpx;
|
||||
height: 200rpx;
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.nothingContnt {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
margin-top: 30rpx;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
153
pageMy/myProject/myProject.vue
Normal file
@@ -0,0 +1,153 @@
|
||||
<template>
|
||||
<view class="body">
|
||||
<view class="tab">
|
||||
<v-tabs :tabs="['全部任务','抢成功','抢失败']" v-model="activeTab" color="#999" activeColor="#000" fontSize="36rx"
|
||||
activeFontSize="36rpx" @change='changeTab' />
|
||||
</view>
|
||||
<block v-for="(page, pIndex) in data" :key="pIndex">
|
||||
<block v-for="(item, index) in page" :key="item.id">
|
||||
<view class="probody">
|
||||
<company-list :companyitem="item" :noApply="false"></company-list>
|
||||
<view class="baddd"></view>
|
||||
<block>
|
||||
<image src="/static/img/tab.orange.svg" mode="" v-if="item.status === 1"></image>
|
||||
<image src="/static/img/tab.blue.svg" mode="" v-else-if="item.status === 2"></image>
|
||||
<image src="/static/img/tab.green.svg" mode="" v-else-if="item.status === 3"></image>
|
||||
<image src="/static/img/tab.gray.svg" mode="" v-else></image>
|
||||
</block>
|
||||
</view>
|
||||
</block>
|
||||
</block>
|
||||
<view class="nothing" v-if="data.length === 0">
|
||||
<image src="/static/img/pic_notask.svg" mode=""></image>
|
||||
<view class="nothingContnt">
|
||||
暂无任务信息
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import vTabs from '@/components/v-tabs/v-tabs.vue';
|
||||
import companyList from '@/components/companyList/companyList.vue';
|
||||
import {
|
||||
myMission
|
||||
} from '@/api/mission.js';
|
||||
|
||||
export default {
|
||||
components: {
|
||||
vTabs,
|
||||
companyList
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
data: [],
|
||||
activeTab: 0,
|
||||
current: 1,
|
||||
size: 10,
|
||||
total: 0
|
||||
}
|
||||
},
|
||||
onLoad: function() {
|
||||
this.init()
|
||||
},
|
||||
/*页面滚动到底部 换页*/
|
||||
onReachBottom: function() {
|
||||
if (this.current <= Math.ceil(this.total / this.size)) {
|
||||
this.getData();
|
||||
} else {
|
||||
uni.showToast({
|
||||
icon: "none",
|
||||
title: '已经是最后一页',
|
||||
})
|
||||
}
|
||||
},
|
||||
/*下拉刷新*/
|
||||
onPullDownRefresh:function(){
|
||||
this.init()
|
||||
},
|
||||
methods: {
|
||||
init(){
|
||||
this.current = 1
|
||||
this.data = []
|
||||
this.getData()
|
||||
},
|
||||
getData() {
|
||||
var status = Number(this.activeTab) + 1
|
||||
myMission(this.current, this.size, status).then(res => {
|
||||
uni.stopPullDownRefresh();
|
||||
if (this.current === 1) {
|
||||
this.data = [];
|
||||
}
|
||||
this.current += 1;
|
||||
this.total = res.data.data.total;
|
||||
if (res.data.data && res.data.data.records.length) {
|
||||
this.data.push(res.data.data.records);
|
||||
}
|
||||
})
|
||||
},
|
||||
gomap: function() {
|
||||
uni.navigateTo({
|
||||
url: '../mapSeach/mapSeach'
|
||||
})
|
||||
},
|
||||
changeTab: function(e) {
|
||||
this.activeTab = e;
|
||||
this.init()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
page {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.tab {
|
||||
height: 46px;
|
||||
}
|
||||
|
||||
.body {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.probody image {
|
||||
width: 88rpx;
|
||||
height: 88rpx;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
}
|
||||
|
||||
.probody {
|
||||
width: 100%;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.baddd {
|
||||
background: #f6f6f6;
|
||||
height: 20rpx;
|
||||
}
|
||||
|
||||
.nothing {
|
||||
height: 100%;
|
||||
padding-top: 50%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.nothing image {
|
||||
width: 400rpx;
|
||||
height: 200rpx;
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.nothingContnt {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
margin-top: 30rpx;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
145
pageMy/mycomment/mycomment.vue
Normal file
@@ -0,0 +1,145 @@
|
||||
<template>
|
||||
<view>
|
||||
<view class="noComment" v-if='comment.scoreAll <= 0 || JSON.stringify(comment) == "{}"'>
|
||||
<view class="start">
|
||||
<view @click="setScore(index + 1)" :key="index" v-for="(i,index) in 5">
|
||||
<image src="../../static/img/star.full.svg" v-if="index + 1 <= commentscore"></image>
|
||||
<image src="../../static/img/star.empty.svg" v-else></image>
|
||||
</view>
|
||||
</view>
|
||||
<view class="textview">
|
||||
<textarea value="" @input="settext" placeholder="评论(选填)100字以内" placeholder-class="textClass" maxlength="100" />
|
||||
</view>
|
||||
<view class="btn" @click="sendCom"><view class="bottombtn">确认</view></view>
|
||||
</view>
|
||||
<view class="noComment" v-if='comment.scoreAll>0'>
|
||||
<view class="start">
|
||||
评分
|
||||
<image src="../../static/img/star.full.svg" v-for="index in comment.scoreAll" mode="" :key="index"></image>
|
||||
<image src="../../static/img/star.empty.svg" v-for="index in (5-comment.scoreAll)" mode="" :key="index"></image>
|
||||
</view>
|
||||
<view class="textview">
|
||||
<textarea :value="comment.remarks" disabled />
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {myRate,rate,rateDetail } from '@/api/rate.js';
|
||||
import testData from '@/common/textdata.js';
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
comment:{},
|
||||
missionNo:'',
|
||||
commenttext:'',
|
||||
commentscore:0
|
||||
}
|
||||
},
|
||||
onLoad: function (option) {
|
||||
if(option.missionNo){
|
||||
this.missionNo = decodeURIComponent(option.missionNo);
|
||||
}
|
||||
},
|
||||
onShow: function() {
|
||||
/*获取评价详情*/
|
||||
rateDetail(this.missionNo).then(res => {
|
||||
this.comment = res.data.data;
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
settext:function(e){
|
||||
this.commenttext=e.detail.value;
|
||||
},
|
||||
setScore:function(score){
|
||||
this.commentscore = score
|
||||
},
|
||||
/*提交*/
|
||||
sendCom:function(){
|
||||
if(!this.commentscore){
|
||||
uni.showToast({
|
||||
icon:'none',
|
||||
title:'请完成评分',
|
||||
duration:3000
|
||||
})
|
||||
return
|
||||
}else{
|
||||
rate(this.missionNo,this.commentscore,this.commenttext).then(res => {
|
||||
uni.showToast({
|
||||
icon:'none',
|
||||
title:'提交成功',
|
||||
duration:3000,
|
||||
success: function (res) {
|
||||
uni.navigateBack({
|
||||
delta: 1
|
||||
})
|
||||
}
|
||||
})
|
||||
}, error => {
|
||||
uni.showToast({
|
||||
icon:'none',
|
||||
title:'操作失败',
|
||||
duration:3000
|
||||
})
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.bottombtn {
|
||||
background-color: #1b66ff;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
border-radius: 10rpx;
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 32rpx;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
}
|
||||
.btn {
|
||||
background-color: #fefefe;
|
||||
width: 690rpx;
|
||||
padding: 30rpx;
|
||||
padding-bottom: 80rpx;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
.textview{
|
||||
padding: 20rpx;
|
||||
}
|
||||
textarea{
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #666;
|
||||
|
||||
}
|
||||
.textClass{
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #CCCCCC;
|
||||
}
|
||||
.start view:first-child{
|
||||
margin-left: 20rpx;
|
||||
}
|
||||
.start image{
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
.start{
|
||||
padding: 20rpx;
|
||||
border-bottom: 1rpx solid #f6f6f6;
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
page{background-color: #fefefe;}
|
||||
</style>
|
||||
198
pageMy/setUserBase/icCard/add.vue
Normal file
@@ -0,0 +1,198 @@
|
||||
<template>
|
||||
<view class="body">
|
||||
<view class="list">
|
||||
<view class="listName">
|
||||
开户银行
|
||||
</view>
|
||||
<view class="listContent" @click="goBankList">
|
||||
{{bankName}}
|
||||
<image src="@/static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
</view>
|
||||
<view class="list">
|
||||
<view class="listName">
|
||||
银行卡号
|
||||
</view>
|
||||
<text v-if="edit">{{bankCardFilter(cardNumber)}}</text>
|
||||
<input v-else type="number" v-model="cardNumber" placeholder="请输入银行卡号" placeholder-style="color:#cccccc;" />
|
||||
</view>
|
||||
<view class="list">
|
||||
<view class="listName">
|
||||
默认银行卡
|
||||
</view>
|
||||
<switch :disabled="!canEditDef" :checked="def" @change="switchChange" />
|
||||
</view>
|
||||
<view v-if="loading" class="btn">
|
||||
<view class="bottombtn nocheck">{{btnText}}中</view>
|
||||
</view>
|
||||
<view v-else-if="validate" class="btn">
|
||||
<view class="bottombtn nocheck">{{btnText}}</view>
|
||||
</view>
|
||||
<view v-else class="btn" @click="goSet">
|
||||
<view class="bottombtn">{{btnText}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
bank
|
||||
} from '@/api/auth.js'
|
||||
import {
|
||||
validatenull
|
||||
} from '@/untils/validate.js'
|
||||
import {
|
||||
mapGetters
|
||||
} from 'vuex'
|
||||
import {
|
||||
bankCardFilter
|
||||
} from '@/untils/format.js'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
edit: false,
|
||||
canEditDef: false,
|
||||
loading: false,
|
||||
id: null,
|
||||
bankId: '',
|
||||
bankName: '选择银行',
|
||||
cardNumber: '',
|
||||
def: true,
|
||||
btnText: "认证"
|
||||
};
|
||||
},
|
||||
onLoad({
|
||||
id,
|
||||
name,
|
||||
card,
|
||||
def
|
||||
}) {
|
||||
if (id) {
|
||||
this.edit = true
|
||||
this.id = id
|
||||
this.bankId = this.bankName = name
|
||||
this.cardNumber = card
|
||||
this.def = def === '1'
|
||||
this.canEditDef = !this.def && this.auth.bankCardState
|
||||
this.btnText = '修改'
|
||||
} else {
|
||||
this.canEditDef = this.auth.bankCardState
|
||||
this.btnText = '认证'
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
goBankList: function() {
|
||||
uni.$once('icCardSetBank', (data) => {
|
||||
this.bankId = data.id;
|
||||
this.bankName = data.name;
|
||||
})
|
||||
uni.navigateTo({
|
||||
url: '/pages/bankList/bankList'
|
||||
})
|
||||
},
|
||||
goSet() {
|
||||
this.loading = true
|
||||
bank(this.bankName, this.auth.authInfo.realName, this.cardNumber, this.def ? 1 : 0, this.id).then(resp => {
|
||||
this.loading = false
|
||||
this.$store.commit('SET_AUTH_BANKCARD', true)
|
||||
uni.navigateBack()
|
||||
}).catch(() => {
|
||||
this.loading = false
|
||||
})
|
||||
},
|
||||
switchChange(e) {
|
||||
if (this.auth.bankCardState && this.canEditDef) {
|
||||
this.def = !this.def
|
||||
}
|
||||
},
|
||||
bankCardFilter
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(['auth']),
|
||||
validate() {
|
||||
return validatenull(this.bankId) || validatenull(this.cardNumber)
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.list switch {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.nocheck {
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
.listName {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
width: 200rpx;
|
||||
}
|
||||
|
||||
.listContent image {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
|
||||
.listContent {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.list input,
|
||||
.list text {
|
||||
margin-left: auto;
|
||||
text-align: right;
|
||||
}
|
||||
.list input{
|
||||
flex:1;
|
||||
}
|
||||
.list {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
padding: 30rpx;
|
||||
padding-left: 0;
|
||||
border-bottom: 1rpx solid #f2f2f2;
|
||||
}
|
||||
|
||||
.body {
|
||||
background-color: #fefefe;
|
||||
margin-top: 30rpx;
|
||||
padding-left: 30rpx;
|
||||
}
|
||||
|
||||
page {
|
||||
background-color: #f6f6f6;
|
||||
}
|
||||
|
||||
.bottombtn {
|
||||
background-color: #1b66ff;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
border-radius: 10rpx;
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 32rpx;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
}
|
||||
|
||||
.btn {
|
||||
background-color: #fefefe;
|
||||
width: 690rpx;
|
||||
padding: 30rpx;
|
||||
padding-bottom: 80rpx;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
</style>
|
||||
182
pageMy/setUserBase/icCard/index.vue
Normal file
@@ -0,0 +1,182 @@
|
||||
<template>
|
||||
<view>
|
||||
<view class="cardList" v-for="item in cards" :key="item.id" @click="editIc(item)">
|
||||
<image src="@/static/img/exp/map.svg" class="cardBack" mode=""></image>
|
||||
<view class="cardName">
|
||||
{{item.bankName}}
|
||||
</view>
|
||||
<view class="cardType">
|
||||
储蓄卡
|
||||
</view>
|
||||
<view class="cardNo">
|
||||
{{bankCardFilter(item.cardNumber)}}
|
||||
</view>
|
||||
<view class="delect" @click.stop="delect(item.id)" v-if="cards.length > 1 && item.def != 1">
|
||||
<image src="@/static/img/exp/link.svg" mode=""></image>
|
||||
<view class="delectContent">
|
||||
解绑银行卡
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="btn" @click="addIc">
|
||||
<image src="@/static/img/add.svg" mode=""></image>
|
||||
添加银行卡
|
||||
</view>
|
||||
<view class="tx">
|
||||
目前仅支持储蓄卡
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
getUserCards,
|
||||
remove
|
||||
} from '@/api/bank.js'
|
||||
import {
|
||||
bankCardFilter
|
||||
} from '@/untils/format.js'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
cards: []
|
||||
}
|
||||
},
|
||||
onShow() {
|
||||
this.getData()
|
||||
},
|
||||
methods: {
|
||||
getData() {
|
||||
getUserCards().then(res => {
|
||||
this.cards = res.data.data
|
||||
})
|
||||
},
|
||||
addIc: function() {
|
||||
uni.navigateTo({
|
||||
url: './add'
|
||||
})
|
||||
},
|
||||
editIc(ic) {
|
||||
uni.navigateTo({
|
||||
url: `./add?id=${ic.id}&name=${ic.bankName}&card=${ic.cardNumber}&def=${ic.def}`
|
||||
})
|
||||
},
|
||||
delect(id) {
|
||||
uni.showModal({
|
||||
title: '解绑银行卡',
|
||||
content: '解绑银行卡后工资将不会发放到此银行卡中',
|
||||
cancelText: '保持绑定',
|
||||
cancelColor: '#1B66FF',
|
||||
confirmText: '仍要解绑',
|
||||
confirmColor: '#1B66FF',
|
||||
success: (res) => {
|
||||
if (res.confirm) {
|
||||
remove(id).then(() => {
|
||||
this.getData()
|
||||
})
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
bankCardFilter
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.cardBack {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
/* z-index: -1; */
|
||||
}
|
||||
|
||||
.tx {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 24rpx;
|
||||
color: #999999;
|
||||
text-align: center;
|
||||
margin-top: 20rpx;
|
||||
}
|
||||
|
||||
.btn image {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
|
||||
.btn {
|
||||
width: 690rpx;
|
||||
margin: 30rpx;
|
||||
background-color: #1B66FF;
|
||||
color: #fff;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 8rpx;
|
||||
}
|
||||
|
||||
.delect image {
|
||||
width: 20rpx;
|
||||
height: 20rpx;
|
||||
|
||||
}
|
||||
|
||||
.delect {
|
||||
position: absolute;
|
||||
right: 40rpx;
|
||||
top: 30rpx;
|
||||
background-color: rgba(255, 255, 255, 0.3) !important;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 24rpx;
|
||||
color: #FFFFFF;
|
||||
height: 36rpx;
|
||||
width: 170rpx;
|
||||
}
|
||||
|
||||
.cardNo {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #FFFFFF;
|
||||
position: absolute;
|
||||
left: 40rpx;
|
||||
bottom: 40rpx;
|
||||
}
|
||||
|
||||
.cardType {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 26rpx;
|
||||
color: #FFFFFF;
|
||||
padding-left: 40rpx;
|
||||
padding-top: 15rpx;
|
||||
}
|
||||
|
||||
.cardName {
|
||||
padding-left: 40rpx;
|
||||
padding-top: 50rpx;
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 36rpx;
|
||||
color: #FFFFFF;
|
||||
}
|
||||
|
||||
.cardList {
|
||||
position: relative;
|
||||
width: 690rpx;
|
||||
margin: 30rpx;
|
||||
background-image: linear-gradient(-31deg, #3E8EED 0%, #6BA5FF 24%, #84BDFF 45%, #397AFF 100%);
|
||||
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.30);
|
||||
border-radius: 15rpx;
|
||||
height: 280rpx;
|
||||
}
|
||||
|
||||
page {
|
||||
background-color: #f6f6f6;
|
||||
}
|
||||
</style>
|
||||
304
pageMy/setUserBase/index.vue
Normal file
@@ -0,0 +1,304 @@
|
||||
<template>
|
||||
<view class="body">
|
||||
<view class="head">
|
||||
<image src="@/static/img/pic_logo.svg" class="logo" mode=""></image>
|
||||
<view class="headuser">
|
||||
<image src="@/static/img/head.svg" class="headuserImg" mode=""></image>
|
||||
<view v-if="auth.realNameState" class="name">
|
||||
<view class="userName">{{authInfo.realName}}</view>
|
||||
<view class="userInfo">{{idNumberFilter(authInfo.idNumber)}}</view>
|
||||
</view>
|
||||
<view v-else class="name">
|
||||
<view class="userName">姓名</view>
|
||||
<view class="userInfo">身份证号</view>
|
||||
</view>
|
||||
<image v-if="auth.realNameState" src="@/static/img/exp/stamp2.svg" class="stamp" mode=""></image>
|
||||
<image v-else src="@/static/img/exp/stamp1.svg" class="stamp" mode=""></image>
|
||||
</view>
|
||||
<view class="tx">
|
||||
<image src="@/static/img/bao.svg" mode=""></image>
|
||||
<view class="txText">个人隐私信息安全保障中</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="border"></view>
|
||||
<!--<picker @change="bindPickerChange" :value="index" :range="laborType">
|
||||
<view class="list">
|
||||
<view class="listLeft">
|
||||
<view class="listTitle">身份信息</view>
|
||||
<view class="listContent">选择个人身份,获得精准推荐</view>
|
||||
</view>
|
||||
<view class="listRight">
|
||||
<view class="rightContent nochoose">
|
||||
<view v-if="auth.laborState" class="uni-input">{{ laborType[0] }}</view>
|
||||
<view v-else class="uni-input">未选择</view>
|
||||
</view>
|
||||
<image src="@/static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
</view>
|
||||
</picker>-->
|
||||
<view class="border"></view>
|
||||
<view class="list" @click="goRealName">
|
||||
<view class="listLeft">
|
||||
<view class="listTitle">实名认证</view>
|
||||
<view class="listContent">完成实名认证,提高信息可信度</view>
|
||||
</view>
|
||||
<view class="listRight">
|
||||
<view v-if="auth.realNameState" class="rightContent nochoose">已认证</view>
|
||||
<view v-else class="rightContent nochoose">未认证</view>
|
||||
<image src="@/static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
</view>
|
||||
<view class="border"></view>
|
||||
<view class="list" @click="setIcCard">
|
||||
<view class="listLeft">
|
||||
<view class="listTitle">银行卡认证</view>
|
||||
<view class="listContent">完善银行卡信息,方便领工资</view>
|
||||
</view>
|
||||
<view class="listRight">
|
||||
<view v-if="auth.bankCardState" class="rightContent nochoose">已认证</view>
|
||||
<view v-else class="rightContent nochoose">未认证</view>
|
||||
<image src="@/static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
</view>
|
||||
<view class="border"></view>
|
||||
<!--<picker @change="bindPickerChangeBao" :value="indexbao" :range="insureType">
|
||||
<view class="list">
|
||||
<view class="listLeft">
|
||||
<view class="listTitle">社保信息</view>
|
||||
<view class="listContent">选择个人身份,获得精准推荐</view>
|
||||
</view>
|
||||
<view class="listRight">
|
||||
<view class="rightContent nochoose">
|
||||
<view v-if="auth.insureState" class="uni-input">{{ insureType[indexbao] }}</view>
|
||||
<view v-else class="uni-input">未选择</view>
|
||||
</view>
|
||||
<image src="@/static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
</view>
|
||||
</picker>-->
|
||||
<view class="border"></view>
|
||||
<view class="list" @click="setSeal">
|
||||
<view class="listLeft">
|
||||
<view class="listTitle">个人签名</view>
|
||||
<view class="listContent">采集手写签名,便于维护自身利益</view>
|
||||
</view>
|
||||
<view class="listRight">
|
||||
<view v-if="autograph.data && autograph.data.signSrcUrl" class="rightContent nochoose">已采集</view>
|
||||
<view v-else class="rightContent nochoose">未采集</view>
|
||||
<image src="@/static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import textdata from '@/common/textdata.js'
|
||||
import {
|
||||
mapGetters
|
||||
} from 'vuex'
|
||||
import {
|
||||
idNumberFilter
|
||||
} from '@/untils/format.js'
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
laborType: textdata.laborType,
|
||||
index: 0,
|
||||
insureType: textdata.insureType,
|
||||
};
|
||||
},
|
||||
onLoad() {
|
||||
this.$store.dispatch('setAutograph')
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(['auth', 'authInfo', 'autograph']),
|
||||
indexbao() {
|
||||
if (this.auth.insureState) {
|
||||
return this.authInfo.bakValue - 1
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
setSeal(){
|
||||
if (this.auth.realNameState) {
|
||||
uni.navigateTo({
|
||||
url: '/pageMy/setUserBase/seal/index'
|
||||
})
|
||||
} else {
|
||||
uni.showToast({
|
||||
title: '请先完成实名认证',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
},
|
||||
setIcCard: function() {
|
||||
if (this.auth.realNameState) {
|
||||
uni.navigateTo({
|
||||
url: '/pageMy/setUserBase/icCard/index'
|
||||
})
|
||||
} else {
|
||||
uni.showToast({
|
||||
title: '请先完成实名认证',
|
||||
icon: 'none'
|
||||
})
|
||||
}
|
||||
},
|
||||
goRealName: function() {
|
||||
uni.navigateTo({
|
||||
url: '/pageMy/setUserBase/realName'
|
||||
})
|
||||
},
|
||||
bindPickerChangeBao: function(e) {
|
||||
uni.showLoading()
|
||||
this.$store.dispatch('authInsure', e.target.value * 1 + 1).then(resp => {
|
||||
uni.hideLoading()
|
||||
}).catch(() => {
|
||||
uni.hideLoading()
|
||||
})
|
||||
},
|
||||
bindPickerChange: function(e) {
|
||||
uni.showLoading()
|
||||
this.$store.dispatch('authLabor').then(resp => {
|
||||
this.index = e.target.value;
|
||||
uni.hideLoading()
|
||||
}).catch(() => {
|
||||
uni.hideLoading()
|
||||
})
|
||||
},
|
||||
idNumberFilter
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.nochoose {
|
||||
color: #1b66ff;
|
||||
}
|
||||
|
||||
.listRight {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.listRight image {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
margin-left: 15rpx;
|
||||
}
|
||||
|
||||
.listContent {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
.list {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
padding: 30rpx;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
|
||||
.border {
|
||||
margin-left: 30rpx;
|
||||
width: 720rpx;
|
||||
height: 2rpx;
|
||||
background-color: #f2f2f2;
|
||||
/* border-bottom: 1rpx solid #dddddd; */
|
||||
}
|
||||
|
||||
.tx image {
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
margin-right: 10rpx;
|
||||
}
|
||||
|
||||
.tx {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 24rpx;
|
||||
color: #ffffff;
|
||||
padding: 30rpx;
|
||||
padding-top: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.userInfo {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 26rpx;
|
||||
color: #ffffff;
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
.name {
|
||||
margin-left: 20rpx;
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 36rpx;
|
||||
color: #ffffff;
|
||||
font-weight: bold;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
|
||||
.headuserImg {
|
||||
width: 100rpx;
|
||||
height: 100rpx;
|
||||
}
|
||||
|
||||
.headuser {
|
||||
padding: 30rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.stamp {
|
||||
position: absolute;
|
||||
top: 30rpx;
|
||||
right: 30rpx;
|
||||
/* opacity: 0.6; */
|
||||
width: 200rpx;
|
||||
height: 200rpx;
|
||||
}
|
||||
|
||||
.logo {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
opacity: 0.1;
|
||||
width: 200rpx;
|
||||
height: 200rpx;
|
||||
}
|
||||
|
||||
.head {
|
||||
width: 690rpx;
|
||||
height: 250rpx;
|
||||
padding-top: 30rpx;
|
||||
margin: 30rpx;
|
||||
margin-top: 0;
|
||||
border-radius: 15rpx;
|
||||
position: relative;
|
||||
background: #1b66ff;
|
||||
box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.3);
|
||||
}
|
||||
|
||||
.body {
|
||||
background-color: #fefefe;
|
||||
padding-top: 30rpx;
|
||||
}
|
||||
|
||||
page {
|
||||
background-color: #f6f6f6;
|
||||
}
|
||||
</style>
|
||||
247
pageMy/setUserBase/realName.vue
Normal file
@@ -0,0 +1,247 @@
|
||||
<template>
|
||||
<view class="body">
|
||||
<view class="list">
|
||||
<view class="name">
|
||||
姓名
|
||||
</view>
|
||||
<text v-if="auth.realNameState" style="color: #1b66ff;">{{auth.authInfo.realName}}</text>
|
||||
<input v-else type="text" value="" placeholder="请输入真实姓名" @input="setName" placeholder-style="color:#cccccc;" />
|
||||
</view>
|
||||
<view>
|
||||
<view class="list">
|
||||
<view class="name">
|
||||
身份证号
|
||||
</view>
|
||||
<text v-if="auth.realNameState" style="color: #1b66ff;">{{idNumberFilter(auth.authInfo.idNumber)}}</text>
|
||||
<input v-else type="idcard" value="" placeholder="请输入身份证号" @input="setCard" style="text-transform:uppercase"
|
||||
placeholder-style="color:#cccccc;" />
|
||||
</view>
|
||||
<view v-if="error" class="error">身份证填写有误</view>
|
||||
</view>
|
||||
<picker :range="identityList" @change="identityChange" :value="index">
|
||||
<view class="list">
|
||||
<view class="listLeft">
|
||||
<view class="name">
|
||||
身份信息
|
||||
</view>
|
||||
<view class="listContent">完成实名认证,提高信息可信度</view>
|
||||
</view>
|
||||
<view class="listRight">
|
||||
<view class="listRightContent">
|
||||
<view class="" v-if="auth.laborState">已认证</view>
|
||||
<view class="" v-else>未认证</view>
|
||||
</view>
|
||||
<image src="@/static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
</view>
|
||||
</picker>
|
||||
<picker :range="insureList" @change="insureChange" :value="indexBao">
|
||||
<view class="list">
|
||||
<view class="listLeft">
|
||||
<view class="name">
|
||||
社保信息
|
||||
</view>
|
||||
<view class="listContent">选择个人身份,获得精准推荐</view>
|
||||
</view>
|
||||
<view class="listRight">
|
||||
<view class="listRightContent">
|
||||
<view class="" v-if="auth.insureState">{{insureList[indexBao]}}</view>
|
||||
<view class="" v-else>未选择</view>
|
||||
</view>
|
||||
<image src="@/static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
</view>
|
||||
</picker>
|
||||
<view v-if="auth.realNameState"></view>
|
||||
<view class="btn nocheck" v-else-if="loading">
|
||||
<view class="bottombtn">
|
||||
认证中
|
||||
</view>
|
||||
</view>
|
||||
<view class="btn" @click="goSet" v-else-if="check">
|
||||
<view class="bottombtn">
|
||||
认证
|
||||
</view>
|
||||
</view>
|
||||
<view class="btn nocheck" v-else>
|
||||
<view class="bottombtn">
|
||||
认证
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
check18IdCardNo,
|
||||
validatenull
|
||||
} from '@/untils/validate.js'
|
||||
import {
|
||||
mapGetters
|
||||
} from 'vuex'
|
||||
import {
|
||||
idNumberFilter
|
||||
} from '@/untils/format.js'
|
||||
import textdata from '@/common/textdata.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
name: '',
|
||||
card: '',
|
||||
loading: false,
|
||||
error: false,
|
||||
identityList: textdata.laborType,
|
||||
insureList: textdata.insureType,
|
||||
index: 0,
|
||||
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
setName: function(e) {
|
||||
this.name = e.detail.value;
|
||||
},
|
||||
setCard: function(e) {
|
||||
this.card = e.detail.value.toUpperCase();
|
||||
this.error = !check18IdCardNo(this.card)
|
||||
return e.detail.value.toUpperCase()
|
||||
},
|
||||
goSet: function() {
|
||||
this.loading = true
|
||||
this.$store.dispatch('authRealName', {
|
||||
name: this.name,
|
||||
idNumber: this.card
|
||||
})
|
||||
.then(() => {
|
||||
this.loading = false
|
||||
uni.navigateBack()
|
||||
}).catch(() => {
|
||||
this.loading = false
|
||||
})
|
||||
},
|
||||
idNumberFilter,
|
||||
identityChange(val) {
|
||||
uni.showLoading();
|
||||
this.$store.dispatch('authLabor').then(() => {
|
||||
this.index = val.detail.value;
|
||||
uni.hideLoading();
|
||||
}).catch(() => {
|
||||
uni.hideLoading();
|
||||
})
|
||||
},
|
||||
insureChange(val) {
|
||||
uni.showLoading();
|
||||
this.$store.dispatch('authInsure', val.detail.value * 1 + 1).then(() => {
|
||||
uni.hideLoading();
|
||||
}).catch(()=>{
|
||||
uni.hideLoading();
|
||||
})
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(['auth', 'authInfo']),
|
||||
check() {
|
||||
return check18IdCardNo(this.card) && !validatenull(this.name)
|
||||
},
|
||||
indexBao() {
|
||||
if (this.auth.insureState) {
|
||||
return this.authInfo.bakValue - 1
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.bottombtn {
|
||||
background-color: #1B66FF;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
border-radius: 10rpx;
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 32rpx;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
}
|
||||
|
||||
.btn {
|
||||
background-color: #fefefe;
|
||||
width: 690rpx;
|
||||
padding: 30rpx;
|
||||
padding-bottom: 80rpx;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.name {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: #333333;
|
||||
width: 200rpx;
|
||||
}
|
||||
|
||||
.error {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 26rpx;
|
||||
color: red;
|
||||
margin: 5px 0 0 200rpx;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.list {
|
||||
padding: 20rpx;
|
||||
padding-left: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
border-bottom: 1rpx solid #f2f2f2;
|
||||
font-size: 28rpx;
|
||||
}
|
||||
|
||||
.pickerList {
|
||||
padding: 20rpx;
|
||||
padding-left: 0;
|
||||
|
||||
border-bottom: 1rpx solid #f2f2f2;
|
||||
}
|
||||
|
||||
.listRight {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.listRightContent {
|
||||
color: #1b66ff;
|
||||
}
|
||||
|
||||
.listRight image {
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
margin-left: 15rpx;
|
||||
}
|
||||
|
||||
.listContent {
|
||||
color: #999;
|
||||
font-size: 28rpx;
|
||||
}
|
||||
|
||||
.body {
|
||||
background-color: #fefefe;
|
||||
padding-left: 20rpx;
|
||||
margin-top: 20rpx;
|
||||
}
|
||||
|
||||
.nocheck {
|
||||
opacity: 0.3;
|
||||
}
|
||||
|
||||
page {
|
||||
background-color: #f6f6f6;
|
||||
}
|
||||
</style>
|
||||
201
pageMy/setUserBase/seal/forget.vue
Normal file
@@ -0,0 +1,201 @@
|
||||
<template>
|
||||
<view class="forget">
|
||||
<view class="phone">
|
||||
手机号: {{phoneFilter(userInfo.user_name)}}
|
||||
</view>
|
||||
<view class="codeBox">
|
||||
<jl-input type="number" v-model="code" placeholder="请输入验证码"></jl-input>
|
||||
<view v-if="action === 'can'" class="code" @click="getCode">
|
||||
获取验证码
|
||||
</view>
|
||||
<view v-else-if="action === 'wait'" class="code">
|
||||
获取验证码({{codeint}}s)
|
||||
</view>
|
||||
<view v-else-if="action === 'sending'" class="code">
|
||||
发送中...
|
||||
</view>
|
||||
</view>
|
||||
<jl-input type="number" :maxlength="maxlength" v-model="password" placeholder="请输入六位数字密码" @confirm="regPassword" showPassword clearable></jl-input>
|
||||
<jl-input type="number" :maxlength="maxlength" v-model="newPassword" placeholder="请再次输入六位数字密码" @confirm="regNewPassword" showPassword clearable></jl-input>
|
||||
<view v-if="error" class="error">两次密码输入不一致,请重新输入</view>
|
||||
<view class="btn">
|
||||
<view v-if="loading" class="bottombtn nocheck">提交中</view>
|
||||
<view v-else-if="!validate" class="bottombtn nocheck">确认</view>
|
||||
<view v-else @click="submit" class="bottombtn">确认</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {mapGetters} from 'vuex'
|
||||
import {
|
||||
phoneFilter
|
||||
} from '@/untils/format.js'
|
||||
import jlInput from '@/components/jl-input/main.vue'
|
||||
import {sendValidate, resetPass} from '@/api/auth.js'
|
||||
import {
|
||||
forgetPW,
|
||||
accountsendValidate,
|
||||
getCaptcha,
|
||||
validateCode
|
||||
} from '@/api/forgetPW.js'
|
||||
const resendTime = 120
|
||||
export default{
|
||||
data () {
|
||||
return {
|
||||
code: '',
|
||||
password: '',
|
||||
newPassword: '',
|
||||
action: 'can',
|
||||
maxlength: 6,
|
||||
codeint: resendTime,
|
||||
loading: false,
|
||||
error: false,
|
||||
defCount:5,//默认发送短信次数
|
||||
}
|
||||
},
|
||||
onLoad(options) {
|
||||
if (options.forget) {
|
||||
uni.setNavigationBarTitle({
|
||||
title:'忘记密码'
|
||||
})
|
||||
}
|
||||
},
|
||||
components:{jlInput},
|
||||
methods: {
|
||||
phoneFilter,
|
||||
setTimer() {
|
||||
var sendCode = setInterval(() => {
|
||||
this.codeint -= 1;
|
||||
if (this.codeint <= 0) {
|
||||
this.action = 'can'
|
||||
this.codeint = resendTime;
|
||||
clearInterval(sendCode);
|
||||
return;
|
||||
}
|
||||
}, 1000)
|
||||
},
|
||||
getCode: function() {
|
||||
if (this.action !== 'can') {
|
||||
return;
|
||||
}
|
||||
this.action = 'sending';
|
||||
sendValidate(this.userInfo.user_name).then((res) => {
|
||||
if(res.data.code==200){
|
||||
let count=res.data.data;
|
||||
let diffCount=this.defCount-count;//剩余获取短信次数
|
||||
if(count>1 && count<=5){
|
||||
uni.showToast({
|
||||
title:`今日验证码已获取${count}次,还有${diffCount}次获取机会`,
|
||||
icon:'none',
|
||||
duration:3000
|
||||
})
|
||||
}
|
||||
this.action = 'wait'
|
||||
this.setTimer()
|
||||
}
|
||||
this.loading = false
|
||||
}).catch(() => {
|
||||
this.action='can'
|
||||
this.loading = false
|
||||
this.$refs.code.refushCode()
|
||||
})
|
||||
},
|
||||
submit(){
|
||||
if (this.password !== this.newPassword){
|
||||
this.error = true
|
||||
return
|
||||
}
|
||||
this.loading = true
|
||||
resetPass(this.userInfo.user_name, this.code, this.password).then(()=>{
|
||||
this.loading = false
|
||||
uni.showToast({
|
||||
title: '重置密码成功',
|
||||
icon: false
|
||||
})
|
||||
setTimeout(() => {
|
||||
uni.navigateBack()
|
||||
}, 1000)
|
||||
}).catch(()=>{
|
||||
this.loading = false
|
||||
})
|
||||
},
|
||||
regPassword(){
|
||||
if(this.password.length !== 6) {
|
||||
uni.showToast({
|
||||
title: '请设置长度6位的密码',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
},
|
||||
regNewPassword(){
|
||||
if(this.newPassword.length !== 6) {
|
||||
uni.showToast({
|
||||
title: '请设置长度6位的密码',
|
||||
icon: 'none'
|
||||
});
|
||||
} else if (this.password !== this.newPassword) {
|
||||
this.error = true
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
...mapGetters(['realName', 'userInfo']),
|
||||
validate() {
|
||||
return this.password.length ===6 && this.newPassword.length === 6 && this.code
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.error {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: red;
|
||||
}
|
||||
.forget{
|
||||
padding: 90rpx 80rpx 0 80rpx;
|
||||
.phone{
|
||||
height: 50rpx;
|
||||
font-size: 36rpx;
|
||||
font-weight: 400;
|
||||
color: #000000;
|
||||
line-height: 50rpx;margin-bottom: 90rpx;
|
||||
}
|
||||
}
|
||||
.codeBox{
|
||||
position: relative;
|
||||
.code{
|
||||
z-index: 999;
|
||||
position: absolute;
|
||||
top: 20px;
|
||||
right:14px;
|
||||
height: 60rpx;
|
||||
line-height: 60rpx;
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
color: #1B66FF;
|
||||
line-height: 38rpx;
|
||||
|
||||
}
|
||||
}
|
||||
.nocheck {
|
||||
opacity: 0.3;
|
||||
}
|
||||
.bottombtn {
|
||||
background-color: #1B66FF;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
border-radius: 10rpx;
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 32rpx;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
}
|
||||
|
||||
.btn {
|
||||
background-color: #fefefe;
|
||||
padding: 70rpx 80rpx;
|
||||
}
|
||||
</style>
|
||||
147
pageMy/setUserBase/seal/index.vue
Normal file
@@ -0,0 +1,147 @@
|
||||
<template>
|
||||
<view class="collectionWrap">
|
||||
<view class="sealBox">
|
||||
<image v-if="src" class="img" mode="aspectFit" :src="src"></image>
|
||||
<view v-else style="height: 100%;
|
||||
line-height: 468rpx;
|
||||
font-size: 30rpx;
|
||||
color: #999999;
|
||||
background: #FFFFFF;
|
||||
text-align: center;" @click="goSeal()">点击输入手写签名</view>
|
||||
</view>
|
||||
<view v-if="!src" class="sealAgreement">
|
||||
<view class="check-icon" @click="checkClick">
|
||||
<image src="../../../static/img/checkOk.png" style="width: 30rpx;height:30rpx;" v-if="status"></image>
|
||||
<view class="seal-nocheck" v-else></view>
|
||||
</view>
|
||||
<view>我已阅读并同意</view>
|
||||
<view class="agreement" @click="go('/pages/user/sealAgreement')">《申请数字证书协议》</view>
|
||||
</view>
|
||||
<view v-if="src" class="forget" @click="goForget()">
|
||||
<view>重置密码</view>
|
||||
<image src="@/static/img/right.svg" mode=""></image>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {mapGetters} from 'vuex'
|
||||
import uniCopy from '@/js_sdk/xb-copy/uni-copy.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
status: false
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
go(url){
|
||||
uni.navigateTo({
|
||||
url
|
||||
})
|
||||
},
|
||||
checkClick(){
|
||||
this.status = !this.status
|
||||
},
|
||||
realNameState(){
|
||||
if (!this.auth.realNameState) {
|
||||
uni.showToast({
|
||||
title: "未实名认证用户,请先进行实名认证。未完成实名认证,无法成功采集签名。",
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
},
|
||||
goSeal(url){
|
||||
this.realNameState()
|
||||
if (!this.status){
|
||||
uni.showToast({
|
||||
title: '请先阅读并同意《申请证书协议》',
|
||||
icon: 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
uni.navigateTo({
|
||||
url:`/pageMy/setUserBase/seal/sealCanvas?path=/pageMy/setUserBase/index`
|
||||
})
|
||||
},
|
||||
goForget(){
|
||||
this.realNameState()
|
||||
uni.navigateTo({
|
||||
url: '/pageMy/setUserBase/seal/forget'
|
||||
})
|
||||
},
|
||||
getInpCode: function(e) {
|
||||
console.log(e)
|
||||
}
|
||||
},
|
||||
computed:{
|
||||
...mapGetters(['auth','autograph']),
|
||||
src() {
|
||||
if (this.autograph.data && this.autograph.data.signSrcUrl) {
|
||||
return this.autograph.data.signSrcUrl
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
page{
|
||||
background-color: #F6F6F6;
|
||||
}
|
||||
.sealAgreement{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin: 30rpx;
|
||||
font-size: 32rpx;
|
||||
.agreement{
|
||||
color: #007AFF;
|
||||
}
|
||||
}
|
||||
.check-icon{
|
||||
font-size: 28rpx;
|
||||
font-weight: 400;
|
||||
color: #999999;
|
||||
align-items: center;
|
||||
width: 30rpx;
|
||||
height: 30rpx;
|
||||
margin-right: 12rpx;
|
||||
.seal-nocheck{
|
||||
width: 26rpx;
|
||||
height: 26rpx;
|
||||
border-radius: 50%;
|
||||
border: 2rpx solid #999999;
|
||||
margin-right:12rpx;
|
||||
}
|
||||
}
|
||||
.sealBox{
|
||||
padding: 15px 15px 0 15px;
|
||||
}
|
||||
.sealBox .img{
|
||||
background-color: #FFFFFF;
|
||||
width: 692rpx;
|
||||
height: 344rpx;
|
||||
background-color: #FFFFFF;
|
||||
}
|
||||
.collectionWrap{
|
||||
.modify,.forget{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
background-color: #FFFFFF;
|
||||
padding:15px;
|
||||
image{
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
}
|
||||
}
|
||||
.forget{
|
||||
margin-top: 10px;
|
||||
font-size: 32rpx;
|
||||
font-weight: 400;
|
||||
color: #333333;
|
||||
line-height: 32rpx;
|
||||
|
||||
}
|
||||
}
|
||||
</style>
|
||||
36
pageMy/setUserBase/seal/sealCanvas.vue
Normal file
@@ -0,0 +1,36 @@
|
||||
<template>
|
||||
<view>
|
||||
<seal @finish="finish"></seal>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
|
||||
import seal from '@/components/uni-seal/seal.vue'
|
||||
export default {
|
||||
data(){
|
||||
return {
|
||||
path: ''
|
||||
}
|
||||
},
|
||||
onLoad(options){
|
||||
this.path = options.path
|
||||
},
|
||||
components:{seal},
|
||||
methods: {
|
||||
finish(e){
|
||||
const data = JSON.parse(e.data)
|
||||
// navigateTo
|
||||
// uni.navigateTo({
|
||||
// url: `/pageMy/setUserBase/seal/setSealPassword?src=${data.data.link}&path=${this.path}`
|
||||
// })
|
||||
uni.redirectTo({
|
||||
url: `/pageMy/setUserBase/seal/setSealPassword?src=${data.data.link}&path=${this.path}`
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
105
pageMy/setUserBase/seal/setSealPassword.vue
Normal file
@@ -0,0 +1,105 @@
|
||||
<template>
|
||||
<view style="padding: 122rpx 80rpx 0 80rpx;">
|
||||
<jl-input type="number" :maxlength="maxlength" v-model="password" placeholder="请输入六位数字密码" @confirm="regPassword" showPassword clearable></jl-input>
|
||||
<jl-input type="number" :maxlength="maxlength" v-model="newPassword" placeholder="请再次输入六位数字密码" @confirm="regNewPassword" showPassword clearable></jl-input>
|
||||
<view v-if="error" class="error">两次密码输入不一致,请重新输入</view>
|
||||
<view class="btn" >
|
||||
<view v-if="loading" class="bottombtn nocheck">提交中</view>
|
||||
<view v-else @click="submit" class="bottombtn" :class="{'nocheck':!validate}">确认</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import jlInput from '@/components/jl-input/main.vue'
|
||||
import {signGather} from '@/api/auth.js'
|
||||
export default{
|
||||
data (){
|
||||
return {
|
||||
sealSrc: '',
|
||||
password: '',
|
||||
newPassword: '',
|
||||
path: '',
|
||||
maxlength: 6,
|
||||
error: false,
|
||||
loading: false,
|
||||
}
|
||||
},
|
||||
onLoad(options){
|
||||
this.path = options.path
|
||||
// this.sealSrc = options.src + '?x-oss-process=image/resize,w_150,h_150/rotate,90'
|
||||
this.sealSrc = options.src
|
||||
},
|
||||
components:{jlInput},
|
||||
methods: {
|
||||
submit(){
|
||||
if (!this.validate) return
|
||||
this.loading = true
|
||||
const that = this
|
||||
signGather(this.sealSrc,this.password,this.newPassword).then(res => {
|
||||
that.loading = false
|
||||
that.$store.dispatch('setAutograph')
|
||||
if (this.path) {
|
||||
uni.navigateBack({
|
||||
url: this.path
|
||||
})
|
||||
}
|
||||
}, error => {
|
||||
that.loading = false
|
||||
console.log(error);
|
||||
});
|
||||
},
|
||||
regPassword(){
|
||||
if(this.password.length !== 6) {
|
||||
uni.showToast({
|
||||
title: '请设置长度6位的密码',
|
||||
icon: 'none'
|
||||
});
|
||||
}
|
||||
},
|
||||
regNewPassword(){
|
||||
if(this.newPassword.length !== 6) {
|
||||
uni.showToast({
|
||||
title: '请设置长度6位的密码',
|
||||
icon: 'none'
|
||||
});
|
||||
} else if (this.password !== this.newPassword) {
|
||||
this.error = true
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
validate() {
|
||||
return this.password.length ===6 && this.newPassword.length === 6 && this.password==this.newPassword
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.error {
|
||||
font-family: PingFangSC-Regular;
|
||||
font-size: 32rpx;
|
||||
color: red;
|
||||
margin-top:23rpx;
|
||||
}
|
||||
|
||||
.nocheck {
|
||||
opacity: 0.3;
|
||||
}
|
||||
.bottombtn {
|
||||
background-color: #1B66FF;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
border-radius: 10rpx;
|
||||
font-family: PingFangSC-Medium;
|
||||
font-size: 32rpx;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
}
|
||||
|
||||
.btn {
|
||||
background-color: #fefefe;
|
||||
padding: 70rpx 0;
|
||||
}
|
||||
</style>
|
||||
BIN
pageMy/static/img/federation/checkOk.png
Normal file
|
After Width: | Height: | Size: 809 B |
BIN
pageMy/static/img/federation/icon.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
pageMy/static/img/federation/jiansheyinhanghui.png
Normal file
|
After Width: | Height: | Size: 2.0 KiB |
BIN
pageMy/static/img/federation/jiansheyinhanglan.png
Normal file
|
After Width: | Height: | Size: 1.9 KiB |
BIN
pageMy/static/img/federation/notice.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
pageMy/static/img/federation/yilianlan.png
Normal file
|
After Width: | Height: | Size: 2.3 KiB |
BIN
pageMy/static/img/federation/yinlianhui.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
pageMy/static/img/help/auth.jpg
Normal file
|
After Width: | Height: | Size: 96 KiB |
BIN
pageMy/static/img/help/password.jpg
Normal file
|
After Width: | Height: | Size: 85 KiB |
BIN
pageMy/static/img/help/phone.jpg
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
pageMy/static/img/help/userInfo.jpg
Normal file
|
After Width: | Height: | Size: 82 KiB |
BIN
pageMy/static/img/seal/tips.png
Normal file
|
After Width: | Height: | Size: 11 KiB |