文档章节

Sencha Touch 指定范围的日期组件

avengang
 avengang
发布于 2014/05/09 18:35
字数 1615
阅读 1300
收藏 2
点赞 0
评论 0
Ext.define('ux.RangeDatefield', {
	extend : 'Ext.Container',
	xtype : 'rangedatefield',
	alternateClassName : 'rangedatefield',
	config : {
		minDate : null,
		maxDate : null,
		title : null,
		view : null,
		checkedEventName : null,
		textfield : null,
		style : 'background-color:white;',
		width : '100%',
		top : 0,
		height : 220,
		hideOnMaskTap : true,
		modal : true,
		layout : 'vbox',
		items : [{
			xtype : 'toolbar',
			docked : 'top',
			style : 'border-radius:0;',
			items : [{
				xtype : 'button',
				iconCls : 'arrow_left',
				handler : function(button) {
					var me = button.getParent().getParent();
					me.hide();
				}
			}, {
				xtype : 'button',
				iconCls : 'check',
				right : 0,
				top : 5,
				handler : function(button) {
					var me = button.getParent().getParent();
					var timeStr = me.returnValue();
					var view = me.getView();
					view.fireEvent(me.getCheckedEventName(), timeStr);
					me.hide();
				}
			}]
		}, {
			html : '<table style="width:100%;font-size:0.8em;background-color:#6580a5;color:#fff;font-weight:bold;"><tr><td style="width:40%;">年</td><td style="width:30%;">月</td><td style="width:30%;">日</td></tr></table>',
			margin : '10 10 0 10'
		}, {
			layout : 'hbox',
			margin : '0 10 0 10',
			defaults : {
				usePicker : false
			},
			items : [{
				xtype : 'selectfield',
				itemId : 'rangedatefieldYear',
				width : '40%',
				listeners : {
					change : function(selectfield, newValue, oldValue, eOpts) {
						if(!newValue) {
							this.setValue(this.getOptions()[0].value);
							return;
						}
						var me = selectfield.getParent().getParent();
console.log("year");
console.log(me)
						var minDate = me.getMinDate();
						var maxDate = me.getMaxDate();
						
						var MonthF = me.down("#rangedatefieldMonth");
						
						var months = [];
						if(maxDate.getFullYear() == minDate.getFullYear()) {
							for (var i = minDate.getMonth()+1; i <= maxDate.getMonth()+1; i++) {
								months.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							MonthF.setOptions(months);
							return;
						}
						if(newValue == minDate.getFullYear()) {
							for (var i = minDate.getMonth()+1; i <= 12; i++) {
								months.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							MonthF.setOptions(months);
						} else if(newValue == maxDate.getFullYear()) {
							for (var i = 1; i <= maxDate.getMonth()+1; i++) {
								months.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							MonthF.setOptions(months);
						} else {
							for (var i = 1; i <= 12; i++) {
								months.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							MonthF.setOptions(months);
						}
MonthF.setValue(null);
					}
				}
			}, {
				xtype : 'selectfield',
				itemId : 'rangedatefieldMonth',
				width : '30%',
				listeners : {
					change : function(selectfield, newValue, oldValue, eOpts) {
						if(!newValue) {
console.log(newValue);
							this.setValue(this.getOptions()[0].value);
console.log(this.getOptions()[0]);
console.log(this.getValue());
							return;
						}
						var me = selectfield.getParent().getParent();
console.log("month");
console.log(me)	
						var minDate = me.getMinDate();
						var maxDate = me.getMaxDate();
						
						var YearF = me.down("#rangedatefieldYear");
						var DayF = me.down("#rangedatefieldDay");
						
						var months = [];
						var days = [];
						var hours = [];
						var mins = [];
						var seconds = [];
						if(maxDate.getFullYear() == minDate.getFullYear() && minDate.getMonth() == maxDate.getMonth()) {
							for (var i = minDate.getDate(); i <= maxDate.getDate(); i++) {
								days.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							DayF.setOptions(days);
							return;
						}
						if(YearF.getValue() == minDate.getFullYear() && newValue == util.addZero(minDate.getMonth()+1)) {
							var monthDayNum = me.getMonthDayNumByMonth(YearF.getValue(), newValue);
							for (var i = minDate.getDate(); i <= monthDayNum; i++) {
								days.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							DayF.setOptions(days);
						} else if(YearF.getValue() == maxDate.getFullYear() && newValue == util.addZero(maxDate.getMonth()+1)) {
							for (var i = 1; i <= maxDate.getDate(); i++) {
								days.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							DayF.setOptions(days);
						} else {
							var monthDayNum = me.getMonthDayNumByMonth(YearF.getValue(), newValue);
							for (var i = 1; i <= monthDayNum; i++) {
								days.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							DayF.setOptions(days);
						}
DayF.setValue(null);
					}
				}
			}, {
				xtype : 'selectfield',
				itemId : 'rangedatefieldDay',
				width : '30%',
				right : 0,
				listeners : {
					change : function(selectfield, newValue, oldValue, eOpts) {
						if(!newValue) {
							this.setValue(this.getOptions()[0].value);
							return;
						}
						var me = selectfield.getParent().getParent();
console.log("day");
console.log(me)		
						
						var minDate = me.getMinDate();
						var maxDate = me.getMaxDate();
						
						var YearF = me.down("#rangedatefieldYear");
						var MonthF = me.down("#rangedatefieldMonth");
						var DayF = me.down("#rangedatefieldDay");
						var HourF = me.down("#rangedatefieldHour");
						var MinuteF = me.down("#rangedatefieldMinute");
						var secondF = me.down("#rangedatefieldSecond");
						
						var months = [];
						var days = [];
						var hours = [];
						var mins = [];
						var seconds = [];
						if(maxDate.getFullYear() == minDate.getFullYear() && minDate.getMonth() == maxDate.getMonth() && minDate.getDate() == maxDate.getDate()) {
							for (var i = minDate.getHours(); i <= maxDate.getHours(); i++) {
								hours.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							HourF.setOptions(hours);
							return;
						}
						if(YearF.getValue() == minDate.getFullYear() && MonthF.getValue() ==util.addZero(minDate.getMonth()+1) && newValue == util.addZero(minDate.getDate())) {
					
							for (var i = minDate.getHours(); i <= 23; i++) {
								hours.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							HourF.setOptions(hours);
					
						} else if(YearF.getValue() == maxDate.getFullYear() && MonthF.getValue() ==util.addZero(maxDate.getMonth()+1) && newValue == util.addZero(maxDate.getDate())) {
					
							for (var i = 0; i <= maxDate.getHours(); i++) {
								hours.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							HourF.setOptions(hours);
					
						} else {
							for (var i = 0; i <= 23; i++) {
								hours.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							HourF.setOptions(hours);
						}
HourF.setValue(null);
					}
				}
			}]
		}, {
			html : '<table style="width:100%;font-size:0.8em;background-color:#6580a5;color:#fff;font-weight:bold;"><tr><td style="width:40%;">时</td><td style="width:30%;">分</td><td style="width:30%;">秒</td></tr></table>',
			margin : '10 10 0 10'
		}, {
			layout : 'hbox',
			margin : '0 10 0 10',
			defaults : {
				usePicker : false
			},
			items : [{
				xtype : 'selectfield',
				itemId : 'rangedatefieldHour',
				width : '40%',
				listeners : {
					change : function(selectfield, newValue, oldValue, eOpts) {
						if(!newValue) {
							this.setValue(this.getOptions()[0].value);
							return;
						}
						var me = selectfield.getParent().getParent();
console.log("hour");
console.log(me)
						
						var minDate = me.getMinDate();
						var maxDate = me.getMaxDate();
						
						var YearF = me.down("#rangedatefieldYear");
						var MonthF = me.down("#rangedatefieldMonth");
						var DayF = me.down("#rangedatefieldDay");
						var HourF = me.down("#rangedatefieldHour");
						var MinuteF = me.down("#rangedatefieldMinute");
						var secondF = me.down("#rangedatefieldSecond");
						
						var months = [];
						var days = [];
						var hours = [];
						var mins = [];
						var seconds = [];
						if(maxDate.getFullYear() == minDate.getFullYear() && minDate.getMonth() == maxDate.getMonth() && minDate.getDate() == maxDate.getDate() && util.addZero(minDate.getHours()) == util.addZero(maxDate.getHours())) {
							for (var i = minDate.getMinutes(); i <= maxDate.getMinutes(); i++) {
								mins.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							MinuteF.setOptions(mins);
							return;
						}
						if(YearF.getValue() == minDate.getFullYear() && MonthF.getValue() ==util.addZero(minDate.getMonth()+1) && DayF.getValue() == util.addZero(minDate.getDate()) && newValue == util.addZero(minDate.getHours())) {
							for (var i = minDate.getMinutes(); i <= 59; i++) {
								mins.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							MinuteF.setOptions(mins);
							
						} else if(YearF.getValue() == maxDate.getFullYear() && MonthF.getValue() ==util.addZero(maxDate.getMonth()+1) && DayF.getValue() == util.addZero(maxDate.getDate()) && newValue == util.addZero(maxDate.getHours())) {
							for (var i = 0; i <= maxDate.getMinutes(); i++) {
								mins.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							MinuteF.setOptions(mins);
							
						} else {
							for (var i = 0; i <= 59; i++) {
								mins.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							MinuteF.setOptions(mins);
						}
MinuteF.setValue(null);
					}
				}
			}, {
				xtype : 'selectfield',
				itemId : 'rangedatefieldMinute',
				width : '30%',
				listeners : {
					change : function(selectfield, newValue, oldValue, eOpts) {
						if(!newValue) {
							this.setValue(this.getOptions()[0].value);
							return;
						}
						var me = selectfield.getParent().getParent();
console.log("minute");
console.log(me);	
						
						var minDate = me.getMinDate();
						var maxDate = me.getMaxDate();
						
						var YearF = me.down("#rangedatefieldYear");
						var MonthF = me.down("#rangedatefieldMonth");
						var DayF = me.down("#rangedatefieldDay");
						var HourF = me.down("#rangedatefieldHour");
						var MinuteF = me.down("#rangedatefieldMinute");
						var secondF = me.down("#rangedatefieldSecond");
						
						var months = [];
						var days = [];
						var hours = [];
						var mins = [];
						var seconds = [];
						if(maxDate.getFullYear() == minDate.getFullYear() && minDate.getMonth() == maxDate.getMonth() && minDate.getDate() == maxDate.getDate() && util.addZero(minDate.getHours()) == util.addZero(maxDate.getHours()) && util.addZero(minDate.getMinutes()) == util.addZero(maxDate.getMinutes())) {
							for (var i = minDate.getSeconds(); i <= maxDate.getSeconds(); i++) {
								seconds.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							secondF.setOptions(seconds);
							return;
						}
						if(YearF.getValue() == minDate.getFullYear() && MonthF.getValue() ==util.addZero(minDate.getMonth()+1) && DayF.getValue() == util.addZero(minDate.getDate()) && HourF.getValue() == util.addZero(minDate.getHours()) && newValue == util.addZero(minDate.getMinutes())) {
							for (var i = minDate.getSeconds(); i <= 59; i++) {
								seconds.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							secondF.setOptions(seconds);
						} else if(YearF.getValue() == maxDate.getFullYear() && MonthF.getValue() ==util.addZero(maxDate.getMonth()+1) && DayF.getValue() == util.addZero(maxDate.getDate()) && HourF.getValue() == util.addZero(maxDate.getHours()) && newValue == util.addZero(maxDate.getMinutes())) {
							for (var i = 0; i <= maxDate.getSeconds(); i++) {
								seconds.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							secondF.setOptions(seconds);
						} else {
							for (var i = 0; i <= 59; i++) {
								seconds.push({
									text : (i < 10 ? '0' : '') + i,
									value : (i < 10 ? '0' : '') + i
								});
							}
							secondF.setOptions(seconds);
						}
secondF.setValue(null);
					}
				}
			}, {
				xtype : 'selectfield',
				itemId : 'rangedatefieldSecond',
				width : '30%',
				right : 0,
				listeners : {
					change : function(selectfield, newValue, oldValue, eOpts) {
						if(!newValue) {
							this.setValue(this.getOptions()[0].value);
							return;
						}
					}
				}
			}]
		}, {
			xtype : 'button',
			margin : 10,
			ui : 'decline',
			text : '清空',
			style : 'border-radius:0;',
			handler : function(button) {
				var me = button.getParent();
				me.clearValue();
			}
		}]
	},
	initialize : function() {
		this.callParent();
		this.setRange();
	},
	returnValue : function() {
		var timeStr = this.items.items[2].items.items[0].getValue() + '-' + this.items.items[2].items.items[1].getValue() + '-' + this.items.items[2].items.items[2].getValue() + ' ' + this.items.items[4].items.items[0].getValue() + ':' + this.items.items[4].items.items[1].getValue() + ':' + this.items.items[4].items.items[2].getValue();
		this.getTextfield().setValue(timeStr);
		return timeStr;
		this.hide();
	},
	hide : function() {
		util.clearPopView();
	},
	clearValue : function() {
		this.getTextfield().setValue('');

		this.hide();
	},
	setRange : function() {
		var minDate = this.getMinDate();
		var maxDate = this.getMaxDate();
console.log(minDate);
console.log(maxDate);		
		
		Ext.Viewport.getActiveItem().disable();

		var yearF = this.down("#rangedatefieldYear");
		var MonthF = this.down("#rangedatefieldMonth");
		var DayF = this.down("#rangedatefieldDay");
		var HourF = this.down("#rangedatefieldHour");
		var MinuteF = this.down("#rangedatefieldMinute");
		var secondF = this.down("#rangedatefieldSecond");
		
		var title = this.getTitle();
		this.items.items[0].setTitle(title);
		this.getTextfield().blur();
		var date = this.getTextfield().getValue();
		var year;
		var month;
		var day;
		var hour;
		var min;
		var second;
		if (date == '') {
			date = Ext.Date.format(new Date(), 'Y-m-d H:i:s');
		}
		year = date.substring(0, 4);
		month = date.substring(5, 7);
		day = date.substring(8, 10);
		hour = date.substring(11, 13);
		min = date.substring(14, 16);
		second = date.substring(17, 19);
		var years = [];
		for (var i = minDate.getFullYear(); i <= maxDate.getFullYear(); i++) {
			years.push({
				text : i,
				value : i
			});
		}
		yearF.setOptions(years);
		
		yearF.setValue(year);

		MonthF.setValue(month);

		DayF.setValue(day);

		HourF.setValue(hour);

		MinuteF.setValue(min);
		
		secondF.setValue(second);
	},
	getMonthDayNumByMonth : function(year, month) {
		var monthDayNum = 30;
		switch(month) {
		case "01" : 
			monthDayNum = 31;
		break;
		case "02" : //闰年29
			monthDayNum = 28;
		break;
		case "03" : 
			monthDayNum = 31;
		break;
		case "04" : 
			monthDayNum = 30;
		break;
		case "05" : 
			monthDayNum = 31;
		break;
		case "06" : 
			monthDayNum = 30;
		break;
		case "07" : 
			monthDayNum = 31;
		break;
		case "08" : 
			monthDayNum = 31;
		break;
		case "09" : 
			monthDayNum = 30;
		break;
		case "10" : 
			monthDayNum = 31;
		break;
		case "11" : 
			monthDayNum = 30;
		break;
		case "12" : 
			monthDayNum = 31;
		break;
		}
		if(util.isLeapYear(year)) {
			monthDayNum = 29;
		}
		return monthDayNum;
	}
});

上面是组件的源码,太esay了就不解释了。组件里面用到了工具类util里面的3个方法。

getAfterOneHourTimeByTime : function(date) {
			var dt = new Date(date);
		    var ms = new Date(dt).getTime();
		    return new Date(ms + 3600000);
		},
		
		addZero : function(num) {
			return num < 10 ? "0"+num : num;
		},
		
		isLeapYear : function(pYear) {
			if(!isNaN(parseInt(pYear))){
      			if((pYear%4==0 && pYear%100!=0)||(pYear%100==0 && pYear%400==0)){
      				return true;
      			}
			}
			return false;
		}

调用的方式是:

popDatefield = Ext.create('ux.RangeDatefield', {
									textfield : textfield,
									title : '结束日期',
									minDate : new Date("2014-05-09 17:18:25"),
									maxDate : new Date(util.getAfterOneHourTimeByTime("2014-05-09 17:18:25"))
								});

表示范围是

2014-05-09 17:18:25

2014-05-09 17:18:25的一个小时以后

运行效果如下:

可以看到日期和时间都是严格被限定在指定范围内选择的;

© 著作权归作者所有

共有 人打赏支持
avengang
粉丝 5
博文 23
码字总数 12016
作品 0
成都
程序员
构建基于 Sencha Touch 框架的 Mobile web 应用

Sencha Touch 是第一个专门设计为移动设备开发 web 应用的 JavaScript 框架,它基于 HTML5 和 CSS3 的 web 标准,全面兼容 Android 和 Apple iOS,通过 Sencha Touch 框架用户可以创建非常像...

IBMdW ⋅ 2011/09/20 ⋅ 0

使用 Sencha Touch 开发超炫的跨平台移动 Web 应用

Sencha Touch 是由 Sencha 公司开发的移动 Web 应用开发框架,用以提升主流移动设备在浏览器上的触碰操作,增强用户体验。该框架以久负盛名的 Ext JS 富客户端框架为基础,并支持最新的 HTML...

IBMdW ⋅ 2011/08/04 ⋅ 0

Sencha Touch 2 Beta 发布

Sencha Touch 2 Beta 发布了,下载地址: http://cdn.sencha.io/touch/sencha-touch-2-b1.zip 发行说明: http://dev.sencha.com/deploy/sencha-touch-2-b1/release-notes.html Sencha Touch......

红薯 ⋅ 2012/02/02 ⋅ 0

(译)如何创建一个Sencha Touch 2应用:part 1

在此系列中,我们将创建一个Sencha Touch 2版本的记事本应用,用来记录用户的笔记并存储在该运行设备上。在这个过程中,我们将深入一下几个区域: 建立一个Sencha Touch 应用的区块 如何实现...

彭博 ⋅ 2012/02/21 ⋅ 1

Sencha touch 开发指南

本文主要介绍如何使用Sencha Touch为手持设备进行应用开发,主要是针对iPhone这样的高端手机,我们会通过一个详细的例子来介绍整个开发的流程。 Sencha Touch简介 Sencha Touch是专门为移动设...

小编辑 ⋅ 2011/09/28 ⋅ 1

Sencha touch 开发指南

本文主要介绍如何使用Sencha Touch为手持设备进行应用开发,主要是针对iPhone这样的高端手机,我们会通过一个详细的例子来介绍整个开发的流程。 Sencha Touch简介 Sencha Touch是专门为移动设...

红薯 ⋅ 2011/09/20 ⋅ 3

Sencha Touch 入门第一步

Sencha Touch 是专门为移动设备开发应用的Javascrt框架。通过Sencha Touch你可以创建非常像native app的web app,用户界面组件和数据管理全部基于HTML5和CSS3的web标准,全面兼容Android和A...

红薯 ⋅ 2012/02/18 ⋅ 1

用 Sencha Touch 构建移动 web 应用程序

Sencha Touch 是一个使用 HTML5、CSS3 和 JavaScript 语言构建的移动 web 应用程序框架,在本文中,学习如何应用您当前的 web 开发技能进行移动 web 开发。下载和建立 Sencha Touch,通过一个...

IBMdW ⋅ 2012/03/19 ⋅ 0

Sencha Touch 2 正式版发布

Sencha Touch 2 正式版发布了,Sencha Touch是专门为移动设备开发应用的Javascript框架。通过Sencha Touch你可以创建非常像native app的web app,用户界面组件和数据管理全部基于HTML5和CSS...

红薯 ⋅ 2012/03/07 ⋅ 11

Sencha Touch 2.4.0 发布,增强对黑莓的支持

Sencha Touch 2.4.0 发布,该版本增强了对黑莓 10 浏览器和设备的支持,你可通过这里 下载 Sencha Touch 2.4 在黑莓设备上密码输入框增加了一个眼睛的图标,指示触摸进入时。此外列表组件的 ...

oschina ⋅ 2014/08/26 ⋅ 5

没有更多内容

加载失败,请刷新页面

加载更多

下一页

知乎Java数据结构

作者:匿名用户 链接:https://www.zhihu.com/question/35947829/answer/66113038 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 感觉知乎上嘲讽题主简...

颖伙虫 ⋅ 今天 ⋅ 0

Confluence 6 恢复一个站点有关使用站点导出为备份的说明

推荐使用生产备份策略。我们推荐你针对你的生产环境中使用的 Confluence 参考 Production Backup Strategy 页面中的内容进行备份和恢复(这个需要你备份你的数据库和 home 目录)。XML 导出备...

honeymose ⋅ 今天 ⋅ 0

JavaScript零基础入门——(九)JavaScript的函数

JavaScript零基础入门——(九)JavaScript的函数 欢迎回到我们的JavaScript零基础入门,上一节课我们了解了有关JS中数组的相关知识点,不知道大家有没有自己去敲一敲,消化一下?这一节课,...

JandenMa ⋅ 今天 ⋅ 0

火狐浏览器各版本下载及插件httprequest

各版本下载地址:http://ftp.mozilla.org/pub/mozilla.org//firefox/releases/ httprequest插件截至57版本可用

xiaoge2016 ⋅ 今天 ⋅ 0

Docker系列教程28-实战:使用Docker Compose运行ELK

原文:http://www.itmuch.com/docker/28-docker-compose-in-action-elk/,转载请说明出处。 ElasticSearch【存储】 Logtash【日志聚合器】 Kibana【界面】 答案: version: '2'services: ...

周立_ITMuch ⋅ 今天 ⋅ 0

使用快嘉sdkg极速搭建接口模拟系统

在具体项目研发过程中,一旦前后端双方约定好接口,前端和app同事就会希望后台同事可以尽快提供可供对接的接口方便调试,而对后台同事来说定好接口还仅是个开始、设计流程,实现业务逻辑,编...

fastjrun ⋅ 今天 ⋅ 0

PXE/KickStart 无人值守安装

导言 作为中小公司的运维,经常会遇到一些机械式的重复工作,例如:有时公司同时上线几十甚至上百台服务器,而且需要我们在短时间内完成系统安装。 常规的办法有什么? 光盘安装系统 ===> 一...

kangvcar ⋅ 昨天 ⋅ 0

使用Puppeteer撸一个爬虫

Puppeteer是什么 puppeteer是谷歌chrome团队官方开发的一个无界面(Headless)chrome工具。Chrome Headless将成为web应用自动化测试的行业标杆。所以我们很有必要来了解一下它。所谓的无头浏...

小草先森 ⋅ 昨天 ⋅ 0

Java Done Right

* 表示难度较大或理论性较强。 ** 表示难度更大或理论性更强。 【Java语言本身】 基础语法,面向对象,顺序编程,并发编程,网络编程,泛型,注解,lambda(Java8),module(Java9),var(...

风华神使 ⋅ 昨天 ⋅ 0

Linux系统日志

linux 系统日志 /var/log/messages /etc/logrotate.conf 日志切割配置文件 https://my.oschina.net/u/2000675/blog/908189 logrotate 使用详解 dmesg 命令 /var/log/dmesg 日志 last命令,调......

Linux学习笔记 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部