js Canvas实现的日历时钟案例分享


Posted in Javascript onDecember 25, 2016

js Canvas实现的日历时钟案例分享

Html:

<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
<script src="requestNextAnimationFrame.js"></script>
<script src="calendarWithTime.js"></script>
</head>
<body>
<style>
* {margin:0; padding:0;}
#calendarWithTime{
 margin : 0;
}
</style>
<canvas id="calendarWithTime"></canvas>
</body>
</html>

js:

;var calendarWithTime = function(){
 v = navigator.userAgent.toLowerCase().indexOf("android") != -1 || navigator.userAgent.toLowerCase().indexOf("iphone") != -1 || navigator.userAgent.toLowerCase().indexOf("ipad") != -1;
 // 浏览器可见区域
 appWidth = (window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth);
 appHeight = (window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight) - 3; // chrome下,高度一样是,会出现下拉滚动条
 // 中心点
 centerPoint = {'x':appWidth*0.5,'y':appHeight*0.5};
 // 动画用
 lastFpsUpdateTime = (+new Date);
 // canvas对象
 caObj = null;
 // canvas context对象
 ctxtObj = null;
 // 现在时间
 timeNow = "";
 // 开始年份
 startY = 1988;
 init = function(){
  window.onload=function(){this.initCanvas();}
 }();
 getDomId = function(id){return document.getElementById(id);}
 initCanvas = function(id){
  this.caObj = this.getDomId("calendarWithTime");
  this.ctxtObj = this.caObj.getContext("2d");
  // 全屏canvas
  this.caObj.style.width = (this.appWidth+'px');
  this.caObj.style.height = (this.appHeight+'px');
  this.caObj.width = this.appWidth;
  this.caObj.height = this.appHeight;
  if (v) {
   caObj.style.border = "none";
  }
  // 开始年份
  startY = Math.floor((new Date()).getFullYear() / 8) * 8;
  // test 
  // startY = Math.floor(2010 / 8) * 8;
  this.lastFpsUpdateTime = (+new Date);
  this.animate();
 }
 doDraw = function(){
  this.ctxtObj.clearRect(0, 0, this.caObj.width, this.caObj.height);
  var date = new Date();
  // test
  /*date.setDate(29);
  date.setMonth(3);
  date.setFullYear(2010);*/
  var afterGap = 8 - (date.getFullYear() - startY);
  var allYears = date.getFullYear()-this.startY+afterGap;
  var allDays = this.getCountDays(date.getFullYear(),date.getMonth());
  this.doDrawDayPanel(31,allDays);
  this.doDrawMonthPanel();
  this.doDrawYearPanel(this.startY,date.getFullYear(),afterGap);
  // 画时间针
  this.doDrawTPanel();
  this.drawYMDHMS(0,0.35,0,0.1,date.getSeconds(),0,30,'s','');
  this.drawYMDHMS(0,0.3,0,0.05,date.getMinutes(),date.getSeconds()/60,30,'m','');
  this.drawYMDHMS(0,0.25,0,0.03,date.getHours() % 12,date.getMinutes()/60,6,'h','');
  this.drawYMDHMS(0.4,0.7,0.4,0.66,date.getDate(),date.getHours()/24,Math.ceil(31*0.5),'d',date.getDate());
  this.drawYMDHMS(0.4,0.6,0.4,0.568,(date.getMonth()),date.getDate()/(allDays+1),6,'M',date.getMonth()+1);
  this.drawYMDHMS(0.4,0.55,0.4,0.52,(date.getFullYear() - this.startY),(date.getMonth()+1)/13,Math.ceil(allYears*0.5),'y',date.getFullYear());
  // 显示时间
  this.getTimeNow();
  this.ctxtObj.save();
  this.ctxtObj.beginPath();
  this.ctxtObj.fillStyle = "#369";
  this.ctxtObj.strokeStyle = "#369";
  this.ctxtObj.font = "30px bold 微软雅黑";
  this.ctxtObj.textAlign="start";
  this.ctxtObj.textBaseline="top";
  this.ctxtObj.fillText(this.timeNow,0,0);
  this.ctxtObj.strokeText(this.timeNow,0,0);
  this.ctxtObj.restore();
  /*
  fillText(String text,float x,float y,[float maxwidth]):填充字符串
  strokeText(String text,float x,float y,[float maxwidth]):绘制边框
  font="bold 45px 宋体"
  textAlign:设置绘制字符串的水平对齐方式,start|end|right|center
  textBaseline:垂直对齐方式:top|hanging|middle|alphabetic|bottom
  */
 }
 doChangeToFront = function(i,x){
  // 转换为画面值
  return (i +Math.ceil(x/4)) % 60;
 }
 doChangeToEnd = function(i,x){
  // 转换为后台值
  return (i +Math.ceil(x/4*3)) % 60;
 }
 doDrawTPanel = function(){
  // 画时钟面板
  var minsLen = Math.min( this.caObj.width, this.caObj.height)*0.5*0.3;
  var mineLen = Math.min( this.caObj.width, this.caObj.height)*0.5*0.32;
  var maxsLen = Math.min( this.caObj.width, this.caObj.height)*0.5*0.28;
  var maxeLen = Math.min( this.caObj.width, this.caObj.height)*0.5*0.34;
  var gap = Math.PI/30;
  futoNum = 5;
  this.ctxtObj.save();
   this.ctxtObj.fillStyle = "#369";
  this.ctxtObj.strokeStyle = "#369";
  for(var i =0;i<=59;i++){
   if(i % futoNum==0){
    sLen = maxsLen;
    eLen = maxeLen;
   }else{
    sLen = minsLen;
    eLen = mineLen;
   }
   this.ctxtObj.beginPath();
   this.ctxtObj.moveTo(Math.cos(i*gap)*sLen + this.centerPoint.x ,Math.sin(i*gap)*sLen + this.centerPoint.y);
   this.ctxtObj.lineTo(Math.cos(i*gap)*eLen + this.centerPoint.x,Math.sin(i*gap)*eLen + this.centerPoint.y);
   this.ctxtObj.stroke();
   this.ctxtObj.closePath();
   /*iDiff = this.doChangeToFront(i); // i => iDiff
   //iDiff2 = this.doChangeToEnd(iDiff,60); // iDiff => i
   this.ctxtObj.font = "2px bold 微软雅黑";
   this.ctxtObj.textAlign="center"
   this.ctxtObj.textBaseline="middle"
   this.ctxtObj.fillText(iDiff,Math.cos(i*gap)*eLen + this.centerPoint.x,Math.sin(i*gap)*eLen + this.centerPoint.y);
   */

  }
  this.ctxtObj.beginPath();
  this.ctxtObj.arc(this.centerPoint.x,this.centerPoint.y,Math.min( this.caObj.width, this.caObj.height)*0.5*0.01,0,360,false);
  this.ctxtObj.fillStyle="red";
  this.ctxtObj.fill();
  this.ctxtObj.closePath();
  this.ctxtObj.restore();
 }
 doDrawYearPanel = function(startYear,nowYear,afterGap){
  // 画年份面板
  var sLen = Math.min( this.caObj.width, this.caObj.height)*0.5*0.53;
  var eLen = Math.min( this.caObj.width, this.caObj.height)*0.5*0.55;
  var labelLen = Math.min( this.caObj.width, this.caObj.height)*0.5*0.60;
  var allYears = nowYear-startYear+afterGap;
  var gap = Math.PI/Math.ceil(allYears*0.5);
  this.ctxtObj.save();
   this.ctxtObj.fillStyle = "#b4ffff";
  this.ctxtObj.beginPath();
  this.ctxtObj.arc(this.centerPoint.x,this.centerPoint.y,eLen+2,0,360,false);
  this.ctxtObj.closePath();
  this.ctxtObj.fill();
   this.ctxtObj.fillStyle = "white";
  this.ctxtObj.beginPath();
  this.ctxtObj.arc(this.centerPoint.x,this.centerPoint.y,sLen-2,0,360,false);
  this.ctxtObj.closePath();
  this.ctxtObj.fill();
  this.ctxtObj.restore();
   this.ctxtObj.fillStyle = "#369";
  this.ctxtObj.strokeStyle = "#369";
   for(var i =-2;i<=allYears-3;i++){
   this.ctxtObj.save();
   this.ctxtObj.beginPath();
   this.ctxtObj.moveTo(Math.cos(i*gap)*sLen + this.centerPoint.x ,Math.sin(i*gap)*sLen + this.centerPoint.y);
   this.ctxtObj.lineTo(Math.cos(i*gap)*eLen + this.centerPoint.x,Math.sin(i*gap)*eLen + this.centerPoint.y);
   this.ctxtObj.closePath();
   this.ctxtObj.stroke();
   iDiff = this.doChangeToFront(i,allYears) + startYear;
   this.ctxtObj.translate(this.centerPoint.x, this.centerPoint.y);
    this.ctxtObj.rotate(i*gap);
   this.ctxtObj.font = "10px bold 微软雅黑";
   this.ctxtObj.textAlign="start";
   this.ctxtObj.textBaseline="bottom";
   this.ctxtObj.fillText(iDiff,sLen,0);
   this.ctxtObj.restore();
  }
 }
 doDrawMonthPanel = function(){
  // 画年份面板
  var sLen = Math.min( this.caObj.width, this.caObj.height)*0.5*0.58;
  var eLen = Math.min( this.caObj.width, this.caObj.height)*0.5*0.6;
  var labelLen = Math.min( this.caObj.width, this.caObj.height)*0.5*0.70;
  var gap = Math.PI/6;
  this.ctxtObj.save();
   this.ctxtObj.fillStyle = "#fde08c";
  this.ctxtObj.beginPath();
  this.ctxtObj.arc(this.centerPoint.x,this.centerPoint.y,eLen+2,0,360,false);
  this.ctxtObj.closePath();
  this.ctxtObj.fill();
   this.ctxtObj.fillStyle = "white";
  this.ctxtObj.beginPath();
  this.ctxtObj.arc(this.centerPoint.x,this.centerPoint.y,sLen-2,0,360,false);
  this.ctxtObj.closePath();
  this.ctxtObj.fill();
  this.ctxtObj.restore();
   this.ctxtObj.fillStyle = "#369";
  this.ctxtObj.strokeStyle = "#369";
   for(var i =-2;i<=9;i++){
   this.ctxtObj.save();
   this.ctxtObj.beginPath();
   this.ctxtObj.moveTo(Math.cos(i*gap)*sLen + this.centerPoint.x ,Math.sin(i*gap)*sLen + this.centerPoint.y);
   this.ctxtObj.lineTo(Math.cos(i*gap)*eLen + this.centerPoint.x,Math.sin(i*gap)*eLen + this.centerPoint.y);
   this.ctxtObj.closePath();
   this.ctxtObj.stroke();
   iDiff = (this.doChangeToFront(i,12)) % 12+1;
   this.ctxtObj.translate(this.centerPoint.x, this.centerPoint.y);
    this.ctxtObj.rotate(i*gap);
   this.ctxtObj.font = "20px bold 微软雅黑";
   this.ctxtObj.textAlign="start";
   this.ctxtObj.textBaseline="middle";
   this.ctxtObj.fillText((iDiff+'').PadLeft(2,0),eLen,0);
   this.ctxtObj.restore();
  }
 }
 doDrawDayPanel = function(dayCount,realAllDay){
  // 画年份面板
  var sLen = Math.min( this.caObj.width, this.caObj.height)*0.5*0.68;
  var eLen = Math.min( this.caObj.width, this.caObj.height)*0.5*0.7;
  var labelLen = Math.min( this.caObj.width, this.caObj.height)*0.5*0.80;
  var gap = Math.PI/Math.ceil(dayCount*0.5);
  this.ctxtObj.save();
  this.ctxtObj.fillStyle = "#e587e5";
  this.ctxtObj.beginPath();
  this.ctxtObj.arc(this.centerPoint.x,this.centerPoint.y,eLen+2,0,360,false);
  this.ctxtObj.closePath();
  this.ctxtObj.fill();
  this.ctxtObj.fillStyle = "white";
  this.ctxtObj.beginPath();
  this.ctxtObj.arc(this.centerPoint.x,this.centerPoint.y,sLen-2,0,360,false);
  this.ctxtObj.closePath();
  this.ctxtObj.fill();
  this.ctxtObj.restore();
  this.ctxtObj.fillStyle = "#369";
  this.ctxtObj.strokeStyle = "#369";
  for(var i =-2;i<=dayCount-2;i++){
   this.ctxtObj.save();
   this.ctxtObj.beginPath();
   this.ctxtObj.moveTo(Math.cos(i*gap)*sLen + this.centerPoint.x ,Math.sin(i*gap)*sLen + this.centerPoint.y);
   this.ctxtObj.lineTo(Math.cos(i*gap)*eLen + this.centerPoint.x,Math.sin(i*gap)*eLen + this.centerPoint.y);
   this.ctxtObj.closePath();
   this.ctxtObj.stroke();
   iDiff = (this.doChangeToFront(i,dayCount)) % (dayCount+1);
   if(iDiff<=realAllDay && iDiff!=0){
    this.ctxtObj.translate(this.centerPoint.x, this.centerPoint.y);
     this.ctxtObj.rotate(i*gap);
    this.ctxtObj.font = "20px bold 微软雅黑";
    this.ctxtObj.textAlign="start";
    this.ctxtObj.textBaseline="middle";
    this.ctxtObj.fillText((iDiff+'').PadLeft(2,0),eLen,0);
   }
   this.ctxtObj.restore();
  }
 }
 drawYMDHMS = function(slen,elen,cslen,celen,main,sub,gapM,type,value){
  // 画日期时间针
  var date = new Date();
  var siM = main;
  var siS = sub;
  var gap = Math.PI/gapM;
  var sLen = Math.min( this.caObj.width, this.caObj.height)*0.5*slen;
  var eLen = Math.min( this.caObj.width, this.caObj.height)*0.5*elen;
  var csLen = Math.min( this.caObj.width, this.caObj.height)*0.5*cslen;
  var ceLen = Math.min( this.caObj.width, this.caObj.height)*0.5*celen;
  i = this.doChangeToEnd(siM+siS,gapM*2);
  ci = (i+gapM) % (gapM*2);
  this.ctxtObj.save();
  this.ctxtObj.beginPath();
  if(type=='y'){
   this.ctxtObj.strokeStyle="#00cece";
   this.ctxtObj.lineWidth = 6;
  }else if(type=='M'){
   this.ctxtObj.strokeStyle="#ce9b00";
   this.ctxtObj.lineWidth = 5;
  }else if(type=='d'){
   this.ctxtObj.strokeStyle="#bd01bd";
   this.ctxtObj.lineWidth = 4;
  }else if(type=='h'){
   this.ctxtObj.lineWidth = 3;
  }else if(type=='m'){
   this.ctxtObj.lineWidth = 2;
  }else if(type=='s'){
   this.ctxtObj.lineWidth = 1;
  }
  this.ctxtObj.moveTo(Math.cos(i*gap)*sLen + this.centerPoint.x ,Math.sin(i*gap)*sLen + this.centerPoint.y);
  this.ctxtObj.lineTo(Math.cos(i*gap)*eLen + this.centerPoint.x,Math.sin(i*gap)*eLen + this.centerPoint.y);
  this.ctxtObj.moveTo(Math.cos(ci*gap)*csLen + this.centerPoint.x ,Math.sin(ci*gap)*csLen + this.centerPoint.y);
  this.ctxtObj.lineTo(Math.cos(ci*gap)*ceLen + this.centerPoint.x,Math.sin(ci*gap)*ceLen + this.centerPoint.y);
  this.ctxtObj.stroke();
  this.ctxtObj.closePath();
  this.ctxtObj.restore();
  var cpi = ci*gap*360/Math.PI;
  if(type=='y'){
   this.ctxtObj.save();
    this.ctxtObj.fillStyle = "#00cece";
   this.ctxtObj.strokeStyle="#00cece";
   this.ctxtObj.lineWidth = 8;
   this.ctxtObj.beginPath();
   this.ctxtObj.arc(this.centerPoint.x,this.centerPoint.y,ceLen,ci*gap-gap*0.5,ci*gap+gap*0.5,false);
   this.ctxtObj.stroke();
   this.ctxtObj.closePath();
   this.ctxtObj.translate(this.centerPoint.x, this.centerPoint.y);
    this.ctxtObj.rotate(i*gap);
   this.ctxtObj.font = "20px bold 微软雅黑";
   this.ctxtObj.textAlign="start";
   this.ctxtObj.textBaseline="middle";
   this.ctxtObj.lineWidth = 2;
   this.ctxtObj.fillText(value + '年',eLen*1.03,0);
   this.ctxtObj.strokeText(value + '年',eLen*1.03,0);
   this.ctxtObj.restore();
  }else if(type=='M'){
   this.ctxtObj.save();
   this.ctxtObj.beginPath();
    this.ctxtObj.fillStyle = "#ce9b00";
   this.ctxtObj.strokeStyle="#ce9b00";
   this.ctxtObj.lineWidth = 7;
   this.ctxtObj.arc(this.centerPoint.x,this.centerPoint.y,ceLen,ci*gap-gap*0.5,ci*gap+gap*0.5,false);
   this.ctxtObj.stroke();
   this.ctxtObj.closePath();
   this.ctxtObj.translate(this.centerPoint.x, this.centerPoint.y);
    this.ctxtObj.rotate(i*gap);
   this.ctxtObj.font = "20px bold 微软雅黑";
   this.ctxtObj.textAlign="start";
   this.ctxtObj.textBaseline="middle";
   this.ctxtObj.lineWidth = 2;
   this.ctxtObj.fillText(value + '月',eLen*1.03,0);
   this.ctxtObj.strokeText(value + '月',eLen*1.03,0);
   this.ctxtObj.restore();
  }else if(type=='d'){
   this.ctxtObj.save();
   this.ctxtObj.beginPath();
    this.ctxtObj.fillStyle = "#bd01bd";
   this.ctxtObj.strokeStyle="#bd01bd";
   this.ctxtObj.lineWidth = 6;
   this.ctxtObj.arc(this.centerPoint.x,this.centerPoint.y,ceLen,ci*gap-gap*0.5,ci*gap+gap*0.5,false);
   this.ctxtObj.stroke();
   this.ctxtObj.closePath();
   this.ctxtObj.translate(this.centerPoint.x, this.centerPoint.y);
    this.ctxtObj.rotate(i*gap);
   this.ctxtObj.font = "20px bold 微软雅黑";
   this.ctxtObj.textAlign="start";
   this.ctxtObj.textBaseline="middle";
   this.ctxtObj.lineWidth = 2;
   this.ctxtObj.fillText(value + '日',eLen*1.03,0);
   this.ctxtObj.strokeText(value + '日',eLen*1.03,0);
   this.ctxtObj.restore();
  }
  this.ctxtObj.restore();
 }
 animate = function(){
  var now = (+new Date);
  if (now - this.lastFpsUpdateTime > 60) {
   this.lastFpsUpdateTime = now;
   this.doDraw();
  }
  window.requestNextAnimationFrame(this.animate);
 }
 getCountDays = function (year,month) {
  var curDate = new Date();
  curDate.setFullYear(year);
  curDate.setMonth(month+1);
  curDate.setDate(0);
  return curDate.getDate();
 }
 getTimeNow = function(){
  var date = new Date();
  var seperator1 = "-";
  var seperator2 = ":";
  this.timeNow = date.getFullYear() 
    + seperator1 + (date.getMonth()+1+'').PadLeft(2,0)
    + seperator1 + (date.getDate()+'').PadLeft(2,0)
   + " " + (date.getHours()+'').PadLeft(2,0)
    + seperator2 + (date.getMinutes()+'').PadLeft(2,0)
   + seperator2 + (date.getSeconds()+'').PadLeft(2,0)
    + '.' +(date.getMilliseconds()+'').PadLeft(3,0);
 }
 // objects
}
var cwt = new calendarWithTime();
//=================================================
String.prototype.PadLeft = function(totalWidth, paddingChar)
{
 if ( paddingChar != null )
 {
 return this.PadHelper(totalWidth, paddingChar, false);
 } else {
 return this.PadHelper(totalWidth, ' ', false);
 }
}
String.prototype.PadRight = function(totalWidth, paddingChar)
{
 if ( paddingChar != null )
 {
 return this.PadHelper(totalWidth, paddingChar, true);
 } else {
 return this.PadHelper(totalWidth, ' ', true);
 }
}
String.prototype.PadHelper = function(totalWidth, paddingChar, isRightPadded)
{
 if ( this.length < totalWidth)
 {
 var paddingString = new String();
 for (i = 1; i <= (totalWidth - this.length); i++)
 {
 paddingString += paddingChar;
 }
 if ( isRightPadded )
 {
 return (this + paddingString);
 } else {
 return (paddingString + this);
 }
 } else {
 return this;
 }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持三水点靠木!

Javascript 相关文章推荐
WEB页子窗口(showModalDialog和showModelessDialog)使用说明
Oct 25 Javascript
nullJavascript中创建对象的五种方法实例
May 07 Javascript
鼠标移到图片上变大显示而不是放大镜效果
Jun 15 Javascript
jQuery实现垂直半透明手风琴特效代码分享
Aug 21 Javascript
JS实现超精简响应鼠标显示二级菜单代码
Sep 12 Javascript
JS+CSS实现简单的二级下拉导航菜单效果
Sep 21 Javascript
Angular 常用指令实例总结整理
Dec 13 Javascript
详解基于webpack和vue.js搭建开发环境
Apr 05 Javascript
json对象及数组键值的深度大小写转换问题详解
Mar 30 Javascript
jQuery实现常见的隐藏与展示列表效果示例
Jun 04 jQuery
jQuery的Ajax接收java返回数据方法
Aug 11 jQuery
JavaScript JMap类定义与使用方法示例
Jan 22 Javascript
ES6概念 Symbol toString()方法
Dec 25 #Javascript
ES6概念 Symbol.keyFor()方法
Dec 25 #Javascript
ES6概念 ymbol.for()方法
Dec 25 #Javascript
ES2015 Symbol 一种绝不重复的值
Dec 25 #Javascript
基于Javascript实现的不重复ID的生成器
Dec 25 #Javascript
JS常见疑难点分析之match,charAt,charCodeAt,map,search用法分析
Dec 25 #Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
Dec 25 #Javascript
You might like
基于Linux调试工具strace与gdb的常用命令总结
2013/06/03 PHP
列举PHP的Yii 2框架的开发优势
2015/07/03 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
2016/01/07 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
总结PHP代码规范、流程规范、git规范
2018/06/18 PHP
关于IFRAME 自适应高度的研究
2006/07/20 Javascript
JS正则表达式验证数字代码
2014/01/28 Javascript
javascript操作referer详细解析
2014/03/10 Javascript
js使用正则实现ReplaceAll全部替换的方法
2014/07/18 Javascript
javascript检查浏览器是否支持flash的实现代码
2014/08/14 Javascript
jQuery 中的 DOM 操作
2016/04/26 Javascript
jq实现左滑显示删除按钮,点击删除实现删除数据功能(推荐)
2016/08/23 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
2016/08/24 Javascript
JavaScript获取当前时间向前推三个月的方法示例
2017/02/04 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
深入理解Vue 的条件渲染和列表渲染
2017/09/01 Javascript
浅谈Angular 中何时取消订阅
2017/11/22 Javascript
jQuery进阶实践之利用最优雅的方式如何写ajax请求
2017/12/20 jQuery
cdn模式下vue的基本用法详解
2018/10/07 Javascript
node.js学习笔记之koa框架和简单爬虫练习
2018/12/13 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
原生js实现日历效果
2020/03/02 Javascript
用Python抢过年的火车票附源码
2015/12/07 Python
Python迭代器与生成器基本用法分析
2018/07/26 Python
Pyqt5实现英文学习词典
2019/06/24 Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
2019/07/08 Python
Flask框架实现的前端RSA加密与后端Python解密功能详解
2019/08/13 Python
python自定义函数def的应用详解
2020/06/03 Python
Python 如何展开嵌套的序列
2020/08/01 Python
CSS3实现3D翻书效果
2016/06/20 HTML / CSS
教师廉洁自律承诺书
2014/05/26 职场文书
园林技术专业求职信
2014/07/28 职场文书
社区精神文明建设汇报材料
2014/08/17 职场文书
党员考试作弊检讨书1000字
2015/02/16 职场文书
2015年售票员工作总结
2015/04/29 职场文书
Python机器学习之PCA降维算法详解
2021/05/19 Python