生产制造追溯系统之在线打印功能


Posted in Javascript onJune 03, 2019

前言

很久没有写博客了(大概有4个月的样子了吧),从2015年8月份开始一直忙于公司的系统,直到2016年6月底全部上线;包含4个厂区,每个厂区都是上千人的规模,而负责搞这个项目的算上我只有2个人,说多了都是泪:

美工?没有

测试人员?没有

DBA?没有

架构师?没有

运维?继续没有

估计大家都没遇见过这样的工作吧?哈哈.

历经艰难、跟各个部门(IE、PE、生产、PMC、QA等)唇枪舌战、好在在6月底总算是全部上线,总算是一点欣慰,毕竟决定了接手这个项目,那就要用心去做,只有用心了才能做好。

吐槽完毕,下面开始说正事儿

********我是华丽的分割线************************************************

公司的系统上线之后,我也稍微可以缓口气了,加班稍微少了一点,一般到了下午6点半就能下班,所以我还是决定将2015年初整理的这套项目拿出来继续优化,该项目已Web模式为主、客户端模式为辅,互相结合使用;目前主要包含以下几个主要功能模块:

生产制造追溯系统之在线打印功能

本文主要说一下打印的问题,在生产制造业中条码打印是非常频繁的,也是必不可少的;我曾经亲身经历过这么一件事情:生产线在进行包装的时候,打印了两张卡通标签,但是操作员在将卡通标签贴在盒子上的时候贴反了,也就是说标签上面的序列号与盒子里面装的实物完全对不上,为此在海关被拦截了,当时厂里派了QA、生产、货仓与IT一同去海关处解决这个问题,我刚好在其中,整个过程是非常繁琐的,为此公司高层也要求必须杜绝这种品质事件,故我们也是采用了"在线打印"的方式进行包装,并且只有QA才有标签重打的权限。

这个故事反应了生产线的真实现象,所以我这边采用如下方式完成打印:

function PrintLabel(box) {
 var api = '<%=MTS.Utility.MtsTool.GetApi() %>';
 var lurl = api + "?type=3&action=get_carton_sn&carton_sn=" + box;
 $.ajax({ url: lurl,
 cache: false,
 dataType: "text",
 success: function (data) {
 if (data == null || data == undefined) {
 alert("");
 return;
 }
 var arr = data.split("|");
 if (arr[0] == "0") {
 alert(arr[2]);
 return;
 }
 var t = eval("(" + arr[2] + ")"); //  
 try {
 var labelId = $("#hid_LabelId").val();
 window.external.PrintLabel("", t.key, t.value, ",", labelId);
 } catch (e) {
 };
 }
 });
 }

以上代码是Web应用程序中的脚本,主要是通过API获取需要打印的数据,这里返回的是text类型,其实也可以返回Json格式的数据;用户完成包装之后系统会按照包装规则产生一个唯一的卡通箱号,那么这个箱号就作为API的参数 carton_sn= box传进去,根据该箱号返回真实的包装数据;然后通过window.external调用客户端的打印函数。

通过如下代码获取本地默认打印机:

//获取默认打印机
 System.Drawing.Printing.PrintDocument pringdocument = new System.Drawing.Printing.PrintDocument();
 string pring_name = pringdocument.PrinterSettings.PrinterName;//打印机名

因为我这里的客户端程序就是对Web程式加壳了,通过这个客户端程序就可以方便的获取本地默认打印机,采用这种方式比在网页中安装 activex 控件要爽的多,谁用谁知道.

网页传过来的参数以键值对为标准:

string[] keys = key.Split(splitKey.ToCharArray(), StringSplitOptions.None);
 string[] values = value.Split(splitKey.ToCharArray(), StringSplitOptions.None);

我这里调用BarTender进行打印,代码如下:

format = (BarTender.FormatClass)engine.Formats.Open(filename);
 format.SetNamedSubStringValue(key, value);
 format.PrintSetup.Printer = printerName;
 BarTender.Messages msg = null;
 format.Print("0", false, 1, out msg);

