<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                上篇文章我們利用wx.login方法獲取了用戶的唯一標識openid,有了這個標識我們就可以針對每一位用戶進行數據上的功能制作。 首先,我們將用戶的openid存到數據庫,完成用戶注冊的第一步。 1.添加數據 (1)后端,以php的thinkphp6框架為例。 第一步 ,我們在數據庫創建一個user表,因為種種原因我想為表加一個后綴,所以我將表命名為user_green。 ![](https://img.kancloud.cn/0d/55/0d551bae991178128c2c3e29eca9831d_690x242.png) 其中id和用戶的openid都為該字段的主鍵,依靠強大的主鍵功能強制避免用戶進行多次注冊。 第二步 ,在tp6框架中創建一個模型,模型名需要與數據庫表名對應,所以根據命名規則設置模型名為UserGreen。 ![](https://img.kancloud.cn/34/8b/348bcea7a0d96eb26d8ce2d4b4a1bffb_210x88.png) ``` <?php namespace app\web\model; use think\Model; class UserGreen extends Model{ // // 定義json數據 protected $json = ['information']; // // 定義json數據查詢時返回數組 protected $jsonAssoc = true; // 設置字段信息 protected $schema = [ 'id' => 'int', 'openid' => 'string', 'information' => 'text' ]; } ``` 此時查閱數據,id和openid沒問題,而個人信息information字段中我打算以json格式直接存入取出,里面可以包含很多數據。 另外update_time和create_time字段可以利用tp6框架自動填充,無需在模型中設置。 第三步 ,創建后端接口,使用戶注冊。 復制之前講過的restful路由,實現高復用路由接口設置,并使用tp6中間件完成跨域操作: ``` // 通用模型操作 Route::group('/api/rest/:model', function(){ // 新增數據到數據庫 Route::post('/', 'index/add'); // 查詢單個數據到數據庫 Route::get('/:id', 'index/find'); // 查詢所有數據到數據庫 Route::get('/', 'index/findall'); // 修改單個數據到數據庫 Route::put('/:id/', 'index/update'); // 刪除單個數據到數據庫 Route::delete('/:id', 'index/delete'); })->middleware([\app\admin\middleware\compareToken::class]); ``` ![](https://img.kancloud.cn/3b/a2/3ba2929b195902e186999f5fcb395150_799x431.png) 編輯add方法,接收前端傳來的數據添加到數據庫。 ``` public function add() { // 獲取前端傳值 $data = request() -> param(); // return $data; if($data['model'] == "user"){ // 使用模型格式化傳來的數據 $db_data = new UserGreen; // 利用模型將數據傳到數據庫 $db_data->save([ 'openid' => $data['openid'], 'information' => $data, ]); // 返回結果 return '新增數據成功'; } } ``` ![](https://img.kancloud.cn/a3/8b/a38b0e4a9615cec90c110606a553081c_763x508.png) 注意 ,我們的方法中要使用之前創建的模型UserGreen,所以最上方就需要引入這個模型: ![](https://img.kancloud.cn/b9/54/b954682d5dad43ad20834e8973cc4f52_356x238.png) 此時后端就位。 (2)前端,完成用戶登錄后將openid發送到后端 修改login方法: ``` login() { wx.login({ success(res) { console.log('code', res) if (res.code) { // 獲取到code后進行下一步操作,通過auth.code2Session獲取openid uni.request({ url: 'http://localhost:3000/web/openid/' + res.code, success(res) { console.log('openid', res) // 將openid存儲到緩存,減少資源消耗 wx.setStorage({ key: "openid", data: res.data.openid }) // 注冊 uni.request({ url: 'http://localhost:3000/web/api/rest/user', header: { 'content-type': 'application/x-www-form-urlencoded' }, method: 'POST', data: { openid: res.data.openid }, success(res) { console.log('注冊成功', res) } }) } }) } else { console.log('登錄失敗!' + res.errMsg) } } }) } ``` 點擊授權按鈕進行測試,發現總是會報錯: ![](https://img.kancloud.cn/ac/d1/acd16fee5cedb378b23be42c8d21ce14_511x45.png) 報錯500一般就是后端的問題,于是我開始以為自己哪里復制錯了,經過一系列查找,發現去掉跨域的中間件就正常了: ![](https://img.kancloud.cn/60/1f/601f47a9eafa6077ef281410357f10ec_635x504.png) 猜想可能我在本地localhost可能與微信小程序不存在跨域問題,這也是微信小程序發送請求必須在https而卻能在http://localhost正常運行的原因吧。 之后后端上線時再加上跨域就行。 改動之后測試: ![](https://img.kancloud.cn/53/81/53810050abf7c2a32482282456d52143_472x168.png) 沒問題,再看數據庫是否有了數據: ![](https://img.kancloud.cn/34/7e/347e246c2fd945441894174891b25588_610x181.png) 沒問題,再看本地緩存是否正常: ![](https://img.kancloud.cn/1d/28/1d285aec6398beb0345049c866863e98_416x156.png) OK,完成添加數據。 2.完成注冊 大家多測試幾次就會注意到兩個問題,一是數據中 update_time 和 create_time 并沒有數據填入,第二就是設置openid主鍵后依然會有新數據產生: ![](https://img.kancloud.cn/a9/20/a920ac1bb42af1d0f155c2e18ba39566_542x71.png) (1)先解決時間戳問題: 進入user模型中,添加這兩個字段,屬性為datetime: ![](https://img.kancloud.cn/36/fd/36fd16f4fcb3dc003eb11b6f81efde70_443x436.png) 我錯啦各位大哥,我記錯了,這里并不是不用寫,是不用設置傳入的數據。前邊的有太多地方截圖了,我實在懶得改了!!! 然后授權測試: ![](https://img.kancloud.cn/ca/52/ca52faabc9a67caee4853edd955bf8ef_621x190.png) 沒問題。 (2)避免重復注冊: 避免重復注冊的方法就是提前在數據庫查一下這個用戶是否注冊過,也就是查一下數據庫中是否有該openid。 第一步 ,為了避免代碼混亂,將注冊過程封裝成方法 register() : ![](https://img.kancloud.cn/27/57/27570375e6eabc63d10c4fd18db061ac_824x805.png) ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ ![](https://img.kancloud.cn/7c/b5/7cb5b4ae87ee9d045a91fe1b3f518cff_687x446.png) 第二步 ,后端封裝一個查詢是否注冊的方法: 路由: ``` // 查詢是否注冊 Route::get('/is_register/:openid', 'index/is_register'); ``` 方法: ``` // 查詢是否注冊 public function is_register() { $data = request() -> param(); $db_data = UserGreen::where("openid", $data['openid']) -> select(); return json($db_data); } ``` 第三步 ,當用戶進入頁面時,檢查用戶本地緩存是否有openid,并獲取openid: ``` created() { var that = this wx.getStorage({ key: 'openid', success(res) { // 如果本地緩存有openid,說明一定注冊過,無需驗證,直接使用openid即可 that.openid = res.data }, fail() { // 如果沒有本地緩存的openid,可能有兩個原因 // 第一,用戶是第一次登錄,沒有進行過注冊 // 第二,用戶的本地緩存過期或清理,需要驗證是否注冊過 // 都跳轉到login進行登錄獲取openid,獲取到openid后使用下一步的isRegister()方法驗證是否需要注冊 this.login() } }) }, ``` 第四步 ,前端注冊一個調用后端是否注冊的方法 isRegister() ,并傳值openid: ``` isRegister(openid) { // 是否注冊 uni.request({ url: 'http://localhost:3000/web/is_register/' + openid, header: { 'content-type': 'application/x-www-form-urlencoded' }, method: 'GET', success(res) { console.log('是否注冊', res) if(!res.data[0]) { // 如果沒有注冊過,則跳轉register()方法進行注冊 this.register(openid) } // 如果注冊過,則到此為止 }, error(err){ console.log(err) } }) } ``` 感覺比較復雜,但主要邏輯自己考慮一下就能明白,主要就兩個判斷, 是否有之前登陸的緩存 ,沒有的話查一下 是否注冊 。 而且形式上我為了邏輯通順多出了很多步驟,大家可以根據自己的需求進行設計。主要的前后端方法和接口就是上邊那些了。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看