PC 微信掃碼登陸

目錄
1何鸡、注冊(cè)微信開(kāi)發(fā)平臺(tái)
2、微信開(kāi)發(fā)平臺(tái)添加網(wǎng)站應(yīng)用
3牛欢、PC微信登錄流程介紹
4骡男、獲取用戶基本信息(UnionID機(jī)制)

1、注冊(cè)微信開(kāi)發(fā)平臺(tái)

官網(wǎng)網(wǎng)址 自行注冊(cè)傍睹,需要注意的是注冊(cè)郵箱號(hào)不用與騰訊其他產(chǎn)品同號(hào)隔盛。

2、微信開(kāi)發(fā)平臺(tái)添加網(wǎng)站應(yīng)用
添加網(wǎng)站應(yīng)用
填寫基本信息
填寫基本信息2
網(wǎng)站信息登記表模板
網(wǎng)站應(yīng)用名稱不能重復(fù)
添加授權(quán)回調(diào)域-可以修改

以上資料提交之后等待TX審核拾稳,審核時(shí)間大概2天左右吮炕,審核通過(guò)之后就可以查看AppID AppSecret以及申請(qǐng)微信登錄
注意:如果注冊(cè)完的開(kāi)放平臺(tái)之后有進(jìn)行開(kāi)發(fā)者認(rèn)證時(shí)访得,審核通過(guò)之后微信登錄默認(rèn)是開(kāi)通的龙亲,如果沒(méi)有進(jìn)行開(kāi)發(fā)者認(rèn)證點(diǎn)擊申請(qǐng)開(kāi)通 時(shí)會(huì)提醒進(jìn)行開(kāi)發(fā)者認(rèn)證(如下圖)

審核通過(guò)
基本信息、開(kāi)發(fā)信息
提醒進(jìn)行開(kāi)發(fā)者認(rèn)證
開(kāi)發(fā)者資質(zhì)認(rèn)證
3悍抑、PC微信登錄流程介紹

網(wǎng)站應(yīng)用微信登錄是基于OAuth2.0協(xié)議標(biāo)準(zhǔn)構(gòu)建的微信OAuth2.0授權(quán)登錄系統(tǒng)鳄炉。進(jìn)一步了解OAuth2.0-----理解OAuth2.0 官方介紹資料

大致的步驟如下:

  1. 第三方發(fā)起微信授權(quán)登錄請(qǐng)求,微信用戶允許授權(quán)第三方應(yīng)用后搜骡,微信會(huì)拉起應(yīng)用或重定向到第三方網(wǎng)站拂盯,并且?guī)鲜跈?quán)臨時(shí)票據(jù)code參數(shù);
  2. 通過(guò)code參數(shù)加上AppID和AppSecret等浆兰,通過(guò)API換取access_token磕仅;
  3. 通過(guò)access_token進(jìn)行接口調(diào)用,獲取用戶基本數(shù)據(jù)資源或幫助用戶實(shí)現(xiàn)基本操作簸呈。
獲取access_token時(shí)序圖
獲取access_token時(shí)序圖

具體的步驟如下:

第一步:請(qǐng)求CODE

接口說(shuō)明
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
參數(shù)說(shuō)明

參數(shù) 是否必須 說(shuō)明
appid 應(yīng)用唯一標(biāo)識(shí)
redirect_uri 重定向地址榕订,需要進(jìn)行UrlEncode
response_type 填code
scope 應(yīng)用授權(quán)作用域,擁有多個(gè)作用域用逗號(hào)(,)分隔蜕便,網(wǎng)頁(yè)應(yīng)用目前僅填寫snsapi_login即可
state 用于保持請(qǐng)求和回調(diào)的狀態(tài)劫恒,授權(quán)請(qǐng)求后原樣帶回給第三方。該參數(shù)可用于防止csrf攻擊(跨站請(qǐng)求偽造攻擊)轿腺,建議第三方帶上該參數(shù)两嘴,可設(shè)置為簡(jiǎn)單的隨機(jī)數(shù)加session進(jìn)行校驗(yàn)

若提示“該鏈接無(wú)法訪問(wèn)”,請(qǐng)檢查參數(shù)是否填寫錯(cuò)誤族壳,如redirect_uri的域名與審核時(shí)填寫的授權(quán)域名不一致或scope不為snsapi_login憔辫。

