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


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 相关文章推荐
jQuery学习4 浏览器的事件模型
Feb 07 Javascript
javascript学习之闭包分析
Dec 02 Javascript
js写一个弹出层并锁屏效果实现代码
Dec 07 Javascript
extjs两个tbar问题探讨
Aug 08 Javascript
实例详解JSON数据格式及json格式数据域字符串相互转换
Jan 07 Javascript
Bootstrap每天必学之折叠(Collapse)插件
Apr 25 Javascript
jQuery Easy UI中根据第一个下拉框选中的值设置第二个下拉框是否可以编辑
Nov 29 Javascript
JavaScript实现省市联动过程中bug的解决方法
Dec 04 Javascript
JavaScript变量作用域及内存问题实例分析
Jun 10 Javascript
微信小程序swiper使用网络图片不显示问题解决
Dec 13 Javascript
javascript设计模式 ? 享元模式原理与用法实例分析
Apr 15 Javascript
Vue 401配合Vuex防止多次弹框的案例
Nov 11 Javascript
产制造追溯系统之通过微信小程序实现移动端报表平台
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
新浪SAE云平台下使用codeigniter的数据库配置
2014/06/12 PHP
php判断对象是派生自哪个类的方法
2015/06/20 PHP
Laravel源码解析之路由的使用和示例详解
2018/09/27 PHP
Laravel5.5 手动分页和自定义分页样式的简单实现
2019/10/15 PHP
Yii框架自定义数据库操作组件示例
2019/11/11 PHP
JS之小练习代码
2008/10/12 Javascript
ExtJs 表单提交登陆实现代码
2010/08/19 Javascript
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
jquery下jstree简单应用 - v1.0
2011/04/14 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
微信小程序实现列表下拉刷新上拉加载
2020/07/29 Javascript
Vue项目中最新用到的一些实用小技巧
2018/11/06 Javascript
javascript利用键盘控制小方块的移动
2020/04/20 Javascript
JavaScript中的全局属性与方法深入解析
2020/06/14 Javascript
vue集成openlayers加载geojson并实现点击弹窗教程
2020/09/24 Javascript
解决Vue-cli无法编译es6的问题
2020/10/30 Javascript
python中global与nonlocal比较
2014/11/21 Python
Python实现包含min函数的栈
2016/04/29 Python
Python探索之pLSA实现代码
2017/10/25 Python
python实现五子棋游戏
2019/06/18 Python
使用python对多个txt文件中的数据进行筛选的方法
2019/07/10 Python
win10下opencv-python特定版本手动安装与pip自动安装教程
2020/03/05 Python
详解python使用金山词霸的翻译功能(调试工具断点的使用)
2021/01/07 Python
css3实现图片遮罩效果鼠标hover以后出现文字
2013/11/05 HTML / CSS
HTML5制作酷炫音频播放器插件图文教程
2014/12/30 HTML / CSS
New Balance俄罗斯官方网上商店:购买运动鞋
2020/03/02 全球购物
什么是Deployment descriptors;都有什么类型的部署描述符
2015/07/28 面试题
用JAVA实现一种排序,JAVA类实现序列化的方法(二种)
2014/04/23 面试题
就业推荐自我鉴定
2013/10/06 职场文书
法制教育演讲稿
2014/09/10 职场文书
2014年便民服务中心工作总结
2014/12/20 职场文书
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL
MySQL中B树索引和B+树索引的区别详解
2022/03/03 MySQL
Nginx流量拷贝ngx_http_mirror_module模块使用方法详解
2022/04/07 Servers
pandas中pd.groupby()的用法详解
2022/06/16 Python