摘要

由于公司对接第三方系统业务较多,所以就采用webservice进行对接,本文项目框架使用SSH搭建,其他框架也可以参考下具体使用流程,本文demo都是测试通过而且发布成功,有需要的可以直接copy根据自己的业务需求进行修改,这里的demo只能给大家一个参考,不能照搬。废话不多说,直接上代码。有需要的伙伴可以参考借鉴一下。

准备工作

  1. 下载cfx所需jar包(使用cfx方式)

    1.1 下载地址:点击----->apache-cxf-2.6.16下载
    1.2 下载完成后解压放入项目lib目录下重新编译,如下图

步骤

第一步:webservice在项目中的配置,如下:

1. 创建service-ws.xml,如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:jaxws="http://cxf.apache.org/jaxws"xsi:schemaLocation="http://www.springframework.org/schema/beans  http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://cxf.apache.org/jaxws http://cxf.apache.org/schemas/jaxws.xsd"><import resource="classpath:META-INF/cxf/cxf.xml"/><import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/><import resource="classpath:META-INF/cxf/cxf-servlet.xml"/><!-- 企业信息同步接口 --><bean id="companyImpl" class="com.hontek.webservice.service.impl.CompanyImpl"><property name="interAccountDao" ref="interAccountDao"/><property name="enterpriseDao" ref="enterpriseDao"/><property name="proTypeDao" ref="proTypeDao"/><property name="proTypeQrcodeDao" ref="proTypeQrcodeDao"/><property name="enterprseService" ref="enterprseService"/><property name="proTypeBatchDao" ref="proTypeBatchDao"/><property name="orderService" ref="orderService"/><property name="zizhiDao" ref="zizhiDao"/><property name="zizhiTypeDao" ref="zizhiTypeDao"/><property name="zizhiAppendixDao" ref="zizhiAppendixDao"/><property name="productServiceInter" ref="productService"/><property name="traceService" ref="traceService"/><property name="certificateDao" ref="certificateDao"/><property name="certificateCheckDao" ref="certificateCheckDao"/><property name="certificatePrintDao" ref="certificatePrintDao"/><property name="certificateScanDao" ref="certificateScanDao"/></bean><jaxws:server serviceClass="com.hontek.webservice.service.inter.CompanyInter" address="/company"><jaxws:serviceBean><ref bean="companyImpl"/></jaxws:serviceBean></jaxws:server><!-- 检测设备接口 --><bean id="detectionDeviceImpl" class="com.hontek.devicewebservice.service.impl.DetectionDeviceImpl"><property name="userDao" ref="userDao"/><property name="enterpriseDao" ref="enterpriseDao"/><property name="checkEquipmentDao" ref="checkEquipmentDao"/><property name="proTypeQrcodeDao" ref="proTypeQrcodeDao"/><property name="checkInfoDao" ref="checkInfoDao"/><property name="checkInfoDetailDao" ref="checkInfoDetailDao"/><property name="proTypeDao" ref="proTypeDao"/><property name="spotCheckDao" ref="spotCheckDao"/><property name="orderService" ref="orderService"/><property name="dimennoRecordService" ref="dimennoRecordService"/><property name="certificateService" ref="certificateServiceInter"/><property name="caInfoDao" ref="caInfoDao"/><property name="certificateCheckDao" ref="certificateCheckDao"/></bean><jaxws:server serviceClass="com.hontek.devicewebservice.service.inter.DetectionDeviceInter" address="/detectionDevice"><jaxws:serviceBean><ref bean="detectionDeviceImpl"/></jaxws:serviceBean></jaxws:server><!-- 圳品、菜篮子平台对接接口 --><bean id="platformsImpl" class="com.hontek.platformswebservice.service.impl.PlatformsImpl"><property name="interAccountDao" ref="interAccountDao"/><property name="enterprseService" ref="enterprseService"/><property name="certificateServiceInter" ref="certificateServiceInter"/><property name="proTypeDao" ref="proTypeDao"/><property name="enterpriseDao" ref="enterpriseDao"/><property name="proTypeQrcodeDao" ref="proTypeQrcodeDao"/><property name="caInfoDao" ref="caInfoDao"/><property name="userDao" ref="userDao"/><property name="spotCheckDao" ref="spotCheckDao"/><property name="checkReportDao" ref="checkReportDao"/><property name="checkContentDao" ref="checkContentDao"/><property name="xydaAppendixDao" ref="xydaAppendixDao"/><property name="checkInfoDao" ref="checkInfoDao"/><property name="checkInfoDetailDao" ref="checkInfoDetailDao"/></bean><jaxws:server serviceClass="com.hontek.platformswebservice.service.inter.PlatformsInter" address="/platform"><jaxws:serviceBean><ref bean="platformsImpl"/></jaxws:serviceBean></jaxws:server></beans>

