金税盘、税控盘、税务UKey快速批量抄税清卡的一种方法分享

金税盘、税控盘、税务UKey快速批量抄税清卡的一种方法分享本文介绍了金税盘,税控盘,税务UKey抄税和清卡的流程,及常见的一键批量抄税,一键批量清卡的技术手段。分享使用组件进行批量抄税和清卡的核心代码。组件接口同时支持发票开具,作废,红冲等功能。

大家好,又见面了,我是你们的朋友全栈君。

1. 引言

        记得那是去年的春天,一位高中时代的老同学,也是相知相交多年的挚友,受某著名机构邀请,来到我生活的城市参加财税论坛峰会,并做学术报告。当时正值清明前后,正所谓是“春风吹柳万条斜” 的美好时节。活动结束之后,我带老友去这个时节,我们这个城市人气指数NO1的景点欣赏形态各异,五颜六色的郁金香,然后泛舟名湖,参观千年古寺,老友对这座城市的湖光山色和文化底蕴赞叹不已。晚上,我找了一个比较幽静的酒馆,准备一醉方休,为老友饯行。

        酒过三巡,菜过五味,我们相互交流分享着踏入社会后这么多年,各自所经历的人、事、物,可谓“无可奈何花落去,似曾相识燕归来”,感叹不已!后来话题转移到各自的工作上来,由于我在IT行业混迹多年。老友说,现在有六七百家的客户委托他公司做账,有四五百个税盘(有白色的金税盘,黑色的税控盘和税务UKey)在公司里托管。每到月初心里有着莫名的恐惧感。他说每月月初都要将这些盘进行抄税和清卡,工作量极大。最开始的时候采用全手工操作,找到众多的盘相应的税盘,插到电脑上,然后打开相应的开票软件,进行抄税和清卡,顺利的话一个盘需要六七分钟的时间,如果遇到特殊的情况一个盘需要二十甚至三十多分钟才能做完,这样每个月都要投入七八天的时间,做这些机械化的,让人眼花缭乱的,又不得不做的操作,真是痛苦烦恼不已啊!

        他为了能结束这种煎熬的过程,经过多方咨询和比较后,从一家知名的公司采购了税盘机柜和配套使用的软件,第一年投入十来万的费用,后续每年还要缴纳一定费用的维护费,以期解决这种只有经历过才知道的痛苦煎熬。此时,我问老友说:“现在你们有了这批硬件设备和配套的软件,应该轻松很多了?”不料,老友此时眉头紧皱,长叹一声,说道:“唉!远远未达我的预期,现在依然在煎熬中,也算花了冤枉钱。”我便问道:“此话怎讲呢?”。老友说道:“我感觉采购的硬件还算可以,配套使用的软件很不稳定,各种报错,卡死。现在每个月还要花费四五天的时间来处理这个事情。你懂软件,不知你能否抽时间到我那看看软件是否有改进的空间。”看到老友这么痛苦不堪的样子,我便答应了下来。

        翌日一早,我便随老友一起到他的公司,分析问题出在哪里。老友的盛情款待不再言表,带着老友的嘱托和殷切的期盼,我通宵到旦地对配套软件进行跟踪分析,终于发现了其中的秘密。原来这款软件其实就是一个模拟器(专业术语叫RPA技术),通过自动打开相应的开票软件(会将票软件的界面隐藏),模拟鼠标键盘操作以实现抄税和清卡的功能,这款软件对各种场景的处理不太尽如人意,所以效率和稳定性都太差。

         老友眼神流露出殷切的期盼,问我道:“是否有改进空间?”,其实,我心里此时也没底,便说道:“让我试试吧,给我一两个月的时间。”

        带着老友的期待和嘱托,我回去后通过两个月的日夜兼程的努力,终于写了一款工具出来。通过给老友使用,该工具运行比较稳定,四五百个盘不需要做任何的人工干预,花费六七个小时的时间即可实现抄税和清卡。老友看到这个结果兴奋不已,感激的对我说:“你真的解决了我的难言之隐,辛苦你了,说实话不能让你白忙一场。这样把我按一个月X万的成本支付你,给你X万。”我哈哈一笑说:“你怎这么客气呢,要不这样把,你买一瓶好酒,我们一起喝酒就行了。”

        于是老友买了几瓶享誉海内外的某酒,喊上三五好友作陪,开怀畅饮,一切不再言表。翌日,老友知道我爱喝酒,便买了一箱该酒偷偷放到我后备箱内。我发现后,再三推辞,但盛情难却,象征行的收了两瓶。直到今日,老友的规模也在不断扩大,工具依然在稳定的运行。

        最近笔者稍得闲暇,将税盘批量抄税和清卡的相关经验和核心的代码分享给各位读者,希望能对有类似经历的朋友起到帮助作用。笔者同时也非常愿意和各位有类似业务场景需求,或者遇到技术瓶颈的,各界朋友交流业务或技术经验。

