This commit is contained in:
18500206848
2024-02-02 14:44:30 +08:00
parent 6647042acb
commit 91172a730c
255 changed files with 24805 additions and 0 deletions

View 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
View 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>

View 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
View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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
View 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
View 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
View 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>

View 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>

View 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
View 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>

View 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
View 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>

View 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>

View 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
View 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>

View 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>

View 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>

View 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>

View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

View 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>

Binary file not shown.

After

Width:  |  Height:  |  Size: 809 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 96 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB