最近在支付宝小程序上需要一个类似飞猪酒店时间选择的功能,但是没有找到合适的组件,没有办法,只能手动造一个使用。

支付宝小程序效果图如下

组件说明:

1、当前日期之前的时间不可选

2、选择时间范围可跨月选择

在支付宝原生页面中使用

在xxx.json中引入组件

 "calendar-select":"../../components/calender-select/calender-select"

axml文件中使用


<button size="default" type="primary" onTap="selectTime">选择时间</button><calendar-selectmaxDate="2022-6-30":addOrRemoveData="{{addOrRemoveData}}"mode="range"value="{{showCalendar}}":altPrice="{{dataPrice}}"onCloseFunc="closeFunc"onTurnMsg="changeDate"></calendar-select>

js中data数据

  closeFunc(){this.setData({showCalendar:false})},selectTime(){this.setData({showCalendar:true})},changeDate(data){console.log(data,"]]]]]返回数据]]]]]]")},

调用方法

  closeFunc(){this.setData({showCalendar:false})},selectTime(){this.setData({showCalendar:true})},changeDate(data){console.log(data,"]]]]]返回数据]]]]]]")},

组件代码

components/calender-select/calender-select.axml

 <view a:if="{{value}}" class="calendar-body"><view class="title-name"   onTap="close">{{title}} <text class="iconfont icon-close-bold"></text></view><view a:if="{{mode == 'range'}}" class="range-text"><view class="left"><view class="alt">入住日期</view><view class="time"><text>{{startMonth}}月{{startDay}}日</text> {{startWeek}}</view></view><view class="right"><view class="alt">离店日期</view><view class="time"><text>{{endMonth}}月{{endDay}}日</text> {{endWeek}}</view></view></view><scroll-view   class="day-list {{ mode == 'range'?'day-range':''}}" scroll-y="true" :scroll-top="{{scrollTop}}" onScrollToLower="changeMonthHandler" style="width: 100%;height:80vh"><view class="day-item" a:for="{{listData}}" a:for-item="item" a:key="itemIndex"><view class="day-title">{{item.showTitle}}</view><view class="week-list"><view class="week-day__text" a:for="{{weekDayZh}}" a:for-item="itemZh" a:key="indexZh">{{itemZh}}</view></view><view class="content"><!-- 前置空白部分 --><block a:for="{{item.weekdayArr}}" a:for-item="itemArr" a:key="indexArr"><view  class="item" ></view></block><!-- (openDisAbled(item.year, item.month, dayIndex+1)?'day-range' : '') --><!-- ( mode== 'date' && activeDate ==`${item.year}-${item.month}-${dayIndex+1}`?'activeData':'')(mode == 'range' && startDate==`${item.year}-${item.month}-${dayIndex+1}`?'startDate':'')( mode == 'range' && openStartOrend(item.year, item.month, dayIndex+1)?'startOrend':'')( mode== 'range' && endDate==`${item.year}-${item.month}-${dayIndex+1}`?'endDate':'') --><view  a:for="{{item.daysArr}}" a:for-item="dayItem" a:key="dayItem" class="item {{item.showBoolArr[dayItem-1]==false?'gray-color':''}} {{mode == 'range' && item.showBoolArr[dayItem]=='false'?'day-range':''}}{{ mode== 'date' && activeDate ==`${item.year}-${item.month}-${dayItem}`?'activeData':''}}{{mode == 'range' && startDate==`${item.year}-${item.month}-${dayItem}`?'startDate':''}}{{ mode == 'range' &&item.newDaysBoolArr[dayItem-1] ?'startOrend':''}}{{mode== 'range' && endDate==`${item.year}-${item.month}-${dayItem}`?'endDate':''}}"data-item={{item}}data-index={{dayItem-1}}data-faItem={{item.daysArr}}data-showbool={{item.showBoolArr[dayItem-1]}}onTap="dateClick"><view class="number {{item.showBoolArr[dayItem-1]==false?'gray-color':''}}">{{ dayItem }}</view><view class="number">{{mode == 'range' && startDate==`${item.year}-${item.month}-${dayItem}`?'入住':'' }}</view><view class="number">{{mode == 'range' && endDate==`${item.year}-${item.month}-${dayItem}`?'离店':'' }}</view></view>  </view></view></scroll-view></view>

components/calender-select/calender-select.js