2. 税盘抄税和清卡业务流程

        增值税开票软件迄今为止都需要税盘,税盘分为金税盘(白盘),税控盘(黑盘)和税务UKey三种(如下图所示,当然还有全电,不再本文讨论的范畴)。其中金税盘是航信旗下研发的开票软件,税控盘和税务UKey是百旺研发的开票软件。从市场占有率来说金税盘属于佼佼者,从趋势来看当属税务UKey首屈一指。

        开票软件需要每月月初进行抄税,将当前开票软件中,上月所开的发票数据进行汇总上传(注意:在抄税之前,需要从税盘中修复所有的发票,并将发票全部上传)。在开票软件中,进行抄税之后,税务会计能登录到电子税务局,进行纳税申报(这一操作也称为“报税”)。在电子税务局进行纳税申报之后,方可在开票软件中,进行清卡操作,清卡成功后,税盘的锁死日期自动变更为次月。若未清卡,到税盘锁死日期后,不能再开具发票。抄税和清卡的操作流程如下图所示。    

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUVFfMzA5NDM1MzYyNw==,size_14,color_FFFFFF,t_70,g_se,x_16

            图-4 抄税和清卡流程

3. 常见的税盘抄税和清卡操作方式

        税盘的抄税和清卡操作方式,根据笔者的理解和调研大致分为如下四种。第一种,在开票软件中手工操作进行抄税和清卡;第二种,使用RPA技术,模拟鼠标键盘操作进行抄税和清卡;第三种,通过注入技术进行税盘抄税和清卡进行操作;第四种,通过相关组件提供的抄税和清卡接口进行抄税和清卡进行操作。笔者,下面分别就这四种操作方式进行详细的阐述和对比。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAUVFfMzA5NDM1MzYyNw==,size_13,color_FFFFFF,t_70,g_se,x_16

 图-5 抄税和清卡操作的几种方式

 3.1 手工操作进行抄税和清卡

        在开票软件里进行手工的抄税和清卡,是最便捷、最稳定的方式。这对于只有一个或数个盘的单个企业而言,是行之有效的操作手段。

        这种操作,首先,找到税盘(金税盘,或者税控盘,或者税务UKey)插到电脑上,打开对应的开票软件(不同类型的税盘需要不同的开票软件)输入密码(包括软件密码,税控设备密码,证书密码)登录到开票软件。

        然后,修复发票数据(因为有可能存在同一税盘在不同的电脑上开过票),以确保当月的所有的开票数据在当前开票软中已存在,如果这一点已确保,可以忽略修复发票。修复完发票数据后,需要确认是否存在未上传的发票数据,如果存在未上传的发票数据则要进行上传发票。

经过以上的准备和前奏操作之后,则进行抄税(在有的开票软件中或称之为“汇总上传”,不同的开票软件其入口或者叫法不同,笔者在此不再一一展开赘述)。抄税成功之后,则需要税务会计登录到电子税务局,进行纳税申报(亦称之为“申报”或“报税”)。

        最后,在税务会计纳税申报完成之后,开票员插入税盘,打开并登录开票软件进行清卡(在有的开票软件中也称之为 “监控回传”或“监控回写”,不同的开票软件其操作入口也不同,笔者也不再展开赘述)。清卡完成后,则税盘的锁死日期自动变为次月的日期,若清卡失败,则到税盘锁死日期(一般是当月中旬,当然具体的日期可以查看税局的纳税申报截止日期)不再允许开票。

        上面描述的则是手工进行抄税,清卡的完整的操作流程,这种方式的优点是稳定可控。但是,如果企业有数百甚至更多的盘(例如代账企业),其工作量也是可想而知的,正如我在引言中所描述的,老友的痛苦一样,在此笔者不再回忆老友的梦魇和痛苦。

3.2 通过RPA技术进行抄报和清卡

        RPA技术(Robotic Process Automation)即机器人流程自动化,该技术用在税盘的抄税和清卡中,也即自动打开税盘对应的开票软件,通过模拟键盘鼠标操作,进行抄税和清卡。操作的流程和手工操作完全一致,首先登录开票软件,然后修复发票,判断发票是否上传,如果存在未上传的发票则上传,最后进行抄税和清卡操作。

          这种方式的优点是,相对于纯手工操作来说会提升一定的效率,但效率提升是有限的。缺点是,开票软件种类繁多,和各种单步操作的各种业务场景(例如多报错信息的处理等)叠加在一起,有数不尽的细分场景,很难一一枚举,这也就导致RPA很不稳定。在加上开票软件本身会在使用各种反模拟操作的技术手段。开票软件升级后RPA也要做相关的调整和迭代,开票软件升级频繁(至少每月一个版本)。这些因素决定了,RPA技术很难在税盘的抄税,清卡的场景能做到稳定,同时提升的效率也是有限的。正如在引言中所描述的一样,我老友花“巨资”引入的产品,依然令他痛苦不堪,正所谓“花钱买了寂寞”。  

 3.3 通过注入技术进行抄税和清卡 

        通过注入技术进行税盘的抄税,清卡操作,相对于RPA技术来说更加考验开发着的技术功底,正所谓“没有金刚钻,别拦瓷器活”,注入需要找到正确的注入点,并进行相关的分析,这个过程没有一定技术底蕴很难胜任。当然注入也可以分为初级和高级两个境界,能做到高级注入的话,可以直接调用相关的底层接口,可以做到很稳定和很高效。然而,高级注入没有“大师”级的技术底蕴,很难胜任。

           高级注入虽然可以做大稳定和高效,但是开票软件频繁升级,也是梦魇一般的存在,每次升级后,都需要进行重新的分析,这个过程也是极其耗时和繁杂的,所以这种技术也有很大的瓶颈。

3.4 通过组件接口进行抄税和清卡

        相关的组件接口提供了抄税,清卡以及其它功能,使用组件接口可以获取税盘状态(例如各核定票种的最近抄报日期,锁死日期等),并依此来判断税盘的抄税,清卡状态。如果没有抄税,则可以调用相关接口进行未上传发票上传,抄税,清卡。组件接口的优点是稳定,高效,同时不用再考虑开票软件的升级问题,一劳永逸。另外组件接口调用简单,很容易上手。

        综上所述,组件接口是最优方案。当然组件所提供的接口不止抄税和清卡的功能,例如开票,作废,冲红,库存查询,领购,上传,发票查询,版式文件下载等一应具全。本文着重介绍抄税和清卡。

4. 组件接口实现抄税清卡的核心代码分享

        下面笔者对通过调用组件接口实现抄税和清卡的核心代码进行分享,上节提到的通过RPA技术和注入技术实现抄税,清卡的技术细节,有兴趣的朋友可以和笔者进行沟通交流。

4.1 金税盘组件接口

4.1.1 抄税操作核心代码

{**********************************************************
 功能:金税盘抄税操作
 参数:errMsg        输出参数,错误信息
 返回值:ture  -     成功
         false -     失败
		 
 date: 2021-05-0430
 author: 海之边  qq-3094353627
 
 流程简述:
   1. 打开金税盘
   2. 获取金税盘盘状态
   3. 如果尚未抄税则进行抄税
   4. 抄税成功后获取金税盘状态,并缓存到本地数据库
 **********************************************************}
function TCtrlItem.reportTax(var errMsg: string): boolean;
var idx: integer;
    bReported: boolean;
    sFplxdm, sCardClock: string;
    oJsCardComponent: TJsCardComponent;
    oTaxCardRespOpenCard: TJsCardResponse_OpenCard;
    oJsCardRespGetClock: TJsCardResponse_getClock;
    oJsCardState: TJsCardState;
    oJsCardRespRep: TJsCardResponse_taxReport;
    oHdFplxdmLst: TStrings;
    oDBAJxsb: TDBAJxsb;
    oDBAPzxx: TDBAPzxx;
begin
  result := false;
  oJsCardComponent := TJsCardComponent.Create;
  oTaxCardRespOpenCard := nil;
  oJsCardState := nil;
  oJsCardRespRep := nil;
  oHdFplxdmLst := nil;
  oDBAJxsb := nil;
  oDBAPzxx := nil;
  
  try
    oDBAJxsb := TDBAJssb.Create;
    oDBAPzxx := TDBAPzxx.Create;
    
    //1. 打开金税盘
    oTaxCardRespOpenCard := oJsCardComponent.openTaxCard(Zsmm);
    if not oTaxCardRespOpenCard.isSucc then
    begin
      errMsg := Format('打开金税盘%s.%s失败: %s。', [FNsrsbh, FMachineNo, errMsg]);
      updateCzzt(oDBAJxsb, CZZT_SB, errMsg);
      exit;
    end;

    if oTaxCardRespOpenCard.isCertNotPass then
    begin
    //证书密码错误,设置密码校验不通过状态
      Zsmmjyjg := untGolbalConst.JYJG_NotPass;
      updateToDb(oDBAJxsb);
      Exit;
    end;

    //判断抄报状态
    //2. 读取金税盘时钟
    oJsCardRespGetClock := OJsCardComponent.getClock;
    if not oJsCardRespGetClock.isSucc then
    begin
      errMsg := Format('读取金税盘时钟失败:%d-%s', [oJsCardRespGetClock.retCode, 
		oJsCardRespGetClock.retMsg]);
      updateCzzt(oDBAJxsb, CZZT_SB, errMsg);
      Exit;
    end;
    sCardClock := oJsCardRespGetClock.Clock;

    //3 读取金税盘状态
    oJsCardState := oJsCardComponent.queryTaxcardState_svr(errMsg);
    if not Assigned(oJsCardState) then
    begin
      updateCzzt(oDBAJxsb, CZZT_SB, errMsg);
      Exit;
    end;
    updateToDb(oDBAJxsb);

    //更新设备状态信息
    assignFromJsCardState(oJsCardState);
    //保存票种核定信息
    oJsCardState.Pzxxs.saveToDb(Sksblx, SksbNo);

    //4 逐个核定票种判断是否能抄报
    //4.1 判断是否已经抄报
    bReported := True;
    oHdFplxdmLst := spliteStr(hdfplxdm, ',');
    for idx := 0 to oHdFplxdmLst.Count - 1 do
    begin
      sFplxdm := oHdFplxdmLst.Strings[idx];
      if not oDBAPzxx.isReport(Sksblx, SksbNo, sFplxdm, sCardClock) then
      begin
        bReported := False;
        Break;
      end;
    end;
    if bReported then
    begin
      //已抄报
      updateCzzt(oDBAJxsb, CZZT_CG, '已抄报,无需再执行抄报操作。');
      result := true;
      Exit;
    end;

    //4.2 是否到抄报期
    if oTaxCardRespOpenCard.IsRepReached <> '1' then
    begin
      errMsg := '未到抄税期';
      updateCzzt(oDBAJxsb, CZZT_SB, errMsg);
      Exit;
    end;


    //5 执行抄税操作
    oJsCardRespRep := OJsCardComponent.taxReport;
    if not oJsCardRespRep.reportIsSucc then
    begin
      //抄税失败
      errMsg := Format('抄报失败:%s-%s', [oJsCardRespRep.Code, oJsCardRespRep.Mess]);
      updateCzzt(oDBAJxsb, CZZT_SB, errMsg);
    Exit;
    end
    else
    begin
    //抄税成功
      updateCzzt(oDBAJxsb, CZZT_CG, '');
      //更新金税盘状态
      if Assigned(taskThread) then
        taskThread.setThirdPrompt('正在更新金税盘状态信息...');
      updateCzlb(oDBAJxsb, CZLB_HQJSPZT);
      oJsCardState := oJsCardComponent.queryTaxcardState(errMsg);
      if not Assigned(oJsCardState) then
      begin
        updateCzzt(oDBAJxsb, CZZT_SB, errMsg);
        Exit;
      end;
      updateToDb(oDBAJxsb);

      //更新设备状态信息
      assignFromJsCardState(oJsCardState);
      //保存票种核定信息
      oJsCardState.Pzxxs.saveToDb(Sksblx, SksbNo);
      
      result := true;
    end;
  finally
    if Assigned(oJsCardComponent) then  
      FreeAndNil(oJsCardComponent);
      
    if Assigned(oTaxCardRespOpenCard) then
      FreeAndNil(oTaxCardRespOpenCard);

    if Assigned(oJsCardRespGetClock) then
      FreeAndNil(oJsCardRespGetClock);

    if Assigned(oJsCardState) then
      FreeAndNil(oJsCardState);

    if Assigned(oHdFplxdmLst) then
      FreeAndNil(oHdFplxdmLst);

    if Assigned(oJsCardRespRep) then
      FreeAndNil(oJsCardRespRep);
      
    if Assigned(oDBAJxsb) then
      FreeAndNil(oDBAJxsb);
    
    if Assigned(oDBAPzxx) then  
      FreeAndNil(oDBAPzxx);
    end;