返回說(shuō)明
用戶允許授權(quán)后,將會(huì)重定向到redirect_uri的網(wǎng)址上仿荆,并且?guī)蟘ode和state參數(shù)


redirect_uri?code=CODE&state=STATE


若用戶禁止授權(quán)贰您,則重定向后不會(huì)帶上code參數(shù)坏平,僅會(huì)帶上state參數(shù)


redirect_uri?state=STATE


接口封裝


    private static String qrconnect_url = "https://open.weixin.qq.com/connect/qrconnect";

 
    /**
     * 生成網(wǎng)頁(yè)二維碼授權(quán)鏈接
     * @param appId 應(yīng)用id
     * @param redirect_uri 回跳地址
     * @return url
     */
    public static String getQrConnectURL(String appId, String redirect_uri) {
        return getQrConnectURL(appId, redirect_uri, null);
    }
    
    /**
     * 生成網(wǎng)頁(yè)二維碼授權(quán)鏈接
     * @param appId 應(yīng)用id
     * @param redirect_uri 回跳地址
     * @param state 重定向后會(huì)帶上state參數(shù),開(kāi)發(fā)者可以填寫a-zA-Z0-9的參數(shù)值锦亦,最多128字節(jié)
     * @return url
     */
    public static String getQrConnectURL(String appId, String redirect_uri, String state) {
        Map<String, String> params = new HashMap<String, String>();
        params.put("appid", appId);
        params.put("response_type", "code");
        params.put("redirect_uri", redirect_uri);
        params.put("scope", "snsapi_login");
        if (StrKit.isBlank(state)) {
            params.put("state", "wx#wechat_redirect");
        } else {
            params.put("state", state.concat("#wechat_redirect"));
        }
        String para = PaymentKit.packageSign(params, false);
        return qrconnect_url + "?" + para;
    }

接口測(cè)試

1舶替、設(shè)置AppId、APPSecret以及回調(diào)域名
2杠园、PC訪問(wèn)測(cè)試顾瞪。開(kāi)源項(xiàng)目中訪問(wèn)地址為:

http://域名/[項(xiàng)目名稱]/toWebOauth
設(shè)置AppId、APPSecret以及回調(diào)域名

//pc掃描登陸
public void toWebOauth(){
    String calbackUrl=PropKit.get("domain")+"/oauth/webCallBack";
    String url=SnsAccessTokenApi.getQrConnectURL(PropKit.get("webAppId"), calbackUrl,"666");
    redirect(url);
}

如果授權(quán)回調(diào)域名與開(kāi)發(fā)平臺(tái)中的填寫不一致將會(huì)出現(xiàn)以下提示

回調(diào)域名與接口調(diào)用時(shí)填寫的域名不一致
第二步:通過(guò)code獲取access_token
第三步:通過(guò)access_token調(diào)用接口獲取用戶信息

第二步抛蚁、第三步過(guò)程與微信公眾號(hào)授權(quán)登錄一樣可以參考之前寫的一篇文章授權(quán)獲取用戶信息

授權(quán)后接口調(diào)用(UnionID)

獲取用戶個(gè)人信息(UnionID機(jī)制)

此接口用于獲取用戶個(gè)人信息陈醒。開(kāi)發(fā)者可通過(guò)OpenID來(lái)獲取用戶基本信息。特別需要注意的是篮绿,如果開(kāi)發(fā)者擁有多個(gè)移動(dòng)應(yīng)用孵延、網(wǎng)站應(yīng)用和公眾帳號(hào),可通過(guò)獲取用戶基本信息中的unionid來(lái)區(qū)分用戶的唯一性亲配,因?yàn)橹灰峭粋€(gè)微信開(kāi)放平臺(tái)帳號(hào)下的移動(dòng)應(yīng)用尘应、網(wǎng)站應(yīng)用和公眾帳號(hào),用戶的unionid是唯一的吼虎。換句話說(shuō)犬钢,同一用戶,對(duì)同一個(gè)微信開(kāi)放平臺(tái)下的不同應(yīng)用思灰,unionid是相同的玷犹。請(qǐng)注意,在用戶修改微信頭像后洒疚,舊的微信頭像URL將會(huì)失效歹颓,因此開(kāi)發(fā)者應(yīng)該自己在獲取用戶信息后,將頭像圖片保存下來(lái)油湖,避免微信頭像URL失效后的異常情況巍扛。