以下代码是Code 128格式的条码:

public class Code128
 {
 private DataTable m_Code128 = new DataTable();
 private uint m_Height = 40;
 /// <summary>
 /// 高度
 /// </summary>
 public uint Height { get { return m_Height; } set { m_Height = value; } }
 private Font m_ValueFont = null;
 /// <summary>
 /// 是否显示可见号码 如果为NULL不显示号码
 /// </summary>
 public Font ValueFont { get { return m_ValueFont; } set { m_ValueFont = value; } }
 private byte m_Magnify = 0;
 /// <summary>
 /// 放大倍数
 /// </summary>
 public byte Magnify { get { return m_Magnify; } set { m_Magnify = value; } }
 /// <summary>
 /// 条码类别
 /// </summary>
 public enum Encode
 {
 Code128A,
 Code128B,
 Code128C,
 EAN128
 }
 public Code128()
 {
 m_Code128.Columns.Add("ID");
 m_Code128.Columns.Add("Code128A");
 m_Code128.Columns.Add("Code128B");
 m_Code128.Columns.Add("Code128C");
 m_Code128.Columns.Add("BandCode");
 m_Code128.CaseSensitive = true;
 #region 数据表
 m_Code128.Rows.Add("0", " ", " ", "00", "212222");
 m_Code128.Rows.Add("1", "!", "!", "01", "222122");
 m_Code128.Rows.Add("2", "\"", "\"", "02", "222221");
 m_Code128.Rows.Add("3", "#", "#", "03", "121223");
 m_Code128.Rows.Add("4", "$", "$", "04", "121322");
 m_Code128.Rows.Add("5", "%", "%", "05", "131222");
 m_Code128.Rows.Add("6", "&", "&", "06", "122213");
 m_Code128.Rows.Add("7", "'", "'", "07", "122312");
 m_Code128.Rows.Add("8", "(", "(", "08", "132212");
 m_Code128.Rows.Add("9", ")", ")", "09", "221213");
 m_Code128.Rows.Add("10", "*", "*", "10", "221312");
 m_Code128.Rows.Add("11", "+", "+", "11", "231212");
 m_Code128.Rows.Add("12", ",", ",", "12", "112232");
 m_Code128.Rows.Add("13", "-", "-", "13", "122132");
 m_Code128.Rows.Add("14", ".", ".", "14", "122231");
 m_Code128.Rows.Add("15", "/", "/", "15", "113222");
 m_Code128.Rows.Add("16", "0", "0", "16", "123122");
 m_Code128.Rows.Add("17", "1", "1", "17", "123221");
 m_Code128.Rows.Add("18", "2", "2", "18", "223211");
 m_Code128.Rows.Add("19", "3", "3", "19", "221132");
 m_Code128.Rows.Add("20", "4", "4", "20", "221231");
 m_Code128.Rows.Add("21", "5", "5", "21", "213212");
 m_Code128.Rows.Add("22", "6", "6", "22", "223112");
 m_Code128.Rows.Add("23", "7", "7", "23", "312131");
 m_Code128.Rows.Add("24", "8", "8", "24", "311222");
 m_Code128.Rows.Add("25", "9", "9", "25", "321122");
 m_Code128.Rows.Add("26", ":", ":", "26", "321221");
 m_Code128.Rows.Add("27", ";", ";", "27", "312212");
 m_Code128.Rows.Add("28", "<", "<", "28", "322112");
 m_Code128.Rows.Add("29", "=", "=", "29", "322211");
 m_Code128.Rows.Add("30", ">", ">", "30", "212123");
 m_Code128.Rows.Add("31", "?", "?", "31", "212321");
 m_Code128.Rows.Add("32", "@", "@", "32", "232121");
 m_Code128.Rows.Add("33", "A", "A", "33", "111323");
 m_Code128.Rows.Add("34", "B", "B", "34", "131123");
 m_Code128.Rows.Add("35", "C", "C", "35", "131321");
 m_Code128.Rows.Add("36", "D", "D", "36", "112313");
 m_Code128.Rows.Add("37", "E", "E", "37", "132113");
 m_Code128.Rows.Add("38", "F", "F", "38", "132311");
 m_Code128.Rows.Add("39", "G", "G", "39", "211313");
 m_Code128.Rows.Add("40", "H", "H", "40", "231113");
 m_Code128.Rows.Add("41", "I", "I", "41", "231311");
 m_Code128.Rows.Add("42", "J", "J", "42", "112133");
 m_Code128.Rows.Add("43", "K", "K", "43", "112331");
 m_Code128.Rows.Add("44", "L", "L", "44", "132131");
 m_Code128.Rows.Add("45", "M", "M", "45", "113123");
 m_Code128.Rows.Add("46", "N", "N", "46", "113321");
 m_Code128.Rows.Add("47", "O", "O", "47", "133121");
 m_Code128.Rows.Add("48", "P", "P", "48", "313121");
 m_Code128.Rows.Add("49", "Q", "Q", "49", "211331");
 m_Code128.Rows.Add("50", "R", "R", "50", "231131");
 m_Code128.Rows.Add("51", "S", "S", "51", "213113");
 m_Code128.Rows.Add("52", "T", "T", "52", "213311");
 m_Code128.Rows.Add("53", "U", "U", "53", "213131");
 m_Code128.Rows.Add("54", "V", "V", "54", "311123");
 m_Code128.Rows.Add("55", "W", "W", "55", "311321");
 m_Code128.Rows.Add("56", "X", "X", "56", "331121");
 m_Code128.Rows.Add("57", "Y", "Y", "57", "312113");
 m_Code128.Rows.Add("58", "Z", "Z", "58", "312311");
 m_Code128.Rows.Add("59", "[", "[", "59", "332111");
 m_Code128.Rows.Add("60", "\\", "\\", "60", "314111");
 m_Code128.Rows.Add("61", "]", "]", "61", "221411");
 m_Code128.Rows.Add("62", "^", "^", "62", "431111");
 m_Code128.Rows.Add("63", "_", "_", "63", "111224");
 m_Code128.Rows.Add("64", "NUL", "`", "64", "111422");
 m_Code128.Rows.Add("65", "SOH", "a", "65", "121124");
 m_Code128.Rows.Add("66", "STX", "b", "66", "121421");
 m_Code128.Rows.Add("67", "ETX", "c", "67", "141122");
 m_Code128.Rows.Add("68", "EOT", "d", "68", "141221");
 m_Code128.Rows.Add("69", "ENQ", "e", "69", "112214");
 m_Code128.Rows.Add("70", "ACK", "f", "70", "112412");
 m_Code128.Rows.Add("71", "BEL", "g", "71", "122114");
 m_Code128.Rows.Add("72", "BS", "h", "72", "122411");
 m_Code128.Rows.Add("73", "HT", "i", "73", "142112");
 m_Code128.Rows.Add("74", "LF", "j", "74", "142211");
 m_Code128.Rows.Add("75", "VT", "k", "75", "241211");
 m_Code128.Rows.Add("76", "FF", "I", "76", "221114");
 m_Code128.Rows.Add("77", "CR", "m", "77", "413111");
 m_Code128.Rows.Add("78", "SO", "n", "78", "241112");
 m_Code128.Rows.Add("79", "SI", "o", "79", "134111");
 m_Code128.Rows.Add("80", "DLE", "p", "80", "111242");
 m_Code128.Rows.Add("81", "DC1", "q", "81", "121142");
 m_Code128.Rows.Add("82", "DC2", "r", "82", "121241");
 m_Code128.Rows.Add("83", "DC3", "s", "83", "114212");
 m_Code128.Rows.Add("84", "DC4", "t", "84", "124112");
 m_Code128.Rows.Add("85", "NAK", "u", "85", "124211");
 m_Code128.Rows.Add("86", "SYN", "v", "86", "411212");
 m_Code128.Rows.Add("87", "ETB", "w", "87", "421112");
 m_Code128.Rows.Add("88", "CAN", "x", "88", "421211");
 m_Code128.Rows.Add("89", "EM", "y", "89", "212141");
 m_Code128.Rows.Add("90", "SUB", "z", "90", "214121");
 m_Code128.Rows.Add("91", "ESC", "{", "91", "412121");
 m_Code128.Rows.Add("92", "FS", "|", "92", "111143");
 m_Code128.Rows.Add("93", "GS", "}", "93", "111341");
 m_Code128.Rows.Add("94", "RS", "~", "94", "131141");
 m_Code128.Rows.Add("95", "US", "DEL", "95", "114113");
 m_Code128.Rows.Add("96", "FNC3", "FNC3", "96", "114311");
 m_Code128.Rows.Add("97", "FNC2", "FNC2", "97", "411113");
 m_Code128.Rows.Add("98", "SHIFT", "SHIFT", "98", "411311");
 m_Code128.Rows.Add("99", "CODEC", "CODEC", "99", "113141");
 m_Code128.Rows.Add("100", "CODEB", "FNC4", "CODEB", "114131");
 m_Code128.Rows.Add("101", "FNC4", "CODEA", "CODEA", "311141");
 m_Code128.Rows.Add("102", "FNC1", "FNC1", "FNC1", "411131");
 m_Code128.Rows.Add("103", "StartA", "StartA", "StartA", "211412");
 m_Code128.Rows.Add("104", "StartB", "StartB", "StartB", "211214");
 m_Code128.Rows.Add("105", "StartC", "StartC", "StartC", "211232");
 m_Code128.Rows.Add("106", "Stop", "Stop", "Stop", "2331112");
 #endregion
 }
 /// <summary>
 /// 获取128图形
 /// </summary>
 /// <param name="p_Text">文字</param>
 /// <param name="p_Code">编码</param> 
 /// <returns>图形</returns>
 public Bitmap GetCodeImage(string p_Text, Encode p_Code)
 {
 string _ViewText = p_Text;
 string _Text = "";
 IList<int> _TextNumb = new List<int>();
 int _Examine = 0; //首位
 switch (p_Code)
 {
 case Encode.Code128C:
 _Examine = 105;
 if (!((p_Text.Length & 1) == 0)) throw new Exception("128C长度必须是偶数");
 while (p_Text.Length != 0)
 {
 int _Temp = 0;
 try
 {
 int _CodeNumb128 = Int32.Parse(p_Text.Substring(0, 2));
 }
 catch
 {
 throw new Exception("128C必须是数字!");
 }
 _Text += GetValue(p_Code, p_Text.Substring(0, 2), ref _Temp);
 _TextNumb.Add(_Temp);
 p_Text = p_Text.Remove(0, 2);
 }
 break;
 case Encode.EAN128:
 _Examine = 105;
 if (!((p_Text.Length & 1) == 0)) throw new Exception("EAN128长度必须是偶数");
 _TextNumb.Add(102);
 _Text += "411131";
 while (p_Text.Length != 0)
 {
 int _Temp = 0;
 try
 {
 int _CodeNumb128 = Int32.Parse(p_Text.Substring(0, 2));
 }
 catch
 {
 throw new Exception("128C必须是数字!");
 }
 _Text += GetValue(Encode.Code128C, p_Text.Substring(0, 2), ref _Temp);
 _TextNumb.Add(_Temp);
 p_Text = p_Text.Remove(0, 2);
 }
 break;
 default:
 if (p_Code == Encode.Code128A)
 {
 _Examine = 103;
 }
 else
 {
 _Examine = 104;
 }
 while (p_Text.Length != 0)
 {
 int _Temp = 0;
 string _ValueCode = GetValue(p_Code, p_Text.Substring(0, 1), ref _Temp);
 if (_ValueCode.Length == 0) throw new Exception("无效的字符集!" + p_Text.Substring(0, 1).ToString());
 _Text += _ValueCode;
 _TextNumb.Add(_Temp);
 p_Text = p_Text.Remove(0, 1);
 }
 break;
 }
 if (_TextNumb.Count == 0) throw new Exception("错误的编码,无数据");
 _Text = _Text.Insert(0, GetValue(_Examine)); //获取开始位
 for (int i = 0; i != _TextNumb.Count; i++)
 {
 _Examine += _TextNumb[i] * (i + 1);
 }
 _Examine = _Examine % 103; //获得严效位
 _Text += GetValue(_Examine); //获取严效位
 _Text += "2331112"; //结束位
 Bitmap _CodeImage = GetImage(_Text);
 GetViewText(_CodeImage, _ViewText);
 return _CodeImage;
 }
 /// <summary>
 /// 获取目标对应的数据
 /// </summary>
 /// <param name="p_Code">编码</param>
 /// <param name="p_Value">数值 A b 30</param>
 /// <param name="p_SetID">返回编号</param>
 /// <returns>编码</returns>
 private string GetValue(Encode p_Code, string p_Value, ref int p_SetID)
 {
 if (m_Code128 == null) return "";
 DataRow[] _Row = m_Code128.Select(p_Code.ToString() + "='" + p_Value + "'");
 if (_Row.Length != 1) throw new Exception("错误的编码" + p_Value.ToString());
 p_SetID = Int32.Parse(_Row[0]["ID"].ToString());
 return _Row[0]["BandCode"].ToString();
 }
 /// <summary>
 /// 根据编号获得条纹
 /// </summary>
 /// <param name="p_CodeId"></param>
 /// <returns></returns>
 private string GetValue(int p_CodeId)
 {
 DataRow[] _Row = m_Code128.Select("ID='" + p_CodeId.ToString() + "'");
 if (_Row.Length != 1) throw new Exception("验效位的编码错误" + p_CodeId.ToString());
 return _Row[0]["BandCode"].ToString();
 }
 /// <summary>
 /// 获得条码图形
 /// </summary>
 /// <param name="p_Text">文字</param>
 /// <returns>图形</returns>
 private Bitmap GetImage(string p_Text)
 {
 char[] _Value = p_Text.ToCharArray();
 int _Width = 0;
 for (int i = 0; i != _Value.Length; i++)
 {
 _Width += Int32.Parse(_Value[i].ToString()) * (m_Magnify + 1);
 }
 Bitmap _CodeImage = new Bitmap(_Width, (int)m_Height);
 Graphics _Garphics = Graphics.FromImage(_CodeImage);
 //Pen _Pen;
 int _LenEx = 0;
 for (int i = 0; i != _Value.Length; i++)
 {
 int _ValueNumb = Int32.Parse(_Value[i].ToString()) * (m_Magnify + 1); //获取宽和放大系数
 if (!((i & 1) == 0))
 {
 //_Pen = new Pen(Brushes.White, _ValueNumb);
 _Garphics.FillRectangle(Brushes.White, new Rectangle(_LenEx, 0, _ValueNumb, (int)m_Height));
 }
 else
 {
 //_Pen = new Pen(Brushes.Black, _ValueNumb);
 _Garphics.FillRectangle(Brushes.Black, new Rectangle(_LenEx, 0, _ValueNumb, (int)m_Height));
 }
 //_Garphics.(_Pen, new Point(_LenEx, 0), new Point(_LenEx, m_Height));
 _LenEx += _ValueNumb;
 }
 _Garphics.Dispose();
 return _CodeImage;
 }
 /// <summary>
 /// 显示可见条码文字 如果小于40 不显示文字
 /// </summary>
 /// <param name="p_Bitmap">图形</param> 
 private void GetViewText(Bitmap p_Bitmap, string p_ViewText)
 {
 if (m_ValueFont == null) return;
 Graphics _Graphics = Graphics.FromImage(p_Bitmap);
 SizeF _DrawSize = _Graphics.MeasureString(p_ViewText, m_ValueFont);
 if (_DrawSize.Height > p_Bitmap.Height - 10 || _DrawSize.Width > p_Bitmap.Width)
 {
 _Graphics.Dispose();
 return;
 }
 int _StarY = p_Bitmap.Height - (int)_DrawSize.Height;
 _Graphics.FillRectangle(Brushes.White, new Rectangle(0, _StarY, p_Bitmap.Width, (int)_DrawSize.Height));
 _Graphics.DrawString(p_ViewText, m_ValueFont, Brushes.Black, 0, _StarY);
 }
 //12345678
 //(105 + (1 * 12 + 2 * 34 + 3 * 56 + 4 *78)) % 103 = 47
 //结果为starc +12 +34 +56 +78 +47 +end
 internal Image GetCodeImage(string p)
 {
 throw new NotImplementedException();
 }
 }