end;

   4.1.2 清卡操作核心代码

{**********************************************************
 功能:金税盘清卡操作
 参数:errMsg        输出参数,错误信息
 返回值:ture  -     成功
         false -     失败
     
 date: 2021-05-0430
 author: 海之边  qq-3094353627
 
 流程简述:
   1. 打开金税盘
   2. 获取金税盘盘状态
   3. 如果尚未清卡则进行清卡
   4. 清卡成功后获取金税盘状态,并缓存到本地数据库
 **********************************************************}
function TCtrlItem.reportTaxJSP(var errMsg: string): boolean;
var idx: integer;
    bCleared: boolean;
    sFplxdm, sCardClock: string;
    oJsCardComponent: TJsCardComponent;
    oTaxCardRespOpenCard: TJsCardResponse_OpenCard;
    oJsCardRespGetClock: TJsCardResponse_getClock;
    oJsCardState: TJsCardState;
    oJsCardRespClearCard: TJsCardResponse_clearReport;
    oHdFplxdmLst: TStrings;
    oDBAJxsb: TDBAJxsb;
    oDBAPzxx: TDBAPzxx;
begin
  result := false;
  oJsCardComponent := TJsCardComponent.Create;
  oTaxCardRespOpenCard := nil;
  oJsCardState := nil;
  oJsCardRespClearCard := nil;
  oHdFplxdmLst := nil;
  oDBAJxsb := nil;
  oDBAPzxx := nil;
  
  try
    oDBAJxsb := TDBAJssb.Create;
    oDBAPzxx := TDBAPzxx.Create;
    
  //1 打开金税盘
    oTaxCardRespOpenCard := oJsCardComponent.openTaxCard(Zsmm);

    if not oTaxCardRespOpenCard.isSucc then
    begin
      errMsg := Format('打开金税盘%s.%s失败: %s。', [FNsrsbh, FMachineNo, errMsg]);
      updateCzzt(oDBAJxsb, CZZT_SB, errMsg);
	  Exit;
    end;
    if oTaxCardRespOpenCard.isCertNotPass then
    begin
    //证书密码错误,设置密码校验不通过状态
      Zsmmjyjg := untGolbalConst.JYJG_NotPass;
      updateToDb(oDBAJxsb);
      Exit;
    end;

    //2. 判断是否已经清卡
    //读取金税盘时钟
    oJsCardRespGetClock := OJsCardComponent.getClock;
    if not oJsCardRespGetClock.isSucc then
    begin
      errMsg := Format('读取金税盘时钟失败:%d-%s', [oJsCardRespGetClock.retCode,
        oJsCardRespGetClock.retMsg]);
      updateCzzt(oDBAJxsb, CZZT_SB, errMsg);
      Exit;
    end;
    sCardClock := oJsCardRespGetClock.Clock;
    updateLastClock(sCardClock);

    //读取金税盘状态
    oJsCardState := oJsCardComponent.queryTaxcardState(errMsg);
    if not Assigned(oJsCardState) then
    begin
      updateCzzt(oDBAJxsb, CZZT_SB, errMsg);
      Exit;
    end;
    updateToDb(oDBAJxsb);

    //更新设备状态信息,保存票种核定信息
    assignFromJsCardState(oJsCardState);
    oJsCardState.Pzxxs.saveToDb(Sksblx, SksbNo);

    //这个核定票种判断是否已经抄报
    bCleared := True;
    oHdFplxdmLst := spliteStr(hdfplxdm, ',');
    for idx := 0 to oHdFplxdmLst.Count - 1 do
    begin
      sFplxdm := oHdFplxdmLst.Strings[idx];
      if not oDBAPzxx.isClearCard(Sksblx, SksbNo, sFplxdm, sCardClock) then
      begin
        bCleared := False;
        Break;
      end;
    end;
    if bCleared then
    begin
    //已经清卡
      WriteLog('金税盘%s.%s已清卡,无需再次清卡。', [FNsrsbh, FMachineNo]);
      updateCzzt(oDBAJxsb, CZZT_CG, '已清卡,无需再执行清卡操作。');
      result := true;
      Exit;
    end;

    //3 执行清卡操作
    oJsCardRespClearCard := OJsCardComponent.clearCard;
    if not oJsCardRespClearCard.reportIsSucc then
    begin
    //清卡失败
      errMsg := Format('清卡失败:%s-%s', [oJsCardRespClearCard.Code, 
	    oJsCardRespClearCard.Mess]);
      updateCzzt(oDBAJxsb, CZZT_SB, errMsg);
      Exit;
    end
    else
    begin
    //清卡成功
      updateCzzt(oDBAJxsb, CZZT_CG, '');
    //更新金税盘状态
      if Assigned(oJsCardState) then
        FreeAndNil(oJsCardState);
      oJsCardState := oJsCardComponent.queryTaxcardState(errMsg);
      if not Assigned(oJsCardState) then
      begin
        WriteLogError('更新金税盘状态信息失败: %s', [errMsg]);
        updateCzzt(oDBAJxsb, CZZT_SB, errMsg);
        Exit;
      end;
      updateToDb(oDBAJxsb);
      oJsCardState.Pzxxs.saveToDb(Sksblx, SksbNo);
      result := true;
    end;
  finally
    if Assigned(oJsCardComponent) then  
      FreeAndNil(oJsCardComponent);
      
    if Assigned(oTaxCardRespOpenCard) then
      FreeAndNil(oTaxCardRespOpenCard);

    if Assigned(oJsCardRespGetClock) then
      FreeAndNil(oJsCardRespGetClock);

    if Assigned(oJsCardState) then
      FreeAndNil(oJsCardState);

    if Assigned(oHdFplxdmLst) then
      FreeAndNil(oHdFplxdmLst);

    if Assigned(oJsCardRespRep) then
      FreeAndNil(oJsCardRespRep);
      
    if Assigned(oDBAJxsb) then
      FreeAndNil(oDBAJxsb);
    
    if Assigned(oDBAPzxx) then  
      FreeAndNil(oDBAPzxx);
    end;
