北京品牌网站,网站优化效果查询,怎么免费做公司网站,校园门户网站建设先进一个简单的微信授权登录的demo#xff0c;我这边没有建表#xff0c;是存到redis里面了#xff0c;仅供参考#xff0c;后续可以扩展自己的业务逻辑#xff0c;把登录信息存在表里面。 前端小程序代码#xff1a;
viewview classlogin-icon我这边没有建表是存到redis里面了仅供参考后续可以扩展自己的业务逻辑把登录信息存在表里面。 前端小程序代码
viewview classlogin-iconimage classlogin-img src../resource/images/dsp.jpg/image/viewview classlogin-fromform bindsubmitdoLogin!--账号--view classinputViewimage classnameImage src../resource/images/username.png/imagelabel classloginLabel账号/labelinput nameusername valueimooc classinputText placeholder请输入账号 //viewview classline/view!--密码--view classinputViewimage classkeyImage src../resource/images/password.png/imagelabel classloginLabel密码/labelinput namepassword valueimooc classinputText passwordtrue placeholder请输入密码 //view!--按钮--viewbutton classloginBtn typeprimary普通登录/button/viewviewbutton classgoRegistBtn typewarn open-typegetUserInfo bindgetuserinfodoLogin微信登录/button/view/form/view
/view
page {background-color: whitesmoke;
}.login-img {width: 750rpx;
}/*表单内容*/
.inputView {background-color: white;line-height: 45px;
}/*输入框*/
.nameImage, .keyImage {margin-left: 22px;width: 20px;height: 20px;
}.loginLabel {margin: 15px 15px 15px 10px;color: gray;font-size: 15px;
}.inputText {float: right;text-align: right;margin-right: 22px;margin-top: 11px;font-size: 15px;
}.line {width: 100%;height: 1px;background-color: gainsboro;margin-top: 1px;
}/*按钮*/
.loginBtn {width: 80%;margin-top: 35px;
}.goRegistBtn {width: 80%;margin-top: 15px;
}const app getApp()Page({data: {},onLoad: function (params) {},// 登录 doLogin: function (e) {console.log(e.detail.errMsg)console.log(e.detail.userInfo)console.log(e.detail.rawData)wx.login({success: function(res) {console.log(res)// 获取登录的临时凭证var code res.code;// 调用后端获取微信的session_key, secretwx.request({url: http://127.0.0.1:8080/wxLogin?code code,method: POST,success: function(result) {console.log(result);// 保存用户信息到本地缓存可以用作小程序端的拦截器app.setGlobalUserInfo(e.detail.userInfo);wx.redirectTo({//成功后跳转到首页url: ../index/index,})}})}})}
}) 后端代码:
public class WXSessionModel {private String session_key;private String openid;public String getSession_key() {return session_key;}public void setSession_key(String session_key) {this.session_key session_key;}public String getOpenid() {return openid;}public void setOpenid(String openid) {this.openid openid;}
}import java.util.HashMap;
import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;import com.fasterxml.jackson.databind.annotation.JsonAppend.Attr;
import com.test.common.HttpClientUtil;
import com.test.common.IMoocJSONResult;
import com.test.common.JsonUtils;
import com.test.common.RedisOperator;
import com.test.model.WXSessionModel;RestController
public class WXLoginController {Autowiredprivate RedisOperator redis;PostMapping(/wxLogin)public JSONResult wxLogin(String code) {System.out.println(wxlogin - code: code);// https://api.weixin.qq.com/sns/jscode2session?
// appidAPPID
// secretSECRET
// js_codeJSCODE
// grant_typeauthorization_codeString url https://api.weixin.qq.com/sns/jscode2session;MapString, String param new HashMap();param.put(appid, 换成自己的appid);param.put(secret, 换成自己的secret);param.put(js_code, code);param.put(grant_type, authorization_code);String wxResult HttpClientUtil.doGet(url, param);System.out.println(wxResult);WXSessionModel model JsonUtils.jsonToPojo(wxResult, WXSessionModel.class);// 存入session到redisredis.set(user-redis-session: model.getOpenid(), model.getSession_key(), 1000 * 60 * 30);return IMoocJSONResult.ok();}}工具类
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;public class HttpClientUtil {public static String doGet(String url, MapString, String param) {// 创建Httpclient对象CloseableHttpClient httpclient HttpClients.createDefault();String resultString ;CloseableHttpResponse response null;try {// 创建uriURIBuilder builder new URIBuilder(url);if (param ! null) {for (String key : param.keySet()) {builder.addParameter(key, param.get(key));}}URI uri builder.build();// 创建http GET请求HttpGet httpGet new HttpGet(uri);// 执行请求response httpclient.execute(httpGet);// 判断返回状态是否为200if (response.getStatusLine().getStatusCode() 200) {resultString EntityUtils.toString(response.getEntity(), UTF-8);}} catch (Exception e) {e.printStackTrace();} finally {try {if (response ! null) {response.close();}httpclient.close();} catch (IOException e) {e.printStackTrace();}}return resultString;}public static String doGet(String url) {return doGet(url, null);}public static String doPost(String url, MapString, String param) {// 创建Httpclient对象CloseableHttpClient httpClient HttpClients.createDefault();CloseableHttpResponse response null;String resultString ;try {// 创建Http Post请求HttpPost httpPost new HttpPost(url);// 创建参数列表if (param ! null) {ListNameValuePair paramList new ArrayList();for (String key : param.keySet()) {paramList.add(new BasicNameValuePair(key, param.get(key)));}// 模拟表单UrlEncodedFormEntity entity new UrlEncodedFormEntity(paramList);httpPost.setEntity(entity);}// 执行http请求response httpClient.execute(httpPost);resultString EntityUtils.toString(response.getEntity(), utf-8);} catch (Exception e) {e.printStackTrace();} finally {try {response.close();} catch (IOException e) {e.printStackTrace();}}return resultString;}public static String doPost(String url) {return doPost(url, null);}public static String doPostJson(String url, String json) {// 创建Httpclient对象CloseableHttpClient httpClient HttpClients.createDefault();CloseableHttpResponse response null;String resultString ;try {// 创建Http Post请求HttpPost httpPost new HttpPost(url);// 创建请求内容StringEntity entity new StringEntity(json, ContentType.APPLICATION_JSON);httpPost.setEntity(entity);// 执行http请求response httpClient.execute(httpPost);resultString EntityUtils.toString(response.getEntity(), utf-8);} catch (Exception e) {e.printStackTrace();} finally {try {response.close();} catch (IOException e) {e.printStackTrace();}}return resultString;}
}/*** Description: 自定义响应数据结构* 这个类是提供给门户ios安卓微信商城用的* 门户接受此类数据后需要使用本类的方法转换成对于的数据类型格式类或者list* 其他自行处理* 200表示成功* 500表示错误错误信息在msg字段中* 501bean验证错误不管多少个错误都以map形式返回* 502拦截器拦截到用户token出错* 555异常抛出信息*/
public class JSONResult {// 响应业务状态private Integer status;// 响应消息private String msg;// 响应中的数据private Object data;private String ok; // 不使用public static JSONResult build(Integer status, String msg, Object data) {return new JSONResult(status, msg, data);}public static JSONResult ok(Object data) {return new JSONResult(data);}public static JSONResult ok() {return new JSONResult(null);}public static JSONResult errorMsg(String msg) {return new JSONResult(500, msg, null);}public static JSONResult errorMap(Object data) {return new JSONResult(501, error, data);}public static JSONResult errorTokenMsg(String msg) {return new JSONResult(502, msg, null);}public static JSONResult errorException(String msg) {return new JSONResult(555, msg, null);}public JSONResult() {}public JSONResult(Integer status, String msg, Object data) {this.status status;this.msg msg;this.data data;}public JSONResult(Object data) {this.status 200;this.msg OK;this.data data;}public Boolean isOK() {return this.status 200;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status status;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg msg;}public Object getData() {return data;}public void setData(Object data) {this.data data;}public String getOk() {return ok;}public void setOk(String ok) {this.ok ok;}}
import java.util.List;import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JavaType;
import com.fasterxml.jackson.databind.ObjectMapper;/*** * Description: 自定义响应结构, 转换类*/
public class JsonUtils {// 定义jackson对象private static final ObjectMapper MAPPER new ObjectMapper();/*** 将对象转换成json字符串。* pTitle: pojoToJson/p* pDescription: /p* param data* return*/public static String objectToJson(Object data) {try {String string MAPPER.writeValueAsString(data);return string;} catch (JsonProcessingException e) {e.printStackTrace();}return null;}/*** 将json结果集转化为对象* * param jsonData json数据* param clazz 对象中的object类型* return*/public static T T jsonToPojo(String jsonData, ClassT beanType) {try {T t MAPPER.readValue(jsonData, beanType);return t;} catch (Exception e) {e.printStackTrace();}return null;}/*** 将json数据转换成pojo对象list* pTitle: jsonToList/p* pDescription: /p* param jsonData* param beanType* return*/public static TListT jsonToList(String jsonData, ClassT beanType) {JavaType javaType MAPPER.getTypeFactory().constructParametricType(List.class, beanType);try {ListT list MAPPER.readValue(jsonData, javaType);return list;} catch (Exception e) {e.printStackTrace();}return null;}}import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;/*** Description: 使用redisTemplate的操作实现类 */
Component
public class RedisOperator {// Autowired
// private RedisTemplateString, Object redisTemplate;Autowiredprivate StringRedisTemplate redisTemplate;// Key键简单的key-value操作/*** 实现命令TTL key以秒为单位返回给定 key的剩余生存时间(TTL, time to live)。* * param key* return*/public long ttl(String key) {return redisTemplate.getExpire(key);}/*** 实现命令expire 设置过期时间单位秒* * param key* return*/public void expire(String key, long timeout) {redisTemplate.expire(key, timeout, TimeUnit.SECONDS);}/*** 实现命令INCR key增加key一次* * param key* return*/public long incr(String key, long delta) {return redisTemplate.opsForValue().increment(key, delta);}/*** 实现命令KEYS pattern查找所有符合给定模式 pattern的 key*/public SetString keys(String pattern) {return redisTemplate.keys(pattern);}/*** 实现命令DEL key删除一个key* * param key*/public void del(String key) {redisTemplate.delete(key);}// String字符串/*** 实现命令SET key value设置一个key-value将字符串值 value关联到 key* * param key* param value*/public void set(String key, String value) {redisTemplate.opsForValue().set(key, value);}/*** 实现命令SET key value EX seconds设置key-value和超时时间秒* * param key* param value* param timeout* 以秒为单位*/public void set(String key, String value, long timeout) {redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);}/*** 实现命令GET key返回 key所关联的字符串值。* * param key* return value*/public String get(String key) {return (String)redisTemplate.opsForValue().get(key);}// Hash哈希表/*** 实现命令HSET key field value将哈希表 key中的域 field的值设为 value* * param key* param field* param value*/public void hset(String key, String field, Object value) {redisTemplate.opsForHash().put(key, field, value);}/*** 实现命令HGET key field返回哈希表 key中给定域 field的值* * param key* param field* return*/public String hget(String key, String field) {return (String) redisTemplate.opsForHash().get(key, field);}/*** 实现命令HDEL key field [field ...]删除哈希表 key 中的一个或多个指定域不存在的域将被忽略。* * param key* param fields*/public void hdel(String key, Object... fields) {redisTemplate.opsForHash().delete(key, fields);}/*** 实现命令HGETALL key返回哈希表 key中所有的域和值。* * param key* return*/public MapObject, Object hgetall(String key) {return redisTemplate.opsForHash().entries(key);}// List列表/*** 实现命令LPUSH key value将一个值 value插入到列表 key的表头* * param key* param value* return 执行 LPUSH命令后列表的长度。*/public long lpush(String key, String value) {return redisTemplate.opsForList().leftPush(key, value);}/*** 实现命令LPOP key移除并返回列表 key的头元素。* * param key* return 列表key的头元素。*/public String lpop(String key) {return (String)redisTemplate.opsForList().leftPop(key);}/*** 实现命令RPUSH key value将一个值 value插入到列表 key的表尾(最右边)。* * param key* param value* return 执行 LPUSH命令后列表的长度。*/public long rpush(String key, String value) {return redisTemplate.opsForList().rightPush(key, value);}} pom文件
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.test/groupIdartifactIdtest-springboot-wxlogin/artifactIdversion0.0.1-SNAPSHOT/versionpackagingwar/packagingnametest-springboot-wxlogin/namedescriptiontest-springboot-wxlogin/descriptionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion1.5.12.RELEASE/versionrelativePath/ !-- lookup parent from repository --/parentpropertiesproject.build.sourceEncodingUTF-8/project.build.sourceEncodingproject.reporting.outputEncodingUTF-8/project.reporting.outputEncodingjava.version1.8/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter/artifactIdexclusions!-- 排除springboot默认的logback日志框架 --exclusiongroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-logging/artifactId/exclusion/exclusions/dependency!-- 引入log4j日志依赖 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-log4j/artifactIdversion1.3.8.RELEASE/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-tomcat/artifactIdscopeprovided/scope/dependency!-- apache 工具类 --dependencygroupIdcommons-codec/groupIdartifactIdcommons-codec/artifactIdversion1.11/version/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-lang3/artifactIdversion3.4/version/dependencydependencygroupIdorg.apache.commons/groupIdartifactIdcommons-io/artifactIdversion1.3.2/version/dependency!-- 引入 redis 依赖 --dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-data-redis/artifactId/dependencydependencygroupIdredis.clients/groupIdartifactIdjedis/artifactIdversion2.9.0/version/dependencydependencygroupIdorg.springframework.data/groupIdartifactIdspring-data-redis/artifactIdversion1.8.7.RELEASE/version/dependency!-- httpclient --dependencygroupIdorg.apache.httpcomponents/groupIdartifactIdhttpclient/artifactIdversion4.3.5/version/dependency/dependencies/project