这样一来,操作员手上没有多的条码,必须包装完成之后系统才会一对一的打印一份条码出来,完成一个产品的包装就贴一个条码,很大程度上面避免了条码混乱的问题.

已完成的部分功能

#1工单维护:这个一般都是由PMC完成的,PMC根据排期计划合理创建工单,如果企业上了SAP系统,也可以直接链接到SAP系统进行下载工单资料,这样就更方便了.

生产制造追溯系统之在线打印功能

#2工单优先级:PMC在创建工单的时候会指定该信息,生产过程中系统会体现该信息,起到提示用户的目的,管理者可根据实际情况随时变更该信息。

生产制造追溯系统之在线打印功能

#3工艺路线维护:工艺路线由 IE 完成,生产部根据 IE 制定的工艺路线进行生产,系统会检测每一个工序的通过情况,比如上一个工序没有做则不可以直接跳到下一个工序。

生产制造追溯系统之在线打印功能

#4目检过站:操作扫描条码过站,必须按照 IE 制定的工艺路线进行,如果扫描的条码不在当前工序,则系统会提示当前条码的正确位置。

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

#5目检过站:系统会将不良品强制打入维修中心,在完成修理之前无法进行其它的操作。

生产制造追溯系统之在线打印功能

#6组装动态装配:系统支持动态配置装配规则,不同的工单采用不同的规则进行装配,每一个装配条码可独立配置条码规则,比如长度、前缀等信息,防止用户输入错误。

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

