• lodop打印收费小票


      1 //收费系统打印机功能:收费/退费,需要使用到lodop
      2 var LODOP;//打印机
      3 $(function () {
      4     //初始化
      5     $("body").append('<object  id="LODOP_OB" classid="clsid:2105C259-1E0C-4534-8141-A753534CB4CA" width=0 height=0> <embed id="LODOP_EM" type="application/x-print-lodop" width=0 height=0></embed></object>');
      6     
      7     LODOP = getLodop();
      8 });
      9 
     10 //检测是否安装了打印插件
     11 function CheckLodop()
     12 {
     13     var oOBJECT = document.getElementById('LODOP_OB'), oEMBED = document.getElementById('LODOP_EM');
     14     var LODOP = oEMBED;
     15     try {
     16         var isIE = (navigator.userAgent.indexOf('MSIE') >= 0) || (navigator.userAgent.indexOf('Trident') >= 0);
     17         var is64IE = isIE && (navigator.userAgent.indexOf('x64') >= 0);
     18         if (isIE) LODOP = oOBJECT;
     19         if ((LODOP == null) || (typeof (LODOP.VERSION) == "undefined")) {
     20             return false;
     21         } else
     22             if (LODOP.VERSION < "6.1.6.1") {
     23                 return false;
     24             }
     25         return true;
     26     } catch (err) {
     27         return false;
     28     }
     29 }
     30 
     31 function getLodop() {
     32     var oOBJECT = document.getElementById('LODOP_OB'), oEMBED = document.getElementById('LODOP_EM');
     33     /**************************
     34       本函数根据浏览器类型决定采用哪个对象作为控件实例:
     35       IE系列、IE内核系列的浏览器采用oOBJECT,
     36       其它浏览器(Firefox系列、Chrome系列、Opera系列、Safari系列等)采用oEMBED,
     37       对于64位浏览器指向64位的安装程序install_lodop64.exe。
     38     **************************/
     39     var strHtmInstall = "打印控件未安装!点击这里<a href='/patch/install_lodop32.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。";
     40     var strHtmUpdate = "打印控件需要升级!点击这里<a href='/patch/install_lodop32.exe' target='_self'>执行升级</a>,升级后请重新进入。";
     41     var strHtm64_Install = "打印控件未安装!点击这里<a href='/patch/install_lodop64.exe' target='_self'>执行安装</a>,安装后请刷新页面或重新进入。";
     42     var strHtm64_Update = "打印控件需要升级!点击这里<a href='/patch/install_lodop64.exe' target='_self'>执行升级</a>,升级后请重新进入。";
     43     var strHtmFireFox = "注意:如曾安装过Lodop旧版附件npActiveXPLugin,请在【工具】->【附加组件】->【扩展】中先卸它。";
     44     var LODOP = oEMBED;
     45     try {
     46         var isIE = (navigator.userAgent.indexOf('MSIE') >= 0) || (navigator.userAgent.indexOf('Trident') >= 0);
     47         var is64IE = isIE && (navigator.userAgent.indexOf('x64') >= 0);
     48         var errhtml = '';
     49         if (isIE) LODOP = oOBJECT;
     50         if ((LODOP == null) || (typeof (LODOP.VERSION) == "undefined")) {
     51             if (navigator.userAgent.indexOf('Firefox') >= 0)
     52             {
     53                 errhtml = strHtmFireFox
     54             }
     55             if (is64IE) {
     56                 errhtml = strHtm64_Install;
     57             }
     58             else if (isIE) {
     59                 errhtml = strHtmInstall;
     60             }
     61             else
     62             {
     63                 errhtml = strHtmInstall;
     64             }
     65             ShowPrintErr(errhtml);
     66             return LODOP;
     67         } else {
     68             if (LODOP.VERSION < "6.1.6.1") {
     69                 if (is64IE) {
     70                     errhtml = strHtm64_Update;
     71                 }
     72                 else if (isIE) {
     73                     errhtml = strHtmUpdate;
     74                 }
     75                 else {
     76                     errhtml = strHtmUpdate;
     77                 }
     78                 ShowPrintErr(errhtml);
     79                 return LODOP;
     80             }
     81         }
     82         //=====如下空白位置适合调用统一功能:=====         
     83 
     84 
     85         //=======================================
     86         return LODOP;
     87     } catch (err) {
     88         if (is64IE)
     89         {
     90             errhtml = "Error:" + strHtm64_Install;
     91         }
     92         else
     93         {
     94             errhtml = "Error:" + strHtmInstall;
     95         }
     96         ShowPrintErr(errhtml);
     97         return LODOP;
     98     }
     99     return LODOP;
    100 }
    101 
    102 function ShowPrintErr(h)
    103 {
    104     if (h)
    105     {
    106         h = "<p>" + h;
    107         h += " <span id='az_close' style='cursor:pointer;display:inline-block;position:absolute;right:0;' title='点击关闭'>X</span></p>";
    108         $(".az_remind").html(h).fadeIn(2000);
    109         $("#az_close").click(function () {
    110             $(".az_remind").fadeOut(2000);
    111         });
    112         setTimeout(function () { $(".az_remind").fadeOut(2000); }, 5000);
    113     }
    114 }
    115 
    116 (function ($) {
    117     function PrintBase(printObj) {
    118         this.nf = { FontName: '宋体', FontSize: 9 };
    119         this.hf = { FontName: '宋体', FontSize: 20 };
    120         this.printObj = printObj;
    121         this.printBegin = function () {
    122             LODOP.PRINT_INIT("票据" + Math.random());
    123             LODOP.SET_PRINTER_INDEXA(printObj.PrintSet.printerName);
    124             LODOP.SET_PRINT_MODE("POS_BASEON_PAPER", true);
    125         };
    126         this.DX = function (num) {
    127             var strOutput = "";
    128             var strUnit = '仟佰拾亿仟佰拾万仟佰拾元角分';
    129             num += "00";
    130             var intPos = num.indexOf('.');
    131             if (intPos >= 0)
    132                 num = num.substring(0, intPos) + num.substr(intPos + 1, 2);
    133             strUnit = strUnit.substr(strUnit.length - num.length);
    134             for (var i = 0; i < num.length; i++)
    135                 strOutput += '零壹贰叁肆伍陆柒捌玖'.substr(num.substr(i, 1), 1) + strUnit.substr(i, 1);
    136             return strOutput.replace(/零角零分$/, '整').replace(/零[仟佰拾]/g, '零').replace(/零{2,}/g, '零').replace(/零([亿|万])/g, '$1').replace(/零+元/, '元').replace(/亿零{0,3}万/, '亿').replace(/^元/, "零元");
    137         };
    138         this.printEnd = function () {
    139             LODOP.PRINT();
    140         };
    141         this.printFee = function () { };
    142         this.printFeeRefund = function () { };
    143         this.measureString = function (s, f) {
    144             //计算文字宽度
    145             return {  s.length * f.FontSize, height: f.FontSize };
    146         }
    147         this.printLine = function (x1, y1, x2) {
    148             LODOP.ADD_PRINT_Line(y1, x1,y1, x2, 0, 1);
    149         };
    150         this.printString = function (s, f, x, y) {
    151             LODOP.ADD_PRINT_TEXT(y, x, 1000, 25, s);
    152             LODOP.SET_PRINT_STYLEA(0, "FontName", f.FontName);
    153             LODOP.SET_PRINT_STYLEA(0, "FontSize", f.FontSize);
    154         };
    155     }
    156     function PrinterPinA(printObj, printCopys, printCopysYAdd,y5,y6,y7,y8,y9) {
    157         PrintBase.call(this, printObj);
    158         this.maxCount = 12;
    159         this.currentPage = 1;
    160         this.xTitle = 370;
    161         this.yy = 25;
    162         this.x1 = 70;
    163         this.x2 = 200;
    164         this.x3 = 330;
    165         this.x4 = 460;
    166         this.x5 = 630;
    167         this.x6 = 727;
    168         this.y1 = 65;
    169         this.y2 = 80;
    170         this.y3 = 90;
    171         this.y4 = 115;
    172         this.y5 = y5;
    173         this.y6 = y6;
    174         this.y7 = y7;
    175         this.y8 = y8;
    176         this.y9 = y9;
    177         this.printCopys = printCopys;
    178         this.printCopysYAdd = printCopysYAdd;
    179         this.totalPages = Math.ceil(printObj.listFee.length / this.maxCount);
    180         this.printNormal = function (yAdd) {
    181             if (yAdd > 0) {
    182                 this.printLine(0, yAdd, 900);
    183             }
    184             var title = this.printObj.schName + this.printObj.title;
    185 
    186             //计算文字宽度
    187             var xTemp = (844 - this.measureString(title, this.hf).width) / 2;
    188             this.printString(title, this.hf, xTemp, this.yy + yAdd);
    189             this.printString("班级:" + this.printObj.clsName, this.nf, this.x1, this.y1 + yAdd);
    190             this.printString("姓名:" + this.printObj.userName, this.nf, this.x2, this.y1 + yAdd);
    191             this.printString("日期:" + this.printObj.payTime, this.nf, this.x4, this.y1 + yAdd);
    192             this.printString("单号:" + this.printObj.serialNum, this.nf, this.x5, this.y1 + yAdd);
    193             this.printLine(this.x1, this.y2 + yAdd, this.x6);
    194             this.printLine(this.x1, this.y6 + yAdd, this.x6);
    195             this.printString("合计:", this.nf, this.x1, this.y5 + yAdd);
    196             var printphoneX = this.x1;
    197             var printaddressY = this.y7;
    198             if (printObj.schName) {
    199                 printphoneX = this.x2;
    200                 printaddressY = this.y8;
    201                 this.printString(printObj.schName, this.nf, this.x1, this.y7 + yAdd);
    202             }
    203             if (printObj.tel) {
    204                 printaddressY = this.y8;
    205                 this.printString("电话:" + printObj.tel, this.nf, printphoneX, this.y7 + yAdd);
    206             }
    207             if (printObj.printSeal) {
    208                 printaddressY = this.y8;
    209                 this.printString("盖章", this.nf, this.x5, this.y7 + yAdd);
    210             }
    211             if (printObj.schAddress) {
    212                 this.printString("地址:" + printObj.schAddress, this.nf, this.x1, printaddressY + yAdd);
    213             }
    214             var fstr = "退款人";
    215             if (printObj.feeType==1) {
    216                 fstr = "收款人";
    217             }
    218             fstr += ":" + printObj.payee;
    219             this.printString(fstr, this.nf, this.x5, printaddressY + yAdd);
    220         };
    221         this.printFee = function () {//打印收费
    222             this.printBegin();
    223             for (var i = 0; i < this.printCopys; i++) {
    224                 var yAdd = i * this.printCopysYAdd;
    225                 this.printNormal(yAdd);
    226                 var total = 0, real = 0, qian = 0, discount = 0;
    227                 var y = this.y4 + yAdd;
    228                 this.printString("项目", this.nf, this.x1, this.y3 + yAdd);
    229                 this.printString("应收金额(元)", this.nf, this.x2, this.y3 + yAdd);
    230                 this.printString("实收金额(元)", this.nf, this.x3, this.y3 + yAdd);
    231                 this.printString("备注", this.nf, this.x4, this.y3 + yAdd);
    232 
    233                 //遍历打印
    234                 for (var j = (this.currentPage - 1) * this.maxCount; j < printObj.listFee.length && j < this.currentPage * this.maxCount; j++) {
    235                     var temp = printObj.listFee[j];
    236                     this.printString(temp.feeName, this.nf, this.x1, y);
    237                     this.printString(temp.totalMoney.toFixed(2), this.nf, this.x2, y);
    238                     this.printString(temp.realMoney.toFixed(2), this.nf, this.x3, y);
    239                     this.printString(temp.payMsg, this.nf, this.x4, y);
    240 
    241                     total += temp.totalMoney;
    242                     real += temp.realMoney;
    243                     qian += temp.qianOldMoney;
    244                     discount += temp.discountMoney;
    245                     y += this.yy;
    246                 }
    247 
    248                 this.printString("应收:" + total.toFixed(2) + "元", this.nf, this.x2, this.y5 + yAdd);
    249                 this.printString("实收:" + real.toFixed(2) + "元", this.nf, this.x3, this.y5 + yAdd);
    250                 this.printString("大写:" + this.DX(real), this.nf, this.x4, this.y5 + yAdd);
    251                 if (qian) {
    252                     this.printString("欠费:" + qian.toFixed(2) + "元", this.nf, this.x3, this.y9 + yAdd);
    253                 }
    254                 if (discount) {
    255                     this.printString("减免:" + discount.toFixed(2) + "元", this.nf, this.x4, this.y9 + yAdd);
    256                 }
    257             }
    258             this.printEnd();
    259             if (this.currentPage * this.maxCount < printObj.listFee.length) {
    260                 this.currentPage++;
    261                 this.printFee();
    262             }
    263         };
    264         this.printFeeRefund = function () {//打印退费
    265             this.printBegin();
    266             for (var i = 0; i < this.printCopys; i++) {
    267                 var yAdd = i * this.printCopysYAdd;
    268                 this.printNormal(yAdd);
    269                 var real = 0;
    270                 var y = this.y4 + yAdd;
    271                 this.printString("退费项目", this.nf, this.x1, this.y3 + yAdd);
    272                 this.printString("退费金额(元)", this.nf, this.x3, this.y3 + yAdd);
    273                 this.printString("备注", this.nf, this.x4, this.y3 + yAdd);
    274 
    275                 //遍历打印
    276                 for (var j = (this.currentPage - 1) * this.maxCount; j < printObj.listFee.length && j < this.currentPage * this.maxCount; j++) {
    277                     var temp = printObj.listFee[j];
    278                     this.printString(temp.feeName, this.nf, this.x1, y);
    279                     this.printString(temp.realMoney.toFixed(2), this.nf, this.x3, y);
    280                     this.printString(temp.payMsg, this.nf, this.x4, y);
    281 
    282                     real += temp.realMoney;
    283                     y += this.yy;
    284                 }
    285 
    286                 this.printString("退费:" + real.toFixed(2) + "元", this.nf, this.x3, this.y5 + yAdd);
    287                 this.printString("大写:" + this.DX(real), this.nf, this.x4, this.y5 + yAdd);
    288             }
    289             this.printEnd();
    290             if (this.currentPage * this.maxCount < printObj.listFee.length) {
    291                 this.currentPage++;
    292                 this.printFee();
    293             }
    294         }
    295     }
    296 
    297     function PrinterPin140(printObj) {//a4 2等分
    298         PrinterPinA.call(this, printObj, 1, -1, 415, 455, 465, 490, 440);
    299     }
    300 
    301     function PrinterPinA4(printObj)//a4 双份
    302     {
    303         PrinterPinA.call(this, printObj, 2, 540, 415, 455, 465, 490, 440);
    304     }
    305     function PrinterPin93(printObj) {
    306         PrinterPinA.call(this, printObj, 1, -1, 265, 305, 310, 335, 290);
    307     }
    308     function PrinterTicket(printObj,x1,x2,x3,x4,totalWidth,hfSize,hf2Size,addrSize)
    309     {
    310         PrintBase.call(this, printObj);
    311         this.y = 5;
    312         this.x1 = x1;
    313         this.x2 = x2;
    314         this.x3 = x3;
    315         this.x4 = x4;
    316         this.yy = 15;
    317         this.yh = 20;
    318         this.yx = 10;
    319         this.totalWidth = totalWidth;
    320         this.addrSize = addrSize;
    321         this.hf = { FontName: '宋体', FontSize: hfSize };
    322         this.hf2 = { FontName: '宋体', FontSize: hf2Size };
    323         this.printFoot = function (total, qian, real, discount) {
    324             this.printLine(this.x1, this.y, this.totalWidth - this.x1);
    325             this.y += this.yx;
    326             this.printString("合计:" + printObj.listFee.length + "项", this.nf, this.x1, this.y);
    327             this.y += this.yy;
    328             if (printObj.feeType) {
    329                 this.printString("应收:" + total.toFixed(2) + "元", this.nf, this.x1, this.y);
    330                 this.y += this.yy;
    331                 if (qian) {
    332                     this.printString("欠费:" + qian.toFixed(2) + "元", this.nf, this.x1, this.y);
    333                     this.y += this.yy;
    334                 }
    335                 if (discount) {
    336                     this.printString("减免:" + discount.toFixed(2) + "元", this.nf, this.x1, this.y);
    337                     this.y += this.yy;
    338                 }
    339                 this.printString("实收:" + real.toFixed(2) + "元", this.nf, this.x1, this.y);
    340                 this.y += this.yy;
    341             } else {
    342                 this.printString("退费:" + real.toFixed(2) + "元", this.nf, this.x1, this.y);
    343                 this.y += this.yy;
    344             }
    345             this.printString("大写:" + this.DX(real), this.nf, this.x1, this.y);
    346             this.y += this.yy;
    347             var fstr = "退款人";
    348             if (printObj.feeType==1) {
    349                 fstr = "收款人";
    350             }
    351             fstr += ":" + printObj.payee;
    352             this.printString(fstr, this.nf, this.x1, this.y);
    353             this.y += this.yy;
    354             if (printObj.tel || printObj.schAddress) {
    355                 this.printLine(this.x1, this.y, (this.totalWidth - this.x1));
    356                 this.y += this.yx;
    357             }
    358             if (printObj.tel) {
    359                 this.printString("电话:" + printObj.tel, this.nf, this.x1, this.y);
    360                 this.y += this.yy;
    361             }
    362             if (printObj.schAddress) {
    363                 var add1 = printObj.schAddress;
    364                 var add2 = '';
    365                 //判断要打印的行数
    366                 var rows = Math.ceil(add1.length / this.addrSize);
    367                 for (var i = 0; i < rows; i++) {
    368                     var end=(i+1)*this.addrSize;
    369                     if(end>add1.length)end=add1.length;
    370                     var temp = add1.substring(i * this.addrSize, end);
    371                     if (i == 0) {
    372                         this.printString("地址:" + temp, this.nf, this.x1, this.y);
    373                     } else {
    374                         this.printString(temp, this.nf, this.x1 * 8, this.y);
    375                     }
    376                     this.y += this.yy;
    377                 }
    378             }
    379         };
    380         this.printHead = function () {
    381             if (printObj.schName) {
    382                 var fs = this.measureString(printObj.schName, this.hf);
    383                 var xtemp1 = (this.totalWidth - fs.width) / 2;
    384                 this.printString(printObj.schName, this.hf, xtemp1, this.y);
    385                 this.y += this.yh;
    386             }
    387             var f2 = this.measureString(printObj.title, this.hf2);
    388             var xtemp2 = (this.totalWidth - f2.width) / 2;
    389             this.printString(printObj.title, this.hf2, xtemp2, this.y);
    390             this.y += this.yh;
    391             this.printString("日期:" + printObj.payTime, this.nf, this.x1, this.y);
    392             this.printString("单号:" + printObj.serialNum, this.nf, this.x2, this.y);
    393             this.y += this.yy;
    394             this.printString("姓名:" + printObj.userName, this.nf, this.x1, this.y);
    395             this.printString("班级:" + printObj.clsName, this.nf, this.x2, this.y);
    396             this.y += this.yy;
    397             this.printLine(this.x1, this.y, this.totalWidth - this.x1);
    398             this.y += this.yx;
    399         };
    400         this.printFee = function () {//打印收费
    401             this.printBegin();
    402             this.printHead();
    403             var total = 0, real = 0, qian = 0, discount = 0;
    404             this.printString("项目", this.nf, this.x1, this.y);
    405             this.printString("应收(元)", this.nf, this.x3, this.y);
    406             this.printString("实收(元)", this.nf, this.x4, this.y);
    407             this.y += this.yy;
    408 
    409             //遍历打印
    410             for (var j = 0; j < printObj.listFee.length; j++) {
    411                 var temp = printObj.listFee[j];
    412                 var name = temp.feeName;
    413                 if(temp.payMsg)
    414                 {
    415                     name+='(' + temp.payMsg + ')';
    416                 }
    417                 this.printString(name,this.nf, this.x1, this.y);
    418                 this.y+=this.yy;
    419                 this.printString(temp.totalMoney.toFixed(2), this.nf, this.x3, this.y);
    420                 this.printString(temp.realMoney.toFixed(2), this.nf, this.x4, this.y);
    421                 total += temp.totalMoney;
    422                 real += temp.realMoney;
    423                 qian += temp.qianOldMoney;
    424                 discount += temp.discountMoney;
    425                 this.y += this.yy;
    426             }
    427 
    428             this.printFoot(total, qian, real, discount);
    429             this.printEnd();
    430         };
    431         this.printFeeRefund = function () {//打印退费
    432             this.printBegin();
    433             this.printHead();
    434             var real = 0;
    435             this.printString("项目", this.nf, this.x1, this.y);
    436             this.printString("退费(元)", this.nf, this.x4, this.y);
    437             this.y += this.yy;
    438 
    439             //遍历打印
    440             for (var j = 0; j < printObj.listFee.length ; j++) {
    441                 var temp = printObj.listFee[j];
    442                 var name = temp.feeName;
    443                 if (temp.payMsg) {
    444                     name += '(' + temp.payMsg + ')';
    445                 }
    446                 this.printString(name, this.nf, this.x1, this.y);
    447                 this.y += this.yy;
    448                 this.printString(temp.realMoney.toFixed(2), this.nf, this.x4, this.y);
    449                 real += temp.realMoney;
    450                 this.y += this.yy;
    451             }
    452             this.printFoot(0, 0, real, 0);
    453             this.printEnd();
    454         };
    455     }
    456     function PrinterTicket80(printObj) {
    457         PrinterTicket.call(this, printObj, 5, 180, 120, 200, 280, 12, 10,20);
    458     }
    459     function PrinterTicket76(printObj) {
    460         PrinterTicket.call(this, printObj, 5, 155, 105, 185, 266, 12, 10,18);
    461     }
    462     function PrinterTicket50(printObj) {
    463         PrinterTicket.call(this, printObj, 5, 180, 60, 120, 192, 10, 8,11);
    464         this.printHead = function () {
    465             if (printObj.schName) {
    466                 var fs = this.measureString(printObj.schName, this.hf);
    467                 var xtemp1 = (this.totalWidth - fs.width) / 2;
    468                 this.printString(printObj.schName, this.hf, xtemp1, this.y);
    469                 this.y += this.yh;
    470             }
    471             var f2 = this.measureString(printObj.title, this.hf2);
    472             var xtemp2 = (this.totalWidth - f2.width) / 2;
    473             this.printString(printObj.title, this.hf2, xtemp2, this.y);
    474             this.y += this.yh;
    475             this.printString("日期:" + printObj.payTime, this.nf, this.x1, this.y);
    476             this.y += this.yy;
    477             this.printString("单号:" + printObj.serialNum, this.nf, this.x1, this.y);
    478             this.y += this.yy;
    479             this.printString("班级:" + printObj.clsName, this.nf, this.x1, this.y);
    480             this.y += this.yy;
    481             this.printString("姓名:" + printObj.userName, this.nf, this.x1, this.y);
    482             this.y += this.yy;
    483             this.printLine(this.x1, this.y, this.totalWidth - this.x1);
    484             this.y += this.yx;
    485         };
    486     }
    487     $.extend({
    488         Print: function (printObj) {
    489             if (printObj.PrintSet.printerName) {
    490                 var pt;
    491                 switch (printObj.PrintSet.printerType) {
    492                     case 1:
    493                         pt = new PrinterPin140(printObj);
    494                         break;
    495                     case 2:
    496                         pt = new PrinterPin93(printObj);
    497                         break;
    498                     case 3:
    499                         pt = new PrinterTicket80(printObj);
    500                         break;
    501                     case 4:
    502                         pt = new PrinterTicket76(printObj);
    503                         break;
    504                     case 5:
    505                         pt = new PrinterTicket50(printObj);
    506                         break;
    507                     case 6:
    508                         pt = new PrinterPinA4(printObj);
    509                         break;
    510                 }
    511                 if (pt) {
    512                     var k = 0;
    513                     var si = setInterval(function () {
    514                         if (k < printObj.PrintSet.printNumber) {
    515                             k++;
    516                             if (printObj.feeType == 1) {
    517                                 pt.printFee(printObj);
    518                             } else {
    519                                 pt.printFeeRefund(printObj);
    520                             }
    521                         }
    522                         else
    523                         {
    524                             clearInterval(si);
    525                         }
    526                     }, 200);
    527                 }
    528             }
    529         }
    530     });
    531 })(jQuery);
    View Code
  • 相关阅读:
    Test SLURM
    PGM_Foundations
    PGM-Introduction
    Functional Analysis-Metric Space
    Introduction to Machine Learning
    Time Series Analysis
    Solving Puzzles With HHT From a Engineering Perspective
    Docker-3:Data Volume
    Docker-2:network containers
    Docker-1
  • 原文地址:https://www.cnblogs.com/maomao999/p/5570259.html
Copyright © 2020-2023  润新知