apache-cxf-2.6.16版本需要在上面配置文件中加入下面三行

 <import resource="classpath:META-INF/cxf/cxf.xml"/><import resource="classpath:META-INF/cxf/cxf-extension-soap.xml"/><import resource="classpath:META-INF/cxf/cxf-servlet.xml"/>

注意:如果你的版本是3.0以上的,因为多了下面两个xml文件,所以也会报错;只需要引入第一个就可以;如果你的CXF版本是3.0以下;那么需要引入三个配置文件。

2. 配置applicationContext.xml,如下:

 <!-- webservice 接口配置文件 --><import resource="config/webservice/application/service-ws.xml"/>

3. 配置web.xml,如下:

  <servlet><servlet-name>CXFService</servlet-name><servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class></servlet><servlet-mapping><servlet-name>CXFService</servlet-name><url-pattern>/CXFService/*</url-pattern></servlet-mapping>

第二步:创建webservice接口,如下:

package com.hontek.platformswebservice.service.inter;
import com.hontek.platformswebservice.comm.*;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import java.util.List;@WebService
@SOAPBinding(style = Style.RPC)
@SuppressWarnings("deprecation")
public interface PlatformsInter {/*** 获取口令* @Author yang* @Date   2020/05/06 16:55**/public String getToken(@WebParam(name="account")String account,@WebParam(name="password")String password);/*** 更新心跳接口* @Author yang* @Date   2020/05/06 16:59**/public String active(@WebParam(name = "token") String token);/*** 退出接口* @Author yang* @Date   2020/05/06 16:59**/public String logout(@WebParam(name = "token") String token);/*** 同步产品信息* @Author yang* @Date   2020/05/07 18:07**/public String syncProTypeQrCode(@WebParam(name="token")String token, @WebParam(name="proTypeQrcode") ProTypeQrcodeEntity proTypeQrcode);
}

以上webservice接口使用RPC方式,并且包含系统对接时候需要的安全验证接口(获取token、更新心跳、退出,可以根据自己的需求进行修改)

第三步:创建webservice实现类,如下