官方介紹文檔

接口封裝可以參考開(kāi)源項(xiàng)目中

網(wǎng)頁(yè)授權(quán)(公眾號(hào)、PC)獲取用戶信息

import com.jfinal.kit.StrKit;
import com.jfinal.weixin.sdk.kit.ParaMap;
import com.jfinal.weixin.sdk.kit.PaymentKit;
import com.jfinal.weixin.sdk.utils.HttpUtils;
import com.jfinal.weixin.sdk.utils.RetryUtils;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;


public class SnsAccessTokenApi
{
    private static String url = "https://api.weixin.qq.com/sns/oauth2/access_token?grant_type=authorization_code";
    private static String authorize_uri = "https://open.weixin.qq.com/connect/oauth2/authorize";
    private static String qrconnect_url = "https://open.weixin.qq.com/connect/qrconnect";
    
    /**
     * 生成Authorize鏈接
     * @param appId 應(yīng)用id
     * @param redirect_uri 回跳地址
     * @param snsapiBase snsapi_base(不彈出授權(quán)頁(yè)面乏德,只能拿到用戶openid)snsapi_userinfo(彈出授權(quán)頁(yè)面撤奸,這個(gè)可以通過(guò) openid 拿到昵稱、性別喊括、所在地)
     * @return url
     */
    public static String getAuthorizeURL(String appId, String redirect_uri, boolean snsapiBase) {
        return getAuthorizeURL(appId, redirect_uri, null, snsapiBase);
    }
    
    /**
     * 生成Authorize鏈接
     * @param appId 應(yīng)用id
     * @param redirectUri 回跳地址
     * @param state 重定向后會(huì)帶上state參數(shù)胧瓜,開(kāi)發(fā)者可以填寫a-zA-Z0-9的參數(shù)值,最多128字節(jié)
     * @param snsapiBase snsapi_base(不彈出授權(quán)頁(yè)面郑什,只能拿到用戶openid)snsapi_userinfo(彈出授權(quán)頁(yè)面府喳,這個(gè)可以通過(guò) openid 拿到昵稱、性別蘑拯、所在地)
     * @return url
     */
    public static String getAuthorizeURL(String appId, String redirectUri, String state, boolean snsapiBase) {
        Map<String, String> params = new HashMap<String, String>();
        params.put("appid", appId);
        params.put("response_type", "code");
        params.put("redirect_uri", redirectUri);
        // snsapi_base(不彈出授權(quán)頁(yè)面劫拢,只能拿到用戶openid)
        // snsapi_userinfo(彈出授權(quán)頁(yè)面肉津,這個(gè)可以通過(guò) openid 拿到昵稱、性別舱沧、所在地)
        if (snsapiBase) {
            params.put("scope", "snsapi_base");
        } else {
            params.put("scope", "snsapi_userinfo");
        }
        if (StrKit.isBlank(state)) {
            params.put("state", "wx#wechat_redirect");
        } else {
            params.put("state", state.concat("#wechat_redirect"));
        }
        String para = PaymentKit.packageSign(params, false);
        return authorize_uri + "?" + para;
    }
    

    /**
     * 生成網(wǎng)頁(yè)二維碼授權(quán)鏈接
     * @param appId 應(yīng)用id
     * @param redirect_uri 回跳地址
     * @return url
     */
    public static String getQrConnectURL(String appId, String redirect_uri) {
        return getQrConnectURL(appId, redirect_uri, null);
    }
    
    /**
     * 生成網(wǎng)頁(yè)二維碼授權(quán)鏈接
     * @param appId 應(yīng)用id
     * @param redirect_uri 回跳地址
     * @param state 重定向后會(huì)帶上state參數(shù),開(kāi)發(fā)者可以填寫a-zA-Z0-9的參數(shù)值偶洋,最多128字節(jié)
     * @return url
     */
    public static String getQrConnectURL(String appId, String redirect_uri, String state) {
        Map<String, String> params = new HashMap<String, String>();
        params.put("appid", appId);
        params.put("response_type", "code");
        params.put("redirect_uri", redirect_uri);
        params.put("scope", "snsapi_login");
        if (StrKit.isBlank(state)) {
            params.put("state", "wx#wechat_redirect");
        } else {
            params.put("state", state.concat("#wechat_redirect"));
        }
        String para = PaymentKit.packageSign(params, false);
        return qrconnect_url + "?" + para;
    }
    
