网上搜资料时,网友都说官方文档太垃圾了不易看懂,如何如何的。现在个人整理了一个通俗易懂易上手的,希望可以帮助到刚接触微信接口的你。

请看流程图!看懂图,就懂了一半了:

其实整体流程大体只需三步:用户点击登录按钮(其实就相当于一个链接) ---》  用户点击授权登录  ----》  实现获取用户信息代码。

然后获取用户信息代码只需三步:获取code  ----》 通过code获取access_token和openId  ---》 通过access_token和openId获取用户信息(包含union)。

以上便是整体套路,当然官网上也有,但具体如何实现呢?

不着急,咱们一步一步来!

第一步:微信登录按钮

它其实就是一个连接,不过想得到这个链接,有一点点麻烦。

1、设置。 微信公众平台---》接口权限---》网页授权---》修改 ---》设置网页授权域名(域名,不含http://),其实就是微信调你的java方法的项目路径或项目域名,如:www.zzff.net/pp ---》点击设置后弹出页面(大致意思,将MP_verify_31qRIDcjN8ZD1lVJ.txt放在你项目路径下面,如:www.ffzz.net/pp/MP_verify_31qRIDcjN8ZD1lVJ.txt 能访问到) ---》点击确认,授权回调页面域名设置成功!

2、拼链接。   https://open.weixin.qq.com/connect/oauth2/authorize?appid=xxx公众号IDxxxxx   &  redirect_uri = 授权回调页面域名/你的action(即微信授权后跳向的地址)

& response_type=code(固定的) & scope = snsapi_userinfo(或者snsapi_base默认授权)  & state=STATE#wechat_redirect

如:https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect

这个链接中参数的具体含义,官方解释如下:

参数是否必须说明

appid

公众号的唯一标识

redirect_uri

授权后重定向的回调链接地址,请使用urlencode对链接进行处理

response_type

返回类型,请填写code

scope

应用授权作用域,snsapi_base (不弹出授权页面,直接跳转,只能获取用户openid),snsapi_userinfo (弹出授权页面,可通过openid拿到昵称、性别、所在地。并且,即使在未关注的情况下,只要用户授权,也能获取其信息)

state

重定向后会带上state参数,开发者可以填写a-zA-Z0-9的参数值,最多128字节

#wechat_redirect

无论直接打开还是做页面302重定向时候,必须带此参数

第二步:授权确认登录

这一步最简单,第一步登录链接拼好后,在手机微信中打开,微信便会跳转到确认授权页面,点击确认授权即可。(这一步,不用开发者做处理!)

第三步:获取用户信息 (重点)这一步便是真正的代码实现的地方。开篇便讲了,它只需三步:获取code  ----》 通过code获取access_token和openId  ---》 通过access_token和openId获取用户信息。

First:获取code

Second:  获取网页授权access_token和openId

Third:通过access_token和openId获取用户信息。

关于union机制的细节:如果开发者需要公众号微信登录和APP微信登录共用一个微信ID,那个就需要union机制了。其实很简单,只需在微信开放平台(open.weixin.qq.com)绑定公众号,获取用户信息时就会返回union字段。

具体代码实现为:实体 ----  方法  --- 工具

实体Oauth2Token:

1 packagecom.wfcm.wxUitls;2

3 /**

4 * 类名: WeixinOauth2Token 5 * 描述: 网页授权信息 6 * 创建时间: 2015-11-27 7 * 发布版本:V1.0 8 */

9 public classOauth2Token {10 //网页授权接口调用凭证

11 privateString accessToken;12 //凭证有效时长

13 private intexpiresIn;14 //用于刷新凭证

15 privateString refreshToken;16 //用户标识

17 privateString openId;18 //用户授权作用域

19 privateString scope;20

21 publicString getAccessToken() {22 returnaccessToken;23 }24

25 public voidsetAccessToken(String accessToken) {26 this.accessToken =accessToken;27 }28

29 public intgetExpiresIn() {30 returnexpiresIn;31 }32

33 public void setExpiresIn(intexpiresIn) {34 this.expiresIn =expiresIn;35 }36

37 publicString getRefreshToken() {38 returnrefreshToken;39 }40

41 public voidsetRefreshToken(String refreshToken) {42 this.refreshToken =refreshToken;43 }44

45 publicString getOpenId() {46 returnopenId;47 }48

49 public voidsetOpenId(String openId) {50 this.openId =openId;51 }52

53 publicString getScope() {54 returnscope;55 }56

57 public voidsetScope(String scope) {58 this.scope =scope;59 }60 }

View Code

实体SNSUserInfo:

1 packagecom.wfcm.wxUitls;2

3 importjava.util.List;4

5 /**

6 * 类名: SNSUserInfo 7 * 描述: 通过网页授权获取的用户信息 8 * 开发人员: wzf 9 * 创建时间: 2015-11-27 10 * 发布版本:V1.0 11 */

12 public classSNSUserInfo {13 //用户标识

14 privateString openId;15 //用户昵称

16 privateString nickname;17 //性别(1是男性,2是女性,0是未知)

18 private intsex;19 //国家

20 privateString country;21 //省份

22 privateString province;23 //城市

24 privateString city;25 //用户头像链接

26 privateString headImgUrl;27 //用户特权信息

28 private ListprivilegeList;29

30 privateString unionid;31

32 publicString getUnionid() {33 returnunionid;34 }35

36 public voidsetUnionid(String unionid) {37 this.unionid =unionid;38 }39

40 publicString getOpenId() {41 returnopenId;42 }43

44 public voidsetOpenId(String openId) {45 this.openId =openId;46 }47

48 publicString getNickname() {49 returnnickname;50 }51

52 public voidsetNickname(String nickname) {53 this.nickname =nickname;54 }55

56 public intgetSex() {57 returnsex;58 }59

60 public void setSex(intsex) {61 this.sex =sex;62 }63

64 publicString getCountry() {65 returncountry;66 }67

68 public voidsetCountry(String country) {69 this.country =country;70 }71

72 publicString getProvince() {73 returnprovince;74 }75

76 public voidsetProvince(String province) {77 this.province =province;78 }79

80 publicString getCity() {81 returncity;82 }83

84 public voidsetCity(String city) {85 this.city =city;86 }87

88 publicString getHeadImgUrl() {89 returnheadImgUrl;90 }91

92 public voidsetHeadImgUrl(String headImgUrl) {93 this.headImgUrl =headImgUrl;94 }95

96 public ListgetPrivilegeList() {97 returnprivilegeList;98 }99

100 public void setPrivilegeList(ListprivilegeList) {101 this.privilegeList =privilegeList;102 }103 }

View Code

方法WxController(其中authorize() 方法就是请求第一步获取的链接):

1 packagecom.wfcm.controller;2

3 importjava.io.BufferedReader;4 importjava.io.IOException;5 importjava.io.InputStreamReader;6 importjava.io.UnsupportedEncodingException;7 importjava.net.URL;8 importjava.net.URLConnection;9 importjava.net.URLEncoder;10 importjava.security.MessageDigest;11 importjava.security.NoSuchAlgorithmException;12 importjava.util.ArrayList;13 importjava.util.Formatter;14 importjava.util.HashMap;15 importjava.util.List;16 importjava.util.Map;17 importjava.util.UUID;18

19 importjavax.servlet.http.HttpServletRequest;20 importjavax.servlet.http.HttpServletResponse;21

22 importorg.apache.http.client.utils.URLEncodedUtils;23 importorg.json.JSONObject;24 importorg.slf4j.Logger;25 importorg.slf4j.LoggerFactory;26 importorg.springframework.beans.factory.annotation.Autowired;27 importorg.springframework.stereotype.Controller;28 importorg.springframework.web.bind.annotation.RequestMapping;29 importorg.springframework.web.bind.annotation.ResponseBody;30

31 importcom.alibaba.fastjson.JSON;32 importcom.alibaba.fastjson.JSONArray;33 importcom.alibaba.fastjson.util.IOUtils;34 importcom.wfcm.annotation.IgnoreSign;35 importcom.wfcm.annotation.IgnoreToken;36 importcom.wfcm.entity.WfMemberEntity;37 importcom.wfcm.service.WfMemberService;38 importcom.wfcm.service.WfMemberSessionService;39 importcom.wfcm.utils.FastJSONUtils;40 importcom.wfcm.utils.NetUtil;41 importcom.wfcm.utils.R;42 importcom.wfcm.wxUitls.AccessToken;43 importcom.wfcm.wxUitls.JsapiTicket;44 importcom.wfcm.wxUitls.Oauth2Token;45 importcom.wfcm.wxUitls.SNSUserInfo;46

47 @Controller48 @RequestMapping("/wx")49 @ResponseBody50 public classWxController {51

52 private static Logger log = LoggerFactory.getLogger(WxController.class);53

54

55 /**

56 * 向指定URL发送GET方法的请求57 *58 *@paramurl59 * 发送请求的URL60 *@paramparam61 * 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。62 *@returnURL 所代表远程资源的响应结果63 *64 * 用户同意授权,获取code65 */

66 @RequestMapping("/authorize")67 @ResponseBody68 @IgnoreToken69 public staticR authorize() {70 String appid = "wxbb000000000e";71 //String uri ="wftest.zzff.net/wx/weixinLogin";

72 String uri = urlEncodeUTF8("wftest.zzff.net/api/wx/weixinLogin");73 String result = "";74 BufferedReader in = null;75 try{76 String urlNameString = "https://open.weixin.qq.com/connect/oauth2/authorize?appid="+appid+"&redirect_uri="+uri+"&response_type=code&scope=snsapi_userinfo&state=STATE#wechat_redirect";77

78 URL realUrl = newURL(urlNameString);79 //打开和URL之间的连接

80 URLConnection connection =realUrl.openConnection();81 //设置通用的请求属性

82 connection.setRequestProperty("accept", "*/*");83 connection.setRequestProperty("connection", "Keep-Alive");84 connection.setRequestProperty("user-agent",85 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");86 //建立实际的连接

87 connection.connect();88 //获取所有响应头字段

89 Map> map =connection.getHeaderFields();90 //遍历所有的响应头字段

91 for(String key : map.keySet()) {92 System.out.println(key + "--->" +map.get(key));93 }94 //定义 BufferedReader输入流来读取URL的响应

95 in = new BufferedReader(newInputStreamReader(96 connection.getInputStream()));97 String line =null;98 while ((line = in.readLine()) != null) {99 result +=line;100 }101 /*com.alibaba.fastjson.JSONObject jsonObj= FastJSONUtils.getJSONObject(result);102 String access_token = jsonObj.getString("access_token");103 long expires_in = Long.valueOf(jsonObj.getString("expires_in"));104 */

105 } catch(Exception e) {106 System.out.println("发送GET请求出现异常!" +e);107 e.printStackTrace();108 }109 //使用finally块来关闭输入流

110 finally{111 try{112 if (in != null) {113 in.close();114 }115 } catch(Exception e2) {116 e2.printStackTrace();117 }118 }119 returnR.ok(result);120 }121

122 @RequestMapping("/weixinLogin")123 @ResponseBody124 @IgnoreToken125 @IgnoreSign126 public void weixinLogin(HttpServletRequest request,HttpServletResponse response) throwsException {127 //用户同意授权后,能获取到code

128 Map params = request.getParameterMap();//针对get获取get参数

129 String[] codes = params.get("code");//拿到code的值

130 String code = codes[0];//code131 //String[] states = params.get("state");132 //String state = states[0];//state

133

134 System.out.println("****************code:"+code);135 //用户同意授权

136 if (!"authdeny".equals(code)) {137 //获取网页授权access_token

138 Oauth2Token oauth2Token = getOauth2AccessToken("wxb0000000000e", "4c22222233333335555a9", code);139 System.out.println("***********************************oauth2Token信息:"+oauth2Token.toString());140 //网页授权接口访问凭证

141 String accessToken =oauth2Token.getAccessToken();142 //用户标识

143 String openId =oauth2Token.getOpenId();144 //获取用户信息

145 SNSUserInfo snsUserInfo =getSNSUserInfo(accessToken, openId);146 System.out.println("***********************************用户信息unionId:"+snsUserInfo.getUnionid()+"***:"+snsUserInfo.getNickname());147 //设置要传递的参数148

149 //具体业务start150

151 //具体业务end

152

153 String url = "http://wftest.zzff.net/#/biddd?from=login&tokenId="+snsUserInfo.getUnionid();154

155 response.sendRedirect(url);156 return;157 }158 }159

160

161 /**

162 * 获取网页授权凭证163 *164 *@paramappId 公众账号的唯一标识165 *@paramappSecret 公众账号的密钥166 *@paramcode167 *@returnWeixinAouth2Token168 */

169 public staticOauth2Token getOauth2AccessToken(String appId, String appSecret, String code) {170 Oauth2Token wat = null;171 //拼接请求地址

172 String requestUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";173 requestUrl = requestUrl.replace("APPID", appId);174 requestUrl = requestUrl.replace("SECRET", appSecret);175 requestUrl = requestUrl.replace("CODE", code);176 //获取网页授权凭证

177 com.alibaba.fastjson.JSONObject jsonObject =JSON.parseObject(NetUtil.get(requestUrl));178 if (null !=jsonObject) {179 try{180 wat = newOauth2Token();181 wat.setAccessToken(jsonObject.getString("access_token"));182 wat.setExpiresIn(jsonObject.getInteger("expires_in"));183 wat.setRefreshToken(jsonObject.getString("refresh_token"));184 wat.setOpenId(jsonObject.getString("openid"));185 wat.setScope(jsonObject.getString("scope"));186 } catch(Exception e) {187 wat = null;188 int errorCode = jsonObject.getInteger("errcode");189 String errorMsg = jsonObject.getString("errmsg");190 log.error("获取网页授权凭证失败 errcode:{} errmsg:{}", errorCode, errorMsg);191 }192 }193 returnwat;194 }195

196 /**

197 * 通过网页授权获取用户信息198 *199 *@paramaccessToken 网页授权接口调用凭证200 *@paramopenId 用户标识201 *@returnSNSUserInfo202 */

203 public staticSNSUserInfo getSNSUserInfo(String accessToken, String openId) {204 SNSUserInfo snsUserInfo = null;205 //拼接请求地址

206 String requestUrl = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";207 requestUrl = requestUrl.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);208 //通过网页授权获取用户信息

209 com.alibaba.fastjson.JSONObject jsonObject =JSON.parseObject(NetUtil.get(requestUrl));210

211 if (null !=jsonObject) {212 try{213 snsUserInfo = newSNSUserInfo();214 //用户的标识

215 snsUserInfo.setOpenId(jsonObject.getString("openid"));216 //昵称

217 snsUserInfo.setNickname(jsonObject.getString("nickname"));218 //性别(1是男性,2是女性,0是未知)

219 snsUserInfo.setSex(jsonObject.getInteger("sex"));220 //用户所在国家

221 snsUserInfo.setCountry(jsonObject.getString("country"));222 //用户所在省份

223 snsUserInfo.setProvince(jsonObject.getString("province"));224 //用户所在城市

225 snsUserInfo.setCity(jsonObject.getString("city"));226 //用户头像

227 snsUserInfo.setHeadImgUrl(jsonObject.getString("headimgurl"));228 //用户特权信息

229 List list = JSON.parseArray(jsonObject.getString("privilege"),String.class);230 snsUserInfo.setPrivilegeList(list);231 //与开放平台共用的唯一标识,只有在用户将公众号绑定到微信开放平台帐号后,才会出现该字段。

232 snsUserInfo.setUnionid(jsonObject.getString("unionid"));233 } catch(Exception e) {234 snsUserInfo = null;235 int errorCode = jsonObject.getInteger("errcode");236 String errorMsg = jsonObject.getString("errmsg");237 log.error("获取用户信息失败 errcode:{} errmsg:{}", errorCode, errorMsg);238 }239 }240 returnsnsUserInfo;241 }242

243 /**

244 * URL编码(utf-8)245 *246 *@paramsource247 *@return

248 */

249 public staticString urlEncodeUTF8(String source) {250 String result =source;251 try{252 result = java.net.URLEncoder.encode(source, "utf-8");253 } catch(UnsupportedEncodingException e) {254 e.printStackTrace();255 }256 returnresult;257 }258

259 private static String byteToHex(final byte[] hash) {260 Formatter formatter = newFormatter();261 for (byteb : hash)262 {263 formatter.format("%02x", b);264 }265 String result =formatter.toString();266 formatter.close();267 returnresult;268 }269

270 private staticString create_nonce_str() {271 returnUUID.randomUUID().toString();272 }273

274 private staticString create_timestamp() {275 return Long.toString(System.currentTimeMillis() / 1000);276 }277 }

View Code

工具NetUtil:

1 packagecom.wfcm.utils;2

3 importjava.io.BufferedInputStream;4 importjava.io.IOException;5 importjava.io.InputStreamReader;6 importjava.io.UnsupportedEncodingException;7 importjava.util.ArrayList;8 importjava.util.Collection;9 importjava.util.List;10 importjava.util.Map;11

12 importorg.apache.commons.httpclient.NameValuePair;13 importorg.apache.http.HttpEntity;14 importorg.apache.http.HttpResponse;15 importorg.apache.http.client.entity.UrlEncodedFormEntity;16 importorg.apache.http.client.methods.HttpGet;17 importorg.apache.http.client.methods.HttpPost;18 importorg.apache.http.impl.client.CloseableHttpClient;19 importorg.apache.http.impl.client.HttpClientBuilder;20 importorg.apache.http.message.BasicNameValuePair;21

22 /**

23 * Created by Song on 2016/11/28.24 * 基于HttpClient提供网络访问工具25 */

26 public final classNetUtil {27 public static CloseableHttpClient httpClient =HttpClientBuilder.create().build();28

29 /**

30 * get请求获取String类型数据31 *@paramurl 请求链接32 *@return

33 */

34 public staticString get(String url){35 StringBuffer sb = newStringBuffer();36 HttpGet httpGet = newHttpGet(url);37 try{38 HttpResponse response = httpClient.execute(httpGet); //1

39

40 HttpEntity entity =response.getEntity();41 InputStreamReader reader = new InputStreamReader(entity.getContent(),"utf-8");42 char[] charbufer;43 while (0

47 e.printStackTrace();48 }finally{49 httpGet.releaseConnection();50 }51 returnsb.toString();52 }53

54 /**

55 * post方式请求数据56 *@paramurl 请求链接57 *@paramdata post数据体58 *@return

59 */

60 @SuppressWarnings("unchecked")61 public static String post(String url, Mapdata){62 StringBuffer sb = newStringBuffer();63 HttpPost httpPost = newHttpPost(url);64 List valuePairs = new ArrayList();65 if(null !=data) {66 for(String key : data.keySet()) {67 valuePairs.addAll((Collection extends NameValuePair>) newBasicNameValuePair(key, data.get(key)));68 }69 }70 try{71 httpPost.setEntity(new UrlEncodedFormEntity((List extends org.apache.http.NameValuePair>) valuePairs));72 HttpResponse response =httpClient.execute(httpPost);73 HttpEntity httpEntity =response.getEntity();74 BufferedInputStream bis = newBufferedInputStream(httpEntity.getContent());75 byte[] buffer;76 while (0

80 e.printStackTrace();81 }catch (IOException e){//请求出错

82 e.printStackTrace();83 }finally{84 httpPost.releaseConnection();85 }86 returnsb.toString();87 }88

89

90 }

View Code

R类:

packagecom.wfcm.utils;importjava.util.HashMap;importjava.util.Map;/*** 返回数据

*

*@authorxlf

* @email xlfbe696@gmail.com

* @date 2017年4月19日 上午11:58:56*/

public class R extends HashMap{private static final long serialVersionUID = 1L;public static final String SUCCESS = "success";public static final String EXCEPTION = "exception";public static final Integer SUCCESSCODE = 0;public static final Integer EXCEPTIONCODE = 500;publicR() {

put("errCode", 0);

put("msg", SUCCESS);

}public R(intcode, String msg){

put("errCode", code);

put("msg", msg);

}public staticR error() {return error(500, "未知异常,请联系管理员");

}public staticR error(String msg) {return error(500, msg);

}public static R error(intcode, String msg) {

R r= newR();

r.put("errCode", code);

r.put("msg", msg);returnr;

}public staticR ok(String msg) {

R r= newR();

r.put("msg", msg);returnr;

}public static R ok(Mapmap) {

R r= newR();

r.putAll(map);returnr;

}public staticR ok() {return newR();

}publicR put(String key, Object value) {super.put(key, value);return this;

}

}

View Code

OK,大功告成!整体流程已经搭建起来,读懂了这些代码差不多就明白了整个流程了,然后再看官方文档,你会觉得读起来很顺畅,而不是刚开始那种味同嚼蜡的感觉。你只需再根据官方文档仔细检查检查流程,有没有需要完善的地方,就可以了。

还等什么呢,赶快敲实现功能吧!!!

微信授权登录 java_[JAVA实现]微信公众号网页授权登录相关推荐

  1. easywechat微信开发系列(1):公众号网页授权

    准备工作: 1.已认证的服务号(apppid.appsecret.token.aes_key) 2.安全域名 3.已经用composer安装好easywechat 1.config/app.php 的 ...

  2. 微信网页扫码登录和公众号网页授权登录的比较

    最近在做PC二维码扫码登录的功能,总结了一些问题 # 主要区别 二者的主要区别: 差异 PC网页扫码登录 公众号网页授权登录 账号要求 需要开放平台账号创建网站应用 一个认证过的服务号就可以(也可以使 ...

  3. 微信公众号网页授权登录的超简单实现步骤

    微信开放平台为第三方移动程序提供分享.传播的接口, 使用户可将第三方程序的内容发布给好友或分享至朋友圈, 下面这篇文章主要给大家介绍了关于微信公众号网页授权登录的超简单实现方法, 需要的朋友可以参考下 ...

  4. 微信公众号网页授权思路解析及具体代码

    微信公众号网页授权思路解析及具体代码 微信开发文档 实现方式也是两种: 1.静默授权登录 授权登录以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静 ...

  5. 微信公众号网页授权代码优化过程(一)

    2019独角兽企业重金招聘Python工程师标准>>> 第一次更新 写本系列博客的主要原因是,我在处理一个微信公众号项目时要做一个网页授权的操作(官方地址是https://mp.we ...

  6. 微信公众号网页授权--前端获取code及用户信息(vue)

    前段时间开发微信公众号网页授权,虽然网上已经有很多关于这方面的博客或者教程,但是第一次开发还是遇到挺多坑的,以下分享一下我的踩坑填坑之路. 一.测试号相关配置 首先在你公司申请的测试号上配置好相关信息 ...

  7. 微信公众号网页授权--前端获取code及用户信息(vue)【简单详细版】

    嗨喽大家好,前段时间开发微信公众号网页授权,虽然网上已经有很多关于这方面的博客或者教程,但是第一次开发还是遇到挺多坑的,以下分享一下我的遇到的一些问题的见解,希望对你们有帮助. 一.测试号相关配置 首 ...

  8. 微信公众号网页授权,获取用户信息以及openid -- PHP后台

    微信公众号网页授权,获取用户信息以及openid 这几天做项目,想通过公众号的appid获取用户的openid就,然后在网上查资料,问朋友,最后找到了方法,就是这个网页授权. 起初一直很蒙,这个怎么弄 ...

  9. 微信公众号网页授权时序图

    微信公众号网页授权时序图 公众号网页授权时序图

  10. 微信公众号网页授权40163问题【php】

    微信公众号网页授权40163问题 tp5为例,emmmm-一直报40163或40029问题,翻遍了各大网站都没找到合适我的办法. 如图: 解决之后如图: 因为重定向所以请求了两次code,所以一直报4 ...

最新文章

  1. spark sql 上个月_SPARK-SQL内置函数之时间日期类
  2. 【数据竞赛】数据竞赛中最贵的四个特征
  3. iPhone设备分辨率及尺寸
  4. Vue如何在data中正确引入图片路径
  5. python apache mysql_在Linux系统上部署Apache+Python+Django+MySQL环境
  6. 《Linux命令行与shell脚本编程大全 第3版》高级Shell脚本编程---24
  7. 一篇相当不错的function入门文章
  8. 剑指Offer之左旋字符串
  9. 微信小程序四种父子相互传值方式
  10. java实现rabbitmq路由模型(routing/topic queues), 生产者 消费者 交换机 消息队列
  11. 数字图像处理matlab 版下载,数字图像处理(MATLAB版)
  12. cka教程_区块链入门教程solidity函数详解
  13. Photoshop CS6 破解
  14. ps怎么把模糊的图片变清楚
  15. mysql服务状态一直是启动解决方案
  16. 基于51单片机——60秒倒计时时钟
  17. 常用Intent合集 Android
  18. ADB使用及日志分析
  19. 关于以太网IO模块如何选型
  20. APP测试与WEB测试的区别

热门文章

  1. 怎么在图片上编辑文字?图片加字这样做
  2. 大数据平台开发公司有哪些?
  3. Android 不透明度 对应表
  4. mac删除默认ABC输入法,mac删除自带ABC输入法
  5. k3595参数_全系列三极管应用参数
  6. U盘写保护,不能被格式化
  7. python爬取某人所有微博_python爬取微博用户关注和粉丝的公开基本信息
  8. Go的安装使用(一)
  9. 数学分析-极值点、拐点
  10. 复旦退休教授直播间吸烟被举报:此前因违规吸烟被学校要求做检讨