package com.hontek.platformswebservice.service.impl;import com.alibaba.fastjson.JSON;
import com.hontek.certificate.dao.CaInfoDao;
import com.hontek.certificate.pojo.CaInfo;
import com.hontek.certificate.pojo.Certificate;
import com.hontek.certificate.service.inter.CertificateServiceInter;
import com.hontek.comm.util.DateUtil;
import com.hontek.comm.util.DirectoryUtil;
import com.hontek.comm.util.IDUtil;
import com.hontek.comm.util.StringUtil;
import com.hontek.company.dao.CheckContentDao;
import com.hontek.company.dao.CheckReportDao;
import com.hontek.company.dao.SpotCheckDao;
import com.hontek.company.dao.XydaAppendixDao;
import com.hontek.company.pojo.CheckContent;
import com.hontek.company.pojo.CheckReport;
import com.hontek.company.pojo.SpotCheck;
import com.hontek.company.pojo.XydaAppendix;
import com.hontek.detectiondevice.comm.DetectionReportUtils;
import com.hontek.detectiondevice.dao.CheckInfoDao;
import com.hontek.detectiondevice.dao.CheckInfoDetailDao;
import com.hontek.detectiondevice.pojo.CheckInfo;
import com.hontek.detectiondevice.pojo.CheckInfoDetail;
import com.hontek.platformswebservice.comm.*;
import com.hontek.platformswebservice.service.inter.PlatformsInter;
import com.hontek.record.dao.ProTypeQrcodeDao;
import com.hontek.record.pojo.TbProTypeQrcode;
import com.hontek.review.dao.ProTypeDao;
import com.hontek.review.pojo.TbProType;
import com.hontek.sys.dao.EnterpriseDao;
import com.hontek.sys.dao.InterAccountDao;
import com.hontek.sys.dao.UserDao;
import com.hontek.sys.pojo.TbInterAccount;
import com.hontek.sys.pojo.TsEnterprise;
import com.hontek.sys.pojo.TsUser;
import com.hontek.sys.service.inter.EnterpriseServiceInter;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
import org.apache.log4j.Logger;import javax.annotation.Resource;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;
import javax.jws.soap.SOAPBinding.Style;
import javax.servlet.http.HttpServletRequest;
import javax.xml.ws.WebServiceContext;
import javax.xml.ws.handler.MessageContext;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.*;@WebService
@SOAPBinding(style = Style.RPC)
public class PlatformsImpl implements PlatformsInter {private Logger logger = Logger.getLogger(PlatformsImpl.class);private InterAccountDao interAccountDao;private EnterpriseServiceInter enterprseService;private CertificateServiceInter certificateServiceInter;private ProTypeDao proTypeDao;private EnterpriseDao enterpriseDao;private ProTypeQrcodeDao proTypeQrcodeDao;private CaInfoDao caInfoDao;private UserDao userDao;public void setInterAccountDao(InterAccountDao interAccountDao) { this.interAccountDao = interAccountDao; }public void setEnterprseService(EnterpriseServiceInter enterprseService) { this.enterprseService = enterprseService; }public void setCertificateServiceInter(CertificateServiceInter certificateServiceInter) { this.certificateServiceInter = certificateServiceInter; }public void setProTypeDao(ProTypeDao proTypeDao) { this.proTypeDao = proTypeDao; }public void setEnterpriseDao(EnterpriseDao enterpriseDao) { this.enterpriseDao = enterpriseDao; }public void setProTypeQrcodeDao(ProTypeQrcodeDao proTypeQrcodeDao) { this.proTypeQrcodeDao = proTypeQrcodeDao; }public void setCaInfoDao(CaInfoDao caInfoDao) { this.caInfoDao = caInfoDao; }public void setUserDao(UserDao userDao) { this.userDao = userDao; }@Resourceprivate WebServiceContext context;private HttpServletRequest getRequest(){MessageContext ctx = context.getMessageContext();HttpServletRequest request = (HttpServletRequest) ctx.get(AbstractHTTPDestination.HTTP_REQUEST);return request;}@Overridepublic String getToken(String account, String password) {logger.info("-----获取token开始-----");ResultInfo result = new ResultInfo();result.setSuccess(false);try {if(account!=null&&!"".equals(account)&&password!=null&&!"".equals(password)){// 这里根据账号和密码获取账号信息可以根据自己业务需求进行修改String condition = " and account='"+account+"' and pass='"+password+"'";TbInterAccount interAccount = interAccountDao.getInterAccount(condition);if(interAccount!=null){String token = UUID.randomUUID().toString().replace("-", "");SoleManager manager = SoleManager.getInstance();interAccount.setTime(System.currentTimeMillis());manager.putAccount(token, interAccount);result.setCode("1000");result.setMsg("获取token成功");result.setData(token);result.setSuccess(true);}else {result.setCode("1003");result.setMsg("帐号或密码错误");}}else {result.setCode("1002");result.setMsg("帐号或密码为空");}} catch (Exception e) {e.printStackTrace();logger.info("获取token失败:"+e.getMessage());result.setCode("1001");result.setMsg("获取token失败");}return JSONObject.fromObject(result).toString();}@Overridepublic String active(String token) {logger.info("-----更新心跳开始-----");SoleManager manager = SoleManager.getInstance();TbInterAccount account = manager.getAccount(token);ResultInfo result = new ResultInfo();result.setSuccess(false);if(account != null){account.setTime(System.currentTimeMillis());result.setSuccess(true);result.setCode("1000");result.setMsg("更新心跳成功");}else {result.setCode("1004");result.setMsg("该令牌无效");}return JSONObject.fromObject(result).toString();}@Overridepublic String logout(String token) {SoleManager manager = SoleManager.getInstance();TbInterAccount account = manager.getAccount(token);ResultInfo result = new ResultInfo();if(account != null){manager.cleanMap(token);}result.setSuccess(true);result.setCode("1000");result.setMsg("退出成功");return JSONObject.fromObject(result).toString();}@Overridepublic String syncCompanyInfo(String token, CompanyEntity company) {logger.info("-----同步企业信息-----");ResultInfo result = new ResultInfo();result.setSuccess(false);SoleManager manager = SoleManager.getInstance();TbInterAccount account = manager.getAccount(token);if(account != null){try {//更新心跳manager.active(account);if(company != null){TsEnterprise ent = new TsEnterprise();ent.setParentId(account.getEntId());ent.setName(company.getCompanyName());ent.setIntro(company.getIntro());ent.setOrgCode(company.getOrgCode());ent.setLegalPerson(company.getLegalPerson());ent.setRegAddr(company.getRegAddr());ent.setManageAddr(company.getManagerAddr());ent.setEmail(company.getEmail());ent.setDomName(company.getDomName());ent.setCrtUserId(account.getUserId());ent.setFlag("3");//设置为企业ent.setSts("0");ent.setIsReported("1");//设置为上报企业ent.setEntType(Integer.parseInt(company.getEntType()==null?"2":company.getEntType()));//2默认设置为私企ent.setCrtDt(DateUtil.formatDateTime());ent.setMobile(company.getMobile());ent.setSysCode(account.getSysCode());ent.setOldEntId(company.getCompanyId());ent.setAreaName(company.getAreaName());ent.setQualificationType(company.getQualificationType());ent.setBusiness(company.getBusiness());ent.setPurl("");ent.setMurl("");Map<String, String> restMap = enterprseService.addSynchCompanyInfo(ent,getRequest());String flag = restMap.get("flag");if(flag!=null&&"0".equals(flag)){result.setCode("1000");result.setSuccess(true);result.setMsg("同步企业数据成功");}else if(flag!=null&&"2".equals(flag)){result.setCode("1000");result.setSuccess(true);result.setMsg("企业已存在,更新企业数据成功");}else if(flag!=null&&"3".equals(flag)){result.setCode("1005");result.setMsg("同步企业数据失败");}else {result.setCode("1006");result.setMsg("参数错误");}}}catch (Exception e){e.printStackTrace();result.setCode("1007");result.setMsg("同步企业数据异常");logger.info(e.getMessage());}}else {result.setCode("1008");result.setMsg("登陆超时,请重新登陆");}return JSONObject.fromObject(result).toString();}@Overridepublic String syncProTypeQrCode(String token, ProTypeQrcodeEntity proTypeQrcode) {logger.info("-----同步产品信息-----");ResultInfo result = new ResultInfo();result.setSuccess(false);SoleManager manager = SoleManager.getInstance();TbInterAccount account = manager.getAccount(token);if(account != null){try {//更新心跳manager.active(account);String entId = String.valueOf(proTypeQrcode.getCompanyId());TsEnterprise enterprise = enterpriseDao.findEnterpriseBySysCodeAndOldEndId(account.getSysCode(), entId);if(enterprise!=null){if(proTypeQrcode != null){TbProTypeQrcode proTypeQrcode2 = new TbProTypeQrcode();proTypeQrcode2.setTypeId(Integer.parseInt(proTypeQrcode.getTypeId()));proTypeQrcode2.setProName(proTypeQrcode.getProName());proTypeQrcode2.setSysCode(account.getSysCode());proTypeQrcode2.setOldPtqId(String.valueOf(proTypeQrcode.getPtqId()));proTypeQrcode2.setOldDimenno(proTypeQrcode.getProCode());proTypeQrcode2.setProDesc(proTypeQrcode.getProDesc());//检查是否存在数据int count = proTypeQrcodeDao.countBySql("select count(*) from tb_pro_type_qrcode where sys_code='"+account.getSysCode()+"' and old_ptq_id='"+proTypeQrcode.getPtqId()+"'");if(count==0){proTypeQrcode2.setEntId(enterprise.getEntId());String ptqIdStr  = IDUtil.getPrimaryID();proTypeQrcode2.setPtqId(ptqIdStr);//产生二维码String dimenno = "";dimenno = enterprise.getEntCode();//entCode = 6位行政区域编码+6位(全省)顺序码String dimennoSeq = "01";String maxDimenno = proTypeQrcodeDao.findMaxDimennoByEntId(enterprise.getEntId());String lastTwoStr="";if(maxDimenno!=null&&!"".equals(maxDimenno)){lastTwoStr = maxDimenno.substring(maxDimenno.length()-2);dimennoSeq = StringUtil.getPtqLastTwoStr(lastTwoStr);}if("Z9".equals(dimennoSeq)){result.setCode("1010");result.setMsg("产品数量超出系统允许范围!");}else{dimenno += dimennoSeq;proTypeQrcode2.setDimenno(dimenno);proTypeQrcode2.setCrrtime(DateUtil.formatDateTime());logger.info("同步产品:"+ JSON.toJSONString(proTypeQrcode2));proTypeQrcodeDao.save(proTypeQrcode2);result.setSuccess(true);result.setCode("1000");result.setMsg("同步产品数据成功!");result.setData(ptqIdStr);}}else {TbProTypeQrcode typeQrcode = proTypeQrcodeDao.getProTypeQrcode(" and sysCode = '"+account.getSysCode()+"' and oldPtqId = '"+proTypeQrcode.getPtqId()+"'");logger.info("该产品已同步:"+JSON.toJSONString(proTypeQrcode));result.setCode("1011");result.setMsg("该产品已同步!");result.setData(typeQrcode.getPtqId());}}}else {logger.info("同步产品失败,该企业未同步:"+JSON.toJSONString(proTypeQrcode));result.setCode("1012");result.setMsg("同步产品失败,该企业未同步!");}}catch (Exception e){e.printStackTrace();result.setCode("1013");result.setMsg("同步产品数据异常");logger.info(e.getMessage());}}else {result.setCode("1008");result.setMsg("登陆超时,请重新登陆");}return JSONObject.fromObject(result).toString();}}

3.1 创建ResultInfo返回结果实体类,如下:

package com.hontek.platformswebservice.comm;/*** 返回结果实体类* @Author yang**/
public class ResultInfo {private String code;       //code码private boolean success; // 判断调用是否成功 true:成功 false:失败private Object data;     // 数据private String msg;            // 信息public String getCode() { return code; }public void setCode(String code) { this.code = code; }public boolean isSuccess() { return success; }public void setSuccess(boolean success) { this.success = success; }public Object getData() { return data; }public void setData(Object data) { this.data = data; }public String getMsg() { return msg; }public void setMsg(String msg) { this.msg = msg; }}

3.1 创建SoleManager线程类实现token过期时间及更新和销毁,如下:

package com.hontek.platformswebservice.comm;import com.hontek.sys.pojo.TbInterAccount;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;public class SoleManager {static final private SoleManager instance = new SoleManager();private Map<String, TbInterAccount> accountMap = new HashMap<String, TbInterAccount>();public static SoleManager getInstance(){return instance;}public SoleManager() {TimeOut timeout = new TimeOut();timeout.start();}synchronized public TbInterAccount getAccount(String token){TbInterAccount interAccount = accountMap.get(token);if(interAccount!=null)interAccount.setTime(System.currentTimeMillis());return interAccount;}synchronized public void putAccount(String token,TbInterAccount interAcount){this.accountMap.put(token, interAcount);}public class TimeOut extends Thread{public void run(){long keepTime = 1000L*60*60*10;while(true){try {Thread.sleep(1000*60*60*3);} catch (InterruptedException e) {e.printStackTrace();}Set<String> setKey = accountMap.keySet();Iterator<String> it = setKey.iterator();while(it.hasNext()){String key = it.next();TbInterAccount interAccount = accountMap.get(key);if(System.currentTimeMillis()-interAccount.getTime()>keepTime){accountMap.remove(key);}}}}}/*** 心跳* @param interaccount*/public void active(TbInterAccount interaccount){if(interaccount!=null){interaccount.setTime(System.currentTimeMillis());}}/*** 注销* @param token*/synchronized public void cleanMap(String token){TbInterAccount interAccount = accountMap.get(token);if(interAccount!=null){interAccount = null;accountMap.remove(token);}}
}

第四步:发布

*访问路径:域名/项目/CXFService/platform?wsdl,出现如下xml格式的数据说明发布成功*

第五步:测试

5.1 idea中创建webservice客户端进行测试,如下:



5.2 使用测试工具如postman、SoapUI Pro 5.1.2进行测试,如下是soapui进行测试:

第六步:总结:

前期接口写好后首先自己先测试下看看代码有无问题是否能调通接口,如没问题,接下来最好是写一份对接文档进行说明(如下图),再一个跟对三方进行对接时要先在测试环境或者自己本地服务器进行联调(使用内网穿透,我这边使用的是花生壳进行内网穿透),最后发布到正式环境中。

欢迎小伙伴留言评论,需要完整代码的加我QQ:450938667

webservice接口开发详解(附完整流程demo)相关推荐