    /**
     * 通過(guò)code獲取access_token
     *
     * @param code   第一步獲取的code參數(shù)
     * @param appId  應(yīng)用唯一標(biāo)識(shí)
     * @param secret 應(yīng)用密鑰AppSecret
     * @return SnsAccessToken
     */
    public static SnsAccessToken getSnsAccessToken(String appId, String secret, String code)
    {
        final Map<String, String> queryParas = ParaMap.create("appid", appId).put("secret", secret).put("code", code).getData();
        
        return RetryUtils.retryOnException(3, new Callable<SnsAccessToken>() {
            
            @Override
            public SnsAccessToken call() throws Exception {
                String json = HttpUtils.get(url, queryParas);
                return new SnsAccessToken(json);
            }
        });
    }
}

用戶管理接口,獲取用戶基本信息(UnionID機(jī)制)

import com.jfinal.weixin.sdk.kit.ParaMap;
import com.jfinal.weixin.sdk.utils.HttpUtils;
import com.jfinal.weixin.sdk.utils.JsonUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 用戶管理 API
 * <pre>
 * https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
 * </pre>
 */
public class UserApi {
    
    private static String getUserInfo = "https://api.weixin.qq.com/cgi-bin/user/info";
    private static String getFollowers = "https://api.weixin.qq.com/cgi-bin/user/get";
    private static String batchGetUserInfo = "https://api.weixin.qq.com/cgi-bin/user/info/batchget?access_token=";

    /**
     * 獲取用戶基本信息(包括UnionID機(jī)制)
     * @param openId 普通用戶的標(biāo)識(shí)熟吏,對(duì)當(dāng)前公眾號(hào)唯一
     * @return ApiResult
     */
    public static ApiResult getUserInfo(String openId) {
        ParaMap pm = ParaMap.create("access_token", AccessTokenApi.getAccessTokenStr()).put("openid", openId).put("lang", "zh_CN");
        return new ApiResult(HttpUtils.get(getUserInfo, pm.getData()));
    }
    
    /**
     * 獲取用戶列表
     * @param nextOpenid 第一個(gè)拉取的OPENID,不填默認(rèn)從頭開(kāi)始拉取
     * @return ApiResult
     */
    public static ApiResult getFollowers(String nextOpenid) {
        ParaMap pm = ParaMap.create("access_token", AccessTokenApi.getAccessTokenStr());
        if (nextOpenid != null)
            pm.put("next_openid", nextOpenid);
        return new ApiResult(HttpUtils.get(getFollowers, pm.getData()));
    }
    
    /**
     * 獲取用戶列表
     * @return ApiResult
     */
    public static ApiResult getFollows() {
        return getFollowers(null);
    }

    /**
     * 批量獲取用戶基本信息, by Unas
     * @param jsonStr json字符串
     * @return ApiResult
     */
    public static ApiResult batchGetUserInfo(String jsonStr) {
        String jsonResult = HttpUtils.post(batchGetUserInfo + AccessTokenApi.getAccessTokenStr(), jsonStr);
        return new ApiResult(jsonResult);
    }
    
    /**
     * 批量獲取用戶基本信息
     * @param openIdList openid列表
     * @return ApiResult
     */
    public static ApiResult batchGetUserInfo(List<String> openIdList) {
        Map<String, List<Map<String, Object>>> userListMap = new HashMap<String, List<Map<String, Object>>>();
        
        List<Map<String, Object>> userList = new ArrayList<Map<String,Object>>();
        for (String openId : openIdList) {
            Map<String, Object> mapData = new HashMap<String, Object>();
            mapData.put("openid", openId);
            mapData.put("lang", "zh_CN");
            userList.add(mapData);
        }
        userListMap.put("user_list", userList);
        
        return batchGetUserInfo(JsonUtils.toJson(userListMap));
    }
    
    private static String updateRemarkUrl = "https://api.weixin.qq.com/cgi-bin/user/info/updateremark?access_token=";
    
