chuangte_bike_newxcx/page_shanghu/gongzuotai/sysSet.vue
2026-02-06 15:28:01 +08:00

1493 lines
37 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="page">
<u-navbar title="运营配置" :border-bottom="false" :background="bgc" title-color='#000' title-size='36'
height='45'></u-navbar>
<view class="tab">
<view :class="tabindex == 0 ? 'tabactive' : ''" @click="btntab(0)">
基础信息
<text></text>
</view>
<view :class="tabindex == 1 ? 'tabactive' : ''" @click="btntab(1)">
骑行设置
<text></text>
</view>
<view :class="tabindex == 2 ? 'tabactive' : ''" @click="btntab(2)">
还车设置
<text></text>
</view>
</view>
<scroll-view scroll-y="true" style="height: 72vh;overflow: scroll;">
<view class="" v-if="tabindex == 0">
<view class="card">
<view class="card_li">
<view class="tops" style="display: block;">
<view class="card_left">
运营区名称
</view>
<view class=""
style="width: 100%;background: #F4F5F7;border-radius: 14rpx 14rpx 14rpx 14rpx;margin-top: 18rpx;height: 80rpx;line-height: 80rpx;padding-left: 24rpx;">
<input type="text" v-model="form.name" placeholder="运营区名称" class="input"
placeholder-style="color:#C7CDD3" style="height: 80rpx;line-height: 80rpx;">
</view>
</view>
</view>
</view>
<!-- 三级联动选择器 -->
<view class="xingzheng">
<view class="district-container">
<!-- 点击区域 -->
<view class="district-trigger" @tap="btnshowDistrict">
<view class="district-label">行政区</view>
<view class="district-placeholder">
{{selectedText || '请选择'}}
</view>
</view>
<!-- 选择器弹窗 -->
<view class="district-picker" v-if="showDistrict">
<!-- 标题和操作按钮 -->
<view class="picker-header">
<view class="header-title">请点击选择</view>
<view class="header-actions">
<view class="header-btn cancel" @tap="handleCancel">取消</view>
<view class="header-btn confirm" @tap="handleConfirm">确认</view>
</view>
</view>
<!-- 三级选择列 -->
<view class="picker-columns">
<!-- 省份列 -->
<scroll-view class="picker-column" scroll-y>
<view v-for="item in provinceList" :key="item.id"
:class="['column-item', (tempProvince && tempProvince.id === item.id) ? 'active' : '']"
@tap="handleProvinceSelect(item)">
{{item.name}}
</view>
</scroll-view>
<!-- 城市列 -->
<scroll-view class="picker-column" scroll-y>
<view v-for="item in cityList" :key="item.id"
:class="['column-item', (tempCity && tempCity.id === item.id) ? 'active' : '']"
@tap="handleCitySelect(item)">
{{item.name}}
</view>
</scroll-view>
<!-- 区县列 -->
<scroll-view class="picker-column" scroll-y>
<view v-for="item in districtList" :key="item.id"
:class="['column-item', (tempDistrict && tempDistrict.id === item.id) ? 'active' : '']"
@tap="handleDistrictSelect(item)">
{{item.name}}
</view>
</scroll-view>
</view>
</view>
</view>
</view>
<view class="card" style="padding-bottom: 50rpx;">
<view class="biaoti">
基础信息
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
状态
</view>
<view class="card_right">
<u-switch v-model="timeflag"></u-switch>
</view>
</view>
<view class="tips">
关闭后用户将不能使用运营区及车辆
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
运营时间
</view>
<view class="card_right">
</view>
</view>
<view class="tips"
style="display: flex;justify-content: space-between;margin-top: 20rpx;align-items: center;background-color: #F4F5F7;padding: 28rpx;border-radius: 20rpx;text-align: center;">
<u-input :disabled="true" style="margin-right: 10rpx;background-color: #E2E2E2;border-radius: 20rpx;text-align: center;overflow: hidden;" v-model="startTime"
placeholder="如: 09:00:00" border="none" @click="showTimePicker('work')"></u-input> —
<u-input :disabled="true" style="margin-left: 10rpx;background-color: #E2E2E2;border-radius: 20rpx;text-align: center;overflow: hidden;" v-model="endTime"
placeholder="如: 18:00:00" border="none" @click="showTimePicker('off')"></u-input>
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
实名认证
</view>
<view class="card_right">
<u-switch v-model="shimflag"></u-switch>
</view>
</view>
<view class="tips">
开启后用户必须先进行实名认证才可使用
</view>
</view>
<view class="card_li" style="background-color: #F4F5F7;border-radius: 20rpx;padding: 20rpx 32rpx;" v-if="shimflag == true">
<view class="tops">
<view class="card_left">
最低用车年龄
</view>
<view class="card_right">
<input type="number" v-model="form.minAge" placeholder=" " class="input"
placeholder-style="color:#C7CDD3" style="width: 80rpx;background-color: #E2E2E2;text-align: center;padding: 0;">
</view>
</view>
<view class="tips">
用户年龄不满足最低年龄不可使用
</view>
</view>
<view class="card_li" style="background-color: #F4F5F7;border-radius: 20rpx;padding: 20rpx 32rpx;margin-top: 30rpx;" v-if="shimflag == true">
<view class="tops">
<view class="card_left">
最高用车年龄
</view>
<view class="card_right">
<input type="number" v-model="form.maxAge" placeholder=" " class="input"
placeholder-style="color:#C7CDD3" style="width: 80rpx;background-color: #E2E2E2;text-align: center;padding: 0;">
</view>
</view>
<view class="tips">
设置用户最高用车年龄,需配合实名认证使用;若无需校验可设置为1000
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
换车校验位置
</view>
<view class="card_right">
<u-switch v-model="form.changeCheck"></u-switch>
</view>
</view>
<view class="tips">
开启后用户换车是否需要校验位置
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
是否允许多订单
</view>
<view class="card_right">
<u-switch v-model="form.multipleOrder"></u-switch>
</view>
</view>
<view class="tips">
开启后用户可以进行多个订单
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
手机校验附近设备
</view>
<view class="card_right">
<u-switch v-model="form.mobileCheckMac"></u-switch>
</view>
</view>
<view class="tips">
开启后,用户还车时会校验手机附近设备,若不匹配则视为无效定位,可以降低异地还车的风险
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
是否开启使用前上传视频
</view>
<view class="card_right">
<u-switch v-model="scspflag"></u-switch>
</view>
</view>
<view class="tips">
开启后用户必须先拍摄全车视频才能下单
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
驾驶证认证
</view>
<view class="card_right">
<u-switch v-model="jiasflag"></u-switch>
</view>
</view>
<view class="tips">
开启后用户必须先通过驾驶证认证才可使用
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
短信通知服务
</view>
<view class="card_right">
<u-switch v-model="form.msgSwitch"></u-switch>
</view>
</view>
<view class="tips">
开启短信通知短信费用0.1元/条,从余额中扣除
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
寻车范围
</view>
<view class="card_right">
<u-switch v-model="form.requiredRingRadius"></u-switch>
</view>
</view>
<!-- <view class="tops" style="margin-top: 20rpx;" v-if="form.requiredRingRadius == true">
<view class="card_left">
允许寻车范围
</view>
<view class="card_right">
<input type="number" v-model="form.ringRadius" placeholder=" " class="input"
placeholder-style="color:#C7CDD3" style="width: 100rpx;">米
</view>
</view>
<view class="tips" style="margin-top: 10rpx;">
开启后,用户需在车辆指定范围才允许响铃寻车(防止恶意响铃)
</view> -->
</view>
<view class="card_li" style="background-color: #F4F5F7;border-radius: 20rpx;padding: 20rpx 32rpx;margin-top: 30rpx;" v-if="form.requiredRingRadius == true">
<view class="tops">
<view class="card_left">
允许寻车范围
</view>
<view class="card_right">
<input type="number" v-model="form.ringRadius" placeholder=" " class="input"
placeholder-style="color:#C7CDD3" style="width: 80rpx;background-color: #E2E2E2;text-align: center;padding: 0;">米
</view>
</view>
<view class="tips">
开启后,用户需在车辆指定范围才允许响铃寻车(防止恶意响铃)
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
启用引导
</view>
<view class="card_right">
<u-switch v-model="form.guideEnable"></u-switch>
</view>
</view>
<view class="tips">
开启后,用户首次扫码后会播放引导视频
</view>
</view>
<view class="card_li">
<view class="tops" style="display: block;">
<view class="card_left" style="margin-bottom: 18rpx;">引导视频</view>
<view class="guide-video-upload" @click="uploadGuideVideo">
<view v-if="!form.guideVideo" class="guide-video-placeholder">
<text class="guide-video-plus">+</text>
</view>
<view v-else class="guide-video-preview">
<video :src="form.guideVideo" class="guide-video-preview-video" controls></video>
<view class="guide-video-remove" @click.stop="removeGuideVideo">
<text>删除</text>
</view>
</view>
</view>
</view>
</view>
</view>
</view>
<view class="" v-if="tabindex == 1 || tabindex == 0">
<view class="card">
<view class="biaoti">
骑行设置
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
靠近边界播报距离
</view>
<view class="card_right">
<input type="number" v-model="form.boundaryDistance" placeholder=" " class="input"
placeholder-style="color:#C7CDD3" style="width: 100rpx;">米
</view>
</view>
<view class="tips" style="text-align: left;">
靠近边界播报距离(米)
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
运营区外断电距离
</view>
<view class="card_right">
<input type="number" v-model="form.outageDistance" placeholder=" " class="input"
placeholder-style="color:#C7CDD3" style="width: 100rpx;">米
</view>
</view>
<view class="tips" style="text-align: left;">
运营区外断电距离(米)
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
禁行区内断电
</view>
<view class="card_right">
<u-switch v-model="form.noRidingOutage"></u-switch>
</view>
</view>
<view class="tips">
开启后当进入禁行区内将进行断电
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
是否允许换车
</view>
<view class="card_right">
<u-switch v-model="form.enableChange"></u-switch>
</view>
</view>
<view class="tips">
开启后当进入禁行区内将进行断电
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
运营区域外断电
</view>
<view class="card_right">
<u-switch v-model="form.areaOutOutage"></u-switch>
</view>
</view>
<view class="tips">
开启后当进入运营区域外内将进行断电
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
低于电量(%)不得骑行
</view>
<view class="card_right">
<input type="number" v-model="form.undercharge" placeholder=" " class="input"
placeholder-style="color:#C7CDD3" style="width: 100rpx;">%
</view>
</view>
<view class="tips" style="text-align: left;">
当车辆电量低于多少时无法解锁用车
</view>
</view>
</view>
</view>
<view class="" v-if="tabindex == 2 || tabindex == 0">
<view class="card">
<view class="biaoti">
还车设置
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
还车是否拍照审核
</view>
<view class="card_right">
<u-switch v-model="form.returnVerify"></u-switch>
</view>
</view>
<view class="tips">
开启后则需用户拍摄视频后审核订单方可退还押金
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
强制停车点还车
</view>
<view class="card_right">
<u-switch v-model="form.parkingReturn"></u-switch>
</view>
</view>
<view class="tips">
开启则必须在停车点才可还车,停车点存在误差
</view>
</view>
<view class="card_li" v-if="form.parkingReturn == false">
<view class="tops">
<view class="card_left">
运营区外还车
</view>
<view class="card_right">
<u-switch v-model="form.areaOutReturn"></u-switch>
</view>
</view>
<view class="tips">
开启后可以在运营区范围外还车
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
运营区外管理费
</view>
<view class="card_right">
<input type="number" v-model="form.vehicleManagementFee" placeholder=" " class="input"
placeholder-style="color:#C7CDD3" style="width: 100rpx;">元
</view>
</view>
<view class="tips" style="text-align: left;">
设置车辆超出运营区外产生的管理费用
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
停车点外调度费
</view>
<view class="card_right">
<input type="number" v-model="form.dispatchFee" placeholder=" " class="input"
placeholder-style="color:#C7CDD3" style="width: 100rpx;">元
</view>
</view>
<view class="tips" style="text-align: left;">
设置车辆超出停车点外产生的调度费用
</view>
</view>
<view class="card_li">
<view class="tops">
<view class="card_left">
还车误差
</view>
<view class="card_right">
<input type="number" v-model="form.error" placeholder=" " class="input"
placeholder-style="color:#C7CDD3" style="width: 100rpx;">米
</view>
</view>
<view class="tips" style="text-align: left;">
允许用户在规划的停车点外多少米还车
</view>
</view>
<!-- <view class="card_li" @click="toMap()">
<view class="tops">
<view class="card_left">
电子围栏设置
</view>
<view class="card_right">
<view class="iconfont icon-xiangyou1">
</view>
</view>
</view>
<view class="tips" style="text-align: left;">
设置车辆可以正常行驶的区域
</view>
</view> -->
</view>
</view>
</scroll-view>
<!-- 时间选择器 -->
<u-picker v-model="showTimeSelect" mode="time" @confirm="timeConfirm" :params="params"
:default-time='00'></u-picker>
<view class="btn_box">
<view class="btn1" @click="backpage()">
取消
</view>
<view class="btn2" @click="sub">
保存
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
bgc: {
backgroundColor: "#fff",
},
list: [],
form: {},
deptInfo: {},
areaId: '',
customServices: [],
params: {
year: false,
month: false,
day: false,
hour: true,
minute: true,
second: true
},
showTimeSelect: false,
timeType: "work", // work or off
startTime: '',
endTime: '',
timeflag: false,
shimflag: false,
jiasflag: false,
scspflag: false,
// 行政区划数据
regionData: [],
provinceList: [],
cityList: [],
districtList: [],
// 已选择的数据(确认后保存)
selectedProvince: null,
selectedCity: null,
selectedDistrict: null,
// 临时选择的数据(选择器中使用)
tempProvince: null,
tempCity: null,
tempDistrict: null,
// 控制选择器显示
showDistrict: false,
selectedText: '请选择',
tabindex: 0,
qiniuToken: ''
}
},
onLoad(e) {
},
onShow() {
if (uni.getStorageSync('adminAreaid')) {
this.areaId = uni.getStorageSync('adminAreaid')
}
this.getAreaInfo()
this.getxingzhen()
this.getQiniuToken()
},
computed: {
// 计算已选择的文本显示
// selectedText() {
// if (!this.selectedProvince) return '';
// let text = this.selectedProvince.name;
// if (this.selectedCity) text += this.selectedCity.name;
// if (this.selectedDistrict) text += this.selectedDistrict.name;
// return text;
// }
},
methods: {
// 点击头部tab进行切换
btntab(num) {
this.tabindex = num
console.log(this.tabindex);
},
btnshowDistrict() {
this.showDistrict = !this.showDistrict
},
// 获取所有行政区
getxingzhen() {
this.$u.get(`/bst/region/all`).then(res => {
if (res.code == 200) {
this.regionData = res.data;
// 初始化省份列表
this.provinceList = this.regionData.filter(item => item.level === 1);
}
})
},
// 选择省份
handleProvinceSelect(item) {
this.tempProvince = item
// 获取该省份下的城市
this.cityList = this.regionData.filter(city =>
city.level === 2 && city.parentId === item.id
)
// 清空已选择的城市和区县
this.tempCity = null
this.tempDistrict = null
this.districtList = []
},
// 选择城市
handleCitySelect(item) {
this.tempCity = item;
// 获取该城市下的区县
this.districtList = this.regionData.filter(district =>
district.level === 3 && district.parentId === item.id
);
// 清空已选择的区县
this.tempDistrict = null;
},
// 选择区县
handleDistrictSelect(item) {
this.tempDistrict = item;
},
// 取消选择
handleCancel() {
// 重置临时选择
this.tempProvince = this.selectedProvince;
this.tempCity = this.selectedCity;
this.tempDistrict = this.selectedDistrict;
// 如果之前选择了省份,需要重新加载城市列表
if (this.tempProvince) {
this.cityList = this.regionData.filter(city =>
city.level === 2 && city.parentId === this.tempProvince.id
)
}
// 如果之前选择了城市,需要重新加载区县列表
if (this.tempCity) {
this.districtList = this.regionData.filter(district =>
district.level === 3 && district.parentId === this.tempCity.id
)
}
this.showDistrict = false
},
// 确认选择
handleConfirm() {
// 保存临时选择到最终选择
this.selectedProvince = this.tempProvince
this.selectedCity = this.tempCity
this.selectedDistrict = this.tempDistrict
if (this.selectedProvince) {
} else {
uni.showToast({
title: '请选择省/自治区',
icon: 'none',
duration: 1500
})
return
}
if (this.selectedCity) {
} else {
uni.showToast({
title: '请选择市',
icon: 'none',
duration: 1500
})
return
}
// 保存到表单
if (this.selectedDistrict) {
this.form.districtId = this.selectedDistrict.id
this.form.districtName = this.selectedDistrict.name
this.form.provinceId = this.selectedProvince.id
this.form.provinceName = this.selectedProvince.name
this.form.cityId = this.selectedCity.id
this.form.cityName = this.selectedCity.name
this.form.regionId = this.selectedDistrict.id
this.selectedText = this.form.provinceName + ',' + this.form.cityName + ',' + this.form.districtName
// 收起选择器
this.showDistrict = !this.showDistrict
} else {
uni.showToast({
title: '请选择区',
icon: 'none',
duration: 1500
})
return
}
},
// 显示时间选择器
showTimePicker(type) {
this.timeType = type
this.showTimeSelect = true
},
// 时间选择确认
timeConfirm(e) {
const time = `${e.hour}:${e.minute}:${e.second}`
if (this.timeType === 'work') {
this.startTime = time
} else {
this.endTime = time
}
},
toMap() {
uni.navigateTo({
url: '/page_shanghu/guanli/msp_set?areaId=' + this.areaId
})
},
addService() {
if (this.customServices.length < 3) {
this.customServices.push({
name: "",
phone: ""
})
}
},
removeService(index) {
if (index > 0 && this.customServices.length > 1) {
this.$delete(this.customServices, index);
this.$set(this.form, `serviceName${index + 1}`, "")
this.$set(this.form, `servicePhone${index + 1}`, "")
}
},
getAreaInfo() {
this.$u.get(`/bst/area/${this.areaId}`).then((res) => {
if (res.code == 200) {
this.form = res.data
this.$set(this.form, 'guideEnable', res.data.guideEnable === true)
this.$set(this.form, 'guideVideo', res.data.guideVideo || '')
this.form.ruleIds = res.ruleIds
if (res.data.regionMergerName != null) {
this.selectedText = res.data.regionMergerName
}
this.startTime = res.data.areaTimeStart
this.endTime = res.data.areaTimeEnd
res.data.authentication.filter(item => {
if (item == 1) {
this.shimflag = true
} else if (item == 2) {
this.jiasflag = true
}
})
this.scspflag = res.data.needCheckVideo
if (res.data.status == 1) {
this.timeflag = false
} else if (res.data.status == 0) {
this.timeflag = 1
}
// 初始化 customServices 数组
this.customServices = [];
for (let i = 1; i <= 3; i++) {
if (
res.data[`serviceName${i}`] ||
res.data[`servicePhone${i}`]
) {
this.customServices.push({
name: res.data[`serviceName${i}`] || "",
phone: res.data[`servicePhone${i}`] || "",
})
}
}
// 如果 customServices 为空,添加一个默认的服务
if (this.customServices.length === 0) {
this.customServices.push({
name: "",
phone: ""
})
}
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 2000
})
}
})
},
getQiniuToken() {
this.$u.get("/common/qiniuToken").then((res) => {
if (res.code == 200) {
this.qiniuToken = res.data
}
})
},
uploadGuideVideo() {
if (!this.qiniuToken) {
uni.showToast({
title: '上传token获取失败请重试',
icon: 'none',
duration: 2000
})
return
}
uni.chooseVideo({
sourceType: ['album', 'camera'],
maxDuration: 60,
success: (res) => {
this._uploadGuideVideoToQiniu(res.tempFilePath)
},
fail: (err) => {
console.log('选择视频失败', err)
}
})
},
_uploadGuideVideoToQiniu(filePath) {
uni.showLoading({
title: '上传中...',
mask: true
})
let _this = this
let math = 'static/' + _this.$u.guid(20) + '.mp4'
uni.uploadFile({
url: 'https://up-z2.qiniup.com',
name: 'file',
filePath: filePath,
formData: {
token: _this.qiniuToken,
key: 'bike/video/' + math
},
success: function(res) {
uni.hideLoading()
try {
let str = JSON.parse(res.data)
_this.$set(_this.form, 'guideVideo', 'https://api.ccttiot.com/' + str.key)
uni.showToast({
title: '上传成功',
icon: 'success',
duration: 1500
})
} catch (e) {
uni.showToast({
title: '上传失败',
icon: 'none',
duration: 2000
})
}
},
fail: function() {
uni.hideLoading()
uni.showToast({
title: '上传失败',
icon: 'none',
duration: 2000
})
}
})
},
removeGuideVideo() {
this.$set(this.form, 'guideVideo', '')
},
backpage() {
uni.navigateBack()
},
// 选中任一radio时由radio-group触发
radioGroupChange(e) {
console.log(e)
if (e == '按分钟') {
this.data.rentalUnit = 'minutes'
} else {
this.data.rentalUnit = 'hours'
}
},
sub() {
let authentication = []
if (this.shimflag == true && this.jiasflag == true) {
authentication = [1, 2]
} else if (this.shimflag == true && this.jiasflag == false) {
authentication = [1]
} else if (this.shimflag == false && this.jiasflag == true) {
authentication = [2]
} else if (this.shimflag == false && this.jiasflag == false) {
authentication = []
}
let data = {
...this.form,
areaTimeStart: this.startTime,
areaTimeEnd: this.endTime,
status: this.timeflag == true ? '0' : '1',
authentication: authentication,
needCheckVideo: this.scspflag,
guideEnable: this.form.guideEnable === true,
guideVideo: this.form.guideVideo || ''
}
this.$u.put(`/bst/area`, data).then((res) => {
if (res.code == 200) {
uni.showToast({
title: '保存成功',
icon: 'success',
duration: 1000
})
setTimeout(() => {
uni.navigateBack()
}, 1100)
} else {
uni.showToast({
title: res.msg,
icon: 'none',
duration: 1000
})
}
})
}
}
}
</script>
<style lang="scss">
::v-deep .u-input__input{
text-align: center !important;
}
.tabactive {
font-weight: 600 !important;
color: #3D3D3D !important;
text {
background: #4297F3 !important;
border-radius: 4rpx 4rpx 4rpx 4rpx;
}
}
.tab {
width: 750rpx;
height: 90rpx;
background: #FFFFFF;
border-radius: 0rpx 0rpx 0rpx 0rpx;
display: flex;
align-items: center;
gap: 82rpx;
padding-left: 42rpx;
font-size: 36rpx;
view {
text-align: center;
color: #808080;
text {
display: block;
width: 56rpx;
height: 6rpx;
border-radius: 4rpx 4rpx 4rpx 4rpx;
margin: auto;
margin-top: 14rpx;
}
}
}
page {}
.xingzheng {
padding: 0 24rpx;
.district-container {
background: #fff;
border-radius: 12rpx;
margin-top: 20rpx;
box-shadow: 0rpx 2rpx 8rpx rgba(0, 0, 0, 0.06);
}
.district-trigger {
height: 100rpx;
display: flex;
align-items: center;
justify-content: space-between;
border-bottom: 1rpx solid #F0F0F0;
padding: 0 32rpx;
.district-label {
font-size: 30rpx;
color: #333;
font-weight: 600;
}
.district-placeholder {
font-size: 28rpx;
color: #999;
display: flex;
align-items: center;
&:after {
content: '';
display: inline-block;
width: 12rpx;
height: 12rpx;
border: 1rpx solid #999;
border-left: none;
border-top: none;
transform: rotate(-45deg);
margin-left: 8rpx;
transition: all 0.3s;
}
}
}
.district-picker {
position: relative;
background: #fff;
border-radius: 0 0 12rpx 12rpx;
margin-top: -1rpx;
z-index: 10;
box-shadow: 0rpx 4rpx 20rpx rgba(0, 0, 0, 0.1);
}
.picker-header {
height: 100rpx;
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 32rpx;
border-bottom: 1rpx solid #F0F0F0;
.header-title {
font-size: 32rpx;
color: #333;
font-weight: 500;
}
.header-actions {
display: flex;
gap: 40rpx;
.header-btn {
font-size: 28rpx;
line-height: 40rpx;
&.cancel {
color: #999;
}
&.confirm {
color: #4C97E7;
font-weight: 500;
}
}
}
}
.picker-columns {
display: flex;
height: 500rpx;
border-top: 1rpx solid #F8F8F8;
}
.picker-column {
flex: 1;
border-right: 1rpx solid #F0F0F0;
&:last-child {
border-right: none;
}
.column-item {
height: 80rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 28rpx;
color: #333;
padding: 0 20rpx;
border-bottom: 1rpx solid #F8F8F8;
&.active {
background: #F5F8FF;
color: #4C97E7;
font-weight: 500;
position: relative;
&:after {
content: '';
position: absolute;
left: 0;
top: 0;
bottom: 0;
width: 4rpx;
background: #4C97E7;
}
}
}
}
.selected-display {
padding: 20rpx 0;
.selected-label {
font-size: 24rpx;
color: #666;
margin-bottom: 16rpx;
}
.selected-tags {
display: flex;
flex-wrap: wrap;
gap: 16rpx;
.selected-tag {
display: inline-flex;
align-items: center;
background: #F0F8FF;
border-radius: 8rpx;
padding: 6rpx 16rpx;
padding-right: 8rpx;
border: 1rpx solid #D6E7FF;
.tag-text {
font-size: 24rpx;
color: #4C97E7;
font-weight: 500;
line-height: 34rpx;
}
.close-icon {
width: 24rpx;
height: 24rpx;
border-radius: 50%;
background: #E5E5E5;
color: #666;
display: flex;
align-items: center;
justify-content: center;
font-size: 20rpx;
margin-left: 8rpx;
line-height: 1;
&:active {
background: #D5D5D5;
}
}
}
}
}
}
.card {
padding: 0 24rpx;
margin: 24rpx auto 0;
width: 702rpx;
background: #FFFFFF;
border-radius: 16rpx;
box-shadow: 0rpx 2rpx 12rpx 0rpx rgba(0, 0, 0, 0.08);
.card_li {
width: 100%;
padding: 30rpx 0;
display: flex;
flex-wrap: wrap;
// border-bottom: 1rpx solid #F0F0F0;
.tops {
width: 100%;
display: flex;
align-items: center;
.card_left {
font-weight: 500;
font-size: 30rpx;
color: #333;
flex-shrink: 0;
}
.card_right {
margin-left: auto;
display: flex;
align-items: center;
.input {
text-align: center;
font-size: 30rpx;
color: #333;
min-width: 140rpx;
height: 60rpx;
background: #F4F5F7;
border-radius: 12rpx 12rpx 12rpx 12rpx;
}
}
}
.tips {
width: 100%;
font-size: 24rpx;
color: #999;
margin-top: 10rpx;
line-height: 34rpx;
}
}
}
.page {
.choose_part {
position: fixed;
top: 530rpx;
left: 54rpx;
z-index: 110;
width: 644rpx;
padding: 40rpx 48rpx;
background: #FFFFFF;
border-radius: 26rpx 26rpx 26rpx 26rpx;
.part_box {
margin-top: 40rpx;
display: flex;
flex-wrap: wrap;
.part:nth-child(3n) {
margin-right: 0;
}
.part {
margin-top: 10rpx;
position: relative;
margin-right: 36rpx;
display: flex;
align-items: center;
justify-content: center;
// width: 160rpx;
// height: 60rpx;
padding: 4rpx 8rpx;
background: #F0F0F0;
border-radius: 6rpx 6rpx 6rpx 6rpx;
border: 1rpx solid #F0F0F0;
font-weight: 500;
font-size: 32rpx;
color: #3D3D3D;
image {
position: absolute;
right: 0;
bottom: 0;
width: 34rpx;
height: 34rpx;
}
}
.act {
background: #DCEDFF;
border: 1rpx solid #4297F3;
color: #4297F3;
}
}
.tit {
width: 100%;
text-align: center;
font-weight: 600;
font-size: 36rpx;
color: #3D3D3D;
}
.btn {
margin-top: 60rpx;
display: flex;
align-items: center;
justify-content: center;
width: 552rpx;
height: 88rpx;
background: #4C97E7;
border-radius: 10rpx 10rpx 10rpx 10rpx;
font-weight: 600;
font-size: 36rpx;
color: #FFFFFF;
}
}
.btn_box {
position: fixed;
width: 750rpx;
bottom: 50rpx;
display: flex;
flex-wrap: nowrap;
align-content: center;
justify-content: center;
z-index: 100;
padding: 0 20rpx;
.btn1 {
margin-right: 52rpx;
display: flex;
flex-wrap: nowrap;
align-items: center;
justify-content: center;
background: #f8f8f8;
font-weight: 500;
width: 282rpx;
height: 96rpx;
border-radius: 30rpx 30rpx 30rpx 30rpx;
border: 2rpx solid #3D3D3D;
font-size: 36rpx;
color: #3D3D3D;
}
.btn2 {
display: flex;
flex-wrap: nowrap;
align-items: center;
justify-content: center;
font-weight: 500;
font-size: 40rpx;
color: #FFFFFF;
width: 418rpx;
height: 96rpx;
background: #4C97E7;
border-radius: 30rpx 30rpx 30rpx 30rpx;
}
}
.card {
padding: 0 24rpx;
margin: 0 auto;
margin-top: 24rpx;
width: 702rpx;
background: #FFFFFF;
box-shadow: 0rpx 4rpx 22rpx 0rpx rgba(0, 0, 0, 0.07);
border-radius: 10rpx 10rpx 10rpx 10rpx;
.biaoti {
font-size: 32rpx;
font-weight: 600;
padding-top: 30rpx;
box-sizing: border-box;
color: #4C97E7;
}
.card_li:last-child {
// border-bottom: 1rpx solid #fff;
}
.tips {
width: 100%;
// text-align: right;
font-weight: 400;
font-size: 22rpx;
color: #999;
}
.card_li {
width: 100%;
padding-top: 24rpx;
display: flex;
flex-wrap: wrap;
// align-content: center;
// justify-content: space-between;
// border-bottom: 1rpx solid #D8D8D8;
padding-bottom: 18rpx;
.rule {
display: flex;
flex-wrap: wrap;
align-items: center;
font-weight: 400;
font-size: 30rpx;
color: #3D3D3D;
.input {
margin-left: 6rpx;
margin-right: 6rpx;
padding: 6rpx;
border: 1rpx solid #ccc;
border-radius: 20rpx;
width: 250rpx;
}
.btns1 {
margin-left: auto;
padding: 10rpx 20rpx;
background: #DCEDFF;
border-radius: 6rpx 6rpx 6rpx 6rpx;
font-weight: 400;
font-size: 30rpx;
color: #4297F3;
}
.btns2 {
margin-left: auto;
padding: 10rpx 20rpx;
background: #FFDBDB;
border-radius: 6rpx 6rpx 6rpx 6rpx;
font-weight: 400;
font-size: 30rpx;
color: #FF1C1C;
}
}
.tops {
width: 100%;
display: flex;
flex-wrap: nowrap;
align-items: center;
.card_left {
font-weight: 400;
font-size: 30rpx;
color: #333;
font-weight: 600;
}
.card_right {
margin-left: auto;
display: flex;
flex-wrap: nowrap;
align-items: center;
color: #000;
span {
font-weight: 400;
font-size: 30rpx;
color: #000;
}
.input {
height: 60rpx;
line-height: 60rpx;
box-sizing: border-box;
margin-right: 10rpx;
border: 1rpx solid #ccc;
border-radius: 20rpx;
width: 400rpx;
text-align: center;
}
}
}
}
}
}
.guide-video-upload {
width: 100%;
min-height: 280rpx;
background: #F4F5F7;
border: 2rpx dashed #C7CDD3;
border-radius: 16rpx;
display: flex;
align-items: center;
justify-content: center;
box-sizing: border-box;
}
.guide-video-placeholder {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
min-height: 280rpx;
}
.guide-video-plus {
font-size: 80rpx;
color: #C7CDD3;
line-height: 1;
}
.guide-video-preview {
width: 100%;
padding: 20rpx;
box-sizing: border-box;
position: relative;
}
.guide-video-preview-video {
width: 100%;
height: 300rpx;
border-radius: 12rpx;
background: #000;
}
.guide-video-remove {
margin-top: 16rpx;
text-align: center;
font-size: 28rpx;
color: #FF4444;
}
</style>