  1. 微信JS-SDK之图像接口开发详解

    2019独角兽企业重金招聘Python工程师标准>>> 参考: 微信JS-SDK之图像接口开发详解 http://www.cnblogs.com/it-cen/p/4587812.h ...

  2. 干货!flask登录注册token验证接口开发详解

    今天给大家献上登录注册接口开发,是基于token验证的.咱们闲言少叙,进入正题! 首先看一下数据库模型: #pip install passlib from passlib.apps import c ...

  3. java远程_java实现电脑远程控制详解,附完整源代码

    Java JDK1.4 的Robot对象,该对象可以完成屏幕图像截取操作,控制鼠标,键盘,如此便可以轻而易举地实现远程服务器的控制.本文向大家介绍如何用Java Robot对象实现远程服务器的控制,并 ...

  4. 数据结构-数组-字符串匹配:Knuth-Morris-Pratt算法(详解附完整代码)

    字符串匹配 字符串抽象数据类型 字符串模式匹配 简单的字符串匹配 Knuth-Morris-Pratt算法 背景分析 失配函数 定义 实现方法 函数分析 KMP函数 实现方法 函数分析 失配信息的另一 ...

  5. C# 调用高德地图API获取经纬度以及定位,JS获取定位【万字详解附完整代码】

    最近有个需求,需要用到定位,本来打算用百度地图API定位,但是发现百度地图定位申请AppKey太麻烦了.因为是写的web端,百度地图定位API申请的Appkey需要网址过滤.索性就用高德定位了(有一说 ...

  6. 小程序云开发详解(附开源云开发项目)

    云数据库,云函数,云储存(附开源云开发项目) 欢迎点击: 个人官网博客. github源码: 多功能记账本 扫码体验: 云数据库基本操作(增删改查,链表) 云开发极大的方便了前端开发者,是前端工程师的 ...

  7. 一、全国医保接口开发详解(整体介绍)

    一.开发过程 1.需求分析 第一.首先肯定要仔细阅读接口文档,设计接口系统整体架构,也就是接口系统.HIS系统.医保系统各自的职责. 搞清楚文档接口要实现的技术,是调用程序库的方式还是webapi方式 ...

  8. lenet 5 代码 matlab,Lenet 和 Lenet5 结构简单粗暴详解(附完整代码)

    LeNet LeNet 早期用来识别手写体数字的图像的卷积神经网络 组成部分: 卷积层块 全连接层块 138CFD41-65C8-4ED7-9FB6-ACA8D5E98FEF.png image.pn ...

  9. 《Android游戏开发详解》一1.8 控制流程第2部分——while和for循环

    本节书摘来异步社区<Android游戏开发详解>一书中的第1章,第1.8节,译者: 李强 责编: 陈冀康,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.8 ...

最新文章

  1. Python进阶-----类、对象的相关知识
  2. DOM对象和内置对象(中)
  3. java Queue常用方法
  4. Regular in UltraEdit
  5. xp和win 2003远程桌面强制进入命令_远程登录t人命令
  6. python下电影_Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法...
  7. selenium自定义find_element
  8. 格力电器详解举报奥克斯 巨头互撕为哪般?
  9. 蓝桥杯基础练习字母图形
  10. 第十六篇 Python之迭代器与生成器
  11. 攻克python3-面向对象
  12. 搭建Linux环境学习C语言
  13. Python基础: python3书籍推荐
  14. selenium-模拟登录QQ空间(附模拟滑动验证码)
  15. 探索学习 Vue 组件篇 第二篇 组件类型:非单文件组件
  16. V神的2019和2021
  17. shell脚本练习(随机取名)
  18. 【本人秃顶程序员】分享一些数据结构与算法常用的算法技巧总结
  19. ghost系统后只有一个盘了别的分区的数据怎样恢复
  20. 用python语言实现喇叭发声原理_一文看懂音频原理

热门文章

  1. 小结过去几个月+复盘遇到的一些问题
  2. 3D游戏建模通过培训机构入行靠谱吗?
  3. java-php-python-springboot智慧问诊系统计算机毕业设计
  4. ArcGIS API for JS4.8绘制点、线、面、矩形、圆
  5. FDisk支持的文件系统类型
  6. 网络基础知识(局域网、OSI模型、传输介质)
  7. cdr三角形转化为圆角_cdr三角形转化为圆角_cdr怎么把直角变成圆角
  8. 数据结构——二叉树 1.0
  9. java中的person类_java编程问题创建person类
  10. 安装RPM时报错Error: GPG check FAILED