flat:来源标红

This commit is contained in:
Apcallover
2026-02-14 10:12:38 +08:00
parent adc762f676
commit 8b970abef2
13 changed files with 3858 additions and 3516 deletions

View File

@@ -1,35 +1,41 @@
<template> <template>
<view class="v-tabs" :style="{ height: height }"> <view class="v-tabs" :style="{ height: height }">
<scroll-view class="scroll-view" :show-scrollbar="false" scroll-x scroll-with-animation :scroll-left="scrollLeft" style="width: auto; height: 100%; overflow: hidden;"> <scroll-view
<view class="v-tabs__inner"> class="scroll-view"
<view :show-scrollbar="false"
class="v-tabs__item" scroll-x
:style="{ scroll-with-animation
color: activeTab == i ? activeColor : color, :scroll-left="scrollLeft"
fontSize: activeTab == i ? activeFontSize : fontSize, style="width: auto; height: 100%; overflow: hidden"
backgroundColor: activeTab == i ? backgroundColor : '',
borderRadius,
padding,
}"
:data-index="i"
:class="{ active: activeTab == i }"
@tap="handleTapItem"
v-for="(v, i) in tabs"
:key="i"
> >
<view class=""> <view class="v-tabs__inner">
{{ v }} <view
</view> class="v-tabs__item"
<view class="bottomborder"></view> :style="{
</view> color: activeTab == i ? activeColor : color,
</view> fontSize: activeTab == i ? activeFontSize : fontSize,
<!-- <view backgroundColor: activeTab == i ? backgroundColor : '',
borderRadius,
padding,
}"
:data-index="i"
:class="{ active: activeTab == i }"
@tap="handleTapItem"
v-for="(v, i) in tabs"
:key="i"
>
<view class="">
{{ v }}
</view>
<view class="bottomborder"></view>
</view>
</view>
<!-- <view
class="v-tabs__line" class="v-tabs__line"
:style="{ width: `${lineWidth}px`, height: `${lineHeight}`, backgroundColor: lineColor, transform: `translateX(${lineLeft}px)`, top: `calc(${height} - ${lineHeight})` }" :style="{ width: `${lineWidth}px`, height: `${lineHeight}`, backgroundColor: lineColor, transform: `translateX(${lineLeft}px)`, top: `calc(${height} - ${lineHeight})` }"
></view> --> ></view> -->
</scroll-view> </scroll-view>
</view> </view>
</template> </template>
<script> <script>
@@ -52,190 +58,190 @@
* @event {Function(activeTab)} change 改变标签触发 * @event {Function(activeTab)} change 改变标签触发
*/ */
export default { export default {
name: 'VTabs', name: 'VTabs',
props: { props: {
value: { value: {
type: [String, Number], type: [String, Number],
default: 0 default: 0,
},
height: {
type: String,
default: '45px',
},
tabs: {
type: Array,
default() {
return [];
},
},
backgroundColor: {
type: String,
default: 'transparent',
},
borderRadius: {
type: String,
default: '5px',
},
color: {
type: String,
default: '#333333',
},
activeColor: {
type: String,
default: '#007AFF',
},
fontSize: {
type: String,
default: '14px',
},
activeFontSize: {
type: String,
default: '14px',
},
padding: {
type: String,
default: '10rpx 20rpx',
},
lineScale: {
type: Number,
default: 0.6,
},
lineHeight: {
type: String,
default: '3px',
},
lineColor: {
type: String,
default: '#007AFF',
},
}, },
height: { data() {
type: String, return {
default: '45px' scrollLeft: 0,
activeTab: 0,
width: 0,
lineLeft: 0,
lineWidth: 0,
};
}, },
tabs: { watch: {
type: Array, activeTab(newVal) {
default() { this.$emit('input', newVal * 1);
return [] },
} value(newVal) {
this.activeTab = newVal;
this.getTabsWidth(0);
},
}, },
backgroundColor: { methods: {
type: String, handleTapItem(e) {
default: 'transparent' const index = e.currentTarget.dataset.index;
}, if (this.activeTab != index) {
borderRadius: { this.activeTab = index;
type: String, this.getTabsWidth(e.currentTarget.offsetLeft);
default: '5px' this.$emit('change', this.activeTab);
},
color: {
type: String,
default: '#333333'
},
activeColor: {
type: String,
default: '#007AFF'
},
fontSize: {
type: String,
default: '14px'
},
activeFontSize: {
type: String,
default: '14px'
},
padding: {
type: String,
default: '10rpx 20rpx'
},
lineScale: {
type: Number,
default: 0.6
},
lineHeight: {
type: String,
default: '3px'
},
lineColor: {
type: String,
default: '#007AFF'
}
},
data() {
return {
scrollLeft: 0,
activeTab: 0,
width: 0,
lineLeft: 0,
lineWidth: 0
}
},
watch: {
activeTab(newVal) {
this.$emit('input', newVal * 1)
},
value(newVal) {
this.activeTab = newVal
this.getTabsWidth(0)
}
},
methods: {
handleTapItem(e) {
const index = e.currentTarget.dataset.index
if (this.activeTab != index) {
this.activeTab = index
this.getTabsWidth(e.currentTarget.offsetLeft)
this.$emit('change', this.activeTab)
}
},
getTabsWidth(offsetLeft) {
const query = uni.createSelectorQuery().in(this)
query
.select('.v-tabs')
.boundingClientRect(data => {
this.width = data.width
})
.exec()
setTimeout(() => {
let i = 0
let width = 0
query
.selectAll('.v-tabs__item')
.boundingClientRect(data => {
width = data.reduce((total, currentValue, currentIndex, arr) => {
if (currentIndex < this.activeTab) {
total = total + currentValue.width
}
return total
}, 0)
const padding = this.padding.split(' ')[0]
const res = /(\d+)(upx|rpx|px)/.exec(padding)
if (res && (res[2] == 'upx' || res[2] == 'rpx')) {
width += uni.upx2px(res[1]) * 2 * this.activeTab
} else {
width += res[1] * this.activeTab
} }
}) },
.exec() getTabsWidth(offsetLeft) {
query const query = uni.createSelectorQuery().in(this);
.select('.v-tabs__item.active') query
.boundingClientRect(data => { .select('.v-tabs')
const ol = offsetLeft ? offsetLeft : width .boundingClientRect((data) => {
if (data.width) { this.width = data.width;
this.lineLeft = ol + (data.width * (1 - this.lineScale)) / 2 })
this.lineWidth = data.width * this.lineScale .exec();
this.scrollLeft = ol - (this.width - data.width) / 2 setTimeout(() => {
} let i = 0;
}) let width = 0;
.exec() query
}, 10) .selectAll('.v-tabs__item')
} .boundingClientRect((data) => {
}, width = data.reduce((total, currentValue, currentIndex, arr) => {
mounted() { if (currentIndex < this.activeTab) {
this.activeTab = this.value total = total + currentValue.width;
this.getTabsWidth(0) }
} return total;
} }, 0);
const padding = this.padding.split(' ')[0];
const res = /(\d+)(upx|rpx|px)/.exec(padding);
if (res && (res[2] == 'upx' || res[2] == 'rpx')) {
width += uni.upx2px(res[1]) * 2 * this.activeTab;
} else {
width += res[1] * this.activeTab;
}
})
.exec();
query
.select('.v-tabs__item.active')
.boundingClientRect((data) => {
const ol = offsetLeft ? offsetLeft : width;
if (data.width) {
this.lineLeft = ol + (data.width * (1 - this.lineScale)) / 2;
this.lineWidth = data.width * this.lineScale;
this.scrollLeft = ol - (this.width - data.width) / 2;
}
})
.exec();
}, 10);
},
},
mounted() {
this.activeTab = this.value;
this.getTabsWidth(0);
},
};
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.v-tabs { .v-tabs {
position: relative;
width: 100%;
white-space: nowrap;
overflow: hidden;
border-bottom: 1rpx solid #dddddd;
.v-tabs__inner {
position: relative; position: relative;
display: flex; width: 100%;
align-items: center; white-space: nowrap;
height: 100%; overflow: hidden;
justify-content: center; border-bottom: 1rpx solid #dddddd;
background-color: #fefefe; .v-tabs__inner {
// border-bottom: 1rpx solid #dddddd; position: relative;
border-bottom: 0; display: flex;
} align-items: center;
height: 100%;
.active{ justify-content: center;
border-radius: 0 !important; background-color: #fefefe;
.bottomborder{ // border-bottom: 1rpx solid #dddddd;
width: 42rpx; border-bottom: 0;
height: 6rpx;
margin: 0 auto;
background-color: #1B66FF;
border-radius: 20rpx;
overflow: hidden;
display: block !important;
margin-top: 10rpx;
}
}
.v-tabs__item {
// display: inline-flex;
margin-right: 20upx;
transition: all 0.3s ease;
&:last-child {
margin-right: 0;
} }
}
.v-tabs__line { .active {
position: absolute; border-radius: 0 !important;
z-index: 99; .bottomborder {
transition: all 0.3s linear; width: 42rpx;
border-radius: 4upx; height: 6rpx;
} margin: 0 auto;
background-color: #1b66ff;
border-radius: 20rpx;
overflow: hidden;
display: block !important;
margin-top: 10rpx;
}
}
.v-tabs__item {
// display: inline-flex;
margin-right: 20upx;
transition: all 0.3s ease;
&:last-child {
margin-right: 0;
}
}
.v-tabs__line {
position: absolute;
z-index: 99;
transition: all 0.3s linear;
border-radius: 4upx;
}
} }
/deep/ ::-webkit-scrollbar { ::v-deep ::-webkit-scrollbar {
display: none; display: none;
} }
</style> </style>

View File