Component({mixins: [],data: {scrollTop: 0,datePrice: [],// 星期几,值为1-7weekday: 1, weekdayArr:[],// 当前月有多少天days: 0, daysArr:[],showTitle: '',year: 2020,month: 0,day: 0,startYear: 0,startMonth: 0,startDay: 0,startWeek: '',endYear: 0,endMonth: 0,endDay: 0,endWeek: '',today: '',activeDate: '',startDate: '',endDate: '',isStart: true,min: null,max: null,weekDayZh: ['日', '一', '二', '三', '四', '五', '六'],listData:[],startDateTime:"",//当前时间搓endDateTime:""},props: {// 通过双向绑定控制组件的弹出与收起value: false,// date-单个日期选择,range-开始日期+结束日期选择mode: 'date',// 日期选择标题title: '可预约日期查询',// 最小下单日期(不在范围内日期禁用不可选,包含当天)minDate:  '2022-01-01',// 最大下单日期(不在范围内日期禁用不可选,包含当天)maxDate: '2022-05-22',// 是否禁止周六周日 不可下单 默认不禁止isWeekend: false,// 每天显示的提示altPrice:  [{date: '2022-01-01',price: ''}],// 入住离开日期addOrRemoveData: []},didMount() {this.data.timestamp =new Date().getTime();this.init()},didUpdate(a,b) {console.log(a,"=======",b)// if(a.mode!=b.mode|| a.minDate!=b.minDate||a.maxDate!=b.maxDate){//   this.init()// }//数据发生跟新的时候,重新获取入住和离店的时间错let startDateTime = this.data.startDate.replace(/\-/g, '/');let endDateTime = this.data.endDate.replace(/\-/g, '/');this.data.startDateTime = startDateTime;this.data.endDateTime = endDateTime;},deriveDataFromProps(nextProps) {if (JSON.stringify(this.data.itemData) !== JSON.stringify(this.data.itemData)) {//业务处理this.init()}
},didUnmount() {},methods: {init() {/// 初始化日期let now = new Date();this.setData({// 初始化日期下的 文字datePrice : this.props.altPrice,year : now.getFullYear(),month : now.getMonth() + 1,day : now.getDate(),today : `${now.getFullYear()}-${now.getMonth() + 1}-${now.getDate()}`,activeDate : this.props.today,min : this.initDate(this.props.minDate),max :this.initDate(this.props.maxDate || this.props.today),startDate : "",startWeek: "",startYear : 0,startMonth : 0,startDay : 0,endYear : 0,endMonth :0,endDay : 0,endDate : "",endWeek :"",isStart : true,listData : [],selectList:[]})this.changeData();// 默认显示两个月let _this = thissetTimeout(() => {_this.changeMonthHandler(1)}, 100)setTimeout(() => {_this.changeMonthHandler(1)}, 2000);// 初始化入住离店时间if (this.props.addOrRemoveData.length > 0) {setTimeout(() => {_this.addOrRemoveChange()}, 200)}},//日期处理initDate(date) {console.log(date,"=====")let fdate = date.split('-');return {year: Number(fdate[0] || 2022),month: Number(fdate[1] || 1),day: Number(fdate[2] || 1)}},// 判断可使用日期范围openDisAbled(year, month, day) {let bool = true;let date = `${year}/${month}/${day}`;let today = this.data.today.replace(/\-/g, '/');let min = `${this.data.min.year}/${this.data.min.month}/${this.data.min.day}`;let max = `${this.data.max.year}/${this.data.max.month}/${this.data.max.day}`;let timestamp = new Date(date).getTime();console.log(min,max)if (timestamp < new Date(min).getTime() || timestamp > new Date(max).getTime()) {bool = false;my.showToast({content:"选择时间超出范围"})console.log('选择时间超出范围')}// 判断是否大于今日if (timestamp < new Date(today).getTime()) {console.log("选择时间不能小于当前时间")bool = false;}// 禁止周六周日下单if (this.isWeekend && (this.getWeekText(date) === '星期六' || this.getWeekText(date) === '星期日')) {bool = false;}return bool;},// 判断是否再选中日期范围内openStartOrend(year, month, day) {let bool = false;let date = `${year}/${month}/${day}`;let startDate = this.data.startDate.replace(/\-/g, '/');let endDate = this.data.endDate.replace(/\-/g, '/');let timestamp = new Date(date).getTime();if (timestamp > new Date(startDate).getTime() && timestamp < new Date(endDate).getTime()) {bool = true}return bool},// 显示日期下的文字提示viewDayAlt(year, month, day) {console.log("显示日期下的文字提示")let txt = ''let item = this.data.datePrice.find(item => {let today = item.date.replace(/\-/g, '/');let date = `${year}/${month}/${day}`;return new Date(date).getTime() === new Date(today).getTime()})if (item) {return Number.isFinite(item.price) ? '¥' + item.price : item.price} },generateArray(start, end) {return Array.from(new Array(end + 1).keys()).slice(start);},formatNum(num) {return num < 10 ? '0' + num : num + '';},//一个月有多少天getMonthDay(year, month) {let days = new Date(year, month, 0).getDate();return days;},getWeekday(year, month) {let date = new Date(`${year}/${month}/01 00:00:00`);return date.getDay();},checkRange(year) {let overstep = false;if (year < this.minYear || year > this.maxYear) {uni.showToast({title: "日期超出范围啦~",icon: 'none'})overstep = true;}return overstep;},//scorllview触底changeMonthHandler(isAdd) {console.log(isAdd,"isAddisAddisAdd")if (isAdd) {// 根据日期限制显示if (this.data.year >= this.data.max.year && this.data.month >= this.data.max.month) {console.log(false)return false}let month = this.data.month + 1;let year = month > 12 ? this.data.year + 1 : this.data.year;if (!this.checkRange(year)) {console.log("checkRangecheckRange")this.data.month = month > 12 ? 1 : month;this.data.year = year;this.changeData();}} else {let month = this.month - 1;let year = month < 1 ? this.year - 1 : this.year;if (!this.checkRange(year)) {console.log("checkRangecheckRangeerrrrrr")this.data.month = month < 1 ? 12 : month;this.data.year = year;this.changeData();}}},changeYearHandler(isAdd) {let year = isAdd ? this.year + 1 : this.year - 1;if (!this.checkRange(year)) {this.data.year = year;this.changeData();}},changeData() {this.data.days = this.getMonthDay(this.data.year, this.data.month);this.data.daysArr=this.generateArray(1,this.data.days)this.data.weekday = this.getWeekday(this.data.year, this.data.month);this.data.weekdayArr=this.generateArray(1,this.data.weekday)this.data.showTitle = `${this.data.year}年${this.data.month}月`;if (this.data.isChange && this.data.mode == 'date') {this.btnFix(true);}this.setDayText()},// 处理插入数据时间列表setDayText() {console.log("插入数==",this.data.listData)let daysArr = this.data.daysArr;let year = this.data.year;let month = this.data.month;let newDaysBoolArr = [];//控制颜色let showBoolArr = [];//控制是否可点击daysArr.map(item=>{let day = item>9?item:"0"+item;showBoolArr.push(this.openDisAbledBool(year,month,day))newDaysBoolArr.push(false)})let listData = this.data.listData;listData.push({year: this.data.year,month: this.data.month,weekdayArr: this.data.weekdayArr,daysArr: this.data.daysArr,showTitle: this.data.showTitle,newDaysBoolArr:newDaysBoolArr,showBoolArr:showBoolArr})this.setData({listData})},//判断日期是否为不可点击openDisAbledBool(year, month, day) {let bool = true;let date = `${year}/${month}/${day}`;let timestamp = new Date(date).getTime();let today = this.data.today.replace(/\-/g, '/');if (timestamp < new Date(today).getTime()) {bool = false;}return bool;},// 处理初始化入住离店时间addOrRemoveChange() {let _this = thisthis.addOrRemoveData.forEach((item, index) => {let data = item.replace(/\-/g, '/')let now = new Date(data);let year = now.getFullYear();let month = now.getMonth() + 1;let day = now.getDate() - 1;if (index === 0) {this.dateClick({year: year, month: month }, day)} else {setTimeout(() => {_this.dateClick({year: year, month: month }, day)}, 300)}})},// 选择日期操作dateClick(evt) {let {item,index:day,showbool} = evt.target.dataset;let listData = this.data.listData;if(!showbool) return false;// item, dayday += 1;if (this.openDisAbled(item.year, item.month, day)) {this.data.day = day;let date = `${item.year}-${item.month}-${day}`;if (this.data.mode == 'date') {console.log("只选择一个时间")this.data.activeDate = date;this.btnFix(true)} else {console.log("选择开始和离店2个时间")let compare = new Date(date.replace(/\-/g, '/')).getTime() < new Date(this.data.startDate.replace(/\-/g, '/')).getTime()if (this.data.isStart || compare) {console.log("选择开始时间")this.setData({startDate:date,listData,startYear:item.year,startMonth:item.month,startDay:day,endYear:0,endMonth:0,endDay:0,endDate:"",activeDate:"",startWeek:this.getWeekText(date),isStart:false,datePrice:[{ date: date,price: '入住'}]})//删除选择区域this.resetListData(listData,2)} else {console.log("选择离店时间")this.setData({endDate:date,endYear:item.year,endMonth:item.month,endDay:day,endWeek:this.getWeekText(date),isStart:true,datePrice:this.data.datePrice.push({date: date,price: '离开'})})//设置选择区域this.resetListData(listData,1)//是否手动关闭时间组件并返回数据this.btnFix(true)}}}},//设置选择区域颜色resetListData(listData,type){listData.forEach((firstItem,firstIndex)=>{if(type==2){firstItem.newDaysBoolArr.forEach((subItem,subindex)=>{listData[firstIndex].newDaysBoolArr[subindex]=false;})}else{firstItem.daysArr.forEach((subItem,subindex)=>{if(this.openStartOrend(firstItem.year,firstItem.month,subItem)){listData[firstIndex].newDaysBoolArr[subindex]=true;}})}})console.log(listData)this.setData({listData:listData})},close() {this.data.scrollTop = 0// 修改绑定的父组件变量的值为false,从而隐藏日历弹窗this.props.onCloseFunc(false);},getWeekText(date) {date = new Date(`${date.replace(/\-/g, '/')} 00:00:00`);let week = date.getDay();return '星期' + ['日', '一', '二', '三', '四', '五', '六'][week];},btnFix(show) {if (!show) {this.close();}if (this.data.mode == 'date') {let arr = this.data.activeDate.split('-')let year = this.data.isChange ? this.data.year : Number(arr[0]);let month = this.data.isChange ? this.data.month : Number(arr[1]);let day = this.data.isChange ? this.data.day : Number(arr[2]);//当前月有多少天let days = this.getMonthDay(year, month);let result = `${year}-${this.formatNum(month)}-${this.formatNum(day)}`;let weekText = this.getWeekText(result);let isToday = false;if (`${year}-${month}-${day}` == this.data.today) {//今天isToday = true;}this.props.onTurnMsg({year: year,month: month,day: day,days: days,activeDate: this.data.activeDate,result: result,week: weekText,isToday: isToday});} else {if (!this.data.startDate || !this.data.endDate) return;let startMonth = this.formatNum(this.data.startMonth);let startDay = this.formatNum(this.data.startDay);let startDate = `${this.data.startYear}-${startMonth}-${startDay}`;let startWeek = this.getWeekText(startDate)let endMonth = this.formatNum(this.data.endMonth);let endDay = this.formatNum(this.data.endDay);let endDate = `${this.data.endYear}-${endMonth}-${endDay}`;let endWeek = this.getWeekText(endDate);this.props.onTurnMsg({startYear: this.data.startYear,startMonth: this.data.startMonth,startDay: this.data.startDay,startDate: startDate,startWeek: startWeek,endYear: this.data.endYear,endMonth: this.data.endMonth,endDay: this.data.endDay,endDate: endDate,endWeek: endWeek})}}},
});

components/calender-select/calender-select.acss

.calendar-body {position: fixed;top: 0;left: 0;bottom: 0;right: 0;overflow: hidden;background-color: #fafafa;-webkit-animation: fadelogIn-data-v-7570169f 0.4s;animation: fadelogIn-data-v-7570169f 0.4s;z-index: 9;
}
.calendar-body .title-name {font-size: 36rpx;font-weight: 500;line-height: 48rpx;display: flex;align-items: center;justify-content: center;position: relative;padding: 24rpx;background-color: #fafafa;
}
.calendar-body .title-name .icon-close-bold {position: absolute;top: 24rpx;right: 24rpx;width: 40rpx;height: 40rpx;font-size: 40rpx;color: #999;
}
.calendar-body .range-text {display: flex;align-items: center;justify-content: space-between;padding: 0 24rpx;
}
.calendar-body .range-text .alt {font-size: 24rpx;color: #303030;
}
.calendar-body .range-text .time {font-size: 24rpx;color: #666;
}
.calendar-body .range-text .time text {font-size: 36rpx;color: #000;
}
.calendar-body .range-text .right {text-align: right;
}
.calendar-body .day-list {padding: 24rpx;height: calc(100vh - 100rpx);box-sizing: border-box;
}
.calendar-body .day-list .day-item {background: #fff;border-radius: 16rpx;margin-bottom: 24rpx;
}
.calendar-body .day-list .day-title {font-size: 30rpx;font-weight: 500;color: #000;text-align: center;padding: 30rpx 0;
}
.calendar-body .day-list .week-list {display: flex;border-bottom: 1rpx solid #f0f0f0;padding: 24rpx;
}
.calendar-body .day-list .week-list .week-day__text {flex: 1;text-align: center;font-size: 24rpx;color: #000;width: 14.28%;
}
.calendar-body .day-list .week-list .week-day__text :last-child {color: #ed7444;
}
.calendar-body .day-list .week-list .week-day__text :first-child {color: #ed7444;
}
.calendar-body .day-list .content {display: flex;flex-wrap: wrap;padding: 24rpx;
}
.calendar-body .day-list .content .item {width: 14.28%;height: 90rpx;border-radius: 8rpx;display: flex;align-items: center;justify-content: center;flex-direction: column;margin-bottom: 24rpx;
}
.calendar-body .day-list .content .item .number {font-size: 24rpx;color: #000;
}
.calendar-body .day-list .content .item .dec {font-size: 24rpx;font-weight: 700;color: #ed7444;min-height: 30rpx;opacity: 0;
}
.calendar-body .day-list .content .hoverData .number {color: #333;
}
.calendar-body .day-list .content .hoverData .dec {opacity: 1;
}
.calendar-body .day-list .content .activeData {background: #96292f;border-radius: 8rpx;
}
.calendar-body .day-list .content .activeData .number {color: #fff;
}
.calendar-body .day-list .content .activeData .dec {color: #fff;
}
.calendar-body .day-list .content .startDate {background: #96292f;border-radius: 8rpx;border-top-right-radius: 0;border-bottom-right-radius: 0;
}
.calendar-body .day-list .content .startDate .number {color: #fff;
}
.calendar-body .day-list .content .startDate .dec {color: #fff;
}
.calendar-body .day-list .content .endDate {background: #96292f;border-radius: 8rpx;border-top-left-radius: 0;border-bottom-left-radius: 0;
}
.calendar-body .day-list .content .endDate .number {color: #fff;
}
.calendar-body .day-list .content .endDate .dec {color: #fff;
}
.calendar-body .day-list .content .startOrend {background-color: #f4eaeb;border-radius: 0;
}
.calendar-body .day-range {height: calc(100vh - 180rpx);
}
@-webkit-keyframes fadelogIn-data-v-7570169f {0% {-webkit-transform: translate3d(0, 100%, 0);transform: translate3d(0, 100%, 0);}100% {-webkit-transform: none;transform: none;}
}
@keyframes fadelogIn-data-v-7570169f {0% {-webkit-transform: translate3d(0, 100%, 0);transform: translate3d(0, 100%, 0);}100% {-webkit-transform: none;transform: none;}
}.calendar-body .day-list .content .item .gray-color {color: #999;
}

借鉴uni-app插件

同程艺龙-多模式日历插件(开箱即用) - DCloud 插件市场 普通日历选择、酒店入住离开、飞机往返三种模式,可自定义主题色。(代码已精简优化,插件包仅5KB)https://ext.dcloud.net.cn/plugin?id=472 飞猪同款时间范围选择器 - DCloud 插件市场 仿照飞猪的选择进行改良过的酒店日期选择插件https://ext.dcloud.net.cn/plugin?id=6349

uni-app中的组件,只能打包支付宝小程序后可以直接使用,但是在支付宝原生小程序中,不能直接引入使用。

如在使用中出现问题,欢迎大家一起讨论哦~~~~

如在使用中出现问题,欢迎大家一起讨论哦~~~~

如在使用中出现问题,欢迎大家一起讨论哦~~~~

支付宝原生组件(酒店时间选择)相关推荐

  1. h5支付不能打开支付宝 ios_iOS实现H5支付(微信、支付宝)原生封装

    前言 支付分APP支付.H5支付.扫码支付等.app支付一般在app中使用,并且需要集成相应的支付SDK,H5支付多用于网页.如果你的APP不想集成支付SDK,又想实现支付功能,你可以在项目中使用H5 ...

  2. 微信小程序原生组件swiper在mpvue工程中使用注意事项

    时下微信小程序开发框架中mpvue是主流的选择之一.其中,免不了还要使用部分小程序原生的组件.swiper组件几乎成为典型小程序界面的必备组成组件之一.但是,我在试用中遇到一个典型问题,很多相关网页中 ...

  3. 微信小程序中WebView中原生组件限制问题解析

    背景 在微信的文档中有一个章节说明了『 原生组件的使用限制 』有这么一段话 『由于原生组件脱离在 WebView 渲染流程外,因此在使用时有以下限制:原生组件的层级是最高的,所以页面中的其他组件无论设 ...

  4. ReactNative 踩坑之 iOS 原生组件

    iOS 中Undefined symbols for architecture x86_64 在原生 iOS 开发中,这个错误信息,应该或多或少的会碰到过: Undefined symbols for ...

  5. uniapp引入支付宝原生扫码插件步骤详解

    1.插件市场导入插件 支付宝原生扫码插件地址 点击购买(0元)云打包 选择需要导入的项目 选择安卓版本默认以uni-app应用标识 生成的包名 2.阿里云操作 开通阿里云 mPaaS 地址 创建一个应 ...

  6. RN 封装 Android原生组件

    RN 封装 Android原生组件 背景 当在React Native暂时未提供部分原生功能或者模块,我们需要复用部分原生代码时,比如复用一个原生方法,此时就需要将原生方法进行封装,暴露出一个接口来让 ...

  7. 使用支付宝原生插件(hbuilderX)

    uniapp自有的uni.scanCode,在安卓8,9,10版本的时候,会出现黑屏的情况,所以使用支付宝原生插件替换此软件. uni.scanCode({onlyFromCamera: true, ...

  8. 前端笔记:使用Web Components进行原生组件化开发

    文章目录 目的 基础说明 技术点介绍 Custom elements Shadow DOM HTML templates 整合成独立组件文件 示例演示与说明 示例一 示例二 es6-string-ht ...

  9. 002 第一季SpringBoot2核心技术-核心功能:配置文件、Web开发(原生组件)、数据访问、单元测试、指标监控、原理解析:@Value、命令行参数、手动获取bean、自定义starter

    三.核心技术之- ->核心功能 1. 配置文件 1.1 文件类型 1.1.1 properties 同以前的properties用法 优先级高于yml的方式. 1.1.2 yaml 1) 简介 ...

最新文章

  1. 万字长文从 0 详解 Istio
  2. Synergy 一套键鼠同时控制多台电脑的神器
  3. java派生类_我可以使派生类从Java的基类继承派生成员...
  4. 基于DirectShow的流媒体解码和回放
  5. 山东大学 2020级数据库系统 实验六
  6. 如何保持安全在线的五大技巧
  7. 2013腾讯编程马拉松初赛第二场(3月22日) 小Q系列故事——为什么时光不能倒流 ---好水!!...
  8. oracle logical standby,Oracle Dataguard管理命令(logical standby)
  9. 支付宝手机网站支付(基于Java实现支付宝手机网站支付)
  10. ViolinMemory上市遇低迷 唱衰闪存为哪般?
  11. eclipse新建Android项目时提示AndroidManifest.xml file missing!
  12. Android 动画的分类
  13. 蜕变成蝶~Linux设备驱动中的并发控制
  14. spring cloud构建java版 b2b2c o2o电子商务云商平台
  15. 美团搜索广告排序推荐,从机器学习到深度学习的模型实践
  16. vscode下报错:No such file or directory fatal error:no input files的一种比较坑爹的可能
  17. jQuery blockUI 使用详解
  18. Java工具类 BeanUtils库介绍以及对象拷贝
  19. 一个简单移动页面ionic打包成app
  20. 微信运营——利用python自动加微信(通往销冠之路)

热门文章

  1. 2020年中国球墨铸管行业发展背景、竞争格局及政策环境分析,城市管道建设带来行业增量,新兴铸管是行业龙头「图」
  2. 1114 计算营业额
  3. 十二星座分手时会怎么说?
  4. 太阳的后裔--OST.3 This love这份爱
  5. U盘常见病毒或木马解决篇
  6. html怎么把图片做成抖动效果,js实现鼠标触发图片抖动效果的方法
  7. 微信小程序:点击图片进行预览
  8. Linux 下串口编程(C++ 程序设计)
  9. Scrapy入门到放弃06:Spider中间件
  10. 阿里云国际站云服务器可以用来做什么业务?