#7FQC送检:系统采用 AQL 标准动态抽检,打破传统的抽检模式,由系统自动计算需要抽检的产品,同时也由系统自动根据 AQL 标准进行结果判定,有效帮助品质人员进行品质监控与管理。

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

#8FQC抽检:生产方面将产品以批次单位送检至QC,系统提示QC需要抽检的产品序列号,QC针对需要抽检的产品检测并录入抽检结果,系统根据抽检情况按照 AQL 自动判定.

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

#9包装规则:针对每个工单配置相应的包装规则,比如卡通箱容量、箱号长度、箱号前缀等信息,并上传卡通标签模板。

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

#10包装:包装规则配置完成之后,即可扫描条码进行包装了。

生产制造追溯系统之在线打印功能

结束包装的时候,系统自动将标签打印出来.

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

#11不良品维修:生产过程中的不良都会被系统强制打入维修中心,必须经过修理之后才能进行其它工序。

生产制造追溯系统之在线打印功能

#12不良预警:系统会自动监控指定生产线的不良情况,当不良情况达到了红色预警值,则触发警报,系统自动锁定当前生产线,由管理者分析不良原因并改善之后进行解除预警。

生产制造追溯系统之在线打印功能

#13成品发货:成品发货过程中支持上传实物图片。

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