@@ -1,22 +1,22 @@
{ {
"name" : "招聘", "name": "招聘",
"appid" : "__UNI__120CBFC", "appid": "__UNI__BFB9B45",
"description" : "", "description": "",
"versionName" : "1.0.0", "versionName": "1.0.0",
"versionCode" : "100", "versionCode": "100",
"transformPx" : false, "transformPx": false,
"sassImplementationName" : "node-sass", "sassImplementationName": "node-sass",
"app-plus" : { "app-plus": {
"usingComponents" : true, "usingComponents": true,
"compilerVersion" : 3, "compilerVersion": 3,
/* 5+App */ /* 5+App */
"modules" : {}, "modules": {},
/* */ /* */
"distribute" : { "distribute": {
/* */ /* */
"android" : { "android": {
/* android */ /* android */
"permissions" : [ "permissions": [
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>", "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>", "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
"<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>", "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
@@ -41,41 +41,41 @@
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
] ]
}, },
"ios" : {}, "ios": {},
/* ios */ /* ios */
"sdkConfigs" : {} "sdkConfigs": {}
} }
}, },
/* SDK */ /* SDK */
"quickapp" : {}, "quickapp": {},
/* */ /* */
"mp-weixin" : { "mp-weixin": {
/* */ /* */
"appid" : "wx77580889aaf15eb4", "appid": "wx77580889aaf15eb4",
"setting" : { "setting": {
"urlCheck" : false, "urlCheck": false,
"minified" : true, "minified": true,
"es6" : true "es6": true
}, },
"usingComponents" : true, "usingComponents": true,
"permission" : { "permission": {
"scope.userLocation" : { "scope.userLocation": {
"desc" : "获取您的位置,以便给您推荐合适工作信息" "desc": "获取您的位置,以便给您推荐合适工作信息"
} }
} }
}, },
"h5" : { "h5": {
"sdkConfigs" : { "sdkConfigs": {
"maps" : {} "maps": {}
}, },
"template" : "index.html", "template": "index.html",
"router" : { "router": {
"base" : "./", "base": "./",
"mode" : "hash" "mode": "hash"
}, },
"optimization" : { "optimization": {
"treeShaking" : { "treeShaking": {
"enable" : true "enable": true
} }
} }
} }

View File

@@ -3,16 +3,31 @@
<view class="app-top"> <view class="app-top">
<view class="top-search"> <view class="top-search">
<view class="top-input"> <view class="top-input">
<input class="put" type="text" placeholder-class="put-pla" v-model="searchValue" <input
placeholder="搜索附近岗位或任务"> class="put"
type="text"
placeholder-class="put-pla"
v-model="searchValue"
placeholder="搜索附近岗位或任务"
/>
<button class="input-btn" @tap="search">搜索</button> <button class="input-btn" @tap="search">搜索</button>
</view> </view>
</view> </view>
</view> </view>
<view class="view-map"> <view class="view-map">
<super-map ref="uMap" style="width: 100%;height: 100%;" :latitude="latitude" :longitude="longitude" <super-map
:zoom="14" :min-zoom="10" :max-zoom="20" @markertap="clickmark" @regionchange="show = false" ref="uMap"
:MapUrl="$config.supperMap" :flag-tip="false"></super-map> style="width: 100%; height: 100%"
:latitude="latitude"
:longitude="longitude"
:zoom="14"
:min-zoom="10"
:max-zoom="20"
@markertap="clickmark"
@regionchange="show = false"
:MapUrl="$config.supperMap"
:flag-tip="false"
></super-map>
<!-- <view id="map" ></view> --> <!-- <view id="map" ></view> -->
<!-- <map style="width: 100%;height: 100%;" scale="16" :latitude="latitude" :longitude="longitude" <!-- <map style="width: 100%;height: 100%;" scale="16" :latitude="latitude" :longitude="longitude"
:markers="covers" @markertap="clickmark" @regionchange="show = false"></map> --> :markers="covers" @markertap="clickmark" @regionchange="show = false"></map> -->
@@ -22,21 +37,22 @@
<swiper-item class="wiperItem"> <swiper-item class="wiperItem">
<view class="swiper-item uni-bg-red"> <view class="swiper-item uni-bg-red">
<view class="item-content"> <view class="item-content">
<view class="content-title"> {{productInfo.missionTitle}} </view> <view class="content-title">{{ productInfo.missionTitle }}</view>
<view class="color_999999 fs_12 mar_top5"> <view class="color_999999 fs_12 mar_top5">
<uni-icons type="location" color="#999999" size="12"></uni-icons> <uni-icons type="location" color="#999999" size="12"></uni-icons>
{{ productInfo.cityId }} {{productInfo.address}} 距离{{distance}} {{ productInfo.cityId }} {{ productInfo.address }} 距离{{ distance }}
</view> </view>
<view class="color_999999 fs_12 mar_top5"> <view class="color_999999 fs_12 mar_top5">
<uni-icons type="map-pin-ellipse" color="#999999" size="12"></uni-icons> <uni-icons type="map-pin-ellipse" color="#999999" size="12"></uni-icons>
招聘时间: {{productInfo.stime}}-{{productInfo.etime}} 招聘时间: {{ productInfo.stime }}-{{ productInfo.etime }}
</view> </view>
<view class="color_999999 fs_12 mar_top5"> <view class="color_999999 fs_12 mar_top5">
<uni-icons type="map-pin-ellipse" color="#999999" size="12"></uni-icons> <uni-icons type="map-pin-ellipse" color="#999999" size="12"></uni-icons>
{{productInfo.experienceDesc}} | {{education[productInfo.education]}} {{ productInfo.experienceDesc }} | {{ education[productInfo.education] }}
</view> </view>
<button class="btns" hover-class="active" @tap="openMap"> <button class="btns" hover-class="active" @tap="openMap">
<image class="btn-img" src="../../static/img/direction2.png" />查看详情 <image class="btn-img" src="../../static/img/direction2.png" />
查看详情
</button> </button>
</view> </view>
</view> </view>
@@ -49,342 +65,322 @@
</template> </template>
<script> <script>
import { import { addZeroPrefix, getDistanceFromLatLonInKm } from '@/untils/tools.js';
addZeroPrefix, import testData from '@/common/textdata.js';
getDistanceFromLatLonInKm import { geQueryJobsByNearby } from '@/api/map.js';
} from '@/untils/tools.js' let taskpoint = require('../../static/img/taskpoint.png');
import testData from '@/common/textdata.js'; let gwpoint = require('../../static/img/gwpoint.png');
import { let mypoint = require('../../static/img/mypoint.png');
geQueryJobsByNearby export default {
} from '@/api/map.js' data() {
let taskpoint = require('../../static/img/taskpoint.png'); return {
let gwpoint = require('../../static/img/gwpoint.png'); education: testData.education,
let mypoint = require('../../static/img/mypoint.png'); show: false,
export default { ID: 1,
data() { searchValue: '',
return { latitude: 31.13398,
education: testData.education, longitude: 104.404419,
show: false, covers: [],
ID: 1, rateValue: 2,
searchValue: '', productInfo: {},
latitude: 31.133980, };
longitude: 104.404419, },
covers: [], computed: {
rateValue: 2, distance() {
productInfo: {}, const { lon, lat } = this.productInfo;
}; if (lon) {
const { m, km } = getDistanceFromLatLonInKm(lat, lon, this.latitude, this.longitude);
return m > 1000 ? `${km.toFixed(2)}km` : `${m.toFixed(2)}m`;
}
return '无';
}, },
computed: { },
distance() { mounted() {
const { const _this = this;
lon, console.log(this.$store.state.user.userLocation);
lat if (this.$store.state.user.userLocation) {
} = this.productInfo const { latitude, longitude } = this.$store.state.user.userLocation;
if (lon) { _this.getList(longitude, latitude).then((covers) => {
const { _this.$refs.uMap.addFeature(covers);
m, });
km } else {
} = getDistanceFromLatLonInKm(lat, lon, this.latitude, this.longitude) _this.$api.msg('无法获得周边信息');
return m > 1000 ? `${km.toFixed(2)}km` : `${m.toFixed(2)}m` }
} },
return '无' onShow() {
// const _this = this
// this.mockGetLocation().then((myPoint) => {
// this.latitude = myPoint.latitude
// this.longitude = myPoint.longitude
// _this.getList(_this.longitude, _this.latitude).then((covers) => {
// _this.$api.msg('成功获得周边信息')
// console.log(covers)
// _this.$refs.uMap.addFeature(covers)
// })
// })
},
methods: {
openMap(lon, lat) {
//打开地图,并将门店位置传入
// type: post 岗位 mission 任务
switch (this.productInfo.type) {
case 'post':
const no = encodeURIComponent(1);
uni.navigateTo({
url: `/pages/projectInfo/workInfo?workId=${encodeURIComponent(no)}&isCan=${1}`,
});
break;
case 'mission':
const no1 = encodeURIComponent(this.productInfo.missionNo);
uni.navigateTo({
url: `/pages/projectInfo/projectInfo?missionNo=${no1}&isCan=${1}`,
});
break;
} }
}, },
mounted() { search() {
const _this = this const _this = this;
console.log(this.$store.state.user.userLocation)
if (this.$store.state.user.userLocation) { if (this.$store.state.user.userLocation) {
const { const { latitude, longitude } = this.$store.state.user.userLocation;
latitude,
longitude
} = this.$store.state.user.userLocation
_this.getList(longitude, latitude).then((covers) => { _this.getList(longitude, latitude).then((covers) => {
_this.$refs.uMap.addFeature(covers) _this.$refs.uMap.addFeature(covers);
}) });
} else { } else {
_this.$api.msg('无法获得周边信息') _this.$api.msg('无法获得周边信息');
} }
}, // this.getList(this.longitude, this.latitude).then((covers) => {
onShow() { // this.$api.msg('成功获得周边信息')
// const _this = this // console.log(covers)
// this.mockGetLocation().then((myPoint) => { // this.$refs.uMap.addFeature(covers)
// this.latitude = myPoint.latitude
// this.longitude = myPoint.longitude
// _this.getList(_this.longitude, _this.latitude).then((covers) => {
// _this.$api.msg('成功获得周边信息')
// console.log(covers)
// _this.$refs.uMap.addFeature(covers)
// })
// }) // })
}, },
methods: { clickmark(cover) {
openMap(lon, lat) { if (cover.markerId === 1) return;
//打开地图,并将门店位置传入 this.show = true;
// type: post 岗位 mission 任务 this.productInfo = cover.info;
switch (this.productInfo.type) { },
case 'post': mockGetLocation() {
const no = encodeURIComponent(1) return new Promise((resolve) => {
uni.navigateTo({ resolve({
url: `/pages/projectInfo/workInfo?workId=${encodeURIComponent(no)}&isCan=${1}` longitude: 104.40632,
}) latitude: 31.122989,
break altitude: null,
case 'mission': accuracy: 25.998,
const no1 = encodeURIComponent(this.productInfo.missionNo) altitudeAccuracy: null,
uni.navigateTo({ heading: null,
url: `/pages/projectInfo/projectInfo?missionNo=${no1}&isCan=${1}` speed: null,
}) errMsg: 'getLocation:ok',
break verticalAccuracy: 0,
horizontalAccuracy: 25.998,
});
});
},
async getList(lon, lat) {
return new Promise(async (resolve) => {
let params = {
lon,
lat,
distanceRange: 20,
taskTitle: this.searchValue,
};
let resData = await geQueryJobsByNearby(params);
if (resData.data.code === 200) {
const arr = resData.data.data.map((item) => ({
id: item.id,
longitude: item.lon,
latitude: item.lat,
iconPath: item.type === 'post' ? gwpoint : taskpoint,
width: 20,
height: 20,
title: item.missionTitle,
callout: {
content: item.missionTitle,
fontSize: 10,
borderColor: 'blue',
},
info: item,
}));
arr.push({
id: 1,
latitude: lat,
longitude: lon,
iconPath: mypoint,
title: '我的位置',
width: 20,
height: 20,
});
resolve(arr);
} }
}, });
search() { },
const _this = this },
if (this.$store.state.user.userLocation) { };
const {
latitude,
longitude
} = this.$store.state.user.userLocation
_this.getList(longitude, latitude).then((covers) => {
_this.$refs.uMap.addFeature(covers)
})
} else {
_this.$api.msg('无法获得周边信息')
}
// this.getList(this.longitude, this.latitude).then((covers) => {
// this.$api.msg('成功获得周边信息')
// console.log(covers)
// this.$refs.uMap.addFeature(covers)
// })
},
clickmark(cover) {
if (cover.markerId === 1) return
this.show = true;
this.productInfo = cover.info
},
mockGetLocation() {
return new Promise((resolve) => {
resolve({
"longitude": 104.40632,
"latitude": 31.122989,
"altitude": null,
"accuracy": 25.998,
"altitudeAccuracy": null,
"heading": null,
"speed": null,
"errMsg": "getLocation:ok",
"verticalAccuracy": 0,
"horizontalAccuracy": 25.998
})
})
},
async getList(lon, lat) {
return new Promise(async (resolve) => {
let params = {
lon,
lat,
distanceRange: 20,
taskTitle: this.searchValue
}
let resData = await geQueryJobsByNearby(params)
if (resData.data.code === 200) {
const arr = resData.data.data.map((item) => ({
id: item.id,
longitude: item.lon,
latitude: item.lat,
iconPath: item.type === 'post' ? gwpoint : taskpoint,
width: 20,
height: 20,
title: item.missionTitle,
callout: {
content: item.missionTitle,
fontSize: 10,
borderColor: 'blue',
},
info: item
}))
arr.push({
id: 1,
latitude: lat,
longitude: lon,
iconPath: mypoint,
title: '我的位置',
width: 20,
height: 20
})
resolve(arr)
}
})
}
}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.color_999999 { .color_999999 {
color: #999999; color: #999999;
} }
.fs_12 { .fs_12 {
font-size: 24rpx; font-size: 24rpx;
} }
.mar_top5 { .mar_top5 {
margin-top: 10rpx; margin-top: 10rpx;
} }
.active { .active {
background: #EAEAEA !important; background: #eaeaea !important;
color: #AFAFAF; color: #afafaf;
} }
.card_mark { .card_mark {
.mark_l { .mark_l {
width: 56rpx; width: 56rpx;
height: 28rpx; height: 28rpx;
border-radius: 12rpx 0 12rpx 12rpx; border-radius: 12rpx 0 12rpx 12rpx;
background: linear-gradient(157deg, #A043C1 0%, #4133A2 100%); background: linear-gradient(157deg, #a043c1 0%, #4133a2 100%);
font-size: 28rpx; font-size: 28rpx;
font-family: PingFang-SC-Bold, PingFang-SC; font-family: PingFang-SC-Bold, PingFang-SC;
font-weight: bold; font-weight: bold;
color: #FFFFFF; color: #ffffff;
display: flex;
align-items: center;
justify-content: center;
}
}
.position-bottom {
position: absolute;
left: 0;
right: 0;
height: 406rpx;
bottom: 50rpx;
.uni-margin-wrap {
height: 406rpx;
.swiper {
height: 406rpx;
.wiperItem {
padding-left: 50rpx;
height: 406rpx;
width: 660rpx !important;
.swiper-item {
width: 660rpx;
height: 406rpx;
background: #ffffff;
box-shadow: 0rpx 2rpx 4rpx 0rpx rgba(0, 0, 0, 0.5);
border-radius: 27rpx;
overflow: hidden;
.item-top {
display: flex;
align-content: center;
justify-content: space-between;
.top-img {
width: 215rpx;
height: 120rpx;
}
}
.item-content {
padding: 15rpx 33rpx;
.content-title {
font-size: 32rpx;
}
.btns {
margin-top: 20rpx;
display: flex;
align-items: center;
justify-content: center;
width: 223rpx;
height: 64rpx;
background: linear-gradient(to right, #a043c1 0%, #4133a2 100%);
border-radius: 15rpx;
color: #ffffff;
font-size: 26rpx;
font-weight: 800;
color: #ffffff;
line-height: 64rpx;
.btn-img {
width: 32rpx;
height: 32rpx;
}
}
}
}
}
}
}
}
.app_container {
position: fixed;
left: 0;
top: 0;
right: 0;
bottom: 0;
display: flex;
flex-direction: column;
.app-top {
display: flex;
background: linear-gradient(to right, #e8e8e8, #e8e8e8);
padding-bottom: 16rpx;
padding-top: 24rpx;
.top-search {
position: relative;
width: 100%;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
}
}
.position-bottom { .top-input {
position: absolute; width: 710rpx;
left: 0;
right: 0;
height: 406rpx;
bottom: 50rpx;
.uni-margin-wrap { .put {
height: 406rpx; padding-left: 30rpx;
height: 72rpx;
.swiper { background: #ffffff;
height: 406rpx; border-radius: 36rpx;
.wiperItem {
padding-left: 50rpx;
height: 406rpx;
width: 660rpx !important;
.swiper-item {
width: 660rpx;
height: 406rpx;
background: #FFFFFF;
box-shadow: 0rpx 2rpx 4rpx 0rpx rgba(0, 0, 0, 0.5);
border-radius: 27rpx;
overflow: hidden;
.item-top {
display: flex;
align-content: center;
justify-content: space-between;
.top-img {
width: 215rpx;
height: 120rpx;
}
}
.item-content {
padding: 15rpx 33rpx;
.content-title {
font-size: 32rpx;
}
.btns {
margin-top: 20rpx;
display: flex;
align-items: center;
justify-content: center;
width: 223rpx;
height: 64rpx;
background: linear-gradient(to right, #A043C1 0%, #4133A2 100%);
border-radius: 15rpx;
color: #FFFFFF;
font-size: 26rpx;
font-weight: 800;
color: #FFFFFF;
line-height: 64rpx;
.btn-img {
width: 32rpx;
height: 32rpx;
}
}
}
}
} }
}
::v-deep .put-pla {
height: 33rpx;
font-size: 24rpx;
font-weight: 400;
color: #999999;
line-height: 33rpx;
}
} .input-btn {
} position: absolute;
right: 30rpx;
.app_container { top: 50%;
position: fixed; transform: translate(0, -50%);
left: 0; color: #ffffff;
top: 0; width: 120rpx;
right: 0; height: 56rpx;
bottom: 0; line-height: 56rpx;
display: flex; font-size: 28rpx;
flex-direction: column; background: linear-gradient(157deg, #a043c1 0%, #4133a2 100%);
border-radius: 29rpx;
.app-top {
display: flex;
background: linear-gradient(to right, #e8e8e8, #e8e8e8);
padding-bottom: 16rpx;
padding-top: 24rpx;
.top-search {
position: relative;
width: 100%;
display: flex;
align-items: center;
justify-content: center;
.top-input {
width: 710rpx;
.put {
padding-left: 30rpx;
height: 72rpx;
background: #FFFFFF;
border-radius: 36rpx;
}
/deep/ .put-pla {
height: 33rpx;
font-size: 24rpx;
font-weight: 400;
color: #999999;
line-height: 33rpx;
}
.input-btn {
position: absolute;
right: 30rpx;
top: 50%;
transform: translate(0, -50%);
color: #FFFFFF;
width: 120rpx;
height: 56rpx;
line-height: 56rpx;
font-size: 28rpx;
background: linear-gradient(157deg, #A043C1 0%, #4133A2 100%);
border-radius: 29rpx;
}
} }
} }
} }
.view-map {
flex: 1;
}
} }
.view-map {
flex: 1;
}
}
</style> </style>

View File

@@ -1,174 +1,172 @@
<template> <template>
<view> <view>
<view class="sealBox"> <view class="sealBox">
<view style="height: 70rpx;"></view> <view style="height: 70rpx"></view>
<view class="name">签名</view> <view class="name">签名</view>
<view v-if="src" class="sealContent"> <view v-if="src" class="sealContent">
<image class="img" mode="aspectFit" :src="src"></image> <image class="img" mode="aspectFit" :src="src"></image>
</view> </view>
<view v-else class="sealContent" @click="go"> <view v-else class="sealContent" @click="go">
<view class="contentFont">点击输入手写签名</view> <view class="contentFont">点击输入手写签名</view>
</view> </view>
<view class="list" v-if="src"> <view class="list" v-if="src">
<view class="listLeft"> <view class="listLeft">
<view class="listTitle">签名密码</view> <view class="listTitle">签名密码</view>
</view> </view>
<view class="listRight"> <view class="listRight">
<view class="rightContent nochoose"> <view class="rightContent nochoose">
<view v-if="src" class="uni-input">已设置</view> <view v-if="src" class="uni-input">已设置</view>
<view v-else class="uni-input">未设置</view> <view v-else class="uni-input">未设置</view>
</view> </view>
<image src="@/static/img/right.svg" mode=""></image> <image src="@/static/img/right.svg" mode=""></image>
</view> </view>
</view> </view>
</view> </view>
<view v-if="!src" class="sealAgreement"> <view v-if="!src" class="sealAgreement">
<checkbox :checked="status" @click="checkClick"/> <checkbox :checked="status" @click="checkClick" />
<view>我已阅读并同意</view> <view>我已阅读并同意</view>
<view class="agreement" @click="goAgreement('/pages/user/sealAgreement')">申请证书协议</view> <view class="agreement" @click="goAgreement('/pages/user/sealAgreement')">申请证书协议</view>
</view> </view>
<view class="btn"> <view class="btn">
<view v-if="src" @click="next" class="bottombtn">完成</view> <view v-if="src" @click="next" class="bottombtn">完成</view>
<view v-if="!src" class="bottombtn nocheck">完成</view> <view v-if="!src" class="bottombtn nocheck">完成</view>
</view> </view>
</view> </view>
</template> </template>
<script> <script>
import {mapGetters} from 'vuex' import { mapGetters } from 'vuex';
export default { export default {
data() { data() {
return { return {
status:false status: false,
} };
}, },
mounted() { mounted() {
// this.$store.dispatch('setAutograph') // this.$store.dispatch('setAutograph')
}, },
methods: { methods: {
goAgreement (url) { goAgreement(url) {
uni.navigateTo({ uni.navigateTo({
url url,
}) });
}, },
checkClick(){ checkClick() {
this.status = !this.status this.status = !this.status;
}, },
next () { next() {
uni.navigateBack() uni.navigateBack();
// uni.switchTab({ // uni.switchTab({
// url: '/pages/index/index' // url: '/pages/index/index'
// }) // })
}, },
go(url){ go(url) {
if (!this.status){ if (!this.status) {
uni.showToast({ uni.showToast({
title: '请先阅读并同意《申请证书协议》', title: '请先阅读并同意《申请证书协议》',
icon: 'none' icon: 'none',
}) });
return return;
} }
uni.navigateTo({ uni.navigateTo({
url: `/pageMy/setUserBase/seal/sealCanvas?path=/pageMy/setUserBase/seal/sealCanvas` url: `/pageMy/setUserBase/seal/sealCanvas?path=/pageMy/setUserBase/seal/sealCanvas`,
}) });
}, },
getInpCode: function(e) { getInpCode: function (e) {
console.log(e) console.log(e);
} },
}, },
computed: { computed: {
...mapGetters(['autograph']), ...mapGetters(['autograph']),
src(){ src() {
if (this.autograph.data && this.autograph.data.signSrcUrl){ if (this.autograph.data && this.autograph.data.signSrcUrl) {
return this.autograph.data.signSrcUrl return this.autograph.data.signSrcUrl;
} }
} },
} },
} };
</script> </script>
<style lang="scss"> <style lang="scss">
.sealAgreement{ .sealAgreement {
display: flex; display: flex;
align-items: center; align-items: center;
margin: 30rpx; margin: 30rpx;
font-size: 32rpx; font-size: 32rpx;
.agreement{ .agreement {
color: #007AFF; color: #007aff;
} }
/deep/ .uni-checkbox-input{ ::v-deep .uni-checkbox-input {
border-radius: 22px!important; border-radius: 22px !important;
} }
} }
.nocheck { .nocheck {
opacity: 0.3; opacity: 0.3;
} }
.bottombtn { .bottombtn {
background-color: #1B66FF; background-color: #1b66ff;
color: #fff; color: #fff;
text-align: center; text-align: center;
border-radius: 10rpx; border-radius: 10rpx;
font-family: PingFangSC-Medium; font-family: PingFangSC-Medium;
font-size: 32rpx; font-size: 32rpx;
height: 90rpx; height: 90rpx;
line-height: 90rpx; line-height: 90rpx;
} }
.btn { .btn {
background-color: #fefefe; background-color: #fefefe;
padding: 70rpx 80rpx; padding: 70rpx 80rpx;
} }
.sealBox{ .sealBox {
background-color: #FFFFFF; background-color: #ffffff;
padding: 0 15px 0 15px; padding: 0 15px 0 15px;
.name{ .name {
font-size: 32rpx; font-size: 32rpx;
font-weight: 400; font-weight: 400;
color: #333333; color: #333333;
line-height: 45rpx; line-height: 45rpx;
}
} .listRight {
.listRight { display: flex;
display: flex; align-items: center;
align-items: center; justify-content: space-between;
justify-content: space-between; font-family: PingFangSC-Regular;
font-family: PingFangSC-Regular; font-size: 28rpx;
font-size: 28rpx; color: #999999;
color: #999999; }
}
.listRight image {
width: 40rpx;
height: 40rpx;
margin-left: 15rpx;
}
.list {
display: flex;
align-items: center;
justify-content: space-between;
font-family: PingFangSC-Regular;
font-size: 32rpx;
color: #333333;
height: 88rpx;
}
.sealContent{
background: #F6F6F6;
padding: 16rpx;
margin-top: 14rpx;
position:relative;
.img{
width: 100%;
height: 312rpx;
background-color: #FFFFFF;
}
.contentFont{
height: 312rpx;
line-height: 312rpx;
font-size: 30rpx;
color: #999999;
background: #FFFFFF;
text-align: center;
}
}
}
.listRight image {
width: 40rpx;
height: 40rpx;
margin-left: 15rpx;
}
.list {
display: flex;
align-items: center;
justify-content: space-between;
font-family: PingFangSC-Regular;
font-size: 32rpx;
color: #333333;
height: 88rpx;
}
.sealContent {
background: #f6f6f6;
padding: 16rpx;
margin-top: 14rpx;
position: relative;
.img {
width: 100%;
height: 312rpx;
background-color: #ffffff;
}
.contentFont {
height: 312rpx;
line-height: 312rpx;
font-size: 30rpx;
color: #999999;
background: #ffffff;
text-align: center;
}
}
}
</style> </style>

View File

@@ -54,7 +54,7 @@
</view> </view>
</view> </view>
<!-- 技能标签 end --> <!-- 技能标签 end -->
<view v-if="info.jobSources" class="prolist">来源{{ info.jobSources || '暂无' }}</view> <view v-if="info.jobSources" style="color: red" class="prolist">来源{{ info.jobSources || '暂无' }}</view>
</view> </view>
<view class="head"> <view class="head">
<view style="display: flex; align-items: center"> <view style="display: flex; align-items: center">

View File

@@ -59,7 +59,7 @@
</view> </view>
</view> </view>
<!-- 技能标签 end --> <!-- 技能标签 end -->
<view v-if="info.jobSources" class="prolist">来源{{ info.jobSources || '暂无' }}</view> <view v-if="info.jobSources" style="color: red" class="prolist">来源{{ info.jobSources || '暂无' }}</view>
</view> </view>
<view class="head"> <view class="head">
<!-- <view class="proname proneed"> <!-- <view class="proname proneed">

View File

@@ -13,7 +13,9 @@
行业类型{{ info.tradeNames ? info.tradeNames : info.jobCompanyIndustry || '暂无' }} 行业类型{{ info.tradeNames ? info.tradeNames : info.jobCompanyIndustry || '暂无' }}
</view> </view>
<view class="prolist">岗位工种{{ info.skillNames || '暂无' }}</view> <view class="prolist">岗位工种{{ info.skillNames || '暂无' }}</view>
<view class="prolist">参考工资{{info.wage}}{{info.wageUpper}}{{wageUnit[info.wageUnitCategory]}}</view> <view class="prolist">
参考工资{{ info.wage }}{{ info.wageUpper }}{{ wageUnit[info.wageUnitCategory] }}
</view>
<!-- <view class="fee"> <!-- <view class="fee">
{{info.wage}}{{wageUnit[info.wageUnitCategory]}} {{info.wage}}{{wageUnit[info.wageUnitCategory]}}
</view> --> </view> -->
@@ -49,7 +51,7 @@
</view> </view>
</view> </view>
<!-- 技能标签 end --> <!-- 技能标签 end -->
<view v-if="info.jobSources" class="prolist">来源{{ info.jobSources || '暂无' }}</view> <view v-if="info.jobSources" style="color: red" class="prolist">来源{{ info.jobSources || '暂无' }}</view>
</view> </view>
<view class="head"> <view class="head">
<!-- <view class="proname proneed"> <!-- <view class="proname proneed">
@@ -189,7 +191,11 @@
</view> </view>
<view style="text-align: center; font-size: 28rpx; margin-top: 30rpx"> <view style="text-align: center; font-size: 28rpx; margin-top: 30rpx">
{{ info.callName || '联系人 ' }} : {{ info.callName || '联系人 ' }} :
<span style="color: blue" v-if="info.callNumber" @click="tools.onDialingPhoneNumber(info.callNumber)"> <span
style="color: blue"
v-if="info.callNumber"
@click="tools.onDialingPhoneNumber(info.callNumber)"
>
{{ info.callNumber }} {{ info.callNumber }}
</span> </span>
<span style="color: #333333" v-else>无联系方式</span> <span style="color: #333333" v-else>无联系方式</span>

View File

@@ -7,42 +7,26 @@
<!-- <view class="prolist"> <!-- <view class="prolist">
任务编码{{info.missionNo}} 任务编码{{info.missionNo}}
</view> --> </view> -->
<view class="prolist"> <view class="prolist">岗位日期{{ dateFormat(info.stime) }}{{ dateFormat(info.etime) }}</view>
岗位日期{{ dateFormat((info.stime)) }}{{ dateFormat((info.etime)) }}
</view>
<!-- <view class="prolist"> <!-- <view class="prolist">
报名截止{{dateFormat((info.etimePub))}} 报名截止{{dateFormat((info.etimePub))}}
</view> --> </view> -->
<view class="prolist"> <view class="prolist">行业类型{{ info.tradeNames }}</view>
行业类型{{ info.tradeNames }} <view class="prolist">工种类型{{ info.worktypeNames }}</view>
</view>
<view class="prolist">
工种类型{{ info.worktypeNames }}
</view>
<view class="fee"> <view class="fee">
{{ info.wage }} {{ info.wage }}
</view> </view>
</view> </view>
<view class="head"> <view class="head">
<view class="proname proneed"> <view class="proname proneed">岗位要求</view>
岗位要求 <view class="prolist">
<view class="protype">年龄要求{{ age[info.ageDesc] }}</view>
</view> </view>
<view class="prolist"> <view class="prolist">
<view class="protype"> <view class="protype">学历要求{{ education[info.education] }}</view>
年龄要求{{ age[info.ageDesc] }} <view class="protype">经验要求{{ experience[info.experienceDesc] }}</view>
</view>
</view>
<view class="prolist">
<view class="protype">
学历要求{{ education[info.education] }}
</view>
<view class="protype">
经验要求{{ experience[info.experienceDesc] }}
</view>
</view>
<view class="prolist proint" style="font-weight: bold;color:#333;">
任务描述
</view> </view>
<view class="prolist proint" style="font-weight: bold; color: #333">任务描述</view>
<view class="prolist description"> <view class="prolist description">
{{ info.missionDesc }} {{ info.missionDesc }}
</view> </view>
@@ -53,25 +37,17 @@
</view> </view>
</view> </view>
<!-- 技能标签 end --> <!-- 技能标签 end -->
<view v-if="info.jobSources" class="prolist"> <view v-if="info.jobSources" style="color: red" class="prolist">来源{{ info.jobSources }}</view>
来源{{ info.jobSources }}
</view>
</view> </view>
<view class="head"> <view class="head">
<view class="proname proneed"> <view class="proname proneed">用工单位信息</view>
用工单位信息
</view>
<view class="prolist"> <view class="prolist">
{{ info.companyName }} {{ info.companyName }}
</view> </view>
<view class="prolist"> <view class="prolist">用工单位地址{{ info.companyAddress }}</view>
用工单位地址{{ info.companyAddress }}
</view>
</view> </view>
<view class="head"> <view class="head">
<view class="proname proneed"> <view class="proname proneed">地址</view>
地址
</view>
<!-- <view class="prolist"> <!-- <view class="prolist">
<view class="protype"> <view class="protype">
联系人{{info.callName}} 联系人{{info.callName}}
@@ -83,48 +59,62 @@
<view class="prolist" v-if="info.callNumber"> <view class="prolist" v-if="info.callNumber">
座机号{{info.callNumber}} 座机号{{info.callNumber}}
</view> --> </view> -->
<view class="prolist"> <view class="prolist">任务地址{{ info.address }}</view>
任务地址{{ info.address }}
</view>
<view class="map"> <view class="map">
<super-map ref="uMap" style="width: 100%;height: 100%;" :latitude="latitude" :longitude="longitude" <super-map
:open="true" :zoom="14" :min-zoom="10" :max-zoom="20" :MapUrl="$config.supperMap" ref="uMap"
:flag-tip="false"></super-map> style="width: 100%; height: 100%"
:latitude="latitude"
:longitude="longitude"
:open="true"
:zoom="14"
:min-zoom="10"
:max-zoom="20"
:MapUrl="$config.supperMap"
:flag-tip="false"
></super-map>
</view> </view>
<!-- <map class="map" :latitude="latitude" :longitude="longitude" :markers="covers"></map> --> <!-- <map class="map" :latitude="latitude" :longitude="longitude" :markers="covers"></map> -->
</view> </view>
<view class="" style="height:200rpx;background-color: #f6f6f6;" v-if="isShow !== '0'"></view> <view class="" style="height: 200rpx; background-color: #f6f6f6" v-if="isShow !== '0'"></view>
<view class="btn"> <view class="btn">
<view
<view @click="callPhone" class="bottombtn flexbtn" @click="callPhone"
style="margin-right: 10rpx;background-color: #FBAD17;border-radius: 45rpx;"> class="bottombtn flexbtn"
style="margin-right: 10rpx; background-color: #fbad17; border-radius: 45rpx"
>
查看申请列表 查看申请列表
</view> </view>
</view> </view>
<uniMask :maskShow="maskShow"> <uniMask :maskShow="maskShow">
<view class="contractMask"> <view class="contractMask">
<!-- #ifdef H5 || APP-PLUS --> <!-- #ifdef H5 || APP-PLUS -->
<view class="close" @click="close" style="top: 124rpx;">+</view> <view class="close" @click="close" style="top: 124rpx">+</view>
<!-- #endif --> <!-- #endif -->
<!-- #ifdef MP-WEIXIN --> <!-- #ifdef MP-WEIXIN -->
<view class="close" @click="close">+</view> <view class="close" @click="close">+</view>
<!-- #endif --> <!-- #endif -->
<view style="height: 30px;"></view> <view style="height: 30px"></view>
<img :src="src" alt="" style="width:100%;height: 1000px;"> <img :src="src" alt="" style="width: 100%; height: 1000px" />
<view v-if="nextBtn" class="down" @click="next">下一步</view> <view v-if="nextBtn" class="down" @click="next">下一步</view>
</view> </view>
</uniMask> </uniMask>
<u-popup closeable :show="showPopUp" mode="bottom" @close="closePopUp"> <u-popup closeable :show="showPopUp" mode="bottom" @close="closePopUp">
<view style="min-height: 100rpx;padding: 60rpx 40rpx;"> <view style="min-height: 100rpx; padding: 60rpx 40rpx">
<view class="contactWrapper" v-for="(item, index) in info.applyList" :key="index"> <view class="contactWrapper" v-for="(item, index) in info.applyList" :key="index">
<view class="wrapperLeft"> <view class="wrapperLeft">
<view> {{ item.realName }} : {{ item.telphone }} </view> <view>{{ item.realName }} : {{ item.telphone }}</view>
<view> 申请时间{{ item.applyTime }} </view> <view>申请时间{{ item.applyTime }}</view>
</view> </view>
<view class="applyTime"> <view class="applyTime">
<!-- // 1申请中2申请通过3申请未通过--> <!-- // 1申请中2申请通过3申请未通过-->
<view class="btnGr" v-if="item.status === 1 ||item.status === 3" <view
@click="changeWorkerStatus(item)">录用</view> class="btnGr"
v-if="item.status === 1 || item.status === 3"
@click="changeWorkerStatus(item)"
>
录用
</view>
<view class="btnHuy" v-if="item.status === 2" @click="cancelWorkerStatus(item)">取消</view> <view class="btnHuy" v-if="item.status === 2" @click="cancelWorkerStatus(item)">取消</view>
</view> </view>
</view> </view>
@@ -134,7 +124,7 @@
<view v-else-if="showCode" class="codeSealBox"> <view v-else-if="showCode" class="codeSealBox">
<!-- #ifdef H5 || APP-PLUS --> <!-- #ifdef H5 || APP-PLUS -->
<view class="closeCode" @click="closeShowCode" style="top: 124rpx;">+</view> <view class="closeCode" @click="closeShowCode" style="top: 124rpx">+</view>
<!-- #endif --> <!-- #endif -->
<!-- #ifdef MP-WEIXIN --> <!-- #ifdef MP-WEIXIN -->
<view class="closeCode" @click="closeShowCode">+</view> <view class="closeCode" @click="closeShowCode">+</view>
@@ -144,142 +134,132 @@
<view class="name">签名密码</view> <view class="name">签名密码</view>
<view class="tip">6位数字签名密码</view> <view class="tip">6位数字签名密码</view>
</view> </view>
<view style="height: 36px;"></view> <view style="height: 36px"></view>
<valid-code ref="validCode" @finish="getInpCode" :maxlength="maxlength"></valid-code> <valid-code ref="validCode" @finish="getInpCode" :maxlength="maxlength"></valid-code>
<view style="height: 36px;"></view> <view style="height: 36px"></view>
<view class="forget" @click="forget">忘记密码</view> <view class="forget" @click="forget">忘记密码</view>
</view> </view>
</template> </template>
<script> <script>
import { import { mapGetters } from 'vuex';
mapGetters import { recruit_missionDetail } from '@/api/mission.js';
} from 'vuex' import { GoLogin } from '@/untils/AxiosUtils.js';
import { import { setRead, updataEmployedNew, cancelEmployed } from '@/api/news.js';
recruit_missionDetail import { checkPass } from '@/api/auth.js';
} from '@/api/mission.js'; import dictionary from '@/common/textdata.js';
import { import { dateFormat } from '../../../../untils/format.js';
GoLogin import uniMask from '@/components/uni-mask/mask.vue';
} from '@/untils/AxiosUtils.js'; import uniPopup from '@/components/uni-popup/uni-popup.vue';
import { import validCode from '@/components/p-valid-code/p-valid-code.vue';
setRead, export default {
updataEmployedNew, data() {
cancelEmployed return {
} from '@/api/news.js'; ...dictionary,
import { info: {},
checkPass status: null,
} from '@/api/auth.js'; showDetail: false,
import dictionary from '@/common/textdata.js'; showCode: false,
import { maskShow: false,
dateFormat nextBtn: false,
} from "../../../../untils/format.js"; loading: false,
import uniMask from '@/components/uni-mask/mask.vue' latitude: 39.909, //中心点
import uniPopup from '@/components/uni-popup/uni-popup.vue' longitude: 116.39742,
import validCode from '@/components/p-valid-code/p-valid-code.vue' covers: [
export default { {
data() { //marker标记位置
return {
...dictionary,
info: {},
status: null,
showDetail: false,
showCode: false,
maskShow: false,
nextBtn: false,
loading: false,
latitude: 39.909, //中心点
longitude: 116.39742,
covers: [{ //marker标记位置
id: 0, id: 0,
latitude: 0, latitude: 0,
longitude: 0, longitude: 0,
// width:30, // width:30,
// height:30, // height:30,
iconPath: '../../../../static/img/location.png' iconPath: '../../../../static/img/location.png',
}], },
missionNo: "", ],
isShow: '', missionNo: '',
type: '', isShow: '',
id: '', type: '',
src: 'https://jlfiles.oss-cn-zhangjiakou.aliyuncs.com/jobslink-api/doc/%E7%94%B5%E5%AD%90%E5%90%88%E5%90%8C%E9%A2%84%E8%A7%88%E5%9B%BE%E7%89%87.png', id: '',
maxlength: 6, src: 'https://jlfiles.oss-cn-zhangjiakou.aliyuncs.com/jobslink-api/doc/%E7%94%B5%E5%AD%90%E5%90%88%E5%90%8C%E9%A2%84%E8%A7%88%E5%9B%BE%E7%89%87.png',
collectStatus: 0, // 收藏状态 maxlength: 6,
showPopUp: false, collectStatus: 0, // 收藏状态
showPopUp: false,
};
},
components: {
uniMask,
validCode,
uniPopup,
},
onLoad: function (option) {
//option为object类型会序列化上个页面传递的参数
// this.$store.dispatch('setAutograph')
if (option.missionNo) {
this.missionNo = decodeURIComponent(option.missionNo);
}
if (option.isCan) {
this.isShow = option.isCan; //isShow为'0'则为我的任务、我的评价过来的,需要隐藏抢任务按钮
}
if (option.type) {
this.type = option.type; //type为1则为消息邀请过来的,需要设置消息已读;
}
if (option.id) {
this.id = option.id; //消息id
}
},
onShow: function () {
this.showDetail = true;
this.getData();
},
onShareAppMessage(obj) {
return {
title: this.info.missionTitle,
path: `/pages/projectInfo/projectInfo?missionNo=${this.info.missionNo}`,
};
},
methods: {
dateFormat,
async cancelWorkerStatus(item) {
let params = {
missionNo: this.info.missionNo,
ids: item.id,
};
uni.showLoading({
title: '请稍后',
});
let resData = await cancelEmployed(params);
uni.hideLoading();
if (resData.data.code === 200) {
this.$api.msg('操作成功');
this.getData();
} }
}, },
components: { async changeWorkerStatus(item) {
uniMask, let params = {
validCode, missionNo: this.info.missionNo,
uniPopup ids: item.id,
}, };
onLoad: function(option) { //option为object类型会序列化上个页面传递的参数 uni.showLoading({
// this.$store.dispatch('setAutograph') title: '请稍后',
if (option.missionNo) { });
this.missionNo = decodeURIComponent(option.missionNo); let resData = await updataEmployedNew(params);
} uni.hideLoading();
if (option.isCan) { if (resData.data.code === 200) {
this.isShow = option.isCan; //isShow为'0'则为我的任务、我的评价过来的,需要隐藏抢任务按钮 this.$api.msg('操作成功');
} this.getData();
if (option.type) {
this.type = option.type; //type为1则为消息邀请过来的,需要设置消息已读;
}
if (option.id) {
this.id = option.id; //消息id
} }
}, },
onShow: function() { callPhone() {
this.showDetail = true this.showPopUp = true;
this.getData();
}, },
onShareAppMessage(obj) { closePopUp() {
return { this.showPopUp = false;
title: this.info.missionTitle,
path: `/pages/projectInfo/projectInfo?missionNo=${this.info.missionNo}`
}
}, },
methods: { getData: function () {
dateFormat, const self = this;
async cancelWorkerStatus(item) { // missionDetail(self.missionNo).then(res => {
let params = { recruit_missionDetail(self.missionNo, self.type).then(
missionNo: this.info.missionNo, (res) => {
ids: item.id
}
uni.showLoading({
title: '请稍后'
})
let resData = await cancelEmployed(params)
uni.hideLoading()
if (resData.data.code === 200) {
this.$api.msg('操作成功')
this.getData();
}
},
async changeWorkerStatus(item) {
let params = {
missionNo: this.info.missionNo,
ids: item.id
}
uni.showLoading({
title: '请稍后'
})
let resData = await updataEmployedNew(params)
uni.hideLoading()
if (resData.data.code === 200) {
this.$api.msg('操作成功')
this.getData();
}
},
callPhone() {
this.showPopUp = true;
},
closePopUp() {
this.showPopUp = false;
},
getData: function() {
const self = this;
// missionDetail(self.missionNo).then(res => {
recruit_missionDetail(self.missionNo, self.type).then(res => {
self.info = res.data.data; self.info = res.data.data;
self.status = res.data.data.detailStatus; self.status = res.data.data.detailStatus;
self.latitude = self.info.lat; self.latitude = self.info.lat;
@@ -289,301 +269,301 @@
self.showDetail = true; self.showDetail = true;
if (self.type === 1) { if (self.type === 1) {
// 设置已读 // 设置已读
setRead(self.id).then(res => { setRead(self.id).then((res) => {
self.$store.commit("SET_READ"); self.$store.commit('SET_READ');
}) });
} }
}, error => { },
(error) => {
console.log(error); console.log(error);
});
},
// 查看合同
lookMask() {
this.maskShow = true
},
// 关闭弹窗
close() {
this.maskShow = false
},
// 合同下一步
next() {
this.maskShow = false
this.showDetail = false
this.showCode = true
},
// 输入签名密码
getInpCode(password) {
uni.showLoading({
title: "请求中..."
})
this.loading = true
var obj = {
pass: password
} }
checkPass(obj).then(res => { );
this.closeShowCode() },
}).catch(err => { // 查看合同
this.loading = false lookMask() {
}) this.maskShow = true;
}, },
// 关闭签名密码弹窗 // 关闭弹窗
closeShowCode() { close() {
this.showCode = false this.maskShow = false;
this.showDetail = true },
}, // 合同下一步
// 忘记密码 next() {
forget() { this.maskShow = false;
uni.navigateTo({ this.showDetail = false;
url: `/pageMy/setUserBase/seal/forget?forget=true` this.showCode = true;
},
// 输入签名密码
getInpCode(password) {
uni.showLoading({
title: '请求中...',
});
this.loading = true;
var obj = {
pass: password,
};
checkPass(obj)
.then((res) => {
this.closeShowCode();
}) })
.catch((err) => {
this.loading = false;
});
},
// 关闭签名密码弹窗
closeShowCode() {
this.showCode = false;
this.showDetail = true;
},
// 忘记密码
forget() {
uni.navigateTo({
url: `/pageMy/setUserBase/seal/forget?forget=true`,
});
},
},
computed: {
...mapGetters(['auth', 'autograph']),
skillNames() {
if (this.info.skillNames) {
return this.info.skillNames.split(',');
} }
}, },
computed: { },
...mapGetters(['auth', 'autograph']), };
skillNames() {
if (this.info.skillNames) {
return this.info.skillNames.split(',')
}
}
}
}
</script> </script>
<style lang="scss"> <style lang="scss">
.codeSealBox { .codeSealBox {
padding: 285rpx 72rpx 0 72rpx; padding: 285rpx 72rpx 0 72rpx;
.closeCode {
position: absolute;
right: 36rpx;
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;
}
.closeCode {
position: absolute;
right: 36rpx;
top: 120rpx;
color: #1b66ff;
transform: rotate(45deg);
font-size: 40px;
} }
.contractMask { .title {
background-color: #FFFFFF; display: flex;
margin: 30rpx; align-items: center;
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;
}
} }
.lookContract { .name {
width: 30%; height: 46rpx;
margin-right: 30rpx; font-size: 46rpx;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #333333;
line-height: 46rpx;
margin-right: 28rpx;
} }
.flexbtn { .tip {
flex: 1; height: 38rpx;
font-size: 28rpx;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #999999;
line-height: 38rpx;
} }
.bottombtn { .forget {
background-color: #1B66FF; height: 38rpx;
color: #fff; font-size: 28rpx;
text-align: center; font-family: PingFangSC-Regular, PingFang SC;
border-radius: 10rpx; font-weight: 400;
font-family: PingFangSC-Medium; color: #5aa0fa;
font-size: 32rpx; line-height: 38rpx;
text-align: right;
}
}
.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; height: 90rpx;
line-height: 90rpx; line-height: 90rpx;
}
.btn {
background-color: #fefefe;
width: 690rpx;
padding: 30rpx;
padding-bottom: 80rpx;
position: fixed;
bottom: 0;
left: 0;
display: flex;
}
.disabledBtn {
background-color: #c8c9cc;
}
.map {
width: 100%;
height: 350rpx;
margin-top: 30rpx;
}
.askList {
font-family: PingFangSC-Regular;
font-size: 24rpx;
color: #666666;
background-color: #f6f6f6;
padding: 5rpx 15rpx;
margin-right: 10rpx;
margin-top: 15rpx;
}
.ask {
overflow: hidden;
width: 100%;
display: flex;
align-items: center;
flex-wrap: wrap;
justify-content: flex-start;
margin: 20rpx 0;
}
.proint {
margin-top: 30rpx;
font-size: 30rpx !important;
}
.proneed {
font-size: 32rpx !important;
}
.fee {
font-family: PingFangSC-Medium;
font-size: 32rpx;
color: #F46161;
margin-top: 30rpx;
}
.protype {
width: 50%;
}
.prolist {
font-family: PingFangSC-Regular;
font-size: 28rpx;
color: #666666;
display: flex;
align-items: center;
justify-content: space-between;
text-align: left;
padding: 5rpx 0;
}
.proname {
font-weight: bold;
font-family: PingFangSC-Medium;
font-size: 40rpx;
color: #333333;
width: 90%;
overflow: hidden;
padding-bottom: 20rpx;
}
.head {
padding: 30rpx;
background: #fefefe;
border-bottom: 20rpx solid #f6f6f6;
}
.description {
word-break: break-all;
white-space: pre-line;
}
.contactWrapper {
box-sizing: border-box;
text-align: center; text-align: center;
font-size: 28rpx; background: #1b66ff;
margin-top: 10rpx; font-size: 36rpx;
border: 1px solid #e0e0e0; font-weight: 400;
border-radius: 5px; color: #ffffff;
padding: 20rpx;
display: flex;
justify-content: space-between;
align-items: center;
} }
}
.applyTime { .lookContract {
font-size: 24rpx; width: 30%;
color: #666666; margin-right: 30rpx;
} }
.wrapperLeft { .flexbtn {
display: flex; flex: 1;
align-items: flex-start; }
justify-content: center;
flex-direction: column;
}
.btnGr { .bottombtn {
background-color: green; background-color: #1b66ff;
color: #FFFFFF; color: #fff;
padding: 10rpx 20rpx; text-align: center;
border-radius: 5rpx; border-radius: 10rpx;
} font-family: PingFangSC-Medium;
font-size: 32rpx;
height: 90rpx;
line-height: 90rpx;
}
.btnHuy { .btn {
background-color: #e8e8e8; background-color: #fefefe;
color: #FFFFFF; width: 690rpx;
padding: 10rpx 20rpx; padding: 30rpx;
border-radius: 5rpx; padding-bottom: 80rpx;
} position: fixed;
bottom: 0;
left: 0;
display: flex;
}
.disabledBtn {
background-color: #c8c9cc;
}
.map {
width: 100%;
height: 350rpx;
margin-top: 30rpx;
}
.askList {
font-family: PingFangSC-Regular;
font-size: 24rpx;
color: #666666;
background-color: #f6f6f6;
padding: 5rpx 15rpx;
margin-right: 10rpx;
margin-top: 15rpx;
}
.ask {
overflow: hidden;
width: 100%;
display: flex;
align-items: center;
flex-wrap: wrap;
justify-content: flex-start;
margin: 20rpx 0;
}
.proint {
margin-top: 30rpx;
font-size: 30rpx !important;
}
.proneed {
font-size: 32rpx !important;
}
.fee {
font-family: PingFangSC-Medium;
font-size: 32rpx;
color: #f46161;
margin-top: 30rpx;
}
.protype {
width: 50%;
}
.prolist {
font-family: PingFangSC-Regular;
font-size: 28rpx;
color: #666666;
display: flex;
align-items: center;
justify-content: space-between;
text-align: left;
padding: 5rpx 0;
}
.proname {
font-weight: bold;
font-family: PingFangSC-Medium;
font-size: 40rpx;
color: #333333;
width: 90%;
overflow: hidden;
padding-bottom: 20rpx;
}
.head {
padding: 30rpx;
background: #fefefe;
border-bottom: 20rpx solid #f6f6f6;
}
.description {
word-break: break-all;
white-space: pre-line;
}
.contactWrapper {
box-sizing: border-box;
text-align: center;
font-size: 28rpx;
margin-top: 10rpx;
border: 1px solid #e0e0e0;
border-radius: 5px;
padding: 20rpx;
display: flex;
justify-content: space-between;
align-items: center;
}
.applyTime {
font-size: 24rpx;
color: #666666;
}
.wrapperLeft {
display: flex;
align-items: flex-start;
justify-content: center;
flex-direction: column;
}
.btnGr {
background-color: green;
color: #ffffff;
padding: 10rpx 20rpx;
border-radius: 5rpx;
}
.btnHuy {
background-color: #e8e8e8;
color: #ffffff;
padding: 10rpx 20rpx;
border-radius: 5rpx;
}
</style> </style>

View File

@@ -38,7 +38,7 @@
</view> </view>
</view> </view>
<!-- 技能标签 end --> <!-- 技能标签 end -->
<view v-if="info.jobSources" class="prolist">来源{{ info.jobSources }}</view> <view v-if="info.jobSources" style="color: red" class="prolist">来源{{ info.jobSources }}</view>
</view> </view>
<view class="head"> <view class="head">
<!-- <view class="proname proneed"> <!-- <view class="proname proneed">

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,250 +1,219 @@
<template> <template>
<view
class="custom-tree-select-content"
:class="{
border:
border &&
node[dataChildren] &&
node[dataChildren].length &&
node.showChildren
}"
:style="{ marginLeft: `${level ? 14 : 0}px` }"
>
<view v-if="node.visible" class="custom-tree-select-item">
<view class="item-content">
<view class="left">
<view
v-if="node[dataChildren] && node[dataChildren].length"
:class="['right-icon', { active: node.showChildren }]"
@click.stop="nameClick(node)"
>
<uni-icons type="forward" size="14" color="#333"></uni-icons>
</view>
<view v-else class="smallcircle-filled">
<uni-icons
class="smallcircle-filled-icon"
type="smallcircle-filled"
size="10"
color="#333"
></uni-icons>
</view>
<view
v-if="loadingArr.includes(node[dataValue])"
class="loading-icon-box"
>
<uni-icons
class="loading-icon"
type="spinner-cycle"
size="14"
color="#333"
></uni-icons>
</view>
<view
class="name"
:style="node.disabled ? 'color: #999' : ''"
@click.stop="nameClick(node)"
>
<text>{{ node[dataLabel] }}</text>
</view>
</view>
<view
v-if="
choseParent ||
(!choseParent && !node[dataChildren]) ||
(!choseParent && node[dataChildren] && !node[dataChildren].length)
"
:class="['check-box', { disabled: node.disabled }]"
@click.stop="nodeClick(node)"
>
<view
v-if="!node.checked && node.partChecked && linkage"
class="part-checked"
></view>
<uni-icons
v-if="node.checked"
type="checkmarkempty"
size="18"
:color="node.disabled ? '#333' : '#007aff'"
></uni-icons>
</view>
</view>
</view>
<view <view
v-if=" class="custom-tree-select-content"
node.showChildren && node[dataChildren] && node[dataChildren].length :class="{
" border: border && node[dataChildren] && node[dataChildren].length && node.showChildren,
}"
:style="{ marginLeft: `${level ? 14 : 0}px` }"
> >
<data-select-item <view v-if="node.visible" class="custom-tree-select-item">
v-for="item in listData" <view class="item-content">
:key="item[dataValue]" <view class="left">
:node="item" <view
:dataLabel="dataLabel" v-if="node[dataChildren] && node[dataChildren].length"
:dataValue="dataValue" :class="['right-icon', { active: node.showChildren }]"
:dataChildren="dataChildren" @click.stop="nameClick(node)"
:choseParent="choseParent" >
:border="border" <uni-icons type="forward" size="14" color="#333"></uni-icons>
:linkage="linkage" </view>
:level="level + 1" <view v-else class="smallcircle-filled">
:load="load" <uni-icons
:lazyLoadChildren="lazyLoadChildren" class="smallcircle-filled-icon"
></data-select-item> type="smallcircle-filled"
size="10"
color="#333"
></uni-icons>
</view>
<view v-if="loadingArr.includes(node[dataValue])" class="loading-icon-box">
<uni-icons class="loading-icon" type="spinner-cycle" size="14" color="#333"></uni-icons>
</view>
<view class="name" :style="node.disabled ? 'color: #999' : ''" @click.stop="nameClick(node)">
<text>{{ node[dataLabel] }}</text>
</view>
</view>
<view
v-if="
choseParent ||
(!choseParent && !node[dataChildren]) ||
(!choseParent && node[dataChildren] && !node[dataChildren].length)
"
:class="['check-box', { disabled: node.disabled }]"
@click.stop="nodeClick(node)"
>
<view v-if="!node.checked && node.partChecked && linkage" class="part-checked"></view>
<uni-icons
v-if="node.checked"
type="checkmarkempty"
size="18"
:color="node.disabled ? '#333' : '#007aff'"
></uni-icons>
</view>
</view>
</view>
<view v-if="node.showChildren && node[dataChildren] && node[dataChildren].length">
<data-select-item
v-for="item in listData"
:key="item[dataValue]"
:node="item"
:dataLabel="dataLabel"
:dataValue="dataValue"
:dataChildren="dataChildren"
:choseParent="choseParent"
:border="border"
:linkage="linkage"
:level="level + 1"
:load="load"
:lazyLoadChildren="lazyLoadChildren"
></data-select-item>
</view>
</view> </view>
</view>
</template> </template>
<script> <script>
import dataSelectItem from './data-select-item.vue' import dataSelectItem from './data-select-item.vue';
import { paging } from './utils' import { paging } from './utils';
export default { export default {
name: 'data-select-item', name: 'data-select-item',
components: { components: {
'data-select-item': dataSelectItem 'data-select-item': dataSelectItem,
},
props: {
node: {
type: Object,
default: () => ({})
}, },
choseParent: { props: {
type: Boolean, node: {
default: true type: Object,
default: () => ({}),
},
choseParent: {
type: Boolean,
default: true,
},
dataLabel: {
type: String,
default: 'name',
},
dataValue: {
type: String,
default: 'value',
},
dataChildren: {
type: String,
default: 'children',
},
border: {
type: Boolean,
default: false,
},
linkage: {
type: Boolean,
default: false,
},
level: {
type: Number,
default: 0,
},
load: {
type: Function,
default: function () {},
},
lazyLoadChildren: {
type: Boolean,
default: false,
},
}, },
dataLabel: { data() {
type: String, return {
default: 'name' listData: [],
clearTimerList: [],
loadingArr: [],
};
}, },
dataValue: { computed: {
type: String, watchData() {
default: 'value' const { node, dataChildren } = this;
},
dataChildren: {
type: String,
default: 'children'
},
border: {
type: Boolean,
default: false
},
linkage: {
type: Boolean,
default: false
},
level: {
type: Number,
default: 0
},
load: {
type: Function,
default: function () {}
},
lazyLoadChildren: {
type: Boolean,
default: false
}
},
data() {
return {
listData: [],
clearTimerList: [],
loadingArr: []
}
},
computed: {
watchData() {
const { node, dataChildren } = this
return { return {
node, node,
dataChildren dataChildren,
} };
} },
},
watch: {
watchData: {
immediate: true,
handler(newVal) {
const { node, dataChildren } = newVal
if (
node.showChildren &&
node[dataChildren] &&
node[dataChildren].length
) {
this.resetClearTimerList()
this.renderTree(node[dataChildren])
}
}
}
},
methods: {
// 懒加载
renderTree(arr) {
const pagingArr = paging(arr)
this.listData.splice(0, this.listData.length, ...(pagingArr?.[0] || []))
this.lazyRenderList(pagingArr, 1)
}, },
// 懒加载具体逻辑 watch: {
lazyRenderList(arr, startIndex) { watchData: {
for (let i = startIndex; i < arr.length; i++) { immediate: true,
let timer = null handler(newVal) {
timer = setTimeout(() => { const { node, dataChildren } = newVal;
this.listData.push(...arr[i]) if (node.showChildren && node[dataChildren] && node[dataChildren].length) {
}, i * 500) this.resetClearTimerList();
this.clearTimerList.push(() => clearTimeout(timer)) this.renderTree(node[dataChildren]);
} }
},
},
}, },
// 中断懒加载 methods: {
resetClearTimerList() { // 懒加载
const list = [...this.clearTimerList] renderTree(arr) {
this.clearTimerList.splice(0, this.clearTimerList.length) const pagingArr = paging(arr);
list.forEach((item) => item()) this.listData.splice(0, this.listData.length, ...(pagingArr?.[0] || []));
this.lazyRenderList(pagingArr, 1);
},
// 懒加载具体逻辑
lazyRenderList(arr, startIndex) {
for (let i = startIndex; i < arr.length; i++) {
let timer = null;
timer = setTimeout(() => {
this.listData.push(...arr[i]);
}, i * 500);
this.clearTimerList.push(() => clearTimeout(timer));
}
},
// 中断懒加载
resetClearTimerList() {
const list = [...this.clearTimerList];
this.clearTimerList.splice(0, this.clearTimerList.length);
list.forEach((item) => item());
},
async nameClick(node) {
if (!node[this.dataChildren]?.length && this.lazyLoadChildren) {
this.loadingArr.push(node[this.dataValue]);
try {
const res = await this.load(node);
if (Array.isArray(res)) {
uni.$emit('custom-tree-select-load', {
source: node,
target: res,
});
}
} finally {
this.loadingArr = [];
}
} else {
if (!node.showChildren && node[this.dataChildren] && node[this.dataChildren].length) {
// 打开
this.renderTree(node[this.dataChildren]);
} else {
// 关闭
this.resetClearTimerList();
this.listData.splice(0, this.listData.length);
}
uni.$emit('custom-tree-select-name-click', node);
}
},
nodeClick(node) {
if (!node.disabled) {
uni.$emit('custom-tree-select-node-click', node);
}
},
}, },
async nameClick(node) { options: {
if (!node[this.dataChildren]?.length && this.lazyLoadChildren) { styleIsolation: 'shared',
this.loadingArr.push(node[this.dataValue])
try {
const res = await this.load(node)
if (Array.isArray(res)) {
uni.$emit('custom-tree-select-load', {
source: node,
target: res
})
}
} finally {
this.loadingArr = []
}
} else {
if (
!node.showChildren &&
node[this.dataChildren] &&
node[this.dataChildren].length
) {
// 打开
this.renderTree(node[this.dataChildren])
} else {
// 关闭
this.resetClearTimerList()
this.listData.splice(0, this.listData.length)
}
uni.$emit('custom-tree-select-name-click', node)
}
}, },
nodeClick(node) { };
if (!node.disabled) {
uni.$emit('custom-tree-select-node-click', node)
}
}
},
options: {
styleIsolation: 'shared'
}
}
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
* { * {
margin: 0; margin: 0;
padding: 0; padding: 0;
box-sizing: border-box; box-sizing: border-box;
} }
$primary-color: #007aff; $primary-color: #007aff;
@@ -259,105 +228,105 @@ $radius-base: 6px;
$border-color: #c8c7cc; $border-color: #c8c7cc;
.custom-tree-select-content { .custom-tree-select-content {
&.border { &.border {
border-left: 1px solid $border-color; border-left: 1px solid $border-color;
}
/deep/ .uni-checkbox-input {
margin: 0 !important;
}
.item-content {
margin: 0 0 $col-lg;
display: flex;
justify-content: space-between;
align-items: center;
position: relative;
&::after {
content: '';
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 3px;
background-color: #fff;
transform: translateX(-2px);
z-index: 1;
} }
.left { ::v-deep .uni-checkbox-input {
flex: 1; margin: 0 !important;
display: flex; }
align-items: center;
.item-content {
.right-icon { margin: 0 0 $col-lg;
transition: 0.15s ease; display: flex;
justify-content: space-between;
&.active { align-items: center;
transform: rotate(90deg); position: relative;
}
} &::after {
content: '';
.smallcircle-filled { position: absolute;
width: 14px; top: 0;
height: 13.6px; left: 0;
display: flex; bottom: 0;
align-items: center; width: 3px;
background-color: #fff;
.smallcircle-filled-icon { transform: translateX(-2px);
transform-origin: center; z-index: 1;
transform: scale(0.55); }
}
} .left {
flex: 1;
.loading-icon-box { display: flex;
margin-right: $row-sm; align-items: center;
width: 14px;
height: 100%; .right-icon {
display: flex; transition: 0.15s ease;
justify-content: center;
align-items: center; &.active {
transform: rotate(90deg);
.loading-icon { }
transform-origin: center; }
animation: rotating infinite 0.2s ease;
} .smallcircle-filled {
} width: 14px;
height: 13.6px;
.name { display: flex;
flex: 1; align-items: center;
}
.smallcircle-filled-icon {
transform-origin: center;
transform: scale(0.55);
}
}
.loading-icon-box {
margin-right: $row-sm;
width: 14px;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
.loading-icon {
transform-origin: center;
animation: rotating infinite 0.2s ease;
}
}
.name {
flex: 1;
}
}
} }
}
} }
.check-box { .check-box {
width: 23.6px; width: 23.6px;
height: 23.6px; height: 23.6px;
border: 1px solid $border-color; border: 1px solid $border-color;
border-radius: $radius-sm; border-radius: $radius-sm;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
&.disabled { &.disabled {
background-color: rgb(225, 225, 225); background-color: rgb(225, 225, 225);
} }
.part-checked { .part-checked {
width: 60%; width: 60%;
height: 2px; height: 2px;
background-color: $primary-color; background-color: $primary-color;
} }
} }
@keyframes rotating { @keyframes rotating {
from { from {
transform: rotate(0); transform: rotate(0);
} }
to { to {
transform: rotate(360deg); transform: rotate(360deg);
} }
} }
</style> </style>

View File

@@ -10,6 +10,7 @@ module.exports = {
// target: 'http://192.168.1.115:8000', // target: 'http://192.168.1.115:8000',
target: 'http://39.98.44.136:6013', target: 'http://39.98.44.136:6013',
ws: true, ws: true,
changeOrigin: true,
pathRewrite: { pathRewrite: {
'^/api': '/' '^/api': '/'
} }
@@ -18,6 +19,7 @@ module.exports = {
//本地服务接口地址 //本地服务接口地址
target: 'https://apis.map.qq.com', target: 'https://apis.map.qq.com',
ws: true, ws: true,
changeOrigin: true,
pathRewrite: { pathRewrite: {
'^/qq/map': '/' '^/qq/map': '/'
} }