    /**
     * 設(shè)置備注名
     * @param openid 用戶標(biāo)識(shí)
     * @param remark 新的備注名玄窝,長(zhǎng)度必須小于30字符
     * @return {ApiResult}
     */
    public static ApiResult updateRemark(String openid, String remark) {
        String url = updateRemarkUrl + AccessTokenApi.getAccessTokenStr();
        
        Map<String, String> mapData = new HashMap<String, String>();
        mapData.put("openid", openid);
        mapData.put("remark", remark);
        String jsonResult = HttpUtils.post(url, JsonUtils.toJson(mapData));
        
        return new ApiResult(jsonResult);
    }
}

推薦閱讀
Android版-微信APP支付
極速開(kāi)發(fā)微信公眾號(hào)之微信買單
極速開(kāi)發(fā)微信公眾號(hào)之公眾號(hào)支付
極速開(kāi)發(fā)微信公眾號(hào)之掃碼支付
極速開(kāi)發(fā)微信公眾號(hào)之刷卡支付
極速開(kāi)發(fā)微信公眾號(hào)之現(xiàn)金紅包
Android版-支付寶APP支付
支付寶Wap支付
一張二維碼集成微信牵寺、支付寶支付

源碼下載地址
記錄學(xué)習(xí)的點(diǎn)滴,以此勉勵(lì)不斷奮斗的自己?????? 如果對(duì)你有幫助記得點(diǎn)喜歡告訴我

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末恩脂,一起剝皮案震驚了整個(gè)濱河市帽氓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌俩块,老刑警劉巖黎休,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異玉凯,居然都是意外死亡势腮,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門漫仆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)捎拯,“玉大人,你說(shuō)我怎么就攤上這事盲厌∈鹫眨” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵吗浩,是天一觀的道長(zhǎng)建芙。 經(jīng)常有香客問(wèn)我,道長(zhǎng)拓萌,這世上最難降的妖魔是什么岁钓? 我笑而不...
    開(kāi)封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮微王,結(jié)果婚禮上屡限,老公的妹妹穿的比我還像新娘。我一直安慰自己炕倘,他們只是感情好钧大,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著罩旋,像睡著了一般啊央。 火紅的嫁衣襯著肌膚如雪眶诈。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天瓜饥,我揣著相機(jī)與錄音逝撬,去河邊找鬼。 笑死乓土,一個(gè)胖子當(dāng)著我的面吹牛宪潮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趣苏,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼狡相,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了食磕?” 一聲冷哼從身側(cè)響起尽棕,我...
    開(kāi)封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎彬伦,沒(méi)想到半個(gè)月后滔悉,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡媚朦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年氧敢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片询张。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡孙乖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出份氧,到底是詐尸還是另有隱情唯袄,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布蜗帜,位于F島的核電站恋拷,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏厅缺。R本人自食惡果不足惜蔬顾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望湘捎。 院中可真熱鬧诀豁,春花似錦、人聲如沸窥妇。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)活翩。三九已至烹骨,卻和暖如春翻伺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背沮焕。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工吨岭, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人峦树。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓未妹,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親空入。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 很早前就想了解下微信公眾號(hào)開(kāi)發(fā)族檬,懶和拖延癥讓這計(jì)劃遲遲沒(méi)落實(shí)歪赢,正巧新項(xiàng)目有了微信公眾號(hào)的業(yè)務(wù),我心中沒(méi)數(shù)地回應(yīng)单料,我...
    英文名叫夏天閱讀 4,407評(píng)論 1 4
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,742評(píng)論 25 707
  • 1 去微信開(kāi)放平臺(tái)創(chuàng)建應(yīng)用 審核通過(guò)后會(huì)得到AppID和AppSecret(這兩個(gè)很重要) 2 接入自己的網(wǎng)站 (...
    史史小子閱讀 1,201評(píng)論 0 2
  • 看著時(shí)間一分一秒的走埋凯,今天一天又快過(guò)完了,又是一個(gè)十二點(diǎn)還沒(méi)睡的日子扫尖。最近在一件事上糾結(jié)了半個(gè)月白对,似乎每天都在圍著...
    漆家小三閱讀 194評(píng)論 0 1
  • 有沒(méi)有發(fā)現(xiàn)有的紅木家具買回來(lái)甩恼,發(fā)現(xiàn)放在室內(nèi)變小了,有的則放不下沉颂,還有的顯得很突兀条摸、別扭,這都是沒(méi)有充分規(guī)劃好空間大...
    林遠(yuǎn)騰博客閱讀 266評(píng)論 0 0