end;

4.2 税控盘组件

       税控盘组件的抄税和清卡相关的核心代码,和金税盘类似,笔者不再一一贴出代码,有兴趣或需求的朋友可以和笔者做进一步的沟通交流。

4.3 税务UKey组件

        税务UKey组件的抄税和清卡相关的核心代码,和金税盘类似,笔者不再一一贴出代码,有兴趣或需求的朋友可以和笔者做进一步的沟通交流。        

5. 后记

        上文中笔者所述的组件,抄税和清卡只是其诸多功能之一,同时支持发票开具,作废,冲红,库存查询,发票上传,领购,版式文件下载,发票查询等功能。有兴趣的朋友可以和笔者进一步的沟通交流,同时笔者认知、技术水平有限,若文中有错误或不当之处,欢迎各位批评指正。

  

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/135138.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 江门python培训机构

    江门python培训机构猿辅导接近完成新一轮融资:腾讯领投,估值75亿美元据路透社报道,知情人士称,在线教育平台猿辅导接近完成新一轮融资,估值约为75亿美元。本轮融资由腾讯控股公司和私募股权公司高瓴资本领投。对此,猿辅导向多知网表示“消息不准确”,暂未进一步说明。腾讯和高瓴资本均暂未对融资消息置评。教育部、财政部:实施教师在线教学能力提升行动教育部、财政部印发《关于做好2020年中小学幼儿园教师国家级培训计划组织实施工作的通知》。通知提出,实施教师在线教学能力提升行动,已经或计划开展在线教学的省(区、市),要通过线上培

  • 想要复制网页的文字网页不让复制_如何复制文字

    想要复制网页的文字网页不让复制_如何复制文字作者:iamlaosong当我们需要复制网页上的内容时,往往会碰到不能复制的情况,面对这个问题,不同的情况有不同的应对方法,比如禁止JavaScript运行,查看源代码,另存为网页文件等。这些方法也可以用,现在有个更通用的办法是QQ屏幕截图所带的功能,不管网页用的什么技术,能看见就可以复制,特别适合不太懂技术的人。要用QQ截图功能,QQ肯定是要登录的,然后用浏览器打开需要复制文字的网页,按QQ屏幕截图快捷键Ctrl+Alt+A选择需要复制文字的区域,在弹出的菜单中点击“翻译”或者“屏幕识图”两个按钮

    2022年10月12日
  • mysql事务隔离级别可重复读_innodb默认隔离级别

    mysql事务隔离级别可重复读_innodb默认隔离级别一般的DBMS系统,默认都会使用读提交(Read-Comitted,RC)作为默认隔离级别,如Oracle、SQLServer等,而MySQL却使用可重复读(Read-Repeatable,RR)。要知道,越高的隔离级别,能解决的数据一致性问题越多,理论上性能损耗更大,可并发性越低。隔离级别依次为>:串行化>RR>RC>读未提交在SQL标准中,前三种隔离级别分别解决了幻象读、不可重复读和脏读的问题。那么,为什么MySQL使用可重复读作为默认隔离级别呢?这个是有历史.

  • FRP内网穿透教程「建议收藏」

    FRP内网穿透教程「建议收藏」FRP内网穿透介绍frp是一个专注于内网穿透的高性能的反向代理应用,支持TCP、UDP、HTTP、HTTPS等多种协议。可以将内网服务以安全、便捷的方式通过具有公网IP节点的中转暴露到公网。为什么使用frp通过在具有公网IP的节点上部署frp服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:客户端服务端通信支持TCP、KCP以及Websocket等多种协议。采用TCP连接流式复用,在单个连接间承载更多请求,节省连接建立时间。代理组间的负

  • CTK Plugin Framework简介

    CTK Plugin Framework简介CTKPluginFramework简介 框架简介 1.1、简介CTKPluginFramework设计参考了OSGi(OpenServiceGatewayInitiative,开放服务网关协议)(Java的动态组件系统),并提供了一种能让应用程序(动态地)由许多不同的可重用组件组成的开发模型,允许通过服务进行通信。OSGi规范的核心部分是一个框架,核心框架定义了应用程序的生命周期模式和服务注册。基于OSGI核心框架定义了大量的OSGi服务:日志、配置管理、HTTP(运行se

  • adb命令fastboot线刷_fastboot线刷

    adb命令fastboot线刷_fastboot线刷app稳定性测试工具使用方法

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号