2020-06-04 html的webp图片格式 + css的浮动问题 + js 输入框input的校验 + 晋升体系

# 2020-06-04 题目来源:http://www.h-camel.com/index.html

# [html] webp与jpg、png比较,它有什么优劣势?如何选择?
    webp是一种新兴的图片格式,优势体现在它具有更优的图像数据压缩算法,能带来更小的图片体积,而且拥有肉眼识别无差异的图像质量;
    同时具备了无损和有损的压缩模式、Alpha 透明以及动画的特性,在 JPEG 和 PNG 上的转化效果都非常优秀、稳定和统一。
    webp的优点:
    1. 同等质量但是图片更小
    2. 压缩后质量无明显变化
    3. 完美支持无损图像
 
    webp的缺点:
    1. 相比于jpg 编码速度慢10倍,解码速度慢1.5倍,但是由于文件体积的减少,加载速度会变快,渲染速度也变快了。
    2. 支持性上面,目前桌面浏览器chrome和opera浏览器,手机支持原生android和android系统上的chrome浏览器。
    3. 目前不被任何操作系统原生支持。
    
    webp应用:
    1. 浏览器场景
    javascript能力检测,对支持webp的用户输出webp图片
    使用webp支持插件
    2. app场景
    3. 后台场景(Webp的转换)

# [css] 父元素下有子元素,子元素也有高度但父元素的高度为何为0呢?分析下可能出现的原因及解决方法
      
      1. 父级无高度,子级自适应(经过测试,这种方式父级还是存在有高度值)
       .container {
           position: relative;
           height: 0;
           padding-top: 20%; /* reason */
           background-color: rosybrown;
           border: 1px solid skyblue;
       }
       .subDiv {
           position: absolute;
           width: 50%;
           height: 100%;
           top: 0;
           background-color: rebeccapurple;
       } 

     <div class="container">
         <div class="subDiv"></div>
     </div>

    2. 浮动原因 父级div的属性样式不会生效,原因就是子级元素设置为浮动,父级元素并没清除浮动
      <div style="width:300px;background:#ccc;">
        <div style="width:100px;height:100px;float:left;background:Green;"></div>
        <div style="width:100px;height:100px;float:right;background:Red;"></div>
      </div>

      https://blog.youkuaiyun.com/qq_15096707/article/details/50493998 这里讲的很详细
# [js] 写一个方法,实时验证input输入的值是否满足金额如:3.56(最多只有两位小数且只能数字和小数点)的格式,其它特殊字符禁止输入
    $("#price").on('input  propertychange', function () {
        //如果输入非数字,则替换为''
        this.value = this.value.replace(/[^\d\.]/g, '');
        //必须保证第一个为数字而不是.     
        this.value = this.value.replace(/^\./g, '');
        //保证只有出现一个.而没有多个.     
        this.value = this.value.replace(/\.{2,}/g, '.');
        //保证.只出现一次,而不能出现两次以上     
        this.value = this.value.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
        //只能输入两位小数
        this.value = this.value.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3');
   })
 
    这里说的很清楚:https://blog.youkuaiyun.com/wl_Honest/article/details/81629026
        

# [软技能] 晋升体系何为
    when u say nothing at all
    虽然存在,但也只是摆着当样子,就和协同工具一样,成事在人。

将下面的代码页面中的商品的table表换行向左紧靠商品信息文字:<template> <div class="container"> <el-tabs type="border-card"> <el-tab-pane :label="title"> <el-form ref="form" :model="form" :rules="rules" label-width="120px"> <el-form-item label="介绍图片:" prop="cover"> <div style="display: flex;"> <div class="flex-row"> <el-upload class="avatar-uploader" action :http-request="selectPicUpload" :show-file-list="false" :before-upload="beforeAvatarUpload" :on-change="handleAvatarChange"> <img v-if="form.cover" :src="form.cover" class="avatar"> <i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload> </div> </div> </el-form-item> <el-row> <el-col :span="12"> <el-form-item label="团购名称:" prop="name"> <el-input class="input" v-model="form.name" placeholder="请输入团购名称" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="自动截止:" prop="isAutoEnd"> <el-switch v-model="form.isAutoEnd" :active-value="true" :inactive-value="false" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="团购内容:" prop="detailInfo"> <el-input class="input" v-model="form.detailInfo" placeholder="请输入团购内容" /> <!-- <Tinymce v-model="form.detailInfo" :disabled="allDisabled"></Tinymce> --> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="开始时间:" prop="startTime"> <el-date-picker clearable v-model="form.startTime" type="datetime" default-time="12:00:00" value-format="yyyy-MM-dd HH:mm:ss" placeholder="请选择活动开始时间"> </el-date-picker> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="截止时间:" prop="endTime"> <el-date-picker clearable v-model="form.endTime" type="datetime" default-time="12:00:00" value-format="yyyy-MM-dd HH:mm:ss" placeholder="请选择活动截止时间"> </el-date-picker> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="最大接龙人数" prop="maxJoinNum"> <el-input class="input" v-model="form.maxJoinNum" placeholder="请输入" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="最小成交金额" prop="minAmount"> <el-input class="input" v-model="form.minAmount" placeholder="请输入" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="提货地址:" prop="addressIds"> <el-select v-model="form.addressIds" filterable placeholder="请选择" multiple> <el-option v-for="item in addressoptions" :key="item.id" :label="item.addressName" :value="item.id"> </el-option> </el-select> </el-form-item> </el-col> </el-row> <el-form-item label="其它信息:"> <el-checkbox-group v-model="form.selectedItemsOther"> <el-checkbox label="isGetRealName">真实姓名</el-checkbox> <el-checkbox label="isGetPhone">手机号码</el-checkbox> </el-checkbox-group> </el-form-item> <el-form-item label="功能选择:"> <el-checkbox-group v-model="form.selectedItemsFunction"> <el-checkbox label="isHideList">发布最新接龙列表</el-checkbox> <el-checkbox label="isHideOrderAmount">接龙金额仅创建人可见</el-checkbox> <el-checkbox label="canCancel">禁止用户取消订单</el-checkbox> </el-checkbox-group> </el-form-item> <div> <el-form-item label="商品信息:" prop="shopmessage"> <br/> <el-table :data="form.products" @selection-change="handleSelectionChange"> <el-table-column type="selection" width="55" align="center" /> <el-table-column label="商品名称" align="center" prop="product.name"> <template slot-scope="{row,$index}"> <el-input v-model="row.name" placeholder="请输入名称"></el-input> </template>" </el-table-column> <el-table-column label="商品价格" align="center" prop="products.price"> <template slot-scope="{row,$index}"> <el-input v-model="row.price" placeholder="请输入名称"></el-input> </template>" </el-table-column> <el-table-column label="商品数量" align="center" prop="products.soldNum"> <template slot-scope="{row,$index}"> <el-input v-model="row.soldNum" placeholder="请输入名称"></el-input> </template> </el-table-column> <el-table-column label="每单限制购买量" align="center" prop="products.limitNum" width="180"> <template slot-scope="{row,$index}"> <el-input v-model="row.limitNum" placeholder="请输入名称"></el-input> </template> </el-table-column> <el-table-column label="商品图片" align="center" prop="image" width="100"> <template slot-scope="{row,$index}"> <el-upload class="avatar-uploader" action :http-request="(fileObj) => selectProductUpload(fileObj, $index)" :show-file-list="false" :before-upload="beforeAvatarUpload"> <img v-if="row.image" :src="row.image" class="avatar"> <i v-else class="el-icon-plus avatar-uploader-icon"></i> </el-upload> </template> </el-table-column> <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> <template slot-scope="scope"> <!-- <el-button size="mini" type="text" v-if="scope.row.status != &#39;4&#39;" icon="el-icon-edit" @click="openApproval(scope.row)" v-hasPermi="[&#39;solitaire:list:order&#39;]">添加 </el-button > --> <el-button @click="addproduct()"> 添加</el-button> <el-button type="danger" icon="el-icon-delete" @click="removeRow($index)">删除</el-button> </template> </el-table-column> </el-table> </el-form-item> </div> </el-form> <!-- 修改/新增 --> <div class="dialog-footer"> <el-button type="primary" @click="submitForm">确 定</el-button> <el-button @click="handleBack">取 消</el-button> </div> </el-tab-pane> </el-tabs> </div> </template> <script> import { imgUrl } from &#39;@/utils/request&#39; import { getISOTime, checkLongitudeValidator, checkPointIsNumber } from &#39;@/utils/parsing&#39; import { checkPhone } from &#39;@/utils/validate&#39; import mapView from &#39;@/components/MapContainer/index.vue&#39; import { addGroupShop, editGroupBuy, getGroupBuyAddressPage, getGroupBuyDetail } from &#39;@/api/solitaire/solitaire&#39; import { uploadPic } from &#39;@/api/activity/activity&#39; import { onMounted, beforeDestroy } from &#39;vue&#39; import { reset } from &#39;echarts/lib/visual/seriesColor&#39; export default { components: { mapView }, onMounted() { }, data() { return { addressoptions: [], addressList: [], currentTime: new Date().toLocaleTimeString(), timer: null, // 第一个复选框组绑定值 // 第二个复选框组绑定值 selectedItemsFunction: [], checkList: [&#39;选中且禁用&#39;, &#39;复选框 A&#39;], checked: true, // 单个复选框的绑定 dataList: [], title: "新增接龙", // 封面图片 selectImgUrl: &#39;&#39;, queryParams: {}, currentImgIndex: 0, // 封面图片类型选择 imgDialogVisible: false, // 表单数据 form: { selectedItemsOther: [], selectedItemsFunction: [], ids: null, // addressIds: [&#39;1&#39;], addressIds: [], canCancel: 0, cover: &#39;&#39;, detailInfo: null, endTime: null, id: 0, isAutoEnd: 0, isHideList: false, isHideOrderAmount: false, isJoin: 0, maxJoinNum: 0, minAmount: 0, name: "", products: [ { id: 0, image: imgUrl, limitNum: 0, name: "", parentId: 0, price: 0, soldNum: 0, totalNum: 0 } ], realEndTime: "", startTime: "", status: 0, }, // 表单校验 rules: { cover: [ { required: true, message: &#39;请选择活动图片&#39;, trigger: [&#39;change&#39;, &#39;blur&#39;] } ], name: [ { required: true, message: &#39;请输入团购名称&#39;, trigger: &#39;change&#39; } ], othermessage: [ { type: &#39;array&#39;, required: true, message: &#39;请选择其它信息&#39;, trigger: &#39;change&#39; } ], selectability: [ { type: &#39;array&#39;, required: true, message: &#39;请选择功能&#39;, trigger: &#39;change&#39; }, ], shopmessage: [ { type: &#39;array&#39;, required: true, message: &#39;请输入商品信息&#39;, trigger: &#39;change&#39; }, ], detailInfo: [ { required: true, message: &#39;请输入团购内容&#39;, trigger: &#39;change&#39; } ], maxJoinNum: [ { required: true, message: &#39;最大人数不能为空&#39;, trigger: &#39;change&#39; } ], minAmount: [ { required: true, message: &#39;最小成交金额不能为空&#39;, trigger: &#39;change&#39; } ], endTime: [ { required: true, message: &#39;结束时间必须选择&#39;, trigger: &#39;change&#39; } ], startTime: [ { required: true, message: &#39;开始时间不能为空&#39;, trigger: &#39;change&#39; } ], description: [ { required: true, message: &#39;活动开始内容不能为空&#39;, trigger: &#39;change&#39; } ], address: [ { required: true, message: &#39;地点不能为空&#39;, trigger: &#39;change&#39; } ], conditionRequire: [ { required: true, message: &#39;请输入条件说明&#39;, trigger: &#39;change&#39; } ], // signStartDatetime: [ // { required: true, message: &#39;报名开始时间必须选择&#39;, trigger: &#39;change&#39; } // ], signEndDatetime: [ { required: true, message: &#39;活动截止时间必须选择&#39;, trigger: &#39;change&#39; } ], jobUserVOLists: [ { type: &#39;array&#39;, required: true, message: &#39;请添加岗位需求&#39;, trigger: &#39;change&#39; } ], &#39;organizer[0].name&#39;: [ { required: true, message: &#39;请添加活动主办方姓名&#39;, trigger: &#39;change&#39; } ], &#39;organizer[0].linkmanName&#39;: [ { required: true, message: &#39;请添加活动负责人联系人&#39;, trigger: &#39;change&#39; } ], &#39;organizer[0].phone&#39;: [ { required: true, message: &#39;请添加活动负责人电话&#39;, trigger: &#39;change&#39; }, { validator: checkPhone, trigger: &#39;blur&#39; } ] }, // 图片前缀 cover: imgUrl, // //分页 column: { pageSize: null, pageNum: null }, // 队伍列表 // 岗位表单校验 jobRules: { jobName: [ { required: true, message: &#39;请输入岗位名称&#39;, trigger: &#39;change&#39; } ], jobCount: [ { required: true, message: &#39;请输入岗位人数&#39;, trigger: &#39;change&#39; } ], workHour: [ { required: true, message: &#39;请输入工时&#39;, trigger: &#39;change&#39; } ], pointPercent: [ { required: true, message: &#39;请输入积分(每人每小时)&#39;, trigger: &#39;change&#39; }, { validator: checkPointIsNumber, message: &#39;积分必须为数字&#39; } ], checkInTime: [ { required: true, message: &#39;请输入签到时间&#39;, trigger: &#39;change&#39; } ], checkOutTime: [ { required: true, message: &#39;请输入签退时间&#39;, trigger: &#39;change&#39; } ], checkLocation: [ { required: true, message: &#39;请选择签到地点&#39;, trigger: &#39;change&#39; } ] }, } }, created() { this.getAddressList() this.queryParams = this.$route.query; console.log(this.queryParams.id, &#39;888&#39;) if (this.queryParams.id) { // 编辑 this.title = &#39;修改接龙&#39; getGroupBuyDetail(this.queryParams.id).then(res => { const boolConvert = val => val === 1; console.log(res, &#39;---&#39;) const { cover, id } = res; console.log(res.isGetRealName) this.form = { ...res, isAutoEnd: res.isAutoEnd = 1 ? true : false, id, cover, addressIds: [], selectedItemsOther: [], selectedItemsFunction: [], } if (res.isGetRealName === 1) { this.form.selectedItemsOther.push(&#39;isGetRealName&#39;) } if (res.isGetPhone === 1) { this.form.selectedItemsOther.push(&#39;isGetPhone&#39;) } if (res.isHideList === 1) { this.form.selectedItemsFunction.push(&#39;isHideList&#39;) } if (res.isHideOrderAmount === 1) { this.form.selectedItemsFunction.push(&#39;isHideOrderAmount&#39;) } if (res.canCancel === 1) { this.form.selectedItemsFunction.push(&#39;canCancel&#39;) } }) } }, methods: { onMounted() { }, getAddressList() { getGroupBuyAddressPage().then(res => { this.addressoptions = res.pageData }) }, beforeDestroy() { clearInterval(this.timer); }, removeRow(index) { if (this.form.products.length > 1) { this.form.products.splice(index, 1); } else { this.$message.warning(&#39;至少保留一行数据&#39;); } }, addproduct() { this.form.products.push({ id: &#39;&#39;, image: &#39;&#39;, limitNum: &#39;&#39;, name: "", parentId: &#39;&#39;, price: &#39;&#39;, soldNum: &#39;&#39;, totalNum: &#39;&#39; }) }, handleProductAvatarChange(file) { if (!file || !file.raw) return; const reader = new FileReader(); reader.onload = (e) => { const img = new Image(); img.onload = () => { // 限制最大尺寸(合理值:800×600) const MAX_SIZE = 800; let width = img.width; let height = img.height; // 按比例缩放到最大尺寸 if (width > MAX_SIZE || height > MAX_SIZE) { const scale = Math.min(MAX_SIZE / width, MAX_SIZE / height); width *= scale; height *= scale; } // 画布压缩处理 const canvas = document.createElement(&#39;canvas&#39;); const ctx = canvas.getContext(&#39;2d&#39;); canvas.width = width; canvas.height = height; ctx.drawImage(img, 0, 0, width, height); // 关键优化:降低质量并生成更短Data URL this.form.products.image = canvas.toDataURL(file.type, 0.01); // 压缩质量65% }; img.src = e.target.result; }; reader.readAsDataURL(file.raw); }, handleAvatarChange(file) { if (!file || !file.raw) return; const reader = new FileReader(); reader.onload = (e) => { const img = new Image(); img.onload = () => { // 限制最大尺寸(合理值:800×600) const MAX_SIZE = 800; let width = img.width; let height = img.height; // 按比例缩放到最大尺寸 if (width > MAX_SIZE || height > MAX_SIZE) { const scale = Math.min(MAX_SIZE / width, MAX_SIZE / height); width *= scale; height *= scale; } // 画布压缩处理 const canvas = document.createElement(&#39;canvas&#39;); const ctx = canvas.getContext(&#39;2d&#39;); canvas.width = width; canvas.height = height; ctx.drawImage(img, 0, 0, width, height); // 关键优化:降低质量并生成更短Data URL this.form.cover = canvas.toDataURL(file.type, 0.01); // 压缩质量65% }; img.src = e.target.result; }; reader.readAsDataURL(file.raw); }, beforeAvatarUpload(file) { const validTypes = [&#39;image/jpeg&#39;, &#39;image/png&#39;, &#39;image/webp&#39;]; // 移除GIF减小潜在数据量 const MAX_SIZE_MB = 1.2; // 更严格的大小限制 const isImage = validTypes.includes(file.type); const isSizeValid = file.size / 1024 / 1024 < MAX_SIZE_MB; if (!isImage) { this.$message.error(&#39;仅支持 JPG/PNG/WEBP 格式&#39;); return false; } if (!isSizeValid) { this.$message.error(`图片大小不能超过 ${MAX_SIZE_MB}MB`); return false; } return true; }, // updateOtherInfo() { // this.form.isGetRealName = this.selectedItemsOther.includes(&#39;真实姓名&#39;); // this.form.isGetPhone = this.selectedItemsOther.includes(&#39;手机号码&#39;); // }, // 更新"功能选择"表单值 updateFunctionSelection() { this.form.isHideList = this.selectedItemsFunction.includes(&#39;发布最新接龙列表&#39;); this.form.isHideOrderAmount = this.selectedItemsFunction.includes(&#39;接龙金额仅创建人可见&#39;); // "禁止用户取消订单"需要特殊处理:选中时canCancel=false this.form.canCancel = !this.selectedItemsFunction.includes(&#39;禁止用户取消订单&#39;); }, // 获取活动详情 // getDetail(status) { // getGroupBuyDetail(this.queryParams.id, status).then(response => { // this.queryParams.id, status // this.form = response // console.log(response, &#39;789&#39;) // }) // }, // 表单重置 reset() { this.form = { addressIds: [], cover: null, canCancel: 0, ids: null, detailInfo: null, endTime: null, id: 0, isAutoEnd: 0, isGetPhone: 0, isGetRealName: 0, isHideList: 0, isHideOrderAmount: 0, isJoin: 0, maxJoinNum: 0, minAmount: 0, name: "", products: [ { id: 0, image: imgUrl, limitNum: 0, name: "", parentId: 0, price: 0, soldNum: 0, totalNum: 0 } ], realEndTime: "", startTime: "", status: 0, } }, selectPicUpload(obj) { let fd = new FormData() //参数的格式是formData格式的 fd.append(&#39;file&#39;, obj.file) //参数 uploadPic(fd, { modularName: &#39;ACTIVITY&#39; }).then(res => { this.form.cover = res }) }, selectProductUpload(obj, index) { let fd = new FormData(); fd.append(&#39;file&#39;, obj.file); uploadPic(fd, { modularName: &#39;ACTIVITY&#39; }).then(res => { // 直接更新对应索引位置的图片URL this.$set(this.form.products, index, { ...this.form.products[index], image: res }); }).catch(error => { console.error(&#39;商品图片上传失败:&#39;, error); this.$message.error(&#39;商品图片上传失败&#39;); }); }, // // 取消关闭弹窗 // closeDialog() { // this.currentImgIndex = 0 // this.selectImgUrl = &#39;&#39; // this.imgDialogVisible = false // }, // // 确认默认图片关闭弹窗 // submitPic() { // this.form.cover = this.selectImgUrl // this.imgDialogVisible = false // }, hasCommonValue(arr) { let seen = new Set(); // 用于存储已经遇到的值 for (let obj of arr) { for (let value of obj.jobUsers) { // 如果值已经存在于 set 中,返回 true if (seen.has(value.userId)) { return true; } // 将当前值加入 set seen.add(value.userId); } } return false; // 如果没有重复的值,返回 false }, /** 提交按钮 */ submitForm() { console.log(this.form.products.image, &#39;000&#39;) let newForm = { ids: this.form.ids, addressIds: this.form.addressIds, canCancel: this.form.selectedItemsFunction.includes(&#39;canCancel&#39;) ? 1 : 0, cover: this.form.cover, detailInfo: this.form.detailInfo, endTime: this.form.endTime, id: this.form.id, isAutoEnd: this.form.isAutoEnd == true ? 1 : 0, isGetPhone: this.form.selectedItemsOther.includes(&#39;isGetPhone&#39;) ? 1 : 0, isGetRealName: this.form.selectedItemsOther.includes(&#39;isGetRealName&#39;) ? 1 : 0, isHideList: this.form.selectedItemsFunction.includes(&#39;isHideList&#39;) ? 0 : 1, isHideOrderAmount: this.selectedItemsFunction.includes(&#39;isHideOrderAmount&#39;) ? 1 : 0, isJoin: this.form.isJoin, maxJoinNum: this.form.maxJoinNum, minAmount: this.form.minAmount, name: this.form.name, // 遍历数组中的每个对象 products: this.form.products.map(item => ({ id: item.id, image: item.image, limitNum: item.limitNum, name: item.name, parentId: item.parentId, price: item.price, soldNum: item.soldNum, totalNum: item.totalNum })), realEndTime: this.form.realEndTime, startTime: this.form.startTime, status: this.form.status, // 修正为this.form.status }; console.log(newForm, this.form.id) //判断每个时间段是否有岗位 // let isJobEmpty = this.form.jobUserVOLists.some(item => item.jobList.length == 0) this.$refs[&#39;form&#39;].validate(valid => { if (valid) { if (this.form.id) { editGroupBuy(newForm).then(response => { console.log(response, &#39;00&#39;) this.$modal.msgSuccess(&#39;修改成功&#39;) this.$router.back(-1) }) } else { if (this.form.name != &#39;&#39; && this.form.cover != &#39;&#39;) { addGroupShop(newForm).then(response => { console.log(response) this.$modal.msgSuccess(&#39;新增成功&#39;) this.$router.back(-1) }) } else { console.log(this.form.ids, &#39;09&#39;) this.$modal.msgError(&#39;请完善信息&#39;) } } } }) }, handleBack() { this.$router.back(-1) }, // handleSelectionChange(selection) { this.ids = selection.map(item => item.pkId) this.single = selection.length !== 1 this.multiple = !selection.length }, // 新增时间段 changeStatus() { if (this.currentTime) { this.timer = setInterval(() => { this.currentTime = new Date().toLocaleTimeString(); console.log(this.currentTime, &#39;90&#39;) }, 1000); } }, // 改变时间段的初始时间 changeStartTime(value, timeIndex) { console.log(this.form.jobUserVOLists[timeIndex].jobList) if (this.form.jobUserVOLists[timeIndex].jobList) { this.form.jobUserVOLists[timeIndex].jobList.forEach(item => { item.checkInTime = value if (item.checkOutTime && item.checkInTime) { item.workHour = getISOTime(item.checkInTime, item.checkOutTime) if (item.jobUsers) { item.jobUsers.forEach(itemson => { itemson.workHour = item.workHour itemson.point = parseInt(item.pointPercent) * item.workHour }) } } }) } }, // 改变时间段的初始时间 changeEndTime(value, timeIndex) { if (this.form.jobUserVOLists[timeIndex].jobList) { this.form.jobUserVOLists[timeIndex].jobList.forEach(item => { item.checkOutTime = value if (item.checkOutTime && item.checkInTime) { item.workHour = getISOTime(item.checkInTime, item.checkOutTime) if (item.jobUsers) { item.jobUsers.forEach(itemson => { itemson.workHour = item.workHour itemson.point = parseInt(item.pointPercent) * item.workHour }) } } }) } }, // 改变时间段的签到纬度 changeLatitude(value, timeIndex) { if (this.form.jobUserVOLists[timeIndex].jobList) { this.form.jobUserVOLists[timeIndex].jobList.forEach(item => { item.checkLatitude = value }) } }, // 改变时间段的签到经度 changeLongitude(value, timeIndex) { if (this.form.jobUserVOLists[timeIndex].jobList) { this.form.jobUserVOLists[timeIndex].jobList.forEach(item => { item.checkLongitude = value }) } }, // 跳转 toPrck() { window.open(&#39;https://lbs.amap.com/tools/picker&#39;) }, // 删除时间段 deleteTime(timeIndex) { this.$modal.confirm(&#39;是否确认该时间段?&#39;).then(function () { }).then(() => { this.form.jobUserVOLists.splice(timeIndex, 1) this.changeNumber() }).catch(() => { }) }, // 删除岗位按钮 // 活动最大人数改变 changeNumber() { this.form.maxCount = 0 this.form.jobUserVOLists.forEach(item => { item.jobList.forEach(itemson => { this.form.maxCount += itemson.jobUsers.length }) }) }, // 岗位人数改变 //岗位志愿者选择 } } </script> <style scoped> .container { background-color: #f5f5f5; padding: 1%; } .title_type { font-size: 24px; font-weight: 700; margin-bottom: 20px; } .dialog-footer { display: flex; flex-direction: row; justify-content: center; align-items: center; padding-bottom: 30px; } .avatar-uploader .el-upload { border: 1px solid #f8f3f3; border-radius: 6px; cursor: pointer; position: relative; overflow: hidden; } .avatar-uploader .el-upload:hover { border-color: #409EFF; } .avatar-uploader-icon { font-size: 28px; color: #8c939d; width: 120px; height: 120px; line-height: 120px; text-align: center; } .coverImage { width: 214px; height: 129px; border-radius: 6px; cursor: pointer; } .select_mask { position: absolute; z-index: 2; background-color: rgba(127, 125, 121, 0.5); text-align: center; top: 0; bottom: 0; left: 0; right: 0; width: 214px; height: 129px; display: flex; justify-content: center; align-items: center; } .avatar { width: 214px; height: 129px; display: block; } .margin-right-10 { margin-right: 10px; } .job_box { /* border: 1px solid #ccc; */ background-color: #F8F8F8; padding: 46px 10px 10px; margin-bottom: 10px; margin-left: 50px; border-radius: 10px; } </style>
最新发布
10-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值