#14品质异常报告:用户发起品质异常,由工程部分析原因并给出改善,由QA确认是否可行。

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

#15部分报表:

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

#16电子看板:

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

生产制造追溯系统之在线打印功能

结尾

生产制造追溯系统之在线打印功能

因为工作日需要上班,白天必须做公司的事情,所以只有每天晚上熬夜和周末来做这个项目,说真的还是有点累,如果您觉得文章过得去,还请多多支持,谢谢各位园友!!

总结

以上所述是小编给大家介绍的生产制造追溯系统之在线打印功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Javascript 相关文章推荐
解决使用attachEvent函数时,this指向被绑定的元素的问题的方法
Aug 13 Javascript
js实现图片和链接文字同步切换特效的方法
Feb 20 Javascript
老生常谈onBlur事件与onfocus事件(js)
Jul 09 Javascript
Bootstrap插件全集
Jul 18 Javascript
JavaScript实现实时更新系统时间的实例代码
Apr 04 Javascript
Angular2 组件交互实例详解
Aug 24 Javascript
react redux入门示例
Apr 19 Javascript
解决Vue.js由于延时显示了{{message}}引用界面的问题
Aug 25 Javascript
微信小程序显示倒计时功能示例【测试可用】
Dec 03 Javascript
微信小程序实现提交input信息到后台的方法示例
Jan 19 Javascript
JQuery实现折叠式菜单的详细代码
Jun 03 jQuery
Vue实现圆环进度条的示例
Feb 06 Vue.js
产制造追溯系统之通过微信小程序实现移动端报表平台
Jun 03 #Javascript
深入理解 JS 垃圾回收
Jun 03 #Javascript
如何让微信小程序页面之间的通信不再变困难
Jun 03 #Javascript
使用VueRouter的addRoutes方法实现动态添加用户的权限路由
Jun 03 #Javascript
使用watch在微信小程序中实现全局状态共享
Jun 03 #Javascript
深入理解JS异步编程-Promise
Jun 03 #Javascript
模块化react-router配置方法详解
Jun 03 #Javascript
You might like
web方式ftp
2006/10/09 PHP
非常好用的Zend Framework分页类
2014/06/25 PHP
php自定义apk安装包实例
2014/10/20 PHP
PHP开发的微信现金红包功能示例
2017/06/29 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
2018/11/29 PHP
php精度计算的问题解析
2019/06/21 PHP
javascript removeChild 使用注意事项
2009/04/11 Javascript
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
jQuery的写法不同导致的兼容性问题的解决方法
2010/07/29 Javascript
判断客户端浏览器是否安装了Flash插件的多种方法
2010/08/11 Javascript
JQuery 常用方法和事件详细介绍
2013/04/18 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
node.js回调函数之阻塞调用与非阻塞调用
2015/11/13 Javascript
input file上传 图片预览功能实例代码
2016/10/25 Javascript
详解vue之页面缓存问题(基于2.0)
2017/01/10 Javascript
html中通过JS获取JSON数据并加载的方法
2017/11/30 Javascript
微信小程序 如何引入外部字体库iconfont的图标
2018/01/31 Javascript
微信小程序云开发之新手环境配置
2019/05/16 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
2020/03/02 Javascript
在Vue中使用Viser说明(基于AntV-G2可视化引擎)
2020/10/28 Javascript
django加载本地html的方法
2018/05/27 Python
Python Image模块基本图像处理操作小结
2019/04/13 Python
Python实现实时数据采集新型冠状病毒数据实例
2020/02/04 Python
python判断变量是否为列表的方法
2020/09/17 Python
python中pyqtgraph知识点总结
2021/01/26 Python
htnl5利用svg页面高斯模糊的方法
2018/07/20 HTML / CSS
Java里面Pass by value和Pass by Reference是什么意思
2016/05/02 面试题
军训生自我鉴定范文
2013/12/27 职场文书
学校先进集体事迹材料
2014/05/31 职场文书
整改落实情况汇报材料
2014/10/29 职场文书
幼儿教师个人总结
2015/02/05 职场文书
2015年办公室工作总结范文
2015/03/31 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
Ajax请求超时与网络异常处理图文详解
2021/05/23 Javascript
PHP中strval()函数实例用法
2021